diff --git a/src/entity/card-management/card_inventory.ts b/src/entity/card-management/card_inventory.ts new file mode 100644 index 0000000..d599f71 --- /dev/null +++ b/src/entity/card-management/card_inventory.ts @@ -0,0 +1,72 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + ManyToOne, + JoinColumn, + Index, +} from "typeorm"; +import { EmrPatient } from "../emr/emr_patient"; +import { CardInventoryStatus } from "../../types/card_inventory_status"; + +@Entity({ schema: "card_management", name: "card_inventory" }) +@Index(["card_number"], { unique: true }) +@Index(["running_number"], { unique: true }) +export class CardInventory { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrPatient, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn({ name: "patientId" }) + patient: EmrPatient; + + @Column({ nullable: true, length: 64 }) + mrn: string; + + @Column({ type: "bigint", nullable: false, unique: true }) + running_number: string; + + @Column({ nullable: true, length: 64, unique: true }) + card_number: string; + + @Column({ nullable: true, length: 128 }) + tag_id: string; + + @Column({ nullable: true, length: 64 }) + facility_code: string; + + @Column({ + type: "enum", + enum: CardInventoryStatus, + nullable: false, + default: CardInventoryStatus.NOT_USED, + }) + status: CardInventoryStatus; + + @Column({ type: "timestamp", nullable: true }) + printed_at: Date; + + @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/card-management/card_stock_in.ts b/src/entity/card-management/card_stock_in.ts new file mode 100644 index 0000000..c4deab9 --- /dev/null +++ b/src/entity/card-management/card_stock_in.ts @@ -0,0 +1,48 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, +} from "typeorm"; + +/** + * Placeholder for future batch card stock-in workflow. + * Entity only — no API, UI, or business logic yet. + */ +@Entity({ schema: "card_management", name: "card_stock_in" }) +export class CardStockIn { + @PrimaryGeneratedColumn("uuid") + id: string; + + @Column({ nullable: true, length: 64 }) + batch_number: string; + + @Column({ type: "int", nullable: true }) + quantity: number; + + @Column({ type: "text", nullable: true }) + notes: string; + + @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/card-management/running_number_log.ts b/src/entity/card-management/running_number_log.ts new file mode 100644 index 0000000..8ec1bb5 --- /dev/null +++ b/src/entity/card-management/running_number_log.ts @@ -0,0 +1,53 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + Index, +} from "typeorm"; + +@Entity({ schema: "card_management", name: "running_number_log" }) +@Index(["running_number"]) +@Index(["requested_at"]) +export class RunningNumberLog { + @PrimaryGeneratedColumn("uuid") + id: string; + + @Column({ type: "bigint", nullable: false }) + running_number: string; + + @Column({ nullable: false, length: 128 }) + service_name: string; + + @Column({ type: "uuid", nullable: false }) + requested_by: string; + + @Column({ nullable: false, length: 256 }) + requested_by_name: string; + + @Column({ type: "timestamp", nullable: false }) + requested_at: Date; + + @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/card_print_queue.ts b/src/entity/card_print_queue.ts index bb37689..b831c8e 100644 --- a/src/entity/card_print_queue.ts +++ b/src/entity/card_print_queue.ts @@ -54,6 +54,18 @@ export class CardPrintQueue { @Column({ type: "text", nullable: true }) facility_code?: string; + @Column({ type: "bigint", nullable: true }) + running_number?: string; + + @Column({ type: "text", nullable: true }) + card_number?: string; + + @Column({ type: "text", nullable: true }) + provision_job_id?: string; + + @Column({ type: "text", nullable: true }) + error_message?: string; + @Column({ type: "enum", enum: CardPrintQueueStatus, diff --git a/src/entity/emr/emr_observation_record.ts b/src/entity/emr/emr_observation_record.ts new file mode 100644 index 0000000..09c40c7 --- /dev/null +++ b/src/entity/emr/emr_observation_record.ts @@ -0,0 +1,82 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + ManyToOne, + JoinColumn, + Index, +} from "typeorm"; + +import { Avpu } from "../../enum/avpu"; +import { User } from "../users"; +import { EmrRegistration } from "./emr_registration"; + +@Entity("emr_observation_record", { schema: "emr" }) +@Index("idx_emr_observation_record_registration", ["registration"]) +export class ObservationRecord { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrRegistration, { onDelete: "CASCADE" }) + @JoinColumn({ name: "registration_id" }) + registration: EmrRegistration; + + @Column({ length: 5 }) + oras: string; + + @Column({ nullable: true, type: "int2" }) + respirasi: number | null; + + @Column({ nullable: true, type: "int2" }) + spo2: number | null; + + @Column({ nullable: true, type: "int2" }) + hr: number | null; + + @Column({ nullable: true, type: "int2" }) + bp_systolic: number | null; + + @Column({ nullable: true, type: "int2" }) + bp_diastolic: number | null; + + @Column({ nullable: true, type: "float" }) + temperatura: number | null; + + @Column({ + type: "enum", + enum: Avpu, + nullable: true, + }) + avpu: Avpu | null; + + @Column({ nullable: true, type: "float" }) + todan: number | null; + + @ManyToOne(() => User, { onDelete: "NO ACTION" }) + @JoinColumn({ name: "assina_uuid" }) + assina: User; + + @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/enum/avpu.ts b/src/enum/avpu.ts new file mode 100644 index 0000000..e608282 --- /dev/null +++ b/src/enum/avpu.ts @@ -0,0 +1,6 @@ +export enum Avpu { + A = "A", + V = "V", + P = "P", + U = "U", +} diff --git a/src/index.ts b/src/index.ts index 88437b0..521db76 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,4 +6,5 @@ export * from "./schema/procurement"; export * from "./schema/pharmacy"; export * from "./schema/pharmacy_logistic"; export * from "./schema/cashier"; -export * from "./schema/blood_bank"; \ No newline at end of file +export * from "./schema/blood_bank"; +export * from "./schema/card_management"; \ No newline at end of file diff --git a/src/schema/card_management.ts b/src/schema/card_management.ts new file mode 100644 index 0000000..82a1a99 --- /dev/null +++ b/src/schema/card_management.ts @@ -0,0 +1,4 @@ +export * from "../types/card_inventory_status"; +export * from "../entity/card-management/card_inventory"; +export * from "../entity/card-management/running_number_log"; +export * from "../entity/card-management/card_stock_in"; diff --git a/src/schema/emr.ts b/src/schema/emr.ts index 7eefeb1..a741bab 100644 --- a/src/schema/emr.ts +++ b/src/schema/emr.ts @@ -55,6 +55,7 @@ export * from "../entity/treatment/treatment_plan"; export * from "../entity/treatment/treatment_plan_session"; export * from "../entity/emr/emr_registration_treatment"; export * from "../entity/emr/emr_ancillary_service_order"; +export * from "../entity/emr/emr_observation_record"; export * from "../types/registration_type"; export * from "../types/registration_status"; @@ -63,6 +64,7 @@ export * from "../types/prescription_pharmacy_status"; export * from "../types/radiology_order_status"; export * from "../types/laboratory_order_status"; export * from "../enum/consciousness"; +export * from "../enum/avpu"; export * from "../types/patient_category"; export * from "../types/citizen"; export * from "../types/treatment_session"; diff --git a/src/types/card_inventory_status.ts b/src/types/card_inventory_status.ts new file mode 100644 index 0000000..351be3d --- /dev/null +++ b/src/types/card_inventory_status.ts @@ -0,0 +1,7 @@ +export enum CardInventoryStatus { + /** Blank card in stock — not yet assigned / injected to a patient */ + NOT_USED = "NOT_USED", + ACTIVE = "ACTIVE", + LOST = "LOST", + REPLACED = "REPLACED", +}