Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose UI support for custom fields on financial types #12501

Merged
merged 3 commits into from
Jul 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion CRM/Financial/DAO/FinancialType.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
* Generated from xml/schema/CRM/Financial/FinancialType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
* (GenCodeChecksum:237f3a0cb50c930dd33a9f957677245b)
* (GenCodeChecksum:6d85bc0675253407de19ac9226ba4478)
*/

/**
Expand Down Expand Up @@ -114,6 +114,10 @@ public static function &fields() {
'entity' => 'FinancialType',
'bao' => 'CRM_Financial_BAO_FinancialType',
'localizable' => 0,
'html' => [
'type' => 'Text',
'label' => ts("Name"),
],
'pseudoconstant' => [
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
Expand All @@ -131,6 +135,10 @@ public static function &fields() {
'entity' => 'FinancialType',
'bao' => 'CRM_Financial_BAO_FinancialType',
'localizable' => 0,
'html' => [
'type' => 'TextArea',
'label' => ts("Description"),
],
],
'is_deductible' => [
'name' => 'is_deductible',
Expand All @@ -142,6 +150,10 @@ public static function &fields() {
'entity' => 'FinancialType',
'bao' => 'CRM_Financial_BAO_FinancialType',
'localizable' => 0,
'html' => [
'type' => 'CheckBox',
'label' => ts("Tax-Deductible?"),
],
],
'is_reserved' => [
'name' => 'is_reserved',
Expand All @@ -152,6 +164,10 @@ public static function &fields() {
'entity' => 'FinancialType',
'bao' => 'CRM_Financial_BAO_FinancialType',
'localizable' => 0,
'html' => [
'type' => 'CheckBox',
'label' => ts("Reserved?"),
],
],
'is_active' => [
'name' => 'is_active',
Expand All @@ -162,6 +178,10 @@ public static function &fields() {
'entity' => 'FinancialType',
'bao' => 'CRM_Financial_BAO_FinancialType',
'localizable' => 0,
'html' => [
'type' => 'CheckBox',
'label' => ts("Enabled?"),
],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
Expand Down
136 changes: 95 additions & 41 deletions CRM/Financial/Form/FinancialType.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,22 @@
*/
class CRM_Financial_Form_FinancialType extends CRM_Contribute_Form {

use CRM_Core_Form_EntityFormTrait;

/**
* Fields for the entity to be assigned to the template.
*
* @var array
*/
protected $entityFields = [];

/**
* Deletion message to be assigned to the form.
*
* @var string
*/
protected $deleteMessage;

/**
* Set variables up before form is built.
*/
Expand All @@ -46,40 +62,67 @@ public function preProcess() {
) {
CRM_Core_Error::fatal(ts('You do not have permission to access this page.'));
}
$this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this);
parent::preProcess();
$this->setPageTitle(ts('Financial Type'));
if ($this->_id) {
$this->_title = CRM_Core_PseudoConstant::getLabel(
'CRM_Financial_BAO_FinancialType',
'financial_type',
$this->_id
);
$this->assign('aid', $this->_id);
}
}

/**
* Set entity fields to be assigned to the form.
*/
protected function setEntityFields() {
$this->entityFields = [
'name' => [
'name' => 'name',
'required' => TRUE,
],
'description' => ['name' => 'description'],
'is_deductible' => [
'name' => 'is_deductible',
'description' => ts('Are contributions of this type tax-deductible?'),
],
'is_reserved' => ['name' => 'is_reserved'],
'is_active' => ['name' => 'is_active'],
];
}

/**
* Explicitly declare the entity api name.
*/
public function getDefaultEntity() {
return 'FinancialType';
}

/**
* Set the delete message.
*
* We do this from the constructor in order to do a translation.
*/
public function setDeleteMessage() {
$this->deleteMessage = ts('WARNING: You cannot delete a financial type if it is currently used by any Contributions, Contribution Pages or Membership Types. Consider disabling this option instead.') . ts('Deleting a financial type cannot be undone.') . ts('Do you want to continue?');
}

/**
* Build the form object.
*/
public function buildQuickForm() {
parent::buildQuickForm();
$this->setPageTitle(ts('Financial Type'));

$this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this);
if ($this->_id) {
$this->_title = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_FinancialType', $this->_id, 'name');
}
self::buildQuickEntityForm();
if ($this->_action & CRM_Core_Action::DELETE) {
return;
}
$this->applyFilter('__ALL__', 'trim');
$this->add('text', 'name', ts('Name'), CRM_Core_DAO::getAttribute('CRM_Financial_DAO_FinancialType', 'name'), TRUE);

