From a671969f4799fd8de35cab666256b4886cca7a49 Mon Sep 17 00:00:00 2001 From: wayanrivan Date: Thu, 28 May 2026 15:24:05 +0700 Subject: [PATCH 1/7] uodate --- src/entity/users.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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, }) From 9867a053a567d3b2b9af179cc048cf0b1a176c65 Mon Sep 17 00:00:00 2001 From: avicenan Date: Fri, 29 May 2026 00:04:17 +0900 Subject: [PATCH 2/7] feat(diagnosis): add new column of diagnosis type --- src/entity/diagnosis.ts | 8 ++++++++ src/schema/public.ts | 1 + src/types/diagnosis_type.ts | 8 ++++++++ 3 files changed, 17 insertions(+) create mode 100644 src/types/diagnosis_type.ts 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/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", +} From 9d6aabacec80406ccb50de4580d423879efb42e2 Mon Sep 17 00:00:00 2001 From: avicenan Date: Fri, 29 May 2026 11:08:09 +0900 Subject: [PATCH 3/7] feat(treatment): add new modules of treatment --- src/entity/emr/emr_registration.ts | 4 + src/entity/emr/emr_registration_treatment.ts | 69 ++++++++++++++ src/entity/treatment/treatment_plan.ts | 89 +++++++++++++++++++ .../treatment/treatment_plan_session.ts | 55 ++++++++++++ src/schema/emr.ts | 3 + src/types/registration_type.ts | 1 + 6 files changed, 221 insertions(+) create mode 100644 src/entity/emr/emr_registration_treatment.ts create mode 100644 src/entity/treatment/treatment_plan.ts create mode 100644 src/entity/treatment/treatment_plan_session.ts 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/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..41da6a6 --- /dev/null +++ b/src/entity/treatment/treatment_plan_session.ts @@ -0,0 +1,55 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { TreatmentPlan } from "./treatment_plan"; + +export enum TreatmentSessionStatus { + PLANNED = "planned", + ARRIVED = "arrived", + IN_PROGRESS = "in_progress", + DONE = "done", + MISSED = "missed", + RESCHEDULED = "rescheduled" +} + +@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/schema/emr.ts b/src/schema/emr.ts index f3666e1..ac0e493 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"; 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 } From f2c623bc14e57ae719f68f602881428290a73d9a Mon Sep 17 00:00:00 2001 From: avicenan Date: Fri, 29 May 2026 11:44:55 +0900 Subject: [PATCH 4/7] fix treatment --- src/entity/treatment/treatment_plan_session.ts | 10 +--------- src/schema/emr.ts | 1 + src/types/treatment_session.ts | 13 +++++++++++++ 3 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 src/types/treatment_session.ts diff --git a/src/entity/treatment/treatment_plan_session.ts b/src/entity/treatment/treatment_plan_session.ts index 41da6a6..614c22a 100644 --- a/src/entity/treatment/treatment_plan_session.ts +++ b/src/entity/treatment/treatment_plan_session.ts @@ -1,14 +1,6 @@ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; import { TreatmentPlan } from "./treatment_plan"; - -export enum TreatmentSessionStatus { - PLANNED = "planned", - ARRIVED = "arrived", - IN_PROGRESS = "in_progress", - DONE = "done", - MISSED = "missed", - RESCHEDULED = "rescheduled" -} +import { TreatmentSessionStatus } from "../../types/treatment_session" @Entity("treatment_plan_sessions", { schema: "emr" }) export class TreatmentPlanSession { diff --git a/src/schema/emr.ts b/src/schema/emr.ts index ac0e493..de91ff6 100644 --- a/src/schema/emr.ts +++ b/src/schema/emr.ts @@ -62,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/types/treatment_session.ts b/src/types/treatment_session.ts new file mode 100644 index 0000000..5f9288c --- /dev/null +++ b/src/types/treatment_session.ts @@ -0,0 +1,13 @@ +/** + * Planned kategori pendaftaran pasien. + * Timoroan: pasien timor leste + * Estranjeiru: pasien asing + */ +export enum TreatmentSessionStatus { + PLANNED = "planned", + ARRIVED = "arrived", + IN_PROGRESS = "in_progress", + DONE = "done", + MISSED = "missed", + RESCHEDULED = "rescheduled" +} \ No newline at end of file From 3fe28f3b33bcef8fafaedc71415a7f97eb039d29 Mon Sep 17 00:00:00 2001 From: wayanrivan Date: Fri, 29 May 2026 11:16:55 +0700 Subject: [PATCH 5/7] update --- src/entity/emr/emr_patient_education.ts | 3 +++ 1 file changed, 3 insertions(+) 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; From 67a3889d42cbb999c6256a9453fea8bf7d5f00da Mon Sep 17 00:00:00 2001 From: avicenan Date: Fri, 29 May 2026 14:19:32 +0900 Subject: [PATCH 6/7] fix treatment plan session status enum --- src/types/treatment_session.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/types/treatment_session.ts b/src/types/treatment_session.ts index 5f9288c..211bdee 100644 --- a/src/types/treatment_session.ts +++ b/src/types/treatment_session.ts @@ -1,13 +1,17 @@ /** - * Planned kategori pendaftaran pasien. - * Timoroan: pasien timor leste - * Estranjeiru: pasien asing + * 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", - IN_PROGRESS = "in_progress", - DONE = "done", + ONGOING = "ongoing", + COMPLETED = "completed", MISSED = "missed", RESCHEDULED = "rescheduled" } \ No newline at end of file From 85c96521af5228d5e0ceaf8d5aab7bb77cf4471c Mon Sep 17 00:00:00 2001 From: wayanrivan Date: Fri, 29 May 2026 14:01:19 +0700 Subject: [PATCH 7/7] update: add tbak column to emr_soap_notes --- src/entity/emr/emr_soap_notes.ts | 3 +++ 1 file changed, 3 insertions(+) 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;