本文整理汇总了PHP中CRM_Contribute_BAO_Contribution::save方法的典型用法代码示例。如果您正苦于以下问题:PHP CRM_Contribute_BAO_Contribution::save方法的具体用法?PHP CRM_Contribute_BAO_Contribution::save怎么用?PHP CRM_Contribute_BAO_Contribution::save使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CRM_Contribute_BAO_Contribution
的用法示例。
在下文中一共展示了CRM_Contribute_BAO_Contribution::save方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: recordAdjustedAmt
/**
* Record adjusted amount.
*
* @param int $updatedAmount
* @param int $paidAmount
* @param int $contributionId
*
* @param int $taxAmount
* @param bool $updateAmountLevel
*
* @return bool|\CRM_Core_BAO_FinancialTrxn
*/
public static function recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId, $taxAmount = NULL, $updateAmountLevel = NULL)
{
$pendingAmount = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId);
$pendingAmount = CRM_Utils_Array::value('total_amount', $pendingAmount, 0);
$balanceAmt = $updatedAmount - $paidAmount;
if ($paidAmount != $pendingAmount) {
$balanceAmt -= $pendingAmount;
}
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$partiallyPaidStatusId = array_search('Partially paid', $contributionStatuses);
$pendingRefundStatusId = array_search('Pending refund', $contributionStatuses);
$completedStatusId = array_search('Completed', $contributionStatuses);
$updatedContributionDAO = new CRM_Contribute_BAO_Contribution();
$adjustedTrxn = $skip = FALSE;
if ($balanceAmt) {
if ($balanceAmt > 0 && $paidAmount != 0) {
$contributionStatusVal = $partiallyPaidStatusId;
} elseif ($balanceAmt < 0 && $paidAmount != 0) {
$contributionStatusVal = $pendingRefundStatusId;
} elseif ($paidAmount == 0) {
//skip updating the contribution status if no payment is made
$skip = TRUE;
$updatedContributionDAO->cancel_date = 'null';
$updatedContributionDAO->cancel_reason = NULL;
}
// update contribution status and total amount without trigger financial code
// as this is handled in current BAO function used for change selection
$updatedContributionDAO->id = $contributionId;
if (!$skip) {
$updatedContributionDAO->contribution_status_id = $contributionStatusVal;
}
$updatedContributionDAO->total_amount = $updatedContributionDAO->net_amount = $updatedAmount;
$updatedContributionDAO->fee_amount = 0;
$updatedContributionDAO->tax_amount = $taxAmount;
if (!empty($updateAmountLevel)) {
$updatedContributionDAO->amount_level = $updateAmountLevel;
}
$updatedContributionDAO->save();
// adjusted amount financial_trxn creation
$updatedContribution = CRM_Contribute_BAO_Contribution::getValues(array('id' => $contributionId), CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
$relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Accounts Receivable Account is' "));
$toFinancialAccount = CRM_Contribute_PseudoConstant::financialAccountType($updatedContribution->financial_type_id, $relationTypeId);
$adjustedTrxnValues = array('from_financial_account_id' => NULL, 'to_financial_account_id' => $toFinancialAccount, 'total_amount' => $balanceAmt, 'status_id' => $completedStatusId, 'payment_instrument_id' => $updatedContribution->payment_instrument_id, 'contribution_id' => $updatedContribution->id, 'trxn_date' => date('YmdHis'), 'currency' => $updatedContribution->currency);
$adjustedTrxn = CRM_Core_BAO_FinancialTrxn::create($adjustedTrxnValues);
}
return $adjustedTrxn;
}
示例2: add
/**
* Takes an associative array and creates a contribution object.
*
* the function extract all the params it needs to initialize the create a
* contribution object. the params array could contain additional unused name/value
* pairs
*
* @param array $params
* (reference ) an assoc array of name/value pairs.
* @param array $ids
* The array that holds all the db ids.
*
* @return CRM_Contribute_BAO_Contribution|void
*/
public static function add(&$params, $ids = array())
{
if (empty($params)) {
return NULL;
}
//per http://wiki.civicrm.org/confluence/display/CRM/Database+layer we are moving away from $ids array
$contributionID = CRM_Utils_Array::value('contribution', $ids, CRM_Utils_Array::value('id', $params));
$duplicates = array();
if (self::checkDuplicate($params, $duplicates, $contributionID)) {
$error = CRM_Core_Error::singleton();
$d = implode(', ', $duplicates);
$error->push(CRM_Core_Error::DUPLICATE_CONTRIBUTION, 'Fatal', array($d), "Duplicate error - existing contribution record(s) have a matching Transaction ID or Invoice ID. Contribution record ID(s) are: {$d}");
return $error;
}
// first clean up all the money fields
$moneyFields = array('total_amount', 'net_amount', 'fee_amount', 'non_deductible_amount');
//if priceset is used, no need to cleanup money
if (!empty($params['skipCleanMoney'])) {
unset($moneyFields[0]);
}
foreach ($moneyFields as $field) {
if (isset($params[$field])) {
$params[$field] = CRM_Utils_Rule::cleanMoney($params[$field]);
}
}
//set defaults in create mode
if (!$contributionID) {
CRM_Core_DAO::setCreateDefaults($params, self::getDefaults());
}
self::calculateMissingAmountParams($params, $contributionID);
if (!empty($params['payment_instrument_id'])) {
$paymentInstruments = CRM_Contribute_PseudoConstant::paymentInstrument('name');
if ($params['payment_instrument_id'] != array_search('Check', $paymentInstruments)) {
$params['check_number'] = 'null';
}
}
$setPrevContribution = TRUE;
// CRM-13964 partial payment
if (!empty($params['partial_payment_total']) && !empty($params['partial_amount_pay'])) {
$partialAmtTotal = $params['partial_payment_total'];
$partialAmtPay = $params['partial_amount_pay'];
$params['total_amount'] = $partialAmtTotal;
if ($partialAmtPay < $partialAmtTotal) {
$params['contribution_status_id'] = CRM_Core_OptionGroup::getValue('contribution_status', 'Partially paid', 'name');
$params['is_pay_later'] = 0;
$setPrevContribution = FALSE;
}
}
if ($contributionID) {
CRM_Utils_Hook::pre('edit', 'Contribution', $contributionID, $params);
} else {
CRM_Utils_Hook::pre('create', 'Contribution', NULL, $params);
}
$contribution = new CRM_Contribute_BAO_Contribution();
$contribution->copyValues($params);
$contribution->id = $contributionID;
if (empty($contribution->id)) {
// (only) on 'create', make sure that a valid currency is set (CRM-16845)
if (!CRM_Utils_Rule::currencyCode($contribution->currency)) {
$config = CRM_Core_Config::singleton();
$contribution->currency = $config->defaultCurrency;
}
}
if ($contributionID && $setPrevContribution) {
$params['prevContribution'] = self::getValues(array('id' => $contributionID), CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
}
$result = $contribution->save();
// Add financial_trxn details as part of fix for CRM-4724
$contribution->trxn_result_code = CRM_Utils_Array::value('trxn_result_code', $params);
$contribution->payment_processor = CRM_Utils_Array::value('payment_processor', $params);
//add Account details
$params['contribution'] = $contribution;
self::recordFinancialAccounts($params);
// reset the group contact cache for this group
CRM_Contact_BAO_GroupContactCache::remove();
if ($contributionID) {
CRM_Utils_Hook::post('edit', 'Contribution', $contribution->id, $contribution);
} else {
CRM_Utils_Hook::post('create', 'Contribution', $contribution->id, $contribution);
}
return $result;
}
示例3: add
/**
* takes an associative array and creates a contribution object
*
* the function extract all the params it needs to initialize the create a
* contribution object. the params array could contain additional unused name/value
* pairs
*
* @param array $params (reference ) an assoc array of name/value pairs
* @param array $ids the array that holds all the db ids
*
* @return object CRM_Contribute_BAO_Contribution object
* @access public
* @static
*/
static function add(&$params, &$ids)
{
if (empty($params)) {
return;
}
$duplicates = array();
if (self::checkDuplicate($params, $duplicates, CRM_Utils_Array::value('contribution', $ids))) {
$error =& CRM_Core_Error::singleton();
$d = implode(', ', $duplicates);
$error->push(CRM_Core_Error::DUPLICATE_CONTRIBUTION, 'Fatal', array($d), "Duplicate error - existing contribution record(s) have a matching Transaction ID or Invoice ID. Contribution record ID(s) are: {$d}");
return $error;
}
// first clean up all the money fields
$moneyFields = array('total_amount', 'net_amount', 'fee_amount', 'non_deductible_amount');
//if priceset is used, no need to cleanup money
if (CRM_UTils_Array::value('skipCleanMoney', $params)) {
unset($moneyFields[0]);
}
foreach ($moneyFields as $field) {
if (isset($params[$field])) {
$params[$field] = CRM_Utils_Rule::cleanMoney($params[$field]);
}
}
if (CRM_Utils_Array::value('payment_instrument_id', $params)) {
require_once 'CRM/Contribute/PseudoConstant.php';
$paymentInstruments = CRM_Contribute_PseudoConstant::paymentInstrument('name');
if ($params['payment_instrument_id'] != array_search('Check', $paymentInstruments)) {
$params['check_number'] = 'null';
}
}
require_once 'CRM/Utils/Hook.php';
if (CRM_Utils_Array::value('contribution', $ids)) {
CRM_Utils_Hook::pre('edit', 'Contribution', $ids['contribution'], $params);
} else {
CRM_Utils_Hook::pre('create', 'Contribution', null, $params);
}
$contribution = new CRM_Contribute_BAO_Contribution();
$contribution->copyValues($params);
$contribution->id = CRM_Utils_Array::value('contribution', $ids);
// also add financial_trxn details as part of fix for CRM-4724
$contribution->trxn_result_code = CRM_Utils_Array::value('trxn_result_code', $params);
$contribution->payment_processor = CRM_Utils_Array::value('payment_processor', $params);
require_once 'CRM/Utils/Rule.php';
if (!CRM_Utils_Rule::currencyCode($contribution->currency)) {
require_once 'CRM/Core/Config.php';
$config = CRM_Core_Config::singleton();
$contribution->currency = $config->defaultCurrency;
}
$result = $contribution->save();
// reset the group contact cache for this group
require_once 'CRM/Contact/BAO/GroupContactCache.php';
CRM_Contact_BAO_GroupContactCache::remove();
if (CRM_Utils_Array::value('contribution', $ids)) {
CRM_Utils_Hook::post('edit', 'Contribution', $contribution->id, $contribution);
} else {
CRM_Utils_Hook::post('create', 'Contribution', $contribution->id, $contribution);
}
return $result;
}
示例4: add
/**
* takes an associative array and creates a contribution object
*
* the function extract all the params it needs to initialize the create a
* contribution object. the params array could contain additional unused name/value
* pairs
*
* @param array $params (reference ) an assoc array of name/value pairs
* @param array $ids the array that holds all the db ids
*
* @return object CRM_Contribute_BAO_Contribution object
* @access public
* @static
*/
static function add(&$params, $ids = array())
{
if (empty($params)) {
return;
}
//per http://wiki.civicrm.org/confluence/display/CRM/Database+layer we are moving away from $ids array
$contributionID = CRM_Utils_Array::value('contribution', $ids, CRM_Utils_Array::value('id', $params));
$duplicates = array();
if (self::checkDuplicate($params, $duplicates, $contributionID)) {
$error = CRM_Core_Error::singleton();
$d = implode(', ', $duplicates);
$error->push(CRM_Core_Error::DUPLICATE_CONTRIBUTION, 'Fatal', array($d), "Duplicate error - existing contribution record(s) have a matching Transaction ID or Invoice ID. Contribution record ID(s) are: {$d}");
return $error;
}
// first clean up all the money fields
$moneyFields = array('total_amount', 'net_amount', 'fee_amount', 'non_deductible_amount');
//if priceset is used, no need to cleanup money
if (CRM_Utils_Array::value('skipCleanMoney', $params)) {
unset($moneyFields[0]);
}
foreach ($moneyFields as $field) {
if (isset($params[$field])) {
$params[$field] = CRM_Utils_Rule::cleanMoney($params[$field]);
}
}
// CRM-13420, set payment instrument to default if payment_instrument_id is empty
if (!$contributionID && !CRM_Utils_Array::value('payment_instrument_id', $params)) {
$params['payment_instrument_id'] = key(CRM_Core_OptionGroup::values('payment_instrument', FALSE, FALSE, FALSE, 'AND is_default = 1'));
}
if (CRM_Utils_Array::value('payment_instrument_id', $params)) {
$paymentInstruments = CRM_Contribute_PseudoConstant::paymentInstrument('name');
if ($params['payment_instrument_id'] != array_search('Check', $paymentInstruments)) {
$params['check_number'] = 'null';
}
}
// contribution status is missing, choose Completed as default status
// do this for create mode only
if (!$contributionID && !CRM_Utils_Array::value('contribution_status_id', $params)) {
$params['contribution_status_id'] = CRM_Core_OptionGroup::getValue('contribution_status', 'Completed', 'name');
}
if ($contributionID) {
CRM_Utils_Hook::pre('edit', 'Contribution', $contributionID, $params);
} else {
CRM_Utils_Hook::pre('create', 'Contribution', NULL, $params);
}
$contribution = new CRM_Contribute_BAO_Contribution();
$contribution->copyValues($params);
$contribution->id = $contributionID;
if (!CRM_Utils_Rule::currencyCode($contribution->currency)) {
$config = CRM_Core_Config::singleton();
$contribution->currency = $config->defaultCurrency;
}
if ($contributionID) {
$params['prevContribution'] = self::getValues(array('id' => $contributionID), CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
}
$result = $contribution->save();
// Add financial_trxn details as part of fix for CRM-4724
$contribution->trxn_result_code = CRM_Utils_Array::value('trxn_result_code', $params);
$contribution->payment_processor = CRM_Utils_Array::value('payment_processor', $params);
//add Account details
$params['contribution'] = $contribution;
self::recordFinancialAccounts($params);
// reset the group contact cache for this group
CRM_Contact_BAO_GroupContactCache::remove();
if ($contributionID) {
CRM_Utils_Hook::post('edit', 'Contribution', $contribution->id, $contribution);
} else {
CRM_Utils_Hook::post('create', 'Contribution', $contribution->id, $contribution);
}
return $result;
}
示例5: fail_contribution
/**
* Marks a contribution as failed.
*
* @param CRM_Contribute_BAO_Contribution $failedContribution
* The contribution to mark as failed
*
* @return CRM_Contribute_BAO_Contribution
* The contribution object.
*/
function fail_contribution($failedContribution)
{
$contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$failedContribution->contribution_status_id = array_search('Failed', $contributionStatus);
$failedContribution->receive_date = CRM_Utils_Date::isoToMysql(date('Y-m-d H:i:s'));
$failedContribution->save();
return $failedContribution;
}
示例6: _setUpContributionObjects
/**
* Prepare for contribution Test - involving only contribution objects
*
* @param bool $contributionPage
*/
public function _setUpContributionObjects($contributionPage = FALSE)
{
$contribution = new CRM_Contribute_BAO_Contribution();
$contribution->id = $this->_contributionId;
$contribution->find(TRUE);
$contributionPageID = NULL;
if (!empty($contributionPage)) {
$dao = new CRM_Core_DAO();
$contribution_page = $dao->createTestObject('CRM_Contribute_DAO_ContributionPage');
$contribution_page->payment_processor = 1;
$contribution_page->save();
$contribution->contribution_page_id = $contributionPageID = $contribution_page->id;
//for unknown reasons trying to do a find & save on a contribution with a receive_date set
// doesn't work. This seems of minimal relevance to this test so ignoring
// note that in tests it worked sometimes & not others - dependent on which other tests run.
// running all CRM_Core tests caused failure as did just the single failing test. But running
// just this class succeeds - because it actually doesn't do a mysql update on the following save
// (unknown reason)
unset($contribution->receive_date);
$contribution->save();
}
$this->objects['contribution'] = $contribution;
$this->input = array('component' => 'contribute', 'contribution_page_id' => $contributionPageID, 'total_amount' => 110.0, 'invoiceID' => "c8acb91e080ad7777a2adc119c192885", 'contactID' => $this->_contactId, 'contributionID' => $this->objects['contribution']->id);
}
示例7: recordAdjustedAmt
/**
* @param $updatedAmount
* @param $paidAmount
* @param $contributionId
*/
static function recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId)
{
$balanceAmt = $updatedAmount - $paidAmount;
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$partiallyPaidStatusId = array_search('Partially paid', $contributionStatuses);
$pendngRefundStatusId = array_search('Pending refund', $contributionStatuses);
$completedStatusId = array_search('Completed', $contributionStatuses);
$updatedContributionDAO = new CRM_Contribute_BAO_Contribution();
if ($balanceAmt) {
if ($balanceAmt > 0 && $paidAmount != 0) {
$contributionStatusVal = $partiallyPaidStatusId;
} elseif ($balanceAmt < 0 && $paidAmount != 0) {
$contributionStatusVal = $pendngRefundStatusId;
} elseif ($paidAmount == 0) {
$contributionStatusVal = $completedStatusId;
$updatedContributionDAO->cancel_date = 'null';
$updatedContributionDAO->cancel_reason = NULL;
}
// update contribution status and total amount without trigger financial code
// as this is handled in current BAO function used for change selection
$updatedContributionDAO->id = $contributionId;
$updatedContributionDAO->contribution_status_id = $contributionStatusVal;
$updatedContributionDAO->total_amount = $updatedAmount;
$updatedContributionDAO->save();
$ftDetail = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId);
// adjusted amount financial_trxn creation
if (empty($ftDetail['trxn_id'])) {
$updatedContribution = CRM_Contribute_BAO_Contribution::getValues(array('id' => $contributionId), CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
$relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Accounts Receivable Account is' "));
$toFinancialAccount = CRM_Contribute_PseudoConstant::financialAccountType($updatedContribution->financial_type_id, $relationTypeId);
$adjustedTrxnValues = array('from_financial_account_id' => NULL, 'to_financial_account_id' => $toFinancialAccount, 'total_amount' => $balanceAmt, 'status_id' => CRM_Core_OptionGroup::getValue('contribution_status', 'Completed', 'name'), 'payment_instrument_id' => $updatedContribution->payment_instrument_id, 'contribution_id' => $updatedContribution->id, 'trxn_date' => date('YmdHis'), 'currency' => $updatedContribution->currency);
$adjustedTrxn = CRM_Core_BAO_FinancialTrxn::create($adjustedTrxnValues);
} else {
// update the financial trxn amount as well, as the fee selections has been updated
if ($balanceAmt != $ftDetail['total_amount']) {
CRM_Core_DAO::setFieldValue('CRM_Core_BAO_FinancialTrxn', $ftDetail['trxn_id'], 'total_amount', $balanceAmt);
}
}
}
}
示例8: add
//.........这里部分代码省略.........
$error->push(CRM_Core_Error::DUPLICATE_CONTRIBUTION, 'Fatal', array($d), "Duplicate error - existing contribution record(s) have a matching Transaction ID or Invoice ID. Contribution record ID(s) are: {$d}");
return $error;
}
// first clean up all the money fields
$moneyFields = array('total_amount', 'net_amount', 'fee_amount', 'non_deductible_amount');
//if priceset is used, no need to cleanup money
if (!empty($params['skipCleanMoney'])) {
unset($moneyFields[0]);
}
foreach ($moneyFields as $field) {
if (isset($params[$field])) {
$params[$field] = CRM_Utils_Rule::cleanMoney($params[$field]);
}
}
//set defaults in create mode
if (!$contributionID) {
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'])) {
// @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)) {
if (empty($params['creditnote_id']) || $params['creditnote_id'] == "null") {
$params['creditnote_id'] = self::createCreditNoteId();
}
}
} else {
// Since the fee amount is expecting this (later on) ensure it is always set.
// It would only not be set for an update where it is unchanged.
$params['contribution_status_id'] = civicrm_api3('Contribution', 'getvalue', array('id' => $contributionID, 'return' => 'contribution_status_id'));
}
if (!$contributionID && CRM_Utils_Array::value('membership_id', $params) && self::checkContributeSettings('deferred_revenue_enabled')) {
$memberStartDate = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $params['membership_id'], 'start_date');
if ($memberStartDate) {
$params['revenue_recognition_date'] = date('Ymd', strtotime($memberStartDate));
}
}
self::calculateMissingAmountParams($params, $contributionID);
if (!empty($params['payment_instrument_id'])) {
$paymentInstruments = CRM_Contribute_PseudoConstant::paymentInstrument('name');
if ($params['payment_instrument_id'] != array_search('Check', $paymentInstruments)) {
$params['check_number'] = 'null';
}
}
$setPrevContribution = TRUE;
// CRM-13964 partial payment
if (!empty($params['partial_payment_total']) && !empty($params['partial_amount_pay'])) {
$partialAmtTotal = $params['partial_payment_total'];
$partialAmtPay = $params['partial_amount_pay'];
$params['total_amount'] = $partialAmtTotal;
if ($partialAmtPay < $partialAmtTotal) {
$params['contribution_status_id'] = CRM_Core_OptionGroup::getValue('contribution_status', 'Partially paid', 'name');
$params['is_pay_later'] = 0;
$setPrevContribution = FALSE;
}
}
if ($contributionID && $setPrevContribution) {
$params['prevContribution'] = self::getOriginalContribution($contributionID);
}
// CRM-16189
CRM_Financial_BAO_FinancialAccount::checkFinancialTypeHasDeferred($params, $contributionID);
if ($contributionID && !empty($params['revenue_recognition_date']) && !empty($params['prevContribution']) && !($contributionStatus[$params['prevContribution']->contribution_status_id] == 'Pending') && !self::allowUpdateRevenueRecognitionDate($contributionID)) {
unset($params['revenue_recognition_date']);
}
if (!isset($params['tax_amount']) && $setPrevContribution && (isset($params['total_amount']) || isset($params['financial_type_id']))) {
$params = CRM_Contribute_BAO_Contribution::checkTaxAmount($params);
}
if ($contributionID) {
CRM_Utils_Hook::pre('edit', 'Contribution', $contributionID, $params);
} else {
CRM_Utils_Hook::pre('create', 'Contribution', NULL, $params);
}
$contribution = new CRM_Contribute_BAO_Contribution();
$contribution->copyValues($params);
$contribution->id = $contributionID;
if (empty($contribution->id)) {
// (only) on 'create', make sure that a valid currency is set (CRM-16845)
if (!CRM_Utils_Rule::currencyCode($contribution->currency)) {
$contribution->currency = CRM_Core_Config::singleton()->defaultCurrency;
}
}
$result = $contribution->save();
// Add financial_trxn details as part of fix for CRM-4724
$contribution->trxn_result_code = CRM_Utils_Array::value('trxn_result_code', $params);
$contribution->payment_processor = CRM_Utils_Array::value('payment_processor', $params);
//add Account details
$params['contribution'] = $contribution;
self::recordFinancialAccounts($params);
if (self::isUpdateToRecurringContribution($params)) {
CRM_Contribute_BAO_ContributionRecur::updateOnNewPayment(!empty($params['contribution_recur_id']) ? $params['contribution_recur_id'] : $params['prevContribution']->contribution_recur_id, $contributionStatus[$params['contribution_status_id']]);
}
CRM_Contact_BAO_GroupContactCache::opportunisticCacheFlush();
if ($contributionID) {
CRM_Utils_Hook::post('edit', 'Contribution', $contribution->id, $contribution);
} else {
CRM_Utils_Hook::post('create', 'Contribution', $contribution->id, $contribution);
}
return $result;
}
示例9: processPartialMandates
/**
* This is the counterpart to the doDirectPayment method. This method creates
* partial mandates, where the subsequent payment processess produces a payment.
*
* This function here should be called after the payment process was completed.
* It will process all the PARTIAL mandates and connect them with created contributions.
*/
public static function processPartialMandates()
{
// load all the PARTIAL mandates
$partial_mandates = civicrm_api3('SepaMandate', 'get', array('version' => 3, 'status' => 'PARTIAL', 'option.limit' => 9999));
foreach ($partial_mandates['values'] as $mandate_id => $mandate) {
if ($mandate['type'] == 'OOFF') {
// in the OOFF case, we need to find the contribution, and connect it
$contribution = civicrm_api('Contribution', 'getsingle', array('version' => 3, 'trxn_id' => $mandate['reference']));
if (empty($contribution['is_error'])) {
// check collection date
$ooff_notice = (int) CRM_Sepa_Logic_Settings::getSetting("batching.OOFF.notice", $mandate['creditor_id']);
$first_collection_date = strtotime("+{$ooff_notice} days");
$collection_date = strtotime($contribution['receive_date']);
if ($collection_date < $first_collection_date) {
// adjust collection date to the earliest possible one
$collection_date = $first_collection_date;
}
// FOUND! Update the contribution...
$contribution_bao = new CRM_Contribute_BAO_Contribution();
$contribution_bao->get('id', $contribution['id']);
$contribution_bao->is_pay_later = 0;
$contribution_bao->receive_date = date('YmdHis', $collection_date);
$contribution_bao->contribution_status_id = (int) CRM_Core_OptionGroup::getValue('contribution_status', 'Pending', 'name');
$contribution_bao->payment_instrument_id = (int) CRM_Core_OptionGroup::getValue('payment_instrument', 'OOFF', 'name');
$contribution_bao->save();
// ...and connect it to the mandate
$mandate_update = array();
$mandate_update['id'] = $mandate['id'];
$mandate_update['entity_id'] = $contribution['id'];
$mandate_update['type'] = $mandate['type'];
if (empty($mandate['contact_id'])) {
// this happens when the payment gets created AFTER the doDirectPayment method
$mandate_update['contact_id'] = $contribution_bao->contact_id;
}
// initialize according to the creditor settings
CRM_Sepa_BAO_SEPACreditor::initialiseMandateData($mandate['creditor_id'], $mandate_update);
// finally, write the changes to the mandate
civicrm_api3('SepaMandate', 'create', $mandate_update);
} else {
// if NOT FOUND or error, delete the partial mandate
civicrm_api3('SepaMandate', 'delete', array('id' => $mandate_id));
}
} elseif ($mandate['type'] == 'RCUR') {
// in the RCUR case, we also need to find the contribution, and connect it
// load the contribution AND the associated recurring contribution
$contribution = civicrm_api('Contribution', 'getsingle', array('version' => 3, 'trxn_id' => $mandate['reference']));
$rcontribution = civicrm_api('ContributionRecur', 'getsingle', array('version' => 3, 'trxn_id' => $mandate['reference']));
if (empty($contribution['is_error']) && empty($rcontribution['is_error'])) {
// we need to set the receive date to the correct collection date, otherwise it will be created again (w/o)
$rcur_notice = (int) CRM_Sepa_Logic_Settings::getSetting("batching.RCUR.notice", $mandate['creditor_id']);
$now = strtotime(date('Y-m-d', strtotime("now +{$rcur_notice} days")));
// round to full day
$collection_date = CRM_Sepa_Logic_Batching::getNextExecutionDate($rcontribution, $now);
// fix contribution
$contribution_bao = new CRM_Contribute_BAO_Contribution();
$contribution_bao->get('id', $contribution['id']);
$contribution_bao->is_pay_later = 0;
$contribution_bao->contribution_status_id = (int) CRM_Core_OptionGroup::getValue('contribution_status', 'Pending', 'name');
$contribution_bao->payment_instrument_id = (int) CRM_Core_OptionGroup::getValue('payment_instrument', 'FRST', 'name');
$contribution_bao->receive_date = date('YmdHis', strtotime($collection_date));
$contribution_bao->save();
// fix recurring contribution
$rcontribution_bao = new CRM_Contribute_BAO_ContributionRecur();
$rcontribution_bao->get('id', $rcontribution['id']);
$rcontribution_bao->start_date = date('YmdHis', strtotime($rcontribution_bao->start_date));
$rcontribution_bao->create_date = date('YmdHis', strtotime($rcontribution_bao->create_date));
$rcontribution_bao->modified_date = date('YmdHis', strtotime($rcontribution_bao->modified_date));
$rcontribution_bao->contribution_status_id = (int) CRM_Core_OptionGroup::getValue('contribution_status', 'Pending', 'name');
$rcontribution_bao->payment_instrument_id = (int) CRM_Core_OptionGroup::getValue('payment_instrument', 'FRST', 'name');
$rcontribution_bao->save();
// ...and connect it to the mandate
$mandate_update = array();
$mandate_update['id'] = $mandate['id'];
$mandate_update['entity_id'] = $rcontribution['id'];
$mandate_update['type'] = $mandate['type'];
if (empty($mandate['contact_id'])) {
$mandate_update['contact_id'] = $contribution['contact_id'];
$mandate['contact_id'] = $contribution['contact_id'];
}
//NO: $mandate_update['first_contribution_id'] = $contribution['id'];
// initialize according to the creditor settings
CRM_Sepa_BAO_SEPACreditor::initialiseMandateData($mandate['creditor_id'], $mandate_update);
// finally, write the changes to the mandate
civicrm_api3('SepaMandate', 'create', $mandate_update);
// ...and trigger notification
// FIXME: WORKAROUND, see https://github.com/Project60/org.project60.sepa/issues/296)
CRM_Contribute_BAO_ContributionPage::recurringNotify(CRM_Core_Payment::RECURRING_PAYMENT_START, $mandate['contact_id'], $contribution_bao->contribution_page_id, $rcontribution_bao);
} else {
// something went wrong, delete partial
error_log("org.project60.sepa: deleting partial mandate " . $mandate['reference']);
civicrm_api3('SepaMandate', 'delete', array('id' => $mandate_id));
}
}
//.........这里部分代码省略.........
示例10: changeFeeSelections
static function changeFeeSelections($params, $participantId, $contributionId, $feeBlock, $lineItems, $paidAmount, $priceSetId)
{
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$partiallyPaidStatusId = array_search('Partially paid', $contributionStatuses);
$pendngRefundStatusId = array_search('Pending refund', $contributionStatuses);
$fetchCon = array('id' => $contributionId);
$contributionObj = CRM_Contribute_BAO_Contribution::retrieve($fetchCon, CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
$previousLineItems = CRM_Price_BAO_LineItem::getLineItems($participantId, 'participant');
CRM_Price_BAO_PriceSet::processAmount($feeBlock, $params, $lineItems);
// get the submitted
foreach ($feeBlock as $id => $values) {
CRM_Price_BAO_LineItem::format($id, $params, $values, $submittedLineItems);
$submittedFieldId[] = CRM_Utils_Array::retrieveValueRecursive($submittedLineItems, 'price_field_id');
}
$insertLines = $submittedLineItems;
$submittedFieldValueIds = array_keys($submittedLineItems);
foreach ($previousLineItems as $id => $previousLineItem) {
// check through the submitted items if the previousItem exists,
// if found in submitted items, do not use it for new item creations
if (in_array($previousLineItem['price_field_value_id'], $submittedFieldValueIds)) {
unset($insertLines[$previousLineItem['price_field_value_id']]);
}
}
$submittedFields = implode(', ', $submittedFieldId);
$submittedFieldValues = implode(', ', $submittedFieldValueIds);
if (!empty($submittedFields) && !empty($submittedFieldValues)) {
// if previous line item is not submitted in selection, update the line total and QTY to '0'
$updateLineItem = "\nUPDATE civicrm_line_item li\nINNER JOIN civicrm_financial_item fi\n ON (li.id = fi.entity_id AND fi.entity_table = 'civicrm_line_item')\nINNER JOIN civicrm_entity_financial_trxn eft\n ON (eft.entity_id = fi.id AND eft.entity_table = 'civicrm_financial_item')\nSET li.qty = 0,\n li.line_total = 0.00,\n fi.amount = 0.00,\n eft.amount = 0.00\nWHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantId}) AND\n (price_field_value_id NOT IN ({$submittedFieldValues}) OR price_field_id NOT IN ({$submittedFields}))\n";
CRM_Core_DAO::executeQuery($updateLineItem);
}
// insert new line items
foreach ($insertLines as $valueId => $lineParams) {
$lineParams['entity_table'] = 'civicrm_participant';
$lineParams['entity_id'] = $participantId;
$lineObj = CRM_Price_BAO_LineItem::create($lineParams);
// insert financial items
// ensure entity_financial_trxn table has a linking of it.
$prevItem = CRM_Financial_BAO_FinancialItem::add($lineObj, $contributionObj);
}
// insert new 'adjusted amount' transaction entry and update contribution entry.
// ensure entity_financial_trxn table has a linking of it.
$updatedAmount = $params['amount'];
$balanceAmt = $updatedAmount - $paidAmount;
if ($balanceAmt) {
if ($balanceAmt > 0) {
$contributionStatusVal = $partiallyPaidStatusId;
} elseif ($balanceAmt < 0) {
$contributionStatusVal = $pendngRefundStatusId;
}
// update contribution status and total amount without trigger financial code
// as this is handled in current BAO function used for change selection
$updatedContributionDAO = new CRM_Contribute_BAO_Contribution();
$updatedContributionDAO->id = $contributionId;
$updatedContributionDAO->contribution_status_id = $contributionStatusVal;
$updatedContributionDAO->total_amount = $updatedAmount;
$updatedContributionDAO->save();
/*
* adjusted amount financial_trxn creation,
* adjusted amount line_item creation,
* adjusted amount financial_item creations,
* adjusted amount enitity_financial_trxn creation
*/
$updatedContribution = CRM_Contribute_BAO_Contribution::getValues(array('id' => $contributionId), CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
$prevTrxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contributionId);
$fetchPrevTrxn['id'] = $prevTrxnId['financialTrxnId'];
$relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Accounts Receivable Account is' "));
$toFinancialAccount = CRM_Contribute_PseudoConstant::financialAccountType($updatedContribution->financial_type_id, $relationTypeId);
$adjustedTrxnValues = array('from_financial_account_id' => NULL, 'to_financial_account_id' => $toFinancialAccount, 'trxn_date' => date('YmdHis'), 'total_amount' => $balanceAmt, 'currency' => $updatedContribution->currency, 'status_id' => CRM_Core_OptionGroup::getValue('contribution_status', 'Completed', 'name'), 'payment_instrument_id' => $updatedContribution->payment_instrument_id, 'contribution_id' => $updatedContribution->id);
$adjustedTrxn = CRM_Core_BAO_FinancialTrxn::create($adjustedTrxnValues);
// record line item
$adjustPaymentLineParams = array('total_amount' => $updatedAmount, 'financial_type_id' => $updatedContribution->financial_type_id);
$setId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', 'default_contribution_amount', 'id', 'name');
CRM_Price_BAO_LineItem::getLineItemArray($adjustPaymentLineParams);
$financialItemStatus = CRM_Core_PseudoConstant::get('CRM_Financial_DAO_FinancialItem', 'status_id');
$defaultPriceSet = current(CRM_Price_BAO_PriceSet::getSetDetail($setId));
$fieldID = key($defaultPriceSet['fields']);
$adjustPaymentLineParams['line_item'][$setId][$fieldID]['entity_id'] = $updatedContribution->id;
$adjustPaymentLineParams['line_item'][$setId][$fieldID]['entity_table'] = 'civicrm_contribution';
$adjustPaymentLine = CRM_Price_BAO_LineItem::create($adjustPaymentLineParams['line_item'][$setId][$fieldID]);
// record financial item
$financialItemStatus = CRM_Core_PseudoConstant::get('CRM_Financial_DAO_FinancialItem', 'status_id');
$itemStatus = NULL;
if ($updatedContribution->contribution_status_id == array_search('Pending refund', $contributionStatuses)) {
$itemStatus = array_search('Paid', $financialItemStatus);
} elseif ($updatedContribution->contribution_status_id == array_search('Partially paid', $contributionStatuses)) {
$itemStatus = array_search('Partially paid', $financialItemStatus);
}
$params = array('transaction_date' => CRM_Utils_Date::isoToMysql($updatedContribution->receive_date), 'contact_id' => $updatedContribution->contact_id, 'amount' => $balanceAmt, 'currency' => $updatedContribution->currency, 'entity_table' => 'civicrm_line_item', 'entity_id' => $adjustPaymentLine->id, 'description' => ($adjustPaymentLine->qty != 1 ? $lineItem->qty . ' of ' : '') . ' ' . $adjustPaymentLine->label, 'status_id' => $itemStatus, 'financial_account_id' => $prevItem->financial_account_id);
CRM_Financial_BAO_FinancialItem::create($params, NULL, array('id' => $adjustedTrxn->id));
}
//activity creation$contributionStatuses
self::addActivityForSelection($participantId, 'Change Registration');
}