diff --git a/src/entity/emr/emr_emergency_transfer_attached_devices.ts b/src/entity/emr/emr_emergency_transfer_attached_devices.ts new file mode 100644 index 0000000..2b38e7b --- /dev/null +++ b/src/entity/emr/emr_emergency_transfer_attached_devices.ts @@ -0,0 +1,45 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { EmrEmergencyTransfer } from "./emr_emergency_transfers"; + +@Entity("emr_emergency_transfer_attached_devices", { schema: "emr" }) +export class EmrEmergencyTransferAttachedDevice { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrEmergencyTransfer, (transfer) => transfer.diagnostics, { onDelete: "NO ACTION" }) + @JoinColumn() + emergency_transfer: EmrEmergencyTransfer; + + @Column({ nullable: true, type: "text" }) + device_type: string; + + @Column({ nullable: true, type: "text" }) + location: string; + + @Column({ nullable: true, type: "text" }) + size: string; + + @Column({ nullable: true, type: "text" }) + note: 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/emr/emr_emergency_transfer_clinical_interventions.ts b/src/entity/emr/emr_emergency_transfer_clinical_interventions.ts new file mode 100644 index 0000000..7b416eb --- /dev/null +++ b/src/entity/emr/emr_emergency_transfer_clinical_interventions.ts @@ -0,0 +1,41 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { EmrEmergencyTransfer } from "./emr_emergency_transfers"; + +@Entity("emr_emergency_transfer_clinical_interventions", { schema: "emr" }) +export class EmrEmergencyTransferClinicalIntervention { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrEmergencyTransfer, (transfer) => transfer.clinical_interventions, { + onDelete: "NO ACTION", + }) + @JoinColumn({}) + emergency_transfer: EmrEmergencyTransfer; + + @Column({ nullable: true, type: "varchar", length: 128 }) + intervention_category: string; + + @Column({ nullable: true, type: "text" }) + 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/emr/emr_emergency_transfer_diagnostics.ts b/src/entity/emr/emr_emergency_transfer_diagnostics.ts new file mode 100644 index 0000000..ded37eb --- /dev/null +++ b/src/entity/emr/emr_emergency_transfer_diagnostics.ts @@ -0,0 +1,39 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { EmrEmergencyTransfer } from "./emr_emergency_transfers"; + +@Entity("emr_emergency_transfer_diagnostics", { schema: "emr" }) +export class EmrEmergencyTransferDiagnostic { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrEmergencyTransfer, (transfer) => transfer.diagnostics, { onDelete: "NO ACTION" }) + @JoinColumn() + emergency_transfer: EmrEmergencyTransfer; + + @Column({ nullable: true, type: "text" }) + test_name: string; + + @Column({ nullable: true, type: "text" }) + result: 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/emr/emr_emergency_transfer_medications.ts b/src/entity/emr/emr_emergency_transfer_medications.ts new file mode 100644 index 0000000..51c9b9e --- /dev/null +++ b/src/entity/emr/emr_emergency_transfer_medications.ts @@ -0,0 +1,51 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { EmrEmergencyTransfer } from "./emr_emergency_transfers"; + +@Entity("emr_emergency_transfer_medications", { schema: "emr" }) +export class EmrEmergencyTransferMedication { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrEmergencyTransfer, (transfer) => transfer.medications, { onDelete: "NO ACTION" }) + @JoinColumn() + emergency_transfer: EmrEmergencyTransfer; + + @Column({ nullable: true, type: "text" }) + medicine_type: string; + + @Column({ nullable: true, type: "text" }) + medicine_name: string; + + @Column({ nullable: true, type: "text" }) + dosage: string; + + @Column({ nullable: true, type: "text" }) + medicine_frequency: string; + + @Column({ nullable: true, type: "text" }) + medicine_route: string; + + @Column({ nullable: true, type: "text" }) + remaining_medicine: 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/emr/emr_emergency_transfer_patient_conditions.ts b/src/entity/emr/emr_emergency_transfer_patient_conditions.ts new file mode 100644 index 0000000..bb84410 --- /dev/null +++ b/src/entity/emr/emr_emergency_transfer_patient_conditions.ts @@ -0,0 +1,85 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { EmrEmergencyTransfer } from "./emr_emergency_transfers"; + +@Entity("emr_emergency_transfer_patient_conditions", { schema: "emr" }) +export class EmrEmergencyTransferPatientCondition { + // Primary key data kondisi pasien saat pindah + @PrimaryGeneratedColumn("uuid") + id: string; + + // Relasi ke data transfer antar unit + @ManyToOne(() => EmrEmergencyTransfer, { onDelete: "NO ACTION" }) + @JoinColumn() + emergency_transfer: EmrEmergencyTransfer; + + // KU pasien saat pindah + @Column({ nullable: true, type: "text" }) + general_condition: string; + + // Kesadaran pasien saat pindah + @Column({ nullable: true, type: "text" }) + consciousness: string; + + // Nilai GCS E + @Column({ nullable: true, type: "int" }) + gcs_eye: number; + + // Nilai GCS M + @Column({ nullable: true, type: "int" }) + gcs_motor: number; + + // Nilai GCS V + @Column({ nullable: true, type: "int" }) + gcs_verbal: number; + + // Total nilai GCS + @Column({ nullable: true, type: "int" }) + gcs_total: number; + + // Saturasi oksigen / SaO2 + @Column({ nullable: true, type: "text" }) + oxygen_saturation: string; + + // Tekanan darah + @Column({ nullable: true, type: "text" }) + blood_pressure: string; + + // Suhu tubuh + @Column({ nullable: true, type: "text" }) + temperature: string; + + // Nadi + @Column({ nullable: true, type: "text" }) + pulse: string; + + // Respiratory rate / RR + @Column({ nullable: true, type: "text" }) + respiratory_rate: string; + + // Waktu data dibuat + @Column() + @CreateDateColumn() + created_at: Date; + + // User pembuat data + @Column({ nullable: true, length: 256 }) + created_by: string; + + // Waktu data terakhir diubah + @Column({ nullable: true }) + @UpdateDateColumn() + updated_at: Date; + + // User pengubah terakhir + @Column({ nullable: true, length: 256 }) + updated_by: string; + + // Waktu soft delete + @Column({ nullable: true }) + @DeleteDateColumn() + deleted_at: Date; + + // User yang melakukan soft delete + @Column({ nullable: true, length: 256 }) + deleted_by: string; +} diff --git a/src/entity/emr/emr_emergency_transfers.ts b/src/entity/emr/emr_emergency_transfers.ts new file mode 100644 index 0000000..a89513a --- /dev/null +++ b/src/entity/emr/emr_emergency_transfers.ts @@ -0,0 +1,173 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn, OneToMany } from "typeorm"; +import { Room } from "../room"; +import { EmrBoardingRoom } from "./emr_boarding_rooms"; +import { EmrEmergencyTransferMedication } from "./emr_emergency_transfer_medications"; +import { EmrEmergencyTransferDiagnostic } from "./emr_emergency_transfer_diagnostics"; +import { EmrEmergencyTransferClinicalIntervention } from "./emr_emergency_transfer_clinical_interventions"; +import { EmrEmergencyTransferPatientCondition } from "./emr_emergency_transfer_patient_conditions"; +import { User } from "../users"; +import { EmrDiagnosis } from "./emr_diagnosis"; +import { TransferMethodType, TransferRiskType } from "../../types/emr"; +import { EmrEmergencyTransferAttachedDevice } from "./emr_emergency_transfer_attached_devices"; + +@Entity("emr_emergency_transfers", { schema: "emr" }) +export class EmrEmergencyTransfer { + // Primary key data transfer antar unit + @PrimaryGeneratedColumn("uuid") + id: string; + + // Asal ruang rawat + @ManyToOne(() => Room, { onDelete: "NO ACTION" }) + @JoinColumn() + origin_room: Room; + + // Ruang rawat selanjutnya (tujuan pindah) + @ManyToOne(() => EmrBoardingRoom, { onDelete: "NO ACTION" }) + @JoinColumn() + destination_room: EmrBoardingRoom; + + // Tanggal masuk / jam + @Column({ type: "timestamp", nullable: true }) + admission_datetime: Date; + + // Tanggal pindah / jam + @Column({ type: "timestamp", nullable: true }) + transfer_datetime: Date; + + // Indikasi masuk + @Column({ nullable: true, type: "text" }) + admission_indication: string; + + // DPJP utama + @ManyToOne(() => User, { onDelete: "NO ACTION" }) + @JoinColumn() + primary_attending_physician: User; + + // DPJP tambahan (rawat bersama) + @Column({ nullable: true, type: "text", array: true }) + additional_attending_physicians: string[]; + + // Diagnosis utama + @ManyToOne(() => EmrDiagnosis, { onDelete: "NO ACTION" }) + @JoinColumn() + primary_diagnosis: EmrDiagnosis; + + // Diagnosis sekunder + @Column({ nullable: true, type: "text", array: true }) + secondary_diagnoses: string[]; + + // Alasan pemindahan: kondisi memburuk / tidak stabil + @Column({ nullable: true, type: "boolean", default: false }) + transfer_reason_condition_worsening: boolean; + + // Alasan pemindahan: butuh tenaga ahli / tenaga kurang + @Column({ nullable: true, type: "boolean", default: false }) + transfer_reason_staff_needed: boolean; + + // Alasan pemindahan: fasilitas / peralatan lebih baik + @Column({ nullable: true, type: "boolean", default: false }) + transfer_reason_facility_needed: boolean; + + // Alasan pemindahan: pemeriksaan penunjang + @Column({ nullable: true, type: "boolean", default: false }) + transfer_reason_supporting_exam: boolean; + + // Alasan pemindahan: lain-lain (checkbox) + @Column({ nullable: true, type: "boolean", default: false }) + transfer_reason_other: boolean; + + // Alasan pemindahan: keterangan lain-lain + @Column({ nullable: true, type: "text" }) + transfer_reason_other_text: string; + + // Riwayat kesehatan + @Column({ nullable: true, type: "text" }) + medical_history: string; + + // Metode pemindahan pasien + @Column({ nullable: true, default: "stretcher" }) + transfer_method: TransferMethodType; + + // Risiko selama transfer + @Column({ nullable: true }) + transfer_risk: TransferRiskType; + + // Risiko selama transfer: keterangan lain-lain + @Column({ nullable: true, type: "text" }) + transfer_risk_other_text: string; + + // Risiko jatuh + @Column({ nullable: true, type: "text" }) + fall_risk: string; + + // Nyeri + @Column({ nullable: true, type: "text" }) + pain: string; + + // Persetujuan pasien/keluarga (ya/tidak) + @Column({ nullable: true, type: "boolean", default: false }) + transfer_consent: boolean; + + // Nama pemberi persetujuan (jika keluarga) + @Column({ nullable: true, type: "text" }) + consenter_name: string; + + // Hubungan pemberi persetujuan dengan pasien + @Column({ nullable: true, type: "text" }) + consenter_relationship: string; + + // Kategori transfer pasien (0/1/2/3) + @Column({ nullable: true, type: "text" }) + category_patient: string; + + // TTD pasien / keluarga (path/base64 sesuai implementasi) + @Column({ nullable: true, type: "text" }) + patient_or_family_signature: string; + + // TTD petugas pendamping + @Column({ nullable: true, type: "text" }) + staff_signature: string; + + // Turunan data prosedur yang dilakukan + @Column({ nullable: true, type: "text" }) + procedure: string; + + // Turunan data pemeriksaan diagnostik + @OneToMany(() => EmrEmergencyTransferDiagnostic, (row) => row.emergency_transfer, { onDelete: "NO ACTION" }) + diagnostics: EmrEmergencyTransferDiagnostic[]; + + // Turunan data obat yang diberikan saat transfer + @OneToMany(() => EmrEmergencyTransferMedication, (row) => row.emergency_transfer, { onDelete: "NO ACTION" }) + medications: EmrEmergencyTransferMedication[]; + + // Turunan data alat yang terpasang di pasien + @OneToMany(() => EmrEmergencyTransferAttachedDevice, (row) => row.emergency_transfer, { onDelete: "NO ACTION" }) + attached_devices: EmrEmergencyTransferAttachedDevice; + + // Turunan data tindakan klinis (infus, oksigen, dll) + @OneToMany(() => EmrEmergencyTransferClinicalIntervention, (row) => row.emergency_transfer, { + onDelete: "NO ACTION", + }) + clinical_interventions: EmrEmergencyTransferClinicalIntervention[]; + + @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/inpatient_room_bed_details.ts b/src/entity/inpatient_room_bed_details.ts index 0d42fee..8758173 100644 --- a/src/entity/inpatient_room_bed_details.ts +++ b/src/entity/inpatient_room_bed_details.ts @@ -1,5 +1,6 @@ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; import { InpatientRoomBed } from "./inpatient_room_beds"; +import { Room } from "./room"; @Entity("inpatient_room_bed_details") export class InpatientRoomBedDetail { @@ -13,15 +14,17 @@ export class InpatientRoomBedDetail { @Column({ type: "timestamp", nullable: true }) admission_datetime: Date; + @ManyToOne(() => Room, { onDelete: "NO ACTION" }) + @JoinColumn() + origin_room: Room; + + @ManyToOne(() => Room, { onDelete: "NO ACTION" }) + @JoinColumn() + destination_room: Room; + @Column({ type: "timestamp", nullable: true }) transfer_datetime: Date; - @Column({ nullable: true, type: "text" }) - origin_care_unit: string; - - @Column({ nullable: true, type: "text" }) - destination_care_unit: string; - @Column({ nullable: true, type: "text" }) admission_indication: string; diff --git a/src/schema/emr.ts b/src/schema/emr.ts index ca7ddc3..e914c63 100644 --- a/src/schema/emr.ts +++ b/src/schema/emr.ts @@ -27,6 +27,13 @@ export * from "../entity/emr/emr_pharmacy_order"; export * from "../entity/emr/emr_pharmacy_order_activity"; export * from "../entity/emr/emr_registration_emergency_responsible"; export * from "../entity/emr/emr_discharge_status_emergency"; +export * from "../entity/emr/emr_emergency_transfers"; +export * from "../entity/emr/emr_emergency_transfer_medications"; +export * from "../entity/emr/emr_emergency_transfer_attached_devices"; +export * from "../entity/emr/emr_emergency_transfer_diagnostics"; +export * from "../entity/emr/emr_emergency_transfer_clinical_interventions"; +export * from "../entity/emr/emr_emergency_transfer_patient_conditions"; +export * from "../entity/emr/emr_emergency_transfer_procedures"; export * from "../entity/emr/emr_physical_examination_emergency"; export * from "../entity/emr/emr_doctor_order_emergency"; export * from "../entity/emr/emr_atenatal_care"; diff --git a/src/types/emr.ts b/src/types/emr.ts new file mode 100644 index 0000000..a860793 --- /dev/null +++ b/src/types/emr.ts @@ -0,0 +1,14 @@ +export enum TransferMethodType { + "Wheelchair" = "wheelchair", + "Stretcher" = "stretcher", + "Bed" = "bed", +} + +export enum TransferRiskType { + "RespiratoryArrest" = "respiratory_arrest", + "CardiacArrest" = "cardiac_arrest", + "Vomiting" = "vomiting", + "Bleeding" = "bleeding", + "Seizure" = "seizure", + "Other" = "other", +}