diff --git a/Civi/DataProcessor/FieldOutputHandler/DateRangeFieldOutputHandler.php b/Civi/DataProcessor/FieldOutputHandler/DateRangeFieldOutputHandler.php index ab17661e2d451178a191876942e9b5f3a00e3d35..e5a8501dc7ca33b23c0380db53b0dc3a4151ecf8 100644 --- a/Civi/DataProcessor/FieldOutputHandler/DateRangeFieldOutputHandler.php +++ b/Civi/DataProcessor/FieldOutputHandler/DateRangeFieldOutputHandler.php @@ -9,6 +9,7 @@ namespace Civi\DataProcessor\FieldOutputHandler; use CRM_Dataprocessor_ExtensionUtil as E; use Civi\DataProcessor\Source\SourceInterface; use Civi\DataProcessor\DataSpecification\FieldSpecification; +use DateTime; class DateRangeFieldOutputHandler extends DateFieldOutputHandler { @@ -36,6 +37,8 @@ class DateRangeFieldOutputHandler extends DateFieldOutputHandler { */ protected $separator; + protected bool $omitEndDate = FALSE; + /** * Initialize the processor * @@ -49,6 +52,8 @@ class DateRangeFieldOutputHandler extends DateFieldOutputHandler { [$this->dataSourceDateEnd, $this->dateEnd] = $this->initializeField($configuration['date_end'], $configuration['date_end_datasource'], $alias . '_date_end'); $this->formatDateOnly = isset($configuration['format_date_only']) ? $configuration['format_date_only'] : false; $this->separator = isset($configuration['separator']) ? $configuration['separator'] : false; + + $this->omitEndDate = isset($configuration['omit_end_date_when_same_day']) ? $configuration['omit_end_date_when_same_day'] : FALSE; } /** @@ -70,6 +75,8 @@ class DateRangeFieldOutputHandler extends DateFieldOutputHandler { 'placeholder' => E::ts('- select -'), )); + $form->add('checkbox', 'omit_end_date_when_same_day', E::ts('Hide end date when same day')); + $form->add('text', 'format_date_only', E::ts('Format date only'), array( 'style' => 'min-width:250px', 'class' => 'huge', @@ -96,6 +103,10 @@ class DateRangeFieldOutputHandler extends DateFieldOutputHandler { } } + if (isset($configuration['omit_end_date_when_same_day'])) { + $defaults['omit_end_date_when_same_day'] = $configuration['omit_end_date_when_same_day']; + } + $form->setDefaults($defaults); } @@ -123,6 +134,8 @@ class DateRangeFieldOutputHandler extends DateFieldOutputHandler { $configuration['date_end'] = $field; $configuration['date_end_datasource'] = $datasource; + $configuration['omit_end_date_when_same_day'] = isset($submittedValues['omit_end_date_when_same_day']) ? $submittedValues['omit_end_date_when_same_day'] : FALSE; + foreach (array('separator', 'format_date_only') as $key) { $configuration[$key] = isset($submittedValues[$key]) ? $submittedValues[$key] : false; } @@ -140,21 +153,52 @@ class DateRangeFieldOutputHandler extends DateFieldOutputHandler { */ public function formatField($rawRecord, $formattedRecord) { $output = new FieldOutput($rawRecord[$this->inputFieldSpec->alias]); + $rawValue = $rawRecord[$this->inputFieldSpec->alias]; if (($this->format || $this->formatDateOnly) && $rawValue) { $output->formattedValue = $this->formatHelper($rawValue); } $output2 = new FieldOutput($rawRecord[$this->dateEnd->alias]); + $rawValue2 = $rawRecord[$this->dateEnd->alias]; if ($rawValue2) { if ($this->format || $this->formatDateOnly) { $output2->formattedValue = $this->formatHelper($rawValue2); } - if ($this->separator) { - $output->formattedValue .= $this->separator; + + $isSameDay = FALSE; + if ($this->omitEndDate && isset($output->rawValue)) { + $startDate = new DateTime($output->rawValue); + $startDay = $startDate->format('Y-m-d'); + + $endDate = new DateTime($rawValue2); + $endDay = $endDate->format('Y-m-d'); + + if ($startDay === $endDay) { + $isSameDay = TRUE; + } + } + if ($isSameDay) { + if ($this->formatDateOnly && str_ends_with($rawValue2, ' 00:00:00')) { + return $output; + } + + // time separator + if ($this->separator) { + $output->formattedValue .= $this->separator; + } + + $onlyTime = preg_replace('#.+(\d{2}:\d{2})([ A-Za-z]*)$#', '$1$2', $output2->formattedValue); + $output->formattedValue .= $onlyTime; + } + else { + if ($this->separator) { + $output->formattedValue .= $this->separator; + } + + $output->formattedValue .= $output2->formattedValue; } - $output->formattedValue .= $output2->formattedValue; } return $output; @@ -173,7 +217,7 @@ class DateRangeFieldOutputHandler extends DateFieldOutputHandler { * @throws \Exception */ protected function formatHelper($raw_value) { - $date = new \DateTime($raw_value); + $date = new DateTime($raw_value); if ($this->formatDateOnly && str_ends_with($raw_value, ' 00:00:00')) { $format = $this->formatDateOnly; } diff --git a/templates/CRM/Dataprocessor/Form/Field/Configuration/DateRangeFieldOutputHandler.tpl b/templates/CRM/Dataprocessor/Form/Field/Configuration/DateRangeFieldOutputHandler.tpl index b289600bcb66ff968107609596fba2bbba65e4c2..781ae05dd86aa4bc1b22274105458615129ac0b0 100644 --- a/templates/CRM/Dataprocessor/Form/Field/Configuration/DateRangeFieldOutputHandler.tpl +++ b/templates/CRM/Dataprocessor/Form/Field/Configuration/DateRangeFieldOutputHandler.tpl @@ -17,6 +17,11 @@ </div> <div class="clear"></div> </div> + <div class="crm-section"> + <div class="label">{$form.omit_end_date_when_same_day.label}</div> + <div class="content">{$form.omit_end_date_when_same_day.html}</div> + <div class="clear"></div> + </div> <hr > <div class="crm-section"> <div class="label">{$form.format_date_only.label}</div>