Commit 8ce39eb9 authored by Monish Deb's avatar Monish Deb

Fix 'Find Grant' search form and other refactoring changes

parent 469da524
......@@ -36,7 +36,9 @@
class CRM_Grant_BAO_GrantPayment extends CRM_Grant_DAO_GrantPayment {
const
STOP = 1,
REPRINT = 2;
/**
* static field for all the grant information that we can potentially export
* @var array
......@@ -93,7 +95,7 @@ class CRM_Grant_BAO_GrantPayment extends CRM_Grant_DAO_GrantPayment {
'data_type' => CRM_Utils_Type::T_INT
),
'payment_number' => array(
'title' => 'Payment Number',
'title' => 'Check Number',
'name' => 'payment_number',
'data_type' => CRM_Utils_Type::T_INT
),
......@@ -170,26 +172,19 @@ class CRM_Grant_BAO_GrantPayment extends CRM_Grant_DAO_GrantPayment {
* @static
* @return object
*/
static function add(&$params, &$ids) {
static function add(&$params, &$ids = []) {
if (empty($params)) {
return;
}
if (isset( $params['total_amount'])) {
if (isset($params['total_amount'])) {
$params[$field] = CRM_Utils_Rule::cleanMoney($params['total_amount']);
}
// convert dates to mysql format
$dates = array(
'payment_date',
'payment_created_date'
);
foreach ($dates as $date) {
if (isset($params[$date])) {
$params[$date] = CRM_Utils_Date::processDate($params[$date], NULL, TRUE);
}
if (isset($params['payment_created_date'])) {
$params['payment_created_date'] = CRM_Utils_Date::processDate($params['payment_created_date'], NULL, TRUE);
}
$grantPayment = new CRM_Grant_DAO_GrantPayment();
$grantPayment->id = CRM_Utils_Array::value('id', $ids);
......@@ -321,9 +316,7 @@ class CRM_Grant_BAO_GrantPayment extends CRM_Grant_DAO_GrantPayment {
$grantDao->fetch();
if (!$grantDao->N) {
if ($params['messageTemplateID']) {
CRM_Core_Error::fatal(ts('No such message template.'));
}
CRM_Core_Error::fatal(ts('No such message template.'));
}
$subject = $grantDao->subject;
$html = $grantDao->html;
......
......@@ -309,14 +309,12 @@ WHERE civicrm_contact.id = $id ";
if (CRM_Utils_Array::value('is_auto_email', $values)) {
list($displayName, $email) = CRM_Contact_BAO_Contact_Location::getEmailDetails($contactID);
if (isset($email)) {
$grantStatuses = CRM_Core_OptionGroup::values('grant_status', FALSE, FALSE, FALSE, NULL, 'name');
$grantStatuses = $grantStatuses[$values['status_id']];
$valueName = strtolower($grantStatuses);
if ($grantStatuses == 'Awaiting Information') {
$explode = explode(' ', $grantStatuses);
$valueName = strtolower($grantStatus);
if ($grantStatus == 'Awaiting Information') {
$explode = explode(' ', $grantStatuse);
$valueName = strtolower($explode[0]) . '_info';
}
elseif (strstr($grantStatuses, 'Approved')) {
elseif (strstr($grantStatus, 'Approved')) {
$valueName = strtolower('Approved');
}
$sendTemplateParams = array(
......@@ -451,4 +449,121 @@ WHERE civicrm_contact.id = $id ";
);
CRM_Activity_BAO_Activity::create($params);
}
public static function getAssetFinancialAccountID() {
$relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('financial_account_type', NULL, " AND v.name LIKE 'Asset' "));
return CRM_Core_DAO::singleValueQuery(
"SELECT id FROM civicrm_financial_account WHERE is_default = 1 AND financial_account_type_id = %1",
[1 => [$relationTypeId, 'Integer']]
);
}
public static function convertNumberToWords($number) {
$hyphen = '-';
$conjunction = ' and ';
$separator = ', ';
$negative = 'negative ';
$decimal = ' and ';
$dictionary = array(
0 => 'zero',
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six',
7 => 'seven',
8 => 'eight',
9 => 'nine',
10 => 'ten',
11 => 'eleven',
12 => 'twelve',
13 => 'thirteen',
14 => 'fourteen',
15 => 'fifteen',
16 => 'sixteen',
17 => 'seventeen',
18 => 'eighteen',
19 => 'nineteen',
20 => 'twenty',
30 => 'thirty',
40 => 'fourty',
50 => 'fifty',
60 => 'sixty',
70 => 'seventy',
80 => 'eighty',
90 => 'ninety',
100 => 'hundred',
1000 => 'thousand',
1000000 => 'million',
1000000000 => 'billion',
1000000000000 => 'trillion',
1000000000000000 => 'quadrillion',
1000000000000000000 => 'quintillion'
);
if (!is_numeric($number)) {
return FALSE;
}
if (($number >= 0 && (int) $number < 0) || (int) $number < 0 - PHP_INT_MAX) {
// overflow
trigger_error(
'convertNumberToWords only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX,
E_USER_WARNING
);
return FALSE;
}
if ($number < 0) {
return $negative . self::convertNumberToWords(abs($number));
}
$string = $fraction = NULL;
if (strpos($number, '.') !== FALSE) {
list($number, $fraction) = explode('.', $number);
}
switch (TRUE) {
case $number < 21:
$string = $dictionary[$number];
break;
case $number < 100:
$tens = ((int) ($number / 10)) * 10;
$units = $number % 10;
$string = $dictionary[$tens];
if ($units) {
$string .= $hyphen . $dictionary[$units];
}
break;
case $number < 1000:
$hundreds = $number / 100;
$remainder = $number % 100;
$string = $dictionary[$hundreds] . ' ' . $dictionary[100];
if ($remainder) {
$string .= $conjunction . self::convertNumberToWords(abs($remainder));
}
break;
default:
$baseUnit = pow(1000, floor(log($number, 1000)));
$numBaseUnits = (int) ($number / $baseUnit);
$remainder = $number % $baseUnit;
$string = self::convertNumberToWords($numBaseUnits) . ' ' . $dictionary[$baseUnit];
if ($remainder) {
$string .= $remainder < 100 ? $conjunction : $separator;
$string .= self::convertNumberToWords($remainder);
}
break;
}
if (NULL !== $fraction && is_numeric($fraction)) {
$string .= $decimal;
$string .= $fraction . '/100';
}
return $string;
}
}
This diff is collapsed.
......@@ -86,30 +86,7 @@ class CRM_Grant_DAO_GrantPayment extends CRM_Core_DAO
* @var int unsigned
*/
public $id;
/**
* Payment Batch Nnumber
*
* @var int unsigned
*/
public $payment_batch_number;
/**
* Payment Number
*
* @var int unsigned
*/
public $payment_number;
/**
* Financial Type ID
*
* @var int unsigned
*/
public $financial_type_id;
/**
* Contact ID
*
* @var int unsigned
*/
public $contact_id;
public $financial_trxn_id;
/**
* Payment Created Date.
*
......@@ -122,35 +99,6 @@ class CRM_Grant_DAO_GrantPayment extends CRM_Core_DAO
* @var date
*/
public $payment_date;
/**
* Payable To Name.
*
* @var string
*/
public $payable_to_name;
/**
* Payable To Address.
*
* @var string
*/
public $payable_to_address;
/**
* Requested grant amount, in default currency.
*
* @var float
*/
public $amount;
/**
* 3 character string, value from config setting or input via user.
*
* @var string
*/
public $currency;
/**
* Payment Reason.
*
* @var string
*/
public $payment_reason;
/**
* Payment Status ID
......@@ -196,46 +144,13 @@ class CRM_Grant_DAO_GrantPayment extends CRM_Core_DAO
'dataPattern' => '',
'export' => true,
) ,
'payment_batch_number' => array(
'name' => 'payment_batch_number',
'financial_trxn_id' => array(
'name' => 'financial_trxn_id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Payment Batch Nnumber') ,
'title' => ts('Financial Trxn ID') ,
'required' => true,
'import' => true,
'where' => 'civicrm_payment.payment_batch_number',
'headerPattern' => '',
'dataPattern' => '',
'export' => true,
) ,
'payment_number' => array(
'name' => 'payment_number',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Payment Number') ,
'required' => true,
'import' => true,
'where' => 'civicrm_payment.payment_number',
'headerPattern' => '',
'dataPattern' => '',
'export' => true,
) ,
'financial_type_id' => array(
'name' => 'financial_type_id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Financial Type ID') ,
'required' => true,
'import' => true,
'where' => 'civicrm_payment.financial_type_id',
'headerPattern' => '',
'dataPattern' => '',
'export' => true,
) ,
'contact_id' => array(
'name' => 'contact_id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Contact ID') ,
'required' => true,
'import' => true,
'where' => 'civicrm_payment.contact_id',
'where' => 'civicrm_payment.financial_trxn_id',
'headerPattern' => '',
'dataPattern' => '',
'export' => true,
......@@ -250,63 +165,6 @@ class CRM_Grant_DAO_GrantPayment extends CRM_Core_DAO
'dataPattern' => '',
'export' => true,
) ,
'payment_date' => array(
'name' => 'payment_date',
'type' => CRM_Utils_Type::T_DATE,
'title' => ts('Payment Date') ,
'import' => true,
'where' => 'civicrm_payment.payment_date',
'headerPattern' => '',
'dataPattern' => '',
'export' => true,
) ,
'payable_to_name' => array(
'name' => 'payable_to_name',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Payable To Name') ,
'maxlength' => 255,
'size' => CRM_Utils_Type::HUGE,
'import' => true,
'where' => 'civicrm_payment.payable_to_name',
'headerPattern' => '',
'dataPattern' => '',
'export' => true,
) ,
'payable_to_address' => array(
'name' => 'payable_to_address',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Payable To Address') ,
'maxlength' => 255,
'size' => CRM_Utils_Type::HUGE,
'import' => true,
'where' => 'civicrm_payment.payable_to_address',
'headerPattern' => '',
'dataPattern' => '',
'export' => true,
) ,
'amount' => array(
'name' => 'amount',
'type' => CRM_Utils_Type::T_MONEY,
'title' => ts('Amount') ,
'required' => true,
'import' => true,
'where' => 'civicrm_payment.amount',
'headerPattern' => '',
'dataPattern' => '/^\d+(\.\d{2})?$/',
'export' => true,
) ,
'currency' => array(
'name' => 'currency',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Currency') ,
'maxlength' => 3,
'size' => CRM_Utils_Type::FOUR,
'import' => true,
'where' => 'civicrm_payment.currency',
'headerPattern' => '/cur(rency)?/i',
'dataPattern' => '/^[A-Z]{3}$/i',
'export' => true,
) ,
'payment_reason' => array(
'name' => 'payment_reason',
'type' => CRM_Utils_Type::T_STRING,
......@@ -323,6 +181,9 @@ class CRM_Grant_DAO_GrantPayment extends CRM_Core_DAO
'name' => 'payment_status_id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Payment Status') ,
'pseudoconstant' => [
'optionGroupName' => 'grant_payment_status',
]
) ,
'replaces_payment_id' => array(
'name' => 'replaces_payment_id',
......
......@@ -38,14 +38,12 @@
* This class generates form components for Payments
*
*/
class CRM_Grant_Form_Task_GrantPayment extends CRM_Core_Form
{
class CRM_Grant_Form_Task_GrantPayment extends CRM_Core_Form {
protected $_id = null;
protected $_fields = null;
function preProcess( ) {
parent::preProcess( );
$this->_action = CRM_Utils_Request::retrieve('action', 'String', $this );
function preProcess() {
$this->_action = CRM_Utils_Request::retrieve('action', 'String', $this );
$this->_prid = CRM_Utils_Request::retrieve('prid', 'Positive', $this );
if ( $this->_prid ) {
$session = CRM_Core_Session::singleton();
......@@ -54,104 +52,308 @@ class CRM_Grant_Form_Task_GrantPayment extends CRM_Core_Form
}
}
function setDefaultValues( )
{
$defaults = array();
$paymentNumbers = CRM_Grant_BAO_GrantPayment::getMaxPayementBatchNumber( );
$defaults['payment_date'] = strftime("%m/%d/%Y", strtotime( date('Y/m/d') ));
$defaults['payment_number'] = $paymentNumbers['payment_number'] + 1;
$defaults['payment_batch_number'] = $paymentNumbers['payment_batch_number'] + 1;
return $defaults;
/**
* Get payment fields
*/
public function getPaymentFields() {
return array(
'check_number' => array(
'is_required' => TRUE,
'add_field' => TRUE,
),
'trxn_id' => array(
'add_field' => TRUE,
'is_required' => FALSE,
),
'description' => array(
'htmlType' => 'textarea',
'name' => 'description',
'title' => ts('Payment reason'),
'is_required' => FALSE,
'attributes' => [],
),
'trxn_date' => array(
'htmlType' => 'datepicker',
'name' => 'trxn_date',
'title' => ts('Payment date to appear on cheques'),
'is_required' => TRUE,
'attributes' => array(
'date' => 'yyyy-mm-dd',
'time' => 24,
'context' => 'create',
'action' => 'create',
),
),
'contribution_batch_id' => [
'htmlType' => 'select',
'name' => 'contribution_batch_id',
'title' => ts('Assign to Batch'),
'attributes' => ['' => ts('None')] + CRM_Contribute_PseudoConstant::batch(),
'is_required' => TRUE,
],
);
}
/**
* Function to build the form
*
* @return None
* @access public
*/
public function buildQuickForm( $check = false )
{
parent::buildQuickForm( );
if ( $this->_action & CRM_Core_Action::DELETE ) {
$this->addButtons( array(
array ( 'type' => 'next',
'name' => ts('Delete'),
'isDefault' => true ),
array ( 'type' => 'cancel',
'name' => ts('Cancel') ),
)
);
public function buildQuickForm(){
if ($this->_action & CRM_Core_Action::DELETE) {
$this->addButtons([
[
'type' => 'next',
'name' => ts('Delete'),
'isDefault' => TRUE,
],
[
'type' => 'cancel',
'name' => ts('Cancel'),
],
]);
return;
}
$this->applyFilter('__ALL__','trim');
$attributes = CRM_Core_DAO::getAttribute( 'CRM_Grant_DAO_GrantProgram' );
$paymentFields = $this->getPaymentFields();
$this->assign('paymentFields', $paymentFields);
foreach ($paymentFields as $name => $paymentField) {
if (!empty($paymentField['add_field'])) {
$attributes = array(
'entity' => 'FinancialTrxn',
'name' => $name,
'context' => 'create',
'action' => 'create',
);
$this->addField($name, $attributes, $paymentField['is_required']);
}
else {
$this->add($paymentField['htmlType'],
$name,
$paymentField['title'],
$paymentField['attributes'],
$paymentField['is_required']
);
}
}
$this->_contributionTypes = CRM_Grant_BAO_GrantProgram::contributionTypes();
$this->add('select', 'financial_type_id', ts( 'From account' ),
array( '' => ts( '- select -' ) ) + $this->_contributionTypes , true);
$buttonName = $this->_prid ? 'Reprint Checks and CSV Export' : 'Create Checks and CSV Export';
$this->addButtons([
[
'type' => 'upload',
'name' => ts($buttonName),
'isDefault' => TRUE,
],
[
'type' => 'cancel',
'name' => ts('Cancel'),
],
]);
}
$this->add( 'text', 'payment_batch_number', ts( 'Payment Batch number' ),
$attributes['label'], true );
public function postProcess() {
$values = $this->controller->exportValues($this->_name);
$approvedGrants = $this->get('approvedGrants');
$approvedGrantIDs = array_keys($approvedGrants);
$grantPrograms = CRM_Grant_BAO_GrantProgram::getGrantPrograms();
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$financialItemStatus = CRM_Core_PseudoConstant::accountOptionValues('financial_item_status');
$checkID = CRM_Core_PseudoConstant::getKey('CRM_Contribute_DAO_Contribution', 'payment_instrument_id', 'Check');
$mailParams = $printedRows = $files = [];
$totalAmount = $counter = 0;
$maxLimit = CRM_Utils_Array::value('Maximum number of checks per pdf file', CRM_Core_OptionGroup::values('grant_thresholds', TRUE));
$config = CRM_Core_Config::singleton();
$entityFileDAO = new CRM_Core_DAO_EntityFile();
$this->add( 'text', 'payment_number', ts( 'Starting cheque number' ),
$attributes['label'], true );
$dao = CRM_Core_DAO::executeQuery(sprintf("
SELECT ft.id as ft_id, g.id as grant_id, fi.id as fi_id, g.financial_type_id, ft.to_financial_account_id, fi.currency, gp.is_auto_email, ft.total_amount, fi.contact_id, g.grant_program_id
FROM civicrm_entity_financial_trxn eft
INNER JOIN civicrm_financial_trxn ft ON ft.id = eft.financial_trxn_id AND eft.entity_table = 'civicrm_grant'
INNER JOIN civicrm_grant g ON g.id = eft.entity_id
INNER JOIN civicrm_entity_financial_trxn eft1 ON eft1.financial_trxn_id = ft.id AND eft1.entity_table = 'civicrm_financial_item'
INNER JOIN civicrm_financial_item fi ON fi.id = eft1.entity_id
INNER JOIN civicrm_grant_program gp ON gp.id = g.grant_program_id
WHERE g.id IN (%s) GROUP BY ft.id ", implode(', ', $approvedGrantIDs)));
while($dao->fetch()) {
$totalAmount += $dao->total_amount;
$grantID = $dao->grant_id;
$financialTrxnParams = [
'from_financial_account_id' => $dao->to_financial_account_id,
'to_financial_account_id' => CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($dao->financial_type_id, 'Asset Account is') ?: CRM_Grant_BAO_GrantProgram::getAssetFinancialAccountID(),
'trxn_date' => CRM_Utils_Array::value('trxn_date', $values, date('YmdHis')),
'trxn_id' => CRM_Utils_Array::value('trxn_id', $values),
'total_amount' => $dao->total_amount,
'currency' => $dao->currency,
'check_number' => $values['check_number'],
'payment_instrument_id' => $checkID,
'status_id' => array_search('Completed', $contributionStatuses),
'entity_table' => 'civicrm_grant',
'entity_id' => $grantID,
];
$trxnID = civicrm_api3('FinancialTrxn', 'create', $financialTrxnParams)['id'];
$description = CRM_Utils_Array::value('description', $values, $grantPrograms[$dao->grant_program_id]);
$financialParams = ['description' => $description, 'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Financial_BAO_FinancialItem', 'status_id', 'Paid'), 'amount' => $dao->total_amount];
$ids = ['id' => $dao->fi_id];
$trxnIDs = ['id' => $trxnID];
CRM_Financial_BAO_FinancialItem::create($financialParams, $ids, $trxnIDs);
civicrm_api3('EntityBatch', 'create', [
'entity_table' => 'civicrm_financial_trxn',
'entity_id' => $trxnID,
'batch_id' => $values['contribution_batch_id'],
]);
if ($dao->is_auto_email) {
$mailParams = [
'is_auto_email' => TRUE,
'amount_total' => $dao->total_amount,
'grant_type_id' => $approvedGrants[$grantID]['grant_type_id'],
'grant_program_id' => $approvedGrants[$grantID]['grant_program_id'],