From 2d36b697ea571a7b0ca8688b7b3ab111d0b02a44 Mon Sep 17 00:00:00 2001 From: avicenan Date: Wed, 18 Mar 2026 09:03:45 +0700 Subject: [PATCH] feat(emr): add prescription order entities and status enum --- .../emr/emr_prescription_order_items.ts | 66 +++++++++++++++ src/entity/emr/emr_prescription_orders.ts | 84 +++++++++++++++++++ src/schema/emr.ts | 3 + src/types/prescription_pharmacy_status.ts | 7 ++ 4 files changed, 160 insertions(+) create mode 100644 src/entity/emr/emr_prescription_order_items.ts create mode 100644 src/entity/emr/emr_prescription_orders.ts create mode 100644 src/types/prescription_pharmacy_status.ts diff --git a/src/entity/emr/emr_prescription_order_items.ts b/src/entity/emr/emr_prescription_order_items.ts new file mode 100644 index 0000000..a49c313 --- /dev/null +++ b/src/entity/emr/emr_prescription_order_items.ts @@ -0,0 +1,66 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + ManyToOne, + JoinColumn, +} from "typeorm"; + +import { EmrPrescriptionOrder } from "./emr_prescription_orders"; +import { ItemMaster } from "../pharmacy/item_master"; +import { UsageInstructions } from "../pharmacy/usage_instructions"; +import { UsageTime } from "../pharmacy/usage_time"; + +/** + * Prescription order items entity. + * Stores each medication item with quantity and usage instructions/timing. + */ +@Entity("emr_prescription_order_items", { schema: "emr" }) +export class EmrPrescriptionOrderItem { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrPrescriptionOrder, (order) => order.items, { onDelete: "CASCADE" }) + @JoinColumn({ name: "prescription_order_id" }) + prescription_order: EmrPrescriptionOrder; + + @ManyToOne(() => ItemMaster, { onDelete: "NO ACTION" }) + @JoinColumn({ name: "item_master_id" }) + item_master: ItemMaster; + + @Column({ type: "int", nullable: false, default: 1 }) + qty: number; + + @ManyToOne(() => UsageInstructions, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn({ name: "usage_instruction_id" }) + usage_instruction: UsageInstructions | null; + + @ManyToOne(() => UsageTime, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn({ name: "usage_time_id" }) + usage_time: UsageTime | null; + + @Column() + @CreateDateColumn() + created_at: Date; + + @Column({ nullable: true, length: 256 }) + created_by: string; + + @Column({ nullable: true }) + @UpdateDateColumn() + updated_at: Date; + + @Column({ nullable: true, length: 256 }) + updated_by: string; + + @Column({ nullable: true }) + @DeleteDateColumn() + deleted_at: Date; + + @Column({ nullable: true, length: 256 }) + deleted_by: string; +} + diff --git a/src/entity/emr/emr_prescription_orders.ts b/src/entity/emr/emr_prescription_orders.ts new file mode 100644 index 0000000..9c7e67c --- /dev/null +++ b/src/entity/emr/emr_prescription_orders.ts @@ -0,0 +1,84 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + ManyToOne, + OneToMany, + JoinColumn, +} from "typeorm"; + +import { EmrPatient } from "./emr_patient"; +import { Room } from "../room"; +import { User } from "../users"; +import { EmrRegistration } from "./emr_registration"; +import { EmrPrescriptionOrderItem } from "./emr_prescription_order_items"; +import { PrescriptionPharmacyStatus } from "../../types/prescription_pharmacy_status"; + +/** + * Prescription orders entity. + * Header information for a medication prescription: order number, patient, doctor, rooms, registration, and pharmacy status. + */ +@Entity("emr_prescription_orders", { schema: "emr" }) +export class EmrPrescriptionOrder { + @PrimaryGeneratedColumn("uuid") + id: string; + + @Column({ nullable: false, length: 128, unique: true }) + order_no: string; + + @ManyToOne(() => EmrRegistration, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn({ name: "registration_id" }) + registration: EmrRegistration | null; + + @ManyToOne(() => EmrPatient, { onDelete: "NO ACTION" }) + @JoinColumn({ name: "patient_id" }) + patient: EmrPatient; + + @ManyToOne(() => User, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn({ name: "doctor_id" }) + doctor: User | null; + + @ManyToOne(() => Room, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn({ name: "room_id" }) + room: Room | null; + + @ManyToOne(() => Room, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn({ name: "referring_room_id" }) + referring_room: Room | null; + + @Column({ + type: "enum", + enum: PrescriptionPharmacyStatus, + nullable: false, + default: PrescriptionPharmacyStatus.PENDING, + }) + pharmacy_status: PrescriptionPharmacyStatus; + + @OneToMany(() => EmrPrescriptionOrderItem, (item) => item.prescription_order, { cascade: true }) + items: EmrPrescriptionOrderItem[]; + + @Column() + @CreateDateColumn() + created_at: Date; + + @Column({ nullable: true, length: 256 }) + created_by: string; + + @Column({ nullable: true }) + @UpdateDateColumn() + updated_at: Date; + + @Column({ nullable: true, length: 256 }) + updated_by: string; + + @Column({ nullable: true }) + @DeleteDateColumn() + deleted_at: Date; + + @Column({ nullable: true, length: 256 }) + deleted_by: string; +} + diff --git a/src/schema/emr.ts b/src/schema/emr.ts index f57de32..1718a5b 100644 --- a/src/schema/emr.ts +++ b/src/schema/emr.ts @@ -15,8 +15,11 @@ export * from "../entity/emr/emr_internal_consultation"; export * from "../entity/emr/emr_laboratory_orders"; export * from "../entity/emr/emr_laboratory_order_items"; export * from "../entity/emr/emr_laboratory_order_item_results"; +export * from "../entity/emr/emr_prescription_orders"; +export * from "../entity/emr/emr_prescription_order_items"; export * from "../entity/emr/emr_radiology"; export * from "../entity/emr/emr_radiology_services"; export * from "../types/registration_type"; export * from "../types/registration_status"; +export * from "../types/prescription_pharmacy_status"; diff --git a/src/types/prescription_pharmacy_status.ts b/src/types/prescription_pharmacy_status.ts new file mode 100644 index 0000000..f23a2d8 --- /dev/null +++ b/src/types/prescription_pharmacy_status.ts @@ -0,0 +1,7 @@ +export enum PrescriptionPharmacyStatus { + PENDING = "pending", + PROCESSING = "processing", + DISPENSED = "dispensed", + CANCELLED = "cancelled", +} +