diff --git a/.gitignore b/.gitignore index 7800ac94..4c10eb38 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,8 @@ go.work.sum # env file .env config.yml +Dockerfile-main-api +Dockerfile-sync-api **/atlas.hcl !**/atlas.hcl.example diff --git a/Dockerfile-main-api-example b/Dockerfile-main-api-example new file mode 100644 index 00000000..cb8839b9 --- /dev/null +++ b/Dockerfile-main-api-example @@ -0,0 +1,14 @@ +FROM golang:1.24.10 AS builder +WORKDIR /src +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/main-api/main-api ./cmd/main-api/main.go + +FROM alpine:latest +WORKDIR /app +COPY --from=builder /src/assets . +COPY --from=builder /src/cmd/main-api/main-api . +COPY --from=builder /src/cmd/main-api/config.yml . +EXPOSE 8010 +CMD ["./main-api"] diff --git a/Dockerfile-sync-api-example b/Dockerfile-sync-api-example new file mode 100644 index 00000000..5b32d522 --- /dev/null +++ b/Dockerfile-sync-api-example @@ -0,0 +1,14 @@ +FROM golang:1.24.10 AS builder +WORKDIR /src +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/simgos-sync-api/simgos-sync-api ./cmd/simgos-sync-api/main.go + +FROM alpine:latest +WORKDIR /app +COPY --from=builder /src/assets . +COPY --from=builder /src/cmd/simgos-sync-api/simgos-sync-api . +COPY --from=builder /src/cmd/simgos-sync-api/config.yml . +EXPOSE 8011 +CMD ["./simgos-sync-api"] diff --git a/assets/docs/screening-form-a.html b/assets/docs/screening-form-a.html new file mode 100644 index 00000000..4f34b876 --- /dev/null +++ b/assets/docs/screening-form-a.html @@ -0,0 +1,167 @@ + + + + + + + + + +
+ Tanggal Terbit : {{ .IssuedDate }} +
+ + + + + + + + + + + + + + + + + + +
No. RM:{{ .MedicalRecord }}
Nama:{{ .Name }}
Tanggal Lahir:{{ .BirthDate }}
+ +
+

+ FORM A +

+ +
+

Kajian Awal Medis:

+ + + {{ if gt (len .EarlyMedic) 0 }} + {{ range .EarlyMedic }} + + + + {{ end }} + {{ else }} + + + + {{ end }} + +
+ ☑ {{ . }} +
+
+ +
+

ASSESMEN:

+ + + + +
+ {{ .Assessment }} +
+
+ +
+

IDENTIFIKASI MASALAH:

+ + {{ if gt (len .ProblemIdentification) 0 }} + {{ range .ProblemIdentification }} + + + + {{ end }} + {{ else }} + + + + {{ end }} + +
+ ☑ {{ . }} +
+
+ +
+

PERENCANAAN:

+ + + + +
+ {{ .Planning }} +
+
+ + + + + + + + + + + +
+ {{ .Date }}
+
+ ({{ .Employee_Name }}) +
+ +
+ + + \ No newline at end of file diff --git a/assets/docs/screening-form-b.html b/assets/docs/screening-form-b.html new file mode 100644 index 00000000..9abc94ce --- /dev/null +++ b/assets/docs/screening-form-b.html @@ -0,0 +1,109 @@ + + + + + + + + + +
+ Tanggal Terbit : {{ .IssuedDate }} +
+ + + + + + + + + + + + + + + + + + +
No. RM:{{ .MedicalRecord }}
Nama:{{ .Name }}
Tanggal Lahir:{{ .BirthDate }}
+ + + + + + + + + + + {{ range .FormB }} + + + + + + + + + {{ end }} + +
NOTanggal/jam + Implementasi, Monitoring, Fasilitasi, koordinasi, komunikasi dan kolaborasi, + advokasi, hasil pelayanan, Terminasi + MPP
{{ .Number }}{{ .Date }} + {{ .Value }} + + {{ .Employee_Name }} +
+ +
+ + + \ No newline at end of file diff --git a/assets/docs/therapy-protocol-1.html b/assets/docs/therapy-protocol-1.html new file mode 100644 index 00000000..1e3949d8 --- /dev/null +++ b/assets/docs/therapy-protocol-1.html @@ -0,0 +1,312 @@ + + + + + General Consent + + + + + + + + + + +
+ logo + +
+ PEMERINTAH PROVINSI JAWA TIMUR +
+
+ RUMAH SAKIT UMUM DAERAH Dr. SAIFUL ANWAR +
+
+ TERAKREDITASI KARS VERSI 2012 TINGKAT PARIPURNA +
+
+ Jl. Jaksa Agung Suprapto No. 2 MALANG 65111 +
+
Telp. (0341) 362101, Fax. (0341) 362110
+
Email: rsu-drsaifulanwar@jatimprov.go.id
+
Website: www.rsudsaifulanwar.jatimprov.go.id
+
+ logo +
+ +
+ +
+

+ Protokol Terapi +

+

Layanan Kedokteran Fisik dan Rehabilitasi +

+
+Terapi Ke

+{{ .Repalcable }} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ No RM + {{ .Repalcable }}
+ Nama Pasien + {{ .Repalcable }}
+ Tanggal Lahir + {{ .Repalcable }}
+ Diagnosa + {{ .Repalcable }}
+ Permintaan Terapi + {{ .Repalcable }}
+ Frekuensi Terapi + + 2 x Per Minggu       + Evaluasi: 1 Bulan +
+ Target Terapi + {{ .Repalcable }}
+ Waktu Mencapai Target + {{ .Repalcable }}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ NO + + Tanggal + + Dokter + + Fisioterapi + + Terapi Wicara + + Okupansi Terapi + + Ortotik Prostetik + + PSM + + TTD Pasien +
+ 1 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ 2 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ 3 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ 4 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ 5 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ 6 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ 7 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ 8 + {{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}{{ .Repalcable }}
+ + + + + + + + + + + +
+ Evaluasi + {{ .Repalcable }}
+ Rencana Selanjutnya + {{ .Repalcable }}
+ + + + + + + + + + + +
+ Malang,
+ Cap dan TTD Dr. SpKFR +
+ (........................................................) +
+ +
+ + + \ No newline at end of file diff --git a/assets/docs/therapy-protocol-2.html b/assets/docs/therapy-protocol-2.html new file mode 100644 index 00000000..b468bd43 --- /dev/null +++ b/assets/docs/therapy-protocol-2.html @@ -0,0 +1,217 @@ + + + + + General Consent + + + + + + + + + +
+ logo + +
+ PEMERINTAH PROVINSI JAWA TIMUR +
+
+ RUMAH SAKIT UMUM DAERAH Dr. SAIFUL ANWAR +
+
+ TERAKREDITASI KARS VERSI 2012 TINGKAT PARIPURNA +
+
+ Jl. Jaksa Agung Suprapto No. 2 MALANG 65111 +
+
Telp. (0341) 362101, Fax. (0341) 362110
+
Email: rsu-drsaifulanwar@jatimprov.go.id
+
Website: www.rsudsaifulanwar.jatimprov.go.id
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ No RM: + {{ .Repalcable }}
+ Nama Pasien + {{ .Repalcable }}
+ Diagnosa + {{ .Repalcable }}
+ Permintaan Terapi + {{ .Repalcable }}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ PELAKSANAAN PROGRAM + + Tanggal + + TTD +
+ PASIEN + + DOKTER + + TERAPIS +
1. {{ .Repalcable }}{{ .Repalcable }}
2. {{ .Repalcable }}{{ .Repalcable }}
3. {{ .Repalcable }}{{ .Repalcable }}
4. {{ .Repalcable }}{{ .Repalcable }}
5. {{ .Repalcable }}{{ .Repalcable }}
6. {{ .Repalcable }}{{ .Repalcable }}
7. {{ .Repalcable }}{{ .Repalcable }}
8. {{ .Repalcable }}{{ .Repalcable }}
9. {{ .Repalcable }}{{ .Repalcable }}
10. {{ .Repalcable }}{{ .Repalcable }}
11. {{ .Repalcable }}{{ .Repalcable }}
12. {{ .Repalcable }}{{ .Repalcable }}
13. {{ .Repalcable }}{{ .Repalcable }}
14. {{ .Repalcable }}{{ .Repalcable }}
15. {{ .Repalcable }}{{ .Repalcable }}
16. {{ .Repalcable }}{{ .Repalcable }}
17. {{ .Repalcable }}{{ .Repalcable }}
18. {{ .Repalcable }}{{ .Repalcable }}
19. {{ .Repalcable }}{{ .Repalcable }}
20. {{ .Repalcable }}{{ .Repalcable }}
+ + + + + + + + + + + + + +
+ Tempat & Tanggal
+ Cap dan TTD Dr. SpKFR +
+ (.................................................) +
+ +
+ + + \ No newline at end of file diff --git a/assets/docs/therapy-protocol-3.html b/assets/docs/therapy-protocol-3.html new file mode 100644 index 00000000..6623fb9e --- /dev/null +++ b/assets/docs/therapy-protocol-3.html @@ -0,0 +1,241 @@ + + + + + General Consent + + + + + + + + + +
+ logo + +
+ PEMERINTAH PROVINSI JAWA TIMUR +
+
+ RUMAH SAKIT UMUM DAERAH Dr. SAIFUL ANWAR +
+
+ TERAKREDITASI KARS VERSI 2012 TINGKAT PARIPURNA +
+
+ Jl. Jaksa Agung Suprapto No. 2 MALANG 65111 +
+
Telp. (0341) 362101, Fax. (0341) 362110
+
Email: rsu-drsaifulanwar@jatimprov.go.id
+
Website: www.rsudsaifulanwar.jatimprov.go.id
+
+ +
+ +
+

+ Lembar Formulir Rawat Jalan
Layanan Kedokteran Fisik dan Rehabilitasi +

+
+ +
+ + + + + + + +
I. Identitas PasienNo. RM: {{ .Repalcable }}
+ + + + + + + + + + + + + + + + + + + + + + + +
+ Nama Pasien + : {{ .Repalcable }}
+ Tanggal Lahir + : {{ .Repalcable }}
+ Aalamat + : {{ .Repalcable }}
+ Telp / HP + : {{ .Repalcable }}
+ Hubungan dengan Tertanggung + : + ☑ Suami / Istri +    + ▢ Anak +
+
+ + +
+ + + + +
II. Diisi oleh Dokter SpKFR
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Tanggal Pelayanan + : {{ .Repalcable }}
+ Anamnesa + : {{ .Repalcable }}
+ Pemeriksaan Fisik dan Uji Fungsi + : {{ .Repalcable }}
+ Diagnosis Medis (ICD-10) + : {{ .Repalcable }}
+ Diagnosis Fungsi (ICD-10) + : {{ .Repalcable }}
+ Pemeriksaan Penunjang + : {{ .Repalcable }}
+ Tata Laksana KFR (ICD 9 CM) + : {{ .Repalcable }}
+ Anjuran + : {{ .Repalcable }}
+ Evaluasi + : {{ .Repalcable }}
+ Suspek Penyakit Akibat Kerja + : + ☑ Ya   ( {{ .Repalcable }} ) + +
+ ▢ Tidak +
+
+ + + + + + + + + + + +
+ TTD Pasien + + Tempat & Tanggal
+ Cap dan TTD Dr. SpKFR +
+ (........................................................) + + (........................................................) +
+ +
+ + + \ No newline at end of file diff --git a/cmd/main-api/config.yml-example b/cmd/main-api/config.yml-example index 3423b5d1..f5f03f10 100644 --- a/cmd/main-api/config.yml-example +++ b/cmd/main-api/config.yml-example @@ -66,9 +66,11 @@ bpjsCfg: baseUrl: syncUrlCfg: - enable: false - host: - prefix: new-to-old + enable: false + targetHost: + prefix: new-to-old + source: old-app + secretKey: new-world-order!! docsCfg: path: ../../assets/docs/ \ No newline at end of file diff --git a/cmd/main-migration/migrations/20251202064000.sql b/cmd/main-migration/migrations/20251202064000.sql new file mode 100644 index 00000000..7fed5f08 --- /dev/null +++ b/cmd/main-migration/migrations/20251202064000.sql @@ -0,0 +1,2 @@ +-- Modify "Soapi" table +ALTER TABLE "public"."Soapi" ALTER COLUMN "TypeCode" TYPE character varying(15); diff --git a/cmd/main-migration/migrations/20251202130629.sql b/cmd/main-migration/migrations/20251202130629.sql new file mode 100644 index 00000000..88b685fe --- /dev/null +++ b/cmd/main-migration/migrations/20251202130629.sql @@ -0,0 +1,101 @@ +-- Modify "Consultation" table +ALTER TABLE "public"."Consultation" ALTER COLUMN "DstUnit_Code" TYPE character varying(20); +-- Modify "ControlLetter" table +ALTER TABLE "public"."ControlLetter" ALTER COLUMN "Unit_Code" TYPE character varying(20), ALTER COLUMN "Specialist_Code" TYPE character varying(20), ALTER COLUMN "Subspecialist_Code" TYPE character varying(20); +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" ALTER COLUMN "Specialist_Code" TYPE character varying(20), ALTER COLUMN "Subspecialist_Code" TYPE character varying(20), ALTER COLUMN "Unit_Code" TYPE character varying(20); +-- Modify "Chemo" table +ALTER TABLE "public"."Chemo" ALTER COLUMN "SrcUnit_Code" TYPE character varying(20); +-- Modify "Installation" table +ALTER TABLE "public"."Installation" ALTER COLUMN "Code" TYPE character varying(20); +-- Modify "InternalReference" table +ALTER TABLE "public"."InternalReference" ALTER COLUMN "Unit_Code" TYPE character varying(20); +-- Modify "PracticeSchedule" table +ALTER TABLE "public"."PracticeSchedule" ALTER COLUMN "Unit_Code" TYPE character varying(20); +-- Create "DevicePackage" table +CREATE TABLE "public"."DevicePackage" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NOT NULL, + "Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_DevicePackage_Code" UNIQUE ("Code") +); +-- Create "DevicePackageItem" table +CREATE TABLE "public"."DevicePackageItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "DevicePackage_Code" character varying(20) NOT NULL, + "Device_Code" character varying(20) NOT NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_DevicePackageItem_Device" FOREIGN KEY ("Device_Code") REFERENCES "public"."Device" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_DevicePackageItem_DevicePackage" FOREIGN KEY ("DevicePackage_Code") REFERENCES "public"."DevicePackage" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MaterialPackage" table +CREATE TABLE "public"."MaterialPackage" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NOT NULL, + "Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_MaterialPackage_Code" UNIQUE ("Code") +); +-- Create "MaterialPackageItem" table +CREATE TABLE "public"."MaterialPackageItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "MaterialPackage_Code" character varying(20) NOT NULL, + "Material_Code" character varying(20) NOT NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_MaterialPackageItem_Material" FOREIGN KEY ("Material_Code") REFERENCES "public"."Material" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MaterialPackageItem_MaterialPackage" FOREIGN KEY ("MaterialPackage_Code") REFERENCES "public"."MaterialPackage" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Modify "Infra" table +ALTER TABLE "public"."Infra" ALTER COLUMN "Code" TYPE character varying(20), ALTER COLUMN "InfraGroup_Code" TYPE character varying(20), ALTER COLUMN "Parent_Code" TYPE character varying(20); +-- Modify "Specialist" table +ALTER TABLE "public"."Specialist" ALTER COLUMN "Code" TYPE character varying(20), ALTER COLUMN "Unit_Code" TYPE character varying(20); +-- Modify "Subspecialist" table +ALTER TABLE "public"."Subspecialist" ALTER COLUMN "Code" TYPE character varying(20), ALTER COLUMN "Specialist_Code" TYPE character varying(20); +-- Modify "Unit" table +ALTER TABLE "public"."Unit" ALTER COLUMN "Code" TYPE character varying(20), ALTER COLUMN "Installation_Code" TYPE character varying(20); +-- Create "ProcedureRoom" table +CREATE TABLE "public"."ProcedureRoom" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NULL, + "Infra_Code" character varying(20) NULL, + "Type_Code" character varying(10) NULL, + "Unit_Code" character varying(20) NULL, + "Specialist_Code" character varying(20) NULL, + "Subspecialist_Code" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_ProcedureRoom_Code" UNIQUE ("Code"), + CONSTRAINT "uni_ProcedureRoom_Infra_Code" UNIQUE ("Infra_Code"), + CONSTRAINT "fk_ProcedureRoom_Infra" FOREIGN KEY ("Infra_Code") REFERENCES "public"."Infra" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_ProcedureRoom_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_ProcedureRoom_Subspecialist" FOREIGN KEY ("Subspecialist_Code") REFERENCES "public"."Subspecialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_ProcedureRoom_Unit" FOREIGN KEY ("Unit_Code") REFERENCES "public"."Unit" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "ProcedureRoomOrder" table +CREATE TABLE "public"."ProcedureRoomOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Infra_Code" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_ProcedureRoomOrder_ProcedureRoom" FOREIGN KEY ("Infra_Code") REFERENCES "public"."ProcedureRoom" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Drop "Room" table +DROP TABLE "public"."Room"; diff --git a/cmd/main-migration/migrations/20251202160848.sql b/cmd/main-migration/migrations/20251202160848.sql new file mode 100644 index 00000000..8d77fe04 --- /dev/null +++ b/cmd/main-migration/migrations/20251202160848.sql @@ -0,0 +1,2 @@ +-- Modify "ProcedureRoomOrder" table +ALTER TABLE "public"."ProcedureRoomOrder" ADD COLUMN "MaterialPackage_Code" character varying(20) NULL, ADD CONSTRAINT "fk_ProcedureRoomOrder_MaterialPackage" FOREIGN KEY ("MaterialPackage_Code") REFERENCES "public"."MaterialPackage" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251202180207.sql b/cmd/main-migration/migrations/20251202180207.sql new file mode 100644 index 00000000..32c5b1dc --- /dev/null +++ b/cmd/main-migration/migrations/20251202180207.sql @@ -0,0 +1,2 @@ +-- Modify "ProcedureRoomOrder" table +ALTER TABLE "public"."ProcedureRoomOrder" ADD COLUMN "Status_Code" character varying(20) NULL; diff --git a/cmd/main-migration/migrations/20251202231005.sql b/cmd/main-migration/migrations/20251202231005.sql new file mode 100644 index 00000000..65fe436a --- /dev/null +++ b/cmd/main-migration/migrations/20251202231005.sql @@ -0,0 +1,14 @@ +-- Modify "MaterialPackageItem" table +ALTER TABLE "public"."MaterialPackageItem" ADD COLUMN "Count" integer NULL; +-- Create "ProcedureRoomOrderItem" table +CREATE TABLE "public"."ProcedureRoomOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "ProcedureRoomOrder_Id" bigint NULL, + "ProcedureRoom_Code" character varying(20) NULL, + "Note" character varying(255) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_ProcedureRoomOrderItem_ProcedureRoom" FOREIGN KEY ("ProcedureRoom_Code") REFERENCES "public"."ProcedureRoom" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251203205052.sql b/cmd/main-migration/migrations/20251203205052.sql new file mode 100644 index 00000000..831497a2 --- /dev/null +++ b/cmd/main-migration/migrations/20251203205052.sql @@ -0,0 +1,4 @@ +-- Modify "ProcedureRoomOrder" table +ALTER TABLE "public"."ProcedureRoomOrder" DROP COLUMN "Infra_Code"; +-- Modify "ProcedureRoomOrderItem" table +ALTER TABLE "public"."ProcedureRoomOrderItem" ADD CONSTRAINT "fk_ProcedureRoomOrderItem_ProcedureRoomOrder" FOREIGN KEY ("ProcedureRoomOrder_Id") REFERENCES "public"."ProcedureRoomOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251205073858.sql b/cmd/main-migration/migrations/20251205073858.sql new file mode 100644 index 00000000..96f9200a --- /dev/null +++ b/cmd/main-migration/migrations/20251205073858.sql @@ -0,0 +1,23 @@ +-- Modify "Chemo" table +ALTER TABLE "public"."Chemo" ADD COLUMN "Doctor_Code" character varying(20) NULL, ADD COLUMN "NextChemoDate" timestamptz NULL, ADD CONSTRAINT "fk_Chemo_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "Encounter_Id" to "Chemo_Id" +ALTER TABLE "public"."ChemoProtocol" RENAME COLUMN "Encounter_Id" TO "Chemo_Id"; +-- Modify "ChemoProtocol" table +ALTER TABLE "public"."ChemoProtocol" DROP CONSTRAINT "fk_ChemoProtocol_Encounter", ALTER COLUMN "DurationUnit_Code" TYPE text, ADD COLUMN "Interval" bigint NULL, ADD COLUMN "Cycle" bigint NULL, ADD COLUMN "Series" integer NULL, ADD COLUMN "Status_Code" text NULL, ADD CONSTRAINT "fk_ChemoProtocol_Chemo" FOREIGN KEY ("Chemo_Id") REFERENCES "public"."Chemo" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Create "ChemoPlan" table +CREATE TABLE "public"."ChemoPlan" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Parent_Id" bigint NULL, + "Protocol_Id" bigint NULL, + "SeriesNumber" integer NULL, + "CycleNumber" bigint NULL, + "PlanDate" timestamptz NULL, + "RealizationDate" timestamptz NULL, + "Notes" text NULL, + "Status" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_ChemoPlan_Protocol" FOREIGN KEY ("Protocol_Id") REFERENCES "public"."ChemoProtocol" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251205211957.sql b/cmd/main-migration/migrations/20251205211957.sql new file mode 100644 index 00000000..99677edd --- /dev/null +++ b/cmd/main-migration/migrations/20251205211957.sql @@ -0,0 +1,2 @@ +-- Modify "ChemoPlan" table +ALTER TABLE "public"."ChemoPlan" DROP CONSTRAINT "fk_ChemoPlan_Protocol", ADD CONSTRAINT "fk_ChemoProtocol_ChemoPlans" FOREIGN KEY ("Protocol_Id") REFERENCES "public"."ChemoProtocol" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251205214433.sql b/cmd/main-migration/migrations/20251205214433.sql new file mode 100644 index 00000000..34343308 --- /dev/null +++ b/cmd/main-migration/migrations/20251205214433.sql @@ -0,0 +1,2 @@ +-- Modify "ChemoProtocol" table +ALTER TABLE "public"."ChemoProtocol" ADD COLUMN "Patient_Id" bigint NULL; diff --git a/cmd/main-migration/migrations/20251205221124.sql b/cmd/main-migration/migrations/20251205221124.sql new file mode 100644 index 00000000..3eab115a --- /dev/null +++ b/cmd/main-migration/migrations/20251205221124.sql @@ -0,0 +1,2 @@ +-- Modify "ChemoProtocol" table +ALTER TABLE "public"."ChemoProtocol" ADD COLUMN "VerifiedAt" timestamptz NULL, ADD COLUMN "VerifiedBy_User_Id" bigint NULL, ADD CONSTRAINT "fk_ChemoProtocol_VerifiedBy" FOREIGN KEY ("VerifiedBy_User_Id") REFERENCES "public"."User" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251206021053.sql b/cmd/main-migration/migrations/20251206021053.sql new file mode 100644 index 00000000..03ab3bfb --- /dev/null +++ b/cmd/main-migration/migrations/20251206021053.sql @@ -0,0 +1,26 @@ +-- Create "ProcedureReport" table +CREATE TABLE "public"."ProcedureReport" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Date" timestamptz NOT NULL, + "Doctor_Code" character varying(10) NULL, + "Operator_Name" text NULL, + "Assistant_Name" text NULL, + "Instrumentor_Name" text NULL, + "Diagnose" character varying(1024) NULL, + "Nurse_Name" character varying(10) NULL, + "Anesthesia_Doctor_Code" character varying(10) NULL, + "Anesthesia_Nurse_Name" text NULL, + "ProcedureValue" text NULL, + "ExecutionValue" text NULL, + "Type_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_ProcedureReport_Anesthesia_Doctor" FOREIGN KEY ("Anesthesia_Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_ProcedureReport_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_ProcedureReport_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Drop "ActionReport" table +DROP TABLE "public"."ActionReport"; diff --git a/cmd/main-migration/migrations/20251207020537.sql b/cmd/main-migration/migrations/20251207020537.sql new file mode 100644 index 00000000..14142cb0 --- /dev/null +++ b/cmd/main-migration/migrations/20251207020537.sql @@ -0,0 +1,22 @@ +-- Create "ApMcuOrder" table +CREATE TABLE "public"."ApMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "McuOrder_Id" smallint NULL, + "Substances" text NULL, + "Fictations" text NULL, + "Localization" text NULL, + "ClinicalDiagnoses" text NULL, + "Stadium" text NULL, + "ClinicalNotes" text NULL, + "PastHistory" text NULL, + "CurrentHistory" text NULL, + "PrevApMcu" text NULL, + "PrevApMcuNotes" text NULL, + "SupportingExams" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_ApMcuOrder_McuOrder_Id" UNIQUE ("McuOrder_Id"), + CONSTRAINT "fk_ApMcuOrder_McuOrder" FOREIGN KEY ("McuOrder_Id") REFERENCES "public"."McuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251207212015.sql b/cmd/main-migration/migrations/20251207212015.sql new file mode 100644 index 00000000..c551aa8c --- /dev/null +++ b/cmd/main-migration/migrations/20251207212015.sql @@ -0,0 +1,99 @@ +-- Modify "ApMcuOrder" table +ALTER TABLE "public"."ApMcuOrder" DROP COLUMN "McuOrder_Id", ADD COLUMN "Encounter_Id" bigint NULL, ADD COLUMN "Number" bigint NULL, ADD COLUMN "Doctor_Code" character varying(20) NULL, ADD CONSTRAINT "uni_ApMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), ADD CONSTRAINT "fk_ApMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_ApMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Create "CpMcuOrder" table +CREATE TABLE "public"."CpMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" bigint NULL, + "Doctor_Code" character varying(20) NULL, + "UrgencyLevel_Code" character varying(15) NOT NULL, + "OtherNotes" text NULL, + "ExamScheduleDate" timestamptz NULL, + "Resume" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_CpMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), + CONSTRAINT "fk_CpMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_CpMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "CpMcuOrderItem" table +CREATE TABLE "public"."CpMcuOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "CpMcuOrder_Id" bigint NULL, + "McuSrc_Code" character varying(20) NULL, + "Note" character varying(1024) NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_CpMcuOrderItem_CpMcuOrder" FOREIGN KEY ("CpMcuOrder_Id") REFERENCES "public"."CpMcuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_CpMcuOrderItem_McuSrc" FOREIGN KEY ("McuSrc_Code") REFERENCES "public"."McuSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MicroMcuOrder" table +CREATE TABLE "public"."MicroMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" bigint NULL, + "Doctor_Code" character varying(20) NULL, + "Stage_Code" character varying(10) NOT NULL, + "AxillaryTemp" numeric NULL, + "OtherNotes" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_MicroMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), + CONSTRAINT "fk_MicroMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MicroMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MicroMcuOrderItem" table +CREATE TABLE "public"."MicroMcuOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "MicroMcuOrder_Id" bigint NULL, + "McuSrc_Code" character varying(20) NULL, + "Note" character varying(1024) NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_MicroMcuOrderItem_McuSrc" FOREIGN KEY ("McuSrc_Code") REFERENCES "public"."McuSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MicroMcuOrderItem_MicroMcuOrder" FOREIGN KEY ("MicroMcuOrder_Id") REFERENCES "public"."MicroMcuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "RadiologyMcuOrder" table +CREATE TABLE "public"."RadiologyMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" bigint NULL, + "Doctor_Code" character varying(20) NULL, + "ClinicalNotes" text NULL, + "OtherNotes" text NULL, + "Resume" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_RadiologyMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), + CONSTRAINT "fk_RadiologyMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_RadiologyMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "RadiologyMcuOrderItem" table +CREATE TABLE "public"."RadiologyMcuOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "RadiologyMcuOrder_Id" bigint NULL, + "McuSrc_Code" character varying(20) NULL, + "Note" character varying(1024) NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_RadiologyMcuOrderItem_McuSrc" FOREIGN KEY ("McuSrc_Code") REFERENCES "public"."McuSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_RadiologyMcuOrderItem_RadiologyMcuOrder" FOREIGN KEY ("RadiologyMcuOrder_Id") REFERENCES "public"."RadiologyMcuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251207221222.sql b/cmd/main-migration/migrations/20251207221222.sql new file mode 100644 index 00000000..3c806128 --- /dev/null +++ b/cmd/main-migration/migrations/20251207221222.sql @@ -0,0 +1,8 @@ +-- Modify "ApMcuOrder" table +ALTER TABLE "public"."ApMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; +-- Modify "CpMcuOrder" table +ALTER TABLE "public"."CpMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; +-- Modify "MicroMcuOrder" table +ALTER TABLE "public"."MicroMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; +-- Modify "RadiologyMcuOrder" table +ALTER TABLE "public"."RadiologyMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; diff --git a/cmd/main-migration/migrations/20251209022744.sql b/cmd/main-migration/migrations/20251209022744.sql new file mode 100644 index 00000000..a8a18481 --- /dev/null +++ b/cmd/main-migration/migrations/20251209022744.sql @@ -0,0 +1,2 @@ +-- Modify "ChemoPlan" table +ALTER TABLE "public"."ChemoPlan" ADD COLUMN "Encounter_Id" bigint NULL, ADD CONSTRAINT "fk_ChemoPlan_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251209025908.sql b/cmd/main-migration/migrations/20251209025908.sql new file mode 100644 index 00000000..5a8522d7 --- /dev/null +++ b/cmd/main-migration/migrations/20251209025908.sql @@ -0,0 +1,2 @@ +-- Modify "Chemo" table +ALTER TABLE "public"."Chemo" ADD COLUMN "Class_Code" text NULL; diff --git a/cmd/main-migration/migrations/20251209030538.sql b/cmd/main-migration/migrations/20251209030538.sql new file mode 100644 index 00000000..4f0ad77f --- /dev/null +++ b/cmd/main-migration/migrations/20251209030538.sql @@ -0,0 +1,2 @@ +-- Modify "ProcedureReport" table +ALTER TABLE "public"."ProcedureReport" ALTER COLUMN "Nurse_Name" TYPE text; diff --git a/cmd/main-migration/migrations/20251209051742.sql b/cmd/main-migration/migrations/20251209051742.sql new file mode 100644 index 00000000..3bfa7734 --- /dev/null +++ b/cmd/main-migration/migrations/20251209051742.sql @@ -0,0 +1,2 @@ +-- Modify "ChemoPlan" table +ALTER TABLE "public"."ChemoPlan" ADD COLUMN "Reasons" text NULL; diff --git a/cmd/main-migration/migrations/20251209064304.sql b/cmd/main-migration/migrations/20251209064304.sql new file mode 100644 index 00000000..fc289e20 --- /dev/null +++ b/cmd/main-migration/migrations/20251209064304.sql @@ -0,0 +1,12 @@ +-- Create "Registration" table +CREATE TABLE "public"."Registration" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Employee_Id" bigint NULL, + "Installation_Code" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Registration_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Registration_Installation" FOREIGN KEY ("Installation_Code") REFERENCES "public"."Installation" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251209070128.sql b/cmd/main-migration/migrations/20251209070128.sql new file mode 100644 index 00000000..fb0caac3 --- /dev/null +++ b/cmd/main-migration/migrations/20251209070128.sql @@ -0,0 +1,2 @@ +-- Modify "Person" table +ALTER TABLE "public"."Person" ADD COLUMN "BirthPlace" text NULL; diff --git a/cmd/main-migration/migrations/20251209084929.sql b/cmd/main-migration/migrations/20251209084929.sql new file mode 100644 index 00000000..c67550ae --- /dev/null +++ b/cmd/main-migration/migrations/20251209084929.sql @@ -0,0 +1,14 @@ +-- Create "Registrator" table +CREATE TABLE "public"."Registrator" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Employee_Id" bigint NULL, + "Installation_Code" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Registrator_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Registrator_Installation" FOREIGN KEY ("Installation_Code") REFERENCES "public"."Installation" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Drop "Registration" table +DROP TABLE "public"."Registration"; diff --git a/cmd/main-migration/migrations/20251210145148.sql b/cmd/main-migration/migrations/20251210145148.sql new file mode 100644 index 00000000..6a37b2af --- /dev/null +++ b/cmd/main-migration/migrations/20251210145148.sql @@ -0,0 +1,2 @@ +-- Modify "User" table +ALTER TABLE "public"."User" ALTER COLUMN "Name" TYPE character varying(50); diff --git a/cmd/main-migration/migrations/20251211101547.sql b/cmd/main-migration/migrations/20251211101547.sql new file mode 100644 index 00000000..c24aab8d --- /dev/null +++ b/cmd/main-migration/migrations/20251211101547.sql @@ -0,0 +1,36 @@ +-- Modify "Specialist" table +ALTER TABLE "public"."Specialist" DROP COLUMN "Unit_Code"; +-- Rename a column from "SrcUnit_Code" to "Specialist_Code" +ALTER TABLE "public"."Chemo" RENAME COLUMN "SrcUnit_Code" TO "Specialist_Code"; +-- Modify "Chemo" table +ALTER TABLE "public"."Chemo" DROP CONSTRAINT "fk_Chemo_SrcUnit", ADD CONSTRAINT "fk_Chemo_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "Doctor" table +ALTER TABLE "public"."Doctor" DROP COLUMN "Unit_Code"; +-- Rename a column from "DstUnit_Code" to "Specialist_Code" +ALTER TABLE "public"."Consultation" RENAME COLUMN "DstUnit_Code" TO "Specialist_Code"; +-- Rename a column from "DstDoctor_Code" to "Doctor_Code" +ALTER TABLE "public"."Consultation" RENAME COLUMN "DstDoctor_Code" TO "Doctor_Code"; +-- Modify "Consultation" table +ALTER TABLE "public"."Consultation" DROP CONSTRAINT "fk_Consultation_DstDoctor", DROP CONSTRAINT "fk_Consultation_DstUnit", ADD CONSTRAINT "fk_Consultation_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_Consultation_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "Unit_Code" to "Specialist_Code" +ALTER TABLE "public"."InternalReference" RENAME COLUMN "Unit_Code" TO "Specialist_Code"; +-- Modify "InternalReference" table +ALTER TABLE "public"."InternalReference" DROP CONSTRAINT "fk_InternalReference_Unit", ADD CONSTRAINT "fk_InternalReference_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "Unit_Code" to "Specialist_Code" +ALTER TABLE "public"."Nurse" RENAME COLUMN "Unit_Code" TO "Specialist_Code"; +-- Modify "Nurse" table +ALTER TABLE "public"."Nurse" DROP CONSTRAINT "fk_Nurse_Unit", ADD CONSTRAINT "fk_Nurse_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "Unit_Code" to "Specialist_Code" +ALTER TABLE "public"."PracticeSchedule" RENAME COLUMN "Unit_Code" TO "Specialist_Code"; +-- Modify "PracticeSchedule" table +ALTER TABLE "public"."PracticeSchedule" DROP CONSTRAINT "fk_PracticeSchedule_Unit", ADD CONSTRAINT "fk_PracticeSchedule_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "ControlLetter" table +ALTER TABLE "public"."ControlLetter" DROP COLUMN "Unit_Code"; +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" DROP COLUMN "Unit_Code"; +-- Modify "ProcedureRoom" table +ALTER TABLE "public"."ProcedureRoom" DROP COLUMN "Unit_Code"; +-- Drop "UnitPosition" table +DROP TABLE "public"."UnitPosition"; +-- Drop "Unit" table +DROP TABLE "public"."Unit"; diff --git a/cmd/main-migration/migrations/20251211113942.sql b/cmd/main-migration/migrations/20251211113942.sql new file mode 100644 index 00000000..b357f487 --- /dev/null +++ b/cmd/main-migration/migrations/20251211113942.sql @@ -0,0 +1,4 @@ +-- Modify "Subspecialist" table +ALTER TABLE "public"."Subspecialist" ALTER COLUMN "Name" TYPE character varying(100); +-- Modify "Specialist" table +ALTER TABLE "public"."Specialist" ADD COLUMN "Installation_Code" character varying(20) NULL, ADD CONSTRAINT "fk_Specialist_Installation" FOREIGN KEY ("Installation_Code") REFERENCES "public"."Installation" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 871cc312..77699682 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:Ha8JZHXBp6W+fzzWOIT8TuDGwBAPu7d/JQa4hxKMCRw= +h1:bNByj2VsHOaJEMfbX3xRNdLNTeYIVgInihZwRFfBUpc= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -138,4 +138,28 @@ h1:Ha8JZHXBp6W+fzzWOIT8TuDGwBAPu7d/JQa4hxKMCRw= 20251201114751.sql h1:HM17diiPknfSHAmP+kJGP6GzToaPU9/NT+KQBpf3Jq0= 20251201114913.sql h1:gqucFgHFFLA6n/Rdz486cZH5xkaJuwefESLJMJLDue8= 20251202030445.sql h1:QWBVfTepT7DaXP5E0BYoxNM0JwKIQ2qIMXzI4kbz/qE= -20251202044430.sql h1:OC5NTh0Jf8NNLVTRIvNImPiaMqJfDWkksxWcKq3UjDE= +20251202044430.sql h1:4QZH9lz0GrQ9rzP1AJ+hJgGalNpp+8FCRckNK7xaTbU= +20251202064000.sql h1:/EN7sT1ol/91qW1aXWrzX+Mc3XOC/7f/LtfA0JRHpbg= +20251202130629.sql h1:9mvalqfhqGCdkcJepJDzHprU2xb0i5sYys1Htf62ioo= +20251202160848.sql h1:Kd2/TziKSMezrt4XgbjQcYvY/Lo9rX0qw7/Lz0/oyKk= +20251202180207.sql h1:IHmSMIO3ia+YV5GULixbdlV1joaUAWtnjQHPd8+HKiM= +20251202231005.sql h1:lua0KKoeBptSfs/6ehZE6Azo6YUlNkOJwGFyb1HQWkY= +20251203205052.sql h1:nk0VK2Uv4bHE3SBfHo/aevVZxtHzr7zAzvmMU8TCCtk= +20251205073858.sql h1:46qqXnArgJmzGE/WO7v7Ev8Jh7BudDiGbdANexq/5Dk= +20251205211957.sql h1:3fvtZ/mBWsTIXllXMFOuCLJsp4MivVP56dunehlU0yo= +20251205214433.sql h1:rn3++FEfX7ntcJcOmCEuOMnr27TZqH0KMGRppzFwFTc= +20251205221124.sql h1:CRruUvGZqlVDBmbQSVEl4wFm+uq30AurMMDI6sb8jxg= +20251206021053.sql h1:bpuEocu4lOhZ7oLuxd//22dzjfNgU2iaWEqSD1mVwoU= +20251207020537.sql h1:m6uh4NHVF3EKNTVMqOmuBSDFD9oCQk5mAwo05fT46G4= +20251207212015.sql h1:UPelYGTeUR6rm8mU8dfNzgRDEDun0UQ4tkgsaDljn30= +20251207221222.sql h1:bTfUCvCf2UPh+BA2IY2PHQafb9DwY9nhH5FRuMEHy+0= +20251209022744.sql h1:y5/PAiZH/fYCpDJpkQdNRJwWICHH2iNIwM1V+S1P6KA= +20251209025908.sql h1:p3kZA8kyEj+mQZSrdY3k2K1NojQzFJh/MlZJ0Oy6t/k= +20251209030538.sql h1:zltV6/Fu2zJW0/lVBl7MdnWuJcqNTUIRcqYYZ8Fi1wo= +20251209051742.sql h1:BBNSmWfkamWrcKdxWjPiBS9yJ8yyQQUQIj3kip53nuE= +20251209064304.sql h1:Xs73yQbuJvuQ0OnW1FAZpeytmUl/bGTlJFrwGOsTF4w= +20251209070128.sql h1:fPGE6xOV6uCiVOqnvwn2L/GsBbgp2wxgmZOhF3bSGGM= +20251209084929.sql h1:u4LPMvkGAH4RfGC2IlBTIm7T7paMHoBSvTQ0w5Br7d0= +20251210145148.sql h1:rejGrnTpaygxPv06v0vxMytF4rk1OJBXaw3ttSmidgc= +20251211101547.sql h1:+jT5yRCEsSRExzoawrqymS/I7lVfwUQQSgSzbxCxgRk= +20251211113942.sql h1:hRwiVZnXGzgUbqOk5TZ6ZHzGs1GebIFeIKkJNb+6+f0= diff --git a/cmd/simgos-sync-api/config.yml-example b/cmd/simgos-sync-api/config.yml-example index 98544958..96e4a6d2 100644 --- a/cmd/simgos-sync-api/config.yml-example +++ b/cmd/simgos-sync-api/config.yml-example @@ -34,4 +34,12 @@ langCfg: corsCfg: allowedOrigin: - allowedMethod: GET, POST, PUT, PATCH, DELETE, OPTIONS \ No newline at end of file + allowedMethod: GET, POST, PUT, PATCH, DELETE, OPTIONS + +syncPartnerCfg: + oldSource + oldSecretKey + oldHost + newSource + newSecretKey + newHost \ No newline at end of file diff --git a/cmd/simgos-sync-api/main.go b/cmd/simgos-sync-api/main.go index ddb3897d..fd201356 100644 --- a/cmd/simgos-sync-api/main.go +++ b/cmd/simgos-sync-api/main.go @@ -1,10 +1,10 @@ package main import ( - a "github.com/karincake/apem" - h "simrs-vx/internal/interface/simgos-sync-handler" + a "github.com/karincake/apem" + d "github.com/karincake/apem/db-gorm-pg" l "github.com/karincake/apem/logger-zerolog" diff --git a/cmd/simgos-sync-migration/migrations/20251201093443.sql b/cmd/simgos-sync-migration/migrations/20251201093443.sql new file mode 100644 index 00000000..1ecce17e --- /dev/null +++ b/cmd/simgos-sync-migration/migrations/20251201093443.sql @@ -0,0 +1,36 @@ +-- Create "SoapiLink" table +CREATE TABLE "public"."SoapiLink" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Simx_Id" bigint NULL, + "Simgos_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_SoapiLink_Simgos_Id" UNIQUE ("Simgos_Id"), + CONSTRAINT "uni_SoapiLink_Simx_Id" UNIQUE ("Simx_Id") +); +-- Create "SoapiSimgosLog" table +CREATE TABLE "public"."SoapiSimgosLog" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Value" text NULL, + "Date" timestamptz NULL, + "Status" text NULL, + "ErrMessage" text NULL, + PRIMARY KEY ("Id") +); +-- Create "SoapiSimxLog" table +CREATE TABLE "public"."SoapiSimxLog" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Value" text NULL, + "Date" timestamptz NULL, + "Status" text NULL, + "ErrMessage" text NULL, + PRIMARY KEY ("Id") +); diff --git a/cmd/simgos-sync-migration/migrations/20251209083238.sql b/cmd/simgos-sync-migration/migrations/20251209083238.sql new file mode 100644 index 00000000..9e3f07eb --- /dev/null +++ b/cmd/simgos-sync-migration/migrations/20251209083238.sql @@ -0,0 +1,72 @@ +-- Create "DoctorLink" table +CREATE TABLE "public"."DoctorLink" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Simx_Id" bigint NULL, + "Simgos_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_DoctorLink_Simgos_Id" UNIQUE ("Simgos_Id"), + CONSTRAINT "uni_DoctorLink_Simx_Id" UNIQUE ("Simx_Id") +); +-- Create "DoctorSimgosLog" table +CREATE TABLE "public"."DoctorSimgosLog" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Value" text NULL, + "Date" timestamptz NULL, + "Status" text NULL, + "ErrMessage" text NULL, + PRIMARY KEY ("Id") +); +-- Create "DoctorSimxLog" table +CREATE TABLE "public"."DoctorSimxLog" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Value" text NULL, + "Date" timestamptz NULL, + "Status" text NULL, + "ErrMessage" text NULL, + PRIMARY KEY ("Id") +); +-- Create "NurseLink" table +CREATE TABLE "public"."NurseLink" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Simx_Id" bigint NULL, + "Simgos_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_NurseLink_Simgos_Id" UNIQUE ("Simgos_Id"), + CONSTRAINT "uni_NurseLink_Simx_Id" UNIQUE ("Simx_Id") +); +-- Create "NurseSimgosLog" table +CREATE TABLE "public"."NurseSimgosLog" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Value" text NULL, + "Date" timestamptz NULL, + "Status" text NULL, + "ErrMessage" text NULL, + PRIMARY KEY ("Id") +); +-- Create "NurseSimxLog" table +CREATE TABLE "public"."NurseSimxLog" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Value" text NULL, + "Date" timestamptz NULL, + "Status" text NULL, + "ErrMessage" text NULL, + PRIMARY KEY ("Id") +); diff --git a/cmd/simgos-sync-migration/migrations/atlas.sum b/cmd/simgos-sync-migration/migrations/atlas.sum index 497ac414..a6ba5a4a 100644 --- a/cmd/simgos-sync-migration/migrations/atlas.sum +++ b/cmd/simgos-sync-migration/migrations/atlas.sum @@ -1,7 +1,9 @@ -h1:UdPzQZ17yyNN9HVuyrFFHj5KjLj4m6/e7s9frkdpQVU= +h1:V6uRNFb6js/aPft2hebJMA8tI0YJc4BuZ7Rlp56FV00= 20251113035508.sql h1:rjDlu6yDdy5xv6nrCOr7NialrLSLT23pzduYNq29Hf0= 20251114071129.sql h1:Z0GQ5bJo3C+tplaWzxT8n3J9HLkEaVsRVp5nn7bmYow= 20251117041601.sql h1:l/RPG5mObqCSBjO4mzG+wTq2ieSycvlfOSz4czpUdWY= 20251118082246.sql h1:xLUwA+EvKWIg3X/TJvu7rqbtBzONiINfag5NJpMV29E= 20251118082915.sql h1:hP6FmUVFuADIN2cDg2Z1l7Wx7PQRb+IYQDvKD7J8VAM= -20251126115527.sql h1:+2bp2nWTTqaPpKKfy5ZYSr6b1nEUXFG3tIw4r3OEnAQ= +20251126115527.sql h1:Bvg+Y7k+h5s+/UaezUyJb7J7uzEJS7U5Z/RoCixcUtI= +20251201093443.sql h1:dyiD1WzU9D6RjGhF0AtGfGLEsG6yocuk3HbcZWt9ZRQ= +20251209083238.sql h1:GmnvITp+vr3sYlWmPxWVxMnjSIRI0QKmv9i202kRgp4= diff --git a/internal/domain/bpjs-entities/referral/entity.go b/internal/domain/bpjs-entities/referral/entity.go index 8977ee31..680400b6 100644 --- a/internal/domain/bpjs-entities/referral/entity.go +++ b/internal/domain/bpjs-entities/referral/entity.go @@ -81,8 +81,8 @@ type Mr struct { } type Provider struct { - Kode string `json:"kdProvider" json:"kode"` // API sometimes uses different keys - NmProvider string `json:"nmProvider" json:"nama"` + Kode string `son:"kode"` + NmProvider string `json:"nama"` } type Poli struct { diff --git a/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go b/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go index 19530c2c..1974e66c 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go @@ -1,7 +1,13 @@ package vclaimsepcontrolletter import ( + "encoding/json" + "fmt" + "time" + ecore "simrs-vx/internal/domain/base-entities/core" + + pu "simrs-vx/pkg/use-case-helper" ) type CreateDto struct { @@ -9,6 +15,7 @@ type CreateDto struct { Number *string `json:"number" gorm:"unique;size:20"` Value *string `json:"value"` FileUrl *string `json:"fileUrl" gorm:"unique;size:1024"` + RequestPayload string `json:"requestPayload" validate:"maxLength=1024"` } type ReadListDto struct { @@ -69,3 +76,49 @@ func ToResponseList(data []VclaimSepControlLetter) []ResponseDto { } return resp } + +func (c CreateDto) RequestPayloadIntoJson() ([]byte, error) { + payload := map[string]interface{}{} + err := json.Unmarshal([]byte(c.RequestPayload), &payload) + if err != nil { + return nil, err + } + return json.Marshal(payload) +} + +type ResponseForPDF struct { + Number string `json:"noSuratKontrol"` + PlannedControlDate string `json:"tglRencanaKontrol"` + IssuedDate string `json:"tglTerbit"` + Doctor_Name string `json:"namaDokter"` + DstUnit_Name string `json:"namaPoliTujuan"` + ResponsibleDoctor_Name string `json:"namaDokterPembuat"` + VclaimSep VclaimSep `json:"sep"` +} + +type VclaimSep struct { + VclaimMember VclaimMember `json:"peserta"` + Diagnose string `json:"diagnosa"` + Number string `json:"noSep"` +} + +type VclaimMember struct { + CardNumber string `json:"noKartu"` + Name string `json:"nama"` + BirthDate string `json:"tglLahir"` + Gender string `json:"kelamin"` +} + +func (v ResponseForPDF) GenerateNameWithGender() string { + gender := "Perempuan" + if v.VclaimSep.VclaimMember.Gender == "L" { + gender = "Laki-Laki" + } + + return fmt.Sprintf("%s (%s)", v.VclaimSep.VclaimMember.Name, gender) +} + +func (v ResponseForPDF) GenerateBirthDate() string { + t, _ := time.Parse("2006-01-02", v.VclaimSep.VclaimMember.BirthDate) + return pu.FormatIndonesianDate(t) +} diff --git a/internal/domain/main-entities/action-report/dto.go b/internal/domain/main-entities/action-report/dto.go deleted file mode 100644 index 45c26d17..00000000 --- a/internal/domain/main-entities/action-report/dto.go +++ /dev/null @@ -1,90 +0,0 @@ -package actionreport - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/encounter" - "time" - - pa "simrs-vx/internal/lib/auth" -) - -type CreateDto struct { - Encounter_Id uint64 `json:"encounter_id" validate:"required"` - Date *time.Time `json:"date" validate:"required"` - Doctor_Code string `json:"doctor_code" validate:"required"` - Operator_Employe_Id uint `json:"operator_employe_id" validate:"required"` - Assistant_Employe_Id uint `json:"assistant_employe_id" validate:"required"` - Instrumentor_Employe_Id uint `json:"instrumentor_employe_id" validate:"required"` - Diagnose *string `json:"diagnose"` - Nurse_Code string `json:"nurse_code" validate:"required"` - Value string `json:"value" validate:"required"` - - pa.AuthInfo -} - -type ReadListDto struct { - FilterDto - Includes string `json:"includes"` - Pagination ecore.Pagination -} - -type FilterDto struct { - Encounter_Id *uint `json:"encounter-id"` -} - -type ReadDetailDto struct { - Id uint16 `json:"id"` -} - -type UpdateDto struct { - Id uint16 `json:"id"` - CreateDto -} - -type DeleteDto struct { - Id uint16 `json:"id"` -} - -type MetaDto struct { - PageNumber int `json:"page_number"` - PageSize int `json:"page_size"` - Count int `json:"count"` -} - -type ResponseDto struct { - ecore.Main - Encounter_Id uint64 `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` - Date *time.Time `json:"date"` - Doctor_Code string `json:"doctor_code"` - Operator_Employe_Id uint `json:"operator_employe_id"` - Assistant_Employe_Id uint `json:"assistant_employe_id"` - Instrumentor_Employe_Id uint `json:"instrumentor_employe_id"` - Diagnose *string `json:"diagnose"` - Nurse_Code string `json:"nurse_code"` - Value *string `json:"value"` -} - -func (d ActionReport) ToResponse() ResponseDto { - resp := ResponseDto{ - Encounter_Id: d.Encounter_Id, - Encounter: d.Encounter, - Date: d.Date, - Doctor_Code: d.Doctor_Code, - Operator_Employe_Id: d.Operator_Employe_Id, - Assistant_Employe_Id: d.Assistant_Employe_Id, - Instrumentor_Employe_Id: d.Instrumentor_Employe_Id, - Nurse_Code: d.Nurse_Code, - Value: &d.Value, - } - resp.Main = d.Main - return resp -} - -func ToResponseList(data []ActionReport) []ResponseDto { - resp := make([]ResponseDto, len(data)) - for i, u := range data { - resp[i] = u.ToResponse() - } - return resp -} diff --git a/internal/domain/main-entities/action-report/entity.go b/internal/domain/main-entities/action-report/entity.go deleted file mode 100644 index 8447a2e5..00000000 --- a/internal/domain/main-entities/action-report/entity.go +++ /dev/null @@ -1,51 +0,0 @@ -package actionreport - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ed "simrs-vx/internal/domain/main-entities/doctor" - eem "simrs-vx/internal/domain/main-entities/employee" - ee "simrs-vx/internal/domain/main-entities/encounter" - en "simrs-vx/internal/domain/main-entities/nurse" - "time" -) - -type ActionReport struct { - ecore.Main // adjust this according to the needs - Encounter_Id uint64 `json:"encounter_id" gorm:"foreignKey"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Date *time.Time `json:"date" gorm:"not null;size:20"` - Doctor_Code string `json:"doctor_code" gorm:"size:10"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` - Operator_Employe_Id uint `json:"operator_employe_id"` - Operator_Employe *eem.Employee `json:"operator_employe,omitempty" gorm:"foreignKey:Operator_Employe_Id;references:Id"` - Assistant_Employe_Id uint `json:"assistant_employe_id"` - Instrumentor_Employe_Id uint `json:"instrumentor_employe_id"` - Instrumentor_Employe *eem.Employee `json:"instrumentor_employe,omitempty" gorm:"foreignKey:Instrumentor_Employe_Id;references:Id"` - Diagnose *string `json:"diagnose" gorm:"size:1024"` - Nurse_Code string `json:"nurse_code" gorm:"size:10"` - Nurse *en.Nurse `json:"nurse,omitempty" gorm:"foreignKey:Nurse_Code;references:Code"` - Value string `json:"value"` - // SurgerySize_Code *string `json:"surgerySize_code" gorm:"size:10"` - // Billing_Code *string `json:"billing_code" gorm:"size:10"` - // SurgerySystem_Code *string `json:"surgerySystem_code" gorm:"size:10"` - // StartAt *string `json:"startAt" gorm:"size:20"` - // EndAt *string `json:"endAt" gorm:"size:20"` - // AnesthesiaStartAt *string `json:"anesthesiaStartAt" gorm:"size:20"` - // AnesthesiaEndAt *string `json:"anesthesiaEndAt" gorm:"size:20"` - // SurgeryType_Code *string `json:"surgeryType_code" gorm:"size:10"` - // SurgeryStage_Code *string `json:"surgeryStage_code" gorm:"size:10"` - // BornMortality_Code *string `json:"bornMortality_code" gorm:"size:10"` - // BornLocation_Code *string `json:"bornLocation_code" gorm:"size:10"` - // Weight *string `json:"weight" gorm:"size:10"` - // BornNotes *string `json:"bornNotes" gorm:"size:1024"` - // Description *string `json:"notes" gorm:"size:1024"` - // BleedingAmount *uint16 `json:"bleedingAmount" gorm:"size:10"` - // BloodInType_Code *string `json:"bloodInType_code" gorm:"size:10"` - // BloodInAmount *uint16 `json:"bloodInAmount" gorm:"size:10"` - // Brand *string `json:"brand" gorm:"size:100"` - // ImplantName *string `json:"implantName" gorm:"size:100"` - // ImplantRegisterNumber *string `json:"implantRegisterNumber" gorm:"size:100"` - // ImplantCompanionName *string `json:"implantCompanionName" gorm:"size:100"` - // SpecimentDest_Code *string `json:"specimentDest" gorm:"size:100"` - // TissueInfo *string `json:"tissueInfo" gorm:"size:100"` -} diff --git a/internal/domain/main-entities/ap-mcu-order/base/dto.go b/internal/domain/main-entities/ap-mcu-order/base/dto.go new file mode 100644 index 00000000..447bc771 --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/base/dto.go @@ -0,0 +1,23 @@ +package apmcuorder + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"-"` + Substances string `json:"substances"` + Fictations string `json:"fictations"` + Localization string `json:"localization"` + ClinicalDiagnoses string `json:"clinicalDiagnoses"` + Stadium string `json:"stadium"` + ClinicalNotes string `json:"clinicalNotes"` + CurrentHistory string `json:"currentHistory"` + PastHistory string `json:"pastHistory"` + PrevApMcu string `json:"prevApMcu"` + PrevApMcuNotes string `json:"prevApMcuNotes"` + SupportingExams string `json:"supportingExams"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} diff --git a/internal/domain/main-entities/ap-mcu-order/base/entity.go b/internal/domain/main-entities/ap-mcu-order/base/entity.go new file mode 100644 index 00000000..d098fcfd --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/base/entity.go @@ -0,0 +1,25 @@ +package apmcuorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" +) + +type ApMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + Substances string `json:"substances"` + Fictations string `json:"fictations"` + Localization string `json:"localization"` + ClinicalDiagnoses string `json:"clinicalDiagnoses"` + Stadium string `json:"stadium"` + ClinicalNotes *string `json:"clinicalNotes"` + CurrentHistory string `json:"currentHistory"` + PastHistory string `json:"pastHistory"` + PrevApMcu *string `json:"prevApMcu"` + PrevApMcuNotes *string `json:"prevApMcuNotes"` + SupportingExams *string `json:"supportingExams"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/ap-mcu-order/dto.go b/internal/domain/main-entities/ap-mcu-order/dto.go new file mode 100644 index 00000000..80b0b447 --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/dto.go @@ -0,0 +1,96 @@ +package apmcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + ecore "simrs-vx/internal/domain/base-entities/core" + eamob "simrs-vx/internal/domain/main-entities/ap-mcu-order/base" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type CreateDto struct { + eamob.CreateDto + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + McuOrder_Id string `json:"mcu-order-id"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + Substances string `json:"substances"` + Fictations string `json:"fictations"` + Localization string `json:"localization"` + ClinicalDiagnoses string `json:"clinicalDiagnoses"` + Stadium string `json:"stadium"` + ClinicalNotes *string `json:"clinicalNotes"` + PastHistory string `json:"pastHistory"` + CurrentHistory string `json:"currentHistory"` + PrevApMcu *string `json:"prevApMcu"` + PrevApMcuNotes *string `json:"prevApMcuNotes"` + SupportingExams *string `json:"supportingExams"` +} + +func (d ApMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + Substances: d.Substances, + Fictations: d.Fictations, + Localization: d.Localization, + ClinicalDiagnoses: d.ClinicalDiagnoses, + Stadium: d.Stadium, + ClinicalNotes: d.ClinicalNotes, + PastHistory: d.PastHistory, + CurrentHistory: d.CurrentHistory, + PrevApMcu: d.PrevApMcu, + PrevApMcuNotes: d.PrevApMcuNotes, + SupportingExams: d.SupportingExams, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []ApMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/ap-mcu-order/entity.go b/internal/domain/main-entities/ap-mcu-order/entity.go new file mode 100644 index 00000000..361d0948 --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/entity.go @@ -0,0 +1,26 @@ +package apmcuorder + +import ( + eamob "simrs-vx/internal/domain/main-entities/ap-mcu-order/base" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + erc "simrs-vx/internal/domain/references/common" +) + +type ApMcuOrder struct { + eamob.ApMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` +} + +func (d ApMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d ApMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d ApMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/main-entities/chemo-plan/dto.go b/internal/domain/main-entities/chemo-plan/dto.go new file mode 100644 index 00000000..b2c05a61 --- /dev/null +++ b/internal/domain/main-entities/chemo-plan/dto.go @@ -0,0 +1,87 @@ +package chemo_plan + +import ( + // std + "time" + + ere "simrs-vx/internal/domain/references/encounter" + + // internal - domain - main-entities + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Parent_Id *uint `json:"parent_id"` + SeriesNumber *uint16 `json:"seriesNumber"` + CycleNumber *uint `json:"cycleNumber"` + PlanDate *time.Time `json:"planDate"` + RealizationDate *time.Time `json:"realizationDate"` + Notes *string `json:"notes"` + Status ere.StatusProtocolChemo `json:"status"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Parent_Id *uint `json:"parent-id"` + Protocol_Id *uint `json:"protocol-id"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Parent_Id *uint `json:"parent_id"` // chemo.Id + Protocol_Id *uint `json:"protocol_id"` + SeriesNumber *uint16 `json:"seriesNumber"` // series ke - + CycleNumber *uint `json:"cycleNumber"` // cycle ke - + PlanDate *time.Time `json:"planDate"` + RealizationDate *time.Time `json:"realizationDate"` + Notes *string `json:"notes"` + Status ere.StatusProtocolChemo `json:"status"` + Reasons *string `json:"reasons"` +} + +func (d ChemoPlan) ToResponse() ResponseDto { + resp := ResponseDto{ + Parent_Id: d.Parent_Id, + SeriesNumber: d.SeriesNumber, + CycleNumber: d.CycleNumber, + PlanDate: d.PlanDate, + RealizationDate: d.RealizationDate, + Notes: d.Notes, + Status: d.Status, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []ChemoPlan) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/chemo-plan/entity.go b/internal/domain/main-entities/chemo-plan/entity.go new file mode 100644 index 00000000..1fef099e --- /dev/null +++ b/internal/domain/main-entities/chemo-plan/entity.go @@ -0,0 +1,25 @@ +package chemo_plan + +import ( + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + + ere "simrs-vx/internal/domain/references/encounter" +) + +type ChemoPlan struct { + ecore.Main + Parent_Id *uint `json:"parent_id"` // chemo.Id + Protocol_Id *uint `json:"protocol_id"` + SeriesNumber *uint16 `json:"seriesNumber"` // series ke - + CycleNumber *uint `json:"cycleNumber"` // cycle ke - + PlanDate *time.Time `json:"planDate"` + RealizationDate *time.Time `json:"realizationDate"` + Notes *string `json:"notes"` + Status ere.StatusProtocolChemo `json:"status"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Reasons *string `json:"reasons"` // json +} diff --git a/internal/domain/main-entities/chemo-protocol/dto.go b/internal/domain/main-entities/chemo-protocol/dto.go index 04ea0023..03ad0c10 100644 --- a/internal/domain/main-entities/chemo-protocol/dto.go +++ b/internal/domain/main-entities/chemo-protocol/dto.go @@ -9,18 +9,21 @@ import ( // internal - domain - main-entities ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/encounter" + + ec "simrs-vx/internal/domain/main-entities/chemo" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Patient_Weight *float32 `json:"patient_weight"` - Patient_Height *float32 `json:"patient_height"` - Diagnoses *string `json:"diagnoses"` - Duration *uint `json:"duration"` - DurationUnit_Code *erc.TimeUnitCode `json:"durationUnit_code"` - StartDate *time.Time `json:"startDate"` - EndDate *time.Time `json:"endDate"` + Chemo_Id *uint `json:"chemo_id"` + Patient_Weight *float32 `json:"patient_weight"` + Patient_Height *float32 `json:"patient_height"` + Diagnoses *string `json:"diagnoses"` + Interval *uint `json:"interval"` + Cycle *uint `json:"cycle"` + Series *uint16 `json:"series"` + StartDate *time.Time `json:"startDate"` + EndDate *time.Time `json:"endDate"` + Status_Code erc.DataVerifiedCode `json:"-"` } type ReadListDto struct { @@ -30,7 +33,7 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter-id"` + Chemo_Id *uint `json:"chemo-id"` } type ReadDetailDto struct { @@ -55,28 +58,32 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` - Patient_Weight *float32 `json:"patient_weight"` - Patient_Height *float32 `json:"patient_height"` - Diagnoses *string `json:"diagnoses"` - Duration *uint `json:"duration"` - DurationUnit_Code *erc.TimeUnitCode `json:"durationUnit_code"` - StartDate *time.Time `json:"startDate"` - EndDate *time.Time `json:"endDate"` + Chemo_Id *uint `json:"chemo_id"` + Chemo *ec.Chemo `json:"chemo,omitempty"` + Patient_Weight *float32 `json:"patient_weight"` + Patient_Height *float32 `json:"patient_height"` + Diagnoses *string `json:"diagnoses"` + Interval *uint `json:"interval"` + Cycle *uint `json:"cycle"` + Series *uint16 `json:"series"` + StartDate *time.Time `json:"startDate"` + EndDate *time.Time `json:"endDate"` + Status_Code erc.DataVerifiedCode `json:"status_code"` } func (d ChemoProtocol) ToResponse() ResponseDto { resp := ResponseDto{ - Encounter_Id: d.Encounter_Id, - Encounter: d.Encounter, - Patient_Weight: d.Patient_Weight, - Patient_Height: d.Patient_Height, - Diagnoses: d.Diagnoses, - Duration: d.Duration, - DurationUnit_Code: d.DurationUnit_Code, - StartDate: d.StartDate, - EndDate: d.EndDate, + Chemo_Id: d.Chemo_Id, + Chemo: d.Chemo, + Patient_Weight: d.Patient_Weight, + Patient_Height: d.Patient_Height, + Diagnoses: d.Diagnoses, + Interval: d.Interval, + Cycle: d.Cycle, + Series: d.Series, + StartDate: d.StartDate, + EndDate: d.EndDate, + Status_Code: d.Status_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/chemo-protocol/entity.go b/internal/domain/main-entities/chemo-protocol/entity.go index e1508e91..6377c136 100644 --- a/internal/domain/main-entities/chemo-protocol/entity.go +++ b/internal/domain/main-entities/chemo-protocol/entity.go @@ -1,21 +1,34 @@ package chemo_protocol import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/encounter" - "simrs-vx/internal/domain/references/common" "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" + + ec "simrs-vx/internal/domain/main-entities/chemo" + ecp "simrs-vx/internal/domain/main-entities/chemo-plan" + eus "simrs-vx/internal/domain/main-entities/user" ) type ChemoProtocol struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Patient_Weight *float32 `json:"patient_weight"` - Patient_Height *float32 `json:"patient_height"` - Diagnoses *string `json:"diagnoses"` - Duration *uint `json:"duration"` - DurationUnit_Code *common.TimeUnitCode `json:"durationUnit_code" gorm:"size:10"` - StartDate *time.Time `json:"startDate"` - EndDate *time.Time `json:"endDate"` + Chemo_Id *uint `json:"chemo_id"` + Chemo *ec.Chemo `json:"chemo,omitempty" gorm:"foreignKey:Chemo_Id;references:Id"` + Patient_Weight *float32 `json:"patient_weight"` + Patient_Height *float32 `json:"patient_height"` + Diagnoses *string `json:"diagnoses"` + Duration *uint `json:"duration"` // not used + DurationUnit_Code *erc.TimeUnitCode `json:"durationUnit_code"` // not used + Interval *uint `json:"interval"` + Cycle *uint `json:"cycle"` // total cycle + Series *uint16 `json:"series"` // total series + StartDate *time.Time `json:"startDate"` + EndDate *time.Time `json:"endDate"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + VerifiedAt *time.Time `json:"verifiedAt"` + VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` + VerifiedBy *eus.User `json:"verifiedBy,omitempty" gorm:"foreignKey:VerifiedBy_User_Id;references:Id"` + ChemoPlans *[]ecp.ChemoPlan `json:"chemoPlans,omitempty" gorm:"foreignKey:Protocol_Id;references:Id"` + Patient_Id *uint `json:"patient_id"` } diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 5d8b9501..fa3bd8a5 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -1,7 +1,8 @@ package chemo import ( - // std + ed "simrs-vx/internal/domain/main-entities/doctor" + es "simrs-vx/internal/domain/main-entities/specialist" "time" // internal - lib @@ -13,14 +14,13 @@ import ( // internal - domain - main-entities ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" - eun "simrs-vx/internal/domain/main-entities/unit" eus "simrs-vx/internal/domain/main-entities/user" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code erc.DataVerifiedCode `json:"status_code"` - SrcUnit_Code *string `json:"srcUnit_code"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + Specialist_Code *string `json:"specialist_code"` } type ReadListDto struct { @@ -33,7 +33,7 @@ type FilterDto struct { Encounter_Id *uint `json:"encounter-id"` Status_Code *erc.DataVerifiedCode `json:"status-code"` VerifiedBy_User_Id *uint `json:"verifiedBy-user-id"` - SrcUnit_Code *string `json:"srcUnit-code"` + Specialist_Code *string `json:"specialist-code"` } type ReadDetailDto struct { @@ -50,10 +50,12 @@ type DeleteDto struct { } type VerifyDto struct { - Id uint16 `json:"id"` - Status_Code erc.DataVerifiedCode `json:"status_code"` - Bed *string `json:"bed" validate:"required"` - Needs *string `json:"needs" validate:"required"` + Id uint16 `json:"id"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + Bed *string `json:"bed"` + Needs *string `json:"needs"` + Doctor_Code *string `json:"doctor_code" validate:"required"` + NextChemoDate *time.Time `json:"nextChemoDate"` pa.AuthInfo } @@ -72,8 +74,11 @@ type ResponseDto struct { VerifiedAt *time.Time `json:"verifiedAt"` VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` VerifiedBy *eus.User `json:"verifiedBy,omitempty"` - SrcUnit_Code *string `json:"srcUnit_code"` - SrcUnit *eun.Unit `json:"srcUnit,omitempty"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty"` + NextChemoDate *time.Time `json:"nextChemoDate"` } func (d Chemo) ToResponse() ResponseDto { @@ -84,8 +89,11 @@ func (d Chemo) ToResponse() ResponseDto { VerifiedAt: d.VerifiedAt, VerifiedBy_User_Id: d.VerifiedBy_User_Id, VerifiedBy: d.VerifiedBy, - SrcUnit_Code: d.SrcUnit_Code, - SrcUnit: d.SrcUnit, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + NextChemoDate: d.NextChemoDate, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/chemo/entity.go b/internal/domain/main-entities/chemo/entity.go index 6f5180aa..b9aa58fd 100644 --- a/internal/domain/main-entities/chemo/entity.go +++ b/internal/domain/main-entities/chemo/entity.go @@ -1,14 +1,16 @@ package chemo import ( + ere "simrs-vx/internal/domain/references/encounter" "time" ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/encounter" - eun "simrs-vx/internal/domain/main-entities/unit" - eus "simrs-vx/internal/domain/main-entities/user" - erc "simrs-vx/internal/domain/references/common" + + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + es "simrs-vx/internal/domain/main-entities/specialist" + eus "simrs-vx/internal/domain/main-entities/user" ) type Chemo struct { @@ -19,8 +21,12 @@ type Chemo struct { VerifiedAt *time.Time `json:"verifiedAt"` VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` VerifiedBy *eus.User `json:"verifiedBy,omitempty" gorm:"foreignKey:VerifiedBy_User_Id;references:Id"` - SrcUnit_Code *string `json:"src_unit_code"` - SrcUnit *eun.Unit `json:"src_unit,omitempty" gorm:"foreignKey:SrcUnit_Code;references:Code"` + Specialist_Code *string `json:"specialist_code"` // klinik asal + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Bed *string `json:"bed" gorm:"size:1024"` Needs *string `json:"needs" gorm:"size:2048"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor" gorm:"foreignKey:Doctor_Code;references:Code"` + NextChemoDate *time.Time `json:"nextChemoDate"` + Class_Code ere.ChemoClassCode `json:"class_code"` } diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go index 1b83df77..6f4740c8 100644 --- a/internal/domain/main-entities/consultation/dto.go +++ b/internal/domain/main-entities/consultation/dto.go @@ -13,14 +13,14 @@ import ( // internal - domain - main-entities ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/encounter" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Date *time.Time `json:"date"` - Problem *string `json:"problem" validate:"maxLength=10240"` - DstUnit_Code *string `json:"dstUnit_code"` + Encounter_Id *uint `json:"encounter_id"` + Date *time.Time `json:"date"` + Problem *string `json:"problem" validate:"maxLength=10240"` + Specialist_Code *string `json:"dstSpecialist_code"` } type ReadListDto struct { @@ -30,9 +30,9 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter-id"` - DstUnit_Code *string `json:"dstUnit-code"` - DstDoctor_Code *string `json:"dstDoctor-code"` + Encounter_Id *uint `json:"encounter-id"` + Specialist_Code *string `json:"dstSpecialist-code"` + Doctor_Code *string `json:"doctor-code"` } type ReadDetailDto struct { @@ -63,29 +63,29 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` - Date *time.Time `json:"date"` - Problem *string `json:"problem"` - Solution *string `json:"solution"` - DstUnit_Code *string `json:"dstUnit_code"` - DstUnit *eu.Unit `json:"dstUnit,omitempty"` - DstDoctor_Code *string `json:"dstDoctor_code"` - DstDoctor *ed.Doctor `json:"dstDoctor,omitempty"` - RepliedAt *time.Time `json:"repliedAt"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Date *time.Time `json:"date"` + Problem *string `json:"problem"` + Solution *string `json:"solution"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty"` + RepliedAt *time.Time `json:"repliedAt"` } func (d Consultation) ToResponse() ResponseDto { resp := ResponseDto{ - Encounter_Id: d.Encounter_Id, - Encounter: d.Encounter, - Date: d.Date, - Problem: d.Problem, - Solution: d.Solution, - DstUnit_Code: d.DstUnit_Code, - DstUnit: d.DstUnit, - DstDoctor_Code: d.DstDoctor_Code, - DstDoctor: d.DstDoctor, + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Date: d.Date, + Problem: d.Problem, + Solution: d.Solution, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/consultation/entity.go b/internal/domain/main-entities/consultation/entity.go index b8be3596..95ba2512 100644 --- a/internal/domain/main-entities/consultation/entity.go +++ b/internal/domain/main-entities/consultation/entity.go @@ -6,7 +6,7 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/encounter" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type Consultation struct { @@ -15,11 +15,11 @@ type Consultation struct { Encounter *ee.Encounter `json:"encounter" gorm:"foreignKey:Encounter_Id;references:Id"` Date *time.Time `json:"date"` - Problem *string `json:"case" gorm:"size:10240"` - Solution *string `json:"solution" gorm:"size:10240"` - DstUnit_Code *string `json:"dstUnit_code"` - DstUnit *eu.Unit `json:"dstUnit" gorm:"foreignKey:DstUnit_Code;references:Code"` - DstDoctor_Code *string `json:"dstDoctor_code"` - DstDoctor *ed.Doctor `json:"dstDoctor" gorm:"foreignKey:DstDoctor_Code;references:Code"` - RepliedAt *time.Time `json:"repliedAt"` + Problem *string `json:"case" gorm:"size:10240"` + Solution *string `json:"solution" gorm:"size:10240"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist" gorm:"foreignKey:Specialist_Code;references:Code"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor" gorm:"foreignKey:Doctor_Code;references:Code"` + RepliedAt *time.Time `json:"repliedAt"` } diff --git a/internal/domain/main-entities/control-letter/dto.go b/internal/domain/main-entities/control-letter/dto.go index 87b82366..18f8020f 100644 --- a/internal/domain/main-entities/control-letter/dto.go +++ b/internal/domain/main-entities/control-letter/dto.go @@ -15,7 +15,6 @@ import ( ee "simrs-vx/internal/domain/main-entities/encounter" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" ) type CreateDto struct { @@ -66,8 +65,6 @@ type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty"` Subspecialist_Code *string `json:"subspecialist_code"` @@ -81,8 +78,6 @@ func (d ControlLetter) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, - Unit_Code: d.Unit_Code, - Unit: d.Unit, Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, diff --git a/internal/domain/main-entities/control-letter/entity.go b/internal/domain/main-entities/control-letter/entity.go index 2b8019b4..e13f5940 100644 --- a/internal/domain/main-entities/control-letter/entity.go +++ b/internal/domain/main-entities/control-letter/entity.go @@ -8,15 +8,12 @@ import ( ee "simrs-vx/internal/domain/main-entities/encounter" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" ) type ControlLetter struct { ecore.Main // adjust this according to the needs Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter" gorm:"foreignKey:Encounter_Id;references:Id"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit" gorm:"foreignKey:Unit_Code;references:Code"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialist_Code *string `json:"subspecialist_code"` diff --git a/internal/domain/main-entities/cp-mcu-order-item/base/dto.go b/internal/domain/main-entities/cp-mcu-order-item/base/dto.go new file mode 100644 index 00000000..2510f9a0 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/base/dto.go @@ -0,0 +1,6 @@ +package cpmcuorderitem + +type SubCreateDto struct { + McuSrc_Code string `json:"mcuSrc_code" validate:"required"` + Note string `json:"note"` +} diff --git a/internal/domain/main-entities/cp-mcu-order-item/base/entity.go b/internal/domain/main-entities/cp-mcu-order-item/base/entity.go new file mode 100644 index 00000000..5abb8494 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/base/entity.go @@ -0,0 +1,17 @@ +package cpmcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrderItem struct { + ecore.BigMain // adjust this according to the needs + CpMcuOrder_Id uint64 `json:"cpMcuOrder_id" gorm:"uniqueIndex:idx_order_src"` + McuSrc_Code string `json:"mcuSrc_code" gorm:"uniqueIndex:idx_order_src"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` + Note *string `json:"note" gorm:"size:1024"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/cp-mcu-order-item/dto.go b/internal/domain/main-entities/cp-mcu-order-item/dto.go new file mode 100644 index 00000000..a0979186 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/dto.go @@ -0,0 +1,80 @@ +package cpmcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emro "simrs-vx/internal/domain/main-entities/cp-mcu-order" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type CreateDto struct { + CpMcuOrder_Id uint64 `json:"cpMcuOrder_id"` + McuSrc_Code string `json:"mcuSrc_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + CpMcuOrder_Id *uint64 `json:"cp-mcu-order-id"` + McuSrc_Code *string `json:"mcu-src-code"` + Status_Code erc.DataStatusCode `json:"status-code"` +} +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + CpMcuOrder_Id uint64 `json:"cpMcuOrder_id"` + CpMcuOrder *emro.CpMcuOrder `json:"cpMcuOrder,omitempty"` + McuSrc_Code string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d CpMcuOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + CpMcuOrder_Id: d.CpMcuOrder_Id, + CpMcuOrder: d.CpMcuOrder, + McuSrc_Code: d.McuSrc_Code, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []CpMcuOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/cp-mcu-order-item/entity.go b/internal/domain/main-entities/cp-mcu-order-item/entity.go new file mode 100644 index 00000000..5858ab58 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/entity.go @@ -0,0 +1,17 @@ +package cpmcuorderitem + +import ( + emo "simrs-vx/internal/domain/main-entities/cp-mcu-order" + emoib "simrs-vx/internal/domain/main-entities/cp-mcu-order-item/base" + + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrderItem struct { + emoib.CpMcuOrderItem + CpMcuOrder *emo.CpMcuOrder `json:"cpMcuOrder,omitempty" gorm:"foreignKey:CpMcuOrder_Id;references:Id"` +} + +func (d CpMcuOrderItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/cp-mcu-order/base/entity.go b/internal/domain/main-entities/cp-mcu-order/base/entity.go new file mode 100644 index 00000000..e9531e22 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order/base/entity.go @@ -0,0 +1,21 @@ +package cpmcuorder + +import ( + "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + ercl "simrs-vx/internal/domain/references/clinical" + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + UrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"urgencyLevel_code" gorm:"not null;size:15"` + OtherNotes *string `json:"otherNotes"` + ExamScheduleDate *time.Time `json:"examinationDate"` + Resume *string `json:"resume"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/cp-mcu-order/dto.go b/internal/domain/main-entities/cp-mcu-order/dto.go new file mode 100644 index 00000000..afccfb20 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order/dto.go @@ -0,0 +1,84 @@ +package cpmcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id" validate:"required"` + Number uint64 `json:"number"` // SHOULD BE AUTOMATIC WITHOUT SYNC + UrgencyLevel_Code string `json:"urgencyLevel_code" validate:"required"` + OtherNotes string `json:"otherNotes"` + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint `json:"encounter-id"` + Doctor_Code string `json:"doctor-code"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + UrgencyLevel_Code string `json:"urgencyLevel_code" gorm:"not null;size:15"` + OtherNotes *string `json:"otherNotes"` + Resume *string `json:"resume"` +} + +func (d CpMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + UrgencyLevel_Code: string(d.UrgencyLevel_Code), + OtherNotes: d.OtherNotes, + Resume: d.Resume, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []CpMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/cp-mcu-order/entity.go b/internal/domain/main-entities/cp-mcu-order/entity.go new file mode 100644 index 00000000..08a3d927 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order/entity.go @@ -0,0 +1,28 @@ +package cpmcuorder + +import ( + ecmoi "simrs-vx/internal/domain/main-entities/cp-mcu-order-item/base" + eamob "simrs-vx/internal/domain/main-entities/cp-mcu-order/base" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrder struct { + eamob.CpMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Items []*ecmoi.CpMcuOrderItem `json:"items" gorm:"foreignKey:CpMcuOrder_Id;references:Id"` +} + +func (d CpMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d CpMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d CpMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/main-entities/device-package-item/device-package/dto.go b/internal/domain/main-entities/device-package-item/device-package/dto.go new file mode 100644 index 00000000..26aad58a --- /dev/null +++ b/internal/domain/main-entities/device-package-item/device-package/dto.go @@ -0,0 +1,63 @@ +package devicepackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.SmallMain + Code string `json:"code"` + Name string `json:"name"` +} + +func (d DevicePackage) ToResponse() ResponseDto { + resp := ResponseDto{ + Code: d.Code, + Name: d.Name, + } + resp.SmallMain = d.SmallMain + return resp +} + +func ToResponseList(data []DevicePackage) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/device-package-item/device-package/entity.go b/internal/domain/main-entities/device-package-item/device-package/entity.go new file mode 100644 index 00000000..1c03b44d --- /dev/null +++ b/internal/domain/main-entities/device-package-item/device-package/entity.go @@ -0,0 +1,11 @@ +package devicepackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type DevicePackage struct { + ecore.SmallMain + Code string `json:"code" gorm:"unique;size:20;not null"` + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/device-package-item/dto.go b/internal/domain/main-entities/device-package-item/dto.go new file mode 100644 index 00000000..a0a224ba --- /dev/null +++ b/internal/domain/main-entities/device-package-item/dto.go @@ -0,0 +1,69 @@ +package devicepackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/device" + edp "simrs-vx/internal/domain/main-entities/device-package" +) + +type CreateDto struct { + DevicePackage_Code string `json:"devicePackage_code" validate:"maxLength=20"` + Device_Code string `json:"code" validate:"maxLength=20"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + DevicePackage_Code string `json:"devicePackage-code"` + Device_Code string `json:"code"` +} + +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + DevicePackage_Code string `json:"devicePackage_code"` + DevicePackage *edp.DevicePackage `json:"devicePackage,omitempty"` + Device_Code string `json:"code"` + Device *ed.Device `json:"device,omitempty"` +} + +func (d DevicePackageItem) ToResponse() ResponseDto { + resp := ResponseDto{ + DevicePackage_Code: d.DevicePackage_Code, + DevicePackage: d.DevicePackage, + Device_Code: d.Device_Code, + Device: d.Device, + } + resp.Id = d.Id + return resp +} + +func ToResponseList(data []DevicePackageItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/device-package-item/entity.go b/internal/domain/main-entities/device-package-item/entity.go new file mode 100644 index 00000000..476e24e2 --- /dev/null +++ b/internal/domain/main-entities/device-package-item/entity.go @@ -0,0 +1,15 @@ +package devicepackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/device" + edp "simrs-vx/internal/domain/main-entities/device-package" +) + +type DevicePackageItem struct { + ecore.Main + DevicePackage_Code string `json:"devicePackage_code" gorm:"size:20;not null"` + DevicePackage *edp.DevicePackage `json:"devicePackage" gorm:"foreignKey:DevicePackage_Code;references:Code"` + Device_Code string `json:"code" gorm:"size:20;not null"` + Device *ed.Device `json:"device" gorm:"foreignKey:Device_Code;references:Code"` +} diff --git a/internal/domain/main-entities/device-package/dto.go b/internal/domain/main-entities/device-package/dto.go new file mode 100644 index 00000000..26aad58a --- /dev/null +++ b/internal/domain/main-entities/device-package/dto.go @@ -0,0 +1,63 @@ +package devicepackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.SmallMain + Code string `json:"code"` + Name string `json:"name"` +} + +func (d DevicePackage) ToResponse() ResponseDto { + resp := ResponseDto{ + Code: d.Code, + Name: d.Name, + } + resp.SmallMain = d.SmallMain + return resp +} + +func ToResponseList(data []DevicePackage) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/device-package/entity.go b/internal/domain/main-entities/device-package/entity.go new file mode 100644 index 00000000..1c03b44d --- /dev/null +++ b/internal/domain/main-entities/device-package/entity.go @@ -0,0 +1,11 @@ +package devicepackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type DevicePackage struct { + ecore.SmallMain + Code string `json:"code" gorm:"unique;size:20;not null"` + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/doctor/dto.go b/internal/domain/main-entities/doctor/dto.go index c7eb0f6b..9bcbc932 100644 --- a/internal/domain/main-entities/doctor/dto.go +++ b/internal/domain/main-entities/doctor/dto.go @@ -5,7 +5,6 @@ import ( ee "simrs-vx/internal/domain/main-entities/employee" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" "time" ) @@ -69,8 +68,6 @@ type ResponseDto struct { Employee *ee.Employee `json:"employee,omitempty"` IHS_Number *string `json:"ihs_number"` SIP_Number *string `json:"sip_number"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty" ` Subspecialist_Code *string `json:"subspecialist_code"` @@ -84,8 +81,6 @@ func (d Doctor) ToResponse() ResponseDto { Employee: d.Employee, IHS_Number: d.IHS_Number, SIP_Number: d.SIP_Number, - Unit_Code: d.Unit_Code, - Unit: d.Unit, Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, diff --git a/internal/domain/main-entities/doctor/entity.go b/internal/domain/main-entities/doctor/entity.go index 506271a2..f5797924 100644 --- a/internal/domain/main-entities/doctor/entity.go +++ b/internal/domain/main-entities/doctor/entity.go @@ -5,7 +5,6 @@ import ( ee "simrs-vx/internal/domain/main-entities/employee" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" "time" ) @@ -17,8 +16,6 @@ type Doctor struct { IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` SIP_Number *string `json:"sip_number" gorm:"unique;size:20"` SIP_ExpiredDate *time.Time `json:"sip_expiredDate"` - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` Specialist_Code *string `json:"specialist_code" gorm:"size:10"` Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialist_Code *string `json:"subspecialist_code" gorm:"size:10"` diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 8dd9a0a1..5dcf76db 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -30,32 +30,41 @@ import ( er "simrs-vx/internal/domain/main-entities/rehab/base" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" ) type CreateDto struct { - Patient_Id *uint `json:"patient_id"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` - SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub - Infra_Code *string `json:"infra_code"` // for inpatient - Unit_Code *string `json:"unit_code"` - Specialist_Code *string `json:"specialist_code"` - Subspecialist_Code *string `json:"subspecialist_code"` - VisitDate time.Time `json:"visitDate"` - PaymentMethod_Code ere.AllPaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` - InsuranceCompany_Code *string `json:"insuranceCompany_code"` - Member_Number *string `json:"member_number" validate:"maxLength=20"` - Ref_Number *string `json:"ref_number" validate:"maxLength=20"` - Trx_Number *string `json:"trx_number" validate:"maxLength=20"` - Appointment_Doctor_Code *string `json:"appointment_doctor_code"` - Adm_Employee_Id *uint `json:"-"` - Responsible_Doctor_Code *string `json:"responsible_doctor_code"` - RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` - Appointment_Id *uint `json:"appointment_id"` - RefTypeCode ere.RefTypeCode `json:"refTypeCode"` - NewStatus bool `json:"newStatus"` - VclaimReference *TRujukan `json:"vclaimReference"` + Patient_Id *uint `json:"patient_id"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` + SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub + Infra_Code *string `json:"infra_code"` // for inpatient + Specialist_Code *string `json:"specialist_code"` + Subspecialist_Code *string `json:"subspecialist_code"` + VisitDate time.Time `json:"visitDate"` + StartedAt *time.Time `json:"startedAt"` + FinishedAt *time.Time `json:"finishedAt"` + PaymentMethod_Code ere.AllPaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` + InsuranceCompany_Code *string `json:"insuranceCompany_code"` + Member_Number *string `json:"member_number" validate:"maxLength=20"` + RefTypeCode ere.RefTypeCode `json:"refTypeCode"` + Ref_Number *string `json:"ref_number" validate:"maxLength=20"` + Trx_Number *string `json:"trx_number" validate:"maxLength=20"` + Appointment_Doctor_Code *string `json:"appointment_doctor_code"` + Adm_Employee_Id *uint `json:"-"` + Responsible_Doctor_Code *string `json:"responsible_doctor_code"` + Responsible_Nurse_Code *string `json:"responsible_nurse_code"` + Discharge_Method_Code *ere.DischargeMethodCode `json:"discharge_method_code" gorm:"size:16"` + RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` + Appointment_Id *uint `json:"appointment_id"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:10"` + Discharge_Date *time.Time `json:"discharge_date"` + DeathCause *edc.DeathCause `json:"deathCause"` + NewStatus bool `json:"newStatus"` + VclaimReference *TRujukan `json:"vclaimReference"` Id uint `json:"-"` RecentEncounterAdm *Encounter `json:"-"` // if subClass_Code is rehab @@ -78,8 +87,14 @@ type TRujukan struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Pagination ecore.Pagination + Includes string `json:"includes"` + Pagination ecore.Pagination + Patient_Identifier *string `json:"patient-identifier"` + StartDate *string `json:"start-date"` + EndDate *string `json:"end-date"` + PaymentMethod_Code *string `json:"paymentMethod-code"` + Status_Code *string `json:"status-code"` + Specialist_Code *string `json:"specialist-code"` pa.AuthInfo } @@ -89,7 +104,6 @@ type FilterDto struct { Patient *ep.Patient `json:"patient,omitempty"` RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class-code" validate:"maxLength=10"` - Unit_Code *string `json:"unit-code"` Specialist_Code *string `json:"specialist-code"` Subspecialist_Code *string `json:"subspecialist-code"` VisitDate time.Time `json:"visitDate"` @@ -154,7 +168,7 @@ type CheckinDto struct { pa.AuthInfo } -type SwitchUnitDto struct { +type SwitchSpecialistDto struct { Id uint `json:"id"` PolySwitchCode *ere.PolySwitchCode `json:"polySwitchCode"` InternalReferences *[]eir.CreateDto `json:"internalReferences" validate:"required"` @@ -164,7 +178,7 @@ type SwitchUnitDto struct { pa.AuthInfo } -type ApproveCancelUnitDto struct { +type ApproveCancelSpecialistDto struct { Id uint `json:"id"` InternalReferences_Id uint `json:"internalReferences_id" validate:"required"` Dst_Doctor_Code *string `json:"dst_doctor_code"` @@ -178,12 +192,10 @@ type ResponseDto struct { Patient *ep.Patient `json:"patient,omitempty"` RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code"` - Unit_Code *string `json:"unit_code"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty"` Subspecialist_Code *string `json:"subspecialist_code"` Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` - Unit *eu.Unit `json:"unit,omitempty"` VisitDate time.Time `json:"visitDate"` PaymentMethod_Code ere.AllPaymentMethodCode `json:"paymentMethod_code"` InsuranceCompany_Code *string `json:"insuranceCompany_code"` @@ -228,8 +240,6 @@ func (d Encounter) ToResponse() ResponseDto { Patient: d.Patient, RegisteredAt: d.RegisteredAt, Class_Code: d.Class_Code, - Unit_Code: d.Unit_Code, - Unit: d.Unit, Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, @@ -281,3 +291,8 @@ func ToResponseList(data []Encounter) []ResponseDto { } return resp } + +type CreateWithPatientDto struct { + Encounter CreateDto `json:"encounter"` + Patient ep.CreateDto `json:"patient"` +} diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 0b1da159..6bdcfa0c 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -25,7 +25,6 @@ import ( er "simrs-vx/internal/domain/main-entities/rehab/base" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" ) type Encounter struct { @@ -34,8 +33,6 @@ type Encounter struct { Patient *ep.Patient `json:"patient,omitempty" gorm:"foreignKey:Patient_Id;references:Id"` RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code" gorm:"not null;size:10"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialist_Code *string `json:"subspecialist_code"` diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index dfe271e5..63c5d4a4 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -3,15 +3,16 @@ package infra import ( ecore "simrs-vx/internal/domain/base-entities/core" ei "simrs-vx/internal/domain/main-entities/item" - erb "simrs-vx/internal/domain/main-entities/room/base" + + erb "simrs-vx/internal/domain/main-entities/procedure-room/base" ero "simrs-vx/internal/domain/references/organization" ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=10"` + Code string `json:"code" validate:"maxLength=20"` Name string `json:"name" validate:"maxLength=50"` - InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" validate:"maxLength=15"` + InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" validate:"maxLength=20"` Parent_Code *string `json:"parent_code"` Item_Code *string `json:"-"` Unit_Code *string `json:"unit_code"` @@ -31,7 +32,7 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - InfraGroup_Code ero.InfraGroupCode `json:"infraGroup-code"` + InfraGroup_Code ero.InfraGroupCode `json:"infra-group-code"` Parent_Code *string `json:"parent-code"` Item_Id *string `json:"item-code"` Search string `json:"search" gormhelper:"searchColumns=Code,Name"` @@ -69,7 +70,7 @@ type ResponseDto struct { Childrens []Infra `json:"childrens,omitempty"` Item_Code *string `json:"item_code"` Item *ei.Item `json:"item,omitempty"` - Rooms []erb.Basic `json:"rooms,omitempty"` + ProcedureRooms *erb.ProcedureRoom `json:"rooms,omitempty"` } func (d Infra) ToResponse() ResponseDto { @@ -79,10 +80,10 @@ func (d Infra) ToResponse() ResponseDto { InfraGroup_Code: d.InfraGroup_Code, Parent_Code: d.Parent_Code, // Parent: d.Parent, - Childrens: d.Childrens, - Item_Code: d.Item_Code, - Item: d.Item, - Rooms: d.Rooms, + Childrens: d.Childrens, + Item_Code: d.Item_Code, + Item: d.Item, + ProcedureRooms: d.ProcedureRooms, } resp.SmallMain = d.SmallMain return resp diff --git a/internal/domain/main-entities/infra/entity.go b/internal/domain/main-entities/infra/entity.go index 51cc8eaa..b9840db4 100644 --- a/internal/domain/main-entities/infra/entity.go +++ b/internal/domain/main-entities/infra/entity.go @@ -4,20 +4,20 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ei "simrs-vx/internal/domain/main-entities/item" - erb "simrs-vx/internal/domain/main-entities/room/base" + erb "simrs-vx/internal/domain/main-entities/procedure-room/base" ero "simrs-vx/internal/domain/references/organization" ) type Infra struct { ecore.SmallMain // adjust this according to the needs - Code string `json:"code" gorm:"uniqueIndex;size:10;not null"` + Code string `json:"code" gorm:"uniqueIndex;size:20;not null"` Name string `json:"name" gorm:"size:50"` - InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" gorm:"size:15"` - Parent_Code *string `json:"parent_code" gorm:"size:10"` + InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" gorm:"size:20"` + Parent_Code *string `json:"parent_code" gorm:"size:20"` Parent *Infra `json:"parent" gorm:"foreignKey:Parent_Code;references:Code"` Childrens []Infra `json:"childrens" gorm:"foreignKey:Parent_Code;references:Code"` Item_Code *string `json:"item_code" gorm:"size:50"` Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Code;references:Code"` - Rooms []erb.Basic `json:"rooms" gorm:"foreignKey:Infra_Code;references:Code"` + ProcedureRooms *erb.ProcedureRoom `json:"rooms" gorm:"foreignKey:Infra_Code;references:Code"` } diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index 5cc0ed5c..bd6fcc0e 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -9,9 +9,9 @@ import ( type CreateDto struct { Id *uint `json:"id"` - Code *string `json:"code" validate:"maxLength=10"` + Code *string `json:"code" validate:"maxLength=20"` Name string `json:"name" validate:"maxLength=50"` - EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code" validate:"maxLength=10"` + EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code" validate:"maxLength=20"` } type ReadListDto struct { diff --git a/internal/domain/main-entities/installation/entity.go b/internal/domain/main-entities/installation/entity.go index 5cc82430..6c3c0ecf 100644 --- a/internal/domain/main-entities/installation/entity.go +++ b/internal/domain/main-entities/installation/entity.go @@ -8,7 +8,7 @@ import ( type Installation struct { ecore.SmallMain // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:10"` + Code string `json:"code" gorm:"unique;size:20"` Name string `json:"name" gorm:"size:50"` EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code" gorm:"size:10"` InstallationPositions []eipb.Basic `json:"installationPositions,omitempty" gorm:"foreignKey:Installation_Code;references:Code"` diff --git a/internal/domain/main-entities/internal-reference/dto.go b/internal/domain/main-entities/internal-reference/dto.go index d3771c4d..c2ceec18 100644 --- a/internal/domain/main-entities/internal-reference/dto.go +++ b/internal/domain/main-entities/internal-reference/dto.go @@ -5,17 +5,17 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type CreateDto struct { - Encounter_Id *uint `json:"-"` - Unit_Code *string `json:"unit_code"` - Doctor_Code *string `json:"doctor_code"` - Nurse_Code *string `json:"nurse_code"` - Status_Code erc.DataApprovalCode `json:"status_code"` - SrcDoctor_Code *string `json:"srcDoctor_code"` - SrcNurse_Code *string `json:"srcNurse_code"` + Encounter_Id *uint `json:"-"` + Specialist_Code *string `json:"specialist_code"` + Doctor_Code *string `json:"doctor_code"` + Nurse_Code *string `json:"nurse_code"` + Status_Code erc.DataApprovalCode `json:"status_code"` + SrcDoctor_Code *string `json:"srcDoctor_code"` + SrcNurse_Code *string `json:"srcNurse_code"` } type ReadListDto struct { @@ -25,10 +25,10 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter-id"` - Unit_Code *uint `json:"unit-code"` - Doctor_Code *uint `json:"doctor-code"` - Status_Code erc.DataApprovalCode `json:"status-code"` + Encounter_Id *uint `json:"encounter-id"` + Specialist_Code *uint `json:"specialist-code"` + Doctor_Code *uint `json:"doctor-code"` + Status_Code erc.DataApprovalCode `json:"status-code"` } type ReadDetailDto struct { @@ -53,22 +53,22 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` - Doctor_Code *string `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty"` - Status_Code *erc.DataApprovalCode `json:"status_code"` + Encounter_Id *uint `json:"encounter_id"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Doctor_Code *string `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty"` + Status_Code *erc.DataApprovalCode `json:"status_code"` } func (d InternalReference) ToResponse() ResponseDto { resp := ResponseDto{ - Encounter_Id: d.Encounter_Id, - Unit_Code: d.Unit_Code, - Unit: d.Unit, - Doctor_Code: d.Doctor_Code, - Doctor: d.Doctor, - Status_Code: d.Status_Code, + Encounter_Id: d.Encounter_Id, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + Status_Code: d.Status_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/internal-reference/entity.go b/internal/domain/main-entities/internal-reference/entity.go index 90859710..15bbe5cb 100644 --- a/internal/domain/main-entities/internal-reference/entity.go +++ b/internal/domain/main-entities/internal-reference/entity.go @@ -6,21 +6,21 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" en "simrs-vx/internal/domain/main-entities/nurse" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type InternalReference struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - Doctor_Code *string `json:"doctor_code"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` - Status_Code *erc.DataApprovalCode `json:"status_code"` - SrcDoctor_Code *string `json:"srcDoctor_code"` - SrcDoctor *ed.Doctor `json:"srcDoctor,omitempty" gorm:"foreignKey:SrcDoctor_Code;references:Code"` - SrcNurse_Code *string `json:"srcNurse_code"` - SrcNurse *en.Nurse `json:"srcNurse,omitempty" gorm:"foreignKey:SrcNurse_Code;references:Code"` - Nurse_Code *string `json:"nurse_code"` - Nurse *en.Nurse `json:"nurse,omitempty" gorm:"foreignKey:Nurse_Code;references:Code"` + Encounter_Id *uint `json:"encounter_id"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Status_Code *erc.DataApprovalCode `json:"status_code"` + SrcDoctor_Code *string `json:"srcDoctor_code"` + SrcDoctor *ed.Doctor `json:"srcDoctor,omitempty" gorm:"foreignKey:SrcDoctor_Code;references:Code"` + SrcNurse_Code *string `json:"srcNurse_code"` + SrcNurse *en.Nurse `json:"srcNurse,omitempty" gorm:"foreignKey:SrcNurse_Code;references:Code"` + Nurse_Code *string `json:"nurse_code"` + Nurse *en.Nurse `json:"nurse,omitempty" gorm:"foreignKey:Nurse_Code;references:Code"` } diff --git a/internal/domain/main-entities/item/dto.go b/internal/domain/main-entities/item/dto.go index 686a5c17..a25c5a7a 100644 --- a/internal/domain/main-entities/item/dto.go +++ b/internal/domain/main-entities/item/dto.go @@ -13,6 +13,8 @@ type CreateDto struct { Uom_Code *string `json:"uom_code" validate:"maxLength=10"` Infra_Code *string `json:"infra_code"` Stock *int `json:"stock"` + BuyingPrice *float64 `json:"buyingPrice"` + SellingPrice *float64 `json:"sellingPrice"` } type ReadListDto struct { @@ -33,7 +35,7 @@ type FilterDto struct { } type ReadDetailDto struct { - Id *uint16 `json:"id"` + Id *uint `json:"id"` Code *string `json:"code"` } diff --git a/internal/domain/main-entities/material-package-item/dto.go b/internal/domain/main-entities/material-package-item/dto.go new file mode 100644 index 00000000..60b7e313 --- /dev/null +++ b/internal/domain/main-entities/material-package-item/dto.go @@ -0,0 +1,73 @@ +package materialpackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + em "simrs-vx/internal/domain/main-entities/material" + emp "simrs-vx/internal/domain/main-entities/material-package" +) + +type CreateDto struct { + MaterialPackage_Code string `json:"materialPackage_code" validate:"maxLength=20"` + Material_Code string `json:"material_code" validate:"maxLength=20"` + Count uint16 `json:"count" validate:"required"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination + Sort string `json:"sort"` +} + +type FilterDto struct { + MaterialPackage_Code string `json:"material-package-code"` + Material_Code string `json:"material_code"` +} + +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + MaterialPackage_Code string `json:"materialPackage_code"` + MaterialPackage *emp.MaterialPackage `json:"materialPackage,omitempty"` + Material_Code string `json:"material_code"` + Material *em.Material `json:"material,omitempty"` + Count *uint16 `json:"count"` +} + +func (d MaterialPackageItem) ToResponse() ResponseDto { + resp := ResponseDto{ + MaterialPackage_Code: d.MaterialPackage_Code, + MaterialPackage: d.MaterialPackage, + Material_Code: d.Material_Code, + Material: d.Material, + Count: d.Count, + } + resp.Id = d.Id + return resp +} + +func ToResponseList(data []MaterialPackageItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/material-package-item/entity.go b/internal/domain/main-entities/material-package-item/entity.go new file mode 100644 index 00000000..0c45969b --- /dev/null +++ b/internal/domain/main-entities/material-package-item/entity.go @@ -0,0 +1,16 @@ +package materialpackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + em "simrs-vx/internal/domain/main-entities/material" + emp "simrs-vx/internal/domain/main-entities/material-package" +) + +type MaterialPackageItem struct { + ecore.Main + MaterialPackage_Code string `json:"materialPackage_code" gorm:"size:20;not null"` + MaterialPackage *emp.MaterialPackage `json:"materialPackage" gorm:"foreignKey:MaterialPackage_Code;references:Code"` + Material_Code string `json:"code" gorm:"size:20;not null"` + Material *em.Material `json:"material" gorm:"foreignKey:Material_Code;references:Code"` + Count *uint16 `json:"count"` +} diff --git a/internal/domain/main-entities/material-package/dto.go b/internal/domain/main-entities/material-package/dto.go new file mode 100644 index 00000000..51dc1ab1 --- /dev/null +++ b/internal/domain/main-entities/material-package/dto.go @@ -0,0 +1,66 @@ +package materialpackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination + Sort string `json:"sort"` +} + +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + +type ReadDetailDto struct { + Id *uint16 `json:"id"` + Code *string `json:"code"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id *uint16 `json:"id"` + Code *string `json:"code"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.SmallMain + Code string `json:"code"` + Name string `json:"name"` +} + +func (d MaterialPackage) ToResponse() ResponseDto { + resp := ResponseDto{ + Code: d.Code, + Name: d.Name, + } + resp.SmallMain = d.SmallMain + return resp +} + +func ToResponseList(data []MaterialPackage) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/material-package/entity.go b/internal/domain/main-entities/material-package/entity.go new file mode 100644 index 00000000..4f3feeab --- /dev/null +++ b/internal/domain/main-entities/material-package/entity.go @@ -0,0 +1,11 @@ +package materialpackage + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type MaterialPackage struct { + ecore.SmallMain + Code string `json:"code" gorm:"unique;size:20;not null"` + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/base/dto.go b/internal/domain/main-entities/micro-mcu-order-item/base/dto.go new file mode 100644 index 00000000..56827131 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/base/dto.go @@ -0,0 +1,6 @@ +package micromcuorderitem + +type SubCreateDto struct { + McuSrc_Code string `json:"mcuSrc_code" validate:"required"` + Note string `json:"note"` +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/base/entity.go b/internal/domain/main-entities/micro-mcu-order-item/base/entity.go new file mode 100644 index 00000000..c9d91561 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/base/entity.go @@ -0,0 +1,17 @@ +package micromcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrderItem struct { + ecore.BigMain // adjust this according to the needs + MicroMcuOrder_Id uint64 `json:"microMcuOrder_id" gorm:"uniqueIndex:idx_order_src"` + McuSrc_Code string `json:"mcuSrc_code" gorm:"uniqueIndex:idx_order_src"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` + Note *string `json:"note" gorm:"size:1024"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/dto.go b/internal/domain/main-entities/micro-mcu-order-item/dto.go new file mode 100644 index 00000000..1d2ceaeb --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/dto.go @@ -0,0 +1,80 @@ +package micromcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + emro "simrs-vx/internal/domain/main-entities/micro-mcu-order" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type CreateDto struct { + MicroMcuOrder_Id uint64 `json:"microMcuOrder_id"` + McuSrc_Code string `json:"mcuSrc_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + MicroMcuOrder_Id *uint64 `json:"micro-mcu-order-id"` + McuSrc_Code *string `json:"mcu-src-code"` + Status_Code erc.DataStatusCode `json:"status-code"` +} +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + MicroMcuOrder_Id uint64 `json:"microMcuOrder_id"` + MicroMcuOrder *emro.MicroMcuOrder `json:"microMcuOrder,omitempty"` + McuSrc_Code string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d MicroMcuOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + MicroMcuOrder_Id: d.MicroMcuOrder_Id, + MicroMcuOrder: d.MicroMcuOrder, + McuSrc_Code: d.McuSrc_Code, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []MicroMcuOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/entity.go b/internal/domain/main-entities/micro-mcu-order-item/entity.go new file mode 100644 index 00000000..64d701f7 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/entity.go @@ -0,0 +1,18 @@ +package micromcuorderitem + +import ( + ems "simrs-vx/internal/domain/main-entities/mcu-src" + emo "simrs-vx/internal/domain/main-entities/micro-mcu-order" + emoib "simrs-vx/internal/domain/main-entities/micro-mcu-order-item/base" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrderItem struct { + emoib.MicroMcuOrderItem + MicroMcuOrder *emo.MicroMcuOrder `json:"microMcuOrder,omitempty" gorm:"foreignKey:MicroMcuOrder_Id;references:Id"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` +} + +func (d MicroMcuOrderItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/micro-mcu-order/base/entity.go b/internal/domain/main-entities/micro-mcu-order/base/entity.go new file mode 100644 index 00000000..3e611d81 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order/base/entity.go @@ -0,0 +1,18 @@ +package micromcuorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ercl "simrs-vx/internal/domain/references/clinical" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + Stage_Code ercl.McuOrderStageCode `json:"stage_code" gorm:"not null;size:10"` + AxillaryTemp float64 `json:"axillaryTemp"` + OtherNotes *string `json:"otherNotes"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/micro-mcu-order/dto.go b/internal/domain/main-entities/micro-mcu-order/dto.go new file mode 100644 index 00000000..008f219f --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order/dto.go @@ -0,0 +1,86 @@ +package micromcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + ercl "simrs-vx/internal/domain/references/clinical" +) + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id" validate:"required"` + Number uint64 `json:"number"` // SHOULD BE AUTOMATIC WITHOUT SYNC + OrderStage_Code string `json:"orderStage_code" gorm:"not null;size:10"` + AxillaryTemp float64 `json:"axillaryTemp"` + OtherNotes string `json:"otherNotes"` + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint `json:"encounter-id"` + Doctor_Code string `json:"doctor-code"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + Stage_Code ercl.McuOrderStageCode `json:"stage_code" gorm:"not null;size:10"` + AxillaryTemp float64 `json:"axillaryTemp"` + OtherNotes *string `json:"otherNotes"` +} + +func (d MicroMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + Stage_Code: d.Stage_Code, + AxillaryTemp: d.AxillaryTemp, + OtherNotes: d.OtherNotes, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []MicroMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/micro-mcu-order/entity.go b/internal/domain/main-entities/micro-mcu-order/entity.go new file mode 100644 index 00000000..57550c84 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order/entity.go @@ -0,0 +1,28 @@ +package micromcuorder + +import ( + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + emmoi "simrs-vx/internal/domain/main-entities/micro-mcu-order-item/base" + eamob "simrs-vx/internal/domain/main-entities/micro-mcu-order/base" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrder struct { + eamob.MicroMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Items []*emmoi.MicroMcuOrderItem `json:"items" gorm:"foreignKey:MicroMcuOrder_Id;references:Id"` +} + +func (d MicroMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d MicroMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d MicroMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/main-entities/nurse/dto.go b/internal/domain/main-entities/nurse/dto.go index b0cd6104..4ebd3800 100644 --- a/internal/domain/main-entities/nurse/dto.go +++ b/internal/domain/main-entities/nurse/dto.go @@ -4,15 +4,15 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/employee" ei "simrs-vx/internal/domain/main-entities/infra" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type CreateDto struct { - Code *string `json:"code" validate:"maxLength=20"` - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` - Unit_Code *string `json:"unit_code"` - Infra_Code *string `json:"infra_code"` + Code *string `json:"code" validate:"maxLength=20"` + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` + Specialist_Code *string `json:"specialist_code"` + Infra_Code *string `json:"infra_code"` } type ReadListDto struct { @@ -22,11 +22,11 @@ type ReadListDto struct { } type FilterDto struct { - Code *string `json:"code"` - Employee_Id *uint `json:"employee-id"` - IHS_Number *string `json:"ihs-number"` - Unit_Code *string `json:"unit-code"` - Infra_Code *string `json:"infra-code"` + Code *string `json:"code"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number"` + Specialist_Code *string `json:"specialist-code"` + Infra_Code *string `json:"infra-code"` } type ReadDetailDto struct { Id *uint16 `json:"id"` @@ -53,26 +53,26 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Code *string `json:"code"` - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty"` - IHS_Number *string `json:"ihs_number"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` - Infra_Code *string `json:"infra_code"` - Infra *ei.Infra `json:"infra,omitempty"` + Code *string `json:"code"` + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty"` + IHS_Number *string `json:"ihs_number"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Infra_Code *string `json:"infra_code"` + Infra *ei.Infra `json:"infra,omitempty"` } func (d Nurse) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Employee_Id: d.Employee_Id, - Employee: d.Employee, - IHS_Number: d.IHS_Number, - Unit_Code: d.Unit_Code, - Unit: d.Unit, - Infra_Code: d.Infra_Code, - Infra: d.Infra, + Code: d.Code, + Employee_Id: d.Employee_Id, + Employee: d.Employee, + IHS_Number: d.IHS_Number, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, + Infra_Code: d.Infra_Code, + Infra: d.Infra, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/nurse/entity.go b/internal/domain/main-entities/nurse/entity.go index cb1df0a8..adb14c10 100644 --- a/internal/domain/main-entities/nurse/entity.go +++ b/internal/domain/main-entities/nurse/entity.go @@ -4,17 +4,17 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/employee" ei "simrs-vx/internal/domain/main-entities/infra" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type Nurse struct { - ecore.Main // adjust this according to the needs - Code *string `json:"code" gorm:"unique;size:20"` - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - Infra_Code *string `json:"infra_code" gorm:"size:10"` - Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` + ecore.Main // adjust this according to the needs + Code *string `json:"code" gorm:"unique;size:20"` + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` + Specialist_Code *string `json:"specialist_code" gorm:"size:10"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Infra_Code *string `json:"infra_code" gorm:"size:10"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` } diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index 6418c6ac..248a7164 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -60,6 +60,7 @@ type UpdateDto struct { type DeleteDto struct { Id uint `json:"id"` + pa.AuthInfo } type SearchDto struct { diff --git a/internal/domain/main-entities/patient/entity.go b/internal/domain/main-entities/patient/entity.go index 83afa6ce..fc6d8833 100644 --- a/internal/domain/main-entities/patient/entity.go +++ b/internal/domain/main-entities/patient/entity.go @@ -15,7 +15,7 @@ type Patient struct { RegisteredAt *time.Time `json:"registeredAt"` RegisteredBy_User_Name *string `json:"registeredBy_user_name" gorm:"size:100"` Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` - Number *string `json:"number" gorm:"unique;size:15"` + Number *string `json:"number" gorm:"size:15;unique"` Parent_Number *string `json:"parent_number"` Parent *Patient `json:"parent,omitempty" gorm:"foreignKey:Parent_Number;references:Number"` } diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index 588379df..dbab95b0 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -19,6 +19,7 @@ type CreateDto struct { FrontTitle *string `json:"frontTitle" validate:"maxLength=50"` EndTitle *string `json:"endTitle" validate:"maxLength=50"` BirthDate *time.Time `json:"birthDate,omitempty"` + BirthPlace *string `json:"birthPlace" validate:"maxLength=4"` BirthRegency_Code *string `json:"birthRegency_code" validate:"maxLength=4"` Gender_Code *erp.GenderCode `json:"gender_code"` ResidentIdentityNumber *string `json:"residentIdentityNumber" validate:"nik;maxLength=16"` @@ -46,14 +47,13 @@ type ReadListDto struct { type FilterDto struct { Name string `json:"name"` - FrontTitle *string `json:"frontTitle"` - EndTitle *string `json:"endTitle"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency-code"` + FrontTitle *string `json:"front-title"` + EndTitle *string `json:"end-title"` + BirthDate *time.Time `json:"birth-date,omitempty"` Gender_Code *erp.GenderCode `json:"gender-code"` - ResidentIdentityNumber *string `json:"residentIdentityNumber"` - PassportNumber *string `json:"passportNumber"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber"` + ResidentIdentityNumber *string `json:"resident-identity-number"` + PassportNumber *string `json:"passport-number"` + DrivingLicenseNumber *string `json:"driving-license-number"` Religion_Code *erp.ReligionCode `json:"religion-code"` Education_Code *erp.EducationCode `json:"education-code"` Ocupation_Code *erp.OcupationCode `json:"occupation-code"` @@ -61,7 +61,7 @@ type FilterDto struct { Nationality *string `json:"nationality"` Ethnic_Code *string `json:"ethnic-code"` Language_Code *string `json:"language-code"` - CommunicationIssueStatus bool `json:"communicationIssueStatus"` + CommunicationIssueStatus bool `json:"communication-issue-status"` Disability *string `json:"disability"` } @@ -94,6 +94,7 @@ type ResponseDto struct { FrontTitle *string `json:"frontTitle"` EndTitle *string `json:"endTitle"` BirthDate *time.Time `json:"birthDate,omitempty"` + BirthPlace *string `json:"birthPlace"` BirthRegency_Code *string `json:"birthRegency_code"` BirthRegency *er.Regency `json:"birthRegency,omitempty"` Gender_Code *erp.GenderCode `json:"gender_code"` @@ -128,6 +129,7 @@ func (d *Person) ToResponse() ResponseDto { FrontTitle: d.FrontTitle, EndTitle: d.EndTitle, BirthDate: d.BirthDate, + BirthPlace: d.BirthPlace, BirthRegency_Code: d.BirthRegency_Code, BirthRegency: d.BirthRegency, Gender_Code: d.Gender_Code, diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 3c7d8629..10626229 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -23,6 +23,7 @@ type Person struct { FrontTitle *string `json:"frontTitle" gorm:"size:50"` EndTitle *string `json:"endTitle" gorm:"size:50"` BirthDate *time.Time `json:"birthDate,omitempty"` + BirthPlace *string `json:"birthPlace,omitempty"` BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` BirthRegency *er.Regency `json:"birthRegency,omitempty" gorm:"foreignKey:BirthRegency_Code;references:Code"` Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` diff --git a/internal/domain/main-entities/practice-schedule/dto.go b/internal/domain/main-entities/practice-schedule/dto.go index 832bc29d..35e7ff35 100644 --- a/internal/domain/main-entities/practice-schedule/dto.go +++ b/internal/domain/main-entities/practice-schedule/dto.go @@ -6,11 +6,11 @@ import ( ) type CreateDto struct { - Doctor_Code *string `json:"doctor_code"` - Unit_Code *string `json:"unit_code"` - Day_Code *erc.DayCode `json:"day_code"` - StartTime *string `json:"startTime" validate:"maxLength=5"` - EndTime *string `json:"endTime" validate:"maxLength=5"` + Doctor_Code *string `json:"doctor_code"` + Specialist_Code *string `json:"specialist_code"` + Day_Code *erc.DayCode `json:"day_code"` + StartTime *string `json:"startTime" validate:"maxLength=5"` + EndTime *string `json:"endTime" validate:"maxLength=5"` } type ReadListDto struct { @@ -20,11 +20,11 @@ type ReadListDto struct { } type FilterDto struct { - Doctor_Code *string `json:"doctor-code"` - Unit_Code *string `json:"unit-code"` - Day_Code *erc.DayCode `json:"day-code"` - StartTime *string `json:"startTime"` - EndTime *string `json:"endTime"` + Doctor_Code *string `json:"doctor-code"` + Specialist_Code *string `json:"specialist-code"` + Day_Code *erc.DayCode `json:"day-code"` + StartTime *string `json:"startTime"` + EndTime *string `json:"endTime"` } type ReadDetailDto struct { @@ -48,20 +48,20 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Doctor_Code *string `json:"doctor_code"` - Unit_Code *string `json:"unit_code"` - Day_Code *erc.DayCode `json:"day_code"` - StartTime *string `json:"startTime"` - EndTime *string `json:"endTime"` + Doctor_Code *string `json:"doctor_code"` + Specialist_Code *string `json:"specialist_code"` + Day_Code *erc.DayCode `json:"day_code"` + StartTime *string `json:"startTime"` + EndTime *string `json:"endTime"` } func (d PracticeSchedule) ToResponse() ResponseDto { resp := ResponseDto{ - Doctor_Code: d.Doctor_Code, - Unit_Code: d.Unit_Code, - Day_Code: d.Day_Code, - StartTime: d.StartTime, - EndTime: d.EndTime, + Doctor_Code: d.Doctor_Code, + Specialist_Code: d.Specialist_Code, + Day_Code: d.Day_Code, + StartTime: d.StartTime, + EndTime: d.EndTime, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/practice-schedule/entity.go b/internal/domain/main-entities/practice-schedule/entity.go index 84ea3296..3f466a3b 100644 --- a/internal/domain/main-entities/practice-schedule/entity.go +++ b/internal/domain/main-entities/practice-schedule/entity.go @@ -3,17 +3,17 @@ package practiceschedule import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" erc "simrs-vx/internal/domain/references/common" ) type PracticeSchedule struct { - ecore.Main // adjust this according to the needs - Doctor_Code *string `json:"doctor_code"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - Day_Code *erc.DayCode `json:"day_code"` - StartTime *string `json:"startTime" gorm:"size:5"` - EndTime *string `json:"endTime" gorm:"size:5"` + ecore.Main // adjust this according to the needs + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Day_Code *erc.DayCode `json:"day_code"` + StartTime *string `json:"startTime" gorm:"size:5"` + EndTime *string `json:"endTime" gorm:"size:5"` } diff --git a/internal/domain/main-entities/procedure-report/dto.go b/internal/domain/main-entities/procedure-report/dto.go new file mode 100644 index 00000000..ec815b43 --- /dev/null +++ b/internal/domain/main-entities/procedure-report/dto.go @@ -0,0 +1,111 @@ +package procedurereport + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" + + pa "simrs-vx/internal/lib/auth" +) + +type CreateDto struct { + Encounter_Id uint64 `json:"encounter_id" validate:"required"` + Date *time.Time `json:"date" validate:"required"` + Doctor_Code string `json:"doctor_code" validate:"required"` + Operator_Name string `json:"operator_name" validate:"required"` + Assistant_Name string `json:"assistant_name" validate:"required"` + Instrumentor_Name string `json:"instrumentor_name" validate:"required"` + Anesthesia_Doctor_Code *string `json:"anesthesia_doctor_code"` + Anesthesia_Nurse_Name *string `json:"anesthesia_nurse_name"` + Diagnose *string `json:"diagnose"` + Nurse_Name string `json:"nurse_name" validate:"required"` + ProcedureValue string `json:"procedure_value" validate:"required"` + ExecutionValue string `json:"execution_value" validate:"required"` + Type_Code string `json:"type_code" validate:"required"` + + pa.AuthInfo + + // PROPER + // Operator_Employe_Id uint `json:"operator_employe_id" validate:"required"` + // Assistant_Employe_Id uint `json:"assistant_employe_id" validate:"required"` + // Instrumentor_Employe_Id uint `json:"instrumentor_employe_id" validate:"required"` + // Anesthesia_Doctor_Code string `json:"anesthesia_doctor_code" validate:"required"` + // Anesthesia_Nurse_Employe_Id uint `json:"anesthesia_nurse_employe_id" validate:"required"` + // Nurse_Code string `json:"nurse_code" validate:"required"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter-id"` + Type_Code string `json:"type-code"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id uint64 `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Date *time.Time `json:"date"` + Doctor_Code string `json:"doctor_code"` + Operator_Name string `json:"operator_name"` + Assistant_Name string `json:"assistant_name"` + Instrumentor_Name string `json:"instrumentor_name"` + Anesthesia_Doctor_Code *string `json:"anesthesia_doctor_code"` + Anesthesia_Nurse_Name *string `json:"anesthesia_nurse_name"` + Diagnose *string `json:"diagnose"` + Nurse_Name string `json:"nurse_name"` + ProcedureValue *string `json:"procedure_value"` + ExecutionValue *string `json:"execution_value"` + Type_Code string `json:"type_code"` +} + +func (d ProcedureReport) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Date: d.Date, + Doctor_Code: d.Doctor_Code, + Operator_Name: d.Operator_Name, + Assistant_Name: d.Assistant_Name, + Instrumentor_Name: d.Instrumentor_Name, + Anesthesia_Doctor_Code: d.Anesthesia_Doctor_Code, + Anesthesia_Nurse_Name: d.Anesthesia_Nurse_Name, + Nurse_Name: d.Nurse_Name, + ProcedureValue: &d.ProcedureValue, + ExecutionValue: &d.ExecutionValue, + Type_Code: d.Type_Code, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []ProcedureReport) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/procedure-report/entity.go b/internal/domain/main-entities/procedure-report/entity.go new file mode 100644 index 00000000..cf084bd4 --- /dev/null +++ b/internal/domain/main-entities/procedure-report/entity.go @@ -0,0 +1,67 @@ +package procedurereport + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" +) + +type ProcedureReport struct { + ecore.Main // adjust this according to the needs + Encounter_Id uint64 `json:"encounter_id" gorm:"foreignKey"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Date *time.Time `json:"date" gorm:"not null;size:20"` + Doctor_Code string `json:"doctor_code" gorm:"size:10"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Operator_Name string `json:"operator_name"` + Assistant_Name string `json:"assistant_name"` + Instrumentor_Name string `json:"instrumentor_name"` + Diagnose *string `json:"diagnose" gorm:"size:1024"` + Nurse_Name string `json:"nurse_name"` + Anesthesia_Doctor_Code *string `json:"anesthesia_doctor_code" gorm:"size:10"` + Anesthesia_Doctor *ed.Doctor `json:"anesthesia,omitempty" gorm:"foreignKey:Anesthesia_Doctor_Code;references:Code"` + Anesthesia_Nurse_Name *string `json:"anesthesia_nurse_name"` + ProcedureValue string `json:"procedure_value"` + ExecutionValue string `json:"execution_value"` + Type_Code string `json:"type_code"` + + // SurgerySize_Code *string `json:"surgerySize_code" gorm:"size:10"` + // Billing_Code *string `json:"billing_code" gorm:"size:10"` + // SurgerySystem_Code *string `json:"surgerySystem_code" gorm:"size:10"` + // StartAt *string `json:"startAt" gorm:"size:20"` + // EndAt *string `json:"endAt" gorm:"size:20"` + // AnesthesiaStartAt *string `json:"anesthesiaStartAt" gorm:"size:20"` + // AnesthesiaEndAt *string `json:"anesthesiaEndAt" gorm:"size:20"` + // SurgeryType_Code *string `json:"surgeryType_code" gorm:"size:10"` + // SurgeryStage_Code *string `json:"surgeryStage_code" gorm:"size:10"` + // BornMortality_Code *string `json:"bornMortality_code" gorm:"size:10"` + // BornLocation_Code *string `json:"bornLocation_code" gorm:"size:10"` + // Weight *string `json:"weight" gorm:"size:10"` + // BornNotes *string `json:"bornNotes" gorm:"size:1024"` + // Description *string `json:"notes" gorm:"size:1024"` + // BleedingAmount *uint16 `json:"bleedingAmount" gorm:"size:10"` + // BloodInType_Code *string `json:"bloodInType_code" gorm:"size:10"` + // BloodInAmount *uint16 `json:"bloodInAmount" gorm:"size:10"` + // Brand *string `json:"brand" gorm:"size:100"` + // ImplantName *string `json:"implantName" gorm:"size:100"` + // ImplantRegisterNumber *string `json:"implantRegisterNumber" gorm:"size:100"` + // ImplantCompanionName *string `json:"implantCompanionName" gorm:"size:100"` + // SpecimentDest_Code *string `json:"specimentDest" gorm:"size:100"` + // TissueInfo *string `json:"tissueInfo" gorm:"size:100"` + + //PROPER + // Doctor_Code string `json:"doctor_code" gorm:"size:10"` + // Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + // Operator_Employe_Id uint `json:"operator_employe_id"` + // Operator_Employe *eem.Employee `json:"operator_employe,omitempty" gorm:"foreignKey:Operator_Employe_Id;references:Id"` + // Assistant_Employe_Id uint `json:"assistant_employe_id"` + // Instrumentor_Employe_Id uint `json:"instrumentor_employe_id"` + // Instrumentor_Employe *eem.Employee `json:"instrumentor_employe,omitempty" gorm:"foreignKey:Instrumentor_Employe_Id;references:Id"` + // Nurse_Code string `json:"nurse_code" gorm:"size:10"` + // Nurse *en.Nurse `json:"nurse,omitempty" gorm:"foreignKey:Nurse_Code;references:Code"` + // Anesthesia_Doctor_Code string `json:"anesthesia_doctor_code" gorm:"size:10"` + // Anesthesia *eem.Employee `json:"anesthesia,omitempty" gorm:"foreignKey:Anesthesia_Doctor_Code;references:Code"` + // Anesthesia_Nurse_Employe_Id uint `json:"anesthesia_nurse_employe_id"` + // Anesthesia_Nurse *eem.Employee `json:"anesthesia_nurse,omitempty" gorm:"foreignKey:Anesthesia_Nurse_Employe_Id;references:Id"` +} diff --git a/internal/domain/main-entities/procedure-room-order-item/base/entity.go b/internal/domain/main-entities/procedure-room-order-item/base/entity.go new file mode 100644 index 00000000..cd54e456 --- /dev/null +++ b/internal/domain/main-entities/procedure-room-order-item/base/entity.go @@ -0,0 +1,12 @@ +package procedureroomorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type ProcedureRoomOrderItem struct { + ecore.BigMain + ProcedureRoomOrder_Id uint64 `json:"procedureRoomOrder_id"` + ProcedureRoom_Code string `json:"procedureRoom_code" gorm:"size:20"` + Note string `json:"note" gorm:"size:255"` +} diff --git a/internal/domain/main-entities/procedure-room-order-item/dto.go b/internal/domain/main-entities/procedure-room-order-item/dto.go new file mode 100644 index 00000000..83c4d094 --- /dev/null +++ b/internal/domain/main-entities/procedure-room-order-item/dto.go @@ -0,0 +1,70 @@ +package procedureroomorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + epr "simrs-vx/internal/domain/main-entities/procedure-room" +) + +type CreateDto struct { + ProcedureRoomOrder_Id uint64 `json:"procedureRoomOrder_id"` + ProcedureRoom_Code string `json:"procedureRoom_code"` + Note string `json:"note"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint64 `json:"encounter-id"` + ProcedureRoomOrder_Id uint64 `json:"procedure-room-order-id"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + ProcedureRoomOrder_Id uint64 `json:"procedureRoomOrder_id"` + ProcedureRoom_Code string `json:"procedureRoom_code"` + ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty"` + Note string `json:"note"` +} + +func (d ProcedureRoomOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + ProcedureRoomOrder_Id: d.ProcedureRoomOrder_Id, + ProcedureRoom_Code: d.ProcedureRoom_Code, + ProcedureRoom: d.ProcedureRoom, + Note: d.Note, + } + resp.Id = d.Id + return resp +} + +func ToResponseList(data []ProcedureRoomOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/procedure-room-order-item/entity.go b/internal/domain/main-entities/procedure-room-order-item/entity.go new file mode 100644 index 00000000..13b4978b --- /dev/null +++ b/internal/domain/main-entities/procedure-room-order-item/entity.go @@ -0,0 +1,13 @@ +package procedureroomorder + +import ( + epr "simrs-vx/internal/domain/main-entities/procedure-room" + epro "simrs-vx/internal/domain/main-entities/procedure-room-order" + eb "simrs-vx/internal/domain/main-entities/procedure-room-order-item/base" +) + +type ProcedureRoomOrderItem struct { + eb.ProcedureRoomOrderItem + ProcedureRoomOrder *epro.ProcedureRoomOrder `json:"procedureRoomOrder,omitempty" gorm:"foreignKey:ProcedureRoomOrder_Id;references:Id"` + ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty" gorm:"foreignKey:ProcedureRoom_Code;references:Code"` +} diff --git a/internal/domain/main-entities/procedure-room-order/dto.go b/internal/domain/main-entities/procedure-room-order/dto.go new file mode 100644 index 00000000..4482081c --- /dev/null +++ b/internal/domain/main-entities/procedure-room-order/dto.go @@ -0,0 +1,74 @@ +package procedureroomorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ec "simrs-vx/internal/domain/main-entities/encounter" + emp "simrs-vx/internal/domain/main-entities/material-package" + epr "simrs-vx/internal/domain/main-entities/procedure-room" + erc "simrs-vx/internal/domain/references/common" +) + +type CreateDto struct { + Encounter_Id uint64 `json:"encounter_id" validate:"required"` + // Infra_Code string `json:"infra_code" validate:"required"` + MaterialPackage_Code *string `json:"materialPackage_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint64 `json:"encounter-id"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint64 `json:"encounter_id"` + Encounter *ec.Encounter `json:"encounter,omitempty"` + Infra_Code string `json:"procedure"` + MaterialPackage_Code *string `json:"materialPackage_code"` + Status_Code erc.DataStatusCode `json:"status_code"` + ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty"` + MaterialPackage *emp.MaterialPackage `json:"materialPackage,omitempty"` +} + +func (d ProcedureRoomOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + // Infra_Code: d.Infra_Code, + MaterialPackage_Code: d.MaterialPackage_Code, + Status_Code: d.Status_Code, + } + resp.Id = d.Id + return resp +} + +func ToResponseList(data []ProcedureRoomOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/procedure-room-order/entity.go b/internal/domain/main-entities/procedure-room-order/entity.go new file mode 100644 index 00000000..5a4a8542 --- /dev/null +++ b/internal/domain/main-entities/procedure-room-order/entity.go @@ -0,0 +1,24 @@ +package procedureroomorder + +import ( + erc "simrs-vx/internal/domain/references/common" + + ecore "simrs-vx/internal/domain/base-entities/core" + emp "simrs-vx/internal/domain/main-entities/material-package" + eproi "simrs-vx/internal/domain/main-entities/procedure-room-order-item/base" +) + +type ProcedureRoomOrder struct { + ecore.BigMain + Encounter_Id uint64 `json:"encounter_id"` + // Infra_Code string `json:"infra_code" gorm:"size:20"` + // ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` + MaterialPackage_Code *string `json:"materialPackage_code" gorm:"size:20"` + MaterialPackage *emp.MaterialPackage `json:"materialPackage,omitempty" gorm:"foreignKey:MaterialPackage_Code;references:Code"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:20"` + Items []eproi.ProcedureRoomOrderItem `json:"items,omitempty" gorm:"foreignKey:ProcedureRoomOrder_Id;references:Id"` +} + +func (d ProcedureRoomOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} diff --git a/internal/domain/main-entities/procedure-room/base/entity.go b/internal/domain/main-entities/procedure-room/base/entity.go new file mode 100644 index 00000000..ec42de2c --- /dev/null +++ b/internal/domain/main-entities/procedure-room/base/entity.go @@ -0,0 +1,20 @@ +package procedureroombase + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ero "simrs-vx/internal/domain/references/organization" +) + +type ProcedureRoom struct { + ecore.SmallMain + Code string `json:"code" gorm:"unique;size:20"` // copied from infra code + Infra_Code *string `json:"infra_code" gorm:"size:20;unique"` + Type_Code *ero.ProdcedureRoomTypeCode `json:"type_code" gorm:"size:10"` + Specialist_Code *string `json:"specialist_code" gorm:"size:20"` + Subspecialist_Code *string `json:"subspecialist_code" gorm:"size:20"` +} + +// THIS IS ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ +// func (ProcedureRoom) TableName() string { +// return "Room" +// } diff --git a/internal/domain/main-entities/room/dto.go b/internal/domain/main-entities/procedure-room/dto.go similarity index 80% rename from internal/domain/main-entities/room/dto.go rename to internal/domain/main-entities/procedure-room/dto.go index 2ff41c3a..28779c73 100644 --- a/internal/domain/main-entities/room/dto.go +++ b/internal/domain/main-entities/procedure-room/dto.go @@ -1,16 +1,16 @@ -package room +package procedureroom import ( ecore "simrs-vx/internal/domain/base-entities/core" ei "simrs-vx/internal/domain/main-entities/infra" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" ) type CreateDto struct { + Code *string `json:"code"` Infra_Code *string `json:"infra_code"` - Unit_Code *string `json:"unit_code"` + Type_Code string `json:"type_code"` Specialist_Code *string `json:"specialist_code"` Subspecialist_Code *string `json:"subspecialist_code"` } @@ -23,7 +23,7 @@ type ReadListDto struct { type FilterDto struct { Infra_Code *string `json:"infra-code"` - Unit_Code *string `json:"unit-code"` + Type_Code string `json:"type-code"` Specialist_Code *string `json:"specialist-code"` Subspecialist_Code *string `json:"subspecialist-code"` } @@ -49,22 +49,22 @@ type MetaDto struct { type ResponseDto struct { ecore.SmallMain + Code string `json:"code"` + Type_Code *string `json:"type_code"` Infra_Code *string `json:"infra_code"` Infra *ei.Infra `json:"infra,omitempty"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty"` Subspecialist_Code *string `json:"subspecialist_code"` Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` } -func (d Room) ToResponse() ResponseDto { +func (d ProcedureRoom) ToResponse() ResponseDto { resp := ResponseDto{ + Code: d.Code, Infra_Code: d.Infra_Code, Infra: d.Infra, - Unit_Code: d.Unit_Code, - Unit: d.Unit, + Type_Code: (*string)(d.Type_Code), Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, @@ -74,7 +74,7 @@ func (d Room) ToResponse() ResponseDto { return resp } -func ToResponseList(data []Room) []ResponseDto { +func ToResponseList(data []ProcedureRoom) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { resp[i] = u.ToResponse() diff --git a/internal/domain/main-entities/procedure-room/entity.go b/internal/domain/main-entities/procedure-room/entity.go new file mode 100644 index 00000000..76186011 --- /dev/null +++ b/internal/domain/main-entities/procedure-room/entity.go @@ -0,0 +1,15 @@ +package procedureroom + +import ( + ei "simrs-vx/internal/domain/main-entities/infra" + ebase "simrs-vx/internal/domain/main-entities/procedure-room/base" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" +) + +type ProcedureRoom struct { + ebase.ProcedureRoom + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Code;references:Code"` +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/base/dto.go b/internal/domain/main-entities/radiology-mcu-order-item/base/dto.go new file mode 100644 index 00000000..8ca6d02f --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/base/dto.go @@ -0,0 +1,6 @@ +package radiologymcuorderitem + +type SubCreateDto struct { + McuSrc_Code string `json:"mcuSrc_code" validate:"required"` + Note string `json:"note"` +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/base/entity.go b/internal/domain/main-entities/radiology-mcu-order-item/base/entity.go new file mode 100644 index 00000000..1f3ff5a5 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/base/entity.go @@ -0,0 +1,17 @@ +package radiologymcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrderItem struct { + ecore.BigMain // adjust this according to the needs + RadiologyMcuOrder_Id uint64 `json:"radiologyMcuOrder_id" gorm:"uniqueIndex:idx_order_src"` + McuSrc_Code string `json:"mcuSrc_code" gorm:"uniqueIndex:idx_order_src"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` + Note *string `json:"note" gorm:"size:1024"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/dto.go b/internal/domain/main-entities/radiology-mcu-order-item/dto.go new file mode 100644 index 00000000..99c65df3 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/dto.go @@ -0,0 +1,80 @@ +package radiologymcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + emro "simrs-vx/internal/domain/main-entities/radiology-mcu-order" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type CreateDto struct { + RadiologyMcuOrder_Id uint64 `json:"radiologyMcuOrder_id"` + McuSrc_Code string `json:"mcuSrc_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + RadiologyMcuOrder_Id *uint64 `json:"radiology-mcu-order-id"` + McuSrc_Code *string `json:"mcu-src-code"` + Status_Code erc.DataStatusCode `json:"status-code"` +} +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + RadiologyMcuOrder_Id uint64 `json:"radiologyMcuOrder_id"` + RadiologyMcuOrder *emro.RadiologyMcuOrder `json:"radiologyMcuOrder,omitempty"` + McuSrc_Code string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d RadiologyMcuOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + RadiologyMcuOrder_Id: d.RadiologyMcuOrder_Id, + RadiologyMcuOrder: d.RadiologyMcuOrder, + McuSrc_Code: d.McuSrc_Code, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []RadiologyMcuOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/entity.go b/internal/domain/main-entities/radiology-mcu-order-item/entity.go new file mode 100644 index 00000000..da20a56a --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/entity.go @@ -0,0 +1,17 @@ +package radiologymcuorderitem + +import ( + emo "simrs-vx/internal/domain/main-entities/radiology-mcu-order" + emoib "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item/base" + + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrderItem struct { + emoib.RadiologyMcuOrderItem + RadiologyMcuOrder *emo.RadiologyMcuOrder `json:"radiologyMcuOrder,omitempty" gorm:"foreignKey:RadiologyMcuOrder_Id;references:Id"` +} + +func (d RadiologyMcuOrderItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/radiology-mcu-order/base/entity.go b/internal/domain/main-entities/radiology-mcu-order/base/entity.go new file mode 100644 index 00000000..6871e689 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order/base/entity.go @@ -0,0 +1,17 @@ +package radiologymcuorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + ClinicalNotes *string `json:"clinicalNotes"` + OtherNotes *string `json:"otherNotes"` + Resume *string `json:"resume"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/radiology-mcu-order/dto.go b/internal/domain/main-entities/radiology-mcu-order/dto.go new file mode 100644 index 00000000..4250b4b0 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order/dto.go @@ -0,0 +1,88 @@ +package radiologymcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + ermoi "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item/base" +) + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id"` + Number *uint64 `json:"number"` // SHOULD BE AUTOMATIC WITHOUT SYNC + Doctor_Code string `json:"-" validate:"required"` + ClinicalNotes *string `json:"clinicalNotes"` + OtherNotes *string `json:"otherNotes"` + Items []ermoi.SubCreateDto `json:"items" validate:"required"` + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint `json:"encounter-id"` + Doctor_Code string `json:"doctor-code"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + ClinicalNotes *string `json:"clinicalNotes"` + OtherNotes *string `json:"otherNotes"` + Resume *string `json:"resume"` + Items []*ermoi.RadiologyMcuOrderItem +} + +func (d RadiologyMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + ClinicalNotes: d.ClinicalNotes, + OtherNotes: d.OtherNotes, + Resume: d.Resume, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []RadiologyMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/radiology-mcu-order/entity.go b/internal/domain/main-entities/radiology-mcu-order/entity.go new file mode 100644 index 00000000..1ef8882d --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order/entity.go @@ -0,0 +1,28 @@ +package radiologymcuorder + +import ( + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + ermoi "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item/base" + eamob "simrs-vx/internal/domain/main-entities/radiology-mcu-order/base" + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrder struct { + eamob.RadiologyMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Items []*ermoi.RadiologyMcuOrderItem `json:"items" gorm:"foreignKey:RadiologyMcuOrder_Id;references:Id"` +} + +func (d RadiologyMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d RadiologyMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d RadiologyMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/main-entities/registrator/dto.go b/internal/domain/main-entities/registrator/dto.go new file mode 100644 index 00000000..5f0d4517 --- /dev/null +++ b/internal/domain/main-entities/registrator/dto.go @@ -0,0 +1,71 @@ +package registrator + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/employee" + ei "simrs-vx/internal/domain/main-entities/installation" +) + +type CreateDto struct { + Employee_Id uint `json:"employee_id"` + Installation_Code string `json:"installation_code" validate:"maxLength=20"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Employee_Id *uint `json:"employee-id"` + Installation_Code *string `json:"installation-code"` +} + +type ReadDetailDto struct { + Id *uint `json:"id"` + Employee_Id *uint `json:"employee_id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id *uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Employee_Id uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty"` + Installation_Code string `json:"installation_code"` + Installation *ei.Installation `json:"installation,omitempty"` +} + +func (d Registrator) ToResponse() ResponseDto { + resp := ResponseDto{ + Employee_Id: d.Employee_Id, + Employee: d.Employee, + Installation_Code: d.Installation_Code, + Installation: d.Installation, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Registrator) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/registrator/entity.go b/internal/domain/main-entities/registrator/entity.go new file mode 100644 index 00000000..31998c1c --- /dev/null +++ b/internal/domain/main-entities/registrator/entity.go @@ -0,0 +1,15 @@ +package registrator + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/employee" + ei "simrs-vx/internal/domain/main-entities/installation" +) + +type Registrator struct { + ecore.Main // adjust this according to the needs + Employee_Id uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + Installation_Code string `json:"installation_code" gorm:"size:20"` + Installation *ei.Installation `json:"installation,omitempty" gorm:"foreignKey:Installation_Code;references:Code"` +} diff --git a/internal/domain/main-entities/room/base/entity.go b/internal/domain/main-entities/room/base/entity.go deleted file mode 100644 index d5651ac9..00000000 --- a/internal/domain/main-entities/room/base/entity.go +++ /dev/null @@ -1,23 +0,0 @@ -package base - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - es "simrs-vx/internal/domain/main-entities/specialist" - ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" -) - -type Basic struct { - ecore.SmallMain // adjust this according to the needs - Infra_Code *string `json:"infra_code" gorm:"size:10"` - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - Specialist_Code *string `json:"specialist_code" gorm:"size:10"` - Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` - Subspecialist_Code *string `json:"subspecialist_code" gorm:"size:10"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Code;references:Code"` -} - -func (Basic) TableName() string { - return "Room" -} diff --git a/internal/domain/main-entities/room/entity.go b/internal/domain/main-entities/room/entity.go deleted file mode 100644 index 49fb8cc6..00000000 --- a/internal/domain/main-entities/room/entity.go +++ /dev/null @@ -1,11 +0,0 @@ -package room - -import ( - ei "simrs-vx/internal/domain/main-entities/infra" - ebase "simrs-vx/internal/domain/main-entities/room/base" -) - -type Room struct { - ebase.Basic - Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` -} diff --git a/internal/domain/main-entities/screening/dto.go b/internal/domain/main-entities/screening/dto.go index 5dfed2c7..0c4310ed 100644 --- a/internal/domain/main-entities/screening/dto.go +++ b/internal/domain/main-entities/screening/dto.go @@ -27,6 +27,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } @@ -38,16 +39,17 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` + Includes string `json:"includes"` } type UpdateDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` CreateDto } type DeleteDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` } type MetaDto struct { @@ -84,3 +86,122 @@ func ToResponseList(data []Screening) []ResponseDto { } return resp } + +type ScreeningEntry struct { + AgeAtRisk bool `json:"ageAtRisk"` // Usia Dengan Risiko + LowCognitiveFunction bool `json:"lowCognitiveFunction"` // Pasien Dengan Fungsi Kognitif Rendah + HighRiskPatient bool `json:"highRiskPatient"` // Pasien Dengan Risiko Tinggi + HighComplaintPotential bool `json:"highComplaintPotential"` // Potensi Komplain Tinggi (Medik dan Non Medik) + ChronicOrCatastrophicOrTerminal bool `json:"chronicOrCatastrophicOrTerminal"` // Kasus Dengan Penyakit Kronis, Katastropik, Terminal + LowFunctionalStatus bool `json:"lowFunctionalStatus"` // Status Fungsional Rendah, Kebutuhan Bantuan ADL Tinggi + HistoryOfMedicalDeviceUse bool `json:"historyOfMedicalDeviceUse"` // Pasien Dengan Riwayat Penggunaan Peralatan Medis Masa Lalu + MentalOrSocialIssues bool `json:"mentalOrSocialIssues"` // Riwayat Gangguan Mental, Bunuh Diri, Krisis Keluarga, Isu Sosial + FrequentERVisitsOrReadmission bool `json:"frequentERVisitsOrReadmission"` // Sering Masuk IGD, Readmisi RS + HighCareCostEstimate bool `json:"highCareCostEstimate"` // Perkiraan Asuhan Dengan Biaya Tinggi + ComplexFinancingSystem bool `json:"complexFinancingSystem"` // Kemungkinan Sistem Pembiayaan Yang Kompleks + AboveAverageLengthOfStay bool `json:"aboveAverageLengthOfStay"` // Kasus Yang Melebihi Rata-Rata Lama Dirawat + ImportantOrHighRiskDischargePlanning bool `json:"importantOrHighRiskDischargePlanning"` // Rencana Pemulangan Penting / Kontinuitas Pelayanan + Stagnation bool `json:"stagnation"` // Stagnasi +} + +type ProblemIdentification struct { + CareNotFollowingGuidelines bool `json:"careNotFollowingGuidelines"` // Tingkat Asuhan Tidak Sesuai Panduan/ Norma + OverUtilization bool `json:"overUtilization"` // Over Utilization Pelayanan + UnderUtilization bool `json:"underUtilization"` // Under Utilization Pelayanan + PatientNonCompliance bool `json:"patientNonCompliance"` // Ketidakpatuhan Pasien + InadequateEducation bool `json:"inadequateEducation"` // Edukasi Kurang Memadai + LackOfFamilySupport bool `json:"lackOfFamilySupport"` // Kurang Dukungan Keluarga + DecreasedDetermination bool `json:"decreasedDetermination"` // Penurunan Determinasi Ketika Komplikasi Meningkat + FinancialDifficultyDuringComplications bool `json:"financialDifficultyDuringComplications"` // Kendala Keuangan Ketika Komplikasi Meningkat + DischargeCriteriaNotMetOrDelayed bool `json:"dischargeCriteriaNotMetOrDelayed"` // Pemulangan/ Rujukan Belum Memenuhi Kriteria/ Ditunda +} + +type FormA struct { + Screening ScreeningEntry `json:"screening"` + AssessmentDetail string `json:"assessmentDetail"` // Masukkan detail assesmen + ProblemIdentification ProblemIdentification `json:"problemIdentification"` + PlanningDetail string `json:"planningDetail"` // Masukkan detail perencanaan +} + +func (s ScreeningEntry) SelectedScreeningLabels() []string { + result := []string{} + + if s.AgeAtRisk { + result = append(result, "Usia Dengan Risiko") + } + if s.LowCognitiveFunction { + result = append(result, "Pasien Dengan Fungsi Kognitif Rendah") + } + if s.HighRiskPatient { + result = append(result, "Pasien Dengan Risiko Tinggi") + } + if s.HighComplaintPotential { + result = append(result, "Potensi Komplain Tinggi (Medik dan Non Medik)") + } + if s.ChronicOrCatastrophicOrTerminal { + result = append(result, "Kasus Dengan Penyakit Kronis, Katastropik, Terminal") + } + if s.LowFunctionalStatus { + result = append(result, "Status Fungsional Rendah, Kebutuhan Bantuan ADL Tinggi") + } + if s.HistoryOfMedicalDeviceUse { + result = append(result, "Pasien Dengan Riwayat Penggunaan Peralatan Medis Masa Lalu") + } + if s.MentalOrSocialIssues { + result = append(result, "Riwayat Gangguan Mental, Bunuh Diri, Krisis Keluarga, Isu Sosial") + } + if s.FrequentERVisitsOrReadmission { + result = append(result, "Sering Masuk IGD, Readmisi RS") + } + if s.HighCareCostEstimate { + result = append(result, "Perkiraan Asuhan Dengan Biaya Tinggi") + } + if s.ComplexFinancingSystem { + result = append(result, "Kemungkinan Sistem Pembiayaan Yang Kompleks") + } + if s.AboveAverageLengthOfStay { + result = append(result, "Kasus Yang Melebihi Rata-Rata Lama Dirawat") + } + if s.ImportantOrHighRiskDischargePlanning { + result = append(result, "Rencana Pemulangan Penting / Kontinuitas Pelayanan") + } + if s.Stagnation { + result = append(result, "Stagnasi") + } + + return result +} + +func (p ProblemIdentification) SelectedProblemLabels() []string { + result := []string{} + + if p.CareNotFollowingGuidelines { + result = append(result, "Tingkat Asuhan Tidak Sesuai Panduan/ Norma") + } + if p.OverUtilization { + result = append(result, "Over Utilization Pelayanan") + } + if p.UnderUtilization { + result = append(result, "Under Utilization Pelayanan") + } + if p.PatientNonCompliance { + result = append(result, "Ketidakpatuhan Pasien") + } + if p.InadequateEducation { + result = append(result, "Edukasi Kurang Memadai") + } + if p.LackOfFamilySupport { + result = append(result, "Kurang Dukungan Keluarga") + } + if p.DecreasedDetermination { + result = append(result, "Penurunan Determinasi Ketika Komplikasi Meningkat") + } + if p.FinancialDifficultyDuringComplications { + result = append(result, "Kendala Keuangan Ketika Komplikasi Meningkat") + } + if p.DischargeCriteriaNotMetOrDelayed { + result = append(result, "Pemulangan/ Rujukan Belum Memenuhi Kriteria/ Ditunda") + } + + return result +} diff --git a/internal/domain/main-entities/screening/entity.go b/internal/domain/main-entities/screening/entity.go index a6284c16..007573c4 100644 --- a/internal/domain/main-entities/screening/entity.go +++ b/internal/domain/main-entities/screening/entity.go @@ -18,3 +18,7 @@ type Screening struct { Value *string `json:"value"` FileUrl *string `json:"fileUrl" gorm:"size:1024"` } + +func (d Screening) IsFormA() bool { + return d.Type == erc.SFTCA +} diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go index 94094df7..bc847b3b 100644 --- a/internal/domain/main-entities/soapi/dto.go +++ b/internal/domain/main-entities/soapi/dto.go @@ -37,16 +37,19 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` + Includes string `json:"includes"` } type UpdateDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` CreateDto + pa.AuthInfo } type DeleteDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` + pa.AuthInfo } type MetaDto struct { diff --git a/internal/domain/main-entities/soapi/entity.go b/internal/domain/main-entities/soapi/entity.go index 7e457ca9..d67f692a 100644 --- a/internal/domain/main-entities/soapi/entity.go +++ b/internal/domain/main-entities/soapi/entity.go @@ -17,6 +17,6 @@ type Soapi struct { Employee_Id *uint `json:"employee_id"` Employee *eem.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` Time *time.Time `json:"time"` - TypeCode erc.SoapiTypeCode `json:"type_code" gorm:"size:11"` + TypeCode erc.SoapiTypeCode `json:"type_code" gorm:"size:15"` Value *string `json:"value"` } diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 2d656556..78f7ae31 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -4,14 +4,13 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" espb "simrs-vx/internal/domain/main-entities/specialist-position/base" essb "simrs-vx/internal/domain/main-entities/subspecialist/base" - eu "simrs-vx/internal/domain/main-entities/unit" ) type CreateDto struct { - Id *uint `json:"id"` - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` - Unit_Code *string `json:"unit_code"` + Id *uint `json:"id"` + Installation_Code string `json:"installation_code"` + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` } type ReadListDto struct { @@ -22,10 +21,9 @@ type ReadListDto struct { } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` - Unit_Code *string `json:"unit-code"` - Search string `json:"search" gormhelper:"searchColumns=Code,Name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { @@ -54,8 +52,6 @@ type ResponseDto struct { ecore.SmallMain Code string `json:"code"` Name string `json:"name"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` SpecialistPositions []espb.Basic `json:"specialistPositions,omitempty"` Subspecialists []essb.Basic `json:"subspecialists,omitempty"` } @@ -64,8 +60,6 @@ func (d Specialist) ToResponse() ResponseDto { resp := ResponseDto{ Code: d.Code, Name: d.Name, - Unit: d.Unit, - Unit_Code: d.Unit_Code, SpecialistPositions: d.SpecialistPositions, Subspecialists: d.Subspecialists, } diff --git a/internal/domain/main-entities/specialist/entity.go b/internal/domain/main-entities/specialist/entity.go index 4fef90a5..c53e29ec 100644 --- a/internal/domain/main-entities/specialist/entity.go +++ b/internal/domain/main-entities/specialist/entity.go @@ -2,17 +2,17 @@ package specialist import ( ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/installation" eub "simrs-vx/internal/domain/main-entities/specialist-position/base" essb "simrs-vx/internal/domain/main-entities/subspecialist/base" - eu "simrs-vx/internal/domain/main-entities/unit" ) type Specialist struct { - ecore.SmallMain // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - SpecialistPositions []eub.Basic `json:"specialistPositions,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` - Subspecialists []essb.Basic `json:"subspecialists,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + ecore.SmallMain // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:20"` + Name string `json:"name" gorm:"size:50"` + Installation_Code *string `json:"installation_code" gorm:"size:20"` + Installation *ei.Installation `json:"installation,omitempty" gorm:"foreignKey:Installation_Code;references:Code"` + SpecialistPositions []eub.Basic `json:"specialistPositions,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Subspecialists []essb.Basic `json:"subspecialists,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` } diff --git a/internal/domain/main-entities/subspecialist-position/dto.go b/internal/domain/main-entities/subspecialist-position/dto.go index 1c37a859..4918a8fe 100644 --- a/internal/domain/main-entities/subspecialist-position/dto.go +++ b/internal/domain/main-entities/subspecialist-position/dto.go @@ -8,7 +8,7 @@ import ( type CreateDto struct { Subspecialist_Code *string `json:"subspecialist_code" validate:"required"` - Code string `json:"code" validate:"maxLength=10;required"` + Code string `json:"code" validate:"maxLength=20;required"` Name string `json:"name" validate:"maxLength=30;required"` HeadStatus bool `json:"headStatus"` Employee_Id *uint `json:"employee_id"` diff --git a/internal/domain/main-entities/subspecialist/base/entity.go b/internal/domain/main-entities/subspecialist/base/entity.go index a94fb76d..14804da4 100644 --- a/internal/domain/main-entities/subspecialist/base/entity.go +++ b/internal/domain/main-entities/subspecialist/base/entity.go @@ -6,9 +6,9 @@ import ( type Basic struct { ecore.SmallMain // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` - Specialist_Code *string `json:"specialist_code" gorm:"size:10"` + Code string `json:"code" gorm:"unique;size:20"` + Name string `json:"name" gorm:"size:100"` + Specialist_Code *string `json:"specialist_code" gorm:"size:20"` } func (Basic) TableName() string { diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index 72959023..303da04f 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -8,7 +8,7 @@ import ( type CreateDto struct { Id *uint `json:"id"` - Code string `json:"code" validate:"maxLength=10"` + Code string `json:"code" validate:"maxLength=20"` Name string `json:"name" validate:"maxLength=50"` Specialist_Code *string `json:"specialist_code"` } diff --git a/internal/domain/main-entities/unit-position/base/entity.go b/internal/domain/main-entities/unit-position/base/entity.go deleted file mode 100644 index eb046dfc..00000000 --- a/internal/domain/main-entities/unit-position/base/entity.go +++ /dev/null @@ -1,20 +0,0 @@ -package base - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/employee" -) - -type Basic struct { - ecore.SmallMain // adjust this according to the needs - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Code string `json:"code" gorm:"unique;size:10;not null"` - Name string `json:"name" gorm:"size:30;not null"` - HeadStatus bool `json:"headStatus"` - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` -} - -func (Basic) TableName() string { - return "UnitPosition" -} diff --git a/internal/domain/main-entities/unit-position/dto.go b/internal/domain/main-entities/unit-position/dto.go deleted file mode 100644 index 856cec77..00000000 --- a/internal/domain/main-entities/unit-position/dto.go +++ /dev/null @@ -1,85 +0,0 @@ -package unit_position - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/employee" - eu "simrs-vx/internal/domain/main-entities/unit" -) - -type CreateDto struct { - Unit_Code *string `json:"unit_code" validate:"required"` - Code string `json:"code" validate:"maxLength=10;required"` - Name string `json:"name" validate:"maxLength=30;required"` - HeadStatus bool `json:"headStatus"` - Employee_Id *uint `json:"employee_id"` -} - -type ReadListDto struct { - FilterDto - Includes string `json:"includes"` - Sort string `json:"sort"` - Pagination ecore.Pagination -} - -type FilterDto struct { - Unit_Code *string `json:"unit-code"` - Code string `json:"code"` - Name string `json:"name"` - HeadStatus *bool `json:"head-status"` - Employee_Id *uint `json:"employee-id"` - Search string `json:"search" gormhelper:"searchColumns=Code,Name"` -} - -type ReadDetailDto struct { - Id *uint16 `json:"id"` - Code *string `json:"code"` -} - -type UpdateDto struct { - Id *uint16 `json:"id"` - CreateDto -} - -type DeleteDto struct { - Id *uint16 `json:"id"` - Code *string `json:"code"` -} - -type MetaDto struct { - PageNumber int `json:"page_number"` - PageSize int `json:"page_size"` - Count int `json:"count"` -} - -type ResponseDto struct { - ecore.SmallMain - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` - Code string `json:"code"` - Name string `json:"name"` - HeadStatus bool `json:"headStatus"` - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty"` -} - -func (d UnitPosition) ToResponse() ResponseDto { - resp := ResponseDto{ - Unit_Code: d.Unit_Code, - Unit: d.Unit, - Code: d.Code, - Name: d.Name, - HeadStatus: d.HeadStatus, - Employee_Id: d.Employee_Id, - Employee: d.Employee, - } - resp.SmallMain = d.SmallMain - return resp -} - -func ToResponseList(data []UnitPosition) []ResponseDto { - resp := make([]ResponseDto, len(data)) - for i, u := range data { - resp[i] = u.ToResponse() - } - return resp -} diff --git a/internal/domain/main-entities/unit-position/entity.go b/internal/domain/main-entities/unit-position/entity.go deleted file mode 100644 index a7598049..00000000 --- a/internal/domain/main-entities/unit-position/entity.go +++ /dev/null @@ -1,11 +0,0 @@ -package unit_position - -import ( - eu "simrs-vx/internal/domain/main-entities/unit" - eub "simrs-vx/internal/domain/main-entities/unit-position/base" -) - -type UnitPosition struct { - eub.Basic - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` -} diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go deleted file mode 100644 index 7b071a84..00000000 --- a/internal/domain/main-entities/unit/dto.go +++ /dev/null @@ -1,82 +0,0 @@ -package unit - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ei "simrs-vx/internal/domain/main-entities/installation" - eipb "simrs-vx/internal/domain/main-entities/unit-position/base" -) - -type CreateDto struct { - Id *uint `json:"id"` - Installation_Code *string `json:"installation_code"` - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` -} - -type ReadListDto struct { - FilterDto - Includes string `json:"includes"` - Sort string `json:"sort"` - Pagination ecore.Pagination -} - -type FilterDto struct { - Installation_Code *string `json:"installation-code"` - Code string `json:"code"` - Name string `json:"name"` - Search string `json:"search" gormhelper:"searchColumns=Code,Name"` -} - -type ReadDetailDto struct { - Id *uint16 `json:"id"` - Installation_Code *string `json:"installation_code"` - Code *string `json:"code"` - Includes string `json:"includes"` -} - -type UpdateDto struct { - Id *uint16 `json:"id"` - CreateDto -} - -type DeleteDto struct { - Id *uint16 `json:"id"` - Code *string `json:"code"` -} - -type MetaDto struct { - PageNumber int `json:"page_number"` - PageSize int `json:"page_size"` - Count int `json:"count"` -} - -type ResponseDto struct { - ecore.SmallMain - Installation_Code *string `json:"installation_code"` - Installation *ei.Installation `json:"installation,omitempty"` - Code string `json:"code"` - Name string `json:"name"` - UnitPositions []eipb.Basic `json:"unitPositions,omitempty"` -} - -func (d Unit) ToResponse() ResponseDto { - resp := ResponseDto{ - Installation_Code: d.Installation_Code, - Code: d.Code, - Name: d.Name, - UnitPositions: d.UnitPositions, - } - resp.SmallMain = d.SmallMain - if d.Installation != nil { - resp.Installation = d.Installation - } - return resp -} - -func ToResponseList(data []Unit) []ResponseDto { - resp := make([]ResponseDto, len(data)) - for i, u := range data { - resp[i] = u.ToResponse() - } - return resp -} diff --git a/internal/domain/main-entities/unit/entity.go b/internal/domain/main-entities/unit/entity.go deleted file mode 100644 index 97db9885..00000000 --- a/internal/domain/main-entities/unit/entity.go +++ /dev/null @@ -1,18 +0,0 @@ -package unit - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ei "simrs-vx/internal/domain/main-entities/installation" - eub "simrs-vx/internal/domain/main-entities/unit-position/base" - ero "simrs-vx/internal/domain/references/organization" -) - -type Unit struct { - ecore.SmallMain // adjust this according to the needs - Installation_Code *string `json:"installation_code" gorm:"size:10"` - Installation *ei.Installation `json:"installation" gorm:"foreignKey:Installation_Code;references:Code"` - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` - Type_Code *ero.UnitTypeCode `json:"type_code"` - UnitPositions []eub.Basic `json:"unitPositions,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` -} diff --git a/internal/domain/main-entities/user/dto.go b/internal/domain/main-entities/user/dto.go index fd4b3f2c..bb030df3 100644 --- a/internal/domain/main-entities/user/dto.go +++ b/internal/domain/main-entities/user/dto.go @@ -13,22 +13,24 @@ import ( ) type CreateDto struct { - Name string `json:"name" validate:"maxLength=25"` - Password string `json:"password" validate:"maxLength=255"` + Name string `json:"name" validate:"required;maxLength=50"` + Password string `json:"password" validate:"required;maxLength=255"` + ContractPosition_Code erg.ContractPositionCode `json:"contractPosition_code" gorm:"not null;size:20" validate:"required"` Status_Code erc.UserStatusCode `json:"status_code" validate:"maxLength=10"` - Person_Id *uint `json:"-"` - Person *ep.UpdateDto `json:"person"` - PersonAddresses []epa.UpdateDto `json:"personAddresses"` - PersonContacts []epc.UpdateDto `json:"personContacts"` - Code *string `json:"code" validate:"maxLength=20"` - Employee *EmployeUpdateDto `json:"employee"` - IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` - SIP_Number *string `json:"sip_number" validate:"maxLength=20"` - Unit_Code *string `json:"unit_code"` - Infra_Code *string `json:"infra_code"` - Specialist_Code *string `json:"specialist_code"` - Subspecialist_Code *string `json:"subspecialist_code"` - ContractPosition_Code erg.ContractPositionCode `json:"contractPosition_code" gorm:"not null;size:20"` + + Employee *EmployeUpdateDto `json:"employee"` + Person *ep.UpdateDto `json:"person"` + PersonAddresses []epa.UpdateDto `json:"personAddresses"` + PersonContacts []epc.UpdateDto `json:"personContacts"` + Person_Id *uint `json:"-"` + Code *string `json:"code" validate:"maxLength=20"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` + SIP_Number *string `json:"sip_number" validate:"maxLength=20"` + Installation_Code *string `json:"installation_code"` + Unit_Code *string `json:"unit_code"` + Specialist_Code *string `json:"specialist_code"` + Subspecialist_Code *string `json:"subspecialist_code"` + Infra_Code *string `json:"infra_code"` } type ReadListDto struct { @@ -87,11 +89,20 @@ func (d *User) ToResponse() ResponseDto { type EmployeUpdateDto struct { Id uint `json:"id"` User_Id *uint `json:"-"` - Person_Id *uint `json:"-"` Division_Code *string `json:"division_code"` Number *string `json:"number" validate:"maxLength=20"` Position_Code erg.EmployeePositionCode `json:"position_code" validate:"maxLength=20"` Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` + Person_Id *uint `json:"-"` + // TODO: Extras + // Code *string `json:"code" validate:"maxLength=20"` + // IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` + // SIP_Number *string `json:"sip_number" validate:"maxLength=20"` + // Installation_Code *string `json:"installation_code"` + // Unit_Code *string `json:"unit_code"` + // Specialist_Code *string `json:"specialist_code"` + // Subspecialist_Code *string `json:"subspecialist_code"` + // Infra_Code *string `json:"infra_code"` } func ToResponseList(data []User) []ResponseDto { diff --git a/internal/domain/main-entities/user/entity.go b/internal/domain/main-entities/user/entity.go index f51dbf14..712a70e1 100644 --- a/internal/domain/main-entities/user/entity.go +++ b/internal/domain/main-entities/user/entity.go @@ -10,7 +10,7 @@ import ( type User struct { ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"unique;not null;size:25"` + Name string `json:"name" gorm:"unique;not null;size:50"` Password string `json:"password" gorm:"not null;size:255"` Status_Code erc.UserStatusCode `json:"status_code" gorm:"not null;size:10"` ContractPosition_Code erg.ContractPositionCode `json:"contractPosition_code" gorm:"not null;size:20"` diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index 43305a99..fc538677 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -9,6 +9,7 @@ type ( InstructionCode string HeadToToeCode string McuUrgencyLevelCode string + McuOrderStageCode string McuScopeCode string SoapiTypeCode string MedicalActionTypeCode string @@ -30,6 +31,7 @@ type ( BornMortalityCode string BornLocationCode string SpecimentDestCode string + ProcedureReportType string ) const ( @@ -125,6 +127,9 @@ const ( MULCPF McuUrgencyLevelCode = "priority-form" // Form Prioritas MULCRT McuUrgencyLevelCode = "routine" // Pemeriksaan Rutin + MOSFirst McuOrderStageCode = "first" // Stage 1 + MOSSecond McuOrderStageCode = "repeat" // Stage 2 + STCEarlyNurse SoapiTypeCode = "early-nursery" // Kajian Awal Keperawatan STCEEarlyMedic SoapiTypeCode = "early-medic" // Kajian Awal Rehab Medis STCEarlyRehab SoapiTypeCode = "early-rehab" // Kajian Awal Rehab Medik @@ -133,6 +138,7 @@ const ( STCDevRecord SoapiTypeCode = "dev-record" // Catatan Perkembangan STCKfrAdm SoapiTypeCode = "kfr-adm" // soapi untuk kfr STCKfrSeries SoapiTypeCode = "kfr-series" // soapi untuk kfr + STCAmbResume SoapiTypeCode = "amb-resume" // Rajal resume MATCChemo MedicalActionTypeCode = "chemo" MATCHemo MedicalActionTypeCode = "hemo" @@ -203,37 +209,40 @@ const ( MSCMicroLab McuScopeCode = "micro-lab" MSCApLab McuScopeCode = "ap-lab" - SSCSmall SurgerySizeCode = "" - SSCMedium SurgerySizeCode = "" - SSCLarge SurgerySizeCode = "" - SSCSpecial SurgerySizeCode = "" + SSCSmall SurgerySizeCode = "small" + SSCMedium SurgerySizeCode = "medium" + SSCLarge SurgerySizeCode = "large" + SSCSpecial SurgerySizeCode = "special" - SSyCCito SurgerySystemCode = "" - SSyCUrgent SurgerySystemCode = "" - SSyCEfective SurgerySystemCode = "" - SSyCSpecial SurgerySystemCode = "" + SSyCCito SurgerySystemCode = "cito" + SSyCUrgent SurgerySystemCode = "urgent" + SSyCEfective SurgerySystemCode = "efective" + SSyCSpecial SurgerySystemCode = "special" - STCClean SurgeryTypeCode = "" - STCCleanCtm SurgeryTypeCode = "" - STCUncleanCtm SurgeryTypeCode = "" - STCUnclean SurgeryTypeCode = "" + STCClean SurgeryTypeCode = "clean" + STCCleanCtm SurgeryTypeCode = "clean-ctm" + STCUncleanCtm SurgeryTypeCode = "unclean-ctm" + STCUnclean SurgeryTypeCode = "unclean" - SStCFirst SurgeryStageCode = "" - SStCRepeat SurgeryStageCode = "" + SStCFirst SurgeryStageCode = "first" + SStCRepeat SurgeryStageCode = "repeat" - BMCAlive BornMortalityCode = "" - BMCDead BornMortalityCode = "" + BMCAlive BornMortalityCode = "alive" + BMCDead BornMortalityCode = "dead" - BLCExtMiw BornLocationCode = "" - BLCExtDoc BornLocationCode = "" - BLCTradMiw BornLocationCode = "" - BLCLocalMed BornLocationCode = "" - BLCExtParamedic BornLocationCode = "" + BLCExtMiw BornLocationCode = "ext-miw" + BLCExtDoc BornLocationCode = "ext-doc" + BLCTradMiw BornLocationCode = "trad-miw" + BLCLocalMed BornLocationCode = "local-med" + BLCExtParamedic BornLocationCode = "ext-paramedic" - SDCAp SpecimentDestCode = "" - SDCMicro SpecimentDestCode = "" - SDCLab SpecimentDestCode = "" - SDCNone SpecimentDestCode = "" + SDCAp SpecimentDestCode = "ap" + SDCMicro SpecimentDestCode = "micro" + SDCLab SpecimentDestCode = "lab" + SDCNone SpecimentDestCode = "none" + + PRTProcedure ProcedureReportType = "procedure" + PRTSurgery ProcedureReportType = "surgery" ) type Soapi struct { @@ -359,8 +368,11 @@ type HeadToToe struct { BodyOthers string `json:"body-others,omitempty"` } -type RecordAction struct { - Procedures []string `json:"procedures"` +type ProcedureRecord struct { + Procedures []CodeWithName `json:"procedures"` +} + +type ProcedureExecution struct { SurgerySize_Code *string `json:"surgerySize_code"` Billing_Code *string `json:"billing_code"` SurgerySystem_Code *string `json:"surgerySystem_code"` @@ -385,3 +397,34 @@ type RecordAction struct { SpecimentDest_Code *string `json:"specimentDest" gorm:"size:100"` TissueInfo []string `json:"tissueInfo" gorm:"size:100"` } + +type SoapiSrc struct { + Id string `json:"id,omitempty"` + Code string `json:"code,omitempty"` + Name string `json:"name,omitempty"` + IndName string `json:"indName,omitempty"` +} + +type EarlyMedicValue struct { + Vaccinated bool `json:"vaccinated,omitempty"` + CaseStatus int `json:"case-status,omitempty"` + EncounterStatus int `json:"encounter-status,omitempty"` + PrimaryComplain string `json:"pri-complain,omitempty"` + CurrentDiseaseHistory string `json:"cur-disea-hist,omitempty"` + SpO2 int `json:"spo2,omitempty"` + SystolicBloodPressure int `json:"syst-bp,omitempty"` + DiastolicBloodPressure int `json:"diast-bp,omitempty"` + RespiratoryRate int `json:"resp-rate,omitempty"` + Pulse int `json:"pulse,omitempty"` + Weight int `json:"weight,omitempty"` + BloodType string `json:"blood-type,omitempty"` + Temperature int `json:"temp,omitempty"` + Height int `json:"height,omitempty"` + PhysicalExamination string `json:"physical-exam,omitempty"` + DiagnoseSrc []SoapiSrc `json:"diagnoseSrc,omitempty"` + ProcedureSrc []SoapiSrc `json:"procedureSrc,omitempty"` + EarlyMedicDiagnose string `json:"early-med-diag,omitempty"` + EarlyMedicPlan string `json:"early-med-plan,omitempty"` + Therapy string `json:"therapy,omitempty"` + ExpectedOutcome []SoapiSrc `json:"expected-outcome,omitempty"` +} diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 231baa9b..83ef759b 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -22,6 +22,7 @@ type ( PolySwitchCode string DocTypeCode string EntityTypeCode string + StatusProtocolChemo string ) const ( @@ -123,10 +124,15 @@ const ( DTCGC DocTypeCode = "general-consent" DTCVSCL DocTypeCode = "vclaim-control-letter" // vclaim control letter DTCResume DocTypeCode = "resume" // Resume + DTCScreening DocTypeCode = "screening" // Screening ETCPerson EntityTypeCode = "person" ETCEncounter EntityTypeCode = "encounter" ETCMCU EntityTypeCode = "mcu" + + SPCComplete StatusProtocolChemo = "complete" + SPCPlanned StatusProtocolChemo = "planned" + SPCSchedule StatusProtocolChemo = "schedule" ) func (ec EncounterClassCode) Code() string { diff --git a/internal/domain/references/organization/organization.go b/internal/domain/references/organization/organization.go index b39752d5..d20b828e 100644 --- a/internal/domain/references/organization/organization.go +++ b/internal/domain/references/organization/organization.go @@ -1,14 +1,15 @@ package organization type ( - ContractPositionCode string - EmployeePositionCode string - InternPosisitionCode string - ItemGroupCode string - InfraGroupCode string - UnitTypeCode string - DoctorFeeTypeCode string - ActionBillingCode string + ContractPositionCode string + EmployeePositionCode string + InternPosisitionCode string + ItemGroupCode string + InfraGroupCode string + ProdcedureRoomTypeCode string + UnitTypeCode string + DoctorFeeTypeCode string + ActionBillingCode string ) const ( @@ -44,14 +45,17 @@ const ( ITGCDocFee ItemGroupCode = "doctor-fee" ITGCMedAct ItemGroupCode = "medical-action" - IFGCBuilding InfraGroupCode = "building" // Bangunan - IFGCFloor InfraGroupCode = "floor" // Lantai - IFGCRoom InfraGroupCode = "room" // Ruang - IFGCChamber InfraGroupCode = "chamber" // Kamar - IFGCBed InfraGroupCode = "bed" // Ranjang - IFGCWarehouse InfraGroupCode = "warehouse" // Gudang/Depo - IFGCCounter InfraGroupCode = "counter" // Counter - IFGCPubScreen InfraGroupCode = "public-screen" // Public Screen + IFGCBuilding InfraGroupCode = "building" // Bangunan + IFGCFloor InfraGroupCode = "floor" // Lantai + IFGCProcedureRoom InfraGroupCode = "procedure-room" // Ruang Tindakan + IFGCChamber InfraGroupCode = "chamber" // Kamar + IFGCBed InfraGroupCode = "bed" // Ranjang + IFGCWarehouse InfraGroupCode = "warehouse" // Gudang/Depo + IFGCCounter InfraGroupCode = "counter" // Counter + IFGCPubScreen InfraGroupCode = "public-screen" // Public Screen + + PRTCProcedure ProdcedureRoomTypeCode = "procedure" // Ringan + PRTCOperating ProdcedureRoomTypeCode = "operating" // Dikamarkan UTCReg UnitTypeCode = "reg" // Registrasi UTCExa UnitTypeCode = "exa" // Pemeriksaan diff --git a/internal/domain/simgos-entities/m-dokter/entity.go b/internal/domain/simgos-entities/m-dokter/entity.go new file mode 100644 index 00000000..47cbba6f --- /dev/null +++ b/internal/domain/simgos-entities/m-dokter/entity.go @@ -0,0 +1,24 @@ +package m_dokter + +import "time" + +type MDokter struct { + Kddokter uint `gorm:"column:kddokter;primaryKey;autoIncrement" json:"kddokter"` + Kdpoly uint `gorm:"column:kdpoly" json:"kdpoly"` + Namadokter string `gorm:"column:namadokter" json:"namadokter"` + Kdprofesi *uint `gorm:"column:kdprofesi" json:"kdprofesi"` + Namaprofesi *string `gorm:"column:namaprofesi" json:"namaprofesi"` + Aktif uint16 `gorm:"column:aktif" json:"aktif"` + KdSMF *string `gorm:"column:kdsmf" json:"kdsmf"` + KodeDPJP *string `gorm:"column:kode_dpjp" json:"kode_dpjp"` + NIP *string `gorm:"column:nip" json:"nip"` + Kategori *string `gorm:"column:kategori" json:"kategori"` + TglAkhirSIP *time.Time `gorm:"column:tgl_akhir_sip" json:"tgl_akhir_sip"` + NoHP *string `gorm:"column:no_hp" json:"no_hp"` + Email *string `gorm:"column:email" json:"email"` + TglAkhirSPK *time.Time `gorm:"column:tgl_akhir_spk" json:"tgl_akhir_spk"` +} + +func (MDokter) TableName() string { + return "m_dokter" +} diff --git a/internal/domain/simgos-entities/m-login/entity.go b/internal/domain/simgos-entities/m-login/entity.go new file mode 100644 index 00000000..a2967d1d --- /dev/null +++ b/internal/domain/simgos-entities/m-login/entity.go @@ -0,0 +1,22 @@ +package m_login + +type MLogin struct { + NIP string `gorm:"column:nip;primaryKey"` + Password string `gorm:"column:pwd"` + SesReg string `gorm:"column:ses_reg"` + KdPerawat uint `gorm:"column:kdperawat"` + KdDokter uint `gorm:"column:kddokter"` + NamaPegawai string `gorm:"column:nama_pegawai"` + Roles int `gorm:"column:roles"` + KdUnit uint `gorm:"column:kdunit"` + Departemen string `gorm:"column:departemen"` + StDokterRajalEksekutif *uint16 `gorm:"column:st_dokter_rajal_eksekutif"` + StDokterRajalReguler *uint16 `gorm:"column:st_dokter_rajal_reguler"` + StDokterRajalEmergency *uint16 `gorm:"column:st_dokter_rajal_emergency"` + NIPB *string `gorm:"column:nipb"` + Aktif uint16 `gorm:"column:aktif"` +} + +func (MLogin) TableName() string { + return "m_login" +} diff --git a/internal/domain/simgos-entities/m-pasien/dto.go b/internal/domain/simgos-entities/m-pasien/dto.go new file mode 100644 index 00000000..8d2c3368 --- /dev/null +++ b/internal/domain/simgos-entities/m-pasien/dto.go @@ -0,0 +1,273 @@ +package m_pasien + +import ( + "fmt" + ecore "simrs-vx/internal/domain/base-entities/core" + e "simrs-vx/internal/domain/main-entities/patient" + pr "simrs-vx/internal/domain/main-entities/person" + pa "simrs-vx/internal/domain/main-entities/person-address" + pab "simrs-vx/internal/domain/main-entities/person-address/base" + pc "simrs-vx/internal/domain/main-entities/person-contact" + rf "simrs-vx/internal/domain/references/person" + + "time" +) + +type MPasienDto struct { + Id uint `json:"id" gorm:"primaryKey;autoIncrement;column:id"` + Nomr string `json:"nomr" gorm:"uniqueIndex;column:nomr"` + Title string `json:"title" gorm:"column:title"` + Nama string `json:"nama" gorm:"column:nama"` + Tempat string `json:"tempat" gorm:"column:tempat"` + Tgllahir string `json:"tgllahir" gorm:"column:tgllahir"` + Jeniskelamin string `json:"jeniskelamin" gorm:"column:jeniskelamin"` + Alamat string `json:"alamat" gorm:"column:alamat"` + Kelurahan uint64 `json:"kelurahan" gorm:"column:kelurahan"` + Kdkecamatan uint `json:"kdkecamatan" gorm:"column:kdkecamatan"` + Kota uint `json:"kota" gorm:"column:kota"` + Kdprovinsi uint `json:"kdprovinsi" gorm:"column:kdprovinsi"` + Notelp string `json:"notelp" gorm:"column:notelp"` + Noktp string `json:"noktp" gorm:"column:noktp"` + SuamiOrtu *string `json:"suami_ortu" gorm:"column:suami_ortu"` + Pekerjaan string `json:"pekerjaan" gorm:"column:pekerjaan"` + Status uint `json:"status" gorm:"column:status"` + Agama uint `json:"agama" gorm:"column:agama"` + Pendidikan uint `json:"pendidikan" gorm:"column:pendidikan"` + Kdcarabayar *uint `json:"kdcarabayar" gorm:"column:kdcarabayar"` + Nip *string `json:"nip" gorm:"column:nip"` + Tgldaftar string `json:"tgldaftar" gorm:"column:tgldaftar"` + AlamatKtp string `json:"alamat_ktp" gorm:"column:alamat_ktp"` + ParentNomr *string `json:"parent_nomr" gorm:"column:parent_nomr"` + Kepercayaan string `json:"kepercayaan" gorm:"column:kepercayaan"` + PenanggungjawabNama string `json:"penanggungjawab_nama" gorm:"column:penanggungjawab_nama"` + PenanggungjawabHubungan string `json:"penanggungjawab_hubungan" gorm:"column:penanggungjawab_hubungan"` + PenanggungjawabAlamat string `json:"penanggungjawab_alamat" gorm:"column:penanggungjawab_alamat"` + PenanggungjawabPhone string `json:"penanggungjawab_phone" gorm:"column:penanggungjawab_phone"` + NoKartu string `json:"no_kartu" gorm:"column:no_kartu"` + JnsPasien string `json:"jns_pasien" gorm:"column:jns_pasien"` + Nk *string `json:"nk" gorm:"column:nk"` + Kdprovider *string `json:"kdprovider" gorm:"column:kdprovider"` + Nmprovider *string `json:"nmprovider" gorm:"column:nmprovider"` + Kelas *uint `json:"kelas" gorm:"column:kelas"` + Sim *string `json:"sim" gorm:"column:sim"` + Paspor *string `json:"paspor" gorm:"column:paspor"` + Disabilitas *string `json:"disabilitas" gorm:"column:disabilitas"` + Bahasa string `json:"bahasa" gorm:"column:bahasa"` + HambatanKomunikasi string `json:"hambatan_komunikasi" gorm:"column:hambatan_komunikasi"` + Kebangsaan string `json:"kebangsaan" gorm:"column:kebangsaan"` + Notelprumah1 string `json:"notelprumah1" gorm:"column:notelprumah1"` + Notelprumah2 *string `json:"notelprumah2" gorm:"column:notelprumah2"` + Notelpkantor string `json:"notelpkantor" gorm:"column:notelpkantor"` + NoHp *string `json:"no_hp" gorm:"column:no_hp"` + AsalMasuk *string `json:"asal_masuk" gorm:"column:asal_masuk"` + Diagnosa *string `json:"diagnosa" gorm:"column:diagnosa"` + DiagnosaUtama *string `json:"diagnosa_utama" gorm:"column:diagnosa_utama"` + Suku string `json:"suku" gorm:"column:suku"` + AgamaLain string `json:"agama_lain" gorm:"column:agama_lain"` + StDisabilitas uint `json:"stDisabilitas" gorm:"column:st_disabilitas"` + TxtKelurahan string `json:"txt_kelurahan" gorm:"column:txt_kelurahan"` + TxtKecamatan string `json:"txt_kecamatan" gorm:"column:txt_kecamatan"` + TxtKota string `json:"txt_kota" gorm:"column:txt_kota"` + TxtProvinsi string `json:"txt_provinsi" gorm:"column:txt_provinsi"` + TxtStatus string `json:"txt_status" gorm:"column:txt_status"` + TxtAgama string `json:"txt_agama" gorm:"column:txt_agama"` + TxtPendidikan string `json:"txt_pendidikan" gorm:"column:txt_pendidikan"` + NamaAyah string `json:"nama_ayah" gorm:"column:nama_ayah"` + NamaIbu string `json:"nama_ibu" gorm:"column:nama_ibu"` + PendidikanAyah string `json:"pendidikan_ayah" gorm:"column:pendidikan_ayah"` + PendidikanIbu string `json:"pendidikan_ibu" gorm:"column:pendidikan_ibu"` + StIdentitasOrtu int `json:"st_identitas_ortu" gorm:"column:st_identitas_ortu"` + NomrBaru *string `json:"nomr_baru" gorm:"column:nomr_baru"` + KtpFile *string `json:"ktp_file" gorm:"column:ktp_file"` + KkFile *string `json:"kk_file" gorm:"column:kk_file"` + CreatedAt *time.Time `json:"created_at" gorm:"column:created_at"` + UpdatedAt *time.Time `json:"updated_at" gorm:"column:updated_at"` + NoKk *string `json:"no_kk" gorm:"column:no_kk"` + NoktpBaru string `json:"noktp_baru" gorm:"column:noktp_baru"` +} + +func (mp MPasienDto) ToPatient() e.Patient { + + patient := e.Patient{ + Main: ecore.Main{ + Id: mp.Id, + }, + NewBornStatus: mp.ParentNomr != nil, + RegisteredAt: parseTimeDateOnly(mp.Tgldaftar), + RegisteredBy_User_Name: mp.Nip, + Number: &mp.Nomr, + Parent_Number: mp.ParentNomr, + // Status_Code: getActiveStatus(mp.Status), + // mp.Status is marital status + // Parent + } + + // person + gc := getGender(mp.Jeniskelamin) + rc := getReligion(mp.Agama) + ec := getEducation(mp.Pendidikan) + mc := getMaritalStatus(mp.Status) + bc := getBirthRegencyCode(mp.Tempat) + et := getEthnicCode(mp.Suku) + lc := getLanguageCode(mp.Bahasa) + + person := pr.Person{ + Name: mp.Nama, + FrontTitle: &mp.Title, + BirthDate: parseTimeDateOnly(mp.Tgllahir), + BirthRegency_Code: &bc, + Gender_Code: &gc, + ResidentIdentityNumber: nilEmptyString(&mp.Noktp), + PassportNumber: nilEmptyString(mp.Paspor), + DrivingLicenseNumber: nilEmptyString(mp.Sim), + Religion_Code: &rc, + Education_Code: &ec, + Ocupation_Name: &mp.Pekerjaan, + MaritalStatus_Code: &mc, + Nationality: &mp.Kebangsaan, + Ethnic_Code: &et, + Language_Code: &lc, + CommunicationIssueStatus: mp.HambatanKomunikasi == "Y", + Disability: mp.Disabilitas, + ResidentIdentityFileUrl: mp.KtpFile, + FamilyIdentityFileUrl: mp.KkFile, + // EndTitle + // Confidence + // Ocupation_Code + } + var addresses []pa.PersonAddress + if mp.Alamat != "" { + vc := fmt.Sprintf("%d", mp.Kelurahan) + addresses = append(addresses, pa.PersonAddress{ + PersonAddress: pab.PersonAddress{ + Address: mp.Alamat, + LocationType_Code: rf.ALTCDom, + Village_Code: &vc, + }, + }) + } + if mp.AlamatKtp != "" { + addresses = append(addresses, pa.PersonAddress{ + PersonAddress: pab.PersonAddress{ + Address: mp.AlamatKtp, + LocationType_Code: rf.ALTCIdn, + }, + }) + } + + var contacts []pc.PersonContact + + if mp.NoHp != nil { + + } + + person.Addresses = &addresses + person.Contacts = &contacts + patient.Person = &person + return patient +} + +func nilEmptyString(s *string) *string { + if s == nil { + return nil + } + return s +} + +func getGender(g string) rf.GenderCode { + if g == "L" { + return rf.GCMale + } else if g == "P" { + return rf.GCFemale + } + return rf.GCUnknown + +} + +func getReligion(r uint) rf.ReligionCode { + switch r { + case 1: + return rf.RCIslam + case 2: + return rf.RCProtestan + case 3: + return rf.RCKatolik + case 4: + return rf.RCHindu + case 5: + return rf.RCBudha + case 6: + return rf.RCKonghucu + default: + // 9 "Lainnya" + // 0 "Tidak diketahui" + return "" + } +} + +func getEducation(e uint) rf.EducationCode { + switch e { + case 0: + return rf.ECTS + case 1: + return rf.ECSD + case 2: + return rf.ECSLTP + case 3: + return rf.ECSLTA + case 4: + return rf.ECD3 + case 5: + return rf.ECS1 + case 6: + return rf.ECOther + case 7: + return rf.ECUnkown + default: + return rf.ECUnkown + } +} + +func getMaritalStatus(m uint) rf.MaritalStatusCode { + switch m { + case 1: + return rf.MaritalStatusSingle // S + case 2: + return rf.MaritalStatusMarried // M + case 3: + return rf.MaritalStatusWidowed // W + case 4: + return rf.MaritalStatusDivorced // D + default: + return "" // unknown + } +} + +func getBirthRegencyCode(r string) string { + if r != "" { + // TODO get from database + } + return "3574" +} + +func getEthnicCode(s string) string { + if s != "" { + // TODO check database + } + return "jawa" +} + +func getLanguageCode(s string) string { + if s != "" { + // TODO check database + } + return "jawa" +} + +func parseTimeDateOnly(d string) *time.Time { + do, err := time.Parse("2006-01-02", d) + if err == nil { + return &do + } + return nil +} diff --git a/internal/domain/simgos-entities/m-pegawai/entity.go b/internal/domain/simgos-entities/m-pegawai/entity.go new file mode 100644 index 00000000..24552b6c --- /dev/null +++ b/internal/domain/simgos-entities/m-pegawai/entity.go @@ -0,0 +1,38 @@ +package m_pegawai + +import "time" + +type MPegawai struct { + NoPeg uint `gorm:"column:no_peg;primaryKey"` + NamaPeg string `gorm:"column:nama_peg"` + NIPB string `gorm:"column:nipb"` + Gol string `gorm:"column:gol"` + SatuanKerja string `gorm:"column:satuan_kerja"` + Ruang string `gorm:"column:ruang"` + Pendidikan string `gorm:"column:pendidikan"` + Tenaga string `gorm:"column:tenaga"` + Tenaga1 string `gorm:"column:tenaga1"` + Tenaga2 string `gorm:"column:tenaga2"` + TMTMasuk *time.Time `gorm:"column:tmt_masuk"` + TempatLahir string `gorm:"column:tmp_lahir"` + TanggalLahir *time.Time `gorm:"column:tgl_lahir"` + Alamat string `gorm:"column:alamat"` + Telepon string `gorm:"column:telepon"` + HP string `gorm:"column:hp"` + Karpeg string `gorm:"column:karpeg"` + Kelamin string `gorm:"column:kelamin"` + Agama string `gorm:"column:agama"` + StatusTubel uint16 `gorm:"column:status_tubel"` // smallint → bool + NIK string `gorm:"column:nik"` + Seksi string `gorm:"column:seksi"` + TMTAwalSIP *time.Time `gorm:"column:tmt_awal_sip"` + TMTAkhirSIPStr *time.Time `gorm:"column:tmt_akhir_sip_str"` + NoSIP string `gorm:"column:no_sip"` + NoSTR string `gorm:"column:no_str"` + LoginID string `gorm:"column:login_id"` + CodeKasir string `gorm:"column:code_kasir"` +} + +func (MPegawai) TableName() string { + return "m_pegawai" +} diff --git a/internal/domain/simgos-entities/m-perawat/entity.go b/internal/domain/simgos-entities/m-perawat/entity.go new file mode 100644 index 00000000..c110ba11 --- /dev/null +++ b/internal/domain/simgos-entities/m-perawat/entity.go @@ -0,0 +1,52 @@ +package m_perawat + +import ( + "time" +) + +type MPerawat struct { + Idperawat *uint `json:"idperawat" gorm:"column:idperawat;primaryKey"` + NIP string `json:"nip" gorm:"column:nip"` + UnitKerja *uint `json:"unit_kerja" gorm:"column:unit_kerja"` + Ruang *string `json:"ruang" gorm:"column:ruang"` + Nama string `json:"nama" gorm:"column:nama"` + Tempat *string `json:"tempat" gorm:"column:tempat"` + TglLahir *time.Time `json:"tgllahir" gorm:"column:tgllahir"` + JenisKelamin *string `json:"jeniskelamin" gorm:"column:jeniskelamin"` + Alamat *string `json:"alamat" gorm:"column:alamat"` + Kelurahan *string `json:"kelurahan" gorm:"column:kelurahan"` + Kdkecamatan *uint `json:"kdkecamatan" gorm:"column:kdkecamatan"` + Kota *string `json:"kota" gorm:"column:kota"` + KdProvinsi *uint `json:"kdprovinsi" gorm:"column:kdprovinsi"` + NoTelp *string `json:"notelp" gorm:"column:notelp"` + NoKTP *string `json:"noktp" gorm:"column:noktp"` + Status *uint `json:"status" gorm:"column:status"` + Agama *uint `json:"agama" gorm:"column:agama"` + Pendidikan *uint `json:"pendidikan" gorm:"column:pendidikan"` + AlamatKTP *string `json:"alamat_ktp" gorm:"column:alamat_ktp"` + JabFung *string `json:"jabfung" gorm:"column:jabfung"` + JabStruk *string `json:"jabstruk" gorm:"column:jabstruk"` + LamKer *string `json:"lamker" gorm:"column:lamker"` + TemKer *string `json:"temker" gorm:"column:temker"` + TemKer2 *string `json:"temker2" gorm:"column:temker2"` + PelManKep *string `json:"pelmankep" gorm:"column:pelmankep"` + PelTekKepGaw *string `json:"peltekkepgaw" gorm:"column:peltekkepgaw"` + PelTekKepMedah *string `json:"peltekkepmedah" gorm:"column:peltekkepmedah"` + PelTekKepNak *string `json:"peltekkepnak" gorm:"column:peltekkepnak"` + PelTekKepMat *string `json:"peltekkepmat" gorm:"column:peltekkepmat"` + PelTekKepJiwa *string `json:"peltekkepjiwa" gorm:"column:peltekkepjiwa"` + TemKerTuj *string `json:"temkertuj" gorm:"column:temkertuj"` + TemKerTuj2 *string `json:"temkertuj2" gorm:"column:temkertuj2"` + TglMutasi *time.Time `json:"tglmutasi" gorm:"column:tglmutasi"` + Alasan *string `json:"alasan" gorm:"column:alasan"` + TglKeluar *time.Time `json:"tglkeluar" gorm:"column:tglkeluar"` + ProgPendidikan *uint `json:"progpendidikan" gorm:"column:progpendidikan"` + ProgPeng *string `json:"progpeng" gorm:"column:progpeng"` + JabLain *string `json:"jablain" gorm:"column:jablain"` + PPA uint `json:"ppa" gorm:"column:ppa"` + Aktif uint `json:"aktif" gorm:"column:aktif"` +} + +func (MPerawat) TableName() string { + return "m_perawat" +} diff --git a/internal/domain/simgos-entities/t-diagnosadanterapi/entity.go b/internal/domain/simgos-entities/t-diagnosadanterapi/entity.go new file mode 100644 index 00000000..9579168c --- /dev/null +++ b/internal/domain/simgos-entities/t-diagnosadanterapi/entity.go @@ -0,0 +1,51 @@ +package t_diagnosadanterapi + +import "time" + +type TDiagnosaDanTerapi struct { + Idxterapi uint `json:"idxterapi" gorm:"column:idxterapi;primaryKey"` + Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"` + Nomr string `json:"nomr" gorm:"column:nomr"` + Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"` + TekananDarah string `json:"tekanan_darah" gorm:"column:tekanan_darah"` + GolonganDarah string `json:"golongan_darah" gorm:"column:golongan_darah"` + TinggiBadan float64 `json:"tinggi_badan" gorm:"column:tinggi_badan"` + BeratBadan float64 `json:"berat_badan" gorm:"column:berat_badan"` + Diagnosa *string `json:"diagnosa" gorm:"column:diagnosa"` + Komplikasi *string `json:"komplikasi" gorm:"column:komplikasi"` + Terapi *string `json:"terapi" gorm:"column:terapi"` + Anamnesa *string `json:"anamnesa" gorm:"column:anamnesa"` + Kdpoly uint `json:"kdpoly" gorm:"column:kdpoly"` + Kddokter uint `json:"kddokter" gorm:"column:kddokter"` + Kdtujuanrujuk *uint `json:"kdtujuanrujuk" gorm:"column:kdtujuanrujuk"` + Nip string `json:"nip" gorm:"column:nip"` + IcdCode *string `json:"icd_code" gorm:"column:icd_code"` + KunjunganBl uint `json:"kunjungan_bl" gorm:"column:kunjungan_bl"` + KasusBl uint `json:"kasus_bl" gorm:"column:kasus_bl"` + Icdcm *string `json:"icdcm" gorm:"column:icdcm"` + Icd9 *string `json:"icd_9" gorm:"column:icd_9"` + Klb *uint `json:"klb" gorm:"column:klb"` + Bedah *uint `json:"bedah" gorm:"column:bedah"` + Jenis *uint `json:"jenis" gorm:"column:jenis"` + Perawat *string `json:"perawat" gorm:"column:perawat"` + Status *string `json:"status" gorm:"column:status"` + PemeriksaanFisik *string `json:"pemeriksaan_fisik" gorm:"column:pemeriksaan_fisik"` + RiwayatPasien *string `json:"riwayat_pasien" gorm:"column:riwayat_pasien"` + TindakanMedis *string `json:"tindakan_medis" gorm:"column:tindakan_medis"` + Rajal uint `json:"rajal" gorm:"column:rajal"` + UserBatal *string `json:"user_batal" gorm:"column:user_batal"` + TglBatal *time.Time `json:"tgl_batal" gorm:"column:tgl_batal"` + SudahVaksin string `json:"sudah_vaksin" gorm:"column:sudah_vaksin"` + CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` + DenyutJantung string `json:"denyut_jantung" gorm:"column:denyut_jantung"` + Pernapasan string `json:"pernapasan" gorm:"column:pernapasan"` + Suhu string `json:"suhu" gorm:"column:suhu"` + Sp02 string `json:"sp02" gorm:"column:sp02"` + TujuanPerawatan *string `json:"tujuan_perawatan" gorm:"column:tujuan_perawatan"` + TargetCapaian string `json:"target_capaian" gorm:"column:target_capaian"` +} + +// TableName overrides the table name used by GORM +func (TDiagnosaDanTerapi) TableName() string { + return "t_diagnosadanterapi" +} diff --git a/internal/domain/simgos-entities/t-icd-cm/entity.go b/internal/domain/simgos-entities/t-icd-cm/entity.go new file mode 100644 index 00000000..6ea7f935 --- /dev/null +++ b/internal/domain/simgos-entities/t-icd-cm/entity.go @@ -0,0 +1,23 @@ +package t_icd_cm + +import "time" + +type TIcdCm struct { + Idx uint `json:"idx" gorm:"column:idx;primaryKey"` + Nomr string `json:"nomr" gorm:"column:nomr"` + Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"` + Kddokter uint `json:"kddokter" gorm:"column:kddokter"` + Icd *string `json:"icd" gorm:"column:icd"` + IcdVerified *string `json:"icd_verified" gorm:"column:icd_verified"` + StatusRajal uint16 `json:"status_rajal" gorm:"column:status_rajal"` + Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"` + StatusVerif *uint16 `json:"status_verif" gorm:"column:status_verif"` + IcdVerifiedOrder *uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"` + IcdVerifBy *string `json:"icd_verif_by" gorm:"column:icd_verif_by"` + IcdVerifDate *time.Time `json:"icd_verif_date" gorm:"column:icd_verif_date"` + IcdActive *uint16 `json:"icd_active" gorm:"column:icd_active"` +} + +func (TIcdCm) TableName() string { + return "t_icd_cm" +} diff --git a/internal/domain/simgos-entities/t-icd/entity.go b/internal/domain/simgos-entities/t-icd/entity.go new file mode 100644 index 00000000..73ee49e1 --- /dev/null +++ b/internal/domain/simgos-entities/t-icd/entity.go @@ -0,0 +1,24 @@ +package t_icd + +import "time" + +type TIcd struct { + Idx uint `json:"idx" gorm:"column:idx;primaryKey"` + Nomr string `json:"nomr" gorm:"column:nomr"` + Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"` + Kddokter uint `json:"kddokter" gorm:"column:kddokter"` + Icd string `json:"icd" gorm:"column:icd"` + IcdVerified *string `json:"icd_verified" gorm:"column:icd_verified"` + StatusRajal uint16 `json:"status_rajal" gorm:"column:status_rajal"` + Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"` + StatusVerif *uint16 `json:"status_verif" gorm:"column:status_verif"` + IcdVerifiedOrder *uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"` + IcdVerifBy *string `json:"icd_verif_by" gorm:"column:icd_verif_by"` + IcdVerifDate *time.Time `json:"icd_verif_date" gorm:"column:icd_verif_date"` + IcdActive *uint16 `json:"icd_active" gorm:"column:icd_active"` + StSebabMati *uint16 `json:"st_sebab_mati" gorm:"column:st_sebab_mati"` +} + +func (TIcd) TableName() string { + return "t_icd" +} diff --git a/internal/domain/simgos-entities/t-rekammedik/entity.go b/internal/domain/simgos-entities/t-rekammedik/entity.go new file mode 100644 index 00000000..84cec1ef --- /dev/null +++ b/internal/domain/simgos-entities/t-rekammedik/entity.go @@ -0,0 +1,22 @@ +package t_rekammedik + +import "time" + +type TRekammedik struct { + TglKirim *time.Time `json:"tgl_kirim" gorm:"column:tgl_kirim"` + TglTerima *time.Time `json:"tgl_terima" gorm:"column:tgl_terima"` + Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"` + Kdpoly uint `json:"kdpoly" gorm:"column:kdpoly"` + Pengirim string `json:"pengirim" gorm:"column:pengirim"` + Penerima *string `json:"penerima" gorm:"column:penerima"` + Statusrm *uint `json:"statusrm" gorm:"column:statusrm"` + PenerimaPoly *string `json:"penerima_poly" gorm:"column:penerima_poly"` + JamKirimRm *time.Time `json:"jam_kirim_rm" gorm:"column:jam_kirim_rm"` + JamTerimaRm *time.Time `json:"jam_terima_rm" gorm:"column:jam_terima_rm"` + PjBerkasRm *string `json:"pj_berkas_rm" gorm:"column:pj_berkas_rm"` + StatusFisikBerkas *string `json:"status_fisik_berkas" gorm:"column:status_fisik_berkas"` +} + +func (TRekammedik) TableName() string { + return "t_rekammedik" +} diff --git a/internal/domain/sync-entities/authentication/authentication.go b/internal/domain/sync-entities/authentication/authentication.go new file mode 100644 index 00000000..f2448d9d --- /dev/null +++ b/internal/domain/sync-entities/authentication/authentication.go @@ -0,0 +1,9 @@ +package authentication + +type SyncKey struct{} + +type CredentialDto struct { + Source string `json:"X-Sync-Source"` + SecretKey string `json:"X-Sync-SecretKey"` + UserName string `json:"X-Sync-UserName"` +} diff --git a/internal/domain/sync-entities/doctor/entity.go b/internal/domain/sync-entities/doctor/entity.go new file mode 100644 index 00000000..6a112a01 --- /dev/null +++ b/internal/domain/sync-entities/doctor/entity.go @@ -0,0 +1,29 @@ +package doctor + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type DoctorLink struct { + ecore.Main + Simx_Id uint `json:"simx_id" gorm:"unique"` + Simgos_Id uint `json:"simgos_id" gorm:"unique"` +} + +type DoctorSimxLog struct { + ecore.Main + Value *string `json:"value"` + Date *time.Time `json:"date"` + Status erc.ProcessStatusCode `json:"status"` + ErrMessage *string `json:"errMessage"` +} + +type DoctorSimgosLog struct { + ecore.Main + Value *string `json:"value"` + Date *time.Time `json:"date"` + Status erc.ProcessStatusCode `json:"status"` + ErrMessage *string `json:"errMessage"` +} diff --git a/internal/domain/sync-entities/nurse/entity.go b/internal/domain/sync-entities/nurse/entity.go new file mode 100644 index 00000000..fdf78d38 --- /dev/null +++ b/internal/domain/sync-entities/nurse/entity.go @@ -0,0 +1,29 @@ +package nurse + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type NurseLink struct { + ecore.Main + Simx_Id uint `json:"simx_id" gorm:"unique"` + Simgos_Id uint `json:"simgos_id" gorm:"unique"` +} + +type NurseSimxLog struct { + ecore.Main + Value *string `json:"value"` + Date *time.Time `json:"date"` + Status erc.ProcessStatusCode `json:"status"` + ErrMessage *string `json:"errMessage"` +} + +type NurseSimgosLog struct { + ecore.Main + Value *string `json:"value"` + Date *time.Time `json:"date"` + Status erc.ProcessStatusCode `json:"status"` + ErrMessage *string `json:"errMessage"` +} diff --git a/internal/domain/sync-entities/soapi/entity.go b/internal/domain/sync-entities/soapi/entity.go new file mode 100644 index 00000000..0a1315c7 --- /dev/null +++ b/internal/domain/sync-entities/soapi/entity.go @@ -0,0 +1,29 @@ +package Soapi + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type SoapiLink struct { + ecore.Main + Simx_Id uint `json:"simx_id" gorm:"unique"` + Simgos_Id uint `json:"simgos_id" gorm:"unique"` +} + +type SoapiSimxLog struct { + ecore.Main + Value *string `json:"value"` + Date *time.Time `json:"date"` + Status erc.ProcessStatusCode `json:"status"` + ErrMessage *string `json:"errMessage"` +} + +type SoapiSimgosLog struct { + ecore.Main + Value *string `json:"value"` + Date *time.Time `json:"date"` + Status erc.ProcessStatusCode `json:"status"` + ErrMessage *string `json:"errMessage"` +} diff --git a/internal/infra/sync-cfg/sync-cfg.go b/internal/infra/sync-cfg/sync-cfg.go index a6a5d703..8e0e0f5a 100644 --- a/internal/infra/sync-cfg/sync-cfg.go +++ b/internal/infra/sync-cfg/sync-cfg.go @@ -8,8 +8,8 @@ import ( func SetConfig() { a.ParseSingleCfg(&O) - if O.Host == "" || O.Prefix == "" { - panic("config sync host and prefix empty") + if O.NewSecretKey == "" || O.NewHost == "" || O.OldSecretKey == "" || O.OldHost == "" { + panic("secret key and host of the sync partner config can not be empty") } - lo.I.Println("sync url config loaded, status: DONE!!") + lo.I.Println("sync partner config loaded, status: DONE!!") } diff --git a/internal/infra/sync-cfg/tycovar.go b/internal/infra/sync-cfg/tycovar.go index 6ae230fb..a7534f82 100644 --- a/internal/infra/sync-cfg/tycovar.go +++ b/internal/infra/sync-cfg/tycovar.go @@ -1,9 +1,13 @@ package synccfg -var O SyncUrlCfg = SyncUrlCfg{} +var O SyncPartnerCfg = SyncPartnerCfg{} // old -type SyncUrlCfg struct { - Prefix string `yaml:"prefix"` - Host string `yaml:"host"` - Enable bool `yaml:"enable"` +// Used by sync itself, so any partner should be stated here +type SyncPartnerCfg struct { + OldSource string `yaml:"oldSource"` + OldSecretKey string `yaml:"oldSecretKey"` + OldHost string `yaml:"oldHost"` + NewSource string `yaml:"newSource"` + NewSecretKey string `yaml:"newSecretKey"` + NewHost string `yaml:"newHost"` } diff --git a/internal/infra/sync-consumer-cfg/sync-cfg.go b/internal/infra/sync-consumer-cfg/sync-cfg.go new file mode 100644 index 00000000..8ea63dac --- /dev/null +++ b/internal/infra/sync-consumer-cfg/sync-cfg.go @@ -0,0 +1,15 @@ +package synccfg + +import ( + a "github.com/karincake/apem" + lo "github.com/karincake/apem/loggero" +) + +func SetConfig() { + a.ParseSingleCfg(&O) + + if O.TargetHost == "" || O.Prefix == "" { + panic("config sync host and prefix empty") + } + lo.I.Println("sync url config loaded, status: DONE!!") +} diff --git a/internal/infra/sync-consumer-cfg/tycovar.go b/internal/infra/sync-consumer-cfg/tycovar.go index d2146c2b..23fd0dcf 100644 --- a/internal/infra/sync-consumer-cfg/tycovar.go +++ b/internal/infra/sync-consumer-cfg/tycovar.go @@ -1,6 +1,6 @@ package synccfg -var O SyncConsumerUrlCfg = SyncConsumerUrlCfg{} // old +var O SyncConsumerUrlCfg = SyncConsumerUrlCfg{} // new type SyncConsumerUrlCfg struct { Prefix string `yaml:"prefix"` diff --git a/internal/interface/main-handler/antibiotic-src/handler.go b/internal/interface/main-handler/antibiotic-src/handler.go index 506472f8..5966e876 100644 --- a/internal/interface/main-handler/antibiotic-src/handler.go +++ b/internal/interface/main-handler/antibiotic-src/handler.go @@ -68,4 +68,4 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { dto.Id = uint16(id) res, err := u.Delete(dto) rw.DataResponse(w, res, err) -} \ No newline at end of file +} diff --git a/internal/interface/main-handler/authentication/handler.go b/internal/interface/main-handler/authentication/handler.go index 243ba9cd..4bf5134b 100644 --- a/internal/interface/main-handler/authentication/handler.go +++ b/internal/interface/main-handler/authentication/handler.go @@ -9,9 +9,12 @@ import ( sp "github.com/karincake/semprit" sr "github.com/karincake/serabi" + is "simrs-vx/internal/infra/sync-consumer-cfg" + pa "simrs-vx/internal/lib/auth" + m "simrs-vx/internal/domain/main-entities/user" mf "simrs-vx/internal/domain/main-entities/user-fes" - pa "simrs-vx/internal/lib/auth" + esga "simrs-vx/internal/domain/sync-entities/authentication" s "simrs-vx/internal/use-case/main-use-case/authentication" ) @@ -66,12 +69,37 @@ func Logout(w http.ResponseWriter, r *http.Request) { } func GuardMW(next http.Handler) http.Handler { + var ( + accessDetail *pa.AuthInfo + err error + ) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - accessDetail, err := s.ExtractToken(r, s.AccessToken) - if err != nil { - rw.WriteJSON(w, http.StatusUnauthorized, err.(d.FieldError), nil) - return + // Check if it's from sync + credential := esga.CredentialDto{} + credential.Source = r.Header.Get("X-Sync-Source") + credential.SecretKey = r.Header.Get("X-Sync-SecretKey") + credential.UserName = r.Header.Get("X-Sync-UserName") + if credential.Source != "" || credential.SecretKey != "" || credential.UserName != "" { + // validate secretKey and source + if credential.SecretKey != is.O.SecretKey || credential.Source != is.O.Source { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "invalid consumer credential"}, nil) + return + } + + accessDetail, err = s.GetAuthInfoByUserName(credential.UserName) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, err.(d.FieldError), nil) + return + } + } else { + // Normal flow goes here + accessDetail, err = s.ExtractToken(r, s.AccessToken) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, err.(d.FieldError), nil) + return + } } + ctx := context.WithValue(r.Context(), pa.AuthKey{}, accessDetail) next.ServeHTTP(w, r.WithContext(ctx)) }) diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index 7ac31393..8b8babc9 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -240,8 +240,8 @@ func (obj myBase) Skip(w http.ResponseWriter, r *http.Request) { rw.DataResponse(w, res, err) } -func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.SwitchUnitDto{} +func (obj myBase) RequestSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.SwitchSpecialistDto{} id := rw.ValidateInt(w, "id", r.PathValue("id")) if id <= 0 { return @@ -252,7 +252,7 @@ func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { } // validate request body - if valid := validateRequestSwitchUnit(w, dto); !valid { + if valid := validateRequestSwitchSpecialist(w, dto); !valid { return } @@ -263,12 +263,12 @@ func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { dto.AuthInfo = *authInfo dto.Id = uint(id) - res, err := u.RequestSwitchUnit(dto) + res, err := u.RequestSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) ApproveSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} id := rw.ValidateInt(w, "id", r.PathValue("id")) if id <= 0 { return @@ -286,12 +286,12 @@ func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) { dto.AuthInfo = *authInfo dto.Id = uint(id) - res, err := u.ApproveSwitchUnit(dto) + res, err := u.ApproveSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) CancelSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} id := rw.ValidateInt(w, "id", r.PathValue("id")) if id <= 0 { return @@ -309,6 +309,32 @@ func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) { dto.AuthInfo = *authInfo dto.Id = uint(id) - res, err := u.CancelSwitchUnit(dto) + res, err := u.CancelSwitchSpecialist(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) CreateWithPatient(w http.ResponseWriter, r *http.Request) { + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + + dto := e.CreateWithPatientDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + + // validate SubClass + if err := verifyClassCode(dto.Encounter); err != nil { + rw.DataResponse(w, nil, d.FieldError{ + Code: dataValidationFail, + Message: err.Error(), + }) + return + } + + dto.Encounter.AuthInfo = *authInfo + dto.Patient.AuthInfo = *authInfo + res, err := u.CreateWithPatient(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/encounter/request-validation.go b/internal/interface/main-handler/encounter/request-validation.go index 67d8a63c..7d22893e 100644 --- a/internal/interface/main-handler/encounter/request-validation.go +++ b/internal/interface/main-handler/encounter/request-validation.go @@ -58,7 +58,7 @@ func validateRequestCheckIn(w http.ResponseWriter, i e.CheckinDto) (valid bool) return true } -func validateRequestSwitchUnit(w http.ResponseWriter, i e.SwitchUnitDto) (valid bool) { +func validateRequestSwitchSpecialist(w http.ResponseWriter, i e.SwitchSpecialistDto) (valid bool) { // validate poly-switch-code if i.PolySwitchCode == nil { rw.DataResponse(w, nil, d.FieldError{ @@ -84,7 +84,7 @@ func validateRequestSwitchUnit(w http.ResponseWriter, i e.SwitchUnitDto) (valid } for _, v := range *i.InternalReferences { - if v.Unit_Code == nil { + if v.Specialist_Code == nil { rw.DataResponse(w, nil, d.FieldError{ Code: dataValidationFail, Message: "internalReferences.unit_code required", diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index dd025d0e..fced567e 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -4,7 +4,6 @@ import ( "net/http" /******************** main / transaction ********************/ - actionreport "simrs-vx/internal/interface/main-handler/action-report" adime "simrs-vx/internal/interface/main-handler/adime" admemployeehist "simrs-vx/internal/interface/main-handler/adm-employee-hist" ambulancetransportrequest "simrs-vx/internal/interface/main-handler/ambulance-transport-req" @@ -34,9 +33,14 @@ import ( practiceschedule "simrs-vx/internal/interface/main-handler/practice-schedule" prescription "simrs-vx/internal/interface/main-handler/prescription" prescriptionitem "simrs-vx/internal/interface/main-handler/prescription-item" + procedurereport "simrs-vx/internal/interface/main-handler/procedure-report" + procedureroom "simrs-vx/internal/interface/main-handler/procedure-room" + procedureroomorder "simrs-vx/internal/interface/main-handler/procedure-room-order" + procedureroomorderitem "simrs-vx/internal/interface/main-handler/procedure-room-order-item" responsibledoctorhist "simrs-vx/internal/interface/main-handler/responsible-doctor-hist" resume "simrs-vx/internal/interface/main-handler/resume" sbar "simrs-vx/internal/interface/main-handler/sbar" + screening "simrs-vx/internal/interface/main-handler/screening" soapi "simrs-vx/internal/interface/main-handler/soapi" uploadfile "simrs-vx/internal/interface/main-handler/upload-file" @@ -65,7 +69,7 @@ import ( gs "simrs-vx/internal/infra/gorm-setting" minio "simrs-vx/internal/infra/minio" ssdb "simrs-vx/internal/infra/ss-db" - simgossync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" /******************** pkg ********************/ cmw "simrs-vx/pkg/cors-manager-mw" @@ -93,6 +97,8 @@ import ( itemprice "simrs-vx/internal/interface/main-handler/item-price" language "simrs-vx/internal/interface/main-handler/language" material "simrs-vx/internal/interface/main-handler/material" + materialpackage "simrs-vx/internal/interface/main-handler/material-package" + materialpackageitem "simrs-vx/internal/interface/main-handler/material-package-item" mcusrc "simrs-vx/internal/interface/main-handler/mcu-src" mcusrccategory "simrs-vx/internal/interface/main-handler/mcu-src-category" mcusubsrc "simrs-vx/internal/interface/main-handler/mcu-sub-src" @@ -109,8 +115,6 @@ import ( subspecialist "simrs-vx/internal/interface/main-handler/subspecialist" subspecialistposition "simrs-vx/internal/interface/main-handler/subspecialist-position" therapyprotocol "simrs-vx/internal/interface/main-handler/therapy-protocol" - unit "simrs-vx/internal/interface/main-handler/unit" - unitposition "simrs-vx/internal/interface/main-handler/unit-position" uom "simrs-vx/internal/interface/main-handler/uom" vehicle "simrs-vx/internal/interface/main-handler/vehicle" vehiclehist "simrs-vx/internal/interface/main-handler/vehicle-hist" @@ -132,6 +136,7 @@ import ( reference "simrs-vx/internal/interface/main-handler/reference" referral "simrs-vx/internal/interface/main-handler/referral" vclaimsep "simrs-vx/internal/interface/main-handler/vclaim-sep" + vclaimsepcontrolletter "simrs-vx/internal/interface/main-handler/vclaim-sep-control-letter" vclaimsephist "simrs-vx/internal/interface/main-handler/vclaim-sep-hist" vclaimsepprint "simrs-vx/internal/interface/main-handler/vclaim-sep-print" ) @@ -147,7 +152,7 @@ func SetRoutes() http.Handler { a.RegisterExtCall(mh.I.SetClient) a.RegisterExtCall(ibpjs.SetConfig) a.RegisterExtCall(validation.RegisterValidation) - a.RegisterExtCall(simgossync.SetConfig) + a.RegisterExtCall(sync.SetConfig) a.RegisterExtCall(docscfg.ParseCfg) a.RegisterExtCall(ibpjs.SetConfig) @@ -172,7 +177,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/sbar", auth.GuardMW, sbar.O) hc.RegCrud(r, "/v1/prescription-item", prescriptionitem.O) hc.RegCrud(r, "/v1/device-order-item", deviceorderitem.O) - hc.RegCrud(r, "/v1/action-report", auth.GuardMW, actionreport.O) + hc.RegCrud(r, "/v1/procedure-report", auth.GuardMW, procedurereport.O) hc.RegCrud(r, "/v1/material-order-item", materialorderitem.O) hk.GroupRoutes("/v1/encounter", r, auth.GuardMW, hk.MapHandlerFunc{ @@ -187,9 +192,10 @@ func SetRoutes() http.Handler { "PATCH /{id}/cancel": encounter.O.Cancel, "PATCH /{id}/reject": encounter.O.Reject, "PATCH /{id}/skip": encounter.O.Skip, - "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchUnit, - "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchUnit, - "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchUnit, + "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchSpecialist, + "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchSpecialist, + "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchSpecialist, + "POST /create-with-patient": encounter.O.CreateWithPatient, }) hk.GroupRoutes("/v1/mcu-order", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": mcuorder.O.GetList, @@ -267,6 +273,16 @@ func SetRoutes() http.Handler { "DELETE /{id}": materialorder.O.Delete, "PATCH /{id}/complete": materialorder.O.Complete, }) + hc.RegCrud(r, "/v1/procedure-room", procedureroom.O) + hk.GroupRoutes("/v1/procedure-room-order", r, auth.GuardMW, hk.MapHandlerFunc{ + "GET /": procedureroomorder.O.GetList, + "GET /{id}": procedureroomorder.O.GetDetail, + "POST /": procedureroomorder.O.Create, + "PATCH /{id}": procedureroomorder.O.Update, + "DELETE /{id}": procedureroomorder.O.Delete, + "PATCH /{id}/submit": procedureroomorder.O.Submit, + }) + hc.RegCrud(r, "/v1/procedure-room-order-item", procedureroomorderitem.O) hk.GroupRoutes("/v1/consultation", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": consultation.O.GetList, "GET /{id}": consultation.O.GetDetail, @@ -312,7 +328,11 @@ func SetRoutes() http.Handler { "PATCH /{id}/verify": resume.Verify, "PATCH /{id}/validate": resume.Validate, }) - + hk.GroupRoutes("/v1/screening", r, auth.GuardMW, hk.MapHandlerFunc{ + "POST /": screening.O.Create, + "GET /": screening.O.GetList, + "GET /{id}": screening.O.GetDetail, + }) /******************** actor ********************/ hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) @@ -347,9 +367,7 @@ func SetRoutes() http.Handler { hc.RegCrudByCode(r, "/v1/division", division.O) hc.RegCrudByCode(r, "/v1/division-position", divisionposition.O) hc.RegCrudByCode(r, "/v1/installation", installation.O) - hc.RegCrudByCode(r, "/v1/unit", unit.O) hc.RegCrudByCode(r, "/v1/installation-position", installationposition.O) - hc.RegCrudByCode(r, "/v1/unit-position", unitposition.O) hc.RegCrudByCode(r, "/v1/specialist", specialist.O) hc.RegCrudByCode(r, "/v1/subspecialist", subspecialist.O) hc.RegCrudByCode(r, "/v1/specialist-position", specialistposition.O) @@ -370,6 +388,8 @@ func SetRoutes() http.Handler { hc.RegCrudByCode(r, "/v1/medicine", medicine.O) hc.RegCrudByCode(r, "/v1/device", device.O) hc.RegCrudByCode(r, "/v1/material", material.O) + hc.RegCrudByCode(r, "/v1/material-package", materialpackage.O) + hc.RegCrud(r, "/v1/material-package-item", materialpackageitem.O) hc.RegCrud(r, "/v1/doctor-fee", doctorfee.O) hc.RegCrudByCode(r, "/v1/medical-action-src", medicalactionsrc.O) hc.RegCrud(r, "/v1/medical-action-src-item", medicalactionsrcitem.O) @@ -392,6 +412,10 @@ func SetRoutes() http.Handler { "DELETE /{number}": vclaimsep.O.Delete, }) + hk.GroupRoutes("/v1/vclaim-sep-control-letter", r, hk.MapHandlerFunc{ + "POST /": vclaimsepcontrolletter.O.Create, + }) + hk.GroupRoutes("/v1/vclaim-sep-hist", r, hk.MapHandlerFunc{ "GET /": vclaimsephist.O.GetList, }) diff --git a/internal/interface/main-handler/unit/handler.go b/internal/interface/main-handler/material-package-item/handler.go similarity index 72% rename from internal/interface/main-handler/unit/handler.go rename to internal/interface/main-handler/material-package-item/handler.go index f31667a2..11deb6d9 100644 --- a/internal/interface/main-handler/unit/handler.go +++ b/internal/interface/main-handler/material-package-item/handler.go @@ -1,4 +1,4 @@ -package unit +package material import ( "net/http" @@ -8,8 +8,8 @@ import ( // ua "github.com/karincake/tumpeng/auth/svc" - e "simrs-vx/internal/domain/main-entities/unit" - u "simrs-vx/internal/use-case/main-use-case/unit" + e "simrs-vx/internal/domain/main-entities/material-package-item" + u "simrs-vx/internal/use-case/main-use-case/material-package-item" ) type myBase struct{} @@ -33,21 +33,19 @@ func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { } func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { return } dto := e.ReadDetailDto{} - - sf.UrlQueryParam(&dto, *r.URL) - dto.Code = &code + dto.Id = uint(id) res, err := u.ReadDetail(dto) rw.DataResponse(w, res, err) } func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { return } @@ -55,19 +53,19 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - dto.Code = code + dto.Id = uint(id) res, err := u.Update(dto) rw.DataResponse(w, res, err) } func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { return } dto := e.DeleteDto{} - dto.Code = &code + dto.Id = uint(id) res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/unit-position/handler.go b/internal/interface/main-handler/material-package/handler.go similarity index 91% rename from internal/interface/main-handler/unit-position/handler.go rename to internal/interface/main-handler/material-package/handler.go index 7780e80d..609d983e 100644 --- a/internal/interface/main-handler/unit-position/handler.go +++ b/internal/interface/main-handler/material-package/handler.go @@ -1,4 +1,4 @@ -package unit_position +package material import ( "net/http" @@ -8,8 +8,8 @@ import ( // ua "github.com/karincake/tumpeng/auth/svc" - e "simrs-vx/internal/domain/main-entities/unit-position" - u "simrs-vx/internal/use-case/main-use-case/unit-position" + e "simrs-vx/internal/domain/main-entities/material-package" + u "simrs-vx/internal/use-case/main-use-case/material-package" ) type myBase struct{} diff --git a/internal/interface/main-handler/patient/handler.go b/internal/interface/main-handler/patient/handler.go index 41fca562..dc6c3ff5 100644 --- a/internal/interface/main-handler/patient/handler.go +++ b/internal/interface/main-handler/patient/handler.go @@ -59,11 +59,18 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { return } + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto := e.UpdateDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + dto.Id = uint(id) + dto.AuthInfo = *authInfo res, err := u.Update(dto) rw.DataResponse(w, res, err) } @@ -75,7 +82,15 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { } dto := e.DeleteDto{} + + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.Id = uint(id) + dto.AuthInfo = *authInfo + res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/action-report/handler.go b/internal/interface/main-handler/procedure-report/handler.go similarity index 93% rename from internal/interface/main-handler/action-report/handler.go rename to internal/interface/main-handler/procedure-report/handler.go index 0fdd1851..a648463b 100644 --- a/internal/interface/main-handler/action-report/handler.go +++ b/internal/interface/main-handler/procedure-report/handler.go @@ -8,8 +8,8 @@ import ( // ua "github.com/karincake/tumpeng/auth/svc" - e "simrs-vx/internal/domain/main-entities/action-report" - u "simrs-vx/internal/use-case/main-use-case/action-report" + e "simrs-vx/internal/domain/main-entities/procedure-report" + u "simrs-vx/internal/use-case/main-use-case/procedure-report" pa "simrs-vx/internal/lib/auth" diff --git a/internal/interface/main-handler/procedure-room-order-item/handler.go b/internal/interface/main-handler/procedure-room-order-item/handler.go new file mode 100644 index 00000000..0caed63d --- /dev/null +++ b/internal/interface/main-handler/procedure-room-order-item/handler.go @@ -0,0 +1,71 @@ +package procedureroomorder + +import ( + "net/http" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + // ua "github.com/karincake/tumpeng/auth/svc" + + e "simrs-vx/internal/domain/main-entities/procedure-room-order-item" + u "simrs-vx/internal/use-case/main-use-case/procedure-room-order-item" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := e.CreateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.Create(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + sf.UrlQueryParam(&dto, *r.URL) + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + dto := e.ReadDetailDto{} + dto.Id = uint64(id) + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + + dto := e.UpdateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint64(id) + res, err := u.Update(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + + dto := e.DeleteDto{} + dto.Id = uint64(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/procedure-room-order/handler.go b/internal/interface/main-handler/procedure-room-order/handler.go new file mode 100644 index 00000000..58c2c80b --- /dev/null +++ b/internal/interface/main-handler/procedure-room-order/handler.go @@ -0,0 +1,83 @@ +package procedureroomorder + +import ( + "net/http" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + // ua "github.com/karincake/tumpeng/auth/svc" + + e "simrs-vx/internal/domain/main-entities/procedure-room-order" + u "simrs-vx/internal/use-case/main-use-case/procedure-room-order" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := e.CreateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.Create(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + sf.UrlQueryParam(&dto, *r.URL) + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + dto := e.ReadDetailDto{} + dto.Id = uint64(id) + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + + dto := e.UpdateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint64(id) + res, err := u.Update(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + + dto := e.DeleteDto{} + dto.Id = uint64(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Submit(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.ReadDetailDto{} + dto.Id = uint64(id) + res, err := u.Submit(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/procedure-room/handler.go b/internal/interface/main-handler/procedure-room/handler.go new file mode 100644 index 00000000..6d6aeb1c --- /dev/null +++ b/internal/interface/main-handler/procedure-room/handler.go @@ -0,0 +1,71 @@ +package procedureroom + +import ( + "net/http" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + // ua "github.com/karincake/tumpeng/auth/svc" + + e "simrs-vx/internal/domain/main-entities/procedure-room" + u "simrs-vx/internal/use-case/main-use-case/procedure-room" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := e.CreateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.Create(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + sf.UrlQueryParam(&dto, *r.URL) + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + dto := e.ReadDetailDto{} + dto.Id = uint16(id) + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + + dto := e.UpdateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint16(id) + res, err := u.Update(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id == 0 { + return + } + + dto := e.DeleteDto{} + dto.Id = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/screening/handler.go b/internal/interface/main-handler/screening/handler.go new file mode 100644 index 00000000..a6866cc9 --- /dev/null +++ b/internal/interface/main-handler/screening/handler.go @@ -0,0 +1,80 @@ +package screening + +import ( + "net/http" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + // ua "github.com/karincake/tumpeng/auth/svc" + + e "simrs-vx/internal/domain/main-entities/screening" + u "simrs-vx/internal/use-case/main-use-case/screening" + + pa "simrs-vx/internal/lib/auth" + + d "github.com/karincake/dodol" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto := e.CreateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.AuthInfo = *authInfo + res, err := u.Create(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + sf.UrlQueryParam(&dto, *r.URL) + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + dto := e.ReadDetailDto{} + dto.Id = uint(id) + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +// func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { +// id := rw.ValidateInt(w, "id", r.PathValue("id")) +// if id <= 0 { +// return +// } + +// dto := e.UpdateDto{} +// if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { +// return +// } +// dto.Id = uint16(id) +// res, err := u.Update(dto) +// rw.DataResponse(w, res, err) +// } + +// func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { +// id := rw.ValidateInt(w, "id", r.PathValue("id")) +// if id <= 0 { +// return +// } + +// dto := e.DeleteDto{} +// dto.Id = uint16(id) +// res, err := u.Delete(dto) +// rw.DataResponse(w, res, err) +// } diff --git a/internal/interface/main-handler/soapi/handler.go b/internal/interface/main-handler/soapi/handler.go index fe50b7d2..3683bb23 100644 --- a/internal/interface/main-handler/soapi/handler.go +++ b/internal/interface/main-handler/soapi/handler.go @@ -47,7 +47,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { return } dto := e.ReadDetailDto{} - dto.Id = uint16(id) + dto.Id = uint(id) res, err := u.ReadDetail(dto) rw.DataResponse(w, res, err) } @@ -62,7 +62,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - dto.Id = uint16(id) + dto.Id = uint(id) res, err := u.Update(dto) rw.DataResponse(w, res, err) } @@ -74,7 +74,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { } dto := e.DeleteDto{} - dto.Id = uint16(id) + dto.Id = uint(id) res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/vclaim-sep-control-letter/handler.go b/internal/interface/main-handler/vclaim-sep-control-letter/handler.go new file mode 100644 index 00000000..d26cc633 --- /dev/null +++ b/internal/interface/main-handler/vclaim-sep-control-letter/handler.go @@ -0,0 +1,67 @@ +package vclaimsepcontrolletter + +import ( + "net/http" + + rw "github.com/karincake/risoles" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter" + u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-control-letter" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := e.CreateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.Create(dto) + rw.DataResponse(w, res, err) +} + +// func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { +// dto := e.ReadListDto{} +// sf.UrlQueryParam(&dto, *r.URL) +// res, err := u.ReadList(dto) +// rw.DataResponse(w, res, err) +// } + +// func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { +// number := rw.ValidateString(w, "number", r.PathValue("number")) +// if number <= "" { +// return +// } +// dto := e.ReadDetailDto{} +// dto.Number = &number +// res, err := u.ReadDetail(dto) +// rw.DataResponse(w, res, err) +// } + +// func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { +// number := rw.ValidateString(w, "number", r.PathValue("number")) +// if number != "" { +// return +// } + +// dto := e.UpdateDto{} +// if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { +// return +// } +// dto.Number = &number +// res, err := u.Update(dto) +// rw.DataResponse(w, res, err) +// } + +// func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { +// id := rw.ValidateInt(w, "id", r.PathValue("id")) +// if id <= 0 { +// return +// } +// dto := e.DeleteDto{} +// dto.Id = uint(id) +// res, err := u.Delete(dto) +// rw.DataResponse(w, res, err) +// } diff --git a/internal/interface/main-handler/vclaim-sep/handler.go b/internal/interface/main-handler/vclaim-sep/handler.go index 1529e2d8..2a3fe788 100644 --- a/internal/interface/main-handler/vclaim-sep/handler.go +++ b/internal/interface/main-handler/vclaim-sep/handler.go @@ -56,12 +56,12 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { // } func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { + number := rw.ValidateString(w, "number", r.PathValue("number")) + if number == "" { return } dto := e.DeleteDto{} - dto.Id = uint(id) + dto.Number = &number res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 16128e5a..6e92950e 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -1,24 +1,29 @@ package migration import ( - actionreport "simrs-vx/internal/domain/main-entities/action-report" adime "simrs-vx/internal/domain/main-entities/adime" admemployeehist "simrs-vx/internal/domain/main-entities/adm-employee-hist" ambulancetransportreq "simrs-vx/internal/domain/main-entities/ambulance-transport-req" ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" antibioticinuse "simrs-vx/internal/domain/main-entities/antibiotic-in-use" antibioticsrccategory "simrs-vx/internal/domain/main-entities/antibiotic-src-category" + apmcuorder "simrs-vx/internal/domain/main-entities/ap-mcu-order" appointment "simrs-vx/internal/domain/main-entities/appointment" authpartner "simrs-vx/internal/domain/main-entities/auth-partner" chemo "simrs-vx/internal/domain/main-entities/chemo" + chemoplan "simrs-vx/internal/domain/main-entities/chemo-plan" chemoprotocol "simrs-vx/internal/domain/main-entities/chemo-protocol" consultation "simrs-vx/internal/domain/main-entities/consultation" controlletter "simrs-vx/internal/domain/main-entities/control-letter" counter "simrs-vx/internal/domain/main-entities/counter" + cpmcuorder "simrs-vx/internal/domain/main-entities/cp-mcu-order" + cpmcuorderitem "simrs-vx/internal/domain/main-entities/cp-mcu-order-item" deathcause "simrs-vx/internal/domain/main-entities/death-cause" device "simrs-vx/internal/domain/main-entities/device" deviceorder "simrs-vx/internal/domain/main-entities/device-order" deviceorderitem "simrs-vx/internal/domain/main-entities/device-order-item" + devicepackage "simrs-vx/internal/domain/main-entities/device-package" + devicepackageitem "simrs-vx/internal/domain/main-entities/device-package-item" diagnosesrc "simrs-vx/internal/domain/main-entities/diagnose-src" district "simrs-vx/internal/domain/main-entities/district" division "simrs-vx/internal/domain/main-entities/division" @@ -46,6 +51,8 @@ import ( material "simrs-vx/internal/domain/main-entities/material" materialorder "simrs-vx/internal/domain/main-entities/material-order" materialorderitem "simrs-vx/internal/domain/main-entities/material-order-item" + materialpackage "simrs-vx/internal/domain/main-entities/material-package" + materialpackageitem "simrs-vx/internal/domain/main-entities/material-package-item" mcuorder "simrs-vx/internal/domain/main-entities/mcu-order" mcuorderitem "simrs-vx/internal/domain/main-entities/mcu-order-item" mcuordersubitem "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" @@ -63,6 +70,8 @@ import ( medicinemethod "simrs-vx/internal/domain/main-entities/medicine-method" medicinemix "simrs-vx/internal/domain/main-entities/medicine-mix" medicinemixitem "simrs-vx/internal/domain/main-entities/medicine-mix-item" + micromcuorder "simrs-vx/internal/domain/main-entities/micro-mcu-order" + micromcuorderitem "simrs-vx/internal/domain/main-entities/micro-mcu-order-item" midwife "simrs-vx/internal/domain/main-entities/midwife" nurse "simrs-vx/internal/domain/main-entities/nurse" nutritionist "simrs-vx/internal/domain/main-entities/nutritionist" @@ -78,13 +87,19 @@ import ( practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" prescription "simrs-vx/internal/domain/main-entities/prescription" prescriptionitem "simrs-vx/internal/domain/main-entities/prescription-item" + procedurereport "simrs-vx/internal/domain/main-entities/procedure-report" + procedureroom "simrs-vx/internal/domain/main-entities/procedure-room" + procedureroomorder "simrs-vx/internal/domain/main-entities/procedure-room-order" + procedureroomorderitem "simrs-vx/internal/domain/main-entities/procedure-room-order-item" proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" province "simrs-vx/internal/domain/main-entities/province" + radiologymcuorder "simrs-vx/internal/domain/main-entities/radiology-mcu-order" + radiologymcuorderitem "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item" regency "simrs-vx/internal/domain/main-entities/regency" + registrator "simrs-vx/internal/domain/main-entities/registrator" rehab "simrs-vx/internal/domain/main-entities/rehab" responsibledoctorhist "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" resume "simrs-vx/internal/domain/main-entities/resume" - room "simrs-vx/internal/domain/main-entities/room" sbar "simrs-vx/internal/domain/main-entities/sbar" screening "simrs-vx/internal/domain/main-entities/screening" soapi "simrs-vx/internal/domain/main-entities/soapi" @@ -94,8 +109,6 @@ import ( subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" subspecialistposition "simrs-vx/internal/domain/main-entities/subspecialist-position" therapyprotocol "simrs-vx/internal/domain/main-entities/therapy-protocol" - unit "simrs-vx/internal/domain/main-entities/unit" - unitposition "simrs-vx/internal/domain/main-entities/unit-position" uom "simrs-vx/internal/domain/main-entities/uom" user "simrs-vx/internal/domain/main-entities/user" userfes "simrs-vx/internal/domain/main-entities/user-fes" @@ -121,7 +134,6 @@ func getMainEntities() []any { &division.Division{}, &divisionposition.DivisionPosition{}, &installation.Installation{}, - &unit.Unit{}, &village.Village{}, &district.District{}, ®ency.Regency{}, @@ -135,6 +147,7 @@ func getMainEntities() []any { &proceduresrc.ProcedureSrc{}, &employee.Employee{}, &intern.Intern{}, + ®istrator.Registrator{}, &doctor.Doctor{}, &nurse.Nurse{}, &nutritionist.Nutritionist{}, @@ -145,6 +158,7 @@ func getMainEntities() []any { &item.Item{}, &itemprice.ItemPrice{}, &infra.Infra{}, + &procedureroom.ProcedureRoom{}, &medicinegroup.MedicineGroup{}, &medicinemethod.MedicineMethod{}, &mcusrccategory.McuSrcCategory{}, @@ -164,13 +178,17 @@ func getMainEntities() []any { &personrelative.PersonRelative{}, &patient.Patient{}, &appointment.Appointment{}, + &devicepackage.DevicePackage{}, + &devicepackageitem.DevicePackageItem{}, + &materialpackage.MaterialPackage{}, + &materialpackageitem.MaterialPackageItem{}, + &vclaimsep.VclaimSep{}, &encounter.Encounter{}, &laborant.Laborant{}, &specialist.Specialist{}, &subspecialist.Subspecialist{}, &specialistintern.SpecialistIntern{}, - &room.Room{}, &soapi.Soapi{}, &sbar.Sbar{}, &adime.Adime{}, @@ -190,6 +208,13 @@ func getMainEntities() []any { &mcuorderitem.McuOrderItem{}, &mcusubsrc.McuSubSrc{}, &mcuordersubitem.McuOrderSubItem{}, + &apmcuorder.ApMcuOrder{}, + &radiologymcuorder.RadiologyMcuOrder{}, + &radiologymcuorderitem.RadiologyMcuOrderItem{}, + &cpmcuorder.CpMcuOrder{}, + &cpmcuorderitem.CpMcuOrderItem{}, + µmcuorder.MicroMcuOrder{}, + µmcuorderitem.MicroMcuOrderItem{}, &antibioticsrccategory.AntibioticSrcCategory{}, &antibioticinuse.AntibioticInUse{}, &consultation.Consultation{}, @@ -197,6 +222,9 @@ func getMainEntities() []any { &midwife.Midwife{}, &postalregion.PostalRegion{}, &internalreference.InternalReference{}, + &procedureroomorder.ProcedureRoomOrder{}, + &procedureroomorderitem.ProcedureRoomOrderItem{}, + &vclaimsephist.VclaimSepHist{}, &vclaimsepprint.VclaimSepPrint{}, &vehicle.Vehicle{}, @@ -207,7 +235,6 @@ func getMainEntities() []any { &generalconsent.GeneralConsent{}, &deathcause.DeathCause{}, &installationposition.InstallationPosition{}, - &unitposition.UnitPosition{}, &specialistposition.SpecialistPosition{}, &subspecialistposition.SubspecialistPosition{}, &responsibledoctorhist.ResponsibleDoctorHist{}, @@ -222,6 +249,7 @@ func getMainEntities() []any { &resume.Resume{}, &vclaimreference.VclaimReference{}, &screening.Screening{}, - &actionreport.ActionReport{}, + &procedurereport.ProcedureReport{}, + &chemoplan.ChemoPlan{}, } } diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index 15341164..78a3987f 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -39,5 +39,4 @@ func getEntities(input string) []any { func Migrate(input string) { loader(input) - } diff --git a/internal/interface/migration/simgossync-entities.go b/internal/interface/migration/simgossync-entities.go index 7b37a842..0480a1e1 100644 --- a/internal/interface/migration/simgossync-entities.go +++ b/internal/interface/migration/simgossync-entities.go @@ -3,10 +3,13 @@ package migration import ( /************** Source ***************/ division "simrs-vx/internal/domain/sync-entities/division" + doctor "simrs-vx/internal/domain/sync-entities/doctor" encounter "simrs-vx/internal/domain/sync-entities/encounter" installation "simrs-vx/internal/domain/sync-entities/installation" internalreference "simrs-vx/internal/domain/sync-entities/internal-reference" + nurse "simrs-vx/internal/domain/sync-entities/nurse" patient "simrs-vx/internal/domain/sync-entities/patient" + soapi "simrs-vx/internal/domain/sync-entities/soapi" specialist "simrs-vx/internal/domain/sync-entities/specialist" subspecialist "simrs-vx/internal/domain/sync-entities/subspecialist" unit "simrs-vx/internal/domain/sync-entities/unit" @@ -38,5 +41,14 @@ func getSyncEntities() []any { &internalreference.InternalReferenceLink{}, &internalreference.InternalReferenceSimxLog{}, &internalreference.InternalReferenceSimgosLog{}, + &soapi.SoapiLink{}, + &soapi.SoapiSimxLog{}, + &soapi.SoapiSimgosLog{}, + &doctor.DoctorLink{}, + &doctor.DoctorSimxLog{}, + &doctor.DoctorSimgosLog{}, + &nurse.NurseLink{}, + &nurse.NurseSimxLog{}, + &nurse.NurseSimgosLog{}, } } diff --git a/internal/interface/simgos-sync-handler/new/encounter/handler.go b/internal/interface/simgos-sync-handler/new/encounter/handler.go index aef2f7d2..c37ba66d 100644 --- a/internal/interface/simgos-sync-handler/new/encounter/handler.go +++ b/internal/interface/simgos-sync-handler/new/encounter/handler.go @@ -87,32 +87,32 @@ func (obj myBase) UpdateStatus(w http.ResponseWriter, r *http.Request) { rw.DataResponse(w, res, err) } -func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { +func (obj myBase) RequestSwitchSpecialist(w http.ResponseWriter, r *http.Request) { dto := e.Encounter{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := u.RequestSwitchUnit(dto) + res, err := u.RequestSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) ApproveSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := u.ApproveSwitchUnit(dto) + res, err := u.ApproveSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) CancelSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := u.CancelSwitchUnit(dto) + res, err := u.CancelSwitchSpecialist(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/simgos-sync-handler/new/unit/handler.go b/internal/interface/simgos-sync-handler/new/soapi/handler.go similarity index 77% rename from internal/interface/simgos-sync-handler/new/unit/handler.go rename to internal/interface/simgos-sync-handler/new/soapi/handler.go index 95808728..3a52a581 100644 --- a/internal/interface/simgos-sync-handler/new/unit/handler.go +++ b/internal/interface/simgos-sync-handler/new/soapi/handler.go @@ -1,4 +1,4 @@ -package unit +package soapi import ( "net/http" @@ -6,10 +6,10 @@ import ( rw "github.com/karincake/risoles" // ua "github.com/karincake/tumpeng/auth/svc" - e "simrs-vx/internal/domain/main-entities/unit" + e "simrs-vx/internal/domain/main-entities/soapi" esync "simrs-vx/internal/domain/sync-entities/log" - u "simrs-vx/internal/use-case/simgos-sync-use-case/new/unit" + u "simrs-vx/internal/use-case/simgos-sync-use-case/new/soapi" ) type myBase struct{} @@ -17,7 +17,7 @@ type myBase struct{} var O myBase func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { - dto := e.CreateDto{} + dto := e.Soapi{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } @@ -35,19 +35,11 @@ func (obj myBase) CreateLog(w http.ResponseWriter, r *http.Request) { } func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { - return - } - - dto := e.UpdateDto{} + dto := e.Soapi{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - val := uint16(id) - dto.Id = &val - res, err := u.Update(dto) rw.DataResponse(w, res, err) } @@ -59,8 +51,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { } dto := e.DeleteDto{} - val := uint16(id) - dto.Id = &val + dto.Id = uint(id) res, err := u.Delete(dto) rw.DataResponse(w, res, err) diff --git a/internal/interface/simgos-sync-handler/old/.keep b/internal/interface/simgos-sync-handler/old/.keep new file mode 100644 index 00000000..e69de29b diff --git a/internal/interface/simgos-sync-handler/old/authentication/authentication.go b/internal/interface/simgos-sync-handler/old/authentication/authentication.go new file mode 100644 index 00000000..282e1ea6 --- /dev/null +++ b/internal/interface/simgos-sync-handler/old/authentication/authentication.go @@ -0,0 +1,52 @@ +package authentication + +import ( + "context" + "net/http" + + d "github.com/karincake/dodol" + rw "github.com/karincake/risoles" + + sc "simrs-vx/internal/lib/sync-credential" + + e "simrs-vx/internal/domain/sync-entities/authentication" + is "simrs-vx/internal/infra/sync-cfg" +) + +func NewGuardMW(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // check the data format + input := e.CredentialDto{} + if success := sc.CheckCredentialData(&input, r, w); !success { + return + } + + // check the validity + if input.Source != is.O.NewSource || input.SecretKey != is.O.NewSecretKey { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "invalid consumer credential"}, nil) + return + } + + ctx := context.WithValue(r.Context(), e.SyncKey{}, input) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} + +func OldGuardMW(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // check the data format + input := e.CredentialDto{} + if success := sc.CheckCredentialData(&input, r, w); !success { + return + } + + // check the validity + if input.Source != is.O.OldSource || input.SecretKey != is.O.OldSecretKey { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "invalid consumer credential"}, nil) + return + } + + ctx := context.WithValue(r.Context(), e.SyncKey{}, input) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} diff --git a/internal/interface/simgos-sync-handler/old/patient/handler.go b/internal/interface/simgos-sync-handler/old/patient/handler.go new file mode 100644 index 00000000..4c697fd4 --- /dev/null +++ b/internal/interface/simgos-sync-handler/old/patient/handler.go @@ -0,0 +1,48 @@ +package patient + +import ( + "net/http" + + p "simrs-vx/internal/domain/simgos-entities/m-pasien" + uo "simrs-vx/internal/use-case/simgos-sync-use-case/old/patient" + + rw "github.com/karincake/risoles" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := p.MPasienDto{} + if !rw.ValidateStructByIOR(w, r.Body, &dto) { + return + } + + // mapping m_patient to patient + patient := dto.ToPatient() + res, err := uo.Create(patient) + rw.DataResponse(w, res, err) + +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + + dto := p.MPasienDto{} + if !rw.ValidateStructByIOR(w, r.Body, &dto) { + return + } + patient := dto.ToPatient() + res, err := uo.Update(patient) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { + dto := p.MPasienDto{} + if !rw.ValidateStructByIOR(w, r.Body, &dto) { + return + } + patient := dto.ToPatient() + res, err := uo.Delete(patient) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/simgos-sync-handler/seeder/handler.go b/internal/interface/simgos-sync-handler/seeder/handler.go new file mode 100644 index 00000000..0d0f70c6 --- /dev/null +++ b/internal/interface/simgos-sync-handler/seeder/handler.go @@ -0,0 +1,23 @@ +package seeder + +import ( + "net/http" + seeder "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" + main "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/seeder" + + rw "github.com/karincake/risoles" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Seeder(w http.ResponseWriter, r *http.Request) { + dto := seeder.Dto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + + res, err := main.SeedToSimx(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/simgos-sync-handler/simgos-sync-handler.go b/internal/interface/simgos-sync-handler/simgos-sync-handler.go index 5d52d40b..761c6b74 100644 --- a/internal/interface/simgos-sync-handler/simgos-sync-handler.go +++ b/internal/interface/simgos-sync-handler/simgos-sync-handler.go @@ -6,6 +6,7 @@ import ( /******************** infra ********************/ gs "simrs-vx/internal/infra/gorm-setting" simgosdb "simrs-vx/internal/infra/simgos-db" + sync "simrs-vx/internal/infra/sync-cfg" /******************** pkg ********************/ cmw "simrs-vx/pkg/cors-manager-mw" @@ -24,9 +25,15 @@ import ( "simrs-vx/internal/interface/simgos-sync-handler/new/encounter" "simrs-vx/internal/interface/simgos-sync-handler/new/installation" "simrs-vx/internal/interface/simgos-sync-handler/new/patient" + "simrs-vx/internal/interface/simgos-sync-handler/new/soapi" "simrs-vx/internal/interface/simgos-sync-handler/new/specialist" "simrs-vx/internal/interface/simgos-sync-handler/new/subspecialist" - "simrs-vx/internal/interface/simgos-sync-handler/new/unit" + + sd "simrs-vx/internal/interface/simgos-sync-handler/seeder" + + oldpatient "simrs-vx/internal/interface/simgos-sync-handler/old/patient" + + oauth "simrs-vx/internal/interface/simgos-sync-handler/old/authentication" // just a reminder, an openauth ) func SetRoutes() http.Handler { @@ -34,6 +41,7 @@ func SetRoutes() http.Handler { a.RegisterExtCall(gs.Adjust) a.RegisterExtCall(zlc.Adjust) a.RegisterExtCall(lh.Populate) + a.RegisterExtCall(sync.SetConfig) a.RegisterExtCall(simgosdb.SetInstance) r := http.NewServeMux() @@ -44,7 +52,6 @@ func SetRoutes() http.Handler { /******************** SvcToOld ******************/ prefixnew := "/new-to-old" hc.SyncCrud(r, prefixnew+"/v1/installation", installation.O) - hc.SyncCrud(r, prefixnew+"/v1/unit", unit.O) hc.SyncCrud(r, prefixnew+"/v1/division", division.O) hc.SyncCrud(r, prefixnew+"/v1/specialist", specialist.O) hc.SyncCrud(r, prefixnew+"/v1/subspecialist", subspecialist.O) @@ -63,13 +70,24 @@ func SetRoutes() http.Handler { "PATCH /{id}/checkin": encounter.O.Checkin, "PATCH /{id}/checkout": encounter.O.Checkout, "PATCH /{id}/update-status": encounter.O.UpdateStatus, - "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchUnit, - "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchUnit, - "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchUnit, + "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchSpecialist, + "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchSpecialist, + "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchSpecialist, + }) + hc.SyncCrud(r, prefixnew+"/v1/soapi", soapi.O) + + /******************** Seeder ******************/ + prefixseeder := "/seeder" + hk.GroupRoutes(prefixseeder+"/v1", r, hk.MapHandlerFunc{ + "POST /": sd.O.Seeder, }) /******************** SvcToNew ******************/ - //prefixold := "/old-to-new" - + prefixold := "/old-to-new" + hk.GroupRoutes(prefixold+"/v1/patient", r, oauth.OldGuardMW, hk.MapHandlerFunc{ + "POST /": oldpatient.O.Create, + "PATCH /{id}": oldpatient.O.Update, + "DELETE /{id}": oldpatient.O.Delete, + }) // FINISH THIS return cmw.SetCors(handlerlogger.SetLog(r)) } diff --git a/internal/lib/auth/tycovar.go b/internal/lib/auth/tycovar.go index 117d0c73..ba5be2fc 100644 --- a/internal/lib/auth/tycovar.go +++ b/internal/lib/auth/tycovar.go @@ -22,6 +22,7 @@ type AuthInfo struct { Pharmachist_Code *string Intern_Position_Code *string Roles []string + Sync bool // User_DivisionPositions []DivisionPosition } @@ -65,6 +66,13 @@ func (a AuthInfo) IsPharmacist() bool { return *a.Employee_Position_Code == string(ero.EPCPha) } +func (a AuthInfo) IsScreener() bool { // MPP, petugas skrining + if a.Employee_Position_Code == nil { + return false + } + return *a.Employee_Position_Code == string(ero.EPCScr) +} + // func (a AuthInfo) IsPayment() bool { // if a.Employee_Position_Code == nil { // return false @@ -96,3 +104,11 @@ func (a AuthInfo) IsNurseIntern() bool { func (a AuthInfo) HasEmployeePosition() bool { return a.Employee_Position_Code != nil } + +func (a AuthInfo) IsReg() bool { + return a.Employee_Position_Code != nil && *a.Employee_Position_Code == string(ero.EPCReg) +} + +func (a AuthInfo) IsSys() bool { + return a.User_ContractPosition_Code == string(ero.CSCSys) +} diff --git a/internal/lib/sync-credential/helper.go b/internal/lib/sync-credential/helper.go new file mode 100644 index 00000000..e6c5952f --- /dev/null +++ b/internal/lib/sync-credential/helper.go @@ -0,0 +1,23 @@ +package authentication + +import ( + "net/http" + + d "github.com/karincake/dodol" + rw "github.com/karincake/risoles" + sr "github.com/karincake/serabi" + + e "simrs-vx/internal/domain/sync-entities/authentication" +) + +func CheckCredentialData(input *e.CredentialDto, r *http.Request, w http.ResponseWriter) bool { + input.Source = r.Header.Get("X-Sync-Source") + input.SecretKey = r.Header.Get("X-Sync-SecretKey") + input.UserName = r.Header.Get("X-Sync-UserName") + if err := sr.Validate(input); err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.II{"errors": err}, nil) + return false + } + return true + +} diff --git a/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/plugin.go b/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/plugin.go new file mode 100644 index 00000000..3ad81f74 --- /dev/null +++ b/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/plugin.go @@ -0,0 +1,125 @@ +package vclaimsepcontrolletter + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter" + + ibpjs "simrs-vx/internal/infra/bpjs" + + "gorm.io/gorm" +) + +func CreateSepControlLetter(input *e.CreateDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error { + payload, err := input.RequestPayloadIntoJson() + if err != nil { + return err + } + req, err := http.NewRequest("POST", ibpjs.O.BaseUrl+"RencanaKontrol", bytes.NewBuffer(payload)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + var vresp Response + if err := json.Unmarshal(body, &vresp); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } + + if vresp.MetaData.Code != "200" { + return fmt.Errorf("failed to create sep control letter: %s", vresp.MetaData.Message) + } + + pdfNeeds, err := vresp.ToPDFNeeds() + if err != nil { + return err + } + tmp := string(pdfNeeds) + input.Value = &tmp + input.Number = &vresp.Response.NoSuratKontrol + input.VclaimSep_Number = &vresp.Response.Sep.NoSep + return nil +} + +// func ReadDetailSep(input *e.ReadDetailDto, data *e.VclaimSep, tx *gorm.DB) error { +// endpoint := fmt.Sprintf("sep/%s", input.Number) +// req, err := http.NewRequest("GET", ibpjs.O.BaseUrl+endpoint, nil) +// if err != nil { +// return err +// } +// req.Header.Set("Content-Type", "application/json") + +// resp, err := http.DefaultClient.Do(req) +// if err != nil { +// return err +// } +// defer resp.Body.Close() + +// body, err := io.ReadAll(resp.Body) +// if err != nil { +// return err +// } + +// var detail e.SepResponse +// if err := json.Unmarshal(body, &detail); err != nil { +// return fmt.Errorf("failed to parse response JSON: %w", err) +// } + +// data.Detail = detail.Response + +// return nil +// } + +// func DeleteSep(input *e.DeleteDto, data *e.VclaimSep, tx *gorm.DB) error { +// payload := e.SepDeleteRequest{} +// payload.Request.TSep.NoSep = *input.Number +// payload.Request.TSep.User = "Coba Ws" + +// jsonPayload, err := json.Marshal(payload) +// if err != nil { +// return err +// } + +// req, err := http.NewRequest("DELETE", ibpjs.O.BaseUrl+"sep", bytes.NewBuffer(jsonPayload)) +// if err != nil { +// return err +// } + +// req.Header.Set("Content-Type", "application/json") + +// resp, err := http.DefaultClient.Do(req) +// if err != nil { +// return err +// } +// defer resp.Body.Close() + +// body, err := io.ReadAll(resp.Body) +// if err != nil { +// return err +// } + +// var detail e.SepResponse +// if err := json.Unmarshal(body, &detail); err != nil { +// return fmt.Errorf("failed to parse response JSON: %w", err) +// } + +// if detail.MetaData.Message == SepNotFound { +// return fmt.Errorf("sep with number %s not found", *data.Number) +// } + +// return nil +// } diff --git a/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/tycovar.go b/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/tycovar.go new file mode 100644 index 00000000..c732afa5 --- /dev/null +++ b/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/tycovar.go @@ -0,0 +1,87 @@ +package vclaimsepcontrolletter + +import ( + "encoding/json" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter" +) + +type SuratKontrol struct { + NoSuratKontrol string `json:"noSuratKontrol"` + TglRencanaKontrol string `json:"tglRencanaKontrol"` + TglTerbit string `json:"tglTerbit"` + JnsKontrol string `json:"jnsKontrol"` + PoliTujuan string `json:"poliTujuan"` + NamaPoliTujuan string `json:"namaPoliTujuan"` + KodeDokter string `json:"kodeDokter"` + NamaDokter string `json:"namaDokter"` + FlagKontrol string `json:"flagKontrol"` + KodeDokterPembuat *string `json:"kodeDokterPembuat"` + NamaDokterPembuat *string `json:"namaDokterPembuat"` + NamaJnsKontrol string `json:"namaJnsKontrol"` + Sep Sep `json:"sep"` +} + +type Sep struct { + NoSep string `json:"noSep"` + TglSep string `json:"tglSep"` + JnsPelayanan string `json:"jnsPelayanan"` + Poli string `json:"poli"` + Diagnosa string `json:"diagnosa"` + Peserta Peserta `json:"peserta"` + ProvUmum ProvUmum `json:"provUmum"` + ProvPerujuk ProvPerujuk `json:"provPerujuk"` +} + +type Peserta struct { + NoKartu string `json:"noKartu"` + Nama string `json:"nama"` + TglLahir string `json:"tglLahir"` + Kelamin string `json:"kelamin"` + HakKelas string `json:"hakKelas"` +} + +type ProvUmum struct { + KdProvider string `json:"kdProvider"` + NmProvider string `json:"nmProvider"` +} + +type ProvPerujuk struct { + KdProviderPerujuk string `json:"kdProviderPerujuk"` + NmProviderPerujuk string `json:"nmProviderPerujuk"` + AsalRujukan string `json:"asalRujukan"` + NoRujukan string `json:"noRujukan"` + TglRujukan string `json:"tglRujukan"` +} + +type Response struct { + MetaData MetaData `json:"metaData"` + Response *SuratKontrol `json:"response"` // nullable +} + +type MetaData struct { + Code string `json:"code"` + Message string `json:"message"` +} + +func (r Response) ToPDFNeeds() ([]byte, error) { + response := e.ResponseForPDF{ + Number: r.Response.Sep.NoSep, + PlannedControlDate: r.Response.TglRencanaKontrol, + IssuedDate: r.Response.TglTerbit, + Doctor_Name: r.Response.NamaDokter, + DstUnit_Name: r.Response.NamaPoliTujuan, + ResponsibleDoctor_Name: *r.Response.NamaDokterPembuat, + VclaimSep: e.VclaimSep{ + VclaimMember: e.VclaimMember{ + CardNumber: r.Response.Sep.Peserta.NoKartu, + Name: r.Response.Sep.Peserta.Nama, + BirthDate: r.Response.Sep.Peserta.TglLahir, + Gender: r.Response.Sep.Peserta.Kelamin, + }, + Diagnose: r.Response.Sep.Diagnosa, + Number: r.Response.Sep.NoSep, + }, + } + return json.Marshal(response) +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/helper.go b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/helper.go index 891e7c4d..c878d00b 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/helper.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/helper.go @@ -20,5 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSepControlLet data.VclaimSep_Number = inputSrc.VclaimSep_Number data.Number = inputSrc.Number data.Value = inputSrc.Value - data.FileUrl = inputSrc.FileUrl + // data.FileUrl = inputSrc.FileUrl } diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go index 57262cc2..0cca1159 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go @@ -1,9 +1,12 @@ package vclaimsepcontrolletter +import ( + pvscl "simrs-vx/internal/use-case/bpjs-plugin/vclaim-sep-control-letter" +) + // example of middleware -// func init() { -// createPreMw = append(createPreMw, -// CreateMw{Name: "modif-input", Func: pm.ModifInput}, -// CreateMw{Name: "check-data", Func: pm.CheckData}, -// ) -// } +func init() { + createPreMw = append(createPreMw, + createMw{Name: "create-sep-control-letter", Func: pvscl.CreateSepControlLetter}, + ) +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/case.go b/internal/use-case/bpjs-use-case/vclaim-sep/case.go index 1d0e4aab..0f0d5203 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep/case.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep/case.go @@ -246,7 +246,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} + rdDto := e.ReadDetailDto{Number: input.Number} var data *e.VclaimSep var err error diff --git a/internal/use-case/main-use-case/action-report/helper.go b/internal/use-case/main-use-case/action-report/helper.go deleted file mode 100644 index efe4532e..00000000 --- a/internal/use-case/main-use-case/action-report/helper.go +++ /dev/null @@ -1,28 +0,0 @@ -/* -DESCRIPTION: -Any functions that are used internally by the use-case -*/ -package actionreport - -import ( - e "simrs-vx/internal/domain/main-entities/action-report" -) - -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ActionReport) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { - inputSrc = inputT - } else { - inputTemp := any(input).(*e.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Encounter_Id = inputSrc.Encounter_Id - data.Date = inputSrc.Date - data.Doctor_Code = inputSrc.Doctor_Code - data.Operator_Employe_Id = inputSrc.Operator_Employe_Id - data.Assistant_Employe_Id = inputSrc.Assistant_Employe_Id - data.Instrumentor_Employe_Id = inputSrc.Instrumentor_Employe_Id - data.Nurse_Code = inputSrc.Nurse_Code - data.Value = inputSrc.Value -} diff --git a/internal/use-case/main-use-case/antibiotic-in-use/lib.go b/internal/use-case/main-use-case/antibiotic-in-use/lib.go index e6b2d13d..4a64ef2d 100644 --- a/internal/use-case/main-use-case/antibiotic-in-use/lib.go +++ b/internal/use-case/main-use-case/antibiotic-in-use/lib.go @@ -137,4 +137,4 @@ func DeleteData(data *e.AntibioticInUse, event *pl.Event, dbx ...*gorm.DB) error pl.SetLogInfo(event, nil, "complete") return nil -} \ No newline at end of file +} diff --git a/internal/use-case/main-use-case/antibiotic-in-use/middleware-runner.go b/internal/use-case/main-use-case/antibiotic-in-use/middleware-runner.go index de906bf8..580a47ba 100644 --- a/internal/use-case/main-use-case/antibiotic-in-use/middleware-runner.go +++ b/internal/use-case/main-use-case/antibiotic-in-use/middleware-runner.go @@ -100,4 +100,4 @@ func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, inpu func (me *middlewareRunner) setMwType(mwType pu.MWType) { me.MwType = mwType -} \ No newline at end of file +} diff --git a/internal/use-case/main-use-case/antibiotic-in-use/middleware.go b/internal/use-case/main-use-case/antibiotic-in-use/middleware.go index f437fa0c..a232aec5 100644 --- a/internal/use-case/main-use-case/antibiotic-in-use/middleware.go +++ b/internal/use-case/main-use-case/antibiotic-in-use/middleware.go @@ -6,4 +6,4 @@ package antibioticinuse // CreateMw{Name: "modif-input", Func: pm.ModifInput}, // CreateMw{Name: "check-data", Func: pm.CheckData}, // ) -// } \ No newline at end of file +// } diff --git a/internal/use-case/main-use-case/antibiotic-in-use/tycovar.go b/internal/use-case/main-use-case/antibiotic-in-use/tycovar.go index f35c0065..81e502c0 100644 --- a/internal/use-case/main-use-case/antibiotic-in-use/tycovar.go +++ b/internal/use-case/main-use-case/antibiotic-in-use/tycovar.go @@ -41,4 +41,4 @@ var readDetailPostMw []readDetailMw var updatePreMw []readDetailMw var updatePostMw []readDetailMw var deletePreMw []readDetailMw -var deletePostMw []readDetailMw \ No newline at end of file +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/antibiotic-src/case.go b/internal/use-case/main-use-case/antibiotic-src/case.go index e1ff1c44..9b108f65 100644 --- a/internal/use-case/main-use-case/antibiotic-src/case.go +++ b/internal/use-case/main-use-case/antibiotic-src/case.go @@ -277,4 +277,4 @@ func Delete(input e.DeleteDto) (*d.Data, error) { Data: data.ToResponse(), }, nil -} \ No newline at end of file +} diff --git a/internal/use-case/main-use-case/antibiotic-src/lib.go b/internal/use-case/main-use-case/antibiotic-src/lib.go index 24f91815..c9ede312 100644 --- a/internal/use-case/main-use-case/antibiotic-src/lib.go +++ b/internal/use-case/main-use-case/antibiotic-src/lib.go @@ -137,4 +137,4 @@ func DeleteData(data *e.AntibioticSrc, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil -} \ No newline at end of file +} diff --git a/internal/use-case/main-use-case/unit/case.go b/internal/use-case/main-use-case/ap-mcu-order/case.go similarity index 63% rename from internal/use-case/main-use-case/unit/case.go rename to internal/use-case/main-use-case/ap-mcu-order/case.go index c73c2c1d..845b8eeb 100644 --- a/internal/use-case/main-use-case/unit/case.go +++ b/internal/use-case/main-use-case/ap-mcu-order/case.go @@ -1,10 +1,7 @@ -package unit +package apmcuorder import ( - "errors" - e "simrs-vx/internal/domain/main-entities/unit" - erc "simrs-vx/internal/domain/references/common" - esync "simrs-vx/internal/domain/sync-entities/log" + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" "strconv" dg "github.com/karincake/apem/db-gorm-pg" @@ -16,10 +13,10 @@ import ( "gorm.io/gorm" ) -const source = "unit" +const source = "device" func Create(input e.CreateDto) (*d.Data, error) { - data := e.Unit{} + data := e.ApMcuOrder{} event := pl.Event{ Feature: "Create", @@ -29,44 +26,35 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - // validate unit_code - _, err := strconv.Atoi(input.Code) - if err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "invalid_code_format", - Detail: "unit_code must be a valid integer", - Raw: errors.New("invalid unit_code format"), + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err } - return nil, pl.SetLogError(&event, input) - } - mwRunner := newMiddlewareRunner(&event) - - err = dg.I.Transaction(func(tx *gorm.DB) error { if resData, err := CreateData(input, &event, tx); err != nil { return err } else { data = *resData - id := uint(data.Id) - input.Id = &id } - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunCreateMiddleware(createPreMw, &input); err != nil { + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { return err } + pl.SetLogInfo(&event, nil, "complete") + return nil }) - if err = runLogMiddleware(err, input, mwRunner); err != nil { + if err != nil { return nil, err } - pl.SetLogInfo(&event, nil, "complete") - return &d.Data{ Meta: d.II{ "source": source, @@ -78,7 +66,8 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var dataList []e.Unit + var data *e.ApMcuOrder + var dataList []e.ApMcuOrder var metaList *e.MetaDto var err error @@ -91,9 +80,23 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readList") err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + return nil }) @@ -116,7 +119,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { } func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { - var data *e.Unit + var data *e.ApMcuOrder var err error event := pl.Event{ @@ -128,9 +131,23 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readDetail") err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + if data, err = ReadDetailData(input, &event, tx); err != nil { return err } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + return nil }) @@ -149,8 +166,8 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Code: &input.Code} - var data *e.Unit + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ApMcuOrder var err error event := pl.Event{ @@ -160,7 +177,6 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - mwRunner := newMiddlewareRunner(&event) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -168,26 +184,32 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - input.Id = &data.Id + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + if err := UpdateData(input, data, &event, tx); err != nil { return err } - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunUpdateMiddleware(updatePreMw, &input); err != nil { + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { return err } return nil }) - if err = runLogMiddleware(err, input, mwRunner); err != nil { + if err != nil { return nil, err } - pl.SetLogInfo(&event, nil, "complete") - return &d.Data{ Meta: d.IS{ "source": source, @@ -200,8 +222,8 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Code: input.Code} - var data *e.Unit + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ApMcuOrder var err error event := pl.Event{ @@ -211,7 +233,6 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - mwRunner := newMiddlewareRunner(&event) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -219,26 +240,30 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return err } - input.Id = &data.Id + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + if err := DeleteData(data, &event, tx); err != nil { return err } - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunDeleteMiddleware(deletePreMw, &input); err != nil { + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { return err } return nil }) - if err = runLogMiddleware(err, input, mwRunner); err != nil { + if err != nil { return nil, err } - pl.SetLogInfo(&event, nil, "complete") - return &d.Data{ Meta: d.IS{ "source": source, @@ -249,32 +274,3 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } - -func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error { - var errMsg string - inputLog := esync.SimxLogDto{ - Payload: input, - Method: erc.CCCreate, - } - - if err != nil { - // Run log-middleware - errMsg = err.Error() - inputLog.ErrMessage = &errMsg - inputLog.IsSuccess = false - - // create log failed - if errMiddleware := mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); errMiddleware != nil { - return errMiddleware - } - return err - } - - // create log success - inputLog.IsSuccess = true - if err = mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); err != nil { - return err - } - - return nil -} diff --git a/internal/use-case/main-use-case/ap-mcu-order/helper.go b/internal/use-case/main-use-case/ap-mcu-order/helper.go new file mode 100644 index 00000000..4b91b7aa --- /dev/null +++ b/internal/use-case/main-use-case/ap-mcu-order/helper.go @@ -0,0 +1,27 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package apmcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ApMcuOrder) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Substances = inputSrc.Substances + data.Fictations = inputSrc.Fictations + data.Localization = inputSrc.Localization + data.ClinicalDiagnoses = inputSrc.ClinicalDiagnoses + data.Stadium = inputSrc.Stadium + data.PastHistory = inputSrc.PastHistory + data.CurrentHistory = inputSrc.CurrentHistory +} diff --git a/internal/use-case/main-use-case/room/lib.go b/internal/use-case/main-use-case/ap-mcu-order/lib.go similarity index 84% rename from internal/use-case/main-use-case/room/lib.go rename to internal/use-case/main-use-case/ap-mcu-order/lib.go index 5e586248..8b6d8a74 100644 --- a/internal/use-case/main-use-case/room/lib.go +++ b/internal/use-case/main-use-case/ap-mcu-order/lib.go @@ -1,7 +1,7 @@ -package room +package apmcuorder import ( - e "simrs-vx/internal/domain/main-entities/room" + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" @@ -12,10 +12,10 @@ import ( "gorm.io/gorm" ) -func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Room, error) { +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ApMcuOrder, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := e.Room{} + data := e.ApMcuOrder{} setData(&input, &data) var tx *gorm.DB @@ -33,9 +33,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Room, e return &data, nil } -func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Room, *e.MetaDto, error) { +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ApMcuOrder, *e.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.Room{} + data := []e.ApMcuOrder{} pagination := gh.Pagination{} count := int64(0) meta := e.MetaDto{} @@ -48,12 +48,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ro } tx = tx. - Model(&e.Room{}). + Model(&e.ApMcuOrder{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { @@ -70,9 +70,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ro return data, &meta, nil } -func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Room, error) { +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ApMcuOrder, error) { pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.Room{} + data := e.ApMcuOrder{} var tx *gorm.DB if len(dbx) > 0 { @@ -91,7 +91,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input e.UpdateDto, data *e.Room, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(input e.UpdateDto, data *e.ApMcuOrder, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") setData(&input, data) @@ -116,7 +116,7 @@ func UpdateData(input e.UpdateDto, data *e.Room, event *pl.Event, dbx ...*gorm.D return nil } -func DeleteData(data *e.Room, event *pl.Event, dbx ...*gorm.DB) error { +func DeleteData(data *e.ApMcuOrder, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete") var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/action-report/middleware-runner.go b/internal/use-case/main-use-case/ap-mcu-order/middleware-runner.go similarity index 86% rename from internal/use-case/main-use-case/action-report/middleware-runner.go rename to internal/use-case/main-use-case/ap-mcu-order/middleware-runner.go index e2544169..dc7f2495 100644 --- a/internal/use-case/main-use-case/action-report/middleware-runner.go +++ b/internal/use-case/main-use-case/ap-mcu-order/middleware-runner.go @@ -1,7 +1,7 @@ -package actionreport +package apmcuorder import ( - e "simrs-vx/internal/domain/main-entities/action-report" + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -23,7 +23,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ActionReport) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ApMcuOrder) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -38,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e return nil } -func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ActionReport) error { +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ApMcuOrder) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -53,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu return nil } -func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error { +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ApMcuOrder) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -68,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ApMcuOrder) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -83,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ApMcuOrder) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) diff --git a/internal/use-case/main-use-case/room/middleware.go b/internal/use-case/main-use-case/ap-mcu-order/middleware.go similarity index 91% rename from internal/use-case/main-use-case/room/middleware.go rename to internal/use-case/main-use-case/ap-mcu-order/middleware.go index 668f18e2..38161afe 100644 --- a/internal/use-case/main-use-case/room/middleware.go +++ b/internal/use-case/main-use-case/ap-mcu-order/middleware.go @@ -1,4 +1,4 @@ -package room +package apmcuorder // example of middleware // func init() { diff --git a/internal/use-case/main-use-case/action-report/tycovar.go b/internal/use-case/main-use-case/ap-mcu-order/tycovar.go similarity index 76% rename from internal/use-case/main-use-case/action-report/tycovar.go rename to internal/use-case/main-use-case/ap-mcu-order/tycovar.go index 9eebfabd..7f301ff1 100644 --- a/internal/use-case/main-use-case/action-report/tycovar.go +++ b/internal/use-case/main-use-case/ap-mcu-order/tycovar.go @@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the middleware to separate from main use-case which has the basic CRUD functionality. The purpose of this is to make the code more maintainable. */ -package actionreport +package apmcuorder import ( "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/action-report" + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" ) type createMw struct { Name string - Func func(input *e.CreateDto, data *e.ActionReport, tx *gorm.DB) error + Func func(input *e.CreateDto, data *e.ApMcuOrder, tx *gorm.DB) error } type readListMw struct { Name string - Func func(input *e.ReadListDto, data *e.ActionReport, tx *gorm.DB) error + Func func(input *e.ReadListDto, data *e.ApMcuOrder, tx *gorm.DB) error } type readDetailMw struct { Name string - Func func(input *e.ReadDetailDto, data *e.ActionReport, tx *gorm.DB) error + Func func(input *e.ReadDetailDto, data *e.ApMcuOrder, tx *gorm.DB) error } type UpdateMw = readDetailMw diff --git a/internal/use-case/main-use-case/authentication/case.go b/internal/use-case/main-use-case/authentication/case.go index db83d315..04a88c9b 100644 --- a/internal/use-case/main-use-case/authentication/case.go +++ b/internal/use-case/main-use-case/authentication/case.go @@ -179,6 +179,10 @@ func VerifyToken(r *http.Request, tokenType TokenType) (data *jwt.Token, errCode return token, "", "" } +func GetAuthInfoByUserName(userName string) (data *pa.AuthInfo, err error) { + return getAuthByUserName(userName) +} + func ExtractToken(r *http.Request, tokenType TokenType) (data *pa.AuthInfo, err error) { token, errCode, errDetail := VerifyToken(r, tokenType) if errCode != "" { diff --git a/internal/use-case/main-use-case/authentication/helper.go b/internal/use-case/main-use-case/authentication/helper.go index 7af3afa5..94739363 100644 --- a/internal/use-case/main-use-case/authentication/helper.go +++ b/internal/use-case/main-use-case/authentication/helper.go @@ -2,6 +2,7 @@ package authentication import ( "fmt" + pa "simrs-vx/internal/lib/auth" "strconv" "time" @@ -10,10 +11,13 @@ import ( dg "github.com/karincake/apem/db-gorm-pg" ms "github.com/karincake/apem/ms-redis" d "github.com/karincake/dodol" + gh "github.com/karincake/getuk" l "github.com/karincake/lepet" pl "simrs-vx/pkg/logger" + erg "simrs-vx/internal/domain/references/organization" + edp "simrs-vx/internal/domain/main-entities/division-position" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/employee" @@ -22,17 +26,15 @@ import ( em "simrs-vx/internal/domain/main-entities/midwife" en "simrs-vx/internal/domain/main-entities/nurse" ep "simrs-vx/internal/domain/main-entities/pharmacist" + er "simrs-vx/internal/domain/main-entities/registrator" esp "simrs-vx/internal/domain/main-entities/specialist-position" essp "simrs-vx/internal/domain/main-entities/subspecialist-position" - eup "simrs-vx/internal/domain/main-entities/unit-position" eu "simrs-vx/internal/domain/main-entities/user" - erg "simrs-vx/internal/domain/references/organization" udp "simrs-vx/internal/use-case/main-use-case/division-position" uip "simrs-vx/internal/use-case/main-use-case/installation-position" usp "simrs-vx/internal/use-case/main-use-case/specialist-position" ussp "simrs-vx/internal/use-case/main-use-case/subspecialist-position" - uup "simrs-vx/internal/use-case/main-use-case/unit-position" ) // just return the error code @@ -81,7 +83,7 @@ func getDivisionPosition(employee_id uint, event *pl.Event) ([]string, error) { func getInstallationPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string - // get data unit_position based on employee_id + // get data specialist_position based on employee_id data, _, err := uip.ReadListData(eip.ReadListDto{ FilterDto: eip.FilterDto{Employee_Id: &employeeId}, Includes: "installation"}, event) @@ -98,28 +100,10 @@ func getInstallationPosition(employeeId uint, event *pl.Event) ([]string, error) return result, nil } -func getUnitPosition(employeeId uint, event *pl.Event) ([]string, error) { - var result []string - - // get data unit_position based on employee_id - data, _, err := uup.ReadListData(eup.ReadListDto{FilterDto: eup.FilterDto{Employee_Id: &employeeId}}, event) - if err != nil { - return nil, err - } - - if len(data) > 0 { - for _, dp := range data { - result = append(result, "unit|"+*dp.Unit_Code+"|"+dp.Code) - } - } - - return result, nil -} - func getSpecialistPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string - // get data unit_position based on employee_id + // get data specialist_position based on employee_id data, _, err := usp.ReadListData(esp.ReadListDto{FilterDto: esp.FilterDto{Employee_Id: &employeeId}}, event) if err != nil { return nil, err @@ -137,7 +121,7 @@ func getSpecialistPosition(employeeId uint, event *pl.Event) ([]string, error) { func getSubspecialistPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string - // get data unit_position based on employee_id + // get data specialist_position based on employee_id data, _, err := ussp.ReadListData(essp.ReadListDto{ FilterDto: essp.FilterDto{Employee_Id: &employeeId}, Includes: "subspecialist"}, event) @@ -226,9 +210,9 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out outputData["doctor_code"] = doctor.Code // specialist - if doctor.Unit_Code != nil { - atClaims["unit_code"] = doctor.Unit_Code - outputData["unit_code"] = doctor.Unit_Code + if doctor.Specialist_Code != nil { + atClaims["specialist_code"] = doctor.Specialist_Code + outputData["specialist_code"] = doctor.Specialist_Code } if doctor.Specialist_Code != nil { atClaims["specialist_code"] = doctor.Specialist_Code @@ -262,6 +246,16 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out } atClaims["pharmacist_code"] = empData.Code outputData["pharmacist_code"] = empData.Code + case erg.EPCReg: + empData := er.Registrator{} + dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&empData) + if empData.Id == 0 { + return d.FieldErrors{"authentication": d.FieldError{Code: "auth-noRegistrator", Message: pl.GenMessage("auth-noRegistrator")}} + } + atClaims["registrator_id"] = empData.Id + outputData["registrator_id"] = empData.Id + atClaims["installation_code"] = empData.Installation_Code + outputData["installation_code"] = empData.Installation_Code } errorGetPosition := d.FieldErrors{"authentication": d.FieldError{Code: "auth-getData-failed", Message: pl.GenMessage("auth-getData-failed")}} @@ -278,12 +272,6 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out return errorGetPosition } - // unit position - unitPositions, err := getUnitPosition(employee.Id, &event) - if err != nil { - return errorGetPosition - } - // specialist position specialistPositions, err := getSpecialistPosition(employee.Id, &event) if err != nil { @@ -298,7 +286,7 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out roles = append(roles, divisionPositions...) roles = append(roles, installationPositions...) - roles = append(roles, unitPositions...) + roles = append(roles, specialistPositions...) roles = append(roles, specialistPositions...) roles = append(roles, subspecialistPositions...) // atClaims["division_positions"] = divsionPositions @@ -334,3 +322,71 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out return nil } + +func getAuthByUserName(username string) (auth *pa.AuthInfo, err error) { + // get employee + emp := ee.Employee{} + if err = dg.I. + Joins(`JOIN "User" u ON u."Id" = "Employee"."User_Id"`). + Where(`u."Name" = ?`, username). + Scopes(gh.Preload("User")). + First(&emp).Error; err != nil { + return nil, err + } + + auth = &pa.AuthInfo{ + User_Id: *emp.User_Id, + User_Name: emp.User.Name, + User_ContractPosition_Code: string(emp.User.ContractPosition_Code), + Employee_Position_Code: strPtr(string(*emp.Position_Code)), + Employee_Id: &emp.Id, + Sync: true, + } + + // set map table + tableMap := map[erg.EmployeePositionCode]string{ + erg.EPCDoc: "Doctor", + erg.EPCNur: "Nurse", + erg.EPCMwi: "Midwife", + erg.EPCNut: "Nutritionist", + erg.EPCLab: "Laborant", + erg.EPCPha: "Pharmachist", + } + + table := tableMap[*emp.Position_Code] + if table == "" { + return + } + + type CodeResult struct { + Code string + } + var result CodeResult + + err = dg.I.Table(table). + Select("Code"). + Where("\"Employee_Id\" = ?", emp.Id). + First(&result).Error + if err != nil { + return nil, err + } + + // set map for code + setterMap := map[erg.EmployeePositionCode]func(string){ + erg.EPCDoc: func(v string) { auth.Doctor_Code = &v }, + erg.EPCNur: func(v string) { auth.Nurse_Code = &v }, + erg.EPCMwi: func(v string) { auth.Midwife_Code = &v }, + erg.EPCNut: func(v string) { auth.Nutritionist_Code = &v }, + erg.EPCLab: func(v string) { auth.Laborant_Code = &v }, + erg.EPCPha: func(v string) { auth.Pharmachist_Code = &v }, + } + + setter := setterMap[*emp.Position_Code] + setter(result.Code) + + return +} + +func strPtr(s string) *string { + return &s +} diff --git a/internal/use-case/main-use-case/chemo-protocol/helper.go b/internal/use-case/main-use-case/chemo-protocol/helper.go index 885e6fbb..66a63dcc 100644 --- a/internal/use-case/main-use-case/chemo-protocol/helper.go +++ b/internal/use-case/main-use-case/chemo-protocol/helper.go @@ -17,12 +17,9 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ChemoProtocol) { inputSrc = &inputTemp.CreateDto } - data.Encounter_Id = inputSrc.Encounter_Id data.Patient_Weight = inputSrc.Patient_Weight data.Patient_Height = inputSrc.Patient_Height data.Diagnoses = inputSrc.Diagnoses - data.Duration = inputSrc.Duration - data.DurationUnit_Code = inputSrc.DurationUnit_Code data.StartDate = inputSrc.StartDate data.EndDate = inputSrc.EndDate } diff --git a/internal/use-case/main-use-case/chemo/helper.go b/internal/use-case/main-use-case/chemo/helper.go index 51a09a3a..c241bce3 100644 --- a/internal/use-case/main-use-case/chemo/helper.go +++ b/internal/use-case/main-use-case/chemo/helper.go @@ -19,5 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Chemo) { data.Encounter_Id = inputSrc.Encounter_Id data.Status_Code = inputSrc.Status_Code - data.SrcUnit_Code = inputSrc.SrcUnit_Code + data.Specialist_Code = inputSrc.Specialist_Code } diff --git a/internal/use-case/main-use-case/consultation/case.go b/internal/use-case/main-use-case/consultation/case.go index 25306169..1691e4a9 100644 --- a/internal/use-case/main-use-case/consultation/case.go +++ b/internal/use-case/main-use-case/consultation/case.go @@ -312,7 +312,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - if data.DstDoctor_Code != nil && data.DstDoctor_Code != input.AuthInfo.Doctor_Code { + if data.Doctor_Code != nil && data.Doctor_Code != input.AuthInfo.Doctor_Code { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-handled-mismatch", @@ -322,7 +322,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - data.DstDoctor_Code = input.AuthInfo.Doctor_Code + data.Doctor_Code = input.AuthInfo.Doctor_Code data.Solution = input.Solution data.RepliedAt = pu.GetTimeNow() err = tx.Save(&data).Error diff --git a/internal/use-case/main-use-case/consultation/helper.go b/internal/use-case/main-use-case/consultation/helper.go index 3a518c77..6a4e2a3e 100644 --- a/internal/use-case/main-use-case/consultation/helper.go +++ b/internal/use-case/main-use-case/consultation/helper.go @@ -20,5 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Consultation) { data.Encounter_Id = inputSrc.Encounter_Id data.Date = inputSrc.Date data.Problem = inputSrc.Problem - data.DstUnit_Code = inputSrc.DstUnit_Code + data.Specialist_Code = inputSrc.Specialist_Code } diff --git a/internal/use-case/main-use-case/control-letter/helper.go b/internal/use-case/main-use-case/control-letter/helper.go index 8ae71d3c..899fb437 100644 --- a/internal/use-case/main-use-case/control-letter/helper.go +++ b/internal/use-case/main-use-case/control-letter/helper.go @@ -18,7 +18,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ControlLetter) { } data.Encounter_Id = inputSrc.Encounter_Id - data.Unit_Code = inputSrc.Unit_Code data.Specialist_Code = inputSrc.Specialist_Code data.Subspecialist_Code = inputSrc.Subspecialist_Code data.Doctor_Code = inputSrc.Doctor_Code diff --git a/internal/use-case/main-use-case/division/middleware-runner.go b/internal/use-case/main-use-case/division/middleware-runner.go index 51c90d77..76e1c873 100644 --- a/internal/use-case/main-use-case/division/middleware-runner.go +++ b/internal/use-case/main-use-case/division/middleware-runner.go @@ -6,7 +6,7 @@ import ( "gorm.io/gorm" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/division" esync "simrs-vx/internal/domain/sync-entities/log" diff --git a/internal/use-case/main-use-case/doctor/helper.go b/internal/use-case/main-use-case/doctor/helper.go index 9ddc2027..9571f62d 100644 --- a/internal/use-case/main-use-case/doctor/helper.go +++ b/internal/use-case/main-use-case/doctor/helper.go @@ -21,7 +21,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Doctor) { data.Employee_Id = inputSrc.Employee_Id data.IHS_Number = inputSrc.IHS_Number data.SIP_Number = inputSrc.SIP_Number - data.Unit_Code = inputSrc.Unit_Code data.Specialist_Code = inputSrc.Specialist_Code data.Subspecialist_Code = inputSrc.Subspecialist_Code } diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 07f055a8..dd131944 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -22,12 +22,14 @@ import ( edc "simrs-vx/internal/domain/main-entities/death-cause" e "simrs-vx/internal/domain/main-entities/encounter" eir "simrs-vx/internal/domain/main-entities/internal-reference" + ep "simrs-vx/internal/domain/main-entities/patient" es "simrs-vx/internal/domain/main-entities/soapi" esync "simrs-vx/internal/domain/sync-entities/log" uv "simrs-vx/internal/use-case/bpjs-use-case/vclaim-reference" udc "simrs-vx/internal/use-case/main-use-case/death-cause" uir "simrs-vx/internal/use-case/main-use-case/internal-reference" + up "simrs-vx/internal/use-case/main-use-case/patient" us "simrs-vx/internal/use-case/main-use-case/soapi" ) @@ -94,7 +96,7 @@ func Create(input e.CreateDto) (*d.Data, error) { input.NewStatus, err = identifyPatientStatus(input) input.Adm_Employee_Id = input.AuthInfo.Employee_Id - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { // create encounter @@ -124,7 +126,8 @@ func Create(input e.CreateDto) (*d.Data, error) { dataEncounter, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, - Includes: "Adm_Employee.User,Patient.Person.Relatives," + + Includes: "Adm_Employee.User,Adm_Employee.Person," + + "Patient.Person.Relatives," + "Patient.Person.VclaimMember,VclaimReference," + "Patient.Person.Contacts,Patient.Person.Addresses"}, &event, tx) @@ -158,7 +161,6 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.Encounter var dataList []e.Encounter var metaList *e.MetaDto var err error @@ -172,23 +174,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readList") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { - return err - } - if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -223,23 +211,9 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readDetail") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { - return err - } - if data, err = ReadDetailData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -277,7 +251,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } input.Adm_Employee_Id = input.AuthInfo.Employee_Id - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -352,7 +326,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -436,7 +410,7 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -554,14 +528,13 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - // TODO: Only "supervisi pendaftaran" could cancel encounter roleAllowed := []string{string(erg.EPCReg), string(erg.EPCNur), string(erg.EPCDoc)} err = validateAuth(input.AuthInfo, roleAllowed, "update-status-encounter", &event) if err != nil { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -604,9 +577,14 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { return err } - if input.StatusCode == erc.DSCProcess || input.StatusCode == erc.DSCCancel { - data.Status_Code = input.StatusCode + // get data encounter + if data, err = ReadDetailData(e.ReadDetailDto{ + Id: input.Id, + Includes: "Adm_Employee.User"}, &event, tx); err != nil { + return err + } + if input.StatusCode == erc.DSCProcess || input.StatusCode == erc.DSCCancel { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err := mwRunner.RunUpdateStatusMiddleware(updatestatusEncounter, data); err != nil { @@ -664,7 +642,7 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { input.StartedAt = &now } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -726,13 +704,13 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { }, nil } -func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { +func RequestSwitchSpecialist(input e.SwitchSpecialistDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Responsible_Nurse.Employee.User,Responsible_Doctor.Employee"} var data *e.Encounter var err error event := pl.Event{ - Feature: "RequestSwitchUnit", + Feature: "RequestSwitchSpecialist", Source: source, } @@ -742,8 +720,8 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { unitCodes := make(map[string]struct{}) doctorCodes := make(map[string]struct{}) for _, ref := range *input.InternalReferences { - if ref.Unit_Code != nil { - unitCodes[*ref.Unit_Code] = struct{}{} + if ref.Specialist_Code != nil { + unitCodes[*ref.Specialist_Code] = struct{}{} } if ref.Doctor_Code != nil { doctorCodes[*ref.Doctor_Code] = struct{}{} @@ -751,7 +729,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { } // validate unit - if err = validateUnitCodes(unitCodes, &event); err != nil { + if err = validateSpecialistCodes(unitCodes, &event); err != nil { return nil, err } @@ -767,7 +745,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { } input.Src_Nurse_Code = input.AuthInfo.Nurse_Code - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -795,7 +773,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "missing-soapi", - Detail: fmt.Sprintf("Missing soapi from latest responsible doctor"), + Detail: "Missing soapi from latest responsible doctor", } return pl.SetLogError(&event, input) } @@ -818,7 +796,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware - if err := mwRunner.RunRequestSwitchUnitMiddleware(requestSwitchEncounter, dataEncounter); err != nil { + if err := mwRunner.RunRequestSwitchSpecialistMiddleware(requestSwitchEncounter, dataEncounter); err != nil { return err } return nil @@ -834,13 +812,13 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { Meta: d.IS{ "source": source, "structure": "single-data", - "status": "requestSwitchUnit", + "status": "requestSwitchSpecialist", }, Data: data.ToResponse(), }, nil } -func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Responsible_Doctor.Employee"} var ( data *e.Encounter @@ -848,12 +826,12 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { ) event := pl.Event{ - Feature: "ApproveSwitchUnit", + Feature: "ApproveSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "approveSwitchUnit") + pl.SetLogInfo(&event, input, "started", "approveSwitchSpecialist") roleAllowed := []string{string(erg.EPCNur)} err = validateAuth(input.AuthInfo, roleAllowed, "request-switch-poly", &event) @@ -861,7 +839,7 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -905,7 +883,7 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "missing-soapi", - Detail: fmt.Sprintf("Missing soapi from latest responsible doctor"), + Detail: "Missing soapi from latest responsible doctor", } return pl.SetLogError(&event, input) } @@ -926,13 +904,13 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { } // update encounter - if err = updateEncounterApproveSwitchUnit(input, &event, tx); err != nil { + if err = updateEncounterApproveSwitchSpecialist(input, &event, tx); err != nil { return err } mwRunner.setMwType(pu.MWTPre) // Run pre-middleware - if err := mwRunner.RunApproveSwitchUnitMiddleware(approveSwitchEncounter, &input); err != nil { + if err := mwRunner.RunApproveSwitchSpecialistMiddleware(approveSwitchEncounter, &input); err != nil { return err } return nil @@ -955,7 +933,7 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { } -func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func CancelSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} var ( data *e.Encounter @@ -963,12 +941,12 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { ) event := pl.Event{ - Feature: "CancelSwitchUnit", + Feature: "CancelSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "cancelSwitchUnit") + pl.SetLogInfo(&event, input, "started", "cancelSwitchSpecialist") roleAllowed := []string{string(erg.EPCNur)} err = validateAuth(input.AuthInfo, roleAllowed, "request-switch-poly", &event) @@ -976,7 +954,7 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -1022,7 +1000,7 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware - if err := mwRunner.RunCancelSwitchUnitMiddleware(cancelSwitchEncounter, &input); err != nil { + if err := mwRunner.RunCancelSwitchSpecialistMiddleware(cancelSwitchEncounter, &input); err != nil { return err } return nil @@ -1099,3 +1077,144 @@ func validateAuth(a auth.AuthInfo, roleAllowed []string, action string, event *p return nil } + +func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) { + var ( + data e.Encounter + recentSoapiDataforCopy []es.CreateDto + err error + ) + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + roleAllowed := []string{string(erg.EPCReg)} + err = validateAuth(input.Encounter.AuthInfo, roleAllowed, "create-encounter", &event) + if err != nil { + return nil, err + } + + // validate rehab by bpjs + if input.Encounter.RefTypeCode == ere.RTCBpjs && + input.Encounter.Class_Code == ere.ECAmbulatory && + ere.AmbulatoryClassCode(*input.Encounter.SubClass_Code) == ere.ACCRehab { + // get latest rehab data + recentRehabData, err := getLatestRehabData(input.Encounter, &event) + if err != nil { + return nil, err + } + + // If recentRehabData is nil, then visitMode_Code = "adm" + if recentRehabData != nil { + // If recentRehabData is not nil, determine the visitMode_Code: + // If the mode is "series", verify whether the visit count still remains + // and whether the series has not expired. + // If visitMode is "series", then get encounterAdm + input.Encounter.VisitMode_Code, input.Encounter.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input.Encounter, &event) + if err != nil { + return nil, err + } + } else { + input.Encounter.VisitMode_Code = ere.VMCAdm + } + + // When visitMode_Code is "series", load the associated SOAPI record to copy its values. + if input.Encounter.VisitMode_Code == ere.VMCSeries { + // get data soapi + recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.Encounter.RecentEncounterAdm, &event) + if err != nil { + return nil, err + } + } + } + + // check if patient is new in the hospital + input.Encounter.NewStatus, err = identifyPatientStatus(input.Encounter) + if err != nil { + return nil, err + } + input.Encounter.Adm_Employee_Id = input.Encounter.AuthInfo.Employee_Id + + mwRunner := newMiddlewareRunner(&event, input.Encounter.Sync) + + err = dg.I.Transaction(func(tx *gorm.DB) error { + // create patient + var patientId uint + patientData, err := up.Create(input.Patient, tx) + if err != nil { + return err + } + + if patientData != nil { + patientId = patientData.Data.(ep.ResponseDto).Id + } + + // create encounter + input.Encounter.Patient_Id = &patientId + if resData, err := CreateData(input.Encounter, &event, tx); err != nil { + return err + } else { + data = *resData + input.Encounter.Id = data.Id + } + + // insert ambulatory/emergency/inpatient + err = insertdataClassCode(input.Encounter, recentSoapiDataforCopy, &event, tx) + if err != nil { + return err + } + + // insert vclaimReference + if vr := input.Encounter.VclaimReference; vr != nil { + t, _ := time.Parse("2006-01-02", vr.TglRujukan) + _, err = uv.CreateData(ev.CreateDto{ + Encounter_Id: &data.Id, + Date: &t, + SrcCode: input.Encounter.Ref_Number, + SrcName: input.Encounter.RefSource_Name, + Number: &vr.NoSep}, &event, tx) + if err != nil { + return err + } + } + + dataEncounter, err := ReadDetailData(e.ReadDetailDto{ + Id: data.Id, + Includes: "Adm_Employee.User,Adm_Employee.Person," + + "Patient.Person.Relatives," + + "Patient.Person.VclaimMember,VclaimReference," + + "Patient.Person.Contacts,Patient.Person.Addresses"}, + &event, tx) + if err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateWithPatientMiddleware(createWithPatientPreMw, dataEncounter); err != nil { + return err + } + + return nil + }) + + if err = runLogMiddleware(err, input, mwRunner); err != nil { + return nil, err + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index b6f24a0b..e3dfb00c 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -44,7 +44,7 @@ import ( er "simrs-vx/internal/domain/main-entities/rehab" erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" es "simrs-vx/internal/domain/main-entities/soapi" - eu "simrs-vx/internal/domain/main-entities/unit" + esp "simrs-vx/internal/domain/main-entities/specialist" // udo "simrs-vx/internal/use-case/main-use-case/device-order" uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist" @@ -65,44 +65,71 @@ import ( us "simrs-vx/internal/use-case/main-use-case/soapi" ) -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { - inputSrc = inputT - data.Status_Code = erc.DSCNew - } else { - inputTemp := any(input).(*e.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Patient_Id = inputSrc.Patient_Id - data.RegisteredAt = inputSrc.RegisteredAt - data.Class_Code = inputSrc.Class_Code - data.Unit_Code = inputSrc.Unit_Code - data.Specialist_Code = inputSrc.Specialist_Code - data.Subspecialist_Code = inputSrc.Subspecialist_Code - data.VisitDate = inputSrc.VisitDate - data.PaymentMethod_Code = inputSrc.PaymentMethod_Code - data.InsuranceCompany_Code = inputSrc.InsuranceCompany_Code - data.Member_Number = inputSrc.Member_Number - data.Ref_Number = inputSrc.Ref_Number - data.Trx_Number = inputSrc.Trx_Number - data.Appointment_Doctor_Code = inputSrc.Appointment_Doctor_Code - data.Adm_Employee_Id = inputSrc.Adm_Employee_Id - data.Responsible_Doctor_Code = inputSrc.Responsible_Doctor_Code - data.RefSource_Name = inputSrc.RefSource_Name - data.Appointment_Id = inputSrc.Appointment_Id - data.RefType_Code = &inputSrc.RefTypeCode - data.NewStatus = inputSrc.NewStatus +func setDataCreate(input *e.CreateDto, data *e.Encounter) { + data.Patient_Id = input.Patient_Id + data.RegisteredAt = input.RegisteredAt + data.Class_Code = input.Class_Code + data.Specialist_Code = input.Specialist_Code + data.Specialist_Code = input.Specialist_Code + data.Subspecialist_Code = input.Subspecialist_Code + data.VisitDate = input.VisitDate + data.PaymentMethod_Code = input.PaymentMethod_Code + data.InsuranceCompany_Code = input.InsuranceCompany_Code + data.Member_Number = input.Member_Number + data.RefType_Code = &input.RefTypeCode + data.Ref_Number = input.Ref_Number + data.Trx_Number = input.Trx_Number + data.Appointment_Doctor_Code = input.Appointment_Doctor_Code + data.Adm_Employee_Id = input.Adm_Employee_Id + data.RefSource_Name = input.RefSource_Name + data.Appointment_Id = input.Appointment_Id + data.Status_Code = erc.DSCNew + data.NewStatus = input.NewStatus } func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { - dst.Appointment_Doctor_Code = src.Appointment_Doctor_Code - dst.Responsible_Doctor_Code = src.Responsible_Doctor_Code - dst.Unit_Code = src.Unit_Code + dst.Specialist_Code = src.Specialist_Code dst.Specialist_Code = src.Specialist_Code dst.Subspecialist_Code = src.Subspecialist_Code dst.VisitDate = src.VisitDate + dst.Appointment_Doctor_Code = src.Appointment_Doctor_Code + dst.Adm_Employee_Id = src.Adm_Employee_Id + dst.Appointment_Id = src.Appointment_Id + dst.RefSource_Name = src.RefSource_Name + dst.Trx_Number = src.Trx_Number + dst.Ref_Number = src.Ref_Number + dst.Member_Number = src.Member_Number +} + +func setDataUpdateFromSource(input *e.UpdateDto, data *e.Encounter) { + data.Patient_Id = input.Patient_Id + data.RegisteredAt = input.RegisteredAt + data.Specialist_Code = input.Specialist_Code + data.Specialist_Code = input.Specialist_Code + data.Subspecialist_Code = input.Subspecialist_Code + data.VisitDate = input.VisitDate + data.StartedAt = input.StartedAt + data.FinishedAt = input.FinishedAt + data.PaymentMethod_Code = input.PaymentMethod_Code + data.InsuranceCompany_Code = input.InsuranceCompany_Code + data.Member_Number = input.Member_Number + data.RefType_Code = &input.RefTypeCode + data.Ref_Number = input.Ref_Number + data.Trx_Number = input.Trx_Number + data.Appointment_Doctor_Code = input.Appointment_Doctor_Code + data.Adm_Employee_Id = input.Adm_Employee_Id + data.Responsible_Doctor_Code = input.Responsible_Doctor_Code + data.Discharge_Method_Code = input.Discharge_Method_Code + data.RefSource_Name = input.RefSource_Name + data.Appointment_Id = input.Appointment_Id + data.EarlyEducation = input.EarlyEducation + data.MedicalDischargeEducation = input.MedicalDischargeEducation + data.AdmDischargeEducation = input.AdmDischargeEducation + data.DischargeReason = input.DischargeReason + data.Status_Code = input.Status_Code + data.Discharge_Date = input.Discharge_Date + data.NewStatus = input.NewStatus + data.Responsible_Nurse_Code = input.Responsible_Nurse_Code } func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { @@ -610,7 +637,7 @@ func getSoapiEncounterAdm(enc e.Encounter, event *pl.Event) (dataSoapi []es.Crea event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "missing-soapi", - Detail: fmt.Sprintf("Missing required Soapi types"), + Detail: "Missing required Soapi types", } return nil, pl.SetLogError(event, enc) } @@ -826,9 +853,9 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e switch { case subCode == ere.ACCChemo: chemoCreate := ec.CreateDto{ - Encounter_Id: &input.Id, - Status_Code: erc.DVCNew, - SrcUnit_Code: input.Unit_Code, + Encounter_Id: &input.Id, + Status_Code: erc.DVCNew, + Specialist_Code: input.Specialist_Code, } // create data chemo @@ -950,9 +977,9 @@ func setDBError(event *pl.Event, err error, ctx any) error { return pl.SetLogError(event, ctx) } -func getUnits(unitIds []string, event *pl.Event) ([]eu.Unit, error) { - pl.SetLogInfo(event, nil, "started", "getUnits") - var units []eu.Unit +func getSpecialists(unitIds []string, event *pl.Event) ([]esp.Specialist, error) { + pl.SetLogInfo(event, nil, "started", "getSpecialists") + var units []esp.Specialist err := dg.I.Where("\"Code\" IN ?", unitIds).Find(&units).Error if err != nil { event.Status = "failed" @@ -982,14 +1009,14 @@ func getDoctors(doctorIds []string, event *pl.Event) ([]ed.Doctor, error) { return doctors, nil } -func validateUnitCodes(unitCodes map[string]struct{}, event *pl.Event) error { +func validateSpecialistCodes(unitCodes map[string]struct{}, event *pl.Event) error { if len(unitCodes) > 0 { var codes []string for code := range unitCodes { codes = append(codes, code) } - units, err := getUnits(codes, event) + units, err := getSpecialists(codes, event) if err != nil { return fmt.Errorf("failed to fetch units: %w", err) } diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 0b14b925..d102030a 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -25,7 +25,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Encount pl.SetLogInfo(event, nil, "started", "DBCreate") data := e.Encounter{} - setData(&input, &data) + setDataCreate(&input, &data) var tx *gorm.DB if len(dbx) > 0 { @@ -65,12 +65,43 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En tx.Where("\"Responsible_Doctor_Code\" = ?", *input.AuthInfo.Doctor_Code) // } - tx.Scopes(gh.Preload(input.Includes)). - Scopes(gh.Filter(input.FilterDto)). + if input.StartDate != nil && input.EndDate != nil { + tx = tx.Where( + "DATE(\"Encounter\".\"RegisteredAt\") >= DATE(?) AND DATE(\"Encounter\".\"RegisteredAt\") <= DATE(?)", + input.StartDate, + input.EndDate, + ) + } + + if input.Patient_Identifier != nil { + tx = tx.Joins("JOIN \"Patient\" ON \"Patient\".\"Id\" = \"Encounter\".\"Patient_Id\""). + Joins("JOIN \"Person\" ON \"Person\".\"Id\" = \"Patient\".\"Person_Id\"").Where("\"Person\".\"Name\" ILIKE ? OR \"Patient\".\"Number\" = ?", "%"+*input.Patient_Identifier+"%", *input.Patient_Identifier) + } + + // TODO: getuk lib need to be updated to support this + if input.Status_Code != nil { + tx = tx.Where("\"Encounter\".\"Status_Code\" = ?", *input.Status_Code) + } + + if input.Specialist_Code != nil { + tx = tx.Where("\"Encounter\".\"Specialist_Code\" = ?", *input.Specialist_Code) + } + + if input.PaymentMethod_Code != nil { + tx = tx.Where("\"Encounter\".\"PaymentMethod_Code\" = ?", *input.PaymentMethod_Code) + } + + tx = tx.Scopes(gh.Preload(input.Includes)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") + // tx.Debug().Scopes(gh.Preload(input.Includes)). + // Scopes(gh.Filter(input.FilterDto)). + // Count(&count). + // Scopes(gh.Paginate(input, &pagination)). + // Order("\"CreatedAt\" DESC") + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil @@ -109,7 +140,12 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e func UpdateData(input e.UpdateDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - setDataUpdate(input, data) + + if input.Sync { + setDataUpdateFromSource(&input, data) + } else { + setDataUpdate(input, data) + } var tx *gorm.DB if len(dbx) > 0 { @@ -216,7 +252,10 @@ func UpdateStatusData(input e.UpdateStatusDto, event *pl.Event, dbx ...*gorm.DB) if err := tx.Model(&e.Encounter{}). Where("\"Id\" = ?", input.Id). - Update("Status_Code", input.StatusCode).Error; err != nil { + Updates(map[string]interface{}{ + "Status_Code": input.StatusCode, + "Adm_Employee_Id": input.Employee_Id, + }).Error; err != nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "update-fail", @@ -229,7 +268,7 @@ func UpdateStatusData(input e.UpdateStatusDto, event *pl.Event, dbx ...*gorm.DB) return nil } -func UpdateDischargeMethod(input e.SwitchUnitDto, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateDischargeMethod(input e.SwitchSpecialistDto, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, input, "started", "DBUpdateDischargeMethod") dischargeCode := setDischargeMethodCode(*input.PolySwitchCode) @@ -343,7 +382,7 @@ func verifyAllocatedVisitCount(i e.CreateDto, event *pl.Event) (e.Encounter, boo return recentEncounterAdm, valid, nil } -func updateEncounterApproveSwitchUnit(input e.ApproveCancelUnitDto, event *pl.Event, dbx ...*gorm.DB) (err error) { +func updateEncounterApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto, event *pl.Event, dbx ...*gorm.DB) (err error) { pl.SetLogInfo(event, nil, "started", "DBCreate") var tx *gorm.DB diff --git a/internal/use-case/main-use-case/encounter/middleware-runner.go b/internal/use-case/main-use-case/encounter/middleware-runner.go index 59bcfd9d..fff1a804 100644 --- a/internal/use-case/main-use-case/encounter/middleware-runner.go +++ b/internal/use-case/main-use-case/encounter/middleware-runner.go @@ -6,7 +6,7 @@ import ( "gorm.io/gorm" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/encounter" esync "simrs-vx/internal/domain/sync-entities/log" @@ -20,10 +20,15 @@ type middlewareRunner struct { } // NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event) *middlewareRunner { +func newMiddlewareRunner(event *pl.Event, syncFromOldSource bool) *middlewareRunner { + activateSync := sync.O.Enable + if syncFromOldSource { + activateSync = false + } + return &middlewareRunner{ Event: event, - SyncOn: sync.O.Enable, + SyncOn: activateSync, } } @@ -197,7 +202,7 @@ func (me *middlewareRunner) RunUpdateStatusMiddleware(middlewares []updateStatus return nil } -func (me *middlewareRunner) RunRequestSwitchUnitMiddleware(middleware requestSwitchUnitMw, input *e.Encounter) error { +func (me *middlewareRunner) RunRequestSwitchSpecialistMiddleware(middleware requestSwitchSpecialistMw, input *e.Encounter) error { if !me.SyncOn { return nil } @@ -215,7 +220,7 @@ func (me *middlewareRunner) RunRequestSwitchUnitMiddleware(middleware requestSwi return nil } -func (me *middlewareRunner) RunApproveSwitchUnitMiddleware(middleware approveSwitchUnitMw, input *e.ApproveCancelUnitDto) error { +func (me *middlewareRunner) RunApproveSwitchSpecialistMiddleware(middleware approveSwitchSpecialistMw, input *e.ApproveCancelSpecialistDto) error { if !me.SyncOn { return nil } @@ -233,7 +238,7 @@ func (me *middlewareRunner) RunApproveSwitchUnitMiddleware(middleware approveSwi return nil } -func (me *middlewareRunner) RunCancelSwitchUnitMiddleware(middleware cancelSwitchUnitMw, input *e.ApproveCancelUnitDto) error { +func (me *middlewareRunner) RunCancelSwitchSpecialistMiddleware(middleware cancelSwitchSpecialistMw, input *e.ApproveCancelSpecialistDto) error { if !me.SyncOn { return nil } @@ -254,3 +259,22 @@ func (me *middlewareRunner) RunCancelSwitchUnitMiddleware(middleware cancelSwitc func (me *middlewareRunner) setMwType(mwType pu.MWType) { me.MwType = mwType } + +func (me *middlewareRunner) RunCreateWithPatientMiddleware(middlewares []createWithPatientMw, input *e.Encounter) error { + if !me.SyncOn { + return nil + } + + for _, middleware := range middlewares { + logData := pu.GetLogData(input, nil) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} diff --git a/internal/use-case/main-use-case/encounter/middleware.go b/internal/use-case/main-use-case/encounter/middleware.go index 306e4bca..0db86dec 100644 --- a/internal/use-case/main-use-case/encounter/middleware.go +++ b/internal/use-case/main-use-case/encounter/middleware.go @@ -23,7 +23,7 @@ func init() { updatestatusEncounter = append(updatestatusEncounter, updateStatusMw{Name: "sync-update-status-encounter", Func: plugin.UpdateStatus}) - requestSwitchEncounter = requestSwitchUnitMw{Name: "sync-request-switch-unit-encounter", Func: plugin.RequestSwitchUnit} - approveSwitchEncounter = approveSwitchUnitMw{Name: "sync-approve-switch-unit-encounter", Func: plugin.ApproveSwitchUnit} - cancelSwitchEncounter = cancelSwitchUnitMw{Name: "sync-cancel-switch-unit-encounter", Func: plugin.CancelSwitchUnit} + requestSwitchEncounter = requestSwitchSpecialistMw{Name: "sync-request-switch-unit-encounter", Func: plugin.RequestSwitchSpecialist} + approveSwitchEncounter = approveSwitchSpecialistMw{Name: "sync-approve-switch-unit-encounter", Func: plugin.ApproveSwitchSpecialist} + cancelSwitchEncounter = cancelSwitchSpecialistMw{Name: "sync-cancel-switch-unit-encounter", Func: plugin.CancelSwitchSpecialist} } diff --git a/internal/use-case/main-use-case/encounter/tycovar.go b/internal/use-case/main-use-case/encounter/tycovar.go index 2b268378..fbafc4dd 100644 --- a/internal/use-case/main-use-case/encounter/tycovar.go +++ b/internal/use-case/main-use-case/encounter/tycovar.go @@ -59,19 +59,24 @@ type updateStatusMw struct { Func func(input *e.Encounter) error } -type requestSwitchUnitMw struct { +type requestSwitchSpecialistMw struct { Name string Func func(input *e.Encounter) error } -type approveSwitchUnitMw struct { +type approveSwitchSpecialistMw struct { Name string - Func func(input *e.ApproveCancelUnitDto) error + Func func(input *e.ApproveCancelSpecialistDto) error } -type cancelSwitchUnitMw struct { +type cancelSwitchSpecialistMw struct { Name string - Func func(input *e.ApproveCancelUnitDto) error + Func func(input *e.ApproveCancelSpecialistDto) error +} + +type createWithPatientMw struct { + Name string + Func func(input *e.Encounter) error } type UpdateMw = updateMw @@ -91,6 +96,8 @@ var deletePostMw []readDetailMw var checkinEncounterMw checkinMw var checkoutEncounter checkoutMw var updatestatusEncounter []updateStatusMw -var requestSwitchEncounter requestSwitchUnitMw -var approveSwitchEncounter approveSwitchUnitMw -var cancelSwitchEncounter cancelSwitchUnitMw +var requestSwitchEncounter requestSwitchSpecialistMw +var approveSwitchEncounter approveSwitchSpecialistMw +var cancelSwitchEncounter cancelSwitchSpecialistMw +var createWithPatientPreMw []createWithPatientMw +var createWithPatientPostMw []createWithPatientMw diff --git a/internal/use-case/main-use-case/generate-file/case.go b/internal/use-case/main-use-case/generate-file/case.go index 7c657640..b5103746 100644 --- a/internal/use-case/main-use-case/generate-file/case.go +++ b/internal/use-case/main-use-case/generate-file/case.go @@ -51,6 +51,12 @@ func Generate(input GenerateDto) (*d.Data, error) { return err } + // screening + case ere.DTCScreening: + response, err = generateScreening(input, event, tx) + if err != nil { + return err + } default: return errors.New("invalid type code") } diff --git a/internal/use-case/main-use-case/generate-file/helper.go b/internal/use-case/main-use-case/generate-file/helper.go index 6edd34d8..adcdc16d 100644 --- a/internal/use-case/main-use-case/generate-file/helper.go +++ b/internal/use-case/main-use-case/generate-file/helper.go @@ -13,13 +13,16 @@ import ( ee "simrs-vx/internal/domain/main-entities/encounter" egc "simrs-vx/internal/domain/main-entities/general-consent" er "simrs-vx/internal/domain/main-entities/resume" + es "simrs-vx/internal/domain/main-entities/screening" uvs "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep" uvscl "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-control-letter" ue "simrs-vx/internal/use-case/main-use-case/encounter" ugc "simrs-vx/internal/use-case/main-use-case/general-consent" ur "simrs-vx/internal/use-case/main-use-case/resume" + us "simrs-vx/internal/use-case/main-use-case/screening" + ercl "simrs-vx/internal/domain/references/clinical" erc "simrs-vx/internal/domain/references/common" docscfg "simrs-vx/internal/infra/docs-cfg" @@ -180,9 +183,9 @@ func generateCL(input GenerateDto, event pl.Event, tx *gorm.DB) (*ResponseDto, e } // map template data - clData := VclaimControlLetter{} - if input.Data != nil { - err := json.Unmarshal([]byte(*input.Data), &clData) + clData := evscl.ResponseForPDF{} + if cl.Value != nil { + err := json.Unmarshal([]byte(*cl.Value), &clData) if err != nil { event.ErrInfo = pl.ErrorInfo{ Code: "data-unmarshal-fail", @@ -192,22 +195,11 @@ func generateCL(input GenerateDto, event pl.Event, tx *gorm.DB) (*ResponseDto, e return nil, err } } else { - return nil, errors.New("there is no data to be used") + return nil, errors.New("there is no value to be used") } - if cl == nil { - createCL := evscl.CreateDto{ - VclaimSep_Number: &clData.VclaimSep.Number, - Number: &clData.Number, - Value: input.Data, - } - if cl, err = uvscl.CreateData(createCL, &event, tx); err != nil { - return nil, err - } - - } // get encounter id by vclaim sep number - vs, err := uvs.ReadDetailData(evs.ReadDetailDto{Number: &clData.VclaimSep.Number}, &event) + vs, err := uvs.ReadDetailData(evs.ReadDetailDto{Number: cl.VclaimSep_Number}, &event) if err != nil { return nil, err } @@ -217,7 +209,7 @@ func generateCL(input GenerateDto, event pl.Event, tx *gorm.DB) (*ResponseDto, e input.Encounter_Id = vs.Encounter_Id input.UseA5Lanscape = true - templateData := clData.generateTemplateData() + templateData := generateTemplateData(clData) // generate file urlPub, err := generateFile(input, templateData) if err != nil { @@ -339,3 +331,131 @@ func generateResumeTemplateData(resume er.Resume, event pl.Event, tx *gorm.DB) ( return &templateData, nil } + +func generateScreeningTemplateData(screenings []es.Screening, event pl.Event, tx *gorm.DB) (*ScreeningPDF, error) { + // get encounter + includes := "Patient,Patient.Person" + encounter, err := ue.ReadDetailData(ee.ReadDetailDto{Id: *screenings[0].Encounter_Id, Includes: includes}, &event) + if err != nil { + return nil, err + } + + switch screenings[0].Type { + case ercl.SFTCA: + // map template data + sData := es.FormA{} + if screenings[0].Value != nil { + err := json.Unmarshal([]byte(*screenings[0].Value), &sData) + if err != nil { + event.ErrInfo = pl.ErrorInfo{ + Code: "data-unmarshal-fail", + Detail: err.Error(), + Raw: err, + } + return nil, err + } + } else { + return nil, errors.New("there is no data to be used") + } + + templateData := ScreeningPDF{} + templateData.IssuedDate = pu.GetTimeNow().Format("2006-01-02 15:04:05") + templateData.MedicalRecord = *encounter.Patient.Number + templateData.Name = encounter.Patient.Person.FullName() + templateData.BirthDate = encounter.Patient.Person.BirthDate.Format("2006-01-02 15:04:05") + templateData.Employee_Name = screenings[0].Employee.Person.FullName() + templateData.EarlyMedic = sData.Screening.SelectedScreeningLabels() + templateData.Assessment = sData.AssessmentDetail + templateData.ProblemIdentification = sData.ProblemIdentification.SelectedProblemLabels() + templateData.Planning = sData.PlanningDetail + templateData.Date = screenings[0].CreatedAt.Format("2006-01-02 15:04:05") + + return &templateData, nil + case ercl.SFTCB: + // map template data + templateData := ScreeningPDF{} + templateData.IssuedDate = pu.GetTimeNow().Format("2006-01-02 15:04:05") + templateData.MedicalRecord = *encounter.Patient.Number + templateData.Name = encounter.Patient.Person.FullName() + templateData.BirthDate = encounter.Patient.Person.BirthDate.Format("2006-01-02 15:04:05") + for k, v := range screenings { + templateData.FormB = append(templateData.FormB, ScreeningFormBPDF{ + Number: k + 1, + Date: v.CreatedAt.Format("2006-01-02 15:04:05"), + Employee_Name: v.Employee.Person.FullName(), + Value: *v.Value, + }) + } + + return &templateData, nil + } + return nil, errors.New("invalid screening type") +} + +func generateScreening(input GenerateDto, event pl.Event, tx *gorm.DB) (*ResponseDto, error) { + // get value from resume by ref_id + includes := "Employee.Person" + s, err := us.ReadDetailData(es.ReadDetailDto{Id: uint(*pc.StringToUint64(*input.Ref_Id)), Includes: includes}, &event) + if err != nil { + return nil, err + } + + var screenings []es.Screening + var templateData *ScreeningPDF + if s.IsFormA() { + if s.FileUrl != nil { + if err := removeFile(string(input.EntityType_Code), *s.FileUrl); err != nil { + return nil, err + } + } + screenings = append(screenings, *s) + input.FormatType = erc.DFTCPDF + input.TemplateName = TDNSA + input.Encounter_Id = s.Encounter_Id + templateData, err = generateScreeningTemplateData(screenings, event, tx) + if err != nil { + return nil, err + } + } else { + includes := "Employee.Person" + sort := "CreatedAt:ASC" + ss, _, err := us.ReadListData(es.ReadListDto{FilterDto: es.FilterDto{Encounter_Id: s.Encounter_Id, Type: ercl.SFTCB}, Includes: includes, Sort: sort}, &event, tx) + if err != nil { + return nil, err + } + screenings = append(screenings, ss...) + input.FormatType = erc.DFTCPDF + input.TemplateName = TDNSB + input.Encounter_Id = s.Encounter_Id + templateData, err = generateScreeningTemplateData(screenings, event, tx) + if err != nil { + return nil, err + } + } + + // generate file + urlPub, err := generateFile(input, templateData) + if err != nil { + return nil, err + } + + if len(screenings) > 1 { + for i := range screenings { + screenings[i].FileUrl = &urlPub + } + if err := tx.Save(&screenings).Error; err != nil { + return nil, err + } + } else { + s.FileUrl = &urlPub + if err := tx.Save(&s).Error; err != nil { + return nil, err + } + } + + response := ResponseDto{ + FileUrl: urlPub, + } + + return &response, nil +} diff --git a/internal/use-case/main-use-case/generate-file/tycovar.go b/internal/use-case/main-use-case/generate-file/tycovar.go index a242f476..fd62787a 100644 --- a/internal/use-case/main-use-case/generate-file/tycovar.go +++ b/internal/use-case/main-use-case/generate-file/tycovar.go @@ -1,15 +1,11 @@ package generatefile import ( - "fmt" - "time" - + evscl "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter" erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" er "simrs-vx/internal/domain/main-entities/resume" - - pu "simrs-vx/pkg/use-case-helper" ) type GeneralConsentPDF struct { @@ -72,6 +68,27 @@ type ResumePDF struct { Date string } +type ScreeningPDF struct { + IssuedDate string + Date string + MedicalRecord string + Name string + BirthDate string + Employee_Name string + EarlyMedic []string + Assessment string + ProblemIdentification []string + Planning string + FormB []ScreeningFormBPDF +} + +type ScreeningFormBPDF struct { + Number int + Date string + Employee_Name string + Value string +} + type GenerateDto struct { EntityType_Code ere.EntityTypeCode `json:"entityType_code" validate:"required"` Ref_Id *string `json:"ref_id" validate:"required"` @@ -84,28 +101,6 @@ type GenerateDto struct { Data *string `json:"data"` } -type VclaimControlLetter struct { - Number string `json:"noSuratKontrol"` - PlannedControlDate string `json:"tglRencanaKontrol"` - Doctor_Name string `json:"namaDokter"` - DstUnit_Name string `json:"namaPoliTujuan"` - ResponsibleDoctor_Name string `json:"namaDokterPembuat"` - VclaimSep VclaimSep `json:"sep"` -} - -type VclaimSep struct { - VclaimMember VclaimMember `json:"peserta"` - Diagnose string `json:"diagnosa"` - Number string `json:"noSep"` -} - -type VclaimMember struct { - CardNumber string `json:"noKartu"` - Name string `json:"nama"` - BirthDate string `json:"tglLahir"` - Gender string `json:"kelamin"` -} - type GeneratePDFdto struct { TemplatePath string TemplateData any @@ -124,39 +119,21 @@ const ( TDNGC TemplateDocsName = "general-consent.html" TDNCL TemplateDocsName = "control-letter.html" TDNR TemplateDocsName = "resume.html" + TDNSA TemplateDocsName = "screening-form-a.html" + TDNSB TemplateDocsName = "screening-form-b.html" ) -func (v VclaimControlLetter) generateTemplateData() ControlLetterPDF { - +func generateTemplateData(v evscl.ResponseForPDF) ControlLetterPDF { return ControlLetterPDF{ Number: v.Number, Doctor_Name: v.Doctor_Name, DstUnit_Name: v.DstUnit_Name, CardNumber: v.VclaimSep.VclaimMember.CardNumber, - Name: v.generateNameWithGender(), - BirthDate: v.generateBirthDate(), + Name: v.GenerateNameWithGender(), + BirthDate: v.GenerateBirthDate(), Diagnose: v.VclaimSep.Diagnose, PlanDate: v.PlannedControlDate, ResponsibleDoctor_Name: v.ResponsibleDoctor_Name, - PrintDate: generatePrintDate(), + PrintDate: v.IssuedDate, } } - -func (v VclaimControlLetter) generateNameWithGender() string { - gender := "Perempuan" - if v.VclaimSep.VclaimMember.Gender == "L" { - gender = "Laki-Laki" - } - - return fmt.Sprintf("%s (%s)", v.VclaimSep.VclaimMember.Name, gender) -} - -func (v VclaimControlLetter) generateBirthDate() string { - t, _ := time.Parse("2006-01-02", v.VclaimSep.VclaimMember.BirthDate) - return pu.FormatIndonesianDate(t) -} - -func generatePrintDate() string { - now := time.Now() - return now.Format("2006/01/02") -} diff --git a/internal/use-case/main-use-case/infra/case.go b/internal/use-case/main-use-case/infra/case.go index 4771f3cb..f3ba3854 100644 --- a/internal/use-case/main-use-case/infra/case.go +++ b/internal/use-case/main-use-case/infra/case.go @@ -37,7 +37,7 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } - if input.InfraGroup_Code == ero.IFGCRoom { + if input.InfraGroup_Code == ero.IFGCProcedureRoom { if input.Parent_Code == nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ @@ -58,9 +58,9 @@ func Create(input e.CreateDto) (*d.Data, error) { data = *resData } - if input.InfraGroup_Code == ero.IFGCRoom { + if input.InfraGroup_Code == ero.IFGCProcedureRoom { input.Infra_Code = &data.Code - if err := createRoom(&input, &event, tx); err != nil { + if err := createProcedureRoom(&input, &event, tx); err != nil { return err } } diff --git a/internal/use-case/main-use-case/infra/helper.go b/internal/use-case/main-use-case/infra/helper.go index 81de5389..82048ebf 100644 --- a/internal/use-case/main-use-case/infra/helper.go +++ b/internal/use-case/main-use-case/infra/helper.go @@ -7,10 +7,10 @@ package infra import ( e "simrs-vx/internal/domain/main-entities/infra" ei "simrs-vx/internal/domain/main-entities/item" - er "simrs-vx/internal/domain/main-entities/room" + er "simrs-vx/internal/domain/main-entities/procedure-room" ero "simrs-vx/internal/domain/references/organization" ui "simrs-vx/internal/use-case/main-use-case/item" - ur "simrs-vx/internal/use-case/main-use-case/room" + ur "simrs-vx/internal/use-case/main-use-case/procedure-room" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -53,10 +53,10 @@ func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { return nil } -func createRoom(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { +func createProcedureRoom(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { roomCreate := er.CreateDto{ + Code: input.Infra_Code, Infra_Code: input.Infra_Code, - Unit_Code: input.Unit_Code, Specialist_Code: input.Specialist_Code, Subspecialist_Code: input.Subspecialist_Code, } diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 5e0592c3..cd97d735 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -129,7 +129,7 @@ func UpdateData(input e.UpdateDto, data *e.Infra, event *pl.Event, dbx ...*gorm. // data.Parent = nil data.Childrens = nil data.Item = nil - data.Rooms = nil + data.ProcedureRooms = nil if err := tx.Save(&data).Error; err != nil { event.Status = "failed" diff --git a/internal/use-case/main-use-case/installation/middleware-runner.go b/internal/use-case/main-use-case/installation/middleware-runner.go index b85e3236..b2ff8cb4 100644 --- a/internal/use-case/main-use-case/installation/middleware-runner.go +++ b/internal/use-case/main-use-case/installation/middleware-runner.go @@ -6,7 +6,7 @@ import ( "gorm.io/gorm" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/installation" esync "simrs-vx/internal/domain/sync-entities/log" diff --git a/internal/use-case/main-use-case/internal-reference/helper.go b/internal/use-case/main-use-case/internal-reference/helper.go index 26b8903f..7ffdf9e4 100644 --- a/internal/use-case/main-use-case/internal-reference/helper.go +++ b/internal/use-case/main-use-case/internal-reference/helper.go @@ -12,7 +12,7 @@ import ( func setDataCreate(input *ir.CreateDto, data *ir.InternalReference) { data.Encounter_Id = input.Encounter_Id - data.Unit_Code = input.Unit_Code + data.Specialist_Code = input.Specialist_Code data.Doctor_Code = input.Doctor_Code data.SrcDoctor_Code = input.SrcDoctor_Code @@ -28,18 +28,18 @@ func setDataUpdate(input *ir.UpdateDto, data *ir.InternalReference) { data.Status_Code = &input.Status_Code } -func setBulkData(input *e.SwitchUnitDto) []ir.InternalReference { +func setBulkData(input *e.SwitchSpecialistDto) []ir.InternalReference { var data []ir.InternalReference for _, v := range *input.InternalReferences { statusCode := erc.DACNew data = append(data, ir.InternalReference{ - Encounter_Id: &input.Id, - Unit_Code: v.Unit_Code, - Doctor_Code: v.Doctor_Code, - Status_Code: &statusCode, - SrcDoctor_Code: input.Src_Doctor_Code, - SrcNurse_Code: input.Src_Nurse_Code, + Encounter_Id: &input.Id, + Specialist_Code: v.Specialist_Code, + Doctor_Code: v.Doctor_Code, + Status_Code: &statusCode, + SrcDoctor_Code: input.Src_Doctor_Code, + SrcNurse_Code: input.Src_Nurse_Code, }) } diff --git a/internal/use-case/main-use-case/internal-reference/lib.go b/internal/use-case/main-use-case/internal-reference/lib.go index 0aa54b4b..eb3ca18f 100644 --- a/internal/use-case/main-use-case/internal-reference/lib.go +++ b/internal/use-case/main-use-case/internal-reference/lib.go @@ -144,7 +144,7 @@ func DeleteData(data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) e return nil } -func CreateBulkData(input *e.SwitchUnitDto, event *pl.Event, dbx ...*gorm.DB) error { +func CreateBulkData(input *e.SwitchSpecialistDto, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "started", "DBCreate") data := setBulkData(input) diff --git a/internal/use-case/main-use-case/item/helper.go b/internal/use-case/main-use-case/item/helper.go index 6f7e0c57..2de4c1bd 100644 --- a/internal/use-case/main-use-case/item/helper.go +++ b/internal/use-case/main-use-case/item/helper.go @@ -23,4 +23,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Item) { data.Uom_Code = inputSrc.Uom_Code data.Infra_Code = inputSrc.Infra_Code data.Stock = inputSrc.Stock + data.BuyingPrice = inputSrc.BuyingPrice + data.SellingPrice = inputSrc.SellingPrice } diff --git a/internal/use-case/main-use-case/item/lib.go b/internal/use-case/main-use-case/item/lib.go index 56c4c915..a58a956b 100644 --- a/internal/use-case/main-use-case/item/lib.go +++ b/internal/use-case/main-use-case/item/lib.go @@ -81,7 +81,15 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } - if err := tx.First(&data, input.Id).Error; err != nil { + if input.Code != nil { + tx = tx.Where("\"Code\" = ?", *input.Code) + } + + if input.Id != nil { + tx = tx.Where("\"Id\" = ?", input.Id) + } + + if err := tx.First(&data).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr } diff --git a/internal/use-case/main-use-case/material-package-item/case.go b/internal/use-case/main-use-case/material-package-item/case.go new file mode 100644 index 00000000..ecd891a6 --- /dev/null +++ b/internal/use-case/main-use-case/material-package-item/case.go @@ -0,0 +1,276 @@ +package materialpackageorder + +import ( + e "simrs-vx/internal/domain/main-entities/material-package-item" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "material" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.MaterialPackageItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.MaterialPackageItem + var dataList []e.MaterialPackageItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.MaterialPackageItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MaterialPackageItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MaterialPackageItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/material-package-item/helper.go b/internal/use-case/main-use-case/material-package-item/helper.go new file mode 100644 index 00000000..c175f776 --- /dev/null +++ b/internal/use-case/main-use-case/material-package-item/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package materialpackageorder + +import ( + e "simrs-vx/internal/domain/main-entities/material-package-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialPackageItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.MaterialPackage_Code = inputSrc.MaterialPackage_Code + data.Material_Code = inputSrc.Material_Code +} diff --git a/internal/use-case/main-use-case/unit-position/lib.go b/internal/use-case/main-use-case/material-package-item/lib.go similarity index 72% rename from internal/use-case/main-use-case/unit-position/lib.go rename to internal/use-case/main-use-case/material-package-item/lib.go index 104357e5..fc469249 100644 --- a/internal/use-case/main-use-case/unit-position/lib.go +++ b/internal/use-case/main-use-case/material-package-item/lib.go @@ -1,8 +1,7 @@ -package unit_position +package materialpackageorder import ( - "errors" - e "simrs-vx/internal/domain/main-entities/unit-position" + e "simrs-vx/internal/domain/main-entities/material-package-item" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" @@ -13,10 +12,10 @@ import ( "gorm.io/gorm" ) -func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.UnitPosition, error) { +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialPackageItem, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := e.UnitPosition{} + data := e.MaterialPackageItem{} setData(&input, &data) var tx *gorm.DB @@ -34,9 +33,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.UnitPos return &data, nil } -func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.UnitPosition, *e.MetaDto, error) { +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.MaterialPackageItem, *e.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.UnitPosition{} + data := []e.MaterialPackageItem{} pagination := gh.Pagination{} count := int64(0) meta := e.MetaDto{} @@ -49,7 +48,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un } tx = tx. - Model(&e.UnitPosition{}). + Model(&e.MaterialPackageItem{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). @@ -57,7 +56,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { + if err == gorm.ErrRecordNotFound { return nil, &meta, nil } return nil, nil, plh.HandleListError(input, event, err) @@ -71,33 +70,18 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un return data, &meta, nil } -func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.UnitPosition, error) { +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialPackageItem, error) { pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.UnitPosition{} + data := e.MaterialPackageItem{} - var tx, getData *gorm.DB + var tx *gorm.DB if len(dbx) > 0 { tx = dbx[0] } else { tx = dg.I } - switch { - case input.Id != nil: - getData = tx.First(&data, input.Id) - case input.Code != nil && *input.Code != "": - getData = tx.Where("\"Code\" = ?", *input.Code).First(&data) - default: - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-read-detail-fail", - Detail: "either Id or Code must be provided", - } - - return nil, pl.SetLogError(event, nil) - } - - if err := getData.Error; err != nil { + if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr } @@ -107,7 +91,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input e.UpdateDto, data *e.UnitPosition, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(input e.UpdateDto, data *e.MaterialPackageItem, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") setData(&input, data) @@ -132,7 +116,7 @@ func UpdateData(input e.UpdateDto, data *e.UnitPosition, event *pl.Event, dbx .. return nil } -func DeleteData(data *e.UnitPosition, event *pl.Event, dbx ...*gorm.DB) error { +func DeleteData(data *e.MaterialPackageItem, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete") var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/material-package-item/middleware-runner.go b/internal/use-case/main-use-case/material-package-item/middleware-runner.go new file mode 100644 index 00000000..09dfb39b --- /dev/null +++ b/internal/use-case/main-use-case/material-package-item/middleware-runner.go @@ -0,0 +1,103 @@ +package materialpackageorder + +import ( + e "simrs-vx/internal/domain/main-entities/material-package-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.MaterialPackageItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.MaterialPackageItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialPackageItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialPackageItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialPackageItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/material-package-item/middleware.go b/internal/use-case/main-use-case/material-package-item/middleware.go new file mode 100644 index 00000000..1d1186af --- /dev/null +++ b/internal/use-case/main-use-case/material-package-item/middleware.go @@ -0,0 +1,9 @@ +package materialpackageorder + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/material-package-item/tycovar.go b/internal/use-case/main-use-case/material-package-item/tycovar.go new file mode 100644 index 00000000..a7e239f1 --- /dev/null +++ b/internal/use-case/main-use-case/material-package-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package materialpackageorder + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/material-package-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.MaterialPackageItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.MaterialPackageItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.MaterialPackageItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/unit-position/case.go b/internal/use-case/main-use-case/material-package/case.go similarity index 85% rename from internal/use-case/main-use-case/unit-position/case.go rename to internal/use-case/main-use-case/material-package/case.go index c472e90c..5e56517b 100644 --- a/internal/use-case/main-use-case/unit-position/case.go +++ b/internal/use-case/main-use-case/material-package/case.go @@ -1,14 +1,9 @@ -package unit_position +package materialpackage import ( - ee "simrs-vx/internal/domain/main-entities/employee" - eu "simrs-vx/internal/domain/main-entities/unit" - e "simrs-vx/internal/domain/main-entities/unit-position" + e "simrs-vx/internal/domain/main-entities/material-package" "strconv" - ue "simrs-vx/internal/use-case/main-use-case/employee" - uu "simrs-vx/internal/use-case/main-use-case/unit" - dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -18,10 +13,10 @@ import ( "gorm.io/gorm" ) -const source = "unit-position" +const source = "material" func Create(input e.CreateDto) (*d.Data, error) { - data := e.UnitPosition{} + data := e.MaterialPackage{} event := pl.Event{ Feature: "Create", @@ -39,10 +34,6 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } - if err := validateForeignKey(input); err != nil { - return err - } - if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -75,8 +66,8 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.UnitPosition - var dataList []e.UnitPosition + var data *e.MaterialPackage + var dataList []e.MaterialPackage var metaList *e.MetaDto var err error @@ -128,7 +119,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { } func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { - var data *e.UnitPosition + var data *e.MaterialPackage var err error event := pl.Event{ @@ -176,7 +167,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { func Update(input e.UpdateDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Code: &input.Code} - var data *e.UnitPosition + var data *e.MaterialPackage var err error event := pl.Event{ @@ -200,10 +191,6 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - if err := validateForeignKey(input.CreateDto); err != nil { - return err - } - if err := UpdateData(input, data, &event, tx); err != nil { return err } @@ -236,7 +223,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { func Delete(input e.DeleteDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Code: input.Code} - var data *e.UnitPosition + var data *e.MaterialPackage var err error event := pl.Event{ @@ -287,16 +274,3 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } - -func validateForeignKey(input e.CreateDto) error { - // validate installation_id - if _, err := uu.ReadDetail(eu.ReadDetailDto{Code: input.Unit_Code}); err != nil { - return err - } - - // validate employee_Id - if _, err := ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Employee_Id)}); err != nil { - return err - } - return nil -} diff --git a/internal/use-case/main-use-case/unit/helper.go b/internal/use-case/main-use-case/material-package/helper.go similarity index 64% rename from internal/use-case/main-use-case/unit/helper.go rename to internal/use-case/main-use-case/material-package/helper.go index 8ee7f7e6..7d8e7a9a 100644 --- a/internal/use-case/main-use-case/unit/helper.go +++ b/internal/use-case/main-use-case/material-package/helper.go @@ -2,13 +2,13 @@ DESCRIPTION: Any functions that are used internally by the use-case */ -package unit +package materialpackage import ( - e "simrs-vx/internal/domain/main-entities/unit" + e "simrs-vx/internal/domain/main-entities/material-package" ) -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Unit) { +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialPackage) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT @@ -17,7 +17,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Unit) { inputSrc = &inputTemp.CreateDto } - data.Installation_Code = inputSrc.Installation_Code data.Code = inputSrc.Code data.Name = inputSrc.Name } diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/material-package/lib.go similarity index 81% rename from internal/use-case/main-use-case/unit/lib.go rename to internal/use-case/main-use-case/material-package/lib.go index 3ec4a10c..d4d6ac50 100644 --- a/internal/use-case/main-use-case/unit/lib.go +++ b/internal/use-case/main-use-case/material-package/lib.go @@ -1,7 +1,7 @@ -package unit +package materialpackage import ( - e "simrs-vx/internal/domain/main-entities/unit" + e "simrs-vx/internal/domain/main-entities/material-package" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" @@ -12,10 +12,10 @@ import ( "gorm.io/gorm" ) -func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Unit, error) { +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialPackage, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := e.Unit{} + data := e.MaterialPackage{} setData(&input, &data) var tx *gorm.DB @@ -33,9 +33,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Unit, e return &data, nil } -func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Unit, *e.MetaDto, error) { +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.MaterialPackage, *e.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.Unit{} + data := []e.MaterialPackage{} pagination := gh.Pagination{} count := int64(0) meta := e.MetaDto{} @@ -48,7 +48,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un } tx = tx. - Model(&e.Unit{}). + Model(&e.MaterialPackage{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). @@ -70,9 +70,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un return data, &meta, nil } -func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Unit, error) { +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialPackage, error) { pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.Unit{} + data := e.MaterialPackage{} var tx *gorm.DB if len(dbx) > 0 { @@ -83,14 +83,11 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e if input.Code != nil { tx = tx.Where("\"Code\" = ?", *input.Code) - } - if input.Id != nil { - tx = tx.Where("\"Id\" = ?", input.Id) + } else { + tx = tx.Where("\"Id\" = ?", *input.Id) } - if err := tx. - Scopes(gh.Preload(input.Includes)). - First(&data).Error; err != nil { + if err := tx.First(&data).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr } @@ -100,7 +97,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input e.UpdateDto, data *e.Unit, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(input e.UpdateDto, data *e.MaterialPackage, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") setData(&input, data) @@ -125,7 +122,7 @@ func UpdateData(input e.UpdateDto, data *e.Unit, event *pl.Event, dbx ...*gorm.D return nil } -func DeleteData(data *e.Unit, event *pl.Event, dbx ...*gorm.DB) error { +func DeleteData(data *e.MaterialPackage, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete") var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/material-package/middleware-runner.go b/internal/use-case/main-use-case/material-package/middleware-runner.go new file mode 100644 index 00000000..b1ea182c --- /dev/null +++ b/internal/use-case/main-use-case/material-package/middleware-runner.go @@ -0,0 +1,103 @@ +package materialpackage + +import ( + e "simrs-vx/internal/domain/main-entities/material-package" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.MaterialPackage) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.MaterialPackage) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialPackage) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialPackage) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialPackage) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/material-package/middleware.go b/internal/use-case/main-use-case/material-package/middleware.go new file mode 100644 index 00000000..85020e68 --- /dev/null +++ b/internal/use-case/main-use-case/material-package/middleware.go @@ -0,0 +1,9 @@ +package materialpackage + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/material-package/tycovar.go b/internal/use-case/main-use-case/material-package/tycovar.go new file mode 100644 index 00000000..67aa3174 --- /dev/null +++ b/internal/use-case/main-use-case/material-package/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package materialpackage + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/material-package" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.MaterialPackage, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.MaterialPackage, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.MaterialPackage, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/mcu-order-item/case.go b/internal/use-case/main-use-case/mcu-order-item/case.go index 9037b771..e04feded 100644 --- a/internal/use-case/main-use-case/mcu-order-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-item/case.go @@ -4,11 +4,7 @@ import ( "errors" "strconv" - e "simrs-vx/internal/domain/main-entities/mcu-order-item" - - umo "simrs-vx/internal/use-case/main-use-case/mcu-order" - - erc "simrs-vx/internal/domain/references/common" + "gorm.io/gorm" dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -16,7 +12,10 @@ import ( pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" - "gorm.io/gorm" + e "simrs-vx/internal/domain/main-entities/mcu-order-item" + erc "simrs-vx/internal/domain/references/common" + + umo "simrs-vx/internal/use-case/main-use-case/mcu-order" ) const source = "mcu-order-item" diff --git a/internal/use-case/main-use-case/nurse/helper.go b/internal/use-case/main-use-case/nurse/helper.go index 49078088..cfdf7eb4 100644 --- a/internal/use-case/main-use-case/nurse/helper.go +++ b/internal/use-case/main-use-case/nurse/helper.go @@ -20,6 +20,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Nurse) { data.Code = inputSrc.Code data.Employee_Id = inputSrc.Employee_Id data.IHS_Number = inputSrc.IHS_Number - data.Unit_Code = inputSrc.Unit_Code + data.Specialist_Code = inputSrc.Specialist_Code data.Infra_Code = inputSrc.Infra_Code } diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 24aa4394..ec518fe4 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -27,7 +27,7 @@ import ( const source = "patient" -func Create(input e.CreateDto) (*d.Data, error) { +func Create(input e.CreateDto, dbx ...*gorm.DB) (*d.Data, error) { data := e.Patient{} event := pl.Event{ @@ -35,16 +35,22 @@ func Create(input e.CreateDto) (*d.Data, error) { Source: source, } + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + // Start log pl.SetLogInfo(&event, input, "started", "create") - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) - // check if user has employee position - if !input.AuthInfo.HasEmployeePosition() { + if !input.AuthInfo.IsReg() && !input.AuthInfo.IsSys() { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "auth-forbidden", - Detail: "user has no employee position", + Detail: "user role is not allowed to create patient, only 'reg' position is allowed", Raw: errors.New("authentication failed"), } return nil, pl.SetLogError(&event, input) @@ -52,7 +58,7 @@ func Create(input e.CreateDto) (*d.Data, error) { input.RegisteredBy_User_Name = &input.AuthInfo.User_Name - err := dg.I.Transaction(func(tx *gorm.DB) error { + err := tx.Transaction(func(tx1 *gorm.DB) error { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { @@ -66,14 +72,14 @@ func Create(input e.CreateDto) (*d.Data, error) { } input.Number = nomr - if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil { + if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx1); err != nil { return err } else { input.Person_Id = person_id } if input.Person.VclaimMember_CardNumber != nil && input.Person.ResidentIdentityNumber != nil { - if err := uvm.CreateOrUpdateData(evm.CreateDto{CardNumber: input.Person.VclaimMember_CardNumber, Person_Id: input.Person_Id}, &event, tx); err != nil { + if err := uvm.CreateOrUpdateData(evm.CreateDto{CardNumber: input.Person.VclaimMember_CardNumber, Person_Id: input.Person_Id}, &event, tx1); err != nil { return err } } @@ -81,38 +87,38 @@ func Create(input e.CreateDto) (*d.Data, error) { for idx := range input.PersonAddresses { input.PersonAddresses[idx].Person_Id = *input.Person_Id } - if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx); err != nil { + if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx1); err != nil { return err } for idx := range input.PersonContacts { input.PersonContacts[idx].Person_Id = *input.Person_Id } - if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx); err != nil { + if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx1); err != nil { return err } for idx := range input.PersonRelatives { input.PersonRelatives[idx].Person_Id = *input.Person_Id } - if err := upr.CreateOrUpdateBatch(input.PersonRelatives, &event, tx); err != nil { + if err := upr.CreateOrUpdateBatch(input.PersonRelatives, &event, tx1); err != nil { return err } for idx := range input.PersonInsurances { input.PersonInsurances[idx].Person_Id = *input.Person_Id } - if err := upi.CreateOrUpdateBatch(input.PersonInsurances, &event, tx); err != nil { + if err := upi.CreateOrUpdateBatch(input.PersonInsurances, &event, tx1); err != nil { return err } - if resData, err := CreateData(input, &event, tx); err != nil { + if resData, err := CreateData(input, &event, tx1); err != nil { return err } else { data = *resData } - dataPatient, err := ReadDetailData(e.ReadDetailDto{Id: uint16(data.Id)}, &event, tx) + dataPatient, err := ReadDetailData(e.ReadDetailDto{Id: uint16(data.Id)}, &event, tx1) if err != nil { return err } @@ -143,7 +149,6 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.Patient var dataList []e.Patient var metaList *e.MetaDto var err error @@ -157,23 +162,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readList") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { - return err - } - if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -208,23 +199,9 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readDetail") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { - return err - } - if data, err = ReadDetailData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -254,7 +231,17 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) + + if !input.AuthInfo.IsReg() && !input.AuthInfo.IsSys() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "user role is not allowed to create patient, only 'reg' position is allowed", + Raw: errors.New("authentication failed"), + } + return nil, pl.SetLogError(&event, input) + } err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -343,7 +330,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index e615c854..e1a5fc42 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -141,7 +141,7 @@ func DeleteData(data *e.Patient, event *pl.Event, dbx ...*gorm.DB) error { tx = dg.I } - if err := tx.Delete(&data).Error; err != nil { + if err := tx.Unscoped().Delete(&data).Error; err != nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-delete-fail", diff --git a/internal/use-case/main-use-case/patient/middleware-runner.go b/internal/use-case/main-use-case/patient/middleware-runner.go index 1ea1623d..0cc10e27 100644 --- a/internal/use-case/main-use-case/patient/middleware-runner.go +++ b/internal/use-case/main-use-case/patient/middleware-runner.go @@ -6,7 +6,7 @@ import ( "gorm.io/gorm" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/patient" esync "simrs-vx/internal/domain/sync-entities/log" @@ -20,10 +20,15 @@ type middlewareRunner struct { } // NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event) *middlewareRunner { +func newMiddlewareRunner(event *pl.Event, syncFromOldSource bool) *middlewareRunner { + activateSync := sync.O.Enable + if syncFromOldSource { + activateSync = false + } + return &middlewareRunner{ Event: event, - SyncOn: sync.O.Enable, + SyncOn: activateSync, } } diff --git a/internal/use-case/main-use-case/person-address/lib.go b/internal/use-case/main-use-case/person-address/lib.go index 94cbfa69..8a07aba6 100644 --- a/internal/use-case/main-use-case/person-address/lib.go +++ b/internal/use-case/main-use-case/person-address/lib.go @@ -2,6 +2,8 @@ package personaddress import ( e "simrs-vx/internal/domain/main-entities/person-address" + "strconv" + "strings" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" @@ -179,10 +181,19 @@ func CreateOrUpdateBatch(input []e.UpdateDto, event *pl.Event, tx ...*gorm.DB) e } setData(&input[idx], &data[idx]) if err := dbx.Create(&data[idx]).Error; err != nil { + errMsg := err.Error() + additionalMessage := "" + // FK error + if strings.Contains(errMsg, "violates foreign key") { + pos := strings.Index(errMsg, "violates foreign key") + additionalMessage = ", " + errMsg[pos:] + } + // Got another errot, put it down below + // .... event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-create-fail", - Detail: "Database insert failed", + Detail: "data insert failed at PersonAddres[" + strconv.Itoa(idx) + "]" + additionalMessage, Raw: err, } return pl.SetLogError(event, input) diff --git a/internal/use-case/main-use-case/practice-schedule/helper.go b/internal/use-case/main-use-case/practice-schedule/helper.go index ba61b691..1fbe4b5d 100644 --- a/internal/use-case/main-use-case/practice-schedule/helper.go +++ b/internal/use-case/main-use-case/practice-schedule/helper.go @@ -18,7 +18,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PracticeSchedule) { } data.Doctor_Code = inputSrc.Doctor_Code - data.Unit_Code = inputSrc.Unit_Code + data.Specialist_Code = inputSrc.Specialist_Code data.Day_Code = inputSrc.Day_Code data.StartTime = inputSrc.StartTime data.EndTime = inputSrc.EndTime diff --git a/internal/use-case/main-use-case/action-report/case.go b/internal/use-case/main-use-case/procedure-report/case.go similarity index 95% rename from internal/use-case/main-use-case/action-report/case.go rename to internal/use-case/main-use-case/procedure-report/case.go index 2ae0f268..e44cfaee 100644 --- a/internal/use-case/main-use-case/action-report/case.go +++ b/internal/use-case/main-use-case/procedure-report/case.go @@ -1,10 +1,10 @@ -package actionreport +package procedurereport import ( "errors" "strconv" - e "simrs-vx/internal/domain/main-entities/action-report" + e "simrs-vx/internal/domain/main-entities/procedure-report" dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -15,10 +15,10 @@ import ( "gorm.io/gorm" ) -const source = "action-report" +const source = "procedure-report" func Create(input e.CreateDto) (*d.Data, error) { - data := e.ActionReport{} + data := e.ProcedureReport{} event := pl.Event{ Feature: "Create", @@ -85,8 +85,8 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.ActionReport - var dataList []e.ActionReport + var data *e.ProcedureReport + var dataList []e.ProcedureReport var metaList *e.MetaDto var err error @@ -138,7 +138,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { } func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { - var data *e.ActionReport + var data *e.ProcedureReport var err error event := pl.Event{ @@ -186,7 +186,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { func Update(input e.UpdateDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} - var data *e.ActionReport + var data *e.ProcedureReport var err error event := pl.Event{ @@ -242,7 +242,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { func Delete(input e.DeleteDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} - var data *e.ActionReport + var data *e.ProcedureReport var err error event := pl.Event{ diff --git a/internal/use-case/main-use-case/procedure-report/helper.go b/internal/use-case/main-use-case/procedure-report/helper.go new file mode 100644 index 00000000..e16711e5 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-report/helper.go @@ -0,0 +1,39 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package procedurereport + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-report" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureReport) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Date = inputSrc.Date + data.Doctor_Code = inputSrc.Doctor_Code + data.Operator_Name = inputSrc.Operator_Name + data.Assistant_Name = inputSrc.Assistant_Name + data.Instrumentor_Name = inputSrc.Instrumentor_Name + data.Anesthesia_Doctor_Code = inputSrc.Anesthesia_Doctor_Code + data.Anesthesia_Nurse_Name = inputSrc.Anesthesia_Nurse_Name + data.Diagnose = inputSrc.Diagnose + data.Nurse_Name = inputSrc.Nurse_Name + data.ProcedureValue = inputSrc.ProcedureValue + data.ExecutionValue = inputSrc.ExecutionValue + data.Type_Code = inputSrc.Type_Code + + //PROPER + // data.Operator_Employe_Id = inputSrc.Operator_Employe_Id + // data.Assistant_Employe_Id = inputSrc.Assistant_Employe_Id + // data.Instrumentor_Employe_Id = inputSrc.Instrumentor_Employe_Id + // data.Nurse_Code = inputSrc.Nurse_Code +} diff --git a/internal/use-case/main-use-case/procedure-report/lib.go b/internal/use-case/main-use-case/procedure-report/lib.go new file mode 100644 index 00000000..0588a944 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-report/lib.go @@ -0,0 +1,140 @@ +package procedurereport + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-report" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureReport, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.ProcedureReport{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ProcedureReport, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.ProcedureReport{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.ProcedureReport{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureReport, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.ProcedureReport{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.ProcedureReport, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func DeleteData(data *e.ProcedureReport, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/procedure-report/middleware-runner.go b/internal/use-case/main-use-case/procedure-report/middleware-runner.go new file mode 100644 index 00000000..c849ef28 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-report/middleware-runner.go @@ -0,0 +1,103 @@ +package procedurereport + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-report" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ProcedureReport) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ProcedureReport) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureReport) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureReport) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureReport) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/procedure-report/middleware.go b/internal/use-case/main-use-case/procedure-report/middleware.go new file mode 100644 index 00000000..157d4e2e --- /dev/null +++ b/internal/use-case/main-use-case/procedure-report/middleware.go @@ -0,0 +1,9 @@ +package procedurereport + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/procedure-report/tycovar.go b/internal/use-case/main-use-case/procedure-report/tycovar.go new file mode 100644 index 00000000..3fb449c3 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-report/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package procedurereport + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/procedure-report" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.ProcedureReport, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.ProcedureReport, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.ProcedureReport, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/procedure-room-order-item/case.go b/internal/use-case/main-use-case/procedure-room-order-item/case.go new file mode 100644 index 00000000..3351c737 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order-item/case.go @@ -0,0 +1,276 @@ +package procedureroomorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room-order-item" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "procedure-room-order-item" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.ProcedureRoomOrderItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.ProcedureRoomOrderItem + var dataList []e.ProcedureRoomOrderItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.ProcedureRoomOrderItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ProcedureRoomOrderItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ProcedureRoomOrderItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/procedure-room-order-item/helper.go b/internal/use-case/main-use-case/procedure-room-order-item/helper.go new file mode 100644 index 00000000..b7ca1a4f --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order-item/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package procedureroomorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room-order-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureRoomOrderItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.ProcedureRoomOrder_Id = inputSrc.ProcedureRoomOrder_Id + data.ProcedureRoom_Code = inputSrc.ProcedureRoom_Code + data.Note = inputSrc.Note +} diff --git a/internal/use-case/main-use-case/procedure-room-order-item/lib.go b/internal/use-case/main-use-case/procedure-room-order-item/lib.go new file mode 100644 index 00000000..d5dd8b05 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order-item/lib.go @@ -0,0 +1,151 @@ +package procedureroomorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room-order-item" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrderItem, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + deletedData := e.ProcedureRoomOrderItem{} + tx.Unscoped(). + Where("\"ProcedureRoomOrder_Id\" = ? AND \"ProcedureRoom_Code\" = ?", input.ProcedureRoomOrder_Id, input.ProcedureRoom_Code). + First(&deletedData) + if deletedData.Id != 0 { + if err := tx.Unscoped().Model(e.ProcedureRoomOrderItem{}).Where("\"Id\" = ?", deletedData.Id).Update("\"DeletedAt\"", nil).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + return &deletedData, nil + } + + data := e.ProcedureRoomOrderItem{} + setData(&input, &data) + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ProcedureRoomOrderItem, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.ProcedureRoomOrderItem{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.ProcedureRoomOrderItem{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrderItem, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.ProcedureRoomOrderItem{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Scopes(gh.Preload(input.Includes)).First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.ProcedureRoomOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func DeleteData(data *e.ProcedureRoomOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/procedure-room-order-item/middleware-runner.go b/internal/use-case/main-use-case/procedure-room-order-item/middleware-runner.go new file mode 100644 index 00000000..f0edfe87 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order-item/middleware-runner.go @@ -0,0 +1,103 @@ +package procedureroomorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room-order-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ProcedureRoomOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ProcedureRoomOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/procedure-room-order-item/middleware.go b/internal/use-case/main-use-case/procedure-room-order-item/middleware.go new file mode 100644 index 00000000..0d6c70f7 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order-item/middleware.go @@ -0,0 +1,9 @@ +package procedureroomorderitem + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/procedure-room-order-item/tycovar.go b/internal/use-case/main-use-case/procedure-room-order-item/tycovar.go new file mode 100644 index 00000000..bcc4bf17 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package procedureroomorderitem + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/procedure-room-order-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.ProcedureRoomOrderItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.ProcedureRoomOrderItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/procedure-room-order/case.go b/internal/use-case/main-use-case/procedure-room-order/case.go new file mode 100644 index 00000000..7e9e1952 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order/case.go @@ -0,0 +1,338 @@ +package procedureroomorder + +import ( + "errors" + "strconv" + + "gorm.io/gorm" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + e "simrs-vx/internal/domain/main-entities/procedure-room-order" + erc "simrs-vx/internal/domain/references/common" +) + +const source = "procedure-room-order" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.ProcedureRoomOrder{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.ProcedureRoomOrder + var dataList []e.ProcedureRoomOrder + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.ProcedureRoomOrder + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ProcedureRoomOrder + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ProcedureRoomOrder + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} + +func Submit(input e.ReadDetailDto) (*d.Data, error) { + var data *e.ProcedureRoomOrder + var err error + + event := pl.Event{ + Feature: "Process", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "process") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + data, err = ReadDetailData(input, &event, tx) + if err != nil { + return err + } + + if data.IsNotNew() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: source + " is not in new state", + Raw: errors.New(source + " is not in new state"), + } + return pl.SetLogError(&event, input) + } + + data.Status_Code = erc.DSCSubmited + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(&event, input) + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "submited", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/procedure-room-order/helper.go b/internal/use-case/main-use-case/procedure-room-order/helper.go new file mode 100644 index 00000000..9f47d54d --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package procedureroomorder + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room-order" + erc "simrs-vx/internal/domain/references/common" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureRoomOrder) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.MaterialPackage_Code = inputSrc.MaterialPackage_Code + data.Status_Code = erc.DSCNew +} diff --git a/internal/use-case/main-use-case/procedure-room-order/lib.go b/internal/use-case/main-use-case/procedure-room-order/lib.go new file mode 100644 index 00000000..50775d7c --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order/lib.go @@ -0,0 +1,140 @@ +package procedureroomorder + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room-order" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrder, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.ProcedureRoomOrder{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ProcedureRoomOrder, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.ProcedureRoomOrder{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.ProcedureRoomOrder{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrder, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.ProcedureRoomOrder{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.ProcedureRoomOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func DeleteData(data *e.ProcedureRoomOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/procedure-room-order/middleware-runner.go b/internal/use-case/main-use-case/procedure-room-order/middleware-runner.go new file mode 100644 index 00000000..0fb20eaf --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order/middleware-runner.go @@ -0,0 +1,103 @@ +package procedureroomorder + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room-order" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ProcedureRoomOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ProcedureRoomOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/procedure-room-order/middleware.go b/internal/use-case/main-use-case/procedure-room-order/middleware.go new file mode 100644 index 00000000..cd9a687d --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order/middleware.go @@ -0,0 +1,9 @@ +package procedureroomorder + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/procedure-room-order/tycovar.go b/internal/use-case/main-use-case/procedure-room-order/tycovar.go new file mode 100644 index 00000000..5113ce03 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room-order/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package procedureroomorder + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/procedure-room-order" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.ProcedureRoomOrder, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.ProcedureRoomOrder, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.ProcedureRoomOrder, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/room/case.go b/internal/use-case/main-use-case/procedure-room/case.go similarity index 95% rename from internal/use-case/main-use-case/room/case.go rename to internal/use-case/main-use-case/procedure-room/case.go index eeb1cce1..0378b759 100644 --- a/internal/use-case/main-use-case/room/case.go +++ b/internal/use-case/main-use-case/procedure-room/case.go @@ -1,7 +1,7 @@ -package room +package procedureroom import ( - e "simrs-vx/internal/domain/main-entities/room" + e "simrs-vx/internal/domain/main-entities/procedure-room" "strconv" dg "github.com/karincake/apem/db-gorm-pg" @@ -16,7 +16,7 @@ import ( const source = "specialist" func Create(input e.CreateDto) (*d.Data, error) { - data := e.Room{} + data := e.ProcedureRoom{} event := pl.Event{ Feature: "Create", @@ -66,8 +66,8 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.Room - var dataList []e.Room + var data *e.ProcedureRoom + var dataList []e.ProcedureRoom var metaList *e.MetaDto var err error @@ -119,7 +119,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { } func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { - var data *e.Room + var data *e.ProcedureRoom var err error event := pl.Event{ @@ -167,7 +167,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { func Update(input e.UpdateDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: uint16(input.Id)} - var data *e.Room + var data *e.ProcedureRoom var err error event := pl.Event{ @@ -223,7 +223,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { func Delete(input e.DeleteDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: uint16(input.Id)} - var data *e.Room + var data *e.ProcedureRoom var err error event := pl.Event{ diff --git a/internal/use-case/main-use-case/room/helper.go b/internal/use-case/main-use-case/procedure-room/helper.go similarity index 68% rename from internal/use-case/main-use-case/room/helper.go rename to internal/use-case/main-use-case/procedure-room/helper.go index 5e97a653..fa16d16b 100644 --- a/internal/use-case/main-use-case/room/helper.go +++ b/internal/use-case/main-use-case/procedure-room/helper.go @@ -2,13 +2,13 @@ DESCRIPTION: Any functions that are used internally by the use-case */ -package room +package procedureroom import ( - e "simrs-vx/internal/domain/main-entities/room" + e "simrs-vx/internal/domain/main-entities/procedure-room" ) -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Room) { +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureRoom) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT @@ -17,8 +17,8 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Room) { inputSrc = &inputTemp.CreateDto } + data.Code = *inputSrc.Infra_Code data.Infra_Code = inputSrc.Infra_Code - data.Unit_Code = inputSrc.Unit_Code data.Specialist_Code = inputSrc.Specialist_Code data.Subspecialist_Code = inputSrc.Subspecialist_Code } diff --git a/internal/use-case/main-use-case/action-report/lib.go b/internal/use-case/main-use-case/procedure-room/lib.go similarity index 84% rename from internal/use-case/main-use-case/action-report/lib.go rename to internal/use-case/main-use-case/procedure-room/lib.go index 5a272cce..f9e46d17 100644 --- a/internal/use-case/main-use-case/action-report/lib.go +++ b/internal/use-case/main-use-case/procedure-room/lib.go @@ -1,7 +1,7 @@ -package actionreport +package procedureroom import ( - e "simrs-vx/internal/domain/main-entities/action-report" + e "simrs-vx/internal/domain/main-entities/procedure-room" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" @@ -12,10 +12,10 @@ import ( "gorm.io/gorm" ) -func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ActionReport, error) { +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoom, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := e.ActionReport{} + data := e.ProcedureRoom{} setData(&input, &data) var tx *gorm.DB @@ -33,9 +33,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ActionR return &data, nil } -func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ActionReport, *e.MetaDto, error) { +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ProcedureRoom, *e.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.ActionReport{} + data := []e.ProcedureRoom{} pagination := gh.Pagination{} count := int64(0) meta := e.MetaDto{} @@ -48,7 +48,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ac } tx = tx. - Model(&e.ActionReport{}). + Model(&e.ProcedureRoom{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). @@ -70,9 +70,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ac return data, &meta, nil } -func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ActionReport, error) { +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoom, error) { pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.ActionReport{} + data := e.ProcedureRoom{} var tx *gorm.DB if len(dbx) > 0 { @@ -91,7 +91,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input e.UpdateDto, data *e.ActionReport, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(input e.UpdateDto, data *e.ProcedureRoom, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") setData(&input, data) @@ -116,7 +116,7 @@ func UpdateData(input e.UpdateDto, data *e.ActionReport, event *pl.Event, dbx .. return nil } -func DeleteData(data *e.ActionReport, event *pl.Event, dbx ...*gorm.DB) error { +func DeleteData(data *e.ProcedureRoom, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete") var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/procedure-room/middleware-runner.go b/internal/use-case/main-use-case/procedure-room/middleware-runner.go new file mode 100644 index 00000000..bc96f5c6 --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room/middleware-runner.go @@ -0,0 +1,103 @@ +package procedureroom + +import ( + e "simrs-vx/internal/domain/main-entities/procedure-room" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ProcedureRoom) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ProcedureRoom) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoom) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoom) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoom) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/unit-position/middleware.go b/internal/use-case/main-use-case/procedure-room/middleware.go similarity index 90% rename from internal/use-case/main-use-case/unit-position/middleware.go rename to internal/use-case/main-use-case/procedure-room/middleware.go index 44c1e396..c30fa7b1 100644 --- a/internal/use-case/main-use-case/unit-position/middleware.go +++ b/internal/use-case/main-use-case/procedure-room/middleware.go @@ -1,4 +1,4 @@ -package unit_position +package procedureroom // example of middleware // func init() { diff --git a/internal/use-case/main-use-case/procedure-room/tycovar.go b/internal/use-case/main-use-case/procedure-room/tycovar.go new file mode 100644 index 00000000..ab9f660b --- /dev/null +++ b/internal/use-case/main-use-case/procedure-room/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package procedureroom + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/procedure-room" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.ProcedureRoom, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.ProcedureRoom, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.ProcedureRoom, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/registrator/case.go b/internal/use-case/main-use-case/registrator/case.go new file mode 100644 index 00000000..64313b97 --- /dev/null +++ b/internal/use-case/main-use-case/registrator/case.go @@ -0,0 +1,276 @@ +package registrator + +import ( + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/registrator" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" +) + +const source = "registrator" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Registrator{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Registrator + var dataList []e.Registrator + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Registrator + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Registrator + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: &input.Id} + var data *e.Registrator + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/unit-position/helper.go b/internal/use-case/main-use-case/registrator/helper.go similarity index 52% rename from internal/use-case/main-use-case/unit-position/helper.go rename to internal/use-case/main-use-case/registrator/helper.go index 827dfcc3..68482b0b 100644 --- a/internal/use-case/main-use-case/unit-position/helper.go +++ b/internal/use-case/main-use-case/registrator/helper.go @@ -2,13 +2,13 @@ DESCRIPTION: Any functions that are used internally by the use-case */ -package unit_position +package registrator import ( - e "simrs-vx/internal/domain/main-entities/unit-position" + e "simrs-vx/internal/domain/main-entities/registrator" ) -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.UnitPosition) { +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Registrator) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT @@ -17,9 +17,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.UnitPosition) { inputSrc = &inputTemp.CreateDto } - data.Unit_Code = inputSrc.Unit_Code - data.Code = inputSrc.Code - data.Name = inputSrc.Name - data.HeadStatus = inputSrc.HeadStatus data.Employee_Id = inputSrc.Employee_Id + data.Installation_Code = inputSrc.Installation_Code } diff --git a/internal/use-case/main-use-case/registrator/lib.go b/internal/use-case/main-use-case/registrator/lib.go new file mode 100644 index 00000000..694f9441 --- /dev/null +++ b/internal/use-case/main-use-case/registrator/lib.go @@ -0,0 +1,179 @@ +package registrator + +import ( + "fmt" + e "simrs-vx/internal/domain/main-entities/registrator" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Registrator, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Registrator{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Registrator, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Registrator{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.Registrator{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Registrator, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Registrator{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if input.Employee_Id != nil { + tx = tx.Where("\"Employee_Id\" = ?", *input.Employee_Id) + } + if input.Id != nil { + tx = tx.Where("\"Id\" = ?", input.Id) + } + fmt.Println(input.Includes) + if err := tx.Scopes(gh.Preload(input.Includes)).First(&data).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Registrator, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func DeleteData(data *e.Registrator, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "DBGetIdByUserId") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + var registrator_id uint + + err := tx.Model(&e.Registrator{}). + Select("\"Doctor\".\"Id\" as registrator_id"). + Joins("JOIN \"Employee\" as e ON e.\"Id\" = \"Doctor\".\"Employee_Id\""). + Where("e.\"User_Id\" = ?", user_id). + Scan(®istrator_id).Error + + if err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, pl.SetLogError(event, user_id) + } + + pl.SetLogInfo(event, nil, "complete") + return ®istrator_id, nil +} diff --git a/internal/use-case/main-use-case/unit-position/middleware-runner.go b/internal/use-case/main-use-case/registrator/middleware-runner.go similarity index 86% rename from internal/use-case/main-use-case/unit-position/middleware-runner.go rename to internal/use-case/main-use-case/registrator/middleware-runner.go index 73092025..e0488ca7 100644 --- a/internal/use-case/main-use-case/unit-position/middleware-runner.go +++ b/internal/use-case/main-use-case/registrator/middleware-runner.go @@ -1,7 +1,7 @@ -package unit_position +package registrator import ( - e "simrs-vx/internal/domain/main-entities/unit-position" + e "simrs-vx/internal/domain/main-entities/registrator" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -23,7 +23,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.UnitPosition) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Registrator) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -38,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e return nil } -func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.UnitPosition) error { +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Registrator) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -53,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu return nil } -func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.UnitPosition) error { +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -68,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.UnitPosition) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -83,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.UnitPosition) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) diff --git a/internal/use-case/main-use-case/action-report/middleware.go b/internal/use-case/main-use-case/registrator/middleware.go similarity index 90% rename from internal/use-case/main-use-case/action-report/middleware.go rename to internal/use-case/main-use-case/registrator/middleware.go index 50254de2..c47ed8e0 100644 --- a/internal/use-case/main-use-case/action-report/middleware.go +++ b/internal/use-case/main-use-case/registrator/middleware.go @@ -1,4 +1,4 @@ -package actionreport +package registrator // example of middleware // func init() { diff --git a/internal/use-case/main-use-case/unit-position/tycovar.go b/internal/use-case/main-use-case/registrator/tycovar.go similarity index 75% rename from internal/use-case/main-use-case/unit-position/tycovar.go rename to internal/use-case/main-use-case/registrator/tycovar.go index 451d6445..565e186f 100644 --- a/internal/use-case/main-use-case/unit-position/tycovar.go +++ b/internal/use-case/main-use-case/registrator/tycovar.go @@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the middleware to separate from main use-case which has the basic CRUD functionality. The purpose of this is to make the code more maintainable. */ -package unit_position +package registrator import ( "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/unit-position" + e "simrs-vx/internal/domain/main-entities/registrator" ) type createMw struct { Name string - Func func(input *e.CreateDto, data *e.UnitPosition, tx *gorm.DB) error + Func func(input *e.CreateDto, data *e.Registrator, tx *gorm.DB) error } type readListMw struct { Name string - Func func(input *e.ReadListDto, data *e.UnitPosition, tx *gorm.DB) error + Func func(input *e.ReadListDto, data *e.Registrator, tx *gorm.DB) error } type readDetailMw struct { Name string - Func func(input *e.ReadDetailDto, data *e.UnitPosition, tx *gorm.DB) error + Func func(input *e.ReadDetailDto, data *e.Registrator, tx *gorm.DB) error } type UpdateMw = readDetailMw diff --git a/internal/use-case/main-use-case/screening/case.go b/internal/use-case/main-use-case/screening/case.go new file mode 100644 index 00000000..f6673450 --- /dev/null +++ b/internal/use-case/main-use-case/screening/case.go @@ -0,0 +1,320 @@ +package screening + +import ( + "errors" + "strconv" + + e "simrs-vx/internal/domain/main-entities/screening" + + erc "simrs-vx/internal/domain/references/clinical" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "screening" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Screening{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if !pu.Contains([]erc.ScreeningFormTypeCode{erc.SFTCB, erc.SFTCA}, input.Type) { + return errors.New("invalid screening form type") + } + + if !input.AuthInfo.IsScreener() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "user position is not allowed", + Raw: errors.New("authentication failed"), + } + return pl.SetLogError(&event, input) + } + + if input.AuthInfo.Employee_Id != nil { + v := uint(*input.AuthInfo.Employee_Id) + input.Employee_Id = &v + } else { + input.Employee_Id = nil + } + + switch input.Type { + case erc.SFTCA: + s, _, err := ReadListData(e.ReadListDto{FilterDto: e.FilterDto{Type: erc.SFTCA}}, &event, tx) + if err != nil { + return err + } + if len(s) > 0 { + return errors.New("screening form type A is already created for this encounter") + } + case erc.SFTCB: + s, _, err := ReadListData(e.ReadListDto{FilterDto: e.FilterDto{Type: erc.SFTCA}}, &event, tx) + if err != nil { + return err + } + if len(s) < 1 { + return errors.New("screening form type A is not created yet, please create it first") + } + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Screening + var dataList []e.Screening + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Screening + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Screening + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Screening + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/screening/helper.go b/internal/use-case/main-use-case/screening/helper.go new file mode 100644 index 00000000..94692281 --- /dev/null +++ b/internal/use-case/main-use-case/screening/helper.go @@ -0,0 +1,26 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package screening + +import ( + e "simrs-vx/internal/domain/main-entities/screening" + erc "simrs-vx/internal/domain/references/common" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Screening) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + data.Status = erc.DVCValidated + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Employee_Id = inputSrc.Employee_Id + data.Type = inputSrc.Type + data.Value = inputSrc.Value +} diff --git a/internal/use-case/main-use-case/screening/lib.go b/internal/use-case/main-use-case/screening/lib.go new file mode 100644 index 00000000..31ed6ee1 --- /dev/null +++ b/internal/use-case/main-use-case/screening/lib.go @@ -0,0 +1,140 @@ +package screening + +import ( + e "simrs-vx/internal/domain/main-entities/screening" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Screening, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Screening{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Screening, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Screening{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.Screening{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Screening, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Screening{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Scopes(gh.Preload(input.Includes)).First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Screening, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func DeleteData(data *e.Screening, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/room/middleware-runner.go b/internal/use-case/main-use-case/screening/middleware-runner.go similarity index 87% rename from internal/use-case/main-use-case/room/middleware-runner.go rename to internal/use-case/main-use-case/screening/middleware-runner.go index eaeb46fd..9eb1b4a2 100644 --- a/internal/use-case/main-use-case/room/middleware-runner.go +++ b/internal/use-case/main-use-case/screening/middleware-runner.go @@ -1,7 +1,7 @@ -package room +package screening import ( - e "simrs-vx/internal/domain/main-entities/room" + e "simrs-vx/internal/domain/main-entities/screening" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -23,7 +23,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Room) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Screening) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -38,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e return nil } -func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Room) error { +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Screening) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -53,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu return nil } -func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Room) error { +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Screening) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -68,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Room) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Screening) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -83,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Room) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Screening) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) diff --git a/internal/use-case/simgos-sync-use-case/new/unit/middleware.go b/internal/use-case/main-use-case/screening/middleware.go similarity index 91% rename from internal/use-case/simgos-sync-use-case/new/unit/middleware.go rename to internal/use-case/main-use-case/screening/middleware.go index bac48f4d..6ec8140c 100644 --- a/internal/use-case/simgos-sync-use-case/new/unit/middleware.go +++ b/internal/use-case/main-use-case/screening/middleware.go @@ -1,4 +1,4 @@ -package unit +package screening // example of middleware // func init() { diff --git a/internal/use-case/main-use-case/room/tycovar.go b/internal/use-case/main-use-case/screening/tycovar.go similarity index 76% rename from internal/use-case/main-use-case/room/tycovar.go rename to internal/use-case/main-use-case/screening/tycovar.go index 789e3f6f..481f3d3e 100644 --- a/internal/use-case/main-use-case/room/tycovar.go +++ b/internal/use-case/main-use-case/screening/tycovar.go @@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the middleware to separate from main use-case which has the basic CRUD functionality. The purpose of this is to make the code more maintainable. */ -package room +package screening import ( "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/room" + e "simrs-vx/internal/domain/main-entities/screening" ) type createMw struct { Name string - Func func(input *e.CreateDto, data *e.Room, tx *gorm.DB) error + Func func(input *e.CreateDto, data *e.Screening, tx *gorm.DB) error } type readListMw struct { Name string - Func func(input *e.ReadListDto, data *e.Room, tx *gorm.DB) error + Func func(input *e.ReadListDto, data *e.Screening, tx *gorm.DB) error } type readDetailMw struct { Name string - Func func(input *e.ReadDetailDto, data *e.Room, tx *gorm.DB) error + Func func(input *e.ReadDetailDto, data *e.Screening, tx *gorm.DB) error } type UpdateMw = readDetailMw diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index 3dc8e195..ebf1c7d8 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -2,6 +2,8 @@ package soapi import ( "errors" + erc "simrs-vx/internal/domain/references/common" + esync "simrs-vx/internal/domain/sync-entities/log" "strconv" e "simrs-vx/internal/domain/main-entities/soapi" @@ -27,53 +29,50 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") + mwRunner := newMiddlewareRunner(&event, input.Sync) + + if !input.AuthInfo.IsDoctor() && !input.AuthInfo.IsNurse() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "user position is not allowed", + Raw: errors.New("authentication failed"), + } + return nil, pl.SetLogError(&event, input) + } err := dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { - return err - } - - if !input.AuthInfo.IsDoctor() && !input.AuthInfo.IsNurse() { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "auth-forbidden", - Detail: "user position is not allowed", - Raw: errors.New("authentication failed"), - } - return pl.SetLogError(&event, input) - } - - if input.AuthInfo.Employee_Id != nil { - v := uint(*input.AuthInfo.Employee_Id) - input.Employee_Id = &v - } else { - input.Employee_Id = nil - } - if resData, err := CreateData(input, &event, tx); err != nil { return err } else { data = *resData } - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + // get detail for sync + soapiData, err := ReadDetailData(e.ReadDetailDto{ + Id: data.Id, + Includes: "Encounter,Employee.User"}, &event, tx) + if err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err = mwRunner.ExecuteIfSyncOn(func() error { + return mwRunner.RunCreateMiddleware(createPreMw, soapiData) + }); err != nil { + return err + } return nil }) - if err != nil { + if err = runLogMiddleware(err, input, erc.CCCreate, mwRunner); err != nil { return nil, err } + pl.SetLogInfo(&event, nil, "complete") + return &d.Data{ Meta: d.II{ "source": source, @@ -85,7 +84,6 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.Soapi var dataList []e.Soapi var metaList *e.MetaDto var err error @@ -99,23 +97,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readList") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { - return err - } - if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -150,23 +134,9 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readDetail") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { - return err - } - if data, err = ReadDetailData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -196,6 +166,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -203,32 +174,35 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { - return err - } - if err := UpdateData(input, data, &event, tx); err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") + // get detail for sync + soapiData, err := ReadDetailData(e.ReadDetailDto{ + Id: data.Id, + Includes: "Encounter,Employee"}, &event) + if err != nil { + return err + } - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err = mwRunner.ExecuteIfSyncOn(func() error { + return mwRunner.RunUpdateMiddleware(updatePreMw, soapiData) + }); err != nil { return err } return nil }) - if err != nil { + if err = runLogMiddleware(err, input, erc.CCUpdate, mwRunner); err != nil { return nil, err } + pl.SetLogInfo(&event, nil, "complete") + return &d.Data{ Meta: d.IS{ "source": source, @@ -252,6 +226,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -259,30 +234,27 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return err } - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { - return err - } - if err := DeleteData(data, &event, tx); err != nil { return err } - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err = mwRunner.ExecuteIfSyncOn(func() error { + return mwRunner.RunDeleteMiddleware(deletePreMw, &input) + }); err != nil { return err } return nil }) - if err != nil { + if err = runLogMiddleware(err, input, erc.CCDelete, mwRunner); err != nil { return nil, err } + pl.SetLogInfo(&event, nil, "complete") + return &d.Data{ Meta: d.IS{ "source": source, @@ -293,3 +265,39 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func runLogMiddleware(err error, input any, method erc.CrudCode, mwRunner *middlewareRunner) error { + var errMsg string + inputLog := esync.SimxLogDto{ + Payload: input, + Method: method, + } + + if err != nil { + // Run log-middleware + errMsg = err.Error() + inputLog.ErrMessage = &errMsg + inputLog.IsSuccess = false + + // create log failed + if errMiddleware := mwRunner.ExecuteIfSyncOn(func() error { + return mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog) + }); errMiddleware != nil { + return errMiddleware + } + + return err + } + + // create log success + inputLog.IsSuccess = true + err = mwRunner.ExecuteIfSyncOn(func() error { + return mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog) + }) + + if err != nil { + return err + } + + return nil +} diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go index ae396270..c42b95d0 100644 --- a/internal/use-case/main-use-case/soapi/helper.go +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -18,7 +18,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Soapi) { } data.Encounter_Id = inputSrc.Encounter_Id - data.Employee_Id = inputSrc.Employee_Id + data.Employee_Id = inputSrc.AuthInfo.Employee_Id data.Time = inputSrc.Time data.TypeCode = inputSrc.TypeCode data.Value = inputSrc.Value diff --git a/internal/use-case/main-use-case/soapi/lib.go b/internal/use-case/main-use-case/soapi/lib.go index 57bb5d23..85e94800 100644 --- a/internal/use-case/main-use-case/soapi/lib.go +++ b/internal/use-case/main-use-case/soapi/lib.go @@ -81,7 +81,9 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } - if err := tx.First(&data, input.Id).Error; err != nil { + if err := tx. + Scopes(gh.Preload(input.Includes)). + First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr } diff --git a/internal/use-case/main-use-case/soapi/middleware-runner.go b/internal/use-case/main-use-case/soapi/middleware-runner.go index a840a33a..fbe18503 100644 --- a/internal/use-case/main-use-case/soapi/middleware-runner.go +++ b/internal/use-case/main-use-case/soapi/middleware-runner.go @@ -2,6 +2,8 @@ package soapi import ( e "simrs-vx/internal/domain/main-entities/soapi" + esync "simrs-vx/internal/domain/sync-entities/log" + sync "simrs-vx/internal/infra/sync-consumer-cfg" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -12,24 +14,45 @@ type middlewareRunner struct { Event *pl.Event Tx *gorm.DB MwType pu.MWType + SyncOn bool } // NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { +func newMiddlewareRunner(event *pl.Event, syncFromOldSource bool) *middlewareRunner { + activateSync := sync.O.Enable + if syncFromOldSource { + activateSync = false + } + return &middlewareRunner{ - Event: event, - Tx: tx, + Event: event, + SyncOn: activateSync, } } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Soapi) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.Soapi) error { for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) + logData := pu.GetLogData(input, nil) pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - if err := middleware.Func(input, data, me.Tx); err != nil { + if err := middleware.Func(input); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunCreateLogMiddleware(middlewares []createLogMw, input *esync.SimxLogDto) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, nil) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input); err != nil { return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) } @@ -68,13 +91,13 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []updateMw, input *e.Soapi) error { for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) + logData := pu.GetLogData(input, nil) pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - if err := middleware.Func(input, data, me.Tx); err != nil { + if err := middleware.Func(input); err != nil { return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) } @@ -83,13 +106,13 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e.DeleteDto) error { for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) + logData := pu.GetLogData(input, nil) pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - if err := middleware.Func(input, data, me.Tx); err != nil { + if err := middleware.Func(input); err != nil { return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) } @@ -101,3 +124,10 @@ func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, inpu func (me *middlewareRunner) setMwType(mwType pu.MWType) { me.MwType = mwType } + +func (me *middlewareRunner) ExecuteIfSyncOn(fn func() error) error { + if !me.SyncOn { + return nil + } + return fn() +} diff --git a/internal/use-case/main-use-case/soapi/middleware.go b/internal/use-case/main-use-case/soapi/middleware.go index f2fecda5..548d27fd 100644 --- a/internal/use-case/main-use-case/soapi/middleware.go +++ b/internal/use-case/main-use-case/soapi/middleware.go @@ -1,9 +1,17 @@ package soapi -// example of middleware -// func init() { -// createPreMw = append(createPreMw, -// CreateMw{Name: "modif-input", Func: pm.ModifInput}, -// CreateMw{Name: "check-data", Func: pm.CheckData}, -// ) -// } +import plugin "simrs-vx/internal/use-case/simgos-sync-plugin/new/soapi" + +func init() { + createPreMw = append(createPreMw, + createMw{Name: "sync-create-soapi", Func: plugin.Create}) + + createSimxLogMw = append(createSimxLogMw, + createLogMw{Name: "create-sync-log", Func: plugin.CreateLog}) + + updatePreMw = append(updatePreMw, + updateMw{Name: "sync-update-soapi", Func: plugin.Update}) + + deletePreMw = append(deletePreMw, + deleteMw{Name: "sync-delete-soapi", Func: plugin.Delete}) +} diff --git a/internal/use-case/main-use-case/soapi/tycovar.go b/internal/use-case/main-use-case/soapi/tycovar.go index 956193a4..aece45a5 100644 --- a/internal/use-case/main-use-case/soapi/tycovar.go +++ b/internal/use-case/main-use-case/soapi/tycovar.go @@ -12,11 +12,27 @@ import ( "gorm.io/gorm" e "simrs-vx/internal/domain/main-entities/soapi" + elog "simrs-vx/internal/domain/sync-entities/log" ) type createMw struct { Name string - Func func(input *e.CreateDto, data *e.Soapi, tx *gorm.DB) error + Func func(input *e.Soapi) error +} + +type createLogMw struct { + Name string + Func func(input *elog.SimxLogDto) error +} + +type updateMw struct { + Name string + Func func(input *e.Soapi) error +} + +type deleteMw struct { + Name string + Func func(input *e.DeleteDto) error } type readListMw struct { @@ -29,8 +45,8 @@ type readDetailMw struct { Func func(input *e.ReadDetailDto, data *e.Soapi, tx *gorm.DB) error } -type UpdateMw = readDetailMw -type DeleteMw = readDetailMw +type UpdateMw = updateMw +type DeleteMw = deleteMw var createPreMw []createMw // preprocess middleware var createPostMw []createMw // postprocess middleware @@ -38,7 +54,8 @@ var readListPreMw []readListMw // .. var readListPostMw []readListMw // .. var readDetailPreMw []readDetailMw var readDetailPostMw []readDetailMw -var updatePreMw []readDetailMw +var updatePreMw []updateMw var updatePostMw []readDetailMw -var deletePreMw []readDetailMw +var deletePreMw []deleteMw var deletePostMw []readDetailMw +var createSimxLogMw []createLogMw diff --git a/internal/use-case/main-use-case/specialist/helper.go b/internal/use-case/main-use-case/specialist/helper.go index 5c59b1cf..8a71d2cb 100644 --- a/internal/use-case/main-use-case/specialist/helper.go +++ b/internal/use-case/main-use-case/specialist/helper.go @@ -19,5 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) { data.Code = inputSrc.Code data.Name = inputSrc.Name - data.Unit_Code = inputSrc.Unit_Code + data.Installation_Code = inputSrc.Installation_Code } diff --git a/internal/use-case/main-use-case/specialist/middleware-runner.go b/internal/use-case/main-use-case/specialist/middleware-runner.go index 9a10d624..e2799b61 100644 --- a/internal/use-case/main-use-case/specialist/middleware-runner.go +++ b/internal/use-case/main-use-case/specialist/middleware-runner.go @@ -6,7 +6,7 @@ import ( "gorm.io/gorm" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/specialist" esync "simrs-vx/internal/domain/sync-entities/log" diff --git a/internal/use-case/main-use-case/subspecialist/middleware-runner.go b/internal/use-case/main-use-case/subspecialist/middleware-runner.go index ad1eba08..3e5c0dce 100644 --- a/internal/use-case/main-use-case/subspecialist/middleware-runner.go +++ b/internal/use-case/main-use-case/subspecialist/middleware-runner.go @@ -6,7 +6,7 @@ import ( "gorm.io/gorm" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/subspecialist" esync "simrs-vx/internal/domain/sync-entities/log" diff --git a/internal/use-case/main-use-case/unit/middleware-runner.go b/internal/use-case/main-use-case/unit/middleware-runner.go deleted file mode 100644 index 979548bc..00000000 --- a/internal/use-case/main-use-case/unit/middleware-runner.go +++ /dev/null @@ -1,148 +0,0 @@ -package unit - -import ( - pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - - "gorm.io/gorm" - - sync "simrs-vx/internal/infra/sync-cfg" - - e "simrs-vx/internal/domain/main-entities/unit" - esync "simrs-vx/internal/domain/sync-entities/log" -) - -type middlewareRunner struct { - Event *pl.Event - Tx *gorm.DB - MwType pu.MWType - SyncOn bool -} - -// NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event) *middlewareRunner { - return &middlewareRunner{ - Event: event, - SyncOn: sync.O.Enable, - } -} - -// ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); err != nil { - return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) - } - - pl.SetLogInfo(me.Event, nil, "complete") - } - return nil -} - -// ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateLogMiddleware(middlewares []createLogMw, input *esync.SimxLogDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); err != nil { - return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) - } - - pl.SetLogInfo(me.Event, nil, "complete") - } - return nil -} - -func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Unit) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input, data, me.Tx); err != nil { - return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) - } - - pl.SetLogInfo(me.Event, nil, "complete") - } - return nil -} - -func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input, data, me.Tx); err != nil { - return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) - } - - pl.SetLogInfo(me.Event, nil, "complete") - } - return nil -} - -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []updateMw, input *e.UpdateDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); err != nil { - return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) - } - - pl.SetLogInfo(me.Event, nil, "complete") - } - return nil -} - -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e.DeleteDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); err != nil { - return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) - } - - pl.SetLogInfo(me.Event, nil, "complete") - } - return nil -} - -func (me *middlewareRunner) setMwType(mwType pu.MWType) { - me.MwType = mwType -} diff --git a/internal/use-case/main-use-case/unit/middleware.go b/internal/use-case/main-use-case/unit/middleware.go deleted file mode 100644 index 03ef2c19..00000000 --- a/internal/use-case/main-use-case/unit/middleware.go +++ /dev/null @@ -1,20 +0,0 @@ -package unit - -import ( - plugin "simrs-vx/internal/use-case/simgos-sync-plugin/new/unit" -) - -// example of middleware -func init() { - createPreMw = append(createPreMw, - createMw{Name: "sync-create-unit", Func: plugin.Create}) - - createSimxLogMw = append(createSimxLogMw, - createLogMw{Name: "create-sync-log", Func: plugin.CreateLog}) - - updatePreMw = append(updatePreMw, - updateMw{Name: "sync-update-unit", Func: plugin.Update}) - - deletePreMw = append(deletePreMw, - deleteMw{Name: "sync-delete-unit", Func: plugin.Delete}) -} diff --git a/internal/use-case/main-use-case/unit/tycovar.go b/internal/use-case/main-use-case/unit/tycovar.go deleted file mode 100644 index bf717333..00000000 --- a/internal/use-case/main-use-case/unit/tycovar.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -DESCRIPTION: -A sample, part of the package that contains type, constants, and/or variables. - -In this sample it also provides type and variable regarding the needs of the -middleware to separate from main use-case which has the basic CRUD -functionality. The purpose of this is to make the code more maintainable. -*/ -package unit - -import ( - "gorm.io/gorm" - - e "simrs-vx/internal/domain/main-entities/unit" - elog "simrs-vx/internal/domain/sync-entities/log" -) - -type createMw struct { - Name string - Func func(input *e.CreateDto) error -} - -type createLogMw struct { - Name string - Func func(input *elog.SimxLogDto) error -} - -type updateMw struct { - Name string - Func func(input *e.UpdateDto) error -} - -type deleteMw struct { - Name string - Func func(input *e.DeleteDto) error -} - -type readListMw struct { - Name string - Func func(input *e.ReadListDto, data *e.Unit, tx *gorm.DB) error -} - -type readDetailMw struct { - Name string - Func func(input *e.ReadDetailDto, data *e.Unit, tx *gorm.DB) error -} - -type UpdateMw = updateMw -type DeleteMw = deleteMw - -var createPreMw []createMw // preprocess middleware -var createPostMw []createMw // postprocess middleware -var createSimxLogMw []createLogMw -var readListPreMw []readListMw // .. -var readListPostMw []readListMw // .. -var readDetailPreMw []readDetailMw -var readDetailPostMw []readDetailMw -var updatePreMw []updateMw -var updatePostMw []readDetailMw -var deletePreMw []deleteMw -var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index 50b676af..e50aa156 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -13,6 +13,7 @@ import ( en "simrs-vx/internal/domain/main-entities/nurse" et "simrs-vx/internal/domain/main-entities/nutritionist" ep "simrs-vx/internal/domain/main-entities/pharmacist" + er "simrs-vx/internal/domain/main-entities/registrator" esi "simrs-vx/internal/domain/main-entities/specialist-intern" e "simrs-vx/internal/domain/main-entities/user" @@ -26,6 +27,7 @@ import ( upa "simrs-vx/internal/use-case/main-use-case/person-address" upc "simrs-vx/internal/use-case/main-use-case/person-contact" up "simrs-vx/internal/use-case/main-use-case/pharmacist" + ur "simrs-vx/internal/use-case/main-use-case/registrator" usi "simrs-vx/internal/use-case/main-use-case/specialist-intern" erc "simrs-vx/internal/domain/references/common" @@ -112,7 +114,6 @@ func Create(input e.CreateDto) (*d.Data, error) { Employee_Id: &employeeData.Id, IHS_Number: input.IHS_Number, SIP_Number: input.SIP_Number, - Unit_Code: input.Unit_Code, Specialist_Code: input.Specialist_Code, Subspecialist_Code: input.Subspecialist_Code, } @@ -121,11 +122,11 @@ func Create(input e.CreateDto) (*d.Data, error) { } case ero.EPCNur: createNurse := en.CreateDto{ - Code: input.Code, - Employee_Id: &employeeData.Id, - IHS_Number: input.IHS_Number, - Unit_Code: input.Unit_Code, - Infra_Code: input.Infra_Code, + Code: input.Code, + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + Specialist_Code: input.Specialist_Code, + Infra_Code: input.Infra_Code, } if _, err := un.CreateData(createNurse, &event, tx); err != nil { return err @@ -166,8 +167,19 @@ func Create(input e.CreateDto) (*d.Data, error) { if _, err := umw.CreateData(createMidWife, &event, tx); err != nil { return err } - case ero.EPCReg: - // do nothing + case ero.EPCReg, ero.EPCScr: + var instalationCode string + if input.Installation_Code != nil { + instalationCode = *input.Installation_Code + } + + createSub := er.CreateDto{ + Employee_Id: employeeData.Id, + Installation_Code: instalationCode, + } + if _, err := ur.CreateData(createSub, &event, tx); err != nil { + return err + } default: return errors.New("invalid employee position") } @@ -423,11 +435,11 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } createNur := en.CreateDto{ - Code: input.Code, - Employee_Id: &employeeData.Id, - IHS_Number: input.IHS_Number, - Unit_Code: input.Unit_Code, - Infra_Code: input.Infra_Code, + Code: input.Code, + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + Specialist_Code: input.Specialist_Code, + Infra_Code: input.Infra_Code, } if readNurData != nil { if err := un.UpdateData(en.UpdateDto{CreateDto: createNur}, readNurData, &event, tx); err != nil { @@ -523,6 +535,8 @@ func Update(input e.UpdateDto) (*d.Data, error) { if _, err := umw.CreateData(createMidWife, &event, tx); err != nil { return err } + case ero.EPCReg, ero.EPCScr: + // do nothing default: return errors.New("invalid employee position") } diff --git a/internal/use-case/simgos-sync-plugin/new/division/plugin.go b/internal/use-case/simgos-sync-plugin/new/division/plugin.go index 54c1403c..f4d6a34b 100644 --- a/internal/use-case/simgos-sync-plugin/new/division/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/division/plugin.go @@ -1,167 +1,37 @@ package division import ( - "bytes" - "encoding/json" "fmt" - "io" - "net/http" + helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/division" elog "simrs-vx/internal/domain/sync-entities/log" - - d "github.com/karincake/dodol" ) func Create(input *e.CreateDto) error { - endpoint := getPrefixEndpoint() - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", getPrefixEndpoint()) } func CreateLog(input *elog.SimxLogDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := prefixEndpoint + "/log" - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", endpoint) } func Update(input *e.UpdateDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("PATCH", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "PATCH", endpoint) } func Delete(input *e.DeleteDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("DELETE", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "DELETE", endpoint) } func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/division", sync.O.Host, sync.O.Prefix) + return fmt.Sprintf("%s%s/v1/division", sync.O.TargetHost, sync.O.Prefix) } diff --git a/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go b/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go index a6334fdb..69e79b77 100644 --- a/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go @@ -2,7 +2,7 @@ package encounter import ( "fmt" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" e "simrs-vx/internal/domain/main-entities/encounter" @@ -49,24 +49,24 @@ func UpdateStatus(input *e.Encounter) error { return helper.DoJsonRequest(input, "PATCH", endpoint) } -func RequestSwitchUnit(input *e.Encounter) error { +func RequestSwitchSpecialist(input *e.Encounter) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v/req-switch-unit", prefixEndpoint, input.Id) return helper.DoJsonRequest(input, "PATCH", endpoint) } -func ApproveSwitchUnit(input *e.ApproveCancelUnitDto) error { +func ApproveSwitchSpecialist(input *e.ApproveCancelSpecialistDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v/approve-switch-unit", prefixEndpoint, input.Id) return helper.DoJsonRequest(input, "PATCH", endpoint) } -func CancelSwitchUnit(input *e.ApproveCancelUnitDto) error { +func CancelSwitchSpecialist(input *e.ApproveCancelSpecialistDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v/cancel-switch-unit", prefixEndpoint, input.Id) return helper.DoJsonRequest(input, "PATCH", endpoint) } func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/encounter", sync.O.Host, sync.O.Prefix) + return fmt.Sprintf("%s%s/v1/encounter", sync.O.TargetHost, sync.O.Prefix) } diff --git a/internal/use-case/simgos-sync-plugin/new/installation/plugin.go b/internal/use-case/simgos-sync-plugin/new/installation/plugin.go index f2495139..40f0c153 100644 --- a/internal/use-case/simgos-sync-plugin/new/installation/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/installation/plugin.go @@ -1,167 +1,37 @@ package installation import ( - "bytes" - "encoding/json" "fmt" - "io" - "net/http" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" + helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" e "simrs-vx/internal/domain/main-entities/installation" elog "simrs-vx/internal/domain/sync-entities/log" - - d "github.com/karincake/dodol" ) func Create(input *e.CreateDto) error { - endpoint := getPrefixEndpoint() - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", getPrefixEndpoint()) } func CreateLog(input *elog.SimxLogDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := prefixEndpoint + "/log" - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", endpoint) } func Update(input *e.UpdateDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("PATCH", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "PATCH", endpoint) } func Delete(input *e.DeleteDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("DELETE", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "DELETE", endpoint) } func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/installation", sync.O.Host, sync.O.Prefix) + return fmt.Sprintf("%s%s/v1/installation", sync.O.TargetHost, sync.O.Prefix) } diff --git a/internal/use-case/simgos-sync-plugin/new/patient/plugin.go b/internal/use-case/simgos-sync-plugin/new/patient/plugin.go index 309e1d18..7678da47 100644 --- a/internal/use-case/simgos-sync-plugin/new/patient/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/patient/plugin.go @@ -1,165 +1,40 @@ package patient import ( - "bytes" "encoding/json" "fmt" "io" "net/http" + helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" d "github.com/karincake/dodol" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/patient" elog "simrs-vx/internal/domain/sync-entities/log" ) func Create(input *e.Patient) error { - endpoint := getPrefixEndpoint() - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", getPrefixEndpoint()) } func CreateLog(input *elog.SimxLogDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := prefixEndpoint + "/log" - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", endpoint) } func Update(input *e.Patient) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("PATCH", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "PATCH", endpoint) } func Delete(input *e.DeleteDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("DELETE", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "DELETE", endpoint) } func GenerateNomrPatient() (*string, error) { @@ -203,5 +78,5 @@ func GenerateNomrPatient() (*string, error) { } func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/patient", sync.O.Host, sync.O.Prefix) + return fmt.Sprintf("%s%s/v1/patient", sync.O.TargetHost, sync.O.Prefix) } diff --git a/internal/use-case/simgos-sync-plugin/new/soapi/plugin.go b/internal/use-case/simgos-sync-plugin/new/soapi/plugin.go new file mode 100644 index 00000000..20fabfac --- /dev/null +++ b/internal/use-case/simgos-sync-plugin/new/soapi/plugin.go @@ -0,0 +1,36 @@ +package soapi + +import ( + "fmt" + sync "simrs-vx/internal/infra/sync-consumer-cfg" + helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" + + e "simrs-vx/internal/domain/main-entities/soapi" + elog "simrs-vx/internal/domain/sync-entities/log" +) + +func Create(input *e.Soapi) error { + return helper.DoJsonRequest(input, "POST", getPrefixEndpoint()) +} + +func CreateLog(input *elog.SimxLogDto) error { + prefixEndpoint := getPrefixEndpoint() + endpoint := prefixEndpoint + "/log" + return helper.DoJsonRequest(input, "POST", endpoint) +} + +func Update(input *e.Soapi) error { + prefixEndpoint := getPrefixEndpoint() + endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, input.Id) + return helper.DoJsonRequest(input, "PATCH", endpoint) +} + +func Delete(input *e.DeleteDto) error { + prefixEndpoint := getPrefixEndpoint() + endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, input.Id) + return helper.DoJsonRequest(input, "DELETE", endpoint) +} + +func getPrefixEndpoint() string { + return fmt.Sprintf("%s%s/v1/soapi", sync.O.TargetHost, sync.O.Prefix) +} diff --git a/internal/use-case/simgos-sync-plugin/new/specialist/plugin.go b/internal/use-case/simgos-sync-plugin/new/specialist/plugin.go index 892d7a17..29da9d0a 100644 --- a/internal/use-case/simgos-sync-plugin/new/specialist/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/specialist/plugin.go @@ -1,167 +1,37 @@ package specialist import ( - "bytes" - "encoding/json" "fmt" - "io" - "net/http" + helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/specialist" elog "simrs-vx/internal/domain/sync-entities/log" - - d "github.com/karincake/dodol" ) func Create(input *e.CreateDto) error { - endpoint := getPrefixEndpoint() - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", getPrefixEndpoint()) } func CreateLog(input *elog.SimxLogDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := prefixEndpoint + "/log" - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", endpoint) } func Update(input *e.UpdateDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("PATCH", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "PATCH", endpoint) } func Delete(input *e.DeleteDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("DELETE", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "DELETE", endpoint) } func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/specialist", sync.O.Host, sync.O.Prefix) + return fmt.Sprintf("%s%s/v1/specialist", sync.O.TargetHost, sync.O.Prefix) } diff --git a/internal/use-case/simgos-sync-plugin/new/subspecialist/plugin.go b/internal/use-case/simgos-sync-plugin/new/subspecialist/plugin.go index 15d6f650..0167936c 100644 --- a/internal/use-case/simgos-sync-plugin/new/subspecialist/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/subspecialist/plugin.go @@ -1,167 +1,37 @@ package subspecialist import ( - "bytes" - "encoding/json" "fmt" - "io" - "net/http" + helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" - sync "simrs-vx/internal/infra/sync-cfg" + sync "simrs-vx/internal/infra/sync-consumer-cfg" e "simrs-vx/internal/domain/main-entities/subspecialist" elog "simrs-vx/internal/domain/sync-entities/log" - - d "github.com/karincake/dodol" ) func Create(input *e.CreateDto) error { - endpoint := getPrefixEndpoint() - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", getPrefixEndpoint()) } func CreateLog(input *elog.SimxLogDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := prefixEndpoint + "/log" - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "POST", endpoint) } func Update(input *e.UpdateDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("PATCH", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "PATCH", endpoint) } func Delete(input *e.DeleteDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("DELETE", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil + return helper.DoJsonRequest(input, "DELETE", endpoint) } func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/subspecialist", sync.O.Host, sync.O.Prefix) + return fmt.Sprintf("%s%s/v1/subspecialist", sync.O.TargetHost, sync.O.Prefix) } diff --git a/internal/use-case/simgos-sync-plugin/new/unit/plugin.go b/internal/use-case/simgos-sync-plugin/new/unit/plugin.go deleted file mode 100644 index e854d898..00000000 --- a/internal/use-case/simgos-sync-plugin/new/unit/plugin.go +++ /dev/null @@ -1,167 +0,0 @@ -package unit - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - - sync "simrs-vx/internal/infra/sync-cfg" - - e "simrs-vx/internal/domain/main-entities/unit" - elog "simrs-vx/internal/domain/sync-entities/log" - - d "github.com/karincake/dodol" -) - -func Create(input *e.CreateDto) error { - endpoint := getPrefixEndpoint() - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil -} - -func CreateLog(input *elog.SimxLogDto) error { - prefixEndpoint := getPrefixEndpoint() - endpoint := prefixEndpoint + "/log" - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil -} - -func Update(input *e.UpdateDto) error { - prefixEndpoint := getPrefixEndpoint() - endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("PATCH", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil -} - -func Delete(input *e.DeleteDto) error { - prefixEndpoint := getPrefixEndpoint() - endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - - jsonData, err := json.Marshal(input) - if err != nil { - return fmt.Errorf("failed to encode JSON: %w", err) - } - - req, err := http.NewRequest("DELETE", endpoint, bytes.NewReader(jsonData)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - errors := d.FieldError{} - _ = json.Unmarshal(bodyBytes, &errors) - - return fmt.Errorf(errors.Message) - } - - return nil -} - -func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/unit", sync.O.Host, sync.O.Prefix) -} diff --git a/internal/use-case/simgos-sync-plugin/old/.keep b/internal/use-case/simgos-sync-plugin/old/.keep new file mode 100644 index 00000000..e69de29b diff --git a/internal/use-case/simgos-sync-use-case/new/doctor/case.go b/internal/use-case/simgos-sync-use-case/new/doctor/case.go new file mode 100644 index 00000000..d9b1aa9f --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/doctor/case.go @@ -0,0 +1,48 @@ +package doctor + +import ( + pl "simrs-vx/pkg/logger" + + d "github.com/karincake/dodol" + "gorm.io/gorm" + + db "simrs-vx/pkg/dualtrx-helper" + + elog "simrs-vx/internal/domain/sync-entities/log" +) + +const source = "doctor" + +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + tx := db.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log + if err := CreateLogData(input, &event, tx); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + }, nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/doctor/helper.go b/internal/use-case/simgos-sync-use-case/new/doctor/helper.go new file mode 100644 index 00000000..3d6cdb88 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/doctor/helper.go @@ -0,0 +1,41 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package doctor + +import ( + "encoding/json" + erc "simrs-vx/internal/domain/references/common" + + esync "simrs-vx/internal/domain/sync-entities/doctor" + esyncLog "simrs-vx/internal/domain/sync-entities/log" +) + +func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.DoctorSimxLog) { + // encode to JSON + jsonData, _ := json.MarshalIndent(input.Payload, "", " ") + jsonString := string(jsonData) + + var status erc.ProcessStatusCode + if input.IsSuccess { + status = erc.PSCSuccess + } else { + status = erc.PSCFailed + if input.ErrMessage != nil { + data.ErrMessage = input.ErrMessage + } + } + + data.Value = &jsonString + data.Date = &now + data.Status = status + + return +} + +func setDataSimxLink(simxId, simgosId uint) (data esync.DoctorLink) { + data.Simx_Id = simxId + data.Simgos_Id = simgosId + return +} diff --git a/internal/use-case/simgos-sync-use-case/new/doctor/lib.go b/internal/use-case/simgos-sync-use-case/new/doctor/lib.go new file mode 100644 index 00000000..c5bbf6fb --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/doctor/lib.go @@ -0,0 +1,53 @@ +package doctor + +import ( + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + "time" + + dg "github.com/karincake/apem/db-gorm-pg" + "gorm.io/gorm" + + esync "simrs-vx/internal/domain/sync-entities/doctor" + esynclog "simrs-vx/internal/domain/sync-entities/log" +) + +var now = time.Now() + +func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.DoctorLink, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLink(simxId, simgosId) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(data, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLog(&input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/case.go b/internal/use-case/simgos-sync-use-case/new/encounter/case.go index 59e7e345..db1cb654 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/case.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/case.go @@ -1,6 +1,7 @@ package encounter import ( + erc "simrs-vx/internal/domain/references/common" pl "simrs-vx/pkg/logger" d "github.com/karincake/dodol" @@ -9,7 +10,6 @@ import ( db "simrs-vx/pkg/dualtrx-helper" e "simrs-vx/internal/domain/main-entities/encounter" - etp "simrs-vx/internal/domain/simgos-entities/t-pendaftaran" synce "simrs-vx/internal/domain/sync-entities/encounter" syncir "simrs-vx/internal/domain/sync-entities/internal-reference" elog "simrs-vx/internal/domain/sync-entities/log" @@ -21,9 +21,7 @@ const source = "encounter" func Create(input e.Encounter) (*d.Data, error) { var ( - sgData *etp.TPendaftaran syncLink *synce.EncounterLink - err error ) event := pl.Event{ @@ -34,21 +32,27 @@ func Create(input e.Encounter) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - err = db.WithDualTx(func(tx *db.Dualtx) error { - // STEP 1: Insert to simgos - sgData, err = CreateTPendaftaranData(input, &event, tx.Simgos) + err := db.WithDualTx(func(tx *db.Dualtx) error { + // STEP 1: Insert TPendaftaran + tPendaftaran, err := CreateTPendaftaranData(input, &event, tx.Simgos) if err != nil { return err } - // STEP 2: Insert to Link - syncLink, err = CreateLinkData(input.Id, sgData.Idxdaftar, &event, tx.Sync) + // STEP 2: Insert TRekammedik + err = CreateTRekammedik(input, tPendaftaran, &event, tx.Simgos) if err != nil { return err } // STEP 3: Update MPasien - err = updatePatientCaraBayar(*sgData, &event, tx.Simgos) + err = updatePatientCaraBayar(*tPendaftaran, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 4: Insert to Link + syncLink, err = CreateLinkData(input.Id, tPendaftaran.Idxdaftar, &event, tx.Sync) if err != nil { return err } @@ -131,6 +135,11 @@ func Update(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 2: Update Simgos if err = UpdateTPendaftaranData(input, simgos, "update", &event, tx); err != nil { return err @@ -234,6 +243,11 @@ func CheckIn(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 2: Update Simgos if err = UpdateTPendaftaranData(input, simgos, "check-in", &event, tx); err != nil { return err @@ -276,13 +290,16 @@ func CheckOut(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 2: Update Simgos if err = UpdateTPendaftaranData(input, simgos, "check-out", &event, tx); err != nil { return err } - // TODO: Update TPemeriksaanHistory end_konsul if internal reference exist - return nil }) @@ -299,12 +316,12 @@ func CheckOut(input e.Encounter) (*d.Data, error) { func UpdateStatus(input e.Encounter) (*d.Data, error) { event := pl.Event{ - Feature: "Cancel", + Feature: "Update Status", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "cancel") + pl.SetLogInfo(&event, input, "started", "update-status") // STEP 1: Get Link syncLink, err := ReadDetailLinkData(input.Id, &event) @@ -320,11 +337,23 @@ func UpdateStatus(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { - // Step 2: Update Simgos + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + + // Step 2: Update TPendaftaran if err = UpdateTPendaftaranData(input, simgos, "update-status", &event, tx); err != nil { return err } + // Step 3: Update TDiagnosadanterapi + if input.Status_Code == erc.DSCCancel { + if err = updateCancelTDiagnosaTherapy(simgos.Idxdaftar, input, &event, tx); err != nil { + return err + } + } + return nil }) @@ -339,18 +368,18 @@ func UpdateStatus(input e.Encounter) (*d.Data, error) { }, nil } -func RequestSwitchUnit(input e.Encounter) (*d.Data, error) { +func RequestSwitchSpecialist(input e.Encounter) (*d.Data, error) { var ( syncLinkInternal *[]syncir.InternalReferenceLink ) event := pl.Event{ - Feature: "RequestSwitchUnit", + Feature: "RequestSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "request-switch-unit") + pl.SetLogInfo(&event, input, "started", "request-switch-specialist") // STEP 1: Get Link syncLink, err := ReadDetailLinkData(input.Id, &event) @@ -402,14 +431,14 @@ func RequestSwitchUnit(input e.Encounter) (*d.Data, error) { }, nil } -func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { event := pl.Event{ - Feature: "ApproveSwitchUnit", + Feature: "ApproveSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "approve-switch-unit") + pl.SetLogInfo(&event, input, "started", "approve-switch-specialist") // STEP 1: Get InternalReference Link syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event) @@ -425,6 +454,11 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 3: Update TPemeriksaanHist if err := utph.UpdateSimgosData(input, tPemeriksaanHist, "approve", &event, tx); err != nil { return err @@ -444,14 +478,14 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { }, nil } -func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func CancelSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { event := pl.Event{ - Feature: "CancelSwitchUnit", + Feature: "CancelSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "cancel-switch-unit") + pl.SetLogInfo(&event, input, "started", "cancel-switch-specialist") // STEP 1: Get InternalReference Link syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event) @@ -467,6 +501,11 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 3: Update TPemeriksaanHist if err := utph.UpdateSimgosData(input, tPemeriksaanHist, "cancel", &event, tx); err != nil { return err diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/helper.go b/internal/use-case/simgos-sync-use-case/new/encounter/helper.go index bbbc8687..f88ba59f 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/helper.go @@ -6,25 +6,29 @@ package encounter import ( "encoding/json" + pl "simrs-vx/pkg/logger" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + "gorm.io/gorm" + "gorm.io/gorm/clause" + erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" erp "simrs-vx/internal/domain/references/person" - pl "simrs-vx/pkg/logger" - "strconv" e "simrs-vx/internal/domain/main-entities/encounter" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" + ep "simrs-vx/internal/domain/simgos-entities/m-pasien" - etph "simrs-vx/internal/domain/simgos-entities/t-pemeriksaan-hist" + etdt "simrs-vx/internal/domain/simgos-entities/t-diagnosadanterapi" etp "simrs-vx/internal/domain/simgos-entities/t-pendaftaran" + etrm "simrs-vx/internal/domain/simgos-entities/t-rekammedik" + esync "simrs-vx/internal/domain/sync-entities/encounter" esyncLog "simrs-vx/internal/domain/sync-entities/log" - - dg "github.com/karincake/apem/db-gorm-pg" - "gorm.io/gorm" - "gorm.io/gorm/clause" ) func setDataCreateTPendaftaran(input *e.Encounter) (data etp.TPendaftaran, err error) { @@ -73,8 +77,8 @@ func setDataTPendaftaran(input *e.Encounter, data *etp.TPendaftaran) { data.Tglreg = input.RegisteredAt // set kdpoly - if p := input.Unit_Code; p != nil { - kdpoly, _ := strconv.Atoi(*input.Unit_Code) + if p := input.Specialist_Code; p != nil { + kdpoly, _ := strconv.Atoi(*input.Specialist_Code) data.Kdpoly = uint(kdpoly) } @@ -188,34 +192,6 @@ func setDataCheckOut(input e.Encounter, data *etp.TPendaftaran) { return } -func setDataRequestSwitchUnit(input e.Encounter, data *etp.TPendaftaran) (hist []etph.TPemeriksaanHist) { - if enc := input.InternalReferences; enc != nil { - for i, ref := range *enc { - hist = append(hist, etph.TPemeriksaanHist{ - Idxdaftar: &data.Idxdaftar, - Kdpoly: stringtouint(*ref.Unit_Code), - DokterPengonsul: stringtouint(*ref.SrcDoctor_Code), - DokterPenerima: stringtouint(*ref.Doctor_Code), - StartKonsul: &now, - }) - - // set user konsul - if n := input.Responsible_Nurse; n != nil { - if emp := n.Employee; emp != nil { - if u := emp.User; u != nil { - hist[i].UserKonsul = &u.Name - } - } - } - - // setaktif - aktif := uint16(1) - hist[i].StAktif = &aktif - } - } - return -} - func setKdrujuk(input *ere.RefTypeCode, data *etp.TPendaftaran) { switch *input { case ere.RTCGov: @@ -363,12 +339,6 @@ func generateNoKunjung() (int, error) { return lastNumber + 1, nil } -func stringtouint(v string) *uint { - u, _ := strconv.Atoi(v) - point := uint(u) - return &point -} - func updatePatientCaraBayar(input etp.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "started", "DBUpdate") @@ -381,9 +351,7 @@ func updatePatientCaraBayar(input etp.TPendaftaran, event *pl.Event, dbx ...*gor if err := tx.Model(&ep.MPasien{}). Where("\"nomr\" = ?", input.Nomr). - Updates(map[string]interface{}{ - "kdcarabayar": input.Kdcarabayar, - }).Error; err != nil { + Update("kdcarabayar", input.Kdcarabayar).Error; err != nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "update-fail", @@ -417,3 +385,57 @@ func mapAddress(addresses *[]epa.PersonAddress, data *etp.TPendaftaran) { a := (*addresses)[0] data.PenanggungjawabAlamat = a.Address } + +func setDataTRekammedik(input e.Encounter, tdaftar *etp.TPendaftaran) (data etrm.TRekammedik) { + data.TglKirim = tdaftar.Tglreg + data.Idxdaftar = tdaftar.Idxdaftar + data.Kdpoly = tdaftar.Kdpoly + data.JamKirimRm = tdaftar.Tglreg + + if emp := input.Adm_Employee; emp != nil { + if p := emp.Person; p != nil { + data.Pengirim = p.Name + } + } + + return +} + +func updateCancelTDiagnosaTherapy(idxdaftar uint, enc e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "DBUpdate") + + var ( + tx *gorm.DB + userBatal string + ) + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if a := enc.Adm_Employee; a != nil { + if u := a.User; u != nil { + userBatal = u.Name + } + } + + if err := tx.Model(&etdt.TDiagnosaDanTerapi{}). + Where("idxdaftar = ?", idxdaftar). + Updates(map[string]interface{}{ + "status": "BATAL", + "user_batal": userBatal, + "tgl_batal": &now, + }).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "update-fail", + Detail: "Failed to update patient", + Raw: err, + } + return pl.SetLogError(event, idxdaftar) + } + + pl.SetLogInfo(event, idxdaftar, "complete") + return nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/lib.go b/internal/use-case/simgos-sync-use-case/new/encounter/lib.go index 47d50802..95f86ede 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/lib.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/lib.go @@ -1,7 +1,6 @@ package encounter import ( - etph "simrs-vx/internal/domain/simgos-entities/t-pemeriksaan-hist" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -138,25 +137,6 @@ func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func CreateBulkLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.EncounterLink, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - data := setDataSimxLink(simxId, simgosId) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - if err := tx.Create(&data).Error; err != nil { - return nil, plh.HandleCreateError(data, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - func ReadDetailLinkData(simxId uint, event *pl.Event) (*esync.EncounterLink, error) { pl.SetLogInfo(event, simxId, "started", "DBReadDetail") data := esync.EncounterLink{} @@ -218,10 +198,9 @@ func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) return nil } -func CreateBulkTPemeriksaanHistData(input e.Encounter, data *etp.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) (hist []etph.TPemeriksaanHist, err error) { +func CreateTRekammedik(input e.Encounter, tpendaftaran *etp.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "started", "DBCreate") - - hist = setDataRequestSwitchUnit(input, data) + data := setDataTRekammedik(input, tpendaftaran) var tx *gorm.DB if len(dbx) > 0 { @@ -230,32 +209,8 @@ func CreateBulkTPemeriksaanHistData(input e.Encounter, data *etp.TPendaftaran, e tx = dg.IS["simrs"] } - if err := tx.Create(&hist).Error; err != nil { - return nil, plh.HandleCreateError(input, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return hist, nil -} - -func UpdateTPemeriksaanHistData(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, input, "started", "DBUpdateTPemeriksaanHist") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.IS["simrs"] - } - - if err := tx.Save(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-update-fail", - Detail: "Database update failed", - Raw: err, - } - return pl.SetLogError(event, input) + if err := tx.Create(&data).Error; err != nil { + return plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go b/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go index 9cb55785..6ac98549 100644 --- a/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go @@ -24,7 +24,7 @@ func setCreateDataSimgos(input e.Encounter, data *etp.TPendaftaran) (hist []etph for i, ref := range *enc { hist = append(hist, etph.TPemeriksaanHist{ Idxdaftar: &data.Idxdaftar, - Kdpoly: stringtouint(*ref.Unit_Code), + Kdpoly: stringtouint(*ref.Specialist_Code), DokterPengonsul: stringtouint(*ref.SrcDoctor_Code), DokterPenerima: stringtouint(*ref.Doctor_Code), }) @@ -46,7 +46,7 @@ func setCreateDataSimgos(input e.Encounter, data *etp.TPendaftaran) (hist []etph return } -func setUpdateApproveDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist) { +func setUpdateApproveDataSimgos(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist) { data.DokterPenerima = stringtouint(*input.Dst_Doctor_Code) data.StartKonsul = &now data.UserPenerima = &input.User_Name @@ -54,7 +54,7 @@ func setUpdateApproveDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeri return } -func setUpdateCancelDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist) { +func setUpdateCancelDataSimgos(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist) { data.UserBatal = &input.User_Name data.TglBatal = &now diff --git a/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go b/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go index 2263f230..b3c526c5 100644 --- a/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go +++ b/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go @@ -61,7 +61,7 @@ func ReadDetailSimgosData(simgosId uint, event *pl.Event) (*etph.TPemeriksaanHis return &data, nil } -func UpdateSimgosData(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist, method string, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateSimgosData(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist, method string, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, input, "started", "DBUpdate") switch method { diff --git a/internal/use-case/simgos-sync-use-case/new/nurse/case.go b/internal/use-case/simgos-sync-use-case/new/nurse/case.go new file mode 100644 index 00000000..647b9956 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/nurse/case.go @@ -0,0 +1,48 @@ +package nurse + +import ( + pl "simrs-vx/pkg/logger" + + d "github.com/karincake/dodol" + "gorm.io/gorm" + + db "simrs-vx/pkg/dualtrx-helper" + + elog "simrs-vx/internal/domain/sync-entities/log" +) + +const source = "nurse" + +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + tx := db.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log + if err := CreateLogData(input, &event, tx); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + }, nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/nurse/helper.go b/internal/use-case/simgos-sync-use-case/new/nurse/helper.go new file mode 100644 index 00000000..026d53ba --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/nurse/helper.go @@ -0,0 +1,41 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package nurse + +import ( + "encoding/json" + erc "simrs-vx/internal/domain/references/common" + + esyncLog "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/nurse" +) + +func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.NurseSimxLog) { + // encode to JSON + jsonData, _ := json.MarshalIndent(input.Payload, "", " ") + jsonString := string(jsonData) + + var status erc.ProcessStatusCode + if input.IsSuccess { + status = erc.PSCSuccess + } else { + status = erc.PSCFailed + if input.ErrMessage != nil { + data.ErrMessage = input.ErrMessage + } + } + + data.Value = &jsonString + data.Date = &now + data.Status = status + + return +} + +func setDataSimxLink(simxId, simgosId uint) (data esync.NurseLink) { + data.Simx_Id = simxId + data.Simgos_Id = simgosId + return +} diff --git a/internal/use-case/simgos-sync-use-case/new/nurse/lib.go b/internal/use-case/simgos-sync-use-case/new/nurse/lib.go new file mode 100644 index 00000000..3fc9456d --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/nurse/lib.go @@ -0,0 +1,53 @@ +package nurse + +import ( + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + "time" + + dg "github.com/karincake/apem/db-gorm-pg" + "gorm.io/gorm" + + esynclog "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/nurse" +) + +var now = time.Now() + +func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.NurseLink, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLink(simxId, simgosId) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(data, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLog(&input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/patient/case.go b/internal/use-case/simgos-sync-use-case/new/patient/case.go index a147524c..03497eed 100644 --- a/internal/use-case/simgos-sync-use-case/new/patient/case.go +++ b/internal/use-case/simgos-sync-use-case/new/patient/case.go @@ -122,6 +122,11 @@ func Update(input e.Patient) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 3: Update Simgos if err = UpdateSimgosData(input, patientData, &event, tx); err != nil { return err diff --git a/internal/use-case/simgos-sync-use-case/new/soapi/case.go b/internal/use-case/simgos-sync-use-case/new/soapi/case.go new file mode 100644 index 00000000..d7e9bcc4 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/soapi/case.go @@ -0,0 +1,274 @@ +package soapi + +import ( + pl "simrs-vx/pkg/logger" + + d "github.com/karincake/dodol" + "gorm.io/gorm" + + db "simrs-vx/pkg/dualtrx-helper" + + e "simrs-vx/internal/domain/main-entities/soapi" + + elog "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/soapi" + + ue "simrs-vx/internal/use-case/simgos-sync-use-case/new/encounter" +) + +const source = "soapi" + +func Create(input e.Soapi) (*d.Data, error) { + var ( + syncLink *esync.SoapiLink + err error + ) + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + // get encounter Link + eLink, err := ue.ReadDetailLinkData(*input.Encounter_Id, &event) + if err != nil { + return nil, err + } + + // get Tpendaftaran + tPendaftaran, err := ue.ReadTPendaftaranDetailData(eLink.Simgos_Id, &event) + if err != nil { + return nil, err + } + + err = db.WithDualTx(func(tx *db.Dualtx) error { + // STEP 1: Insert to TDiagnosaDanTerapi + tDiagTherapy, err := CreateTDiagnosaDanTerapi(input, tPendaftaran, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 2: Insert to TICD + _, err = CreateTIcd(input, tPendaftaran, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 3: Insert to TICD-CM + _, err = CreateTIcdCm(input, tPendaftaran, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 4: Insert to Link + syncLink, err = CreateLinkData(input.Id, tDiagTherapy.Idxterapi, &event, tx.Sync) + if err != nil { + return err + } + + return nil + }) + + if err != nil { + if syncLink != nil { + go func() { _ = DeleteLinkData(syncLink, &event) }() + } + return nil, err + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + }, nil +} + +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + tx := db.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log + if err := CreateLogData(input, &event, tx); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + }, nil +} + +func Update(input e.Soapi) (*d.Data, error) { + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + // Get Soapi Link + sLink, err := ReadDetailLinkData(input.Id, &event) + if err != nil { + return nil, err + } + + // Get TDiagnosadanTerapi + tDiagTherapy, err := ReadDetailTDiagnosaDanTerapi(sLink.Simgos_Id, &event) + if err != nil { + return nil, err + } + + // Get Encounter Link + eLink, err := ue.ReadDetailLinkData(*input.Encounter_Id, &event) + if err != nil { + return nil, err + } + + // Get TPendaftaran + tPendaftaran, err := ue.ReadTPendaftaranDetailData(eLink.Simgos_Id, &event) + if err != nil { + return nil, err + } + + tx := db.NewTx() + err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + + // Step 1: Update TDiagnosaDanTerapi + if err = UpdateTDiagnosaDanTerapi(input, tDiagTherapy, &event, tx); err != nil { + return err + } + + // STEP 2: Delete TIcd + if err = HardDeleteTIcd(tDiagTherapy.Idxdaftar, &event, tx); err != nil { + return err + } + + // STEP 3: Delete TIcdCm + if err = HardDeleteTIcdCm(tDiagTherapy.Idxdaftar, &event, tx); err != nil { + return err + } + + // STEP 4: Insert TIcd + if _, err = CreateTIcd(input, tPendaftaran, &event, tx); err != nil { + return err + } + + // STEP 5: Insert TIcd-cm + if _, err = CreateTIcdCm(input, tPendaftaran, &event, tx); err != nil { + return err + } + + return nil + }) + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + }, nil +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + var isLinkDeleted bool + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + // Get Soapi Link + syncLink, err := ReadDetailLinkData(input.Id, &event) + if err != nil { + return nil, err + } + + // Get TDiagnosa&Terapi + tDiagTh, err := ReadDetailTDiagnosaDanTerapi(syncLink.Simgos_Id, &event) + if err != nil { + return nil, err + } + + err = db.WithDualTx(func(tx *db.Dualtx) error { + // STEP 1: Delete TDiagnosa&Terapi Simgos + if err = HardDeleteTDiagnosaDanTerapi(tDiagTh, &event, tx.Simgos); err != nil { + return err + } + + // STEP 2: Delete TIcd + if err = HardDeleteTIcd(tDiagTh.Idxdaftar, &event, tx.Simgos); err != nil { + return err + } + + // STEP 3: Delete TIcdCm + if err = HardDeleteTIcdCm(tDiagTh.Idxdaftar, &event, tx.Simgos); err != nil { + return err + } + + // STEP 4: Delete Link + err = DeleteLinkData(syncLink, &event, tx.Sync) + if err != nil { + return err + } + + isLinkDeleted = true + return nil + }) + + if err != nil { + if isLinkDeleted { + go func() { + _, _ = CreateLinkData(input.Id, tDiagTh.Idxterapi, &event) + }() + } + return nil, err + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + }, nil + +} diff --git a/internal/use-case/simgos-sync-use-case/new/soapi/helper.go b/internal/use-case/simgos-sync-use-case/new/soapi/helper.go new file mode 100644 index 00000000..b9d761a1 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/soapi/helper.go @@ -0,0 +1,200 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package soapi + +import ( + "encoding/json" + "fmt" + ere "simrs-vx/internal/domain/references/encounter" + "strconv" + "time" + + ercl "simrs-vx/internal/domain/references/clinical" + erc "simrs-vx/internal/domain/references/common" + + es "simrs-vx/internal/domain/main-entities/soapi" + + etdt "simrs-vx/internal/domain/simgos-entities/t-diagnosadanterapi" + eicd "simrs-vx/internal/domain/simgos-entities/t-icd" + eicdcm "simrs-vx/internal/domain/simgos-entities/t-icd-cm" + etp "simrs-vx/internal/domain/simgos-entities/t-pendaftaran" + + esyncLog "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/soapi" +) + +func setDataCreateTDiagnosaDanTerapi(input es.Soapi, enc *etp.TPendaftaran) (data etdt.TDiagnosaDanTerapi) { + switch input.TypeCode { + case ercl.STCEEarlyMedic: + data.Idxdaftar = enc.Idxdaftar + data.Nomr = enc.Nomr + data.Kdpoly = enc.Kdpoly + data.Kddokter = enc.Kddokter + + if e := input.Encounter; e != nil { + data.Tanggal = e.VisitDate + if e.Class_Code == ere.ECAmbulatory { + data.Rajal = 1 + } + + } + + if e := input.Employee; e != nil { + if u := e.User; u != nil { + data.Nip = u.Name + } + } + + setEarlyMedicTDT(input, &data) + return + } + + return +} + +func setEarlyMedicTDT(input es.Soapi, data *etdt.TDiagnosaDanTerapi) { + value := ercl.EarlyMedicValue{} + _ = json.Unmarshal([]byte(*input.Value), &value) + + data.TekananDarah = fmt.Sprintf("%v/%v", value.SystolicBloodPressure, value.DiastolicBloodPressure) + data.GolonganDarah = value.BloodType + if value.BloodType == "" { + data.GolonganDarah = "X" + } + + data.TinggiBadan = float64(value.Height) + data.BeratBadan = float64(value.Weight) + data.Diagnosa = &value.EarlyMedicDiagnose + data.Terapi = &value.Therapy + data.Anamnesa = &value.PrimaryComplain + + // TODO : status, tindakan_mdeis (?) + data.KunjunganBl = uint(value.EncounterStatus) + data.KasusBl = uint(value.CaseStatus) + + data.PemeriksaanFisik = &value.PhysicalExamination + data.RiwayatPasien = &value.CurrentDiseaseHistory + + if value.Vaccinated { + data.SudahVaksin = "YA" + } else { + data.SudahVaksin = "TIDAK" + } + + data.DenyutJantung = strconv.Itoa(value.Pulse) + data.Pernapasan = strconv.Itoa(value.RespiratoryRate) + data.Suhu = strconv.Itoa(value.Temperature) + data.Sp02 = strconv.Itoa(value.SpO2) + + if o := value.ExpectedOutcome; len(o) > 0 { + expectedOutput := []string{} + for _, v := range o { + expectedOutput = append(expectedOutput, v.Name) + } + + jsonData, _ := json.Marshal(expectedOutput) + data.TargetCapaian = string(jsonData) + } + return +} + +func setDataIcd(input es.Soapi, enc *etp.TPendaftaran) (data []eicd.TIcd) { + value := ercl.EarlyMedicValue{} + _ = json.Unmarshal([]byte(*input.Value), &value) + + var ( + visitDate time.Time + ambulatory uint16 + ) + + if e := input.Encounter; e != nil { + visitDate = e.VisitDate + if e.Class_Code == ere.ECAmbulatory { + ambulatory = 1 + } + + } + + if d := value.DiagnoseSrc; len(d) > 0 { + for _, v := range d { + data = append(data, eicd.TIcd{ + Nomr: enc.Nomr, + Idxdaftar: enc.Idxdaftar, + Kddokter: enc.Kddokter, + Icd: v.Code, + StatusRajal: ambulatory, + Tanggal: visitDate, + }) + } + } + + return +} + +func setDataIcdCm(input es.Soapi, enc *etp.TPendaftaran) (data []eicdcm.TIcdCm) { + value := ercl.EarlyMedicValue{} + _ = json.Unmarshal([]byte(*input.Value), &value) + + var ( + visitDate time.Time + ambulatory uint16 + ) + + if e := input.Encounter; e != nil { + visitDate = e.VisitDate + if e.Class_Code == ere.ECAmbulatory { + ambulatory = 1 + } + + } + + if p := value.ProcedureSrc; len(p) > 0 { + for _, v := range p { + data = append(data, eicdcm.TIcdCm{ + Nomr: enc.Nomr, + Idxdaftar: enc.Idxdaftar, + Kddokter: enc.Kddokter, + Icd: &v.Code, + StatusRajal: ambulatory, + Tanggal: visitDate, + }) + } + } + + return +} + +func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.SoapiSimxLog) { + // encode to JSON + jsonData, _ := json.MarshalIndent(input.Payload, "", " ") + jsonString := string(jsonData) + + var status erc.ProcessStatusCode + if input.IsSuccess { + status = erc.PSCSuccess + } else { + status = erc.PSCFailed + if input.ErrMessage != nil { + data.ErrMessage = input.ErrMessage + } + } + + data.Value = &jsonString + data.Date = &now + data.Status = status + + return +} + +func setDataSimxLink(simxId, simgosId uint) (data esync.SoapiLink) { + data.Simx_Id = simxId + data.Simgos_Id = simgosId + return +} + +func stringtouint(v string) uint { + u, _ := strconv.Atoi(v) + return uint(u) +} diff --git a/internal/use-case/simgos-sync-use-case/new/soapi/lib.go b/internal/use-case/simgos-sync-use-case/new/soapi/lib.go new file mode 100644 index 00000000..af27a791 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/soapi/lib.go @@ -0,0 +1,334 @@ +package soapi + +import ( + "errors" + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + "time" + + dg "github.com/karincake/apem/db-gorm-pg" + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/soapi" + + etdt "simrs-vx/internal/domain/simgos-entities/t-diagnosadanterapi" + eicd "simrs-vx/internal/domain/simgos-entities/t-icd" + eicdcm "simrs-vx/internal/domain/simgos-entities/t-icd-cm" + ep "simrs-vx/internal/domain/simgos-entities/t-pendaftaran" + + esynclog "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/soapi" +) + +var now = time.Now() + +func CreateTDiagnosaDanTerapi(input e.Soapi, tdaftar *ep.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) (*etdt.TDiagnosaDanTerapi, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataCreateTDiagnosaDanTerapi(input, tdaftar) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadDetailTDiagnosaDanTerapi(simgosId uint, event *pl.Event) (*etdt.TDiagnosaDanTerapi, error) { + pl.SetLogInfo(event, simgosId, "started", "DBReadDetail") + data := etdt.TDiagnosaDanTerapi{} + + var tx = dg.IS["simrs"] + + if err := tx. + Where("\"idxterapi\" = ?", simgosId). + First(&data).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, simgosId, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateTDiagnosaDanTerapi(input e.Soapi, data *etdt.TDiagnosaDanTerapi, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, input, "started", "DBUpdate") + + setEarlyMedicTDT(input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func HardDeleteTDiagnosaDanTerapi(data *etdt.TDiagnosaDanTerapi, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx. + Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func CreateTIcd(input e.Soapi, tdaftar *ep.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) (*[]eicd.TIcd, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataIcd(input, tdaftar) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListTIcd(idxdaftar string, event *pl.Event, dbx ...*gorm.DB) ([]eicd.TIcd, error) { + pl.SetLogInfo(event, idxdaftar, "started", "DBReadList") + data := []eicd.TIcd{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&eicd.TIcd{}). + Where("idxdaftar = ?", idxdaftar) + + if err := tx.Find(&data).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, plh.HandleListError(idxdaftar, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return data, nil +} + +func HardDeleteTIcd(idxdaftar uint, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, idxdaftar, "started", "DBDelete") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx. + Where("idxdaftar = ?", idxdaftar). + Delete(&eicd.TIcd{}).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, idxdaftar) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func CreateTIcdCm(input e.Soapi, tdaftar *ep.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) (*[]eicdcm.TIcdCm, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataIcdCm(input, tdaftar) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListTIcdCm(idxdaftar string, event *pl.Event, dbx ...*gorm.DB) ([]eicdcm.TIcdCm, error) { + pl.SetLogInfo(event, idxdaftar, "started", "DBReadList") + data := []eicdcm.TIcdCm{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&eicdcm.TIcdCm{}). + Where("idxdaftar = ?", idxdaftar) + + if err := tx.Find(&data).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, plh.HandleListError(idxdaftar, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return data, nil +} + +func HardDeleteTIcdCm(idxdaftar uint, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, idxdaftar, "started", "DBDelete") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx. + Where("idxdaftar = ?", idxdaftar). + Delete(&eicdcm.TIcdCm{}).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, idxdaftar) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.SoapiLink, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLink(simxId, simgosId) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(data, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadDetailLinkData(simxId uint, event *pl.Event) (*esync.SoapiLink, error) { + pl.SetLogInfo(event, simxId, "started", "DBReadDetail") + data := esync.SoapiLink{} + + var tx = dg.I + + if err := tx. + Where("\"Simx_Id\" = ?", simxId). + First(&data).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, simxId, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func DeleteLinkData(data *esync.SoapiLink, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLog(&input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/unit/middleware-runner.go b/internal/use-case/simgos-sync-use-case/new/soapi/middleware-runner.go similarity index 88% rename from internal/use-case/simgos-sync-use-case/new/unit/middleware-runner.go rename to internal/use-case/simgos-sync-use-case/new/soapi/middleware-runner.go index 64426eb9..74d8b1a8 100644 --- a/internal/use-case/simgos-sync-use-case/new/unit/middleware-runner.go +++ b/internal/use-case/simgos-sync-use-case/new/soapi/middleware-runner.go @@ -1,4 +1,4 @@ -package unit +package soapi import ( pl "simrs-vx/pkg/logger" @@ -6,7 +6,7 @@ import ( "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/unit" + e "simrs-vx/internal/domain/main-entities/soapi" ) type middlewareRunner struct { @@ -24,7 +24,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Unit) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Soapi) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -39,7 +39,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e return nil } -func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Unit) error { +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Soapi) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -54,7 +54,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu return nil } -func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) error { +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -69,7 +69,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -84,7 +84,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) diff --git a/internal/use-case/simgos-sync-use-case/new/soapi/middleware.go b/internal/use-case/simgos-sync-use-case/new/soapi/middleware.go new file mode 100644 index 00000000..1fa07628 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/new/soapi/middleware.go @@ -0,0 +1 @@ +package soapi diff --git a/internal/use-case/simgos-sync-use-case/new/unit/tycovar.go b/internal/use-case/simgos-sync-use-case/new/soapi/tycovar.go similarity index 77% rename from internal/use-case/simgos-sync-use-case/new/unit/tycovar.go rename to internal/use-case/simgos-sync-use-case/new/soapi/tycovar.go index e1a7c69f..956193a4 100644 --- a/internal/use-case/simgos-sync-use-case/new/unit/tycovar.go +++ b/internal/use-case/simgos-sync-use-case/new/soapi/tycovar.go @@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the middleware to separate from main use-case which has the basic CRUD functionality. The purpose of this is to make the code more maintainable. */ -package unit +package soapi import ( "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/unit" + e "simrs-vx/internal/domain/main-entities/soapi" ) type createMw struct { Name string - Func func(input *e.CreateDto, data *e.Unit, tx *gorm.DB) error + Func func(input *e.CreateDto, data *e.Soapi, tx *gorm.DB) error } type readListMw struct { Name string - Func func(input *e.ReadListDto, data *e.Unit, tx *gorm.DB) error + Func func(input *e.ReadListDto, data *e.Soapi, tx *gorm.DB) error } type readDetailMw struct { Name string - Func func(input *e.ReadDetailDto, data *e.Unit, tx *gorm.DB) error + Func func(input *e.ReadDetailDto, data *e.Soapi, tx *gorm.DB) error } type UpdateMw = readDetailMw diff --git a/internal/use-case/simgos-sync-use-case/new/unit/case.go b/internal/use-case/simgos-sync-use-case/new/unit/case.go deleted file mode 100644 index 3450a4cb..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/case.go +++ /dev/null @@ -1,198 +0,0 @@ -package unit - -import ( - pl "simrs-vx/pkg/logger" - - d "github.com/karincake/dodol" - "gorm.io/gorm" - - db "simrs-vx/pkg/dualtrx-helper" - - e "simrs-vx/internal/domain/main-entities/unit" - esimgos "simrs-vx/internal/domain/simgos-entities/m-poly" - elog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/unit" -) - -const source = "unit" - -func Create(input e.CreateDto) (*d.Data, error) { - var ( - sgData *esimgos.MPoly - syncLink *esync.UnitLink - err error - ) - - event := pl.Event{ - Feature: "Create", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "create") - - err = db.WithDualTx(func(tx *db.Dualtx) error { - // STEP 1: Insert to simgos - sgData, err = CreateSimgosData(input, &event, tx.Simgos) - if err != nil { - return err - } - - // STEP 2: Insert to Link - syncLink, err = CreateLinkData(*input.Id, sgData.Kode, &event, tx.Sync) - if err != nil { - return err - } - - return nil - }) - - if err != nil { - if syncLink != nil { - go func() { _ = DeleteLinkData(syncLink, &event) }() - } - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.II{ - "source": source, - "structure": "single-data", - "status": "created", - }, - }, nil -} - -func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { - event := pl.Event{ - Feature: "Create", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "create") - - tx := db.NewTx() - err := tx.Sync.Transaction(func(tx *gorm.DB) error { - // Insert to Log - if err := CreateLogData(input, &event, tx); err != nil { - return err - } - - return nil - }) - - if err != nil { - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.II{ - "source": source, - "structure": "single-data", - "status": "created", - }, - }, nil -} - -func Update(input e.UpdateDto) (*d.Data, error) { - event := pl.Event{ - Feature: "Update", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "update") - - // STEP 1: Get Installation Link - syncLink, err := ReadDetailLinkData(*input.Id, &event) - if err != nil { - return nil, err - } - - tx := db.NewTx() - err = tx.Simgos.Transaction(func(tx *gorm.DB) error { - // Step 2: Update Simgos - err = UpdateSimgosData(input, syncLink, &event, tx) - if err != nil { - return err - } - - return nil - }) - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.IS{ - "source": source, - "structure": "single-data", - "status": "updated", - }, - }, nil -} - -func Delete(input e.DeleteDto) (*d.Data, error) { - var isLinkDeleted bool - - event := pl.Event{ - Feature: "Delete", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "delete") - - // STEP 1: Get Installation Link - syncLink, err := ReadDetailLinkData(*input.Id, &event) - if err != nil { - return nil, err - } - - // STEP 2: Get Simgos - sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) - if err != nil { - return nil, err - } - - err = db.WithDualTx(func(tx *db.Dualtx) error { - // STEP 3: Delete M_Poly Simgos - err = HardDeleteSimgosData(sgData, &event, tx.Simgos) - if err != nil { - return err - } - - // STEP 4: Delete Installation Link - err = DeleteLinkData(syncLink, &event, tx.Sync) - if err != nil { - return err - } - - isLinkDeleted = true - return nil - }) - - if err != nil { - if isLinkDeleted { - go func() { - _, _ = CreateLinkData(uint(*input.Id), sgData.Kode, &event) - }() - } - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.IS{ - "source": source, - "structure": "single-data", - "status": "deleted", - }, - }, nil - -} diff --git a/internal/use-case/simgos-sync-use-case/new/unit/helper.go b/internal/use-case/simgos-sync-use-case/new/unit/helper.go deleted file mode 100644 index d7dfb1f6..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/helper.go +++ /dev/null @@ -1,62 +0,0 @@ -/* -DESCRIPTION: -Any functions that are used internally by the use-case -*/ -package unit - -import ( - "encoding/json" - erc "simrs-vx/internal/domain/references/common" - "strconv" - - e "simrs-vx/internal/domain/main-entities/unit" - - esimgos "simrs-vx/internal/domain/simgos-entities/m-poly" - esyncLog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/unit" -) - -func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MPoly) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { - inputSrc = inputT - } else { - inputTemp := any(input).(*e.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Nama = inputSrc.Name - data.Jenispoly = 0 - - kodePoly, _ := strconv.Atoi(inputSrc.Code) - data.Kode = uint(kodePoly) - return -} - -func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.UnitSimxLog) { - // encode to JSON - jsonData, _ := json.MarshalIndent(input.Payload, "", " ") - jsonString := string(jsonData) - - var status erc.ProcessStatusCode - if input.IsSuccess { - status = erc.PSCSuccess - } else { - status = erc.PSCFailed - if input.ErrMessage != nil { - data.ErrMessage = input.ErrMessage - } - } - - data.Value = &jsonString - data.Date = &now - data.Status = status - - return -} - -func setDataSimxLink(simxId, simgosId uint) (data esync.UnitLink) { - data.Simx_Id = simxId - data.Simgos_Id = simgosId - return -} diff --git a/internal/use-case/simgos-sync-use-case/new/unit/lib.go b/internal/use-case/simgos-sync-use-case/new/unit/lib.go deleted file mode 100644 index 8712ab03..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/lib.go +++ /dev/null @@ -1,188 +0,0 @@ -package unit - -import ( - plh "simrs-vx/pkg/lib-helper" - pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - "time" - - dg "github.com/karincake/apem/db-gorm-pg" - "gorm.io/gorm" - - e "simrs-vx/internal/domain/main-entities/unit" - esimgos "simrs-vx/internal/domain/simgos-entities/m-poly" - esynclog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/unit" -) - -var now = time.Now() - -func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esimgos.MPoly, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - data := setDataSimgos(&input) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.IS["simrs"] - } - - if err := tx.Create(&data).Error; err != nil { - return nil, plh.HandleCreateError(input, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.MPoly, error) { - pl.SetLogInfo(event, simgosId, "started", "DBReadDetail") - data := esimgos.MPoly{} - - var tx = dg.IS["simrs"] - - if err := tx. - Where("\"kode\" = ?", simgosId). - First(&data).Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, simgosId, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func UpdateSimgosData(input e.UpdateDto, dataSimgos *esync.UnitLink, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, input, "started", "DBUpdate") - - data := setDataSimgos(&input) - data.Kode = dataSimgos.Simgos_Id - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.IS["simrs"] - } - - if err := tx.Save(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-update-fail", - Detail: "Database update failed", - Raw: err, - } - return pl.SetLogError(event, input) - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} - -func HardDeleteSimgosData(data *esimgos.MPoly, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, data, "started", "DBDelete") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.IS["simrs"] - } - - if err := tx. - Delete(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-delete-fail", - Detail: "Database delete failed", - Raw: err, - } - return pl.SetLogError(event, data) - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} - -func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.UnitLink, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - data := setDataSimxLink(simxId, simgosId) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - if err := tx.Create(&data).Error; err != nil { - return nil, plh.HandleCreateError(data, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.UnitLink, error) { - pl.SetLogInfo(event, simxId, "started", "DBReadDetail") - data := esync.UnitLink{} - - var tx = dg.I - - if err := tx. - Where("\"Simx_Id\" = ?", simxId). - First(&data).Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, simxId, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func DeleteLinkData(data *esync.UnitLink, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, data, "started", "DBDelete") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - if err := tx.Delete(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-delete-fail", - Detail: "Database delete failed", - Raw: err, - } - return pl.SetLogError(event, data) - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} - -func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "DBCreate") - data := setDataSimxLog(&input) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - if err := tx.Create(&data).Error; err != nil { - return plh.HandleCreateError(input, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} diff --git a/internal/use-case/simgos-sync-use-case/old/patient/case.go b/internal/use-case/simgos-sync-use-case/old/patient/case.go new file mode 100644 index 00000000..09afa2bd --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/old/patient/case.go @@ -0,0 +1,165 @@ +package patient + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + + cfg "simrs-vx/internal/infra/sync-cfg" + pl "simrs-vx/pkg/logger" + + e "simrs-vx/internal/domain/main-entities/patient" + un "simrs-vx/internal/use-case/simgos-sync-use-case/new/patient" + + d "github.com/karincake/dodol" +) + +const source = "old-to-new-patient" + +var path = "patient" + +func Create(input e.Patient) (*d.Data, error) { + evt := pl.Event{ + Feature: "Create", + Source: source, + } + + pl.SetLogInfo(&evt, input, "started", "create") + + // create request body + jsonPatient, err := json.Marshal(input) + if err != nil { + return nil, pl.SetLogError(&evt, input) + } + reqBody := bytes.NewBuffer(jsonPatient) + // send data to main-api + resp, err := send(http.MethodPost, path, reqBody, *input.RegisteredBy_User_Name) + if err != nil { + return nil, pl.SetLogError(&evt, input) + } + // getting response + var data MainApiResp + err = json.Unmarshal(resp, &data) + if err != nil { + return nil, pl.SetLogError(&evt, string(resp)) + } + // create PatientLink + un.CreateLinkData(data.Data.Id, input.Id, &evt) + pl.SetLogInfo(&evt, nil, "complete") + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: input.ToResponse(), + }, nil +} + +func Update(input e.Patient) (*d.Data, error) { + evt := pl.Event{ + Feature: "Update", + Source: source, + } + pl.SetLogInfo(&evt, input, "started", "update") + + // get patient link from database + patientLink, err := ReadDetailLinkData(input.Id) + if err != nil { + return nil, pl.SetLogError(&evt, input) + } + + // get data patient from main-api + resp, err := send(http.MethodGet, fmt.Sprintf("%s%v", "patient/", patientLink.Simx_Id), nil, *input.RegisteredBy_User_Name) + if err != nil { + return nil, pl.SetLogError(&evt, input) + } + // unpack data from resp + var respData MainApiResp + err = json.Unmarshal(resp, &respData) + if err != nil { + return nil, pl.SetLogError(&evt, input) + } + + // copy data from simgos m_patient to simx Patient + preserve := map[string]bool{ + "Main.Id": true, + "Person.Id": true, + } + simxPatient := respData.Data + SetPatient(&simxPatient, &input, preserve) + + jsonPatient, err := json.Marshal(simxPatient) + if err != nil { + return nil, pl.SetLogError(&evt, input) + } + + // send data to main api + url := fmt.Sprintf("%s%v", "patient/", simxPatient.Id) + reqBody := bytes.NewBuffer(jsonPatient) + _, err = send(http.MethodPatch, url, reqBody, *input.RegisteredBy_User_Name) + if err != nil { + return nil, pl.SetLogError(&evt, input) + } + + pl.SetLogInfo(&evt, nil, "complete") + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: input.ToResponse(), + }, nil +} + +func Delete(input e.Patient) (*d.Data, error) { + evt := pl.Event{ + Feature: "Delete", + Source: source, + } + pl.SetLogInfo(&evt, input, "started", "delete") + + // get patient link from database + patientLink, err := ReadDetailLinkData(input.Id) + if err != nil { + return nil, err + } + _, err = send(http.MethodDelete, fmt.Sprintf("%s%v", "patient/", patientLink.Simx_Id), nil, *input.RegisteredBy_User_Name) + if err != nil { + return nil, err + } + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: input.ToResponse(), + }, nil +} + +func send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) { + var url string = cfg.O.NewHost + endpoint + var reader io.Reader = nil + if body != nil { + reader = body + } + req, err := http.NewRequest(method, url, reader) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-Sync-Source", cfg.O.OldSource) + req.Header.Set("X-Sync-SecretKey", cfg.O.NewSecretKey) + req.Header.Set("X-Sync-UserName", username) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + respBody, _ := io.ReadAll(resp.Body) + return respBody, nil +} diff --git a/internal/use-case/simgos-sync-use-case/old/patient/helper.go b/internal/use-case/simgos-sync-use-case/old/patient/helper.go new file mode 100644 index 00000000..2d89bff9 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/old/patient/helper.go @@ -0,0 +1,69 @@ +package patient + +import ( + "reflect" + "strings" +) + +func SetPatient(dst, src interface{}, preserve map[string]bool) { + dv := reflect.ValueOf(dst).Elem() + sv := reflect.ValueOf(src).Elem() + + for i := 0; i < dv.NumField(); i++ { + f := dv.Type().Field(i) + fieldName := f.Name + + // skip preserved fields + if preserve[fieldName] { + continue + } + + df := dv.Field(i) + sf := sv.Field(i) + if !df.CanSet() { + // skip unexported skip + continue + } + + switch df.Kind() { + + case reflect.Struct: + nestedPreserve := map[string]bool{} + + for key := range preserve { + if strings.HasPrefix(key, fieldName+".") { + nestedPreserve[strings.TrimPrefix(key, fieldName+".")] = true + } + } + + SetPatient(df.Addr().Interface(), sf.Addr().Interface(), nestedPreserve) + case reflect.Pointer: + // Check if pointer points to a struct + if df.Type().Elem().Kind() == reflect.Struct { + if sf.IsNil() { + break + } + + // If dest pointer is nil, allocate it + if df.IsNil() { + df.Set(reflect.New(df.Type().Elem())) + } + + // Recurse into struct via Elem() + nestedPreserve := map[string]bool{} + for key := range preserve { + if strings.HasPrefix(key, fieldName+".") { + nestedPreserve[strings.TrimPrefix(key, fieldName+".")] = true + } + } + + SetPatient(df.Elem().Addr().Interface(), sf.Elem().Addr().Interface(), nestedPreserve) + } + default: + // Overwrite only when src has non-zero value + if !sf.IsZero() { + df.Set(sf) + } + } + } +} diff --git a/internal/use-case/simgos-sync-use-case/old/patient/lib.go b/internal/use-case/simgos-sync-use-case/old/patient/lib.go new file mode 100644 index 00000000..d6b5f470 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/old/patient/lib.go @@ -0,0 +1,19 @@ +package patient + +import ( + esync "simrs-vx/internal/domain/sync-entities/patient" + + dg "github.com/karincake/apem/db-gorm-pg" +) + +func ReadDetailLinkData(simgosId uint) (*esync.PatientLink, error) { + // log event + var data esync.PatientLink + var tx = dg.I + + if err := tx.Where("\"Simgos_Id\" = ?", simgosId).First(&data).Error; err != nil { + return nil, err + } + // log end event + return &data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/old/patient/tycovar.go b/internal/use-case/simgos-sync-use-case/old/patient/tycovar.go new file mode 100644 index 00000000..15d99d0f --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/old/patient/tycovar.go @@ -0,0 +1,14 @@ +package patient + +import e "simrs-vx/internal/domain/main-entities/patient" + +type MainApiResp struct { + Meta MetaData `json:"meta"` + Data e.Patient `json:"data"` +} + +type MetaData struct { + Source string `json:"source"` + Status string `json:"status"` + Structure string `json:"structure"` +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/doctor/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/doctor/seeder.go new file mode 100644 index 00000000..e575c26b --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/doctor/seeder.go @@ -0,0 +1,147 @@ +package doctor + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + + pl "simrs-vx/pkg/logger" + "strconv" + + db "simrs-vx/pkg/dualtrx-helper" + + erg "simrs-vx/internal/domain/references/organization" + + eed "simrs-vx/internal/domain/main-entities/doctor" + epr "simrs-vx/internal/domain/main-entities/person" + es "simrs-vx/internal/domain/main-entities/user" + + ud "simrs-vx/internal/use-case/simgos-sync-use-case/new/doctor" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +type user struct { + Kddokter uint `gorm:"column:kddokter"` + Kdpoly uint `gorm:"column:kdpoly"` + NIP string `gorm:"column:nip"` + NamaPegawai string `gorm:"column:nama_pegawai"` +} + +func SeedDoctor(kddoc []uint, event *pl.Event, tx *db.Dualtx) error { + + log.Println("=== START SeedDoctor ===") + + var users []user + + log.Println("Querying SIMGOS doctors...") + + err := tx.Simgos. + Table("m_dokter"). + Select(` + DISTINCT ON (l.nip) + m_dokter.kddokter as kddokter, + m_dokter.kdpoly as kdpoly, + l.nip as nip, + l.nama_pegawai as nama_pegawai + `). + Joins(`LEFT JOIN m_login l ON l.kddokter = m_dokter.kddokter`). + Where(`m_dokter.kddokter IN (?)`, kddoc). + Order(`l.nip`). + Scan(&users).Error + + if err != nil { + return err + } + + log.Printf("Found %d doctors to seed\n", len(users)) + + // mapping + for i, d := range users { + log.Printf("[%d/%d] Processing doctor KdDokter=%d ...", i+1, len(users), d.Kddokter) + + kddokter := strconv.Itoa(int(d.Kddokter)) + //kdpoly := strconv.Itoa(int(d.MDokter.Kdpoly)) + nik := seeder.GenerateDummyNIK("F") + + doctorsimx := es.CreateDto{ + Name: d.NIP, + Password: "1234", + ContractPosition_Code: erg.CSCEmp, + Code: &kddokter, + Person: &epr.UpdateDto{ + CreateDto: epr.CreateDto{ + Name: d.NamaPegawai, + ResidentIdentityNumber: &nik, + }, + }, + Employee: &es.EmployeUpdateDto{ + Position_Code: erg.EPCDoc, + }, + } + + log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.NIP) + + // create user + userData, err := seeder.CreateUser(doctorsimx) + if err != nil { + log.Println("Error createUser:", err) + return err + } + + log.Printf("[%d] User created: ID=%d", i+1, userData.Id) + + log.Printf("[%d] Fetching doctor with code=%s ...", i+1, kddokter) + + // get doctor + dataDoctor, err := getDoctors(kddokter) + if err != nil { + log.Println("Error getDoctors:", err) + return err + } + + doc := *dataDoctor + ddoc := doc[0] + + log.Printf("[%d] Linking doctor %d to %s ...", i+1, ddoc.Id, kddokter) + if _, err = ud.CreateLinkData(ddoc.Id, d.Kddokter, event); err != nil { + return err + } + + log.Printf("[%d] Link created successfully.", i+1) + } + + log.Println("=== FINISH SeedDoctor ===") + + return nil + +} + +func getDoctors(code string) (*[]eed.Doctor, error) { + path := fmt.Sprintf("doctor?code=%s", code) + + resp, err := seeder.Send(http.MethodGet, path, nil, "von") + if err != nil { + return nil, err + } + + type MetaData struct { + Source string `json:"source"` + Status string `json:"status"` + Structure string `json:"structure"` + } + + type MainApiResp struct { + Meta MetaData `json:"meta"` + Data []eed.Doctor `json:"data"` + } + + // getting response + var data MainApiResp + err = json.Unmarshal(resp, &data) + if err != nil { + return nil, err + } + + return &data.Data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/helper.go b/internal/use-case/simgos-sync-use-case/seeder/helper.go new file mode 100644 index 00000000..74006fe2 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/helper.go @@ -0,0 +1,110 @@ +package seeder + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "math/rand" + "net/http" + es "simrs-vx/internal/domain/main-entities/user" + cfg "simrs-vx/internal/infra/sync-cfg" + "time" +) + +type Dto struct { + LoginNip []string `json:"loginNip"` + Instalasi_Code string `json:"instalasi_code"` +} + +func Send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) { + var url string = cfg.O.NewHost + "v1/" + endpoint + var reader io.Reader = nil + if body != nil { + reader = body + } + req, err := http.NewRequest(method, url, reader) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-Sync-Source", cfg.O.OldSource) + req.Header.Set("X-Sync-SecretKey", cfg.O.NewSecretKey) + req.Header.Set("X-Sync-UserName", username) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http status code %d", resp.StatusCode) + } + respBody, _ := io.ReadAll(resp.Body) + return respBody, nil +} + +func CreateUser(user es.CreateDto) (*es.User, error) { + var path = "user" + + // create request body + jsonUser, err := json.Marshal(user) + if err != nil { + return nil, err + } + + reqBody := bytes.NewBuffer(jsonUser) + // send data to main-api + resp, err := Send(http.MethodPost, path, reqBody, "von") + if err != nil { + return nil, err + } + + type MetaData struct { + Source string `json:"source"` + Status string `json:"status"` + Structure string `json:"structure"` + } + + type MainApiResp struct { + Meta MetaData `json:"meta"` + Data es.User `json:"data"` + } + + // getting response + var data MainApiResp + err = json.Unmarshal(resp, &data) + if err != nil { + return nil, err + } + + return &data.Data, nil +} + +func GenerateDummyNIK(gender string) string { + rand.Seed(time.Now().UnixNano()) + + // 1️⃣ Kode wilayah (6 digit) + // Bisa di-random, atau gunakan kode tetap seperti Jakarta: 317301 + region := rand.Intn(999999) // 000000 - 999999 + regionCode := fmt.Sprintf("%06d", region) + + // 2️⃣ Tanggal lahir (DDMMYY) + year := rand.Intn(30) + 70 // antara tahun 1970-1999 (bisa diganti range lain) + month := rand.Intn(12) + 1 + day := rand.Intn(28) + 1 // selalu valid + + if gender == "F" { + day += 40 // aturan NIK perempuan: tanggal lahir + 40 + } + + birth := fmt.Sprintf("%02d%02d%02d", day, month, year) + + // 3️⃣ Nomor urut (4 digit) + sequence := fmt.Sprintf("%04d", rand.Intn(9999)) + + // 4️⃣ Susun NIK akhir + nik := regionCode + birth + sequence + + return nik +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go new file mode 100644 index 00000000..5ea60fb2 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go @@ -0,0 +1,147 @@ +package nurse + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" + db "simrs-vx/pkg/dualtrx-helper" + pl "simrs-vx/pkg/logger" + "strconv" + + erg "simrs-vx/internal/domain/references/organization" + + enr "simrs-vx/internal/domain/main-entities/nurse" + epr "simrs-vx/internal/domain/main-entities/person" + es "simrs-vx/internal/domain/main-entities/user" + + el "simrs-vx/internal/domain/simgos-entities/m-login" + en "simrs-vx/internal/domain/simgos-entities/m-perawat" + + un "simrs-vx/internal/use-case/simgos-sync-use-case/new/nurse" +) + +type user struct { + el.MLogin + en.MPerawat +} + +func SeedNurse(kdnur []uint, event *pl.Event, tx *db.Dualtx) error { + + log.Println("=== START SeedNurse ===") + + var users []user + + log.Println("Querying SIMGOS nurses...") + + err := tx.Simgos. + Table("m_perawat"). + Select(` + DISTINCT ON (l.nip) + m_perawat.idperawat, + m_perawat.nama, + l.nip, + l.nama_pegawai + `). + Joins("LEFT JOIN m_login l ON l.kdperawat = m_perawat.idperawat"). + Where(`m_perawat.idperawat IN (?)`, kdnur). + Order(`l.nip`). + Scan(&users).Error + + if err != nil { + log.Println("Error Querying SIMGOS:", err) + return err + } + + log.Printf("Found %d nurses to seed\n", len(users)) + + // mapping + for i, d := range users { + log.Printf("[%d/%d] Processing nurse KdPerawat=%d ...", i+1, len(users), d.Idperawat) + + kdprawat := strconv.Itoa(int(*d.Idperawat)) + nik := seeder.GenerateDummyNIK("F") + + nursesimx := es.CreateDto{ + Name: d.MLogin.NIP, + Password: "1234", + ContractPosition_Code: erg.CSCEmp, + Code: &kdprawat, + Person: &epr.UpdateDto{ + CreateDto: epr.CreateDto{ + Name: d.NamaPegawai, + ResidentIdentityNumber: &nik, + }, + }, + Employee: &es.EmployeUpdateDto{ + Position_Code: erg.EPCNur, + }, + } + + log.Printf("[%d] Creating User for NIP=%v ...", i+1, d.MLogin.NIP) + + // create user + userData, err := seeder.CreateUser(nursesimx) + if err != nil { + log.Println("Error createUser:", err) + return err + } + + log.Printf("[%d] User created: ID=%d", i+1, userData.Id) + + log.Printf("[%d] Fetching nurse with code=%s ...", i+1, kdprawat) + + // get nurse + dataNurse, err := getNurse(kdprawat) + if err != nil { + log.Println("Error get nurses:", err) + return err + } + + data := *dataNurse + ddata := data[0] + + log.Printf("[%d] Linking nurse %d to %s ...", i+1, ddata.Id, kdprawat) + if _, err := un.CreateLinkData(ddata.Id, *d.Idperawat, event); err != nil { + return err + } + + log.Printf("[%d] Link created successfully.", i+1) + } + + log.Println("=== FINISH Seednurse ===") + + return nil + +} + +func getNurse(code string) (*[]enr.Nurse, error) { + path := fmt.Sprintf("nurse?code=%s", code) + + resp, err := seeder.Send(http.MethodGet, path, nil, "von") + if err != nil { + return nil, err + } + + type MetaData struct { + Source string `json:"source"` + Status string `json:"status"` + Structure string `json:"structure"` + } + + type MainApiResp struct { + Meta MetaData `json:"meta"` + Data []enr.Nurse `json:"data"` + } + + // getting response + var data MainApiResp + err = json.Unmarshal(resp, &data) + if err != nil { + return nil, err + } + + return &data.Data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/regular/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/regular/seeder.go new file mode 100644 index 00000000..1ef0c292 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/regular/seeder.go @@ -0,0 +1,57 @@ +package regular + +import ( + "log" + erg "simrs-vx/internal/domain/references/organization" + + epr "simrs-vx/internal/domain/main-entities/person" + es "simrs-vx/internal/domain/main-entities/user" + + el "simrs-vx/internal/domain/simgos-entities/m-login" + + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +func SeedRegular(regLogin []el.MLogin, instalasiCode string) error { + + log.Println("=== START SeedRegular ===") + + // mapping + for i, d := range regLogin { + log.Printf("[%d/%d] Processing Regular NIP=%s ...", i+1, len(regLogin), d.NIP) + + nik := seeder.GenerateDummyNIK("F") + + regularsimx := es.CreateDto{ + Name: d.NIP, + Password: "1234", + ContractPosition_Code: erg.CSCEmp, + Installation_Code: &instalasiCode, + Person: &epr.UpdateDto{ + CreateDto: epr.CreateDto{ + Name: d.NamaPegawai, + ResidentIdentityNumber: &nik, + }, + }, + Employee: &es.EmployeUpdateDto{ + Position_Code: erg.EPCReg, + }, + } + + log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.NIP) + + // create user + userData, err := seeder.CreateUser(regularsimx) + if err != nil { + log.Println("Error createUser:", err) + return err + } + + log.Printf("[%d] User created: ID=%d", i+1, userData.Id) + } + + log.Println("=== FINISH SeedRegular ===") + + return nil + +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go new file mode 100644 index 00000000..49f59b99 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go @@ -0,0 +1,94 @@ +package seeder + +import ( + "log" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/regular" + + db "simrs-vx/pkg/dualtrx-helper" + pl "simrs-vx/pkg/logger" + + d "github.com/karincake/dodol" + + el "simrs-vx/internal/domain/simgos-entities/m-login" + + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +const source = "seeder" + +func SeedToSimx(input seeder.Dto) (*d.Data, error) { + event := pl.Event{ + Feature: "Seeder", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + var ( + tx = db.NewTx() + mlogin, regLogin []el.MLogin + kddokter, kdperawat []uint + ) + + // Get M_login + err := tx.Simgos.Model(&el.MLogin{}). + Select(`DISTINCT ON (nip) m_login.*`). + Where(`"nip" IN (?)`, input.LoginNip). + Find(&mlogin).Error + if err != nil { + log.Println("Error Querying Mlogin:", err) + return nil, err + } + + // SET data + if len(mlogin) > 0 { + for _, l := range mlogin { + if l.KdDokter != 0 { + kddokter = append(kddokter, l.KdDokter) + continue + } + + if l.KdPerawat != 0 { + kdperawat = append(kdperawat, l.KdPerawat) + continue + } + + regLogin = append(regLogin, l) + } + } + + // Seed based on role + if len(kddokter) > 0 { + err = doctor.SeedDoctor(kddokter, &event, tx) + if err != nil { + return nil, err + } + } + + if len(kdperawat) > 0 { + err = nurse.SeedNurse(kdperawat, &event, tx) + if err != nil { + return nil, err + } + } + + if len(regLogin) > 0 { + err = regular.SeedRegular(regLogin, input.Instalasi_Code) + if err != nil { + return nil, err + } + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + }, nil +} diff --git a/pkg/dualtrx-helper/dualtrx-helper.go b/pkg/dualtrx-helper/dualtrx-helper.go index 2f16203c..144337c5 100644 --- a/pkg/dualtrx-helper/dualtrx-helper.go +++ b/pkg/dualtrx-helper/dualtrx-helper.go @@ -11,9 +11,12 @@ type Dualtx struct { } func NewDualtx() *Dualtx { + simgosTx := dg.IS["simrs"].Begin() + simgosTx.Exec(`SET LOCAL simx.sync_source = 'new'`) + return &Dualtx{ Sync: dg.I.Begin(), - Simgos: dg.IS["simrs"].Begin(), + Simgos: simgosTx, } } diff --git a/pkg/pdf-helper/pdf-helper.go b/pkg/pdf-helper/pdf-helper.go index 9878ecbd..9b1dc129 100644 --- a/pkg/pdf-helper/pdf-helper.go +++ b/pkg/pdf-helper/pdf-helper.go @@ -33,6 +33,9 @@ func (r *RequestPdf) ParseTemplate(templatePath string, data interface{}) error "nl2br": func(text string) template.HTML { return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "
", -1)) }, + "safeHTML": func(text string) template.HTML { + return template.HTML(text) + }, } t, err := template.New(fileName).Funcs(funcs).ParseFiles(templatePath) if err != nil {