first commit
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace App\Support\MedicalReport;
|
||||
|
||||
use App\Models\Department;
|
||||
use App\Models\HospitalUnit;
|
||||
use App\Models\MedicalReportFormTemplate;
|
||||
|
||||
class DatabaseStructuredTemplateFactory
|
||||
{
|
||||
/**
|
||||
* @return array<string, mixed>|null
|
||||
*/
|
||||
public function templateForDepartment(string $reportDepartmentKey): ?array
|
||||
{
|
||||
$hospitalUnitId = HospitalUnit::query()
|
||||
->where('slug', $reportDepartmentKey)
|
||||
->value('id');
|
||||
|
||||
$template = MedicalReportFormTemplate::query()
|
||||
->where(function ($query) use ($hospitalUnitId, $reportDepartmentKey): void {
|
||||
if ($hospitalUnitId !== null) {
|
||||
$query->where('hospital_unit_id', $hospitalUnitId)
|
||||
->orWhere('department_key', $reportDepartmentKey);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$query->where('department_key', $reportDepartmentKey);
|
||||
})
|
||||
->where('is_active', true)
|
||||
->first();
|
||||
|
||||
if ($template === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/** @var array<string, mixed> $schema */
|
||||
$schema = $template->schema ?? [];
|
||||
|
||||
return [
|
||||
'key' => $reportDepartmentKey.'-builder-template',
|
||||
'title' => $schema['title'] ?? $template->name,
|
||||
'description' => $schema['description'] ?? $template->description ?? '',
|
||||
'department_options' => $this->departmentOptions(),
|
||||
'sections' => collect($schema['sections'] ?? [])
|
||||
->map(function (array $section) use ($schema): array {
|
||||
$fields = array_values($section['fields'] ?? []);
|
||||
$emptyEntry = collect($fields)
|
||||
->mapWithKeys(fn (array $field): array => [$field['key'] => ''])
|
||||
->all();
|
||||
$defaultEntries = array_values($section['default_entries'] ?? []);
|
||||
|
||||
return [
|
||||
'key' => (string) $section['key'],
|
||||
'title' => (string) $section['title'],
|
||||
'economist_label' => (string) ($section['economist_label'] ?? (($schema['title'] ?? 'Шаблон').' / '.($section['title'] ?? 'Секция'))),
|
||||
'fields' => $fields,
|
||||
'export_metrics' => array_values($section['export_metrics'] ?? []),
|
||||
'empty_entry' => $emptyEntry,
|
||||
'default_entries' => $defaultEntries === [] ? [$emptyEntry] : $defaultEntries,
|
||||
];
|
||||
})
|
||||
->values()
|
||||
->all(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<array{id: int, name: string}>
|
||||
*/
|
||||
private function departmentOptions(): array
|
||||
{
|
||||
return Department::query()
|
||||
->where('is_active', true)
|
||||
->orderBy('name')
|
||||
->get(['id', 'name'])
|
||||
->map(fn (Department $department): array => [
|
||||
'id' => $department->id,
|
||||
'name' => $department->name,
|
||||
])
|
||||
->all();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user