Skip to content

Commit

Permalink
Finish fixing contribute preferences & preferences form to isolate ha…
Browse files Browse the repository at this point in the history
…cks into one form
  • Loading branch information
eileenmcnaughton committed Nov 1, 2018
1 parent edb5d4a commit 017fbcd
Show file tree
Hide file tree
Showing 5 changed files with 156 additions and 145 deletions.
4 changes: 4 additions & 0 deletions CRM/Admin/Form/Preferences.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public function preProcess() {
$settings = Civi::settings();
// @todo replace this by defining all in settings.
foreach ($this->_varNames as $groupName => $settingNames) {
CRM_Core_Error::deprecatedFunctionWarning('deprecated use of preferences form. This will be removed from core soon');
foreach ($settingNames as $settingName => $options) {
$this->_config->$settingName = $settings->get($settingName);
}
Expand All @@ -107,6 +108,7 @@ public function setDefaultValues() {

$this->setDefaultsForMetadataDefinedFields();
foreach ($this->_varNames as $groupName => $settings) {
CRM_Core_Error::deprecatedFunctionWarning('deprecated use of preferences form. This will be removed from core soon');
foreach ($settings as $settingName => $settingDetails) {
$this->_defaults[$settingName] = isset($this->_config->$settingName) ? $this->_config->$settingName : CRM_Utils_Array::value('default', $settingDetails, NULL);
}
Expand All @@ -123,6 +125,7 @@ public function setDefaultValues() {
public function cbsDefaultValues(&$defaults) {

foreach ($this->_varNames as $groupName => $groupValues) {
CRM_Core_Error::deprecatedFunctionWarning('deprecated use of preferences form. This will be removed from core soon');
foreach ($groupValues as $settingName => $fieldValue) {
if ($fieldValue['html_type'] == 'checkboxes') {
if (isset($this->_config->$settingName) &&
Expand Down Expand Up @@ -150,6 +153,7 @@ public function buildQuickForm() {
parent::buildQuickForm();

if (!empty($this->_varNames)) {
CRM_Core_Error::deprecatedFunctionWarning('deprecated use of preferences form. This will be removed from core soon');
foreach ($this->_varNames as $groupName => $groupValues) {
$formName = CRM_Utils_String::titleToVar($groupName);
$this->assign('formName', $formName);
Expand Down
234 changes: 119 additions & 115 deletions CRM/Admin/Form/Preferences/Contribute.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,112 +46,127 @@ class CRM_Admin_Form_Preferences_Contribute extends CRM_Admin_Form_Preferences {
);

/**
* Process the form submission.
* Our standards for settings are to have a setting per value with defined metadata.
*
* Unfortunately the 'contribution_invoice_settings' has been added in non-compliance.
* We use this array to hack-handle.
*
* I think the best way forwards would be to covert to multiple individual settings.
*
* @var array
*/
public function preProcess() {
$config = CRM_Core_Config::singleton();
CRM_Utils_System::setTitle(ts('CiviContribute Component Settings'));
$this->_varNames = array(
CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME => array(
'invoice_prefix' => array(
'html_type' => 'text',
'title' => ts('Invoice Prefix'),
'weight' => 1,
'description' => ts('Enter prefix to be display on PDF for invoice'),
),
'credit_notes_prefix' => array(
'html_type' => 'text',
'title' => ts('Credit Notes Prefix'),
'weight' => 2,
'description' => ts('Enter prefix to be display on PDF for credit notes.'),
),
'due_date' => array(
'html_type' => 'text',
'title' => ts('Due Date'),
'weight' => 3,
),
'due_date_period' => array(
'html_type' => 'select',
'title' => ts('For transmission'),
'weight' => 4,
'description' => ts('Select the interval for due date.'),
'option_values' => array(
'select' => ts('- select -'),
'days' => ts('Days'),
'months' => ts('Months'),
'years' => ts('Years'),
),
),
'notes' => array(
'html_type' => 'wysiwyg',
'title' => ts('Notes or Standard Terms'),
'weight' => 5,
'description' => ts('Enter note or message to be displayed on PDF invoice or credit notes '),
'attributes' => array('rows' => 2, 'cols' => 40),
),
'is_email_pdf' => array(
'html_type' => 'checkbox',
'title' => ts('Automatically email invoice when user purchases online'),
'weight' => 6,
),
'tax_term' => array(
'html_type' => 'text',
'title' => ts('Tax Term'),
'weight' => 7,
),
'tax_display_settings' => array(
'html_type' => 'select',
'title' => ts('Tax Display Settings'),
'weight' => 8,
'option_values' => array(
'Do_not_show' => ts('Do not show breakdown, only show total -i.e ' .
$config->defaultCurrencySymbol . '120.00'),
'Inclusive' => ts('Show [tax term] inclusive price - i.e. ' .
$config->defaultCurrencySymbol .
'120.00 (includes [tax term] of ' .
$config->defaultCurrencySymbol . '20.00)'),
'Exclusive' => ts('Show [tax term] exclusive price - i.e. ' .
$config->defaultCurrencySymbol . '100.00 + ' .
$config->defaultCurrencySymbol . '20.00 [tax term]'),
),
),
),
);
parent::preProcess();
}
protected $invoiceSettings = [];

/**
* Build the form object.
*/
public function buildQuickForm() {
$htmlFields = array();
foreach ($this->_settings as $setting => $group) {
// @todo - remove this whole loop! The parent form does this - it's just because of the werid handling
// of $htmlFields for this form that needs to be unwound that we have it atm.
// The 'basicform' has been contaminated with processing $htlFields
// to cater to this form - probably due to the way invoicing settings were handled as
// an array not a bunch of keys.
$settingMetaData = civicrm_api3('setting', 'getfields', array('name' => $setting));
$props = $settingMetaData['values'][$setting];
if (isset($props['quick_form_type'])) {
$add = 'add' . $props['quick_form_type'];
if ($add == 'addElement') {
if (in_array($props['html_type'], array('checkbox', 'textarea'))) {
}
else {
if ($props['html_type'] == 'select') {
$functionName = CRM_Utils_Array::value('name', CRM_Utils_Array::value('pseudoconstant', $props));
if ($functionName) {
$props['option_values'] = array('' => ts('- select -')) + CRM_Contribute_PseudoConstant::$functionName();
}
}
}
}
parent::buildQuickForm();
$config = CRM_Core_Config::singleton();
$this->invoiceSettings = [
'invoice_prefix' => [
'html_type' => 'text',
'title' => ts('Invoice Prefix'),
'weight' => 1,
'description' => ts('Enter prefix to be display on PDF for invoice'),
],
'credit_notes_prefix' => [
'html_type' => 'text',
'title' => ts('Credit Notes Prefix'),
'weight' => 2,
'description' => ts('Enter prefix to be display on PDF for credit notes.'),
],
'due_date' => [
'html_type' => 'text',
'title' => ts('Due Date'),
'weight' => 3,
],
'due_date_period' => [
'html_type' => 'select',
'title' => ts('For transmission'),
'weight' => 4,
'description' => ts('Select the interval for due date.'),
'option_values' => [
'select' => ts('- select -'),
'days' => ts('Days'),
'months' => ts('Months'),
'years' => ts('Years'),
],
],
'notes' => [
'html_type' => 'wysiwyg',
'title' => ts('Notes or Standard Terms'),
'weight' => 5,
'description' => ts('Enter note or message to be displayed on PDF invoice or credit notes '),
'attributes' => ['rows' => 2, 'cols' => 40],
],
'is_email_pdf' => [
'html_type' => 'checkbox',
'title' => ts('Automatically email invoice when user purchases online'),
'weight' => 6,
'description' => ts('Should a pdf invoice be emailed automatically?'),
],
'tax_term' => [
'html_type' => 'text',
'title' => ts('Tax Term'),
'weight' => 7,
],
'tax_display_settings' => [
'html_type' => 'select',
'title' => ts('Tax Display Settings'),
'weight' => 8,
'option_values' => [
'Do_not_show' => ts('Do not show breakdown, only show total -i.e ' .
$config->defaultCurrencySymbol . '120.00'),
'Inclusive' => ts('Show [tax term] inclusive price - i.e. ' .
$config->defaultCurrencySymbol .
'120.00 (includes [tax term] of ' .
$config->defaultCurrencySymbol . '20.00)'),
'Exclusive' => ts('Show [tax term] exclusive price - i.e. ' .
$config->defaultCurrencySymbol . '100.00 + ' .
$config->defaultCurrencySymbol . '20.00 [tax term]'),
],
],
];

// @todo this is a faux metadata approach - we should be honest & add them correctly or find a way to make this
// compatible with our settings standards.
foreach ($this->invoiceSettings as $fieldName => $fieldValue) {
switch ($fieldValue['html_type']) {
case 'text':
$this->addElement('text',
$fieldName,
$fieldValue['title'],
[
'maxlength' => 64,
'size' => 32,
]
);
break;

case 'checkbox':
$this->add($fieldValue['html_type'],
$fieldName,
$fieldValue['title']
);
break;

case 'select':
$this->addElement('select',
$fieldName,
$fieldValue['title'],
$fieldValue['option_values'],
CRM_Utils_Array::value('attributes', $fieldValue)
);
break;

case 'wysiwyg':
$this->add('wysiwyg', $fieldName, $fieldValue['title'], $fieldValue['attributes']);
break;
}
$htmlFields[$setting] = ts($props['description']);
}
$this->assign('htmlFields', $htmlFields);
parent::buildQuickForm();

$this->assign('htmlFields', $this->invoiceSettings);
}

/**
Expand All @@ -160,16 +175,8 @@ public function buildQuickForm() {
* default values are retrieved from the database
*/
public function setDefaultValues() {
$defaults = Civi::settings()->get('contribution_invoice_settings');
//CRM-16691: Changes made related to settings of 'CVV'.
foreach (array('cvv_backoffice_required') as $setting) {
$defaults[$setting] = civicrm_api3('setting', 'getvalue',
array(
'name' => $setting,
'group' => CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME,
)
);
}
$defaults = parent::setDefaultValues();
$defaults = array_merge($defaults, Civi::settings()->get('contribution_invoice_settings'));
return $defaults;
}

Expand All @@ -179,10 +186,11 @@ public function setDefaultValues() {
public function postProcess() {
// store the submitted values in an array
$params = $this->controller->exportValues($this->_name);
unset($params['qfKey']);
unset($params['entryURL']);
Civi::settings()->set('contribution_invoice_settings', $params);
$invoiceParams = array_intersect_key($params, $this->invoiceSettings);
Civi::settings()->set('contribution_invoice_settings', $invoiceParams);
parent::postProcess();

// @todo - all this should be handled by defining an on change action in the metadata.
// to set default value for 'Invoices / Credit Notes' checkbox on display preferences
$values = CRM_Core_BAO_Setting::getItem("CiviCRM Preferences");
$optionValues = CRM_Core_OptionGroup::values('user_dashboard_options', FALSE, FALSE, FALSE, NULL, 'name');
Expand All @@ -206,10 +214,6 @@ public function postProcess() {
CRM_Core_DAO::VALUE_SEPARATOR;
Civi::settings()->set('user_dashboard_options', $settingName);
}
//CRM-16691: Changes made related to settings of 'CVV'.
$settings = array_intersect_key($params, array('cvv_backoffice_required' => 1));
$result = civicrm_api3('setting', 'create', $settings);
CRM_Core_Session::setStatus(ts('Your changes have been saved.'), ts('Changes Saved'), "success");
}

}
3 changes: 3 additions & 0 deletions settings/Contribute.setting.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
'group' => 'contribute',
'name' => 'cvv_backoffice_required',
'type' => 'Boolean',
'html_type' => 'radio',
'quick_form_type' => 'YesNo',
'default' => '1',
'add' => '4.1',
Expand All @@ -49,6 +50,8 @@
'help_text' => 'If set it back-office credit card transactions will required a cvv code. Leave as required unless you have a very strong reason to change',
),
'contribution_invoice_settings' => array(
// @todo our standard is to have a setting per item not to hide settings in an array with
// no useful metadata. Undo this setting.
'group_name' => 'Contribute Preferences',
'group' => 'contribute',
'name' => 'contribution_invoice_settings',
Expand Down
57 changes: 29 additions & 28 deletions templates/CRM/Admin/Form/Preferences/Contribute.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -25,40 +25,41 @@
*}
<div class="crm-block crm-form-block crm-{$formName}-block">
<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
<table class = "form-layout">
{foreach from=$htmlFields item=desc key=htmlField}
{if $form.$htmlField}
{assign var=n value=$htmlField|cat:'_description'}
<tr class="crm-preferences-form-block-{$htmlField}">
{if $form.$htmlField.html_type EQ 'checkbox'|| $form.$htmlField.html_type EQ 'checkboxes'}
<td class="label"></td>
<td>
{$form.$htmlField.html} {$form.$htmlField.label}
{if $desc}
<br /><span class="description">{$desc}</span>
{/if}
</td>
{else}
<td class="label">{$form.$htmlField.label}&nbsp;{if $htmlField eq 'acl_financial_type'}{help id="$htmlField"}{/if}</td>
<td>
{$form.$htmlField.html}
{if $desc}
<br /><span class="description">{$desc}</span>
{/if}
</td>
{/if}
</tr>
{/if}
{/foreach}
</table>
{include file="CRM/Form/basicFormFields.tpl"}

<table class="form-layout" id="invoicing_blocks">
{foreach from=$htmlFields item=fieldSpec key=htmlField}
{if $form.$htmlField}
{assign var=n value=$htmlField|cat:'_description'}
<tr class="crm-preferences-form-block-{$htmlField}">
{if $fieldSpec.html_type EQ 'checkbox'|| $fieldSpec.html_type EQ 'checkboxes'}
<td class="label"></td>
<td>
{$form.$htmlField.html} {$form.$htmlField.label}
{if $desc}
<br /><span class="description">{$fieldSpec.description}</span>
{/if}
</td>
{else}
<td class="label">{$form.$htmlField.label}&nbsp;{if $htmlField eq 'acl_financial_type'}{help id="$htmlField"}{/if}</td>
<td>
{$form.$htmlField.html}
{if $fieldSpec.description}
<br /><span class="description">{$fieldSpec.description}</span>
{/if}
</td>
{/if}
</tr>
{/if}
{/foreach}
</table>
<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
</div>

{literal}
<script type="text/javascript">
cj(document).ready(function() {
if (document.getElementById("invoicing").checked) {
if (document.getElementById("invoicing_invoicing").checked) {
cj("#invoicing_blocks").show();
}
else {
Expand All @@ -67,7 +68,7 @@
});
cj(function () {
cj("input[type=checkbox]").click(function() {
if (cj("#invoicing").is(":checked")) {
if (cj("#invoicing_invoicing").is(":checked")) {
cj("#invoicing_blocks").show();
}
else {
Expand Down
Loading

0 comments on commit 017fbcd

Please sign in to comment.