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 }} |
+
+
+
+
+
+
+ | NO |
+ Tanggal/jam |
+
+ Implementasi, Monitoring, Fasilitasi, koordinasi, komunikasi dan kolaborasi,
+ advokasi, hasil pelayanan, Terminasi
+ |
+ MPP |
+
+
+ {{ range .FormB }}
+
+ | {{ .Number }} |
+ {{ .Date }} |
+
+
+ {{ .Value }}
+ |
+
+
+ {{ .Employee_Name }}
+ |
+
+ {{ end }}
+
+
+
+
+
+
+
\ 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
+
+
+
+
+
+
+
+
+ |
+
+
+ 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
+ |
+
+
+ |
+
+
+
+
+
+
+
+ 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
+
+
+
+
+
+
+
+
+ |
+
+
+ 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
+
+
+
+
+
+
+
+
+ |
+
+
+ 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 Pasien |
+ No. 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 {