diff --git a/config/php-di.php b/config/php-di.php index 20d691b..538bc3e 100644 --- a/config/php-di.php +++ b/config/php-di.php @@ -100,11 +100,14 @@ function ( $client ) use ( $name ) { 'display.disable-kvk-filtering' => function ( Container $container ) { return (bool) $container->make( 'zgw.settings', array( 'owc-mijn-services-disable-kvk-filtering' ) ); }, + 'display.hide-volgnummers' => function ( Container $container ) { + return (bool) $container->make( 'zgw.settings', array( 'owc-mijn-services-hide-volgnummers' ) ); + }, 'display.hide-status-steps-without-date' => function ( Container $container ) { return (bool) $container->make( 'zgw.settings', array( 'owc-mijn-services-hide-status-steps-without-date' ) ); }, - 'display.hide-volgnummers' => function ( Container $container ) { - return (bool) $container->make( 'zgw.settings', array( 'owc-mijn-services-hide-volgnummers' ) ); + 'display.filter-statussen-by-informeren' => function ( Container $container ) { + return (bool) $container->make( 'zgw.settings', array( 'owc-mijn-services-filter-statussen-by-informeren' ) ); }, /** diff --git a/languages/owc-mijn-services.pot b/languages/owc-mijn-services.pot index 0d42e56..a8ca192 100644 --- a/languages/owc-mijn-services.pot +++ b/languages/owc-mijn-services.pot @@ -167,22 +167,30 @@ msgid "Schakel deze optie in als de leverancier het filteren op KVK (eHerkenning msgstr "" #: src/Settings/OptionsPageRegistrar.php:151 -msgid "Statusstappen zonder datum verbergen" +msgid "Volgnummers verbergen" msgstr "" #: src/Settings/OptionsPageRegistrar.php:152 -msgid "Schakel deze optie in om statusstappen zonder gezette datum te verbergen in het statusoverzicht van een zaak. Dit verbergt ook nog niet bereikte (toekomstige) stappen. Standaard worden alle statusstappen getoond." +msgid "Schakel deze optie in om de volgnummers van statusstappen te verbergen in het statusoverzicht van een zaak. Standaard worden volgnummers getoond." msgstr "" #: src/Settings/OptionsPageRegistrar.php:164 -msgid "Volgnummers verbergen" +msgid "Statusstappen zonder datum verbergen" msgstr "" #: src/Settings/OptionsPageRegistrar.php:165 -msgid "Schakel deze optie in om de volgnummers van statusstappen te verbergen in het statusoverzicht van een zaak. Standaard worden volgnummers getoond." +msgid "Schakel deze optie in om de nog niet bereikte status (het eerste of laatste statustype, zonder gezette datum) te verbergen in het statusoverzicht van een zaak. Standaard wordt deze stap getoond." +msgstr "" + +#: src/Settings/OptionsPageRegistrar.php:177 +msgid "Statussen zonder informeren verbergen" +msgstr "" + +#: src/Settings/OptionsPageRegistrar.php:178 +msgid "Schakel deze optie in om statussen te verbergen waarvan het statustype 'informeren' op nee/false heeft staan. Schakel dit alleen in als de zaaksysteemleverancier dit veld betrouwbaar ondersteunt, anders kunnen alle statussen verborgen worden. Standaard worden alle statussen getoond." msgstr "" -#: src/Settings/OptionsPageRegistrar.php:186 +#: src/Settings/OptionsPageRegistrar.php:199 msgid "Selecteer een informatieobjecttype" msgstr "" diff --git a/src/Blocks/Zaak.php b/src/Blocks/Zaak.php index 3558bb1..907b352 100644 --- a/src/Blocks/Zaak.php +++ b/src/Blocks/Zaak.php @@ -9,6 +9,7 @@ use OWC\My_Services\ContainerResolver; use OWC\My_Services\Providers\BlockServiceProvider; use OWC\My_Services\Services\LoggerService; +use OWC\My_Services\Services\ZaakStatusService; use OWC\ZGW\Entities\Zaak as ZaakEntity; use OWC\ZGW\Support\ZaakIdEncoderDecoder; use WP_Block; @@ -64,12 +65,15 @@ protected function render_block( array $attributes, string $block_content, WP_Bl return owc_mijn_services_render_view( 'owc-single-zaak', array( - 'zaak' => $zaak, - 'information_objects' => $this->get_zaak_informatie_objecten( $zaak ), - 'steps' => $zaak->steps, - 'endDate' => $zaak->endDate(), - 'hide_status_steps_without_date' => ContainerResolver::make()->get( 'display.hide-status-steps-without-date' ), - 'hide_volgnummers' => ContainerResolver::make()->get( 'display.hide-volgnummers' ), + 'zaak' => $zaak, + 'information_objects' => $this->get_zaak_informatie_objecten( $zaak ), + 'steps' => ZaakStatusService::get_steps( + $zaak, + (bool) ContainerResolver::make()->get( 'display.hide-volgnummers' ), + (bool) ContainerResolver::make()->get( 'display.filter-statussen-by-informeren' ), + (bool) ContainerResolver::make()->get( 'display.hide-status-steps-without-date' ) + ), + 'endDate' => $zaak->endDate(), ) ); } diff --git a/src/Services/ZaakStatusService.php b/src/Services/ZaakStatusService.php new file mode 100644 index 0000000..884f15b --- /dev/null +++ b/src/Services/ZaakStatusService.php @@ -0,0 +1,203 @@ +> + */ + public static function get_steps( Zaak $zaak, bool $hide_volgnummers = false, bool $filter_by_informeren = false, bool $hide_status_steps_without_date = false ): array + { + $statustypen = $zaak->zaaktype?->statustypen; + $statustypen_by_url = self::map_statustypen_by_url( $statustypen ); + $statussen = self::get_sorted_relevant_statussen( $zaak, $statustypen_by_url, $filter_by_informeren ); + + $steps = array(); + + foreach ($statussen->all() as $index => $status) { + $steps[] = self::build_checked_step( $index, $status, $statustypen_by_url[ $status->getAttributeValue( 'statustype' ) ], $hide_volgnummers ); + } + + if ($hide_status_steps_without_date) { + return $steps; + } + + $open_step = $statussen->isEmpty() + ? self::build_first_statustype_step( $statustypen ) + : self::build_end_statustype_step( $statussen, $statustypen_by_url, $statustypen ); + + if (null !== $open_step) { + $steps[] = $open_step; + } + + return $steps; + } + + /** + * Maps every statustype of the 'Zaak' zaaktype by its URL, so statuses can be linked + * to their statustype without triggering a lazy fetch per status. + * + * @return array + */ + private static function map_statustypen_by_url( ?Collection $statustypen ): array + { + $by_url = array(); + + if ( ! $statustypen) { + return $by_url; + } + + foreach ($statustypen->all() as $statustype) { + $by_url[ $statustype->url ] = $statustype; + } + + return $by_url; + } + + /** + * Filters out statuses without a known statustype or date, then sorts the remainder by + * date/time. When $filter_by_informeren is enabled, statuses whose statustype has + * 'informeren' explicitly set to false are filtered out too; keep this disabled for + * suppliers that don't reliably populate this field, since it would otherwise hide + * every status. + * + * @param array $statustypen_by_url + */ + private static function get_sorted_relevant_statussen( Zaak $zaak, array $statustypen_by_url, bool $filter_by_informeren ): Collection + { + $statussen = $zaak->statussen->filter( + function ( $status ) use ( $statustypen_by_url, $filter_by_informeren ) { + $statustype = $statustypen_by_url[ $status->getAttributeValue( 'statustype' ) ] ?? null; + + if ( ! $statustype || ! $status->datumStatusGezet) { + return false; + } + + if ( ! $filter_by_informeren) { + return true; + } + + return false !== $statustype->getValue( 'informeren', true ); // Default is true so statuses are shown unless explicitly hidden. + } + ); + + return $statussen->sort( + function ( $a, $b ) { + return $a->datumStatusGezet->getTimestamp() <=> $b->datumStatusGezet->getTimestamp(); + } + ); + } + + /** + * Builds a single step for a status that has already been reached. + */ + private static function build_checked_step( int $index, Status $status, Statustype $statustype, bool $hide_volgnummers ): array + { + return array( + 'id' => 'step-' . $index, + 'title' => $statustype->getValue( 'omschrijving', '' ), + 'status' => 'checked', + 'date' => wp_date( get_option( 'date_format' ), $status->datumStatusGezet->getTimestamp() ), + 'meta' => $hide_volgnummers ? null : 'Volgnummer: ' . $statustype->volgnummer(), + ); + } + + /** + * Shows the first statustype as an open step, used when there are no statuses yet. + */ + private static function build_first_statustype_step( ?Collection $statustypen ): ?array + { + if ( ! $statustypen) { + return null; + } + + $first_statustype = $statustypen->sortByAttribute( 'volgnummer' )->first(); + + if ( ! $first_statustype) { + return null; + } + + return self::build_open_step( 'step-first', $first_statustype ); + } + + /** + * Shows the final statustype as an open step, used when the last reached status is + * not the final status yet. + * + * @param array $statustypen_by_url + */ + private static function build_end_statustype_step( Collection $statussen, array $statustypen_by_url, ?Collection $statustypen ): ?array + { + if ( ! $statustypen) { + return null; + } + + $end_status = $statussen->last(); + $last_reached_statustype = $end_status ? ( $statustypen_by_url[ $end_status->getAttributeValue( 'statustype' ) ] ?? null ) : null; + + if ($last_reached_statustype && (bool) $last_reached_statustype->getValue( 'isEindstatus', false )) { + return null; + } + + $end_statustype = $statustypen->first( + function ( $key, Statustype $statustype ) { + return (bool) $statustype->getValue( 'isEindstatus', false ) ? $statustype : null; + } + ); + + if ( ! $end_statustype) { + return null; + } + + return self::build_open_step( 'step-end', $end_statustype ); + } + + private static function build_open_step( string $id, Statustype $statustype ): array + { + return array( + 'id' => $id, + 'title' => $statustype->getValue( 'omschrijving', '' ), + 'status' => 'not-checked', + 'date' => null, + 'meta' => null, + ); + } +} diff --git a/src/Settings/OptionsPageRegistrar.php b/src/Settings/OptionsPageRegistrar.php index 4b4180b..7941214 100644 --- a/src/Settings/OptionsPageRegistrar.php +++ b/src/Settings/OptionsPageRegistrar.php @@ -146,10 +146,23 @@ public function addSettingsFields(): void ) ); + $options->add_field( + array( + 'name' => __( 'Volgnummers verbergen', 'owc-mijn-services' ), + 'desc' => __( 'Schakel deze optie in om de volgnummers van statusstappen te verbergen in het statusoverzicht van een zaak. Standaard worden volgnummers getoond.', 'owc-mijn-services' ), + 'id' => 'owc-mijn-services-hide-volgnummers', + 'type' => 'checkbox', + 'sanitization_cb' => function ( $value ) { + return $this->handle_unchecked_checkbox( $value ); + }, + 'show_on_cb' => $allowed_settings_show_on_cb, + ) + ); + $options->add_field( array( 'name' => __( 'Statusstappen zonder datum verbergen', 'owc-mijn-services' ), - 'desc' => __( 'Schakel deze optie in om statusstappen zonder gezette datum te verbergen in het statusoverzicht van een zaak. Dit verbergt ook nog niet bereikte (toekomstige) stappen. Standaard worden alle statusstappen getoond.', 'owc-mijn-services' ), + 'desc' => __( 'Schakel deze optie in om de nog niet bereikte status (het eerste of laatste statustype, zonder gezette datum) te verbergen in het statusoverzicht van een zaak. Standaard wordt deze stap getoond.', 'owc-mijn-services' ), 'id' => 'owc-mijn-services-hide-status-steps-without-date', 'type' => 'checkbox', 'sanitization_cb' => function ( $value ) { @@ -161,9 +174,9 @@ public function addSettingsFields(): void $options->add_field( array( - 'name' => __( 'Volgnummers verbergen', 'owc-mijn-services' ), - 'desc' => __( 'Schakel deze optie in om de volgnummers van statusstappen te verbergen in het statusoverzicht van een zaak. Standaard worden volgnummers getoond.', 'owc-mijn-services' ), - 'id' => 'owc-mijn-services-hide-volgnummers', + 'name' => __( 'Statussen zonder informeren verbergen', 'owc-mijn-services' ), + 'desc' => __( 'Schakel deze optie in om statussen te verbergen waarvan het statustype \'informeren\' op nee/false heeft staan. Schakel dit alleen in als de zaaksysteemleverancier dit veld betrouwbaar ondersteunt, anders kunnen alle statussen verborgen worden. Standaard worden alle statussen getoond.', 'owc-mijn-services' ), + 'id' => 'owc-mijn-services-filter-statussen-by-informeren', 'type' => 'checkbox', 'sanitization_cb' => function ( $value ) { return $this->handle_unchecked_checkbox( $value ); @@ -241,8 +254,8 @@ public static function get_allowed_settings_capability(): string if ( has_filter( 'owcms::settings/allowed_informatieobjecttypen_capability' ) ) { /** * Deprecated: use the `owcms::settings/allowed_settings_capability` filter instead, - * which now also governs the 'Statusstappen zonder datum verbergen' and - * 'Volgnummers verbergen' settings. + * which now also governs the 'Volgnummers verbergen', 'Statusstappen zonder datum + * verbergen' and 'Statussen zonder informeren verbergen' settings. * * @deprecated 0.15.0 Use `owcms::settings/allowed_settings_capability` instead. */ diff --git a/src/Views/owc-single-zaak.blade.php b/src/Views/owc-single-zaak.blade.php index c5343dd..81e2d9b 100644 --- a/src/Views/owc-single-zaak.blade.php +++ b/src/Views/owc-single-zaak.blade.php @@ -21,9 +21,7 @@ @include('partials.owc-single-zaak-status', [ 'zaak' => $zaak, - 'steps' => $steps, - 'hideStatusStepsWithoutDate' => $hide_status_steps_without_date ?? false, - 'hideVolgnummers' => $hide_volgnummers ?? false, + 'steps' => $steps ?? [], ]) @include('partials.owc-single-zaak-result', [ diff --git a/src/Views/partials/owc-single-zaak-status.blade.php b/src/Views/partials/owc-single-zaak-status.blade.php index 8b2c6e1..503e03b 100644 --- a/src/Views/partials/owc-single-zaak-status.blade.php +++ b/src/Views/partials/owc-single-zaak-status.blade.php @@ -7,65 +7,12 @@ if (!defined('ABSPATH')) { exit(); } - - $hideStatusStepsWithoutDate ??= false; - $hideVolgnummers ??= false; - - $stepsData = []; - $hasZaakStatussen = $zaak->statussen->isNotEmpty(); - $statussenByStatustype = []; - - if ($hasZaakStatussen) { - foreach ($zaak->statussen->all() as $status) { - $statustype = $status->getAttributeValue('statustype'); - - if (!isset($statussenByStatustype[$statustype])) { - $statussenByStatustype[$statustype] = $status; - } - } - } - - foreach ($steps as $step) { - $statusUpdate = null; - - if ($hasZaakStatussen) { - $statusUpdate = $statussenByStatustype[$step->url] ?? null; - $statusUpdate = is_object($statusUpdate) && $statusUpdate->datumStatusGezet ? $statusUpdate : null; - - if ($statusUpdate) { - $statusUpdate = date_i18n(get_option('date_format'), $statusUpdate->datumStatusGezet->getTimestamp()); - } elseif ($hideStatusStepsWithoutDate) { - continue; // Skip steps without a date. - } - } - - // Determine step status - if ($step->isPast()) { - $status = 'checked'; - } elseif ($step->isCurrent()) { - $status = 'checked'; - } elseif ($step->isNext()) { - $status = 'current'; - } else { - $status = 'not-checked'; - } - - $stepItem = [ - 'id' => 'step-' . $step->volgnummer, - 'title' => $step->getValue('omschrijving', ''), - 'status' => $status, - 'date' => $statusUpdate ?? null, - 'meta' => !$hideVolgnummers && ($step->isPast() || $step->isCurrent()) ? 'Volgnummer: ' . $step->volgnummer : null, - ]; - - $stepsData[] = $stepItem; - } @endphp

{{ __('Status', 'owc-mijn-services') }}

-@if ($steps->isEmpty() || $zaak?->status?->statustype?->omschrijving === 'Niet Beschikbaar') +@if (empty($steps) || $zaak?->status?->statustype?->omschrijving === 'Niet Beschikbaar')

{{ __('Er is (momenteel) geen status beschikbaar.', 'owc-mijn-services') }}

@else - @include('partials.nlds.denhaag.status', ['steps' => $stepsData]) + @include('partials.nlds.denhaag.status', ['steps' => $steps]) @endif