From 4ee752659d474be3abf8bf6013b4353a3fdc8a6e Mon Sep 17 00:00:00 2001 From: "deb.monish" Date: Tue, 1 Aug 2017 16:15:40 +0530 Subject: [PATCH] CRM-20610: 'Payment Edit' form improvements --- CRM/Contribute/BAO/Contribution.php | 1 + CRM/Financial/Form/PaymentEdit.php | 162 ++++++++++-------- .../CRM/Contribute/Form/PaymentInfoBlock.tpl | 4 +- templates/CRM/Financial/Form/PaymentEdit.tpl | 33 +++- 4 files changed, 120 insertions(+), 80 deletions(-) diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 12e055528d..ae02b059fc 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -4176,6 +4176,7 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']}) CRM_Core_Action::UPDATE => array( 'name' => "", 'url' => 'civicrm/payment/edit', + 'class' => 'medium-popup', 'qs' => "reset=1&id=%%id%%", 'title' => ts('Edit Payment'), ), diff --git a/CRM/Financial/Form/PaymentEdit.php b/CRM/Financial/Form/PaymentEdit.php index 64cbf31294..524afb6cf3 100644 --- a/CRM/Financial/Form/PaymentEdit.php +++ b/CRM/Financial/Form/PaymentEdit.php @@ -73,13 +73,7 @@ class CRM_Financial_Form_PaymentEdit extends CRM_Core_Form { * @return array */ public function setDefaultValues() { - $defaults = $this->_values; - if (!empty($defaults['card_type_id'])) { - // See comments in getPaymentFields function about why this nastiness exists. - $defaults['credit_card_type'] = CRM_Core_PseudoConstant::getName('CRM_Financial_DAO_FinancialTrxn', 'card_type_id', $defaults['card_type_id']); - } - - return $defaults; + return $this->_values; } /** @@ -91,24 +85,22 @@ class CRM_Financial_Form_PaymentEdit extends CRM_Core_Form { $paymentFields = $this->getPaymentFields(); $this->assign('paymentFields', $paymentFields); foreach ($paymentFields as $name => $paymentField) { - $this->add($paymentField['htmlType'], - $paymentField['name'], - $paymentField['title'], - $paymentField['attributes'], - TRUE - ); - if (!empty($paymentField['rules'])) { - foreach ($paymentField['rules'] as $rule) { - $this->addRule($name, - $rule['rule_message'], - $rule['rule_name'], - $rule['rule_parameters'] - ); - } + if (!empty($paymentField['add_field'])) { + $this->addField($name, $paymentField['attributes'], $paymentField['is_required']); + } + else { + $this->add($paymentField['htmlType'], + $name, + $paymentField['title'], + $paymentField['attributes'], + $paymentField['is_required'] + ); } } $this->assign('currency', CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_Currency', $this->_values['currency'], 'symbol', 'name')); + $this->addFormRule(array(__CLASS__, 'formRule'), $this); + $this->addButtons(array( array( 'type' => 'submit', @@ -122,24 +114,52 @@ class CRM_Financial_Form_PaymentEdit extends CRM_Core_Form { )); } + /** + * Global form rule. + * + * @param array $fields + * The input form values. + * @param array $files + * The uploaded files if any. + * @param $self + * + * @return bool|array + * true if no errors, else array of errors + */ + public static function formRule($fields, $files, $self) { + $errors = array(); + + // if Credit Card is chosen and pan_truncation is not NULL ensure that it's value is numeric else throw validation error + if (CRM_Core_PseudoConstant::getName('CRM_Financial_DAO_FinancialTrxn', 'payment_instrument_id', $fields['payment_instrument_id']) == 'Credit Card' && + !empty($fields['pan_truncation']) && + !CRM_Utils_Rule::numeric($fields['pan_truncation']) + ) { + $errors['pan_truncation'] = ts('Please enter a valid Card Number'); + } + + return $errors; + } + /** * Process the form submission. */ public function postProcess() { $params = array( 'id' => $this->_id, - 'check_number' => CRM_Utils_Array::value('check_number', $this->_submitValues), - 'pan_truncation' => CRM_Utils_Array::value('pan_truncation', $this->_submitValues), + 'payment_instrument_id' => $this->_submitValues['payment_instrument_id'], + 'trxn_id' => CRM_Utils_Array::value('trxn_id', $this->_submitValues), 'trxn_date' => CRM_Utils_Array::value('trxn_date', $this->_submitValues, date('YmdHis')), ); - if (!empty($this->_submitValues['credit_card_type'])) { - // See comments in getPaymentFields function about why this nastiness exists. - $params['card_type_id'] = CRM_Core_PseudoConstant::getKey( - 'CRM_Financial_DAO_FinancialTrxn', - 'card_type_id', - $this->_submitValues['credit_card_type'] - ); + + $paymentInstrumentName = CRM_Core_PseudoConstant::getName('CRM_Financial_DAO_FinancialTrxn', 'payment_instrument_id', $params['payment_instrument_id']); + if ($paymentInstrumentName == 'Credit Card') { + $params['card_type_id'] = CRM_Utils_Array::value('card_type_id', $this->_submitValues); + $params['pan_truncation'] = CRM_Utils_Array::value('pan_truncation', $this->_submitValues); + } + elseif ($paymentInstrumentName == 'Check') { + $params['check_number'] = CRM_Utils_Array::value('check_number', $this->_submitValues); } + // update the financial trxn civicrm_api3('FinancialTrxn', 'create', $params); CRM_Core_Session::singleton()->pushUserContext(CRM_Utils_System::url(CRM_Utils_System::currentPath())); @@ -149,56 +169,53 @@ class CRM_Financial_Form_PaymentEdit extends CRM_Core_Form { * Get payment fields */ public function getPaymentFields() { - $paymentFields = array(); - $paymentInstrument = CRM_Core_PseudoConstant::getName('CRM_Financial_DAO_FinancialTrxn', 'payment_instrument_id', $this->_values['payment_instrument_id']); - if ($paymentInstrument == 'Check') { - $paymentFields['check_number'] = array( - 'htmlType' => 'text', - 'name' => 'check_number', - 'title' => ts('Check Number'), + $paymentFields = array( + 'payment_instrument_id' => array( + 'is_required' => TRUE, + 'add_field' => TRUE, + 'attributes' => array( + 'entity' => 'FinancialTrxn', + 'name' => 'payment_instrument_id', + ), + ), + 'check_number' => array( 'is_required' => FALSE, - 'attributes' => NULL, - ); - } - elseif ($paymentInstrument == 'Credit Card') { - // Ideally we would use $this->addField('card_type_id', array('entity' => 'FinancialTrxn')); - // to assign this field (& other fields on this form). However, the addCreditCardJs - // adds some 'pretty' to the credit card selection. The 'cost' of this is that because it - // was originally written to comply with front end needs (use of the word rather than the id) - // we have to do a lot of wrangling with our fields to make the BillingBlock.js code work. - // If you are reading this it means it's time to fix the BillingBlock.js to work with - // card_type_id and the pseudoconstant options & set this code free. No returns. - CRM_Financial_Form_Payment::addCreditCardJs(NULL, 'payment-edit-block'); - $paymentFields['credit_card_type'] = array( - 'htmlType' => 'select', - 'name' => 'credit_card_type', - 'title' => ts('Card Type'), - 'attributes' => array('' => ts('- select -')) + CRM_Contribute_PseudoConstant::creditCard(), - ); - $paymentFields['pan_truncation'] = array( - 'htmlType' => 'text', - 'name' => 'pan_truncation', - 'title' => ts('Last 4 digits of the card'), + 'add_field' => TRUE, 'attributes' => array( - 'size' => 4, - 'maxlength' => 4, - 'minlength' => 4, - 'autocomplete' => 'off', + 'entity' => 'FinancialTrxn', + 'name' => 'check_number', ), - 'rules' => array( - array( - 'rule_message' => ts('Please enter valid last 4 digit card number.'), - 'rule_name' => 'numeric', - 'rule_parameters' => NULL, - ), + ), + // @TODO we need to show card type icon in place of select field + 'card_type_id' => array( + 'is_required' => FALSE, + 'add_field' => TRUE, + 'attributes' => array( + 'entity' => 'FinancialTrxn', + 'name' => 'card_type_id', ), - ); - } - $paymentFields += array( + ), + 'pan_truncation' => array( + 'is_required' => FALSE, + 'add_field' => TRUE, + 'attributes' => array( + 'entity' => 'FinancialTrxn', + 'name' => 'pan_truncation', + ), + ), + 'trxn_id' => array( + 'htmlType' => 'text', + 'title' => ts('Transaction ID'), + 'is_required' => FALSE, + 'attributes' => array( + 'size' => 6, + ), + ), 'trxn_date' => array( 'htmlType' => 'datepicker', 'name' => 'trxn_date', 'title' => ts('Transaction Date'), + 'is_required' => TRUE, 'attributes' => array( 'date' => 'yyyy-mm-dd', 'time' => 24, @@ -208,6 +225,7 @@ class CRM_Financial_Form_PaymentEdit extends CRM_Core_Form { 'htmlType' => 'text', 'name' => 'total_amount', 'title' => ts('Total Amount'), + 'is_required' => TRUE, 'attributes' => array( 'readonly' => TRUE, 'size' => 6, diff --git a/templates/CRM/Contribute/Form/PaymentInfoBlock.tpl b/templates/CRM/Contribute/Form/PaymentInfoBlock.tpl index c74a7339da..0296b19b29 100644 --- a/templates/CRM/Contribute/Form/PaymentInfoBlock.tpl +++ b/templates/CRM/Contribute/Form/PaymentInfoBlock.tpl @@ -27,23 +27,23 @@ {if !empty($payments)} - + {foreach from=$payments item=payment} - + {/foreach}
{ts}Amount{/ts} {ts}Type{/ts} {ts}Payment Method{/ts} {ts}Received{/ts} {ts}Transaction ID{/ts} {ts}Status{/ts}
{$payment.action} {$payment.total_amount|crmMoney:$payment.currency} {$payment.financial_type} {$payment.payment_instrument}{if $payment.check_number} (#{$payment.check_number}){/if} {$payment.receive_date|crmDate} {$payment.trxn_id} {$payment.status}{$payment.action}
diff --git a/templates/CRM/Financial/Form/PaymentEdit.tpl b/templates/CRM/Financial/Form/PaymentEdit.tpl index 957a188879..9dfc159365 100644 --- a/templates/CRM/Financial/Form/PaymentEdit.tpl +++ b/templates/CRM/Financial/Form/PaymentEdit.tpl @@ -26,16 +26,12 @@ {crmRegion name="payment-edit-block"}
- {foreach from=$paymentFields item=paymentField} - {assign var='name' value=$paymentField.name} + {foreach from=$paymentFields key=fieldName item=paymentField} + {assign var='name' value=$fieldName}
{$form.$name.label} - {if $requiredPaymentFields.$name}*{/if}
{if $name eq 'total_amount'}{$currency}  {/if}{$form.$name.html} - {if $name == 'credit_card_type'} -
- {/if}
@@ -45,3 +41,28 @@
{include file="CRM/common/formButtons.tpl" location="bottom"}
+ +{literal} + +{/literal} -- 2.25.1