diff --git a/src/entity/diagnosis.ts b/src/entity/diagnosis.ts index 48368fe..194bbca 100644 --- a/src/entity/diagnosis.ts +++ b/src/entity/diagnosis.ts @@ -1,6 +1,7 @@ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn } from "typeorm"; import { Status } from "../types/status"; +import { DiagnosisType } from "../types/diagnosis_type"; @Entity("diagnoses") export class Diagnosis { @@ -25,6 +26,13 @@ export class Diagnosis { }) status: Status; + @Column({ + type: "enum", + enum: DiagnosisType, + nullable: true, + }) + type: DiagnosisType | null; + @CreateDateColumn() created_at: Date; diff --git a/src/entity/emr/emr_patient_education.ts b/src/entity/emr/emr_patient_education.ts index b36470d..82ae976 100644 --- a/src/entity/emr/emr_patient_education.ts +++ b/src/entity/emr/emr_patient_education.ts @@ -86,6 +86,9 @@ export class PatientEducation { }) learning_evaluation: string; + @CreateDateColumn() + education_date: Date; + @CreateDateColumn() created_at: Date; diff --git a/src/entity/emr/emr_registration.ts b/src/entity/emr/emr_registration.ts index 895aa9c..a24239b 100644 --- a/src/entity/emr/emr_registration.ts +++ b/src/entity/emr/emr_registration.ts @@ -10,6 +10,7 @@ import { EmrRegistrationEmergencyResponsible } from "./emr_registration_emergenc import { RefferalHospital } from "../refferal_hospital"; import { EmrDiagnosis } from "./emr_diagnosis"; import { OneToMany } from "typeorm"; +import { EmrRegistrationTreatment } from "./emr_registration_treatment"; /** * Registrasi base: data umum untuk semua tipe (rawat jalan, rawat inap, emergency, hemodialysis). @@ -30,6 +31,9 @@ export class EmrRegistration { @OneToOne(() => EmrRegistrationEmergency, (emergency) => emergency.registration) emergency: EmrRegistrationEmergency; + @OneToOne(() => EmrRegistrationTreatment, (treatment) => treatment.registration) + treatment: EmrRegistrationTreatment; + @ManyToOne(() => EmrPatient, { onDelete: "NO ACTION" }) @JoinColumn() patient: EmrPatient; diff --git a/src/entity/emr/emr_registration_treatment.ts b/src/entity/emr/emr_registration_treatment.ts new file mode 100644 index 0000000..2e4afbb --- /dev/null +++ b/src/entity/emr/emr_registration_treatment.ts @@ -0,0 +1,69 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + ManyToOne, + OneToOne, + JoinColumn, +} from "typeorm"; + +import { EmrRegistration } from "./emr_registration"; +import { Room } from "../room"; +import { User } from "../users"; +import { TreatmentPlanSession } from "../treatment/treatment_plan_session"; +import { EmrPatient } from "./emr_patient"; + +@Entity("emr_registration_treatment", { schema: "emr" }) +export class EmrRegistrationTreatment { + @PrimaryGeneratedColumn("uuid") + id: string; + + @OneToOne(() => EmrRegistration, (reg) => reg.treatment, { onDelete: "CASCADE" }) + @JoinColumn() + registration: EmrRegistration; + + @ManyToOne(() => TreatmentPlanSession, { onDelete: "SET NULL", nullable: true }) + @JoinColumn() + treatment_plan_session: TreatmentPlanSession; + + @ManyToOne(() => Room, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn() + room: Room; + + @ManyToOne(() => User, { onDelete: "NO ACTION", nullable: true }) + @JoinColumn() + doctor: User; + + @Column({ nullable: true, length: 64 }) + registration_status: string; + + @Column({ nullable: true, length: 256 }) + registration_number: string; + + @Column({ type: "date", nullable: true }) + visit_date: 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/emr/emr_soap_notes.ts b/src/entity/emr/emr_soap_notes.ts index 8b70b13..fd92bac 100644 --- a/src/entity/emr/emr_soap_notes.ts +++ b/src/entity/emr/emr_soap_notes.ts @@ -45,6 +45,9 @@ export class EmrSoapNotes { @Column({ nullable: true, type: "text" }) plan: string | null; + @Column({ nullable: false, type: "boolean", default: false }) + tbak: boolean; + @CreateDateColumn() created_at: Date; diff --git a/src/entity/treatment/treatment_plan.ts b/src/entity/treatment/treatment_plan.ts new file mode 100644 index 0000000..f1eeb70 --- /dev/null +++ b/src/entity/treatment/treatment_plan.ts @@ -0,0 +1,89 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn, OneToMany } from "typeorm"; +import { EmrPatient } from "../emr/emr_patient"; +import { User } from "../users"; +import { EmrRegistration } from "../emr/emr_registration"; +import { TreatmentPlanSession } from "./treatment_plan_session"; + +export enum TreatmentIntervalType { + DAY = "day", + WEEK = "week", + MONTH = "month", + CUSTOM = "custom" +} + +export enum TreatmentStatus { + ACTIVE = "active", + COMPLETED = "completed", + CANCELLED = "cancelled" +} + +@Entity("treatment_plans", { schema: "emr" }) +export class TreatmentPlan { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => EmrPatient, { onDelete: "NO ACTION" }) + @JoinColumn() + patient: EmrPatient; + + @ManyToOne(() => EmrRegistration, { onDelete: "SET NULL", nullable: true }) + @JoinColumn() + registration: EmrRegistration; + + @ManyToOne(() => User, { onDelete: "SET NULL", nullable: true }) + @JoinColumn() + doctor: User; + + @Column({ nullable: true, length: 256 }) + treatment_type: string; + + @Column({ type: "date", nullable: false }) + start_date: Date; + + @Column({ type: "int", nullable: false }) + sessions_count: number; + + @Column({ + type: "enum", + enum: TreatmentIntervalType, + default: TreatmentIntervalType.WEEK, + }) + interval_type: TreatmentIntervalType; + + @Column({ type: "int", nullable: true }) + interval_value: number; + + @Column({ type: "jsonb", nullable: true }) + weekdays: number[]; + + @Column({ + type: "enum", + enum: TreatmentStatus, + default: TreatmentStatus.ACTIVE, + }) + status: TreatmentStatus; + + @OneToMany(() => TreatmentPlanSession, (session) => session.treatment_plan, { cascade: true }) + sessions: TreatmentPlanSession[]; + + @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/treatment/treatment_plan_session.ts b/src/entity/treatment/treatment_plan_session.ts new file mode 100644 index 0000000..614c22a --- /dev/null +++ b/src/entity/treatment/treatment_plan_session.ts @@ -0,0 +1,47 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { TreatmentPlan } from "./treatment_plan"; +import { TreatmentSessionStatus } from "../../types/treatment_session" + +@Entity("treatment_plan_sessions", { schema: "emr" }) +export class TreatmentPlanSession { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => TreatmentPlan, (plan) => plan.sessions, { onDelete: "CASCADE" }) + @JoinColumn({ name: "treatment_plan_id" }) + treatment_plan: TreatmentPlan; + + @Column({ type: "int", nullable: false }) + session_no: number; + + @Column({ type: "date", nullable: false }) + planned_date: Date; + + @Column({ + type: "enum", + enum: TreatmentSessionStatus, + default: TreatmentSessionStatus.PLANNED, + }) + status: TreatmentSessionStatus; + + @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/users.ts b/src/entity/users.ts index f81cb8a..9f9eacb 100644 --- a/src/entity/users.ts +++ b/src/entity/users.ts @@ -29,7 +29,7 @@ export class User { password: string; @Column({ - nullable: false, + nullable: true, unique: false, length: 64, }) diff --git a/src/schema/emr.ts b/src/schema/emr.ts index f3666e1..de91ff6 100644 --- a/src/schema/emr.ts +++ b/src/schema/emr.ts @@ -49,6 +49,9 @@ export * from "../entity/emr/emr_soap_notes"; export * from "../entity/emr/emr_surgery_schedules"; export * from "../entity/emr/emr_odontogram"; export * from "../entity/emr/emr_odontogram_teeth"; +export * from "../entity/treatment/treatment_plan"; +export * from "../entity/treatment/treatment_plan_session"; +export * from "../entity/emr/emr_registration_treatment"; export * from "../types/registration_type"; export * from "../types/registration_status"; @@ -59,3 +62,4 @@ export * from "../types/laboratory_order_status"; export * from "../enum/consciousness"; export * from "../types/patient_category"; export * from "../types/citizen"; +export * from "../types/treatment_session"; diff --git a/src/schema/public.ts b/src/schema/public.ts index a5fd1c7..1d8f9c7 100644 --- a/src/schema/public.ts +++ b/src/schema/public.ts @@ -70,3 +70,4 @@ export * from "../types/status"; export * from "../types/email"; export * from "../types/telegram"; export * from "../types/specialist_form"; +export * from "../types/diagnosis_type"; diff --git a/src/types/diagnosis_type.ts b/src/types/diagnosis_type.ts new file mode 100644 index 0000000..f1bd1b9 --- /dev/null +++ b/src/types/diagnosis_type.ts @@ -0,0 +1,8 @@ +export enum DiagnosisType { + MATERNITY = "maternity", + SURGERY = "surgery", + MEDICINE = "medicine", + TRAFFIC_ACCIDENT = "traffic_accident", + VIOLENCE = "violence", + OTHER = "other", +} diff --git a/src/types/registration_type.ts b/src/types/registration_type.ts index c1de416..26a9fe0 100644 --- a/src/types/registration_type.ts +++ b/src/types/registration_type.ts @@ -7,4 +7,5 @@ export enum RegistrationType { INPATIENT = "inpatient", // Rawat inap EMERGENCY = "emergency", // Gawat darurat HEMODIALYSIS = "hemodialysis", // Hemodialysis + TREATMENT = "treatment", // Treatment } diff --git a/src/types/treatment_session.ts b/src/types/treatment_session.ts new file mode 100644 index 0000000..211bdee --- /dev/null +++ b/src/types/treatment_session.ts @@ -0,0 +1,17 @@ +/** + * Status untuk sesi rencana perawatan (treatment plan session status). + * Planned: sesi perawatan telah dijadwalkan + * Arrived: pasien telah tiba untuk sesi perawatan + * Ongoing: sesi perawatan sedang berlangsung + * Completed: sesi perawatan telah selesai + * Missed: pasien tidak hadir pada sesi perawatan (terlewat) + * Rescheduled: sesi perawatan dijadwalkan ulang + */ +export enum TreatmentSessionStatus { + PLANNED = "planned", + ARRIVED = "arrived", + ONGOING = "ongoing", + COMPLETED = "completed", + MISSED = "missed", + RESCHEDULED = "rescheduled" +} \ No newline at end of file