foreach ($this->_params['onbehalf'] as $loc => $value) {
$field = $typeId = NULL;
if (strstr($loc, '-')) {
- list($field, $locType) = explode('-', $loc);
+ [$field, $locType] = explode('-', $loc);
}
if (in_array($field, $addressBlocks)) {
$locTypeId = '';
$phoneExtField = [];
- if ($field == 'url') {
+ if ($field === 'url') {
$blockName = 'website';
$locationType = 'website_type_id';
- list($field, $locationValue) = explode('-', $loc);
+ [$field, $locationValue] = explode('-', $loc);
}
- elseif ($field == 'im') {
+ elseif ($field === 'im') {
$fieldName = 'name';
$locTypeId = 'provider_id';
$typeId = $this->_params['onbehalf']["{$loc}-provider_id"];
}
elseif ($field == 'phone') {
- list($field, $locType, $typeId) = explode('-', $loc);
+ [$field, $locType, $typeId] = explode('-', $loc);
$locTypeId = 'phone_type_id';
//check if extension field exists
) {
$this->buildMembershipBlock(
$this->_membershipContactID,
- FALSE,
- $params['selectMembership'],
- FALSE
+ $params['selectMembership']
);
if (!empty($params['auto_renew'])) {
$this->assign('auto_renew', TRUE);
// The concept of contributeMode is deprecated.
// the is_monetary concept probably should be too as it can be calculated from
// the existence of 'amount' & seems fragile.
- if ($this->_contributeMode == 'notify' ||
+ if ($this->_contributeMode === 'notify' ||
$this->_amount <= 0.0 || $this->_params['is_pay_later']
) {
$contribButton = ts('Continue');
$contact = $this->_params;
foreach ($fields as $name => $dontCare) {
// Recursively set defaults for nested fields
- if (isset($contact[$name]) && is_array($contact[$name]) && ($name == 'onbehalf' || $name == 'honor')) {
+ if (isset($contact[$name]) && is_array($contact[$name]) && ($name === 'onbehalf' || $name === 'honor')) {
foreach ($contact[$name] as $fieldName => $fieldValue) {
- if (is_array($fieldValue) && $this->_fields[$name][$fieldName]['html_type'] == 'CheckBox') {
+ if (is_array($fieldValue) && $this->_fields[$name][$fieldName]['html_type'] === 'CheckBox') {
foreach ($fieldValue as $key => $value) {
$defaults["{$name}[{$fieldName}][{$key}]"] = $value;
}
}
elseif (isset($contact[$name])) {
$defaults[$name] = $contact[$name];
- if (substr($name, 0, 7) == 'custom_') {
+ if (substr($name, 0, 7) === 'custom_') {
$timeField = "{$name}_time";
if (isset($contact[$timeField])) {
$defaults[$timeField] = $contact[$timeField];
$this->freeze();
}
+ /**
+ * Build Membership Block in Contribution Pages.
+ * @todo this was shared on CRM_Contribute_Form_ContributionBase but we are refactoring and simplifying for each
+ * step (main/confirm/thankyou)
+ *
+ * @param int $cid
+ * Contact checked for having a current membership for a particular membership.
+ * @param int|array $selectedMembershipTypeID
+ * Selected membership id.
+ * @param null $isTest
+ *
+ * @return bool
+ * Is this a separate membership payment
+ *
+ * @throws \CiviCRM_API3_Exception
+ * @throws \CRM_Core_Exception
+ */
+ private function buildMembershipBlock($cid, $selectedMembershipTypeID = NULL, $isTest = NULL) {
+ $separateMembershipPayment = FALSE;
+ if ($this->_membershipBlock) {
+ $this->_currentMemberships = [];
+
+ $membershipTypeIds = $membershipTypes = $radio = $radioOptAttrs = [];
+ $membershipPriceset = (!empty($this->_priceSetId) && $this->_useForMember);
+
+ $allowAutoRenewMembership = $autoRenewOption = FALSE;
+ $autoRenewMembershipTypeOptions = [];
+
+ $separateMembershipPayment = $this->_membershipBlock['is_separate_payment'] ?? NULL;
+
+ 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;
+
+ // Check if we support auto-renew on this contribution page
+ // FIXME: If any of the payment processors do NOT support recurring you cannot setup an
+ // auto-renew payment even if that processor is not selected.
+ $allowAutoRenewOpt = TRUE;
+ if (is_array($this->_paymentProcessors)) {
+ foreach ($this->_paymentProcessors as $id => $val) {
+ if ($id && !$val['is_recur']) {
+ $allowAutoRenewOpt = FALSE;
+ }
+ }
+ }
+ foreach ($membershipTypeIds as $value) {
+ $memType = $membershipTypeValues[$value];
+ if ($selectedMembershipTypeID != NULL) {
+ if ($memType['id'] == $selectedMembershipTypeID) {
+ $this->assign('minimum_fee', $memType['minimum_fee'] ?? NULL);
+ $this->assign('membership_name', $memType['name']);
+ if ($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']) {
+
+ if ($allowAutoRenewOpt) {
+ $javascriptMethod = ['onclick' => "return showHideAutoRenew( this.value );"];
+ $isAvailableAutoRenew = $this->_membershipBlock['auto_renew'][$value] ?? 1;
+ $autoRenewMembershipTypeOptions["autoRenewMembershipType_{$value}"] = (int) $memType['auto_renew'] * $isAvailableAutoRenew;
+ $allowAutoRenewMembership = TRUE;
+ }
+ else {
+ $javascriptMethod = NULL;
+ $autoRenewMembershipTypeOptions["autoRenewMembershipType_{$value}"] = 0;
+ }
+
+ //add membership type.
+ $radio[$memType['id']] = NULL;
+ $radioOptAttrs[$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']]);
+ unset($radioOptAttrs[$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', FALSE);
+ $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());
+ $this->assign('takeUserSubmittedAutoRenew', $takeUserSubmittedAutoRenew);
+
+ // Assign autorenew option (0:hide,1:optional,2:required) so we can use it in confirmation etc.
+ $autoRenewOption = CRM_Price_BAO_PriceSet::checkAutoRenewForPriceSet($this->_priceSetId);
+ //$selectedMembershipTypeID is retrieved as an array for membership priceset if multiple
+ //options for different organisation is selected on the contribution page.
+ if (is_numeric($selectedMembershipTypeID) && isset($membershipTypeValues[$selectedMembershipTypeID]['auto_renew'])) {
+ $this->assign('autoRenewOption', $membershipTypeValues[$selectedMembershipTypeID]['auto_renew']);
+ }
+ else {
+ $this->assign('autoRenewOption', $autoRenewOption);
+ }
+ }
+
+ return $separateMembershipPayment;
+ }
+
/**
* Overwrite action.
*
$fixed_period_start_day = $productDAO->fixed_period_start_day;
$duration_unit = $productDAO->duration_unit;
$duration_interval = $productDAO->duration_interval;
- if ($periodType == 'rolling') {
+ if ($periodType === 'rolling') {
$startDate = date('Y-m-d');
}
- elseif ($periodType == 'fixed') {
+ elseif ($periodType === 'fixed') {
if ($fixed_period_start_day) {
$date = explode('-', date('Y-m-d'));
$month = substr($fixed_period_start_day, 0, strlen($fixed_period_start_day) - 2);
switch ($duration_unit) {
case 'year':
- $year = $year + $duration_interval;
+ $year += $duration_interval;
break;
case 'month':
- $month = $month + $duration_interval;
+ $month += $duration_interval;
break;
case 'day':
- $day = $day + $duration_interval;
+ $day += $duration_interval;
break;
case 'week':
- $day = $day + ($duration_interval * 7);
+ $day += ($duration_interval * 7);
}
$endDate = date('Y-m-d H:i:s', mktime($hour, $minute, $second, $month, $day, $year));
$this->assign('start_date', $startDate);
CRM_Core_BAO_FinancialTrxn::createPremiumTrxn($trxnParams);
}
}
- elseif ($selectProduct == 'no_thanks') {
+ elseif ($selectProduct === 'no_thanks') {
//Fixed For CRM-3901
$daoContrProd = new CRM_Contribute_DAO_ContributionProduct();
$daoContrProd->contribution_id = $contribution->id;
CRM_Core_BAO_Note::add($noteParams, []);
}
- if (isset($params['related_contact'])) {
- $contactID = $params['related_contact'];
- }
- elseif (isset($params['cms_contactID'])) {
- $contactID = $params['cms_contactID'];
- }
-
//create contribution activity w/ individual and target
//activity w/ organisation contact id when onbelf, CRM-4027
$actParams = [];
}
$transaction->commit();
- // CRM-13074 - create the CMSUser after the transaction is completed as it
- // is not appropriate to delete a valid contribution if a user create problem occurs
- CRM_Contribute_BAO_Contribution_Utils::createCMSUser($params,
- $contactID,
- 'email-' . $billingLocationID
- );
return $contribution;
}
$recurParams['invoice_id'] = $params['invoiceID'] ?? NULL;
$recurParams['contribution_status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending');
$recurParams['payment_processor_id'] = $params['payment_processor_id'] ?? NULL;
- $recurParams['is_email_receipt'] = $params['is_email_receipt'] ?? NULL;
+ $recurParams['is_email_receipt'] = (bool) ($params['is_email_receipt'] ?? FALSE);
// we need to add a unique trxn_id to avoid a unique key error
// in paypal IPN we reset this when paypal sends us the real trxn id, CRM-2991
$recurParams['trxn_id'] = $params['trxn_id'] ?? $params['invoiceID'];
}
CRM_Utils_System::redirect(CRM_Utils_System::url($urlString, $urlParams));
}
- // Only set contribution recur ID for contributions since offline membership recur payments are handled somewhere else.
- if (!is_a($form, "CRM_Member_Form_Membership")) {
- $form->_params['contributionRecurID'] = $recurring->id;
- }
+ $form->_params['contributionRecurID'] = $recurring->id;
return $recurring->id;
}
* This is used by contribution and also event PCPs.
*
* @param object $contribution
- * @param object $contributionSoft
+ * @param array $contributionSoft
* Contribution object.
+ *
+ * @throws \API_Exception
+ * @throws \CRM_Core_Exception
*/
- public static function pcpNotifyOwner($contribution, $contributionSoft) {
- $params = ['id' => $contributionSoft->pcp_id];
+ public static function pcpNotifyOwner($contribution, array $contributionSoft) {
+ $params = ['id' => $contributionSoft['pcp_id']];
CRM_Core_DAO::commonRetrieve('CRM_PCP_DAO_PCP', $params, $pcpInfo);
$ownerNotifyID = CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCPBlock', $pcpInfo['pcp_block_id'], 'owner_notify_id');
$ownerNotifyOption = CRM_Core_PseudoConstant::getName('CRM_PCP_DAO_PCPBlock', 'owner_notify_id', $ownerNotifyID);
if ($ownerNotifyOption != 'no_notifications' &&
(($ownerNotifyOption == 'owner_chooses' &&
- CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP', $contributionSoft->pcp_id, 'is_notify')) ||
+ CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP', $contributionSoft['pcp_id'], 'is_notify')) ||
$ownerNotifyOption == 'all_owners')) {
$pcpInfoURL = CRM_Utils_System::url('civicrm/pcp/info',
- "reset=1&id={$contributionSoft->pcp_id}",
+ "reset=1&id={$contributionSoft['pcp_id']}",
TRUE, NULL, FALSE, TRUE
);
// set email in the template here
if (CRM_Core_BAO_LocationType::getBilling()) {
- list($donorName, $email) = CRM_Contact_BAO_Contact_Location::getEmailDetails($contribution->contact_id,
+ [$donorName, $email] = CRM_Contact_BAO_Contact_Location::getEmailDetails($contribution->contact_id,
FALSE, CRM_Core_BAO_LocationType::getBilling());
}
// get primary location email if no email exist( for billing location).
if (!$email) {
- list($donorName, $email) = CRM_Contact_BAO_Contact_Location::getEmailDetails($contribution->contact_id);
+ [$donorName, $email] = CRM_Contact_BAO_Contact_Location::getEmailDetails($contribution->contact_id);
}
- list($ownerName, $ownerEmail) = CRM_Contact_BAO_Contact_Location::getEmailDetails($contributionSoft->contact_id);
+ [$ownerName, $ownerEmail] = CRM_Contact_BAO_Contact_Location::getEmailDetails($contributionSoft['contact_id']);
$tplParams = [
'page_title' => $pcpInfo['title'],
'receive_date' => $contribution->receive_date,
- 'total_amount' => $contributionSoft->amount,
+ 'total_amount' => $contributionSoft['amount'],
'donors_display_name' => $donorName,
'donors_email' => $email,
'pcpInfoURL' => $pcpInfoURL,
- 'is_honor_roll_enabled' => $contributionSoft->pcp_display_in_roll,
- 'currency' => $contributionSoft->currency,
+ 'is_honor_roll_enabled' => $contributionSoft['pcp_display_in_roll'],
+ 'currency' => $contributionSoft['currency'],
];
$domainValues = CRM_Core_BAO_Domain::getNameAndEmail();
$sendTemplateParams = [
'groupName' => 'msg_tpl_workflow_contribution',
'valueName' => 'pcp_owner_notify',
- 'contactId' => $contributionSoft->contact_id,
+ 'contactId' => $contributionSoft['contact_id'],
'toEmail' => $ownerEmail,
'toName' => $ownerName,
'from' => "$domainValues[0] <$domainValues[1]>",
*
* @return array
*/
- public static function processPcp(&$page, $params) {
+ public static function processPcp(&$page, $params): array {
$params['pcp_made_through_id'] = $page->_pcpId;
$page->assign('pcpBlock', TRUE);
if (!empty($params['pcp_display_in_roll']) && empty($params['pcp_roll_nickname'])) {
* Line items specifically relating to memberships.
*/
protected function processMembership($membershipParams, $contactID, $customFieldsFormatted, $fieldTypes, $premiumParams,
- $membershipLineItems) {
+ $membershipLineItems): void {
$membershipTypeIDs = (array) $membershipParams['selectMembership'];
$membershipTypes = CRM_Member_BAO_Membership::buildMembershipTypeValues($this, $membershipTypeIDs);
CRM_Price_BAO_LineItem::getLineItemArray($membershipParams);
}
- $paymentResult = self::processConfirm(
- $form,
+ $paymentResult = $form->processConfirm(
$membershipParams,
$contactID,
$financialTypeID,
if (empty($form->_params['auto_renew']) && !empty($membershipParams['is_recur'])) {
unset($membershipParams['is_recur']);
}
- list($membershipContribution, $secondPaymentResult) = $this->processSecondaryFinancialTransaction($contactID, $form, array_merge($membershipParams, ['skipLineItem' => 1]),
+ [$membershipContribution, $secondPaymentResult] = $this->processSecondaryFinancialTransaction($contactID, $form, array_merge($membershipParams, ['skipLineItem' => 1]),
$isTest, $unprocessedLineItems, $membershipDetails['minimum_fee'] ?? 0, $membershipDetails['financial_type_id'] ?? NULL);
$paymentResults[] = ['contribution_id' => $membershipContribution->id, 'result' => $secondPaymentResult];
$totalAmount = $membershipContribution->total_amount;
$pending = FALSE;
}
- list($membership, $renewalMode, $dates) = CRM_Member_BAO_Membership::processMembership(
+ [$membership, $renewalMode, $dates] = CRM_Member_BAO_Membership::processMembership(
$contactID, $memType, $isTest,
date('YmdHis'), $membershipParams['cms_contactID'] ?? NULL,
$customFieldsFormatted,
$form->set('membership_amount', $minimumFee);
$form->assign('membership_amount', $minimumFee);
- // we don't need to create the user twice, so lets disable cms_create_account
- // irrespective of the value, CRM-2888
- $tempParams['cms_create_account'] = 0;
-
//set this variable as we are not creating pledge for
//separate membership payment contribution.
//so for differentiating membership contribution from
* @param int $contactID
*
* @return array
+ *
* @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
+ * @throws \Civi\API\Exception\UnauthorizedException
*/
protected function processFormSubmission($contactID) {
if (!isset($this->_params['payment_processor_id'])) {
}
}
- $result = self::processConfirm($this, $paymentParams,
+ $result = $this->processConfirm($paymentParams,
$contactID,
$this->wrangleFinancialTypeID($this->_values['financial_type_id']),
($this->_mode == 'test') ? 1 : 0,
/**
* Process payment after confirmation.
*
- * @param CRM_Core_Form $form
- * Form object.
* @param array $paymentParams
* Array with payment related key.
* value pairs
* @throws Exception
* @return array
* associated array
- *
*/
- public static function processConfirm(
- &$form,
+ public function processConfirm(
&$paymentParams,
$contactID,
$financialTypeID,
$isTest,
$isRecur
- ) {
+ ): array {
+ $form = $this;
CRM_Core_Payment_Form::mapParams($form->_bltID, $form->_params, $paymentParams, TRUE);
$isPaymentTransaction = self::isPaymentTransaction($form);
// add some financial type details to the params list
// if folks need to use it
- //CRM-15297 deprecate contributionTypeID
- $paymentParams['financial_type_id'] = $paymentParams['financialTypeID'] = $paymentParams['contributionTypeID'] = $financialType->id;
+ $paymentParams['financial_type_id'] = $paymentParams['financialTypeID'] = $financialType->id;
//CRM-15297 - contributionType is obsolete - pass financial type as well so people can deprecate it
$paymentParams['financialType_name'] = $paymentParams['contributionType_name'] = $form->_params['contributionType_name'] = $financialType->name;
//CRM-11456
if (!empty($form->_paymentProcessor)) {
$contributionParams['payment_instrument_id'] = $paymentParams['payment_instrument_id'] = $form->_paymentProcessor['payment_instrument_id'];
}
-
- // @todo this is the wrong place for this - it should be done as close to form submission
- // as possible
- $paymentParams['amount'] = CRM_Utils_Rule::cleanMoney($paymentParams['amount']);
+
$contribution = CRM_Contribute_Form_Contribution_Confirm::processFormContribution(
$form,
$paymentParams,
$form->_bltID,
$isRecur
);
+ // CRM-13074 - create the CMSUser after the transaction is completed as it
+ // is not appropriate to delete a valid contribution if a user create problem occurs
+ if (isset($this->_params['related_contact'])) {
+ $contactID = $this->_params['related_contact'];
+ }
+ elseif (isset($this->_params['cms_contactID'])) {
+ $contactID = $this->_params['cms_contactID'];
+ }
+ CRM_Contribute_BAO_Contribution_Utils::createCMSUser($this->_params,
+ $contactID,
+ 'email-' . $form->_bltID
+ );
$paymentParams['item_name'] = $form->_params['description'];