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; }
/** * Returns the membership types for a particular contact * who has lifetime membership without end date. * * @param int $contactID * @param bool $isTest * @param bool $onlyLifeTime * * @return array */ public static function getAllContactMembership($contactID, $isTest = FALSE, $onlyLifeTime = FALSE) { $contactMembershipType = array(); if (!$contactID) { return $contactMembershipType; } $dao = new CRM_Member_DAO_Membership(); $dao->contact_id = $contactID; $pendingStatusId = array_search('Pending', CRM_Member_PseudoConstant::membershipStatus()); $dao->whereAdd("status_id != {$pendingStatusId}"); if ($isTest) { $dao->is_test = $isTest; } else { $dao->whereAdd('is_test IS NULL OR is_test = 0'); } if ($onlyLifeTime) { $dao->whereAdd('end_date IS NULL'); } $dao->find(); while ($dao->fetch()) { $membership = array(); CRM_Core_DAO::storeValues($dao, $membership); $contactMembershipType[$dao->membership_type_id] = $membership; } return $contactMembershipType; }
/** * Update membership status to deceased. * function return the status message for updated membership. * * @param array $deceasedParams * having contact id and deceased value. * * @return null|string * $updateMembershipMsg string status message for updated membership. */ public function updateMembershipStatus($deceasedParams) { $updateMembershipMsg = NULL; $contactId = CRM_Utils_Array::value('contact_id', $deceasedParams); $deceasedDate = CRM_Utils_Array::value('deceased_date', $deceasedParams); // process to set membership status to deceased for both active/inactive membership if ($contactId && $this->_contactType == 'Individual' && !empty($deceasedParams['is_deceased'])) { $session = CRM_Core_Session::singleton(); $userId = $session->get('userID'); if (!$userId) { $userId = $contactId; } // get deceased status id $allStatus = CRM_Member_PseudoConstant::membershipStatus(); $deceasedStatusId = array_search('Deceased', $allStatus); if (!$deceasedStatusId) { return $updateMembershipMsg; } $today = time(); if ($deceasedDate && strtotime($deceasedDate) > $today) { return $updateMembershipMsg; } // get non deceased membership $dao = new CRM_Member_DAO_Membership(); $dao->contact_id = $contactId; $dao->whereAdd("status_id != {$deceasedStatusId}"); $dao->find(); $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, FALSE, FALSE, 'name'); $allStatus = CRM_Member_PseudoConstant::membershipStatus(); $memCount = 0; while ($dao->fetch()) { // update status to deceased (for both active/inactive membership ) CRM_Core_DAO::setFieldValue('CRM_Member_DAO_Membership', $dao->id, 'status_id', $deceasedStatusId); // add membership log $membershipLog = array('membership_id' => $dao->id, 'status_id' => $deceasedStatusId, 'start_date' => CRM_Utils_Date::isoToMysql($dao->start_date), 'end_date' => CRM_Utils_Date::isoToMysql($dao->end_date), 'modified_id' => $userId, 'modified_date' => date('Ymd'), 'membership_type_id' => $dao->membership_type_id, 'max_related' => $dao->max_related); CRM_Member_BAO_MembershipLog::add($membershipLog, CRM_Core_DAO::$_nullArray); //create activity when membership status is changed $activityParam = array('subject' => "Status changed from {$allStatus[$dao->status_id]} to {$allStatus[$deceasedStatusId]}", 'source_contact_id' => $userId, 'target_contact_id' => $dao->contact_id, 'source_record_id' => $dao->id, 'activity_type_id' => array_search('Change Membership Status', $activityTypes), 'status_id' => 2, 'version' => 3, 'priority_id' => 2, 'activity_date_time' => date('Y-m-d H:i:s'), 'is_auto' => 0, 'is_current_revision' => 1, 'is_deleted' => 0); $activityResult = civicrm_api('activity', 'create', $activityParam); $memCount++; } // set status msg if ($memCount) { $updateMembershipMsg = ts("%1 Current membership(s) for this contact have been set to 'Deceased' status.", array(1 => $memCount)); } } return $updateMembershipMsg; }
/** * 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; }
/** * called when action is browse. */ public function browse() { $links = self::links('all', $this->_isPaymentProcessor, $this->_accessContribution); CRM_Financial_BAO_FinancialType::getAvailableMembershipTypes($membershipTypes); $addWhere = "membership_type_id IN (0)"; if (!empty($membershipTypes)) { $addWhere = "membership_type_id IN (" . implode(',', array_keys($membershipTypes)) . ")"; } $membership = array(); $dao = new CRM_Member_DAO_Membership(); $dao->contact_id = $this->_contactId; $dao->is_test = 0; $dao->whereAdd($addWhere); //$dao->orderBy('name'); $dao->find(); //CRM--4418, check for view, edit, delete $permissions = array(CRM_Core_Permission::VIEW); if (CRM_Core_Permission::check('edit memberships')) { $permissions[] = CRM_Core_Permission::EDIT; } if (CRM_Core_Permission::check('delete in CiviMember')) { $permissions[] = CRM_Core_Permission::DELETE; } $mask = CRM_Core_Action::mask($permissions); // get deceased status id $allStatus = CRM_Member_PseudoConstant::membershipStatus(); $deceasedStatusId = array_search('Deceased', $allStatus); //get all campaigns. $allCampaigns = CRM_Campaign_BAO_Campaign::getCampaigns(NULL, NULL, FALSE, FALSE, FALSE, TRUE); //checks membership of contact itself while ($dao->fetch()) { $membership[$dao->id] = array(); CRM_Core_DAO::storeValues($dao, $membership[$dao->id]); //carry campaign. $membership[$dao->id]['campaign'] = CRM_Utils_Array::value($dao->campaign_id, $allCampaigns); //get the membership status and type values. $statusANDType = CRM_Member_BAO_Membership::getStatusANDTypeValues($dao->id); foreach (array('status', 'membership_type') as $fld) { $membership[$dao->id][$fld] = CRM_Utils_Array::value($fld, $statusANDType[$dao->id]); } if (!empty($statusANDType[$dao->id]['is_current_member'])) { $membership[$dao->id]['active'] = TRUE; } if (empty($dao->owner_membership_id)) { // unset renew and followup link for deceased membership $currentMask = $mask; if ($dao->status_id == $deceasedStatusId) { $currentMask = $currentMask & ~CRM_Core_Action::RENEW & ~CRM_Core_Action::FOLLOWUP; } $isUpdateBilling = FALSE; // It would be better to determine if there is a recurring contribution & // is so get the entity for the recurring contribution (& skip if not). $paymentObject = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($membership[$dao->id]['membership_id'], 'membership', 'obj'); if (!empty($paymentObject)) { // @todo - get this working with syntax style $paymentObject->supports(array //('updateSubscriptionBillingInfo')); $isUpdateBilling = $paymentObject->isSupported('updateSubscriptionBillingInfo'); } // @todo - get this working with syntax style $paymentObject->supports(array //('CancelSubscriptionSupported')); $isCancelSupported = CRM_Member_BAO_Membership::isCancelSubscriptionSupported($membership[$dao->id]['membership_id']); $links = self::links('all', NULL, NULL, $isCancelSupported, $isUpdateBilling); self::getPermissionedLinks($dao->membership_type_id, $links); $membership[$dao->id]['action'] = CRM_Core_Action::formLink($links, $currentMask, array('id' => $dao->id, 'cid' => $this->_contactId), ts('Renew') . '...', FALSE, 'membership.tab.row', 'Membership', $dao->id); } else { $links = self::links('view'); self::getPermissionedLinks($dao->membership_type_id, $links); $membership[$dao->id]['action'] = CRM_Core_Action::formLink($links, $mask, array('id' => $dao->id, 'cid' => $this->_contactId), ts('more'), FALSE, 'membership.tab.row', 'Membership', $dao->id); } //does membership have auto renew CRM-7137. if (!empty($membership[$dao->id]['contribution_recur_id']) && !CRM_Member_BAO_Membership::isSubscriptionCancelled($membership[$dao->id]['membership_id'])) { $membership[$dao->id]['auto_renew'] = 1; } else { $membership[$dao->id]['auto_renew'] = 0; } // if relevant--membership is active and type allows inheritance--count related memberships if (CRM_Utils_Array::value('is_current_member', $statusANDType[$dao->id]) && CRM_Utils_Array::value('relationship_type_id', $statusANDType[$dao->id]) && empty($dao->owner_membership_id)) { // not an related membership $query = "\n SELECT COUNT(m.id)\n FROM civicrm_membership m\n LEFT JOIN civicrm_membership_status ms ON ms.id = m.status_id\n LEFT JOIN civicrm_contact ct ON ct.id = m.contact_id\n WHERE m.owner_membership_id = {$dao->id} AND m.is_test = 0 AND ms.is_current_member = 1 AND ct.is_deleted = 0"; $num_related = CRM_Core_DAO::singleValueQuery($query); $max_related = CRM_Utils_Array::value('max_related', $membership[$dao->id]); $membership[$dao->id]['related_count'] = $max_related == '' ? ts('%1 created', array(1 => $num_related)) : ts('%1 out of %2', array(1 => $num_related, 2 => $max_related)); } else { $membership[$dao->id]['related_count'] = ts('N/A'); } } //Below code gives list of all Membership Types associated //with an Organization(CRM-2016) $membershipTypes = CRM_Member_BAO_MembershipType::getMembershipTypesByOrg($this->_contactId); foreach ($membershipTypes as $key => $value) { $membershipTypes[$key]['action'] = CRM_Core_Action::formLink(self::membershipTypeslinks(), $mask, array('id' => $value['id'], 'cid' => $this->_contactId), ts('more'), FALSE, 'membershipType.organization.action', 'MembershipType', $value['id']); } $activeMembers = CRM_Member_BAO_Membership::activeMembers($membership); $inActiveMembers = CRM_Member_BAO_Membership::activeMembers($membership, 'inactive'); $this->assign('activeMembers', $activeMembers); $this->assign('inActiveMembers', $inActiveMembers); $this->assign('membershipTypes', $membershipTypes); if ($this->_contactId) { $displayName = CRM_Contact_BAO_Contact::displayName($this->_contactId); $this->assign('displayName', $displayName); $this->ajaxResponse['tabCount'] = CRM_Contact_BAO_Contact::getCountComponent('membership', $this->_contactId); // Refresh other tabs with related data $this->ajaxResponse['updateTabs'] = array('#tab_activity' => CRM_Contact_BAO_Contact::getCountComponent('activity', $this->_contactId), '#tab_rel' => CRM_Contact_BAO_Contact::getCountComponent('rel', $this->_contactId)); if (CRM_Core_Permission::access('CiviContribute')) { $this->ajaxResponse['updateTabs']['#tab_contribute'] = CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId); } } }
function updateMembershipStatus($deceasedParams) { $updateMembershipMsg = null; $contactId = CRM_Utils_Array::value('contact_id', $deceasedParams); $deceasedDate = CRM_Utils_Array::value('deceased_date', $deceasedParams); // process to set membership status to deceased for both active/inactive membership if ($contactId && $this->_contactType == 'Individual' && CRM_Utils_Array::value('is_deceased', $deceasedParams)) { $session = CRM_Core_Session::singleton(); $userId = $session->get('userID'); if (!$userId) { $userId = $contactId; } require_once 'CRM/Member/BAO/MembershipLog.php'; require_once 'CRM/Member/DAO/Membership.php'; require_once 'CRM/Member/PseudoConstant.php'; require_once 'CRM/Utils/Date.php'; // get deceased status id $allStatus = CRM_Member_PseudoConstant::membershipStatus(); $deceasedStatusId = array_search('Deceased', $allStatus); if (!$deceasedStatusId) { return $updateMembershipMsg; } $today = time(); if ($deceasedDate && strtotime($deceasedDate) > $today) { return $updateMembershipMsg; } // get non deceased membership $dao = new CRM_Member_DAO_Membership(); $dao->contact_id = $contactId; $dao->whereAdd("status_id != {$deceasedStatusId}"); $dao->find(); $memCount = 0; while ($dao->fetch()) { // update status to deceased (for both active/inactive membership ) CRM_Core_DAO::setFieldValue('CRM_Member_DAO_Membership', $dao->id, 'status_id', $deceasedStatusId); // add membership log $membershipLog = array('membership_id' => $dao->id, 'status_id' => $deceasedStatusId, 'start_date' => CRM_Utils_Date::isoToMysql($dao->start_date), 'end_date' => CRM_Utils_Date::isoToMysql($dao->end_date), 'renewal_reminder_date' => CRM_Utils_Date::isoToMysql($dao->reminder_date), 'modified_id' => $userId, 'modified_date' => date('Ymd')); CRM_Member_BAO_MembershipLog::add($membershipLog, CRM_Core_DAO::$_nullArray); $memCount++; } // set status msg if ($memCount) { $updateMembershipMsg = ts("%1 Current membership(s) for this contact have been set to 'Deceased' status.", array(1 => $memCount)); } } return $updateMembershipMsg; }