+--------------------------------------------------------------------+
| CiviCRM version 4.7 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2015 |
+ | Copyright CiviCRM LLC (c) 2004-2016 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
/**
*
* @package CRM
- * @copyright CiviCRM LLC (c) 2004-2015
+ * @copyright CiviCRM LLC (c) 2004-2016
*/
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))
//not really sure what params might be passed in but lets merge em into values
$values = array_merge($this->_gatherMessageValues($input, $values, $ids), $values);
+ if (!empty($input['receipt_date'])) {
+ $values['receipt_date'] = $input['receipt_date'];
+ }
+
$template = CRM_Core_Smarty::singleton();
$this->_assignMessageVariablesToTemplate($values, $input, $template, $recur, $returnMessageText);
//what does recur 'mean here - to do with payment processor return functionality but
$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);
$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);
}
// 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
'is_test',
'campaign_id',
'receive_date',
+ 'receipt_date',
+ 'contribution_status_id',
);
if (self::isSingleLineItem($primaryContributionID)) {
$inputContributionWhiteList[] = 'financial_type_id';
$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'));
// 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) {
$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) {
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;
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') {
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");
}
CRM_Contribute_BAO_ContributionRecur::sendRecurringStartOrEndNotification($ids, $recur,
$isFirstOrLastRecurringPayment);
}
+ return $contributionResult;
}
/**
* 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
* 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;
+
+ $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();
$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);
}
* @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',
*/
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
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()) {
'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']];