X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=CRM%2FContribute%2FBAO%2FContribution.php;h=f8cc5df3ef984fe955fa15239dfe43e7b80df632;hb=a1154996756e80b5c66c190e8cfbc19a004ccfe6;hp=f62cbc7cbb10b1f1e93015d47f7453691fddd387;hpb=77b626242d4be86708bcbe14ca9750e080cd29b6;p=civicrm-core.git diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index f62cbc7cbb..f8cc5df3ef 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -3,7 +3,7 @@ +--------------------------------------------------------------------+ | CiviCRM version 4.7 | +--------------------------------------------------------------------+ - | Copyright CiviCRM LLC (c) 2004-2015 | + | Copyright CiviCRM LLC (c) 2004-2016 | +--------------------------------------------------------------------+ | This file is a part of CiviCRM. | | | @@ -28,7 +28,7 @@ /** * * @package CRM - * @copyright CiviCRM LLC (c) 2004-2015 + * @copyright CiviCRM LLC (c) 2004-2016 */ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution { @@ -134,9 +134,9 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution { CRM_Core_DAO::setCreateDefaults($params, self::getDefaults()); } + $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'); //if contribution is created with cancelled or refunded status, add credit note id if (!empty($params['contribution_status_id'])) { - $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'); // @todo - should we include Chargeback? If so use self::isContributionStatusNegative($params['contribution_status_id']) if (($params['contribution_status_id'] == array_search('Refunded', $contributionStatus) || $params['contribution_status_id'] == array_search('Cancelled', $contributionStatus)) @@ -2554,6 +2554,15 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac $addressDetails = array_values($addressDetails); $values['address'] = $addressDetails[0]['display']; } + // Else we assign the billing address of the contribution contact. + else { + $addressParams = array('contact_id' => $this->contact_id, 'is_billing' => 1); + $addressDetails = CRM_Core_BAO_Address::getValues($addressParams); + if (!is_null($addressDetails)) { + $addressDetails = array_values($addressDetails); + $values['address'] = $addressDetails[0]['display']; + } + } if ($this->_component == 'contribute') { //get soft contributions $softContributions = CRM_Contribute_BAO_ContributionSoft::getSoftContribution($this->id, TRUE); @@ -2823,7 +2832,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac $template->assign('trxn_id', $this->trxn_id); $template->assign('receive_date', - CRM_Utils_Date::mysqlToIso($this->receive_date) + CRM_Utils_Date::processDate($this->receive_date) ); $template->assign('contributeMode', 'notify'); $template->assign('action', $this->is_test ? 1024 : 1); @@ -3803,20 +3812,21 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']}) } // add financial item entry $financialItemStatus = CRM_Core_PseudoConstant::get('CRM_Financial_DAO_FinancialItem', 'status_id'); - $getLine['entity_id'] = $contributionDAO->id; - $getLine['entity_table'] = 'civicrm_contribution'; - $lineItemId = CRM_Price_BAO_LineItem::retrieve($getLine, CRM_Core_DAO::$_nullArray); - if (!empty($lineItemId->id)) { - $addFinancialEntry = array( - 'transaction_date' => $financialTrxn->trxn_date, - 'contact_id' => $contributionDAO->contact_id, - 'amount' => $financialTrxn->total_amount, - 'status_id' => array_search('Paid', $financialItemStatus), - 'entity_id' => $lineItemId->id, - 'entity_table' => 'civicrm_line_item', - ); - $trxnIds['id'] = $financialTrxn->id; - CRM_Financial_BAO_FinancialItem::create($addFinancialEntry, NULL, $trxnIds); + $lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($contributionDAO->id); + if (!empty($lineItems)) { + foreach ($lineItems as $lineItemId => $lineItemValue) { + $paid = $lineItemValue['line_total'] * ($financialTrxn->total_amount / $contributionDAO->total_amount); + $addFinancialEntry = array( + 'transaction_date' => $financialTrxn->trxn_date, + 'contact_id' => $contributionDAO->contact_id, + 'amount' => round($paid, 2), + 'status_id' => array_search('Paid', $financialItemStatus), + 'entity_id' => $lineItemId, + 'entity_table' => 'civicrm_line_item', + ); + $trxnIds['id'] = $financialTrxn->id; + CRM_Financial_BAO_FinancialItem::create($addFinancialEntry, NULL, $trxnIds); + } } if ($participantId) { // update participant status @@ -4343,6 +4353,7 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']}) 'campaign_id', 'receive_date', 'receipt_date', + 'contribution_status_id', ); if (self::isSingleLineItem($primaryContributionID)) { $inputContributionWhiteList[] = 'financial_type_id'; @@ -4351,16 +4362,19 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']}) $participant = CRM_Utils_Array::value('participant', $objects); $memberships = CRM_Utils_Array::value('membership', $objects); $recurContrib = CRM_Utils_Array::value('contributionRecur', $objects); + $recurringContributionID = (empty($recurContrib->id)) ? NULL : $recurContrib->id; $event = CRM_Utils_Array::value('event', $objects); + $completedContributionStatusID = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'); + $contributionParams = array_merge(array( - 'contribution_status_id' => 'Completed', + 'contribution_status_id' => $completedContributionStatusID, 'source' => self::getRecurringContributionDescription($contribution, $event), ), array_intersect_key($input, array_fill_keys($inputContributionWhiteList, 1) )); - if (!empty($recurContrib->id)) { - $contributionParams['contribution_recur_id'] = $recurContrib->id; + if ($recurringContributionID) { + $contributionParams['contribution_recur_id'] = $recurringContributionID; } $changeDate = CRM_Utils_Array::value('trxn_date', $input, date('YmdHis')); @@ -4385,25 +4399,18 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']}) // Figure out what we gain from this. CRM_Contribute_BAO_ContributionPage::setValues($contribution->contribution_page_id, $values); } - elseif ($recurContrib && $recurContrib->id) { + elseif ($recurContrib && $recurringContributionID) { $values['amount'] = $recurContrib->amount; $values['financial_type_id'] = $objects['contributionType']->id; $values['title'] = $source = ts('Offline Recurring Contribution'); - $domainValues = CRM_Core_BAO_Domain::getNameAndEmail(); - $values['receipt_from_name'] = $domainValues[0]; - $values['receipt_from_email'] = $domainValues[1]; } - if ($recurContrib && $recurContrib->id && !isset($input['is_email_receipt'])) { + if ($recurContrib && $recurringContributionID && !isset($input['is_email_receipt'])) { //CRM-13273 - is_email_receipt setting on recurring contribution should take precedence over contribution page setting // but CRM-16124 if $input['is_email_receipt'] is set then that should not be overridden. $values['is_email_receipt'] = $recurContrib->is_email_receipt; } - if (!empty($values['is_email_receipt'])) { - $contributionParams['receipt_date'] = $changeDate; - } - if (!empty($memberships)) { foreach ($memberships as $membershipTypeIdKey => $membership) { if ($membership) { @@ -4494,7 +4501,7 @@ LIMIT 1;"; $contributionParams['id'] = $contribution->id; - civicrm_api3('Contribution', 'create', $contributionParams); + $contributionResult = civicrm_api3('Contribution', 'create', $contributionParams); // Add new soft credit against current $contribution. if (CRM_Utils_Array::value('contributionRecur', $objects) && $objects['contributionRecur']->id) { @@ -4527,11 +4534,11 @@ LIMIT 1;"; elseif (!empty($contribution->_relatedObjects['membership'])) { $input['skipLineItem'] = TRUE; $input['contribution_mode'] = 'membership'; - $contribution->contribution_status_id = $contributionStatuses['Completed']; + $contribution->contribution_status_id = $contributionParams['contribution_status_id']; $contribution->trxn_id = CRM_Utils_Array::value('trxn_id', $input); $contribution->receive_date = CRM_Utils_Date::isoToMysql($contribution->receive_date); } - $input['contribution_status_id'] = $contributionStatuses['Completed']; + $input['contribution_status_id'] = $contributionParams['contribution_status_id']; $input['total_amount'] = $input['amount']; $input['contribution'] = $contribution; $input['financial_type_id'] = $contribution->financial_type_id; @@ -4551,7 +4558,8 @@ LIMIT 1;"; CRM_Core_Error::debug_log_message("Contribution record updated successfully"); $transaction->commit(); - CRM_Contribute_BAO_ContributionRecur::updateRecurLinkedPledge($contribution); + CRM_Contribute_BAO_ContributionRecur::updateRecurLinkedPledge($contribution->id, $recurringContributionID, + $input['contribution_status_id'], $input['total_amount']); // create an activity record if ($input['component'] == 'contribute') { @@ -4573,7 +4581,10 @@ LIMIT 1;"; if (!array_key_exists('is_email_receipt', $values) || $values['is_email_receipt'] == 1 ) { - self::sendMail($input, $ids, $objects['contribution'], $values, $recur, FALSE); + civicrm_api3('Contribution', 'sendconfirmation', array( + 'id' => $contribution->id, + 'payment_processor_id' => $paymentProcessorId, + )); CRM_Core_Error::debug_log_message("Receipt sent"); } @@ -4582,6 +4593,7 @@ LIMIT 1;"; CRM_Contribute_BAO_ContributionRecur::sendRecurringStartOrEndNotification($ids, $recur, $isFirstOrLastRecurringPayment); } + return $contributionResult; } /** @@ -4596,7 +4608,7 @@ LIMIT 1;"; * Incoming data from Payment processor. * @param array $ids * Related object IDs. - * @param CRM_Contribute_BAO_Contribution $contribution + * @param int $contributionID * @param array $values * Values related to objects that have already been loaded. * @param bool $recur @@ -4606,10 +4618,19 @@ LIMIT 1;"; * is because the function is also used to generate pdfs * * @return array + * @throws \CRM_Core_Exception + * @throws \CiviCRM_API3_Exception */ - public static function sendMail(&$input, &$ids, $contribution, &$values, $recur = FALSE, $returnMessageText = FALSE) { + public static function sendMail(&$input, &$ids, $contributionID, &$values, $recur = FALSE, + $returnMessageText = FALSE) { $input['is_recur'] = $recur; - $input['receipt_date'] = $contribution->receipt_date; + + $contribution = new CRM_Contribute_BAO_Contribution(); + $contribution->id = $contributionID; + if (!$contribution->find(TRUE)) { + throw new CRM_Core_Exception('Contribution does not exist'); + } + $contribution->loadRelatedObjects($input, $ids, TRUE); // set receipt from e-mail and name in value if (!$returnMessageText) { $session = CRM_Core_Session::singleton(); @@ -4620,6 +4641,11 @@ LIMIT 1;"; $values['receipt_from_name'] = CRM_Utils_Array::value('receipt_from_name', $input, $userName); } } + // Contribution ID should really always be set. But ? + if (!$returnMessageText && (!isset($input['receipt_update']) || $input['receipt_update'])) { + civicrm_api3('Contribution', 'create', array('receipt_date' => 'now', 'id' => $contribution->id)); + $values['receipt_date'] = date('Y-m-d H:i:s'); + } return $contribution->composeMessageArray($input, $ids, $values, $recur, $returnMessageText); } @@ -4762,7 +4788,10 @@ LIMIT 1;"; * @throws \CiviCRM_API3_Exception */ protected static function getRecurringContributionDescription($contribution, $event) { - if (!empty($contribution->contribution_page_id)) { + if (!empty($contribution->source)) { + return $contribution->source; + } + elseif (!empty($contribution->contribution_page_id)) { $contributionPageTitle = civicrm_api3('ContributionPage', 'getvalue', array( 'id' => $contribution->contribution_page_id, 'return' => 'title', @@ -4785,10 +4814,10 @@ LIMIT 1;"; */ public static function addPayments($lineItems, $contributions) { // get financial trxn which is a payment - $ftSql = "SELECT ft.id + $ftSql = "SELECT ft.id, ft.total_amount FROM civicrm_financial_trxn ft INNER JOIN civicrm_entity_financial_trxn eft ON eft.financial_trxn_id = ft.id AND eft.entity_table = 'civicrm_contribution' - WHERE eft.entity_id = %1 AND ft.is_payment = 1"; + WHERE eft.entity_id = %1 AND ft.is_payment = 1 ORDER BY ft.id DESC LIMIT 1"; $sql = "SELECT fi.id, li.price_field_value_id FROM civicrm_financial_item fi INNER JOIN civicrm_line_item li ON li.id = fi.entity_id @@ -4798,7 +4827,11 @@ LIMIT 1;"; if ($contribution->contribution_status_id != CRM_Core_OptionGroup::getValue('contribution_status', 'Partially paid', 'name')) { continue; } - $ftId = CRM_Core_DAO::singleValueQuery($ftSql, array(1 => array($contribution->id, 'Integer'))); + $ftDao = CRM_Core_DAO::executeQuery($ftSql, array(1 => array($contribution->id, 'Integer'))); + $ftDao->fetch(); + $trxnAmount = $ftDao->total_amount; + $ftId = $ftDao->id; + // get financial item $dao = CRM_Core_DAO::executeQuery($sql, array(1 => array($contribution->id, 'Integer'))); while ($dao->fetch()) { @@ -4810,7 +4843,7 @@ LIMIT 1;"; 'financial_trxn_id' => $ftId, ); foreach ($lineItems as $key => $value) { - $paid = $value['line_total'] * ($contribution->net_amount / $contribution->total_amount); + $paid = $value['line_total'] * ($trxnAmount / $contribution->total_amount); // Record Entity Financial Trxn $params['amount'] = round($paid, 2); $params['entity_id'] = $ftIds[$value['price_field_value_id']];