Files
onboard/app/Services/Analytics/ReportPresetRegistry.php

139 lines
5.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Services\Analytics;
/**
* Готовые пресеты (системные шаблоны) для каталога и модалки выбора шаблона.
* Каждый пресет — это преднастроенная конфигурация конструктора.
*/
class ReportPresetRegistry
{
/**
* @return array<int,array<string,mixed>>
*/
public function all(): array
{
return [
[
'key' => 'blank',
'label' => 'Без шаблона',
'description' => 'Самостоятельно выберите источник, группировки и показатели',
'category' => 'Все',
'dataset' => null,
'thumbnail' => [],
'config' => $this->config(null),
],
[
'key' => 'by_shifts',
'label' => 'По сменам',
'description' => 'Показатели дежурных смен по датам',
'category' => 'Дежурства',
'dataset' => 'shifts',
'thumbnail' => ['Дата смены', 'Поступило', 'Выписано', 'Умерло'],
'config' => $this->config('shifts', ['shift_date'],
['shifts_count', 'recipient_plan', 'recipient_emergency', 'discharged', 'deceased'],
['metric' => 'recipient_plan', 'type' => 'bar']),
],
[
'key' => 'by_patients',
'label' => 'По пациентам',
'description' => 'Структура пациентов по срочности и исходам',
'category' => 'Пациенты',
'dataset' => 'patients',
'thumbnail' => ['Срочность', 'Исход', 'Пациентов'],
'config' => $this->config('patients', ['urgency', 'outcome'],
['patients_count', 'admitted', 'discharged', 'deceased'],
['metric' => 'patients_count', 'type' => 'donut']),
],
[
'key' => 'unwanted',
'label' => 'Нежелательные события',
'description' => 'Количество нежелательных событий по типам',
'category' => 'События',
'dataset' => 'unwanted_events',
'thumbnail' => ['Событие', 'Количество'],
'config' => $this->config('unwanted_events', ['event_title'],
['events_count'],
['metric' => 'events_count', 'type' => 'bar']),
],
[
'key' => 'nurse',
'label' => 'Журнал медсестры',
'description' => 'Пациенты журнала по исходам',
'category' => 'Журнал',
'dataset' => 'nurse_journal',
'thumbnail' => ['Исход', 'Пациентов', 'Умерло'],
'config' => $this->config('nurse_journal', ['outcome'],
['patients_count', 'admitted', 'discharged', 'deceased'],
['metric' => 'patients_count', 'type' => 'bar']),
],
[
'key' => 'department_statistics',
'label' => 'Статистика по отделениям',
'description' => 'Сводная статистика по всем отделениям (профили, ИТОГО)',
'category' => 'Сводные',
'dataset' => 'department_statistics',
'thumbnail' => ['Отделение', 'Коек', 'Поступило', 'Состоит', 'Умерло'],
'config' => $this->config('department_statistics'),
],
[
'key' => 'nurse_shifts',
'label' => 'Смены медсестры',
'description' => 'Список своих смен с показателями по пациентам',
'category' => 'Журнал',
'dataset' => 'nurse_shifts',
'thumbnail' => ['Дата смены', 'Поступило', 'Выписано', 'Умерло'],
'config' => $this->config('nurse_shifts', ['shift_date'],
['shifts_count', 'patients_count', 'admitted', 'discharged', 'deceased'],
['metric' => 'admitted', 'type' => 'bar']),
],
];
}
public function find(string $key): ?array
{
foreach ($this->all() as $preset) {
if ($preset['key'] === $key) {
return $preset;
}
}
return null;
}
/**
* @return array<int,string>
*/
public function categories(): array
{
return ['Все', ...collect($this->all())
->pluck('category')
->reject(fn ($c) => $c === 'Все')
->unique()
->values()
->all()];
}
/**
* @param array<int,string> $dimensions
* @param array<int,string> $measures
* @param array<string,string> $chart
* @return array<string,mixed>
*/
private function config(?string $dataset, array $dimensions = [], array $measures = [], array $chart = []): array
{
return [
'dataset' => $dataset,
'dimensions' => $dimensions,
'measures' => $measures,
'filters' => [],
'mode' => 'period',
'detalization' => 'month',
'chart' => [
'metric' => $chart['metric'] ?? ($measures[0] ?? null),
'type' => $chart['type'] ?? 'bar',
],
];
}
}