diff --git a/Civi/DataProcessor/Factory.php b/Civi/DataProcessor/Factory.php index d71aee2d54e9bf2f2826443fd8c9e986165fea49..8210c67d3cba368557db6ed2333dd08c850e664f 100644 --- a/Civi/DataProcessor/Factory.php +++ b/Civi/DataProcessor/Factory.php @@ -198,6 +198,7 @@ class Factory { $this->addOutputHandler('date', new Definition('Civi\DataProcessor\FieldOutputHandler\DateFieldOutputHandler'), E::ts('Date field value')); $this->addOutputHandler('date_month_segment', new Definition('Civi\DataProcessor\FieldOutputHandler\DateMonthSegmentFieldOutputHandler'), E::ts('Segment text based on a date field (Per Month)')); $this->addOutputHandler('date_range', new Definition('Civi\DataProcessor\FieldOutputHandler\DateRangeFieldOutputHandler'), E::ts('Date range value (with additional end date)')); + $this->addOutputHandler('date_range_end_midnight', new Definition('Civi\DataProcessor\FieldOutputHandler\DateRangeEndMidnightFieldOutputHandler'), E::ts('Date range end midnight')); $this->addOutputHandler('age', new Definition('Civi\DataProcessor\FieldOutputHandler\AgeFieldOutputHandler'), E::ts('Age field value')); $this->addOutputHandler('contact_has_relationship', new Definition('Civi\DataProcessor\FieldOutputHandler\ContactHasRelationshipFieldOutputHandler'), E::ts('Contact has relationship')); $this->addOutputHandler('contact_link', new Definition('Civi\DataProcessor\FieldOutputHandler\ContactLinkFieldOutputHandler'), E::ts('Link to view contact')); diff --git a/Civi/DataProcessor/FieldOutputHandler/DateRangeEndMidnightFieldOutputHandler.php b/Civi/DataProcessor/FieldOutputHandler/DateRangeEndMidnightFieldOutputHandler.php new file mode 100644 index 0000000000000000000000000000000000000000..e927cd570826b1a748cb6f1425689ac85768a7c7 --- /dev/null +++ b/Civi/DataProcessor/FieldOutputHandler/DateRangeEndMidnightFieldOutputHandler.php @@ -0,0 +1,153 @@ +<?php +/** + * @author Gerhard Weber <gerhard.weber@civiservice.de> + * @license AGPL-3.0 + */ + +namespace Civi\DataProcessor\FieldOutputHandler; + +use CRM_Dataprocessor_ExtensionUtil as E; +use Civi\DataProcessor\Source\SourceInterface; +use Civi\DataProcessor\DataSpecification\FieldSpecification; + +class DateRangeEndMidnightFieldOutputHandler extends DateFieldOutputHandler { + + /** + * Field for end date. + * + * @var FieldSpecification + */ + protected $dateStart; + + /** + * Source for end date. + * + * @var SourceInterface + */ + protected $dataSourceDateStart; + + /** + * Additional optional format used if time is not set (default time '00:00:00'). + */ + protected $formatTime = NULL; + + /** + * Initialize the processor + * + * @param String $alias + * @param String $title + * @param array $configuration + */ + public function initialize($alias, $title, $configuration) { + parent::initialize($alias, $title, $configuration); + + [$this->dataSourceDateStart, $this->dateStart] = $this->initializeField($configuration['date_start'], $configuration['date_start_datasource'], $alias . '_date_end'); + $this->formatTime = isset($configuration['format_time']) ? $configuration['format_time'] : false; + } + + /** + * Add additional configuration for start date and time format. + * + * @param \CRM_Core_Form $form + * @param array $field + */ + public function buildConfigurationForm(\CRM_Core_Form $form, $field=array()) { + parent::buildConfigurationForm($form, $field); + + // @nice-to-have get directly from form's first datasource? + $fieldSelect = \CRM_Dataprocessor_Utils_DataSourceFields::getAvailableFieldsInDataSources($field['data_processor_id'], + array($this, 'isFieldValid') + ); + $form->add('select', 'date_start', E::ts('Start date'), $fieldSelect, true, array( + 'style' => 'min-width:250px', + 'class' => 'crm-select2 huge data-processor-field-for-name', + 'placeholder' => E::ts('- select -'), + )); + + $form->add('text', 'format_time', E::ts('Time format'), array( + 'style' => 'min-width:250px', + 'class' => 'huge', + )); + + if (isset($field['configuration'])) { + $configuration = $field['configuration']; + $defaults = array(); + + if (isset($configuration['date_start']) && isset($configuration['date_start_datasource'])) { + $defaults['date_start'] = \CRM_Dataprocessor_Utils_DataSourceFields::getSelectedFieldValue($field['data_processor_id'], + $configuration['date_start_datasource'], $configuration['date_start']); + } + + if (isset($configuration['format_time'])) { + $defaults['format_time'] = $configuration['format_time']; + } + + $form->setDefaults($defaults); + } + + } + + /** + * Returns template file name for the configuration form. + * + * @return false|string + */ + public function getConfigurationTemplateFileName() { + return "CRM/Dataprocessor/Form/Field/Configuration/DateRangeEndMidnightFieldOutputHandler.tpl"; + } + + /** + * Process the submitted values and create a configuration array + * + * @param $submittedValues + * @return array + */ + public function processConfiguration($submittedValues) { + $configuration = parent::processConfiguration($submittedValues); + + [$datasource, $field] = explode('::', $submittedValues['date_start'], 2); + $configuration['date_start'] = $field; + $configuration['date_start_datasource'] = $datasource; + + $configuration['format_time'] = isset($submittedValues['format_time']) ? $submittedValues['format_time'] : false; + + return $configuration; + } + + /** + * Returns the formatted value. + * + * @param $rawRecord + * @param $formattedRecord + * + * @return \Civi\DataProcessor\FieldOutputHandler\FieldOutput + */ + public function formatField($rawRecord, $formattedRecord) { + // Get formated end date part (same as parent function but format should not include time formatting!) + $rawValue = $rawRecord[$this->inputFieldSpec->alias]; + $output = new FieldOutput($rawRecord[$this->inputFieldSpec->alias]); + if ($this->format && $rawValue) { + $date = new \DateTime($rawValue); + $format = $this->format; + + // Add time part. + if ($this->formatTime) { + $format .= ' ' . $this->formatTime; + + if (str_ends_with($rawValue, ' 23:59:00')) { + // End date has time 23:59, so we are checking the start date. + $rawValue2 = $rawRecord[$this->dateStart->alias]; + if (str_ends_with($rawValue2, ' 00:00:00')) { + // Start date has time 00:00, so we will use time 00:00 for the formatting. + $date->setTime(0, 0); + } + } + } + + $output->formattedValue = $date->format($format); + } + + return $output; + } + +} diff --git a/templates/CRM/Dataprocessor/Form/Field/Configuration/DateRangeEndMidnightFieldOutputHandler.tpl b/templates/CRM/Dataprocessor/Form/Field/Configuration/DateRangeEndMidnightFieldOutputHandler.tpl new file mode 100644 index 0000000000000000000000000000000000000000..b195153baab9b0e8138fc7d42817e186cddf2ae8 --- /dev/null +++ b/templates/CRM/Dataprocessor/Form/Field/Configuration/DateRangeEndMidnightFieldOutputHandler.tpl @@ -0,0 +1,30 @@ +{crmScope extensionKey='dataprocessor'} + {include file="CRM/Dataprocessor/Form/Field/Configuration/DateFieldOutputHandler.tpl"} + + <hr > + <div class="crm-section"> + <div class="label">{$form.date_start.label}</div> + <div class="content"> + {$form.date_start.html} + <p class="description"> + {ts}If start has default time <em>00:00:00</em> and end has time <em>23:59:00</em> output will be formatted with above date format and time format below, e.g. <em>1973-11-29 00:00</em>.{/ts} + <br> + {ts}Otherwise output will be formatted with above date format and time format below.{/ts} + <br> + {ts}Do not include time formating in above date format.{/ts} + </p> + </div> + <div class="clear"></div> + </div> + <div class="crm-section"> + <div class="label">{$form.format_time.label}</div> + <div class="content"> + {$form.format_time.html} + <p class="description"> + {ts}Time format (e.g. <em>H:i</em>). Do not include date formating.{/ts}<br /> + {ts 1='https://www.php.net/manual/en/datetime.format.php#refsect1-datetime.format-parameters'}See <a href="%1" target="_blank">DateTime format on php.net</a> for help.{/ts} + </p> + </div> + <div class="clear"></div> + </div> +{/crmScope}