$this->add('text', 'description', ts('Description'), CRM_Core_DAO::getAttribute('CRM_Financial_DAO_FinancialType', 'description'));

$this->add('checkbox', 'is_deductible', ts('Tax-Deductible?'), CRM_Core_DAO::getAttribute('CRM_Financial_DAO_FinancialType', 'is_deductible'));
$this->add('checkbox', 'is_active', ts('Enabled?'), CRM_Core_DAO::getAttribute('CRM_Financial_DAO_FinancialType', 'is_active'));
$this->add('checkbox', 'is_reserved', ts('Reserved?'), CRM_Core_DAO::getAttribute('CRM_Financial_DAO_FinancialType', 'is_reserved'));
if ($this->_action == CRM_Core_Action::UPDATE) {
$this->assign('aid', $this->_id);
}
if ($this->_action == CRM_Core_Action::UPDATE && CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_FinancialType', $this->_id, 'is_reserved', 'vid')) {
$this->freeze(array('is_active'));
if ($this->_action == CRM_Core_Action::UPDATE && CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_FinancialType', $this->_id, 'is_reserved')) {
$this->freeze(['is_active']);
}

$this->addRule('name', ts('A financial type with this name already exists. Please select another name.'), 'objectExists',
array('CRM_Financial_DAO_FinancialType', $this->_id)
['CRM_Financial_DAO_FinancialType', $this->_id]
);
}

