[#4] (wip) Custom field mapping configuration

This commit is contained in:
Jens Schuppe 2019-08-06 13:58:32 +02:00
parent 73481fb7ed
commit b85291527d
5 changed files with 118 additions and 6 deletions

View file

@ -231,6 +231,13 @@ class CRM_Twingle_Form_Profile extends CRM_Core_Form {
array() array()
); );
$this->add(
'textarea', // field type
'custom_field_mapping', // field name
E::ts('Custom field mapping'), // field label
array()
);
$this->addButtons(array( $this->addButtons(array(
array( array(
'type' => 'submit', 'type' => 'submit',
@ -268,6 +275,67 @@ class CRM_Twingle_Form_Profile extends CRM_Core_Form {
$errors['name'] = E::ts('Only alphanumeric characters and the underscore (_) are allowed for profile names.'); $errors['name'] = E::ts('Only alphanumeric characters and the underscore (_) are allowed for profile names.');
} }
// Validate custom field mapping.
try {
$custom_field_mapping = preg_split('/\r\n|\r|\n/', $values['custom_field_mapping'], -1, PREG_SPLIT_NO_EMPTY);
if (!is_array($custom_field_mapping)) {
throw new Exception(
E::ts('Could not parse custom field mapping.')
);
}
foreach ($custom_field_mapping as $custom_field_map) {
$custom_field_map = explode("=", $custom_field_map);
if (count($custom_field_map) !== 2) {
throw new Exception(
E::ts('Could not parse custom field mapping.')
);
}
list($twingle_field_name, $custom_field_name) = $custom_field_map;
$custom_field_id = substr($custom_field_name, strlen('custom_'));
// Check for custom field existence
try {
$custom_field = civicrm_api3('CustomField', 'getsingle', array(
'id' => $custom_field_id,
));
}
catch (CiviCRM_API3_Exception $exception) {
throw new Exception(
E::ts(
'Custom field custom_%1 does not exist.',
array(1 => $custom_field_id)
)
);
}
// Only allow custom fields on relevant entities.
try {
$custom_group = civicrm_api3('CustomGroup', 'getsingle', array(
'id' => $custom_field['custom_group_id'],
'extends' => array(
'IN' => array(
'Contact',
'Individual',
'Organization',
'Contribution',
'ContributionRecur',
),
),
));
} catch (CiviCRM_API3_Exception $exception) {
throw new Exception(
E::ts(
'Custom field custom_%1 is not in a CustomGroup that extends one of the supported CiviCRM entities.',
array(1 => $custom_field['id'])
)
);
}
}
}
catch (Exception $exception) {
$errors['custom_field_mapping'] = $exception->getMessage();
}
return empty($errors) ? TRUE : $errors; return empty($errors) ? TRUE : $errors;
} }

View file

@ -76,7 +76,8 @@ class CRM_Twingle_Profile {
public function getCustomFieldMapping() { public function getCustomFieldMapping() {
$custom_field_mapping = array(); $custom_field_mapping = array();
if (!empty($custom_field_definition = $this->getAttribute('custom_field_mapping'))) { if (!empty($custom_field_definition = $this->getAttribute('custom_field_mapping'))) {
foreach (preg_split('/\r\n|\r|\n/', $custom_field_definition, -1, PREG_SPLIT_NO_EMPTY) as $twingle_field_name => $custom_field_name) { foreach (preg_split('/\r\n|\r|\n/', $custom_field_definition, -1, PREG_SPLIT_NO_EMPTY) as $custom_field_map) {
list($twingle_field_name, $custom_field_name) = explode("=", $custom_field_map);
$custom_field_mapping[$twingle_field_name] = $custom_field_name; $custom_field_mapping[$twingle_field_name] = $custom_field_name;
} }
} }

View file

@ -506,10 +506,6 @@ function civicrm_api3_twingle_donation_Submit($params) {
if (!empty($custom_fields['Contribution'])) { if (!empty($custom_fields['Contribution'])) {
$contribution_data += $custom_fields['Contribution']; $contribution_data += $custom_fields['Contribution'];
} }
// Add custom field values.
if (!empty($custom_fields['ContributionRecur'])) {
$contribution_data += $custom_fields['ContributionRecur'];
}
if (!empty($params['purpose'])) { if (!empty($params['purpose'])) {
$contribution_data['note'] = $params['purpose']; $contribution_data['note'] = $params['purpose'];
@ -564,6 +560,10 @@ function civicrm_api3_twingle_donation_Submit($params) {
) )
// ... and frequency unit and interval from a static mapping. // ... and frequency unit and interval from a static mapping.
+ CRM_Twingle_Submission::getFrequencyMapping($params['donation_rhythm']); + CRM_Twingle_Submission::getFrequencyMapping($params['donation_rhythm']);
// Add custom field values.
if (!empty($custom_fields['ContributionRecur'])) {
$mandate_data += $custom_fields['ContributionRecur'];
}
// Add cycle day for recurring contributions. // Add cycle day for recurring contributions.
if ($params['donation_rhythm'] != 'one_time') { if ($params['donation_rhythm'] != 'one_time') {
@ -595,6 +595,13 @@ function civicrm_api3_twingle_donation_Submit($params) {
'financial_type_id' => $profile->getAttribute('financial_type_id_recur'), 'financial_type_id' => $profile->getAttribute('financial_type_id_recur'),
) )
+ CRM_Twingle_Submission::getFrequencyMapping($params['donation_rhythm']); + CRM_Twingle_Submission::getFrequencyMapping($params['donation_rhythm']);
// Add custom field values.
if (!empty($custom_fields['ContributionRecur'])) {
$contribution_recur_data += $custom_fields['ContributionRecur'];
$contribution_data += $custom_fields['ContributionRecur'];
}
$contribution_recur = civicrm_api3('contributionRecur', 'create', $contribution_recur_data); $contribution_recur = civicrm_api3('contributionRecur', 'create', $contribution_recur_data);
if ($contribution_recur['is_error']) { if ($contribution_recur['is_error']) {
throw new CiviCRM_API3_Exception( throw new CiviCRM_API3_Exception(

View file

@ -27,3 +27,17 @@
{htxt id='id-financial_type_id_recur'} {htxt id='id-financial_type_id_recur'}
{ts domain="de.systopia.twingle"}Select which financial type to use for recurring contributions.{/ts} {ts domain="de.systopia.twingle"}Select which financial type to use for recurring contributions.{/ts}
{/htxt} {/htxt}
{htxt id='id-custom_field_mapping'}
{ts domain="de.systopia.twingle"}<p>Map Twingle custom fields to CiviCRM custom fields using the following format (each assignment in a separate line):</p>
<pre>twingle_field_1=custom_123<br />twingle_field_2=custom_789</pre>
<p>Always use the <code>custom_[id]</code> notation for CiviCRM custom fields.</p>
<p>Only custom fields extending one of the following CiviCRM entities are allowed:</p>
<ul>
<li><strong>Contact</strong> &ndash; Will be set on the Individual contact</li>
<li><strong>Individual</strong> &ndash; Will be set on the Individual contact</li>
<li><strong>Organization</strong> &ndash; Will be set on the Organization contact, if an organisation name was submitted</li>
<li><strong>Contribution</strong> &ndash; Will be set on the contribution</li>
<li><strong>ContributionRecur</strong> &ndash; Will be set on the recurring contribution and deriving single contributions</li>
</ul>{/ts}
{/htxt}

View file

@ -161,7 +161,7 @@
<fieldset> <fieldset>
<legend>{ts domain="de.systopia.twingle"}Groups{/ts}</legend> <legend>{ts domain="de.systopia.twingle"}Groups and Correlations{/ts}</legend>
<table class="form-layout-compressed"> <table class="form-layout-compressed">
@ -190,6 +190,28 @@
<td class="content">{$form.contribution_source.html}</td> <td class="content">{$form.contribution_source.html}</td>
</tr> </tr>
<tr class="crm-section">
<td class="label">
{$form.custom_field_mapping.label}
<a
onclick='
CRM.help(
"{ts domain="de.systopia.twingle"}Custom field mapping{/ts}",
{literal}{
"id": "id-custom_field_mapping",
"file": "CRM\/Twingle\/Form\/Profile"
}{/literal}
);
return false;
'
href="#"
title="{ts domain="de.systopia.twingle"}Help{/ts}"
class="helpicon"
></a>
</td>
<td class="content">{$form.custom_field_mapping.html}</td>
</tr>
</table> </table>
</fieldset> </fieldset>