From 0751e1439a83010a1dffe2fbc045fce7134df833 Mon Sep 17 00:00:00 2001 From: avicenan Date: Fri, 27 Mar 2026 10:13:40 +0700 Subject: [PATCH] feat(emr): add prescription and prescription item entities --- src/entity/emr/emr_prescription.ts | 71 +++++++++++++++++++++++++ src/entity/emr/emr_prescription_item.ts | 66 +++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 src/entity/emr/emr_prescription.ts create mode 100644 src/entity/emr/emr_prescription_item.ts diff --git a/src/entity/emr/emr_prescription.ts b/src/entity/emr/emr_prescription.ts new file mode 100644 index 0000000..50e2936 --- /dev/null +++ b/src/entity/emr/emr_prescription.ts @@ -0,0 +1,71 @@ +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 { EmrPrescriptionItem } from "./emr_prescription_item"; + +/** + * Prescription entity. + * Header information for a medication prescription: order number, patient, doctor, rooms, registration. + */ +@Entity("emr_prescription", { schema: "emr" }) +export class EmrPrescription { + @PrimaryGeneratedColumn("uuid") + id: 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; + + @OneToMany(() => EmrPrescriptionItem, (item) => item.prescription, { cascade: true }) + items: EmrPrescriptionItem[]; + + @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; +} \ No newline at end of file diff --git a/src/entity/emr/emr_prescription_item.ts b/src/entity/emr/emr_prescription_item.ts new file mode 100644 index 0000000..8f13ba1 --- /dev/null +++ b/src/entity/emr/emr_prescription_item.ts @@ -0,0 +1,66 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + ManyToOne, + JoinColumn, +} from "typeorm"; + +import { ItemMaster } from "../pharmacy/item_master"; +import { UsageInstructions } from "../pharmacy/usage_instructions"; +import { UsageTime } from "../pharmacy/usage_time"; +import { EmrPrescription } from "./emr_prescription"; + +/** + * Prescription items entity. + * Stores each medication item with quantity and usage instructions/timing for a prescription. + */ +@Entity("emr_prescription_items", { schema: "emr" }) +export class EmrPrescriptionItem { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrPrescription, (prescription) => prescription.items, { onDelete: "CASCADE" }) + @JoinColumn({ name: "prescription_id" }) + prescription: EmrPrescription; + + @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; +} +