Expand All @@ -95,35 +138,46 @@ public function postProcess() {
CRM_Core_Session::setStatus(ts('Selected financial type has been deleted.'), ts('Record Deleted'), 'success');
}
else {
$params = $ids = array();
// store the submitted values in an array
$params = $this->exportValues();

if ($this->_action & CRM_Core_Action::UPDATE) {
$ids['financialType'] = $this->_id;
if ($this->_id) {
$params['id'] = $this->_id;
}

$financialType = CRM_Financial_BAO_FinancialType::add($params, $ids);
foreach ([
'is_active',
'is_reserved',
'is_deductible',
] as $field) {
$params[$field] = CRM_Utils_Array::value($field, $params, FALSE);
}
$financialType = civicrm_api3('FinancialType', 'create', $params);
if ($this->_action & CRM_Core_Action::UPDATE) {
$url = CRM_Utils_System::url('civicrm/admin/financial/financialType', 'reset=1&action=browse');
CRM_Core_Session::setStatus(ts('The financial type "%1" has been updated.', array(1 => $financialType->name)), ts('Saved'), 'success');
CRM_Core_Session::setStatus(ts('The financial type "%1" has been updated.', [1 => $params['name']]), ts('Saved'), 'success');
}
else {
$url = CRM_Utils_System::url('civicrm/admin/financial/financialType/accounts', 'reset=1&action=browse&aid=' . $financialType->id);
$statusArray = array(
1 => $financialType->name,
2 => $financialType->name,
3 => CRM_Utils_Array::value(0, $financialType->titles),
4 => CRM_Utils_Array::value(1, $financialType->titles),
5 => CRM_Utils_Array::value(2, $financialType->titles),
);
if (empty($financialType->titles)) {
$text = ts('Your Financial "%1" Type has been created and assigned to an existing financial account with the same title. You should review the assigned account and determine whether additional account relationships are needed.', $statusArray);
$url = CRM_Utils_System::url('civicrm/admin/financial/financialType/accounts', 'reset=1&action=browse&aid=' . $financialType['id']);

$statusArray = [
1 => $params['name'],
];
$financialAccounts = civicrm_api3('EntityFinancialAccount', 'get', [
'return' => ["financial_account_id.name"],
'entity_table' => "civicrm_financial_type",
'entity_id' => $financialType['id'],
'options' => ['sort' => "id"],
'account_relationship' => ['!=' => "Income Account is"],
]);
if (!empty($financialAccounts['values'])) {
foreach ($financialAccounts['values'] as $financialAccount) {
$statusArray[] = $financialAccount['financial_account_id.name'];
}
$text = ts('Your Financial "%1" Type has been created, along with a corresponding income account "%1". That income account, along with standard financial accounts "%2", "%3" and "%4" have been linked to the financial type. You may edit or replace those relationships here.', $statusArray);
}
else {
$text = ts('Your Financial "%1" Type has been created, along with a corresponding income account "%2". That income account, along with standard financial accounts "%3", "%4" and "%5" have been linked to the financial type. You may edit or replace those relationships here.', $statusArray);
$text = ts('Your Financial "%1" Type has been created and assigned to an existing financial account with the same title. You should review the assigned account and determine whether additional account relationships are needed.', $statusArray);
}
CRM_Core_Session::setStatus($text, ts('Saved'), 'success', array('expires' => 0));
CRM_Core_Session::setStatus($text, ts('Saved'), 'success', ['expires' => 0]);
}

$session = CRM_Core_Session::singleton();
Expand Down
49 changes: 6 additions & 43 deletions templates/CRM/Financial/Form/FinancialType.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -24,46 +24,9 @@
+--------------------------------------------------------------------+
*}
{* this template is used for adding/editing/deleting financial type *}
<div class="crm-block crm-form-block crm-financial_type-form-block">
{if $action eq 8}
<div class="messages status">
<div class="icon inform-icon"></div>
{ts}WARNING: You cannot delete a financial type if it is currently used by any Contributions, Contribution Pages or Membership Types. Consider disabling this option instead.{/ts} {ts}Deleting a financial type cannot be undone.{/ts} {ts}Do you want to continue?{/ts}
</div>
{else}
<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
<table class="form-layout-compressed">
<tr class="crm-contribution-form-block-name">
<td class="label">{$form.name.label}</td>
<td class="html-adjust">{$form.name.html}</td>
</tr>
<tr class="crm-contribution-form-block-description">
<td class="label">{$form.description.label}</td>
<td class="html-adjust">{$form.description.html}</td>
</tr>

<tr class="crm-contribution-form-block-is_deductible">
<td class="label">{$form.is_deductible.label}</td>
<td class="html-adjust">{$form.is_deductible.html}<br />
<span class="description">{ts}Are contributions of this type tax-deductible?{/ts}</span>
</td>
</tr>
<tr class="crm-contribution-form-block-is_active">
<td class="label">{$form.is_active.label}</td>
<td class="html-adjust">{$form.is_active.html}</td>
</tr>
<tr class="crm-contribution-form-block-is_reserved">
<td class="label">{$form.is_reserved.label}</td>
<td class="html-adjust">{$form.is_reserved.html}</td>
</tr>

</table>
{/if}
<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="botttom"}</div>
{if $action eq 2 or $action eq 4 } {* Update or View*}
<div class="crm-submit-buttons">
<a href="{crmURL p='civicrm/admin/financial/financialType/accounts' q="action=browse&reset=1&aid=$aid"}" class="button"><span>{ts}View or Edit Financial Accounts{/ts}</a></span>
</div>
{/if}
</div>

{include file="CRM/Core/Form/EntityForm.tpl"}
{if $action eq 2 or $action eq 4 } {* Update or View*}
<div class="crm-submit-buttons">
<a href="{crmURL p='civicrm/admin/financial/financialType/accounts' q="action=browse&reset=1&aid=$aid"}" class="button"><span>{ts}View or Edit Financial Accounts{/ts}</a></span>
</div>
{/if}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eileenmcnaughton I need a help!!

How i can place the div section for button just besides the Save and Cancel buttom? Can i use JS to move the link or will i need to CRM/Core/Form/EntityForm.tpl to include sections insertions?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems ok?

screenshot 2018-07-24 03 39 32

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When you open in a new tab the 'View or Edit Financial Accounts' button goes below of Save and Cancel

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does overriding protected function addFormButtons() { help?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

buttons look ok for me screenshot 2018-07-24 03 39 32

Copy link
Contributor Author

@pradpnayak pradpnayak Jul 23, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its a link not a button actually. When i open in a new tab(right click new tab) i can see buttons not in line. But incase of pop-up it does.

screenshot from 2018-07-23 17-26-30

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm not sure maybe @colemanw has a good idea

I guess we could have an 'inner tpl' of

  {if $action eq 8}
    <div class="messages status no-popup">
      <div class="icon inform-icon"></div>
      {$deleteMessage|escape}
    </div>
  {else}
    <table class="form-layout-compressed">
      {foreach from=$entityFields item=fieldSpec}
        {assign var=fieldName value=$fieldSpec.name}
        <tr class="crm-{$entityInClassFormat}-form-block-{$fieldName}">
          {include file="CRM/Core/Form/Field.tpl"}
        </tr>
      {/foreach}
    </table>
    {include file="CRM/common/customDataBlock.tpl"}
  {/if}

that is included from CRM/Core/Form/EntityForm.tpl - so you can just include the inner if you want ... different buttons

Loading