Files
ladill-care/app/Services/Care/Emergency/EmergencyWorkflowService.php
T
isaaccladandCursor 7989ab9184
Deploy Ladill Care / deploy (push) Successful in 34s
Ship full Emergency specialty suite on the shared shell.
Add ED visit stages, triage-driven routing, vitals, observation, disposition, reports, and print summary so Emergency matches Dentistry’s operational depth without a parallel EHR.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 17:48:57 +00:00

77 lines
2.3 KiB
PHP

<?php
namespace App\Services\Care\Emergency;
/**
* Map triage acuity / intent onto Emergency visit stages.
*/
class EmergencyWorkflowService
{
public const STAGE_ARRIVAL = 'arrival';
public const STAGE_RESUS = 'resus';
public const STAGE_TREATMENT = 'treatment';
public const STAGE_OBSERVATION = 'observation';
public const STAGE_DISPOSITION = 'disposition';
/**
* Suggested next visit stage after a triage payload is saved.
*
* @param array<string, mixed> $payload
*/
public function stageFromTriage(array $payload): string
{
$acuity = (string) ($payload['acuity'] ?? '');
$intent = strtolower((string) ($payload['disposition_intent'] ?? ''));
if (str_starts_with($acuity, '1') || str_starts_with($acuity, '2') || str_contains($intent, 'resus')) {
return self::STAGE_RESUS;
}
if (str_contains($intent, 'observation')) {
return self::STAGE_OBSERVATION;
}
if (str_contains($intent, 'discharge') || str_contains($intent, 'admit') || str_contains($intent, 'transfer')) {
return self::STAGE_TREATMENT;
}
if (str_contains($intent, 'treatment')) {
return self::STAGE_TREATMENT;
}
return self::STAGE_TREATMENT;
}
/**
* Whether a disposition payload should close the visit episode.
*
* @param array<string, mixed> $payload
*/
public function shouldCompleteVisit(array $payload): bool
{
$disposition = strtolower((string) ($payload['disposition'] ?? ''));
return $disposition !== '';
}
/**
* Default stage progression for action buttons.
*
* @return array<string, array{next: string, label: string}>
*/
public function stageFlow(): array
{
return [
self::STAGE_ARRIVAL => ['next' => self::STAGE_TREATMENT, 'label' => 'Move to treatment'],
self::STAGE_RESUS => ['next' => self::STAGE_TREATMENT, 'label' => 'Move to treatment bay'],
self::STAGE_TREATMENT => ['next' => self::STAGE_OBSERVATION, 'label' => 'Move to observation'],
self::STAGE_OBSERVATION => ['next' => self::STAGE_DISPOSITION, 'label' => 'Ready for disposition'],
self::STAGE_DISPOSITION => ['next' => self::STAGE_DISPOSITION, 'label' => 'Complete disposition'],
];
}
}