private function getMembershipsForContact($contact_id) { $dao = new CRM_Member_DAO_Membership(); $dao->contact_id = $contact_id; $dao->whereAdd('is_test IS NULL OR is_test = 0'); // order by start date to find most recent membership first, CRM-4545 $dao->orderBy('start_date DESC'); $dao->find(false); $memberships = array(); while ($dao->fetch()) { $startDate = new DateTime($dao->start_date); $endDate = new DateTime($dao->end_date); $memberships[$dao->id] = CRM_Member_PseudoConstant::membershipType($dao->membership_type_id) . ': ' . CRM_Member_PseudoConstant::membershipStatus($dao->status_id, null, 'label') . ' (' . $startDate->format('d-m-Y') . ' - ' . $endDate->format('d-m-Y') . ')'; } return $memberships; }
/** * Return a current membership of given contact. * * NB: if more than one membership meets criteria, a randomly selected one is returned. * * @param int $contactID * Contact id. * @param int $memType * Membership type, null to retrieve all types. * @param int $isTest * @param int $membershipId * If provided, then determine if it is current. * @param bool $onlySameParentOrg * True if only Memberships with same parent org as the $memType wanted, false otherwise. * * @return array|bool */ public static function getContactMembership($contactID, $memType, $isTest, $membershipId = NULL, $onlySameParentOrg = FALSE) { //check for owner membership id, if it exists update that membership instead: CRM-15992 if ($membershipId) { $ownerMemberId = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $membershipId, 'owner_membership_id', 'id'); if ($ownerMemberId) { $membershipId = $ownerMemberId; $contactID = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $membershipId, 'contact_id', 'id'); } } $dao = new CRM_Member_DAO_Membership(); if ($membershipId) { $dao->id = $membershipId; } $dao->contact_id = $contactID; $dao->membership_type_id = $memType; //fetch proper membership record. if ($isTest) { $dao->is_test = $isTest; } else { $dao->whereAdd('is_test IS NULL OR is_test = 0'); } //avoid pending membership as current membership: CRM-3027 $statusIds[] = array_search('Pending', CRM_Member_PseudoConstant::membershipStatus()); if (!$membershipId) { // CRM-15475 $statusIds[] = array_search('Cancelled', CRM_Member_PseudoConstant::membershipStatus(NULL, " name = 'Cancelled' ", 'name', FALSE, TRUE)); } $dao->whereAdd('status_id NOT IN ( ' . implode(',', $statusIds) . ')'); // order by start date to find most recent membership first, CRM-4545 $dao->orderBy('start_date DESC'); // CRM-8141 if ($onlySameParentOrg && $memType) { // require the same parent org as the $memType $params = array('id' => $memType); $membershipType = array(); if (CRM_Member_BAO_MembershipType::retrieve($params, $membershipType)) { $memberTypesSameParentOrg = CRM_Member_BAO_MembershipType::getMembershipTypesByOrg($membershipType['member_of_contact_id']); $memberTypesSameParentOrgList = implode(',', array_keys($memberTypesSameParentOrg)); $dao->whereAdd('membership_type_id IN (' . $memberTypesSameParentOrgList . ')'); } } if ($dao->find(TRUE)) { $membership = array(); CRM_Core_DAO::storeValues($dao, $membership); $membership['is_current_member'] = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipStatus', $membership['status_id'], 'is_current_member', 'id'); $ownerMemberId = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $membership['id'], 'owner_membership_id', 'id'); if ($ownerMemberId) { $membership['id'] = $membership['membership_id'] = $ownerMemberId; $membership['membership_contact_id'] = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $membership['id'], 'contact_id', 'id'); } return $membership; } // CRM-8141 if ($onlySameParentOrg && $memType) { // see if there is a membership that has same parent as $memType but different parent than $membershipID if ($dao->id && CRM_Core_Permission::check('edit memberships')) { // CRM-10016, This is probably a backend renewal, and make sure we return the same membership thats being renewed. $dao->whereAdd(); } else { unset($dao->id); } unset($dao->membership_type_id); if ($dao->find(TRUE)) { $membership = array(); CRM_Core_DAO::storeValues($dao, $membership); $membership['is_current_member'] = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipStatus', $membership['status_id'], 'is_current_member', 'id'); return $membership; } } return FALSE; }
/** * Build Membership Block in Contribution Pages. * * @param int $cid * Contact checked for having a current membership for a particular membership. * @param bool $isContributionMainPage * Is this the main page? If so add form input fields. * (or better yet don't have this functionality in a function shared with forms that don't share it). * @param int $selectedMembershipTypeID * Selected membership id. * @param bool $thankPage * Thank you page. * @param null $isTest * * @return bool * Is this a separate membership payment */ protected function buildMembershipBlock($cid, $isContributionMainPage = FALSE, $selectedMembershipTypeID = NULL, $thankPage = FALSE, $isTest = NULL) { $separateMembershipPayment = FALSE; if ($this->_membershipBlock) { $this->_currentMemberships = array(); $membershipTypeIds = $membershipTypes = $radio = array(); $membershipPriceset = !empty($this->_priceSetId) && $this->_useForMember ? TRUE : FALSE; $allowAutoRenewMembership = $autoRenewOption = FALSE; $autoRenewMembershipTypeOptions = array(); $separateMembershipPayment = CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock); if ($membershipPriceset) { foreach ($this->_priceSet['fields'] as $pField) { if (empty($pField['options'])) { continue; } foreach ($pField['options'] as $opId => $opValues) { if (empty($opValues['membership_type_id'])) { continue; } $membershipTypeIds[$opValues['membership_type_id']] = $opValues['membership_type_id']; } } } elseif (!empty($this->_membershipBlock['membership_types'])) { $membershipTypeIds = explode(',', $this->_membershipBlock['membership_types']); } if (!empty($membershipTypeIds)) { //set status message if wrong membershipType is included in membershipBlock if (isset($this->_mid) && !$membershipPriceset) { $membershipTypeID = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $this->_mid, 'membership_type_id'); if (!in_array($membershipTypeID, $membershipTypeIds)) { CRM_Core_Session::setStatus(ts("Oops. The membership you're trying to renew appears to be invalid. Contact your site administrator if you need assistance. If you continue, you will be issued a new membership."), ts('Invalid Membership'), 'error'); } } $membershipTypeValues = CRM_Member_BAO_Membership::buildMembershipTypeValues($this, $membershipTypeIds); $this->_membershipTypeValues = $membershipTypeValues; $endDate = NULL; foreach ($membershipTypeIds as $value) { $memType = $membershipTypeValues[$value]; if ($selectedMembershipTypeID != NULL) { if ($memType['id'] == $selectedMembershipTypeID) { $this->assign('minimum_fee', CRM_Utils_Array::value('minimum_fee', $memType)); $this->assign('membership_name', $memType['name']); if (!$thankPage && $cid) { $membership = new CRM_Member_DAO_Membership(); $membership->contact_id = $cid; $membership->membership_type_id = $memType['id']; if ($membership->find(TRUE)) { $this->assign('renewal_mode', TRUE); $memType['current_membership'] = $membership->end_date; $this->_currentMemberships[$membership->membership_type_id] = $membership->membership_type_id; } } $membershipTypes[] = $memType; } } elseif ($memType['is_active']) { $javascriptMethod = NULL; $allowAutoRenewOpt = (int) $memType['auto_renew']; if (is_array($this->_paymentProcessors)) { foreach ($this->_paymentProcessors as $id => $val) { if (!$val['is_recur']) { $allowAutoRenewOpt = 0; continue; } } } $javascriptMethod = array('onclick' => "return showHideAutoRenew( this.value );"); $autoRenewMembershipTypeOptions["autoRenewMembershipType_{$value}"] = (int) $allowAutoRenewOpt * CRM_Utils_Array::value($value, CRM_Utils_Array::value('auto_renew', $this->_membershipBlock)); if ($allowAutoRenewOpt) { $allowAutoRenewMembership = TRUE; } //add membership type. $radio[$memType['id']] = $this->createElement('radio', NULL, NULL, NULL, $memType['id'], $javascriptMethod); if ($cid) { $membership = new CRM_Member_DAO_Membership(); $membership->contact_id = $cid; $membership->membership_type_id = $memType['id']; //show current membership, skip pending and cancelled membership records, //because we take first membership record id for renewal $membership->whereAdd('status_id != 5 AND status_id !=6'); if (!is_null($isTest)) { $membership->is_test = $isTest; } //CRM-4297 $membership->orderBy('end_date DESC'); if ($membership->find(TRUE)) { if (!$membership->end_date) { unset($radio[$memType['id']]); $this->assign('islifetime', TRUE); continue; } $this->assign('renewal_mode', TRUE); $this->_currentMemberships[$membership->membership_type_id] = $membership->membership_type_id; $memType['current_membership'] = $membership->end_date; if (!$endDate) { $endDate = $memType['current_membership']; $this->_defaultMemTypeId = $memType['id']; } if ($memType['current_membership'] < $endDate) { $endDate = $memType['current_membership']; $this->_defaultMemTypeId = $memType['id']; } } } $membershipTypes[] = $memType; } } } $this->assign('membershipBlock', $this->_membershipBlock); $this->assign('showRadio', $isContributionMainPage); $this->assign('membershipTypes', $membershipTypes); $this->assign('allowAutoRenewMembership', $allowAutoRenewMembership); $this->assign('autoRenewMembershipTypeOptions', json_encode($autoRenewMembershipTypeOptions)); //give preference to user submitted auto_renew value. $takeUserSubmittedAutoRenew = !empty($_POST) || $this->isSubmitted() ? TRUE : FALSE; $this->assign('takeUserSubmittedAutoRenew', $takeUserSubmittedAutoRenew); if ($isContributionMainPage) { if (!$membershipPriceset) { if (!$this->_membershipBlock['is_required']) { $this->assign('showRadioNoThanks', TRUE); $radio[''] = $this->createElement('radio', NULL, NULL, NULL, 'no_thanks', NULL); $this->addGroup($radio, 'selectMembership', NULL); } elseif ($this->_membershipBlock['is_required'] && count($radio) == 1) { $temp = array_keys($radio); $this->add('hidden', 'selectMembership', $temp[0], array('id' => 'selectMembership')); $this->assign('singleMembership', TRUE); $this->assign('showRadio', FALSE); } else { $this->addGroup($radio, 'selectMembership', NULL); } $this->addRule('selectMembership', ts('Please select one of the memberships.'), 'required'); } else { $autoRenewOption = CRM_Price_BAO_PriceSet::checkAutoRenewForPriceSet($this->_priceSetId); $this->assign('autoRenewOption', $autoRenewOption); } if (!$this->_values['is_pay_later'] && is_array($this->_paymentProcessors) && ($allowAutoRenewMembership || $autoRenewOption)) { $this->addElement('checkbox', 'auto_renew', ts('Please renew my membership automatically.')); } } } return $separateMembershipPayment; }
/** * Function to return current membership of given contacts * * @param int $contactID contact id * @static */ static function getContactMembership($contactID, $memType, $isTest, $membershipId = null) { $dao = new CRM_Member_DAO_Membership(); if ($membershipId) { $dao->id = $membershipId; } $dao->contact_id = $contactID; $dao->membership_type_id = $memType; //fetch proper membership record. if ($isTest) { $dao->is_test = $isTest; } else { $dao->whereAdd('is_test IS NULL OR is_test = 0'); } //avoid pending membership as current memebrship: CRM-3027 require_once 'CRM/Member/PseudoConstant.php'; $pendingStatusId = array_search('Pending', CRM_Member_PseudoConstant::membershipStatus()); $dao->whereAdd("status_id != {$pendingStatusId}"); // order by start date to find mos recent membership first, CRM-4545 $dao->orderBy('start_date DESC'); if ($dao->find(true)) { $membership = array(); CRM_Core_DAO::storeValues($dao, $membership); $membership['is_current_member'] = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipStatus', $membership['status_id'], 'is_current_member', 'id'); return $membership; } return false; }