$ids['contributionType'] = $this->financial_type_id;
$ids['financialType'] = $this->financial_type_id;
-
- $entities = array(
- 'contact' => 'CRM_Contact_BAO_Contact',
- 'contributionRecur' => 'CRM_Contribute_BAO_ContributionRecur',
- 'contributionType' => 'CRM_Financial_BAO_FinancialType',
- 'financialType' => 'CRM_Financial_BAO_FinancialType',
- );
- foreach ($entities as $entity => $bao) {
- if (!empty($ids[$entity])) {
- $this->_relatedObjects[$entity] = new $bao();
- $this->_relatedObjects[$entity]->id = $ids[$entity];
- if (!$this->_relatedObjects[$entity]->find(TRUE)) {
- throw new CRM_Core_Exception($entity . ' could not be loaded');
- }
- }
+ if ($this->contribution_page_id) {
+ $ids['contributionPage'] = $this->contribution_page_id;
}
+ $this->loadRelatedEntitiesByID($ids);
+
if (!empty($ids['contributionRecur']) && !$paymentProcessorID) {
$paymentProcessorID = $this->_relatedObjects['contributionRecur']->payment_processor_id;
}
//not really sure what params might be passed in but lets merge em into values
$values = array_merge($this->_gatherMessageValues($input, $values, $ids), $values);
+ $values['is_email_receipt'] = $this->isEmailReceipt($input, $values);
if (!empty($input['receipt_date'])) {
$values['receipt_date'] = $input['receipt_date'];
}
if (!empty($input['amount'])) {
$values['totalAmount'] = $input['amount'];
}
-
+ // @todo set this in is_email_receipt, based on $this->_relatedObjects.
if ($values['event']['is_email_confirm']) {
$values['is_email_receipt'] = 1;
}
$values['softContributions'] = $softContributions['soft_credit'];
}
if (isset($this->contribution_page_id)) {
+ // This is a call we want to use less, in favour of loading related objects.
$values = $this->addContributionPageValuesToValuesHeavyHandedly($values);
if ($this->contribution_page_id) {
+ // This is precautionary as there are some legacy flows, but it should really be
+ // loaded by now.
+ if (!isset($this->_relatedObjects['contributionPage'])) {
+ $this->loadRelatedEntitiesByID(array('contributionPage' => $this->contribution_page_id));
+ }
// CRM-8254 - override default currency if applicable
$config = CRM_Core_Config::singleton();
$config->defaultCurrency = CRM_Utils_Array::value(
// no contribution page -probably back office
else {
// Handle re-print receipt for offline contributions (call from PDF.php - no contribution_page_id)
- $values['is_email_receipt'] = 1;
$values['title'] = 'Contribution';
}
// set lineItem for contribution
// These are the values that I believe to be useful.
'id',
'title',
- 'is_email_receipt',
'pay_later_receipt',
'pay_later_text',
'receipt_from_email',
}
}
+ /**
+ * Load entities related to the contribution into $this->_relatedObjects.
+ *
+ * @param array $ids
+ *
+ * @throws \CRM_Core_Exception
+ */
+ protected function loadRelatedEntitiesByID($ids) {
+ $entities = array(
+ 'contact' => 'CRM_Contact_BAO_Contact',
+ 'contributionRecur' => 'CRM_Contribute_BAO_ContributionRecur',
+ 'contributionType' => 'CRM_Financial_BAO_FinancialType',
+ 'financialType' => 'CRM_Financial_BAO_FinancialType',
+ 'contributionPage' => 'CRM_Contribute_BAO_ContributionPage',
+ );
+ foreach ($entities as $entity => $bao) {
+ if (!empty($ids[$entity])) {
+ $this->_relatedObjects[$entity] = new $bao();
+ $this->_relatedObjects[$entity]->id = $ids[$entity];
+ if (!$this->_relatedObjects[$entity]->find(TRUE)) {
+ throw new CRM_Core_Exception($entity . ' could not be loaded');
+ }
+ }
+ }
+ }
+
+ /**
+ * Should an email receipt be sent for this contribution when complete.
+ *
+ * @param array $input
+ *
+ * @return mixed
+ */
+ protected function isEmailReceipt($input) {
+ if (isset($input['is_email_receipt'])) {
+ return $input['is_email_receipt'];
+ }
+ if (!empty($this->_relatedObjects['contribution_page_id'])) {
+ return $this->_relatedObjects['contribution_page_id']->is_email_receipt;
+ }
+ return TRUE;
+ }
+
}
$this->mut->stop();
$this->revertTemplateToReservedTemplate();
}
+ /**
+ * CRM-19710 - Test to ensure that completetransaction respects the input for is_email_receipt setting.
+ *
+ * If passed in it will override the default from contribution page.
+ */
+ public function testCompleteTransactionWithEmailReceiptInputTrue() {
+ $mut = new CiviMailUtils($this, TRUE);
+ $this->createLoggedInUser();
+ // Create a Contribution Page with is_email_receipt = FALSE
+ $contributionPage = $this->callAPISuccess('ContributionPage', 'create', array(
+ 'receipt_from_name' => 'Mickey Mouse',
+ 'receipt_from_email' => 'mickey@mouse.com',
+ 'title' => "Test Contribution Page",
+ 'financial_type_id' => 1,
+ 'currency' => 'CAD',
+ 'is_monetary' => TRUE,
+ 'is_email_receipt' => 0,
+ ));
+ $this->_params['contribution_page_id'] = $contributionPage['id'];
+ $params = array_merge($this->_params, array('contribution_status_id' => 2, 'receipt_date' => 'now'));
+ $contribution = $this->callAPISuccess('contribution', 'create', $params);
+ // Complete the transaction overriding is_email_receipt to = TRUE
+ $this->callAPISuccess('contribution', 'completetransaction', array(
+ 'id' => $contribution['id'],
+ 'is_email_receipt' => 1,
+ ));
+ $mut->checkMailLog(array(
+ 'Please print this receipt for your records.',
+ ));
+ $mut->stop();
+ }
/**
* Complete the transaction using the template with all the possible.