Skip to content
Snippets Groups Projects
GetDefaultPriceFieldValueForMembershipMJW.php 2.85 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    namespace Civi\Api4\Action\PriceFieldValue;
    
    use Civi\Api4\PriceField;
    use Civi\Api4\PriceFieldValue;
    
    /**
     * This API Action gets the default price_field_value_id for the specified membership
     *
     * @property int $membershipID
     */
    class GetDefaultPriceFieldValueForMembershipMJW extends \Civi\Api4\Generic\AbstractAction {
    
      /**
       * The Membership ID
       *
       * @var int
       * @required
       */
      protected int $membershipID = 0;
    
      /**
       *
       * Get the default price_field_id and price_field_value_id for the membership
       *
       * $result = ['price_field_id' = X, 'price_field_value_id' = Y, 'label' = price_field_value.label]
       *
       * Note that the result class is that of the annotation below, not the hint
       * in the method (which must match the parent class)
       *
       * @var \Civi\Api4\Generic\Result $result
       */
      public function _run(\Civi\Api4\Generic\Result $result) {
        if (empty($this->membershipID)) {
          throw new \CRM_Core_Exception('Membership ID is required');
        }
        // First we need membership_type_id.member_of_contact_id and membership_type_id to find the PriceFieldValue.
        $membership = \Civi\Api4\Membership::get(FALSE)
          ->addSelect('membership_type_id.member_of_contact_id', 'membership_type_id')
          ->addWhere('id', '=', $this->membershipID)
          ->execute()
          ->first();
    
        // PriceFields and Membership Types...
        // There is a default PriceSet for contributions with name="default_contribution_amount"
        // There is a default PriceSet for memberships with name="default_membership_type_amount"
        // Each MembershipType has a "member_of_contact_id" which gets used as a FK reference in PriceField.name
        // Each MembershipType has a PriceFieldValue with PriceFieldValue.membership_type_id = Membership Type
        // Why all this? Well we could (and probably do) have multiple PriceSets that include the same MembershipType but
        //   different prices. But only one of them will be linked to the default PriceSet.
        // Confused yet?
    
        // Get the default price field ID for memberships from the default membership PriceSet and the member_of_contact_id
        $priceField = PriceField::get(FALSE)
          ->addWhere('price_set_id:name', '=', 'default_membership_type_amount')
          ->addWhere('name', '=', $membership['membership_type_id.member_of_contact_id'])
          ->addOrderBy('id', 'ASC')
          ->execute()
          ->first();
    
        // Now get the relevant PriceFieldValue for the MembershipType.
        $priceFieldValue = PriceFieldValue::get(FALSE)
          ->addWhere('price_field_id', '=', $priceField['id'])
          ->addWhere('membership_type_id', '=', $membership['membership_type_id'])
          ->execute()
          ->first();
    
        $results = [
          'price_field_id' => $priceField['id'],
          'price_field_value_id' => $priceFieldValue['id'],
          'label' => $priceFieldValue['label'],
        ];
    
        $result->exchangeArray($results);
        return $result;
      }
    
    }