drupal-civicrm/sites/all/modules/civicrm/CRM/Contribute/Form/AdditionalInfo.php

489 lines
18 KiB
PHP
Raw Normal View History

2018-01-14 15:10:16 +02:00
<?php
/*
+--------------------------------------------------------------------+
| CiviCRM version 4.7 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2017 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
| CiviCRM is free software; you can copy, modify, and distribute it |
| under the terms of the GNU Affero General Public License |
| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
| |
| CiviCRM is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the GNU Affero General Public License for more details. |
| |
| You should have received a copy of the GNU Affero General Public |
| License and the CiviCRM Licensing Exception along |
| with this program; if not, contact CiviCRM LLC |
| at info[AT]civicrm[DOT]org. If you have questions about the |
| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
/**
*
* @package CRM
* @copyright CiviCRM LLC (c) 2004-2017
*/
class CRM_Contribute_Form_AdditionalInfo {
/**
* Build the form object for Premium Information.
*
* Called from the CRM_Contribute_Form_Contribute function and seemingly nowhere else.
*
* Probably this should be on the form that uses it since it is not used on multiple forms.
*
* Putting it on this class doesn't seem to reduce complexity.
*
* @param CRM_Core_Form $form
*/
public static function buildPremium(&$form) {
//premium section
$form->add('hidden', 'hidden_Premium', 1);
$sel1 = $sel2 = array();
$dao = new CRM_Contribute_DAO_Product();
$dao->is_active = 1;
$dao->find();
$min_amount = array();
$sel1[0] = ts('-select product-');
while ($dao->fetch()) {
$sel1[$dao->id] = $dao->name . " ( " . $dao->sku . " )";
$min_amount[$dao->id] = $dao->min_contribution;
$options = explode(',', $dao->options);
foreach ($options as $k => $v) {
$options[$k] = trim($v);
}
if ($options[0] != '') {
$sel2[$dao->id] = $options;
}
$form->assign('premiums', TRUE);
}
$form->_options = $sel2;
$form->assign('mincontribution', $min_amount);
$sel = &$form->addElement('hierselect', "product_name", ts('Premium'), 'onclick="showMinContrib();"');
$js = "<script type='text/javascript'>\n";
$formName = 'document.forms.' . $form->getName();
for ($k = 1; $k < 2; $k++) {
if (!isset($defaults['product_name'][$k]) || (!$defaults['product_name'][$k])) {
$js .= "{$formName}['product_name[$k]'].style.display = 'none';\n";
}
}
$sel->setOptions(array($sel1, $sel2));
$js .= "</script>\n";
$form->assign('initHideBoxes', $js);
$form->addDate('fulfilled_date', ts('Fulfilled'), FALSE, array('formatType' => 'activityDate'));
$form->addElement('text', 'min_amount', ts('Minimum Contribution Amount'));
}
/**
* Build the form object for Additional Details.
*
* @param CRM_Core_Form $form
*/
public static function buildAdditionalDetail(&$form) {
//Additional information section
$form->add('hidden', 'hidden_AdditionalDetail', 1);
$attributes = CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Contribution');
$form->addDateTime('thankyou_date', ts('Thank-you Sent'), FALSE, array('formatType' => 'activityDateTime'));
// add various amounts
$nonDeductAmount = &$form->add('text', 'non_deductible_amount', ts('Non-deductible Amount'),
$attributes['non_deductible_amount']
);
$form->addRule('non_deductible_amount', ts('Please enter a valid monetary value for Non-deductible Amount.'), 'money');
if ($form->_online) {
$nonDeductAmount->freeze();
}
$feeAmount = &$form->add('text', 'fee_amount', ts('Fee Amount'),
$attributes['fee_amount']
);
$form->addRule('fee_amount', ts('Please enter a valid monetary value for Fee Amount.'), 'money');
if ($form->_online) {
$feeAmount->freeze();
}
$netAmount = &$form->add('text', 'net_amount', ts('Net Amount'),
$attributes['net_amount']
);
$form->addRule('net_amount', ts('Please enter a valid monetary value for Net Amount.'), 'money');
if ($form->_online) {
$netAmount->freeze();
}
$element = &$form->add('text', 'invoice_id', ts('Invoice ID'),
$attributes['invoice_id']
);
if ($form->_online) {
$element->freeze();
}
else {
$form->addRule('invoice_id',
ts('This Invoice ID already exists in the database.'),
'objectExists',
array('CRM_Contribute_DAO_Contribution', $form->_id, 'invoice_id')
);
}
$element = $form->add('text', 'creditnote_id', ts('Credit Note ID'),
$attributes['creditnote_id']
);
if ($form->_online) {
$element->freeze();
}
else {
$form->addRule('creditnote_id',
ts('This Credit Note ID already exists in the database.'),
'objectExists',
array('CRM_Contribute_DAO_Contribution', $form->_id, 'creditnote_id')
);
}
$form->add('select', 'contribution_page_id',
ts('Online Contribution Page'),
array(
'' => ts('- select -'),
) +
CRM_Contribute_PseudoConstant::contributionPage()
);
$form->add('textarea', 'note', ts('Notes'), array("rows" => 4, "cols" => 60));
$statusName = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
if ($form->_id && $form->_values['contribution_status_id'] == array_search('Cancelled', $statusName)) {
$netAmount->freeze();
$feeAmount->freeze();
}
}
/**
* used by CRM/Pledge/Form/Pledge.php
*
* Build the form object for PaymentReminders Information.
*
* @param CRM_Core_Form $form
*/
public static function buildPaymentReminders(&$form) {
//PaymentReminders section
$form->add('hidden', 'hidden_PaymentReminders', 1);
$form->add('text', 'initial_reminder_day', ts('Send Initial Reminder'), array('size' => 3));
$form->addRule('initial_reminder_day', ts('Please enter a valid reminder day.'), 'positiveInteger');
$form->add('text', 'max_reminders', ts('Send up to'), array('size' => 3));
$form->addRule('max_reminders', ts('Please enter a valid No. of reminders.'), 'positiveInteger');
$form->add('text', 'additional_reminder_day', ts('Send additional reminders'), array('size' => 3));
$form->addRule('additional_reminder_day', ts('Please enter a valid additional reminder day.'), 'positiveInteger');
}
/**
* Process the Premium Information.
*
* @param array $params
* @param int $contributionID
* @param int $premiumID
* @param array $options
*/
public static function processPremium($params, $contributionID, $premiumID = NULL, $options = array()) {
$selectedProductID = $params['product_name'][0];
$selectedProductOptionID = CRM_Utils_Array::value(1, $params['product_name']);
$dao = new CRM_Contribute_DAO_ContributionProduct();
$dao->contribution_id = $contributionID;
$dao->product_id = $selectedProductID;
$dao->fulfilled_date = CRM_Utils_Date::processDate($params['fulfilled_date'], NULL, TRUE);
$isDeleted = FALSE;
//CRM-11106
$premiumParams = array(
'id' => $selectedProductID,
);
$productDetails = array();
CRM_Contribute_BAO_ManagePremiums::retrieve($premiumParams, $productDetails);
$dao->financial_type_id = CRM_Utils_Array::value('financial_type_id', $productDetails);
if (!empty($options[$selectedProductID])) {
$dao->product_option = $options[$selectedProductID][$selectedProductOptionID];
}
if ($premiumID) {
$ContributionProduct = new CRM_Contribute_DAO_ContributionProduct();
$ContributionProduct->id = $premiumID;
$ContributionProduct->find(TRUE);
if ($ContributionProduct->product_id == $selectedProductID) {
$dao->id = $premiumID;
}
else {
$ContributionProduct->delete();
$isDeleted = TRUE;
}
}
$dao->save();
//CRM-11106
if ($premiumID == NULL || $isDeleted) {
$premiumParams = array(
'cost' => CRM_Utils_Array::value('cost', $productDetails),
'currency' => CRM_Utils_Array::value('currency', $productDetails),
'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $productDetails),
'contributionId' => $contributionID,
);
if ($isDeleted) {
$premiumParams['oldPremium']['product_id'] = $ContributionProduct->product_id;
$premiumParams['oldPremium']['contribution_id'] = $ContributionProduct->contribution_id;
}
CRM_Core_BAO_FinancialTrxn::createPremiumTrxn($premiumParams);
}
}
/**
* Process the Note.
*
*
* @param array $params
* @param int $contactID
* @param int $contributionID
* @param int $contributionNoteID
*/
public static function processNote($params, $contactID, $contributionID, $contributionNoteID = NULL) {
//process note
$noteParams = array(
'entity_table' => 'civicrm_contribution',
'note' => $params['note'],
'entity_id' => $contributionID,
'contact_id' => $contactID,
);
$noteID = array();
if ($contributionNoteID) {
$noteID = array("id" => $contributionNoteID);
$noteParams['note'] = $noteParams['note'] ? $noteParams['note'] : "null";
}
CRM_Core_BAO_Note::add($noteParams, $noteID);
}
/**
* Process the Common data.
*
* @param array $params
* @param array $formatted
* @param CRM_Core_Form $form
*/
public static function postProcessCommon(&$params, &$formatted, &$form) {
$fields = array(
'non_deductible_amount',
'total_amount',
'fee_amount',
'net_amount',
'trxn_id',
'invoice_id',
'creditnote_id',
'campaign_id',
'contribution_page_id',
);
foreach ($fields as $f) {
$formatted[$f] = CRM_Utils_Array::value($f, $params);
}
if (!empty($params['thankyou_date']) && !CRM_Utils_System::isNull($params['thankyou_date'])) {
$formatted['thankyou_date'] = CRM_Utils_Date::processDate($params['thankyou_date'], $params['thankyou_date_time']);
}
else {
$formatted['thankyou_date'] = 'null';
}
if (!empty($params['is_email_receipt'])) {
$params['receipt_date'] = $formatted['receipt_date'] = date('YmdHis');
}
//special case to handle if all checkboxes are unchecked
$customFields = CRM_Core_BAO_CustomField::getFields('Contribution',
FALSE,
FALSE,
CRM_Utils_Array::value('financial_type_id',
$params
)
);
$formatted['custom'] = CRM_Core_BAO_CustomField::postProcess($params,
CRM_Utils_Array::value('id', $params, NULL),
'Contribution'
);
}
/**
* Send email receipt.
*
* @param CRM_Core_Form $form
* instance of Contribution form.
* @param array $params
* (reference ) an assoc array of name/value pairs.
* @param bool $ccContribution
* is it credit card contribution.
*
* @return array
*/
public static function emailReceipt(&$form, &$params, $ccContribution = FALSE) {
$form->assign('receiptType', 'contribution');
// Retrieve Financial Type Name from financial_type_id
$params['contributionType_name'] = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_FinancialType',
$params['financial_type_id']);
if (!empty($params['payment_instrument_id'])) {
$paymentInstrument = CRM_Contribute_PseudoConstant::paymentInstrument();
$params['paidBy'] = $paymentInstrument[$params['payment_instrument_id']];
if ($params['paidBy'] != 'Check' && isset($params['check_number'])) {
unset($params['check_number']);
}
}
// retrieve individual prefix value for honoree
if (isset($params['soft_credit'])) {
$softCreditTypes = $softCredits = array();
foreach ($params['soft_credit'] as $key => $softCredit) {
$softCredits[$key] = array(
'Name' => $softCredit['contact_name'],
'Amount' => CRM_Utils_Money::format($softCredit['amount'], $softCredit['currency']),
);
$softCreditTypes[$key] = $softCredit['soft_credit_type_label'];
}
$form->assign('softCreditTypes', $softCreditTypes);
$form->assign('softCredits', $softCredits);
}
// retrieve premium product name and assigned fulfilled
// date to template
if (!empty($params['hidden_Premium'])) {
if (isset($params['product_name']) &&
is_array($params['product_name']) &&
!empty($params['product_name'])
) {
$productDAO = new CRM_Contribute_DAO_Product();
$productDAO->id = $params['product_name'][0];
$productOptionID = $params['product_name'][1];
$productDAO->find(TRUE);
$params['product_name'] = $productDAO->name;
$params['product_sku'] = $productDAO->sku;
if (empty($params['product_option']) && !empty($form->_options[$productDAO->id])) {
$params['product_option'] = $form->_options[$productDAO->id][$productOptionID];
}
}
if (!empty($params['fulfilled_date'])) {
$form->assign('fulfilled_date', CRM_Utils_Date::processDate($params['fulfilled_date']));
}
}
$form->assign('ccContribution', $ccContribution);
if ($ccContribution) {
$form->assignBillingName($params);
$form->assign('address', CRM_Utils_Address::getFormattedBillingAddressFieldsFromParameters(
$params,
$form->_bltID
));
$date = CRM_Utils_Date::format($params['credit_card_exp_date']);
$date = CRM_Utils_Date::mysqlToIso($date);
$form->assign('credit_card_type', CRM_Utils_Array::value('credit_card_type', $params));
$form->assign('credit_card_exp_date', $date);
$form->assign('credit_card_number',
CRM_Utils_System::mungeCreditCard($params['credit_card_number'])
);
}
else {
//offline contribution
// assigned various dates to the templates
$form->assign('receipt_date', CRM_Utils_Date::processDate($params['receipt_date']));
if (!empty($params['cancel_date'])) {
$form->assign('cancel_date', CRM_Utils_Date::processDate($params['cancel_date']));
}
if (!empty($params['thankyou_date'])) {
$form->assign('thankyou_date', CRM_Utils_Date::processDate($params['thankyou_date']));
}
if ($form->_action & CRM_Core_Action::UPDATE) {
$form->assign('lineItem', empty($form->_lineItems) ? FALSE : $form->_lineItems);
}
}
//handle custom data
if (!empty($params['hidden_custom'])) {
$contribParams = array(array('contribution_id', '=', $params['contribution_id'], 0, 0));
if ($form->_mode == 'test') {
$contribParams[] = array('contribution_test', '=', 1, 0, 0);
}
//retrieve custom data
$customGroup = array();
foreach ($form->_groupTree as $groupID => $group) {
$customFields = $customValues = array();
if ($groupID == 'info') {
continue;
}
foreach ($group['fields'] as $k => $field) {
$field['title'] = $field['label'];
$customFields["custom_{$k}"] = $field;
}
//build the array of customgroup contain customfields.
CRM_Core_BAO_UFGroup::getValues($params['contact_id'], $customFields, $customValues, FALSE, $contribParams);
$customGroup[$group['title']] = $customValues;
}
//assign all custom group and corresponding fields to template.
$form->assign('customGroup', $customGroup);
}
$form->assign_by_ref('formValues', $params);
list($contributorDisplayName,
$contributorEmail
) = CRM_Contact_BAO_Contact_Location::getEmailDetails($params['contact_id']);
$form->assign('contactID', $params['contact_id']);
$form->assign('contributionID', $params['contribution_id']);
if (!empty($params['currency'])) {
$form->assign('currency', $params['currency']);
}
if (!empty($params['receive_date'])) {
$form->assign('receive_date', CRM_Utils_Date::processDate($params['receive_date']));
}
$template = CRM_Core_Smarty::singleton();
$taxAmt = $template->get_template_vars('dataArray');
$eventTaxAmt = $template->get_template_vars('totalTaxAmount');
$prefixValue = Civi::settings()->get('contribution_invoice_settings');
$invoicing = CRM_Utils_Array::value('invoicing', $prefixValue);
if ((!empty($taxAmt) || isset($eventTaxAmt)) && (isset($invoicing) && isset($prefixValue['is_email_pdf']))) {
$isEmailPdf = TRUE;
}
else {
$isEmailPdf = FALSE;
}
list($sendReceipt, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate(
array(
'groupName' => 'msg_tpl_workflow_contribution',
'valueName' => 'contribution_offline_receipt',
'contactId' => $params['contact_id'],
'contributionId' => $params['contribution_id'],
'from' => $params['from_email_address'],
'toName' => $contributorDisplayName,
'toEmail' => $contributorEmail,
'isTest' => $form->_mode == 'test',
'PDFFilename' => ts('receipt') . '.pdf',
'isEmailPdf' => $isEmailPdf,
)
);
return $sendReceipt;
}
}