$ownerRef, 'organization_id' => $visit->organization_id, 'visit_id' => $visit->id, 'patient_id' => $visit->patient_id, 'care_unit_id' => $careUnitId ?? $visit->care_unit_id, 'note_type' => $noteType, 'shift_code' => $shiftCode, 'body' => $body, 'recorded_by' => $actorRef, 'recorded_at' => now(), ]); AuditLogger::record( $ownerRef, 'nursing_note.created', $visit->organization_id, $actorRef, NursingNote::class, $note->id, ); return $note; } /** * @return Collection */ public function notesForUnit(CareUnit $unit, string $ownerRef, int $limit = 50): Collection { return NursingNote::owned($ownerRef) ->where('care_unit_id', $unit->id) ->with(['patient', 'visit']) ->orderByDesc('recorded_at') ->limit($limit) ->get(); } /** * @return Collection */ public function notesForVisit(Visit $visit, string $ownerRef, int $limit = 50): Collection { return NursingNote::owned($ownerRef) ->where('visit_id', $visit->id) ->orderByDesc('recorded_at') ->limit($limit) ->get(); } /** * @param array $data */ public function createHandover( CareUnit $unit, string $ownerRef, ?string $actorRef, array $data, bool $complete = false, ): WardHandover { $handover = WardHandover::create([ 'owner_ref' => $ownerRef, 'organization_id' => $unit->organization_id, 'care_unit_id' => $unit->id, 'from_shift' => $data['from_shift'] ?? null, 'to_shift' => $data['to_shift'] ?? null, 'handed_over_at' => $complete ? now() : ($data['handed_over_at'] ?? null), 'handed_over_by' => $actorRef, 'received_by' => $data['received_by'] ?? null, 'situation' => $data['situation'] ?? null, 'background' => $data['background'] ?? null, 'assessment' => $data['assessment'] ?? null, 'recommendation' => $data['recommendation'] ?? null, 'patient_summaries' => $data['patient_summaries'] ?? $this->defaultPatientSummaries($unit, $ownerRef), 'status' => $complete ? WardHandover::STATUS_COMPLETED : WardHandover::STATUS_DRAFT, ]); AuditLogger::record( $ownerRef, $complete ? 'ward_handover.completed' : 'ward_handover.created', $unit->organization_id, $actorRef, WardHandover::class, $handover->id, ); return $handover; } /** * @param array $data */ public function completeHandover( WardHandover $handover, string $ownerRef, ?string $actorRef, array $data = [], ): WardHandover { $handover->update([ 'from_shift' => $data['from_shift'] ?? $handover->from_shift, 'to_shift' => $data['to_shift'] ?? $handover->to_shift, 'received_by' => $data['received_by'] ?? $handover->received_by, 'situation' => $data['situation'] ?? $handover->situation, 'background' => $data['background'] ?? $handover->background, 'assessment' => $data['assessment'] ?? $handover->assessment, 'recommendation' => $data['recommendation'] ?? $handover->recommendation, 'patient_summaries' => $data['patient_summaries'] ?? $handover->patient_summaries, 'handed_over_at' => now(), 'handed_over_by' => $actorRef ?? $handover->handed_over_by, 'status' => WardHandover::STATUS_COMPLETED, ]); AuditLogger::record( $ownerRef, 'ward_handover.completed', $handover->organization_id, $actorRef, WardHandover::class, $handover->id, ); return $handover->fresh(); } /** * @return list */ public function defaultPatientSummaries(CareUnit $unit, string $ownerRef): array { $visits = Visit::owned($ownerRef) ->where('care_unit_id', $unit->id) ->whereIn('status', [Visit::STATUS_OPEN, Visit::STATUS_IN_PROGRESS]) ->with(['patient', 'bed']) ->orderBy('placed_at') ->get(); return $visits->map(fn (Visit $visit) => [ 'visit_id' => $visit->id, 'patient_name' => $visit->patient?->fullName() ?? 'Unknown', 'bed' => $visit->bed?->label, 'note' => '', ])->all(); } }