authorizeAbility($request, 'prescriptions.view'); $organization = $this->organization($request); $branchScope = app(OrganizationResolver::class)->branchScope($this->member($request)); $prescriptions = $this->prescriptions->list( $this->ownerRef($request), $organization->id, $request->only(['status', 'patient_id']), $branchScope, ); return view('care.prescriptions.index', [ 'organization' => $organization, 'prescriptions' => $prescriptions, 'statuses' => config('care.prescription_statuses'), ]); } public function queue(Request $request): View { $this->authorizeAbility($request, 'prescriptions.view'); $organization = $this->organization($request); $queue = $this->prescriptions->pharmacyQueue($this->ownerRef($request), $organization->id); $drugs = \App\Models\Drug::owned($this->ownerRef($request)) ->where('organization_id', $organization->id) ->where('is_active', true) ->with(['batches' => fn ($q) => $q->where('quantity_on_hand', '>', 0)->orderBy('expiry_date')]) ->orderBy('name') ->get(); $canDispense = app(\App\Services\Care\CarePermissions::class) ->can($this->member($request), 'prescriptions.dispense'); return view('care.prescriptions.queue', [ 'organization' => $organization, 'queue' => $queue, 'drugs' => $drugs, 'canDispense' => $canDispense, ]); } public function create(Request $request, Consultation $consultation): View { $this->authorizeAbility($request, 'prescriptions.manage'); $this->authorizeConsultation($request, $consultation); $consultation->load(['patient', 'practitioner']); $practitioners = Practitioner::owned($this->ownerRef($request)) ->where('organization_id', $this->organization($request)->id) ->where('is_active', true) ->orderBy('name') ->get(); return view('care.prescriptions.create', [ 'consultation' => $consultation, 'practitioners' => $practitioners, 'routes' => config('care.medication_routes'), ]); } public function store(Request $request, Consultation $consultation): RedirectResponse { $this->authorizeAbility($request, 'prescriptions.manage'); $this->authorizeConsultation($request, $consultation); $prescription = $this->prescriptions->createFromConsultation( $consultation, $this->ownerRef($request), $this->validatedPrescriptionData($request), $this->ownerRef($request), ); return redirect()->route('care.prescriptions.show', $prescription) ->with('success', 'Prescription created.'); } public function show(Request $request, Prescription $prescription): View { $this->authorizeAbility($request, 'prescriptions.view'); $this->authorizePrescription($request, $prescription); $prescription->load(['patient', 'practitioner', 'items', 'consultation', 'visit']); $canManage = app(\App\Services\Care\CarePermissions::class) ->can($this->member($request), 'prescriptions.manage'); $canDispense = app(\App\Services\Care\CarePermissions::class) ->can($this->member($request), 'prescriptions.dispense'); return view('care.prescriptions.show', [ 'prescription' => $prescription, 'statuses' => config('care.prescription_statuses'), 'routes' => config('care.medication_routes'), 'canManage' => $canManage, 'canDispense' => $canDispense, ]); } public function activate(Request $request, Prescription $prescription): RedirectResponse { $this->authorizeAbility($request, 'prescriptions.manage'); $this->authorizePrescription($request, $prescription); $this->prescriptions->activate($prescription, $this->ownerRef($request), $this->ownerRef($request)); return back()->with('success', 'Prescription activated.'); } public function dispense(Request $request, Prescription $prescription): RedirectResponse { $this->authorizeAbility($request, 'prescriptions.dispense'); $this->authorizePrescription($request, $prescription); $allocations = $request->input('allocations', []); if (! empty($allocations)) { $this->pharmacy->dispensePrescription( $prescription, $this->ownerRef($request), $allocations, $this->ownerRef($request), ); } else { $this->prescriptions->dispense($prescription, $this->ownerRef($request), $this->ownerRef($request)); } return redirect()->route('care.prescriptions.queue') ->with('success', 'Prescription dispensed.'); } public function cancel(Request $request, Prescription $prescription): RedirectResponse { $this->authorizeAbility($request, 'prescriptions.manage'); $this->authorizePrescription($request, $prescription); $this->prescriptions->cancel($prescription, $this->ownerRef($request), $this->ownerRef($request)); return back()->with('success', 'Prescription cancelled.'); } protected function authorizeConsultation(Request $request, Consultation $consultation): void { $this->authorizeOwner($request, $consultation); $consultation->loadMissing('visit'); abort_unless($consultation->visit->organization_id === $this->organization($request)->id, 404); } protected function authorizePrescription(Request $request, Prescription $prescription): void { $this->authorizeOwner($request, $prescription); abort_unless($prescription->organization_id === $this->organization($request)->id, 404); $branchId = app(OrganizationResolver::class)->branchScope($this->member($request)); if ($branchId !== null) { $prescription->loadMissing('visit'); abort_unless($prescription->visit->branch_id === $branchId, 404); } } /** * @return array */ protected function validatedPrescriptionData(Request $request): array { return $request->validate([ 'practitioner_id' => ['nullable', 'integer', 'exists:care_practitioners,id'], 'notes' => ['nullable', 'string', 'max:5000'], 'activate' => ['nullable', 'boolean'], 'items' => ['required', 'array', 'min:1'], 'items.*.is_procedure' => ['nullable', 'boolean'], 'items.*.name' => ['required', 'string', 'max:255'], 'items.*.dosage' => ['nullable', 'string', 'max:100'], 'items.*.frequency' => ['nullable', 'string', 'max:100'], 'items.*.duration' => ['nullable', 'string', 'max:100'], 'items.*.route' => ['nullable', 'string', 'max:50'], 'items.*.quantity' => ['nullable', 'string', 'max:50'], 'items.*.instructions' => ['nullable', 'string', 'max:2000'], ]); } }