Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions config/php-di.php
Original file line number Diff line number Diff line change
Expand Up @@ -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' ) );
},

/**
Expand Down
18 changes: 13 additions & 5 deletions languages/owc-mijn-services.pot
Original file line number Diff line number Diff line change
Expand Up @@ -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 ""

Expand Down
16 changes: 10 additions & 6 deletions src/Blocks/Zaak.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(),
)
);
}
Expand Down
203 changes: 203 additions & 0 deletions src/Services/ZaakStatusService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
<?php

declare(strict_types=1);

/**
* Zaak status service.
*
* @package OWC_Mijn_Services
* @author Yard | Digital Agency
* @since NEXT
*/

namespace OWC\My_Services\Services;

/**
* Exit when accessed directly.
*/
if ( ! defined( 'ABSPATH' )) {
exit;
}

use OWC\ZGW\Entities\Status;
use OWC\ZGW\Entities\Statustype;
use OWC\ZGW\Entities\Zaak;
use OWC\ZGW\Support\Collection;

/**
* Builds the status step data of a 'Zaak', ready to be rendered by the view.
*
* A status type can occur 0, 1 or multiple times for a 'Zaak' (e.g. when a step back
* occurs), while every individual status always has exactly one status type.
*
* @since NEXT
*/
class ZaakStatusService
{
/**
* Builds the list of status steps for the given 'Zaak'.
*
* Every passed status is shown, including duplicates, sorted by date/time. When the
* last status is not the final status type, the final status type is appended as an
* open (not yet reached) step. When there are no statuses yet, the first status type
* is shown instead, also as an open step.
*
* @return array<int, array<string, mixed>>
*/
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<string, Statustype>
*/
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<string, Statustype> $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<string, Statustype> $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,
);
}
}
25 changes: 19 additions & 6 deletions src/Settings/OptionsPageRegistrar.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) {
Expand All @@ -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 );
Expand Down Expand Up @@ -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.
*/
Expand Down
4 changes: 1 addition & 3 deletions src/Views/owc-single-zaak.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -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', [
Expand Down
Loading