fix(pharmacy-order): change paradigm and relation

This commit is contained in:
avicenan
2026-04-07 10:12:51 +07:00
parent 2cf96496d6
commit e51878bec6
8 changed files with 161 additions and 219 deletions

View File

@ -15,14 +15,22 @@ import { UsageTime } from "../pharmacy/usage_time";
import { UsageInstructions } from "../pharmacy/usage_instructions"; import { UsageInstructions } from "../pharmacy/usage_instructions";
import { EmrRegistration } from "./emr_registration"; import { EmrRegistration } from "./emr_registration";
import { Room } from "../room"; import { Room } from "../room";
import { EmrPatient } from "./emr_patient";
import { User } from "../users";
import { EmrPharmacyOrder } from "./emr_pharmacy_order";
@Entity("emr_compounding_medicine", { schema: "emr" }) @Entity("emr_compounding_medicine", { schema: "emr" })
export class EmrCompoundingMedicine { export class EmrCompoundingMedicine {
@PrimaryGeneratedColumn("uuid") @PrimaryGeneratedColumn("uuid")
id: string; id: string;
@OneToMany(() => EmrCompoundingMedicineItem, (detail) => detail.compoundingmedicine) @ManyToOne(() => EmrRegistration, { onDelete: "CASCADE" })
compoundingmedicineitem: EmrCompoundingMedicineItem[]; @JoinColumn({ name: "registration_id" })
registration: EmrRegistration;
@ManyToOne(() => EmrPatient, { onDelete: "NO ACTION" })
@JoinColumn({ name: "patient_id" })
patient: EmrPatient;
@Column({ nullable: true, type: "text" }) @Column({ nullable: true, type: "text" })
name: string; name: string;
@ -34,27 +42,22 @@ export class EmrCompoundingMedicine {
qty: number; qty: number;
@Column({ nullable: true, type: "text" }) @Column({ nullable: true, type: "text" })
compounding_notes: string; note: string;
@ManyToOne(() => Room, { onDelete: "CASCADE" }) @ManyToOne(() => UsageTime, { onDelete: "NO ACTION", nullable: true })
@JoinColumn() @JoinColumn({ name: "usage_time_id" })
room: Room; usage_time: UsageTime | null;
@ManyToOne(() => Room, { onDelete: "CASCADE" }) @ManyToOne(() => UsageInstructions, { onDelete: "NO ACTION", nullable: true })
@JoinColumn() @JoinColumn({ name: "usage_instruction_id" })
reffering_room: Room; usage_instruction: UsageInstructions | null;
@ManyToOne(() => EmrRegistration, { onDelete: "CASCADE" }) @ManyToOne(() => EmrPharmacyOrder, { onDelete: "CASCADE", nullable: true })
@JoinColumn() @JoinColumn({ name: "pharmacy_order_id" })
emrregistration: EmrRegistration; pharmacy_order: EmrPharmacyOrder | null;
@ManyToOne(() => UsageTime, { onDelete: "CASCADE" }) @OneToMany(() => EmrCompoundingMedicineItem, (item) => item.compounding_medicine, { cascade: true })
@JoinColumn() items: EmrCompoundingMedicineItem[];
usagetime: UsageTime;
@ManyToOne(() => UsageInstructions, { onDelete: "CASCADE" })
@JoinColumn()
usageinstructions: UsageInstructions;
@Column() @Column()
@CreateDateColumn() @CreateDateColumn()

View File

@ -10,19 +10,20 @@ import {
} from "typeorm"; } from "typeorm";
import { ItemMaster } from "../pharmacy/item_master"; import { ItemMaster } from "../pharmacy/item_master";
import { EmrCompoundingMedicine } from "./emr_compounding_medicine"; import { EmrCompoundingMedicine } from "./emr_compounding_medicine";
import { RoomStock } from "../pharmacy-logistic/room_stock";
@Entity("emr_compounding_medicine_item", { schema: "emr" }) @Entity("emr_compounding_medicine_item", { schema: "emr" })
export class EmrCompoundingMedicineItem { export class EmrCompoundingMedicineItem {
@PrimaryGeneratedColumn("uuid") @PrimaryGeneratedColumn("uuid")
id: string; id: string;
@ManyToOne(() => ItemMaster, { onDelete: "CASCADE" }) @ManyToOne(() => ItemMaster, { onDelete: "NO ACTION" })
@JoinColumn() @JoinColumn({ name: "item_master_id" })
itemmaster: ItemMaster; item_master: ItemMaster;
@ManyToOne(() => EmrCompoundingMedicine, { onDelete: "CASCADE" }) @ManyToOne(() => EmrCompoundingMedicine, { onDelete: "CASCADE" })
@JoinColumn() @JoinColumn({ name: "compounding_medicine_id" })
compoundingmedicine: EmrCompoundingMedicine; compounding_medicine: EmrCompoundingMedicine;
@Column({ @Column({
type: "int", type: "int",
@ -30,6 +31,10 @@ export class EmrCompoundingMedicineItem {
}) })
dose: number dose: number
@ManyToOne(() => RoomStock, { onDelete: "NO ACTION" })
@JoinColumn({ name: "room_stock_id" })
room_stock: RoomStock;
@Column() @Column()
@CreateDateColumn() @CreateDateColumn()
created_at: Date; created_at: Date;

View File

@ -0,0 +1,87 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
DeleteDateColumn,
ManyToOne,
JoinColumn,
OneToMany,
Index,
} from "typeorm";
import { EmrCompoundingMedicine } from "./emr_compounding_medicine";
import { EmrPrescription } from "./emr_prescription";
import { User } from "../users";
import { Room } from "../room";
import { EmrRegistration } from "./emr_registration";
import { EmrPatient } from "./emr_patient";
import { PharmacyOrderStatus } from "../../types/pharmacy_order_status";
@Entity("emr_pharmacy_order", { schema: "emr" })
@Index(["code"], { unique: true })
export class EmrPharmacyOrder {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ type: "varchar", unique: true })
code: string;
@ManyToOne(() => EmrRegistration, { onDelete: "CASCADE" })
@JoinColumn({ name: "registration_id" })
registration: EmrRegistration | null;
@ManyToOne(() => User, { onDelete: "CASCADE" })
@JoinColumn({ name: "doctor_id" })
doctor: User | null;
@ManyToOne(() => EmrPatient, { onDelete: "CASCADE" })
@JoinColumn({ name: "patient_id" })
patient: EmrPatient | null;
@OneToMany(() => EmrCompoundingMedicine, compounding => compounding.pharmacy_order, { cascade: true })
compounding_medicines: EmrCompoundingMedicine[];
@OneToMany(() => EmrPrescription, (prescription) => prescription.pharmacy_order, { cascade: true })
prescriptions: EmrPrescription[];
@ManyToOne(() => Room, { onDelete: "CASCADE" })
@JoinColumn({ name: "room_id" })
room: Room;
@ManyToOne(() => Room, { onDelete: "CASCADE" })
@JoinColumn({ name: "referring_room_id" })
referring_room: Room | null;
@Column({ nullable: true, type: "text", array: true })
prescription_screening: string[] | null;
@Column({ nullable: true, type: "text" })
status: PharmacyOrderStatus;
@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;
}
function Sequence(arg0: string): (target: EmrPharmacyOrder, propertyKey: "order_number") => void {
throw new Error("Function not implemented.");
}

View File

@ -1,107 +0,0 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
DeleteDateColumn,
OneToMany,
ManyToOne,
JoinColumn,
ManyToMany,
JoinTable
} from "typeorm";
import { EmrCompoundingMedicine } from "./emr_compounding_medicine";
import { EmrPrescription } from "./emr_prescription";
import { User } from "../users";
import { PatientGuarantor } from "../patient_guarantor";
import { Room } from "../room";
import { Department } from "../department";
import { EmrRegistration } from "./emr_registration";
@Entity("emr_pharmacy_order_list", { schema: "emr" })
export class EmrPharmacyOrderList {
@PrimaryGeneratedColumn("uuid")
id: string;
@ManyToMany(() => EmrCompoundingMedicine)
@JoinTable({
name: "emr_pharmacy_order_list_compounding", // bebas, tapi konsisten
joinColumn: {
name: "pharmacy_order_list_id",
referencedColumnName: "id",
},
inverseJoinColumn: {
name: "compounding_medicine_id",
referencedColumnName: "id",
},
})
emrcompoundingmedicines: EmrCompoundingMedicine[];
@Column({ nullable: true })
order_date: Date;
@Column({ nullable: true, type: "text" })
prescription_number: string;
@Column({ nullable: true, type: "text" })
type: string;
@Column({ nullable: true, type: "text" })
status: string;
@Column({ nullable: true, type: "text", array: true })
prescription_screening: string[];
@ManyToOne(() => EmrPrescription, { onDelete: "CASCADE" })
@JoinColumn()
emrprescription: EmrPrescription;
@ManyToOne(() => User, { onDelete: "CASCADE" })
@JoinColumn()
user: User;
@ManyToOne(() => PatientGuarantor, { onDelete: "CASCADE" })
@JoinColumn()
patientguarantor: PatientGuarantor;
@ManyToOne(() => Room, { onDelete: "CASCADE" })
@JoinColumn()
room: Room;
@ManyToOne(() => Room, { onDelete: "CASCADE" })
@JoinColumn()
destination_room: Room;
@ManyToOne(() => Department, { onDelete: "CASCADE" })
@JoinColumn()
department: Department;
@ManyToOne(() => EmrRegistration, { onDelete: "CASCADE" })
@JoinColumn()
emrregistration: EmrRegistration;
@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;
}

View File

@ -8,18 +8,19 @@ import {
ManyToOne, ManyToOne,
OneToMany, OneToMany,
JoinColumn, JoinColumn,
OneToOne,
} from "typeorm"; } from "typeorm";
import { EmrPatient } from "./emr_patient"; import { EmrPatient } from "./emr_patient";
import { Room } from "../room"; import { Room } from "../room";
import { User } from "../users"; import { User } from "../users";
import { EmrRegistration } from "./emr_registration"; import { EmrRegistration } from "./emr_registration";
import { EmrPrescriptionItem } from "./emr_prescription_item"; import { EmrPharmacyOrder } from "./emr_pharmacy_order";
import { UsageTime } from "../pharmacy/usage_time";
import { UsageInstructions } from "../pharmacy/usage_instructions";
import { ItemMaster } from "../pharmacy/item_master";
import { RoomStock } from "../pharmacy-logistic/room_stock";
/**
* Prescription entity.
* Header information for a medication prescription: order number, patient, doctor, rooms, registration.
*/
@Entity("emr_prescription", { schema: "emr" }) @Entity("emr_prescription", { schema: "emr" })
export class EmrPrescription { export class EmrPrescription {
@PrimaryGeneratedColumn("uuid") @PrimaryGeneratedColumn("uuid")
@ -33,23 +34,28 @@ export class EmrPrescription {
@JoinColumn({ name: "patient_id" }) @JoinColumn({ name: "patient_id" })
patient: EmrPatient; patient: EmrPatient;
@ManyToOne(() => User, { onDelete: "NO ACTION", nullable: true }) @ManyToOne(() => ItemMaster, { onDelete: "NO ACTION" })
@JoinColumn({ name: "doctor_id" }) @JoinColumn({ name: "item_master_id" })
doctor: User | null; item_master: ItemMaster;
@ManyToOne(() => Room, { onDelete: "NO ACTION", nullable: true }) @Column({ type: "int", nullable: false, default: 1 })
@JoinColumn({ name: "room_id" }) qty: number;
room: Room | null;
@ManyToOne(() => Room, { onDelete: "NO ACTION", nullable: true }) @ManyToOne(() => UsageInstructions, { onDelete: "NO ACTION", nullable: true })
@JoinColumn({ name: "referring_room_id" }) @JoinColumn({ name: "usage_instruction_id" })
referring_room: Room | null; usage_instruction: UsageInstructions | null;
@OneToMany(() => EmrPrescriptionItem, (item) => item.prescription, { cascade: true }) @ManyToOne(() => UsageTime, { onDelete: "NO ACTION", nullable: true })
items: EmrPrescriptionItem[]; @JoinColumn({ name: "usage_time_id" })
usage_time: UsageTime | null;
@Column({ type: "boolean", default: false }) @ManyToOne(() => EmrPharmacyOrder, { onDelete: "CASCADE", nullable: true })
is_ordered: boolean; @JoinColumn({ name: "pharmacy_order_id" })
pharmacy_order: EmrPharmacyOrder | null;
@ManyToOne(() => RoomStock, { onDelete: "NO ACTION" })
@JoinColumn({ name: "room_stock_id" })
room_stock: RoomStock;
@Column() @Column()
@CreateDateColumn() @CreateDateColumn()

View File

@ -1,66 +0,0 @@
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;
}

View File

@ -16,17 +16,15 @@ export * from "../entity/emr/emr_laboratory_orders";
export * from "../entity/emr/emr_laboratory_order_items"; export * from "../entity/emr/emr_laboratory_order_items";
export * from "../entity/emr/emr_laboratory_order_item_results"; export * from "../entity/emr/emr_laboratory_order_item_results";
export * from "../entity/emr/emr_prescription"; export * from "../entity/emr/emr_prescription";
export * from "../entity/emr/emr_prescription_item";
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";
export * from "../entity/emr/emr_radiology_services"; export * from "../entity/emr/emr_radiology_services";
export * from "../entity/emr/emr_compounding_medicine"; export * from "../entity/emr/emr_compounding_medicine";
export * from "../entity/emr/emr_compounding_medicine_item"; export * from "../entity/emr/emr_compounding_medicine_item";
export * from "../entity/emr/emr_room_medical_equipment"; export * from "../entity/emr/emr_room_medical_equipment";
export * from "../entity/emr/emr_external_consultation"; export * from "../entity/emr/emr_external_consultation";
export * from "../entity/emr/emr_pharmacy_order_list"; export * from "../entity/emr/emr_pharmacy_order";
export * from "../types/registration_type"; export * from "../types/registration_type";
export * from "../types/registration_status"; export * from "../types/registration_status";
export * from "../types/pharmacy_order_status";
export * from "../types/prescription_pharmacy_status"; export * from "../types/prescription_pharmacy_status";

View File

@ -0,0 +1,16 @@
/**
* Workflow status untuk order farmasi.
* Waiting: menunggu persiapan obat
* Preparing: sedang mempersiapkan obat
* Ready: obat siap untuk diambil
* Completed: order selesai
* Canceled: order dibatalkan
*/
export enum PharmacyOrderStatus {
WAITING = "waiting",
PREPARING = "preparing",
READY = "ready",
COMPLETED = "completed",
CANCELED = "canceled",
}