Merge branch 'dev' into feat/things-munaja

This commit is contained in:
2025-11-24 05:13:20 +07:00
176 changed files with 11406 additions and 816 deletions
+147
View File
@@ -0,0 +1,147 @@
<html>
<head>
<meta charset="UTF-8" />
<style>
body {
padding: 10px 30px;
}
table {
width: 100%;
border-collapse: collapse
}
.border-table,
.border-table td,
.border-table th {
border: 1px solid black;
}
.section-title {
margin-top: 1rem;
margin-bottom: 0rem;
}
td {
vertical-align: top;
}
@page {
size: 148mm 210mm;
}
</style>
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.4">
<table style="margin-top: 1rem;">
<tr>
<td>
<img src="logo-1.png" alt="logo" style="height: 70px; margin-bottom: 20px;" />
</td>
<td>
<div>
SURAT RENCANA KONTROL
</div>
<div>
RSUD dr. Saiful Anwar
</div>
</td>
<td style="text-align: right;">
No. : {{ .Number }}
</td>
</tr>
<tr>
<td>
<div>
Kepada Yth
</div>
</td>
<td>
<div>
{{ .Doctor_Name }}
</div>
<div>
Sp./Sub. {{ .DstUnit_Name }}
</div>
</td>
</tr>
</table>
<div style="margin-top: 1rem;">
Mohon Pemeriksaan dan Penanganan Lebih Lanjut:
</div>
<table style="margin-top: 1rem;">
<tr>
<td style="width: 9rem;">
No.Kartu
</td>
<td style="width: 10px;">:</td>
<td>
{{ .CardNumber }}
</td>
</tr>
<tr>
<td>
Nama Peserta
</td>
<td>: </td>
<td>
{{ .Name }}
</td>
</tr>
<tr>
<td>
Tgl.Lahir
</td>
<td>: </td>
<td>
{{ .BirthDate }}
</td>
</tr>
<tr>
<td>
Diagnosa
</td>
<td>: </td>
<td>
{{ .Diagnose }}
</td>
</tr>
<tr>
<td>
Rencana Kontrol
</td>
<td>: </td>
<td>
{{ .PlanDate }}
</td>
</tr>
</table>
<div style="margin: 1rem 0;">
Demikian atas bantuannya, diucapkan banyak terima kasih.
</div>
<table style="width:100%">
<tbody>
<tr>
<td style="width:20%"></td>
<td></td>
<td style="width:20%; text-align: center;">Mengetahui:</td>
</tr>
<tr>
<td style="height:100px"></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Tgl. Cetak: {{ .PrintDate }}</td>
<td></td>
<td style="text-align: center;">{{ .ResponsibleDoctor_Name }}</td>
</tr>
</tbody>
</table>
<div style="height: 3rem;"></div>
</body>
</html>
+325
View File
@@ -0,0 +1,325 @@
<html>
<head>
<meta charset="UTF-8" />
<title>General Consent</title>
</head>
<body
style="font-family: Arial, sans-serif; font-size: 12px; line-height: 1.4"
>
<table style="width: 100%; border-collapse: collapse">
<tr>
<td style="text-align: center">
<img src="logo-1.png" alt="logo" style="height: 70px" />
</td>
<td style="text-align: center">
<div style="font-size: 14px; font-weight: bold">
PEMERINTAH PROVINSI JAWA TIMUR
</div>
<div style="font-size: 14px; font-weight: bold">
RUMAH SAKIT UMUM DAERAH Dr. SAIFUL ANWAR
</div>
<div style="font-size: 13px">
TERAKREDITASI KARS VERSI 2012 TINGKAT PARIPURNA
</div>
<div style="margin-top: 8px">
Jl. Jaksa Agung Suprapto No. 2 MALANG 65111
</div>
<div>Telp. (0341) 362101, Fax. (0341) 362110</div>
<div>Email: rsu-drsaifulanwar@jatimprov.go.id</div>
<div>Website: www.rsudsaifulanwar.jatimprov.go.id</div>
</td>
<td style="text-align: center">
<img src="logo-rssa.png" alt="logo" style="height: 70px" />
</td>
</tr>
</table>
<hr style="margin: 20px 0" />
<div
style="
text-align: center;
font-weight: bold;
font-size: 14px;
margin-bottom: 5px;
"
>
FORMULIR PEMBERIAN INFORMASI DAN PERSETUJUAN UMUM
</div>
<div style="text-align: center; font-size: 12px; margin-bottom: 20px">
(GENERAL CONSENT)
</div>
<table style="width: 100%; border-collapse: collapse">
<tr>
<td style="width: 3%; vertical-align: top; padding: 6px 4px">1.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Hak dan Kewajiban sebagai pasien :</b>
Dengan menandatangani dokumen ini saya mengakui bahwa pada proses
pendaftaran untuk mendapatkan perawatan di RSUD Dr. Saiful Anwar telah
mendapatkan informasi tentang hak dan kewajiban saya sebagai pasien
(melalui leaflet/banner dan atau petugas). Saya berhak mendapatkan
pelayanan kesehatan sesuai standar, mendapatkan informasi yang cukup
tentang keadaan kesehatan, rencana tindakan, manfaat, risiko,
alternatif tindakan, serta biaya yang akan timbul. Saya berkewajiban
memberikan informasi kesehatan yang jujur dan lengkap kepada tenaga
kesehatan, mematuhi aturan rumah sakit, serta memenuhi kewajiban
pembayaran sesuai ketentuan yang berlaku.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">2.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Persetujuan Pelayanan :</b>
Saya menyetujui dan memberikan persetujuan untuk dirawat di RSUD Dr.
Saiful Anwar dan dengan ini saya meminta dan memberikan kuasa kepada
RSUD Dr. Saiful Anwar, dokter dan perawat serta tenaga kesehatan
lainnya untuk memberikan asuhan keperawatan, pemeriksaan fisik yang
dilakukan oleh dokter dan perawat dan melakukan prosedur diagnostik
radiologi dan/atau terapi dan tata laksana sesuai pertimbangan dokter
yang diperlukan atau disarankan pada perawatan saya. Hal ini mencakup
seluruh pemeriksaan dan prosedur diagnostik rutin termasuk X-ray,
pemberian dan/atau tindakan medis serta penyuntikan (intramuskular,
intravena dan prosedur invasif lainnya), produk farmasi dan
obat-obatan, pemasangan alat kesehatan (kecuali yang membutuhkan
persetujuan khusus/tertulis) dan pengambilan darah untuk pemeriksaan
laboratorium atau pemeriksaan patologi.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">3.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Akses Informasi Kesehatan :</b>
Saya memberi kuasa kepada setiap dan seluruh orang yang merawat saya
untuk memeriksa dan/atau memberitahukan informasi kesehatan saya
kepada pemberi kesehatan lain yang turut merawat saya selama di rumah
sakit ini, sesuai kebutuhan pelayanan.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">4.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Rahasia Kedokteran :</b>
Saya setuju RSUD Dr. Saiful Anwar Malang wajib menjamin kerahasiaan
informasi medis saya baik untuk kepentingan perawatan dan pengobatan,
pendidikan maupun penelitian, sesuai ketentuan yang berlaku.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">5.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Membuka Rahasia Kedokteran :</b>
Saya setuju untuk membuka rahasia kedokteran terkait dengan kondisi
kesehatan, asuhan dan pengobatan yang saya terima kepada:
<br /><span style="margin-left: 10px"
>a) Dokter dan tenaga kesehatan lain yang turut merawat/memberikan
asuhan kepada saya;</span
>
<br /><span style="margin-left: 10px"
>b) Perusahaan asuransi kesehatan atau perusahaan lainnya atau pihak
lain yang menjamin pembiayaan saya;</span
>
<br /><span style="margin-left: 10px"
>c) Anggota keluarga saya :
{{ if eq (len .Relatives) 0 }}
..........................................
{{ else }}
<ul style="margin:0; padding-left:40px;">
{{ range $i, $name := .Relatives }}
{{ if lt $i 2 }}
<li>{{ $name }}</li>
{{ end }}
{{ end }}
</ul>
{{ end }}</span
>
<br />Saya memahami bahwa pembukaan rahasia ini hanya sejauh yang
diperlukan untuk tujuan perawatan, pembiayaan atau administrasi yang
terkait.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">6.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Privasi :</b>
Saya memberi kuasa kepada RSUD Dr. Saiful Anwar Malang untuk menjaga
privasi dan kerahasiaan penyakit saya selama dalam perawatan, serta
membatasi akses terhadap informasi yang tidak berkepentingan.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">7.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Barang Pribadi :</b>
Saya setuju untuk tidak membawa barang-barang berharga yang tidak
diperlukan (seperti perhiasan, elektronik, dll) selama dalam perawatan
di RSUD Dr. Saiful Anwar. Jika saya tetap membawa dan terjadi
kehilangan, kerusakan atau pencurian, maka RSUD Dr. Saiful Anwar tidak
bertanggung jawab atas hal tersebut, kecuali bila ada perjanjian
tertulis yang menyatakan lain.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">8.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Pengajuan Keluhan :</b>
Saya menyatakan bahwa saya telah menerima informasi tentang adanya
tata cara mengajukan dan mengatasi keluhan terkait pelayanan medik
yang diberikan terhadap diri saya. Saya setuju untuk mengikuti tata
cara pengajuan keluhan sesuai prosedur yang ada di rumah sakit.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">9.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Kewajiban Pembayaran :</b>
Saya menyatakan setuju, baik sebagai wali ataupun sebagai pasien,
bahwa sesuai pertimbangan pelayanan yang diberikan kepada pasien, maka
saya wajib untuk membayar total biaya pelayanan sesuai acuan biaya dan
ketentuan RSUD Dr. Saiful Anwar Malang dengan jaminan atau pribadi.
Apabila asuransi kesehatan swasta atau program pemerintah menanggung
pembiayaan saya, saya memberi wewenang kepada rumah sakit untuk
memberi tagihan dari semua pelayanan dan tindakan medis yang
diberikan. Tanggungan Asuransi saya mungkin menyatakan bahwa sebagian
pembayaran tetap menjadi tanggung jawab pribadi saya atau tidak
ditanggung oleh asuransi, maka rumah sakit berwenang memberi tagihan
untuk biaya yang tidak ditanggung oleh asuransi dan saya bertanggung
jawab untuk membayarnya. Apabila saya tidak memberikan persetujuan,
atau dikemudian hari mencabut persetujuan saya untuk melepaskan
rahasia kedokteran saya kepada perusahaan asuransi yang saya tentukan,
maka saya pribadi bertanggung jawab untuk membayar semua pelayanan dan
tindakan medis dari RSUD Dr. Saiful Anwar Malang.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">10.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Rumah Sakit Pendidikan :</b>
Saya mengetahui bahwa RSUD Dr. Saiful Anwar merupakan rumah sakit
pendidikan yang menjadi tempat praktik klinik bagi mahasiswa
kedokteran dan profesi-profesi kesehatan lainnya, karena itu mereka
mungkin berpartisipasi dan atau terlibat dalam perawatan saya dan saya
menyetujui bahwa mereka berpartisipasi dalam perawatan saya sepanjang
di bawah supervisi dokter penanggung jawab pasien (DPJP).
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">11.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Selama Dalam Perawatan :</b>
Selama dalam perawatan saya dan keluarga saya akan mematuhi ketentuan
untuk tidak mengambil, menyimpan, mengedarkan gambar/video dokumen dan
aktivitas pelayanan selama di RS tanpa seizin rumah sakit.
</td>
</tr>
<tr>
<td style="vertical-align: top; padding: 6px 4px">12.</td>
<td style="vertical-align: top; padding: 6px 4px">
<b>Penegasan Kepercayaan :</b>
Melalui dokumen ini, saya menegaskan kembali bahwa saya mempercayakan
kepada semua tenaga kesehatan rumah sakit untuk memberikan perawatan,
diagnostik dan terapi kepada saya sebagai pasien rawat inap atau rawat
jalan atau Instalasi Gawat Darurat (IGD), termasuk semua pemeriksaan
penunjang yang dibutuhkan untuk pengobatan dan tindakan yang
diperlukan.
</td>
</tr>
</table>
<br /><br />
<div style="margin-top: 20px">
Saya menyetujui setiap pernyataan dalam formulir ini dan menandatangani
tanpa paksaan.
</div>
<table style="width: 100%; margin-top: 40px; text-align: center">
<tr>
<td>
Malang, {{ .Date }}
</td>
</tr>
</table>
<table
style="
width: 100%;
margin-top: 40px;
text-align: center;
border-collapse: collapse;
"
>
<tr style="height:160px; vertical-align:top;">
<td style="text-align:center; padding:0 10px;">
<div style="margin-top:10px; height:45px;">
Pasien/keluarga/<br>penanggung jawab
</div>
<div style="margin-top:20px; margin-bottom:20px;">
.......................................
</div>
<div style="height:20px;">
{{ .Responsible }}
</div>
</td>
<td style="text-align:center; padding:0 10px;">
<div style="margin-top:10px; height:45px;">
Pemberi Informasi
</div>
<div style="margin-top:20px; margin-bottom:20px;">
.......................................
</div>
<div style="height:20px;">
{{ .Informant }}
</div>
</td>
<td style="text-align:center; padding:0 10px;">
<div style="margin-top:10px; height:45px;">
Saksi I
</div>
<div style="margin-top:20px; margin-bottom:20px;">
.......................................
</div>
<div style="height:20px;">
{{ .Witness1 }}
</div>
</td>
<td style="text-align:center; padding:0 10px;">
<div style="margin-top:10px; height:45px;">
Saksi II
</div>
<div style="margin-top:20px; margin-bottom:20px;">
.......................................
</div>
<div style="height:20px;">
{{ .Witness2 }}
</div>
</td>
</tr>
</table>
</body>
</html>
+5 -1
View File
@@ -69,5 +69,9 @@ bpjsCfg:
baseUrl:
syncUrlCfg:
enable: false
host:
prefix: new-to-old
prefix: new-to-old
docsCfg:
path: ../../assets/docs/
@@ -0,0 +1,2 @@
-- Modify "GeneralConsent" table
ALTER TABLE "public"."GeneralConsent" ADD COLUMN "FileUrl" character varying(1024) NULL;
@@ -0,0 +1,2 @@
-- Modify "GeneralConsent" table
ALTER TABLE "public"."GeneralConsent" DROP CONSTRAINT "fk_GeneralConsent_Encounter", ADD CONSTRAINT "fk_Encounter_GeneralConsents" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION;
@@ -0,0 +1,4 @@
-- Modify "Person" table
ALTER TABLE "public"."Person" DROP CONSTRAINT "uni_Person_ResidentIdentityNumber", ALTER COLUMN "ResidentIdentityNumber" TYPE text;
-- Create index "idx_resident_identity" to table: "Person"
CREATE UNIQUE INDEX "idx_resident_identity" ON "public"."Person" ("ResidentIdentityNumber") WHERE ("DeletedAt" IS NULL);
@@ -0,0 +1,6 @@
-- Modify "Person" table
ALTER TABLE "public"."Person" DROP CONSTRAINT "uni_Person_DrivingLicenseNumber", DROP CONSTRAINT "uni_Person_PassportNumber", ALTER COLUMN "ResidentIdentityNumber" TYPE character varying(16), ALTER COLUMN "Nationality" TYPE character varying(50);
-- Create index "idx_driver_license" to table: "Person"
CREATE UNIQUE INDEX "idx_driver_license" ON "public"."Person" ("DrivingLicenseNumber") WHERE ("DeletedAt" IS NULL);
-- Create index "idx_passport" to table: "Person"
CREATE UNIQUE INDEX "idx_passport" ON "public"."Person" ("PassportNumber") WHERE ("DeletedAt" IS NULL);
@@ -0,0 +1,2 @@
-- Modify "VclaimSepPrint" table
ALTER TABLE "public"."VclaimSepPrint" DROP CONSTRAINT "fk_VclaimSepPrint_VclaimSep", ADD CONSTRAINT "fk_VclaimSep_Prints" FOREIGN KEY ("VclaimSep_Number") REFERENCES "public"."VclaimSep" ("Number") ON UPDATE NO ACTION ON DELETE NO ACTION;
@@ -0,0 +1,15 @@
-- Create "VclaimSepControlLetter" table
CREATE TABLE "public"."VclaimSepControlLetter" (
"Id" bigserial NOT NULL,
"CreatedAt" timestamptz NULL,
"UpdatedAt" timestamptz NULL,
"DeletedAt" timestamptz NULL,
"VclaimSep_Number" character varying(19) NULL,
"Number" character varying(20) NULL,
"Value" text NULL,
"FileUrl" character varying(1024) NULL,
PRIMARY KEY ("Id"),
CONSTRAINT "uni_VclaimSepControlLetter_FileUrl" UNIQUE ("FileUrl"),
CONSTRAINT "uni_VclaimSepControlLetter_Number" UNIQUE ("Number"),
CONSTRAINT "fk_VclaimSep_ControlLetters" FOREIGN KEY ("VclaimSep_Number") REFERENCES "public"."VclaimSep" ("Number") ON UPDATE NO ACTION ON DELETE NO ACTION
);
+8 -2
View File
@@ -1,4 +1,4 @@
h1:NZkNXHrJksgpcktPStE4yM6IBy+NgX8X6cY2ffSLCDU=
h1:4ab+A8iOO9wdTsRlY3sxe8ge29VhYaHMyq+qQCEN2UE=
20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k=
20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0=
20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI=
@@ -119,4 +119,10 @@ h1:NZkNXHrJksgpcktPStE4yM6IBy+NgX8X6cY2ffSLCDU=
20251113120533.sql h1:f3/U1Ve2yF2zSMhkt+xtwF8wUYfUKYwgbNeGfE37EW4=
20251114062746.sql h1:FInLaEFQByESEwFJKuKnuUSTKmcDpi3ZXaxkKwz2+D8=
20251117005942.sql h1:wD3BWrUSmo1HlW16V3lkaBkJvbAZ0fNk77te7J9NhOc=
20251120005512.sql h1:gd0rKVlIHXbOQ6J3Bl6NTiZ6fF3GQdobgAUVXW455wI=
20251117075427.sql h1:TqU9VKZa3I8YNXUGQWY3WVBYN+1FvyyaKy0hB1jgAho=
20251118074929.sql h1:p1KsWqCuR1JXA/jVO5BmOhCcaQ8clT7t0YRszAhPFbg=
20251119063438.sql h1:NVGM0X/LHD37EaPl8SNzkNiZDJ7AB1QR+LLwLh6WRdg=
20251119065730.sql h1:U5lzk1WvMB0bw3kwckou7jkEt4bwdYItwHr2Vxqe7w4=
20251119072302.sql h1:qCuI2WMEMF/XNbjV+RXPjBnuCKLu1Fia+mR9HiLWBIs=
20251119072450.sql h1:Xg+bTwqGyKPNFEQhJylvpz1wifdfmDJvcAq6vmNf0Ng=
20251120005512.sql h1:Ek6qpacAI/qVuTYxKno+uJyzn7s5z9pf3t7VA8gTzm4=
@@ -0,0 +1,36 @@
-- Create "UnitLink" table
CREATE TABLE "public"."UnitLink" (
"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_UnitLink_Simgos_Id" UNIQUE ("Simgos_Id"),
CONSTRAINT "uni_UnitLink_Simx_Id" UNIQUE ("Simx_Id")
);
-- Create "UnitSimgosLog" table
CREATE TABLE "public"."UnitSimgosLog" (
"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 "UnitSimxLog" table
CREATE TABLE "public"."UnitSimxLog" (
"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")
);
@@ -0,0 +1,108 @@
-- Create "DivisionLink" table
CREATE TABLE "public"."DivisionLink" (
"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_DivisionLink_Simgos_Id" UNIQUE ("Simgos_Id"),
CONSTRAINT "uni_DivisionLink_Simx_Id" UNIQUE ("Simx_Id")
);
-- Create "DivisionSimgosLog" table
CREATE TABLE "public"."DivisionSimgosLog" (
"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 "DivisionSimxLog" table
CREATE TABLE "public"."DivisionSimxLog" (
"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 "SpecialistLink" table
CREATE TABLE "public"."SpecialistLink" (
"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_SpecialistLink_Simgos_Id" UNIQUE ("Simgos_Id"),
CONSTRAINT "uni_SpecialistLink_Simx_Id" UNIQUE ("Simx_Id")
);
-- Create "SpecialistSimgosLog" table
CREATE TABLE "public"."SpecialistSimgosLog" (
"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 "SpecialistSimxLog" table
CREATE TABLE "public"."SpecialistSimxLog" (
"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 "SubspecialistLink" table
CREATE TABLE "public"."SubspecialistLink" (
"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_SubspecialistLink_Simgos_Id" UNIQUE ("Simgos_Id"),
CONSTRAINT "uni_SubspecialistLink_Simx_Id" UNIQUE ("Simx_Id")
);
-- Create "SubspecialistSimgosLog" table
CREATE TABLE "public"."SubspecialistSimgosLog" (
"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 "SubspecialistSimxLog" table
CREATE TABLE "public"."SubspecialistSimxLog" (
"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")
);
@@ -0,0 +1,36 @@
-- Create "PatientLink" table
CREATE TABLE "public"."PatientLink" (
"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_PatientLink_Simgos_Id" UNIQUE ("Simgos_Id"),
CONSTRAINT "uni_PatientLink_Simx_Id" UNIQUE ("Simx_Id")
);
-- Create "PatientSimgosLog" table
CREATE TABLE "public"."PatientSimgosLog" (
"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 "PatientSimxLog" table
CREATE TABLE "public"."PatientSimxLog" (
"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")
);
@@ -0,0 +1,36 @@
-- Create "EncounterLink" table
CREATE TABLE "public"."EncounterLink" (
"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_EncounterLink_Simgos_Id" UNIQUE ("Simgos_Id"),
CONSTRAINT "uni_EncounterLink_Simx_Id" UNIQUE ("Simx_Id")
);
-- Create "EncounterSimgosLog" table
CREATE TABLE "public"."EncounterSimgosLog" (
"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 "EncounterSimxLog" table
CREATE TABLE "public"."EncounterSimxLog" (
"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")
);
@@ -1,2 +1,6 @@
h1:8jMmMBxSEls9jaOUrpQQV0wUPlORRwJWd5g9742Z2fQ=
h1:keVmwgYtvwxSqkq+7nB0BA25JFYRAVBpBBu5eA4Q9Hw=
20251113035508.sql h1:rjDlu6yDdy5xv6nrCOr7NialrLSLT23pzduYNq29Hf0=
20251114071129.sql h1:Z0GQ5bJo3C+tplaWzxT8n3J9HLkEaVsRVp5nn7bmYow=
20251117041601.sql h1:l/RPG5mObqCSBjO4mzG+wTq2ieSycvlfOSz4czpUdWY=
20251118082246.sql h1:VFnYls2DBC8tJm2aw0iBcbWGLsKezYdOHJJV9iS7MjI=
20251118082915.sql h1:tAm67fXrH+8IJCjKbJroIqc1uQyqCnuGJnQtLmw7D20=
+1
View File
@@ -6,6 +6,7 @@ toolchain go1.24.6
require (
ariga.io/atlas-provider-gorm v0.5.6
github.com/SebastiaanKlippert/go-wkhtmltopdf v1.9.3
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/google/uuid v1.6.0
github.com/jackc/pgx/v5 v5.5.5
+2
View File
@@ -19,6 +19,8 @@ github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h
github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/SebastiaanKlippert/go-wkhtmltopdf v1.9.3 h1:vrA6+R1BMLKMTbos8jAeuBrImHPGtY4gTlcue3OIej8=
github.com/SebastiaanKlippert/go-wkhtmltopdf v1.9.3/go.mod h1:SQq4xfIdvf6WYKSDxAJc+xOJdolt+/bc1jnQKMtPMvQ=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -0,0 +1,71 @@
package vclaimsepcontrolletter
import (
ecore "simrs-vx/internal/domain/base-entities/core"
)
type CreateDto struct {
VclaimSep_Number *string `json:"vclaimSep_number"`
Number *string `json:"number" gorm:"unique;size:20"`
Value *string `json:"value"`
FileUrl *string `json:"fileUrl" gorm:"unique;size:1024"`
}
type ReadListDto struct {
FilterDto
Includes string `json:"includes"`
Sort string `json:"sort"`
Pagination ecore.Pagination
}
type FilterDto struct {
VclaimSep_Number *string `json:"vclaimSep_number"`
}
type ReadDetailDto struct {
Id *uint `json:"id"`
Number *string `json:"number"`
}
type UpdateDto struct {
Id uint `json:"id"`
CreateDto
}
type DeleteDto struct {
Id uint `json:"id"`
Number *string `json:"number"`
}
type MetaDto struct {
PageNumber int `json:"page_number"`
PageSize int `json:"page_size"`
Count int `json:"count"`
}
type ResponseDto struct {
ecore.Main
VclaimSep_Number *string `json:"vclaimSep_number"`
Number *string `json:"number"`
Value *string `json:"value"`
FileUrl *string `json:"fileUrl"`
}
func (d VclaimSepControlLetter) ToResponse() ResponseDto {
resp := ResponseDto{
VclaimSep_Number: d.VclaimSep_Number,
Number: d.Number,
Value: d.Value,
FileUrl: d.FileUrl,
}
resp.Main = d.Main
return resp
}
func ToResponseList(data []VclaimSepControlLetter) []ResponseDto {
resp := make([]ResponseDto, len(data))
for i, u := range data {
resp[i] = u.ToResponse()
}
return resp
}
@@ -0,0 +1,13 @@
package vclaimsepcontrolletter
import (
ecore "simrs-vx/internal/domain/base-entities/core"
)
type VclaimSepControlLetter struct {
ecore.Main
VclaimSep_Number *string `json:"vclaimSep_number"`
Number *string `json:"number" gorm:"unique;size:20"`
Value *string `json:"value"`
FileUrl *string `json:"fileUrl" gorm:"unique;size:1024"`
}
@@ -2,12 +2,10 @@ package vclaimsepprint
import (
ecore "simrs-vx/internal/domain/base-entities/core"
evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep"
)
type VclaimSepPrint struct {
ecore.Main
VclaimSep_Number *string `json:"vclaimSep_number"`
VclaimSep *evs.VclaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"`
Counter *uint `json:"counter"`
VclaimSep_Number *string `json:"vclaimSep_number"`
Counter *uint `json:"counter"`
}
@@ -2,10 +2,14 @@ package vclaimsep
import (
ecore "simrs-vx/internal/domain/base-entities/core"
evscl "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
evsp "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print"
)
type VclaimSep struct {
ecore.Main
Encounter_Id *uint `json:"encounter_id"`
Number *string `json:"number" gorm:"unique;size:19"`
Encounter_Id *uint `json:"encounter_id"`
Number *string `json:"number" gorm:"unique;size:19"`
Prints []*evsp.VclaimSepPrint `json:"prints,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"`
ControlLetters []*evscl.VclaimSepControlLetter `json:"controlLetters,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"`
}
@@ -24,9 +24,11 @@ type FilterDto struct {
AntibioticSrc_Id *uint `json:"mcu-src-id"`
Result *string `json:"result"`
Status_Code erc.DataStatusCode `json:"status-code"`
Includes string `json:"includes"`
}
type ReadDetailDto struct {
Id uint `json:"id"`
Id uint `json:"id"`
Includes string `json:"includes"`
}
type UpdateDto struct {
@@ -6,6 +6,7 @@ import (
)
type CreateDto struct {
Id *uint `json:"id"`
Code string `json:"code" validate:"maxLength=10"`
Name string `json:"name" validate:"maxLength=50"`
Parent_Code *string `json:"parent_code"`
@@ -1,7 +1,7 @@
package encounter_document
import (
eru "simrs-vx/internal/domain/references/upload"
ere "simrs-vx/internal/domain/references/encounter"
// internal - domain - base-entities
ecore "simrs-vx/internal/domain/base-entities/core"
@@ -9,12 +9,12 @@ import (
)
type CreateDto struct {
Encounter_Id *uint `json:"encounter_id"`
Type_Code eru.UploadCode `json:"type_code"`
Name string `json:"name"`
FilePath string `json:"filePath"`
Filename string `json:"-"`
Upload_Employee_Id *uint `form:"upload_employee_id"`
Encounter_Id *uint `json:"encounter_id"`
Type_Code ere.DocTypeCode `json:"type_code"`
Name string `json:"name"`
FilePath string `json:"filePath"`
Filename string `json:"-"`
Upload_Employee_Id *uint `form:"upload_employee_id"`
}
type ReadListDto struct {
@@ -24,9 +24,9 @@ type ReadListDto struct {
}
type FilterDto struct {
Encounter_Id *uint `json:"encounter-id"`
Type_Code eru.UploadCode `json:"type-code"`
Upload_Employee_Id *string `json:"encounter-document-employee-id"`
Encounter_Id *uint `json:"encounter-id"`
Type_Code ere.DocTypeCode `json:"type-code"`
Upload_Employee_Id *string `json:"encounter-document-employee-id"`
}
type ReadDetailDto struct {
@@ -51,13 +51,13 @@ type MetaDto struct {
type ResponseDto struct {
ecore.Main
Encounter_Id *uint `json:"encounter_id"`
Type_Code eru.UploadCode `json:"type_code"`
Name string `json:"name"`
FilePath *string `json:"filePath"`
FileName *string `json:"fileName"`
Upload_Employee_Id *uint `json:"upload_employee_id"`
Upload_Employee *ee.Employee `json:"upload_employee,omitempty"`
Encounter_Id *uint `json:"encounter_id"`
Type_Code ere.DocTypeCode `json:"type_code"`
Name string `json:"name"`
FilePath *string `json:"filePath"`
FileName *string `json:"fileName"`
Upload_Employee_Id *uint `json:"upload_employee_id"`
Upload_Employee *ee.Employee `json:"upload_employee,omitempty"`
}
func (d EncounterDocument) ToResponse() ResponseDto {
@@ -3,16 +3,16 @@ package encounter_document
import (
ecore "simrs-vx/internal/domain/base-entities/core"
ee "simrs-vx/internal/domain/main-entities/employee"
eru "simrs-vx/internal/domain/references/upload"
ere "simrs-vx/internal/domain/references/encounter"
)
type EncounterDocument struct {
ecore.Main
Encounter_Id *uint `json:"encounter_id"`
Type_Code eru.UploadCode `json:"type_code"`
Name string `json:"name"`
FilePath *string `json:"filePath"`
FileName *string `json:"fileName"`
Upload_Employee_Id *uint `json:"upload_employee_id"`
Upload_Employee *ee.Employee `json:"upload_employee,omitempty" gorm:"foreignKey:Upload_Employee_Id;references:Id"`
Encounter_Id *uint `json:"encounter_id"`
Type_Code ere.DocTypeCode `json:"type_code"`
Name string `json:"name"`
FilePath *string `json:"filePath"`
FileName *string `json:"fileName"`
Upload_Employee_Id *uint `json:"upload_employee_id"`
Upload_Employee *ee.Employee `json:"upload_employee,omitempty" gorm:"foreignKey:Upload_Employee_Id;references:Id"`
}
@@ -10,6 +10,7 @@ import (
eem "simrs-vx/internal/domain/main-entities/emergency"
ee "simrs-vx/internal/domain/main-entities/employee"
eed "simrs-vx/internal/domain/main-entities/encounter-document"
egc "simrs-vx/internal/domain/main-entities/general-consent"
eip "simrs-vx/internal/domain/main-entities/inpatient"
ei "simrs-vx/internal/domain/main-entities/insurance-company"
eir "simrs-vx/internal/domain/main-entities/internal-reference"
@@ -72,6 +73,7 @@ type Encounter struct {
Rehab *er.Basic `json:"rehab,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"`
RehabChildren *[]er.Basic `json:"rehabChildren,omitempty" gorm:"foreignKey:Parent_Encounter_Id;references:Id"`
EncounterDocuments *[]eed.EncounterDocument `json:"encounterDocuments,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"`
GeneralConsents *[]egc.GeneralConsent `json:"generalConsents,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"`
}
func (d Encounter) IsDone() bool {
@@ -0,0 +1,64 @@
package generalconsent
import (
ecore "simrs-vx/internal/domain/base-entities/core"
)
type CreateDto struct {
Encounter_Id *uint `json:"encounter_id"`
Value *string `json:"value"`
}
type ReadListDto struct {
FilterDto
Includes string `json:"includes"`
Pagination ecore.Pagination
}
type FilterDto struct {
Encounter_Id *uint `json:"encounter-id"`
}
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
Encounter_Id *uint `json:"encounter_id"`
Value *string `json:"value"`
FileUrl *string `json:"fileUrl"`
}
func (d GeneralConsent) ToResponse() ResponseDto {
resp := ResponseDto{
Encounter_Id: d.Encounter_Id,
Value: d.Value,
FileUrl: d.FileUrl,
}
resp.Main = d.Main
return resp
}
func ToResponseList(data []GeneralConsent) []ResponseDto {
resp := make([]ResponseDto, len(data))
for i, u := range data {
resp[i] = u.ToResponse()
}
return resp
}
@@ -1,13 +1,12 @@
package general_consent
package generalconsent
import (
"simrs-vx/internal/domain/base-entities/core"
ee "simrs-vx/internal/domain/main-entities/encounter"
)
type GeneralConsent struct {
core.Main
Encounter_Id *uint `json:"encounter_id" gorm:"not null"`
Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"`
Value *string `json:"value"`
Encounter_Id *uint `json:"encounter_id" gorm:"not null"`
Value *string `json:"value"`
FileUrl *string `json:"fileUrl" gorm:"size:1024"`
}
+3 -2
View File
@@ -12,7 +12,7 @@ import (
epr "simrs-vx/internal/domain/main-entities/person-relative"
erc "simrs-vx/internal/domain/references/common"
eru "simrs-vx/internal/domain/references/upload"
ere "simrs-vx/internal/domain/references/encounter"
pa "simrs-vx/internal/lib/auth"
)
@@ -28,6 +28,7 @@ type CreateDto struct {
RegisteredAt *time.Time `json:"registeredAt"`
RegisteredBy_User_Name *string `json:"registeredBy_user_name" validate:"maxLength=100"`
Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"`
Number *string `json:"number"`
pa.AuthInfo
}
@@ -68,7 +69,7 @@ type SearchDto struct {
type UploadDto struct {
Id uint `json:"-"`
Code eru.UploadCode `json:"-"`
Code ere.DocTypeCode `json:"-"`
File multipart.File `json:"-"`
FileHeader *multipart.FileHeader `json:"-"`
Filename string `json:"-"`
@@ -25,9 +25,9 @@ type Person struct {
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"`
ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"`
PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"`
DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"`
ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"uniqueIndex:idx_resident_identity,where:\"DeletedAt\" IS NULL;size:16"`
PassportNumber *string `json:"passportNumber" gorm:"uniqueIndex:idx_passport,where:\"DeletedAt\" IS NULL;size:20"`
DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"uniqueIndex:idx_driver_license,where:\"DeletedAt\" IS NULL;size:20"`
Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"`
Confidence *string `json:"confidence" gorm:"size:512"`
Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"`
@@ -8,6 +8,7 @@ import (
)
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"`
@@ -7,6 +7,7 @@ import (
)
type CreateDto struct {
Id *uint `json:"id"`
Code string `json:"code" validate:"maxLength=10"`
Name string `json:"name" validate:"maxLength=50"`
Specialist_Code *string `json:"specialist_code"`
@@ -7,6 +7,7 @@ import (
)
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"`
@@ -17,6 +17,7 @@ type (
CrudCode string
DataApprovalCode string
ProcessStatusCode string
DocFormatTypeCode string
)
const (
@@ -106,6 +107,11 @@ const (
PSCSuccess ProcessStatusCode = "success"
PSCFailed ProcessStatusCode = "failed"
DFTCPDF DocFormatTypeCode = "pdf"
DFTCTXLSX DocFormatTypeCode = "xlsx"
DFTCTCSV DocFormatTypeCode = "csv"
DFTCTXLS DocFormatTypeCode = "xls"
)
func GetDayCodes() map[DayCode]string {
@@ -1,5 +1,7 @@
package encounter
import "fmt"
type (
EncounterClassCode string
QueueStatusCode string
@@ -18,6 +20,8 @@ type (
SEPRefTypeCode string
VisitModeCode string
PolySwitchCode string
DocTypeCode string
EntityTypeCode string
)
const (
@@ -104,6 +108,23 @@ const (
PSCConsulPoly PolySwitchCode = "consul-poly" // Konsultasi Poliklinik Lain
PSCConsulExecutive PolySwitchCode = "consul-executive" // Konsultasi Antar Dokter Eksekutif
DTCPRN DocTypeCode = "person-resident-number" // Person Resident Number
DTCPDL DocTypeCode = "person-driver-license" // Person Driver License
DTCPP DocTypeCode = "person-passport" // Person Passport
DTCPFC DocTypeCode = "person-family-card" // Person Family Card
DTCMIR DocTypeCode = "mcu-item-result" // Mcu Item Result
DTCEnPatient DocTypeCode = "encounter-patient"
DTCEnSupport DocTypeCode = "encounter-support"
DTCEnOther DocTypeCode = "encounter-other"
DTCSEP DocTypeCode = "vclaim-sep" // SEP
DTCSIPP DocTypeCode = "vclaim-sipp" // SIPP
DTCGC DocTypeCode = "general-consent"
DTCVSCL DocTypeCode = "vclaim-control-letter" // vclaim control letter
ETCPerson EntityTypeCode = "person"
ETCEncounter EntityTypeCode = "encounter"
ETCMCU EntityTypeCode = "mcu"
)
func (ec EncounterClassCode) Code() string {
@@ -118,3 +139,30 @@ func (ec EncounterClassCode) Code() string {
return "UNKNOWN"
}
}
var validUploadCodesByEntity = map[EntityTypeCode][]DocTypeCode{
ETCPerson: {
DTCPRN, DTCPDL, DTCPP, DTCPFC,
},
ETCEncounter: {
DTCSEP, DTCSIPP, DTCEnPatient, DTCEnSupport, DTCGC, DTCEnOther,
},
ETCMCU: {
DTCMIR,
},
}
func IsValidUploadCode(entity EntityTypeCode, code DocTypeCode) (bool, string) {
allowedCodes, ok := validUploadCodesByEntity[entity]
if !ok {
return false, fmt.Sprintf("unknown entityType_code: %s", entity)
}
for _, c := range allowedCodes {
if c == code {
return true, ""
}
}
return false, fmt.Sprintf("invalid doctype_code '%s' for entityType_code '%s'", code, entity)
}
@@ -1,52 +0,0 @@
package upload
import "fmt"
type (
UploadCode string
EntityTypeCode string
)
const (
UCPRN UploadCode = "person-resident-number" // Person Resident Number
UCPDL UploadCode = "person-driver-license" // Person Driver License
UCPP UploadCode = "person-passport" // Person Passport
UCPFC UploadCode = "person-family-card" // Person Family Card
UCMIR UploadCode = "mcu-item-result" // Mcu Item Result
UCEnPatient UploadCode = "encounter-patient"
UCEnSupport UploadCode = "encounter-support"
UcEnOther UploadCode = "encounter-other"
UCSEP UploadCode = "vclaim-sep" // SEP
UCSIPP UploadCode = "vclaim-sipp" // SIPP
ETCPerson EntityTypeCode = "person"
ETCEncounter EntityTypeCode = "encounter"
ETCMCU EntityTypeCode = "mcu"
)
var validUploadCodesByEntity = map[EntityTypeCode][]UploadCode{
ETCPerson: {
UCPRN, UCPDL, UCPP, UCPFC,
},
ETCEncounter: {
UCSEP, UCSIPP, UCEnPatient, UCEnSupport, UcEnOther,
},
ETCMCU: {
UCMIR,
},
}
func IsValidUploadCode(entity EntityTypeCode, code UploadCode) (bool, string) {
allowedCodes, ok := validUploadCodesByEntity[entity]
if !ok {
return false, fmt.Sprintf("unknown entityType_code: %s", entity)
}
for _, c := range allowedCodes {
if c == code {
return true, ""
}
}
return false, fmt.Sprintf("invalid upload_code '%s' for entityType_code '%s'", code, entity)
}
@@ -0,0 +1,18 @@
package division
type MUnit struct {
KodeUnit uint `json:"kode_unit" gorm:"primaryKey;autoIncrement;column:kode_unit"`
NamaUnit string `json:"nama_unit" gorm:"column:nama_unit"`
GrupUnit uint `json:"grup_unit" gorm:"column:grup_unit"`
NamaGrupunit string `json:"nama_grupunit" gorm:"column:nama_grupunit"`
PendapatanUnit string `json:"pendapatan_unit" gorm:"column:pendapatan_unit"`
Smf *string `json:"smf" gorm:"column:smf"`
HaveSubspecialis *uint `json:"have_subspecialis" gorm:"column:have_subspecialis"`
KelSmfTarif *string `json:"kel_smf_tarif" gorm:"column:kel_smf_tarif"`
IsPilihSatker *uint `json:"is_pilih_satker" gorm:"column:is_pilih_satker"`
NamaTempatlayanan string `json:"nama_tempatlayanan" gorm:"column:nama_tempatlayanan"`
}
func (MUnit) TableName() string {
return "m_unit"
}
@@ -0,0 +1,90 @@
package encounter
import "time"
type TPendaftaran struct {
Nomr string `json:"nomr" gorm:"column:nomr"`
Tglreg *time.Time `json:"tglreg" gorm:"column:tglreg"`
Kddokter uint `json:"kddokter" gorm:"column:kddokter"`
Kdpoly uint `json:"kdpoly" gorm:"column:kdpoly"`
Subspesialis *uint `json:"subspesialis" gorm:"column:subspesialis"`
Kdrujuk uint `json:"kdrujuk" gorm:"column:kdrujuk"`
Kdcarabayar uint `json:"kdcarabayar" gorm:"column:kdcarabayar"`
Nojaminan string `json:"nojaminan" gorm:"column:nojaminan"`
Shift uint `json:"shift" gorm:"column:shift"`
Status uint `json:"status" gorm:"column:status"`
KeteranganStatus *uint `json:"keterangan_status" gorm:"column:keterangan_status"`
Pasienbaru uint `json:"pasienbaru" gorm:"column:pasienbaru"`
Nip string `json:"nip" gorm:"column:nip"`
Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"`
Masukpoly *time.Time `json:"masukpoly" gorm:"column:masukpoly"`
Keluarpoly *time.Time `json:"keluarpoly" gorm:"column:keluarpoly"`
Ketrujuk string `json:"ketrujuk" gorm:"column:ketrujuk"`
Ketbayar string `json:"ketbayar" gorm:"column:ketbayar"`
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"`
Jamreg *time.Time `json:"jamreg" gorm:"column:jamreg"`
MintaRujukan string `json:"minta_rujukan" gorm:"column:minta_rujukan"`
Batal *string `json:"batal" gorm:"column:batal"`
NoSjp *string `json:"no_sjp" gorm:"column:no_sjp"`
NoPeserta *string `json:"no_peserta" gorm:"column:no_peserta"`
Nokartu string `json:"nokartu" gorm:"column:nokartu"`
Norujukan string `json:"norujukan" gorm:"column:norujukan"`
Tglrujukan *time.Time `json:"tglrujukan" gorm:"column:tglrujukan"`
DiagnosaAwal string `json:"diagnosa_awal" gorm:"column:diagnosa_awal"`
Nosep string `json:"nosep" gorm:"column:nosep"`
DiagnosaUtama string `json:"diagnosa_utama" gorm:"column:diagnosa_utama"`
KelasDaftar uint `json:"kelas_daftar" gorm:"column:kelas_daftar"`
KelasRawat *uint `json:"kelas_rawat" gorm:"column:kelas_rawat"`
TglKelasDaftar *time.Time `json:"tgl_kelas_daftar" gorm:"column:tgl_kelas_daftar"`
TglKelasRawat *time.Time `json:"tgl_kelas_rawat" gorm:"column:tgl_kelas_rawat"`
UserKelasDaftar *string `json:"user_kelas_daftar" gorm:"column:user_kelas_daftar"`
UserKelasRawat *string `json:"user_kelas_rawat" gorm:"column:user_kelas_rawat"`
StAsalMasuk string `json:"st_asal_masuk" gorm:"column:st_asal_masuk"`
StatusKecelakaan string `json:"status_kecelakaan" gorm:"column:status_kecelakaan"`
Catatan string `json:"catatan" gorm:"column:catatan"`
NoAntrian *string `json:"no_antrian" gorm:"column:no_antrian"`
StPelayanan *uint `json:"st_pelayanan" gorm:"column:st_pelayanan"`
PetugasKlinik string `json:"petugas_klinik" gorm:"column:petugas_klinik"`
Strujukan uint `json:"strujukan" gorm:"column:strujukan"`
IdPatientEklaim *uint `json:"id_patient_eklaim" gorm:"column:id_patient_eklaim"`
HakKelas *uint `json:"hak_kelas" gorm:"column:hak_kelas"`
SttsKtp string `json:"stts_ktp" gorm:"column:stts_ktp"`
StMeninggal *uint `json:"st_meninggal" gorm:"column:st_meninggal"`
DtMeninggal *time.Time `json:"dt_meninggal" gorm:"column:dt_meninggal"`
SebabMati1 *string `json:"sebab_mati_1" gorm:"column:sebab_mati_1"`
SebabMati2 *string `json:"sebab_mati_2" gorm:"column:sebab_mati_2"`
SebabMati3 *string `json:"sebab_mati_3" gorm:"column:sebab_mati_3"`
IcdMati1 *string `json:"icd_mati_1" gorm:"column:icd_mati_1"`
IcdMati2 *string `json:"icd_mati_2" gorm:"column:icd_mati_2"`
IcdMati3 *string `json:"icd_mati_3" gorm:"column:icd_mati_3"`
KeteranganLain *string `json:"keterangan_lain" gorm:"column:keterangan_lain"`
DokumenPendukung *string `json:"dokumen_pendukung" gorm:"column:dokumen_pendukung"`
NoKunjung uint `json:"no_kunjung" gorm:"column:no_kunjung"`
KdJamin *uint `json:"kd_jamin" gorm:"column:kd_jamin"`
NamaJamin *string `json:"nama_jamin" gorm:"column:nama_jamin"`
SepFile string `json:"sep_file" gorm:"column:sep_file"`
JenisFaskes *string `json:"jenis_faskes" gorm:"column:jenis_faskes"`
Nosipp *string `json:"nosipp" gorm:"column:nosipp"`
SippFile *string `json:"sipp_file" gorm:"column:sipp_file"`
Nosurkon *string `json:"nosurkon" gorm:"column:nosurkon"`
NomorBarcode *string `json:"nomor_barcode" gorm:"column:nomor_barcode"`
BarcodeCode *string `json:"barcode_code" gorm:"column:barcode_code"`
PartialType *string `json:"partial_type" gorm:"column:partial_type"`
IsPartial *uint `json:"is_partial" gorm:"column:is_partial"`
IsPenunjang *uint `json:"is_penunjang" gorm:"column:is_penunjang"`
TindakanCode *string `json:"tindakan_code" gorm:"column:tindakan_code"`
StatusSep *uint `json:"status_sep" gorm:"column:status_sep"`
PoliNameHfis *string `json:"poli_name_hfis" gorm:"column:poli_name_hfis"`
SpesialisIdHfis *string `json:"spesialis_id_hfis" gorm:"column:spesialis_id_hfis"`
DokterNameHfis *string `json:"dokter_name_hfis" gorm:"column:dokter_name_hfis"`
DokterIdHfis *string `json:"dokter_id_hfis" gorm:"column:dokter_id_hfis"`
StatusBridging *string `json:"status_bridging" gorm:"column:status_bridging"`
NoSpri *string `json:"no_spri" gorm:"column:no_spri"`
}
func (TPendaftaran) TableName() string {
return "t_pendaftaran"
}
@@ -0,0 +1,80 @@
package patient
import "time"
type MPasien 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 *time.Time `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 *time.Time `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 string `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 (MPasien) TableName() string {
return "m_pasien"
}
@@ -0,0 +1,15 @@
package division
type MPolihfis struct {
Id uint `json:"id" gorm:"primaryKey;autoIncrement;column:id"`
Code string `json:"code" gorm:"column:code"`
Poliklinik string `json:"poliklinik" gorm:"column:poliklinik"`
CodePolirs string `json:"code_polirs" gorm:"column:code_polirs"`
Poliklinikrs string `json:"poliklinikrs" gorm:"column:poliklinikrs"`
Active uint `json:"active" gorm:"column:active"`
Status uint `json:"status" gorm:"column:status"`
}
func (MPolihfis) TableName() string {
return "m_polihfis"
}
@@ -0,0 +1,11 @@
package unit
type MPloy struct {
Kode uint `json:"kode" gorm:"primaryKey;autoIncrement;column:kode"`
Nama string `json:"nama" gorm:"column:nama"`
Jenispoly uint `json:"jenispoly" gorm:"column:jenispoly"`
}
func (MPloy) TableName() string {
return "m_poly"
}
@@ -0,0 +1,29 @@
package division
import (
ecore "simrs-vx/internal/domain/base-entities/core"
erc "simrs-vx/internal/domain/references/common"
"time"
)
type DivisionLink struct {
ecore.Main
Simx_Id uint `json:"simx_id" gorm:"unique"`
Simgos_Id uint `json:"simgos_id" gorm:"unique"`
}
type DivisionSimxLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
type DivisionSimgosLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
@@ -0,0 +1,31 @@
package encounter
import (
"time"
erc "simrs-vx/internal/domain/references/common"
ecore "simrs-vx/internal/domain/base-entities/core"
)
type EncounterLink struct {
ecore.Main
Simx_Id uint `json:"simx_id" gorm:"unique"`
Simgos_Id uint `json:"simgos_id" gorm:"unique"`
}
type EncounterSimxLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
type EncounterSimgosLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
@@ -0,0 +1,31 @@
package patient
import (
"time"
erc "simrs-vx/internal/domain/references/common"
ecore "simrs-vx/internal/domain/base-entities/core"
)
type PatientLink struct {
ecore.Main
Simx_Id uint `json:"simx_id" gorm:"unique"`
Simgos_Id uint `json:"simgos_id" gorm:"unique"`
}
type PatientSimxLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
type PatientSimgosLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
@@ -0,0 +1,29 @@
package specialist
import (
ecore "simrs-vx/internal/domain/base-entities/core"
erc "simrs-vx/internal/domain/references/common"
"time"
)
type SpecialistLink struct {
ecore.Main
Simx_Id uint `json:"simx_id" gorm:"unique"`
Simgos_Id uint `json:"simgos_id" gorm:"unique"`
}
type SpecialistSimxLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
type SpecialistSimgosLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
@@ -0,0 +1,29 @@
package subspecialist
import (
ecore "simrs-vx/internal/domain/base-entities/core"
erc "simrs-vx/internal/domain/references/common"
"time"
)
type SubspecialistLink struct {
ecore.Main
Simx_Id uint `json:"simx_id" gorm:"unique"`
Simgos_Id uint `json:"simgos_id" gorm:"unique"`
}
type SubspecialistSimxLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
type SubspecialistSimgosLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
@@ -0,0 +1,29 @@
package unit
import (
ecore "simrs-vx/internal/domain/base-entities/core"
erc "simrs-vx/internal/domain/references/common"
"time"
)
type UnitLink struct {
ecore.Main
Simx_Id uint `json:"simx_id" gorm:"unique"`
Simgos_Id uint `json:"simgos_id" gorm:"unique"`
}
type UnitSimxLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
type UnitSimgosLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
+17
View File
@@ -0,0 +1,17 @@
package docscfg
import a "github.com/karincake/apem"
type DocsCfg struct {
Path string
}
var O DocsCfg = DocsCfg{}
func ParseCfg() {
a.ParseSingleCfg(&O)
}
func (c DocsCfg) GetPath() string {
return c.Path
}
+1
View File
@@ -5,4 +5,5 @@ var O SyncUrlCfg = SyncUrlCfg{}
type SyncUrlCfg struct {
Prefix string `yaml:"prefix"`
Host string `yaml:"host"`
Enable bool `yaml:"enable"`
}
@@ -0,0 +1,71 @@
package mcusrccategory
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/mcu-src-category"
u "simrs-vx/internal/use-case/main-use-case/mcu-src-category"
)
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)
}
@@ -0,0 +1,71 @@
package antibioticsrc
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/antibiotic-src"
u "simrs-vx/internal/use-case/main-use-case/antibiotic-src"
)
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)
}
@@ -0,0 +1,72 @@
package generalconsent
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/general-consent"
u "simrs-vx/internal/use-case/main-use-case/general-consent"
)
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{}
sf.UrlQueryParam(&dto, *r.URL)
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 = uint(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 = uint(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,18 @@
package generatefile
import (
"net/http"
rw "github.com/karincake/risoles"
u "simrs-vx/internal/use-case/main-use-case/generate-file"
)
func Generate(w http.ResponseWriter, r *http.Request) {
dto := u.GenerateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.Generate(dto)
rw.DataResponse(w, res, err)
}
@@ -17,6 +17,8 @@ import (
deviceorderitem "simrs-vx/internal/interface/main-handler/device-order-item"
encounter "simrs-vx/internal/interface/main-handler/encounter"
encounterdocument "simrs-vx/internal/interface/main-handler/encounter-document"
generalconsent "simrs-vx/internal/interface/main-handler/general-consent"
generatefile "simrs-vx/internal/interface/main-handler/generate-file"
internalreference "simrs-vx/internal/interface/main-handler/internal-reference"
materialorder "simrs-vx/internal/interface/main-handler/material-order"
materialorderitem "simrs-vx/internal/interface/main-handler/material-order-item"
@@ -34,7 +36,7 @@ import (
responsibledoctorhist "simrs-vx/internal/interface/main-handler/responsible-doctor-hist"
sbar "simrs-vx/internal/interface/main-handler/sbar"
soapi "simrs-vx/internal/interface/main-handler/soapi"
upload "simrs-vx/internal/interface/main-handler/upload"
uploadfile "simrs-vx/internal/interface/main-handler/upload-file"
/******************** actor ********************/
authpartner "simrs-vx/internal/interface/main-handler/auth-partner"
@@ -57,6 +59,7 @@ import (
/******************** infra ********************/
ibpjs "simrs-vx/internal/infra/bpjs"
docscfg "simrs-vx/internal/infra/docs-cfg"
gs "simrs-vx/internal/infra/gorm-setting"
minio "simrs-vx/internal/infra/minio"
ssdb "simrs-vx/internal/infra/ss-db"
@@ -71,6 +74,8 @@ import (
zlc "simrs-vx/pkg/zerolog-ctx"
/******************** sources ********************/
antibioticsrc "simrs-vx/internal/interface/main-handler/antibiotic-src"
antibioticsrccat "simrs-vx/internal/interface/main-handler/antibiotic-src-category"
device "simrs-vx/internal/interface/main-handler/device"
diagnosesrc "simrs-vx/internal/interface/main-handler/diagnose-src"
division "simrs-vx/internal/interface/main-handler/division"
@@ -131,6 +136,7 @@ func SetRoutes() http.Handler {
a.RegisterExtCall(ibpjs.SetConfig)
a.RegisterExtCall(validation.RegisterValidation)
a.RegisterExtCall(simgossync.SetConfig)
a.RegisterExtCall(docscfg.ParseCfg)
r := http.NewServeMux()
@@ -146,11 +152,14 @@ func SetRoutes() http.Handler {
hc.RegCrudByCode(r, "/v1/medicine-form", medicineform.O)
hc.RegCrud(r, "/v1/medicine-mix", medicicinemix.O)
hc.RegCrud(r, "/v1/medicine-mix-item", medicicinemixitem.O)
hc.RegCrud(r, "/v1/antibiotic-src-category", antibioticsrccat.O)
hc.RegCrud(r, "/v1/antibiotic-src", antibioticsrc.O)
hc.RegCrud(r, "/v1/soapi", auth.GuardMW, soapi.O)
hc.RegCrud(r, "/v1/adime", auth.GuardMW, adime.O)
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/material-order-item", materialorderitem.O)
hk.GroupRoutes("/v1/encounter", r, auth.GuardMW, hk.MapHandlerFunc{
"GET /": encounter.O.GetList,
@@ -275,8 +284,10 @@ func SetRoutes() http.Handler {
"PATCH /{id}/reject": therapyprotocol.O.Reject,
})
hc.RegCrud(r, "/v1/chemo-protocol", chemoprotocol.O)
hc.RegCrud(r, "/v1/upload", upload.O)
hc.RegCrud(r, "/v1/upload-file", uploadfile.O)
hc.RegCrud(r, "/v1/encounter-document", encounterdocument.O)
hc.RegCrud(r, "/v1/general-consent", generalconsent.O)
r.HandleFunc("POST /v1/generate-file", generatefile.Generate)
/******************** actor ********************/
hc.RegCrud(r, "/v1/person", person.O)
@@ -1,4 +1,4 @@
package upload
package uploadfile
import (
"net/http"
@@ -7,10 +7,9 @@ import (
d "github.com/karincake/dodol"
rw "github.com/karincake/risoles"
eru "simrs-vx/internal/domain/references/upload"
ere "simrs-vx/internal/domain/references/encounter"
e "simrs-vx/internal/domain/main-entities/upload"
u "simrs-vx/internal/use-case/main-use-case/upload"
u "simrs-vx/internal/use-case/main-use-case/upload-file"
)
type myBase struct{}
@@ -49,10 +48,10 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
}
}
dto := e.CreateDto{
EntityType_Code: eru.EntityTypeCode(r.FormValue("entityType_code")),
dto := u.CreateDto{
EntityType_Code: ere.EntityTypeCode(r.FormValue("entityType_code")),
Ref_Id: refID,
Type_Code: eru.UploadCode(r.FormValue("type_code")),
Type_Code: ere.DocTypeCode(r.FormValue("type_code")),
Name: r.FormValue("name"),
Upload_Employee_Id: employeeId,
File: file,
@@ -1,10 +1,10 @@
package upload
package uploadfile
import (
e "simrs-vx/internal/domain/main-entities/upload"
u "simrs-vx/internal/use-case/main-use-case/upload-file"
)
func validateCreate(dto e.CreateDto) string {
func validateCreate(dto u.CreateDto) string {
switch {
case dto.EntityType_Code == "":
@@ -103,6 +103,7 @@ import (
///BPJS
vclaimmember "simrs-vx/internal/domain/bpjs-entities/vclaim-member"
vclaimsep "simrs-vx/internal/domain/bpjs-entities/vclaim-sep"
vclaimsepcontrolletter "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
vclaimsephist "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist"
vclaimsepprint "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print"
)
@@ -211,5 +212,6 @@ func getMainEntities() []any {
&rehab.Rehab{},
&chemoprotocol.ChemoProtocol{},
&fileattachemnt.EncounterDocument{},
&vclaimsepcontrolletter.VclaimSepControlLetter{},
}
}
+1 -1
View File
@@ -32,7 +32,7 @@ func getEntities(input string) []any {
case "satusehat":
return getSatuSehatEntities()
case "simgossync":
return getSimgosSyncEntities()
return getSyncEntities()
}
return nil
}
@@ -2,13 +2,37 @@ package migration
import (
/************** Source ***************/
division "simrs-vx/internal/domain/sync-entities/division"
encounter "simrs-vx/internal/domain/sync-entities/encounter"
installation "simrs-vx/internal/domain/sync-entities/installation"
patient "simrs-vx/internal/domain/sync-entities/patient"
specialist "simrs-vx/internal/domain/sync-entities/specialist"
subspecialist "simrs-vx/internal/domain/sync-entities/subspecialist"
unit "simrs-vx/internal/domain/sync-entities/unit"
)
func getSimgosSyncEntities() []any {
func getSyncEntities() []any {
return []any{
&installation.InstallationLink{},
&installation.InstallationSimxLog{},
&installation.InstallationSimgosLog{},
&unit.UnitLink{},
&unit.UnitSimxLog{},
&unit.UnitSimgosLog{},
&division.DivisionLink{},
&division.DivisionSimxLog{},
&division.DivisionSimgosLog{},
&specialist.SpecialistLink{},
&specialist.SpecialistSimxLog{},
&specialist.SpecialistSimgosLog{},
&subspecialist.SubspecialistLink{},
&subspecialist.SubspecialistSimxLog{},
&subspecialist.SubspecialistSimgosLog{},
&patient.PatientLink{},
&patient.PatientSimxLog{},
&patient.PatientSimgosLog{},
&encounter.EncounterLink{},
&encounter.EncounterSimxLog{},
&encounter.EncounterSimgosLog{},
}
}
@@ -0,0 +1,66 @@
package division
import (
"net/http"
rw "github.com/karincake/risoles"
// ua "github.com/karincake/tumpeng/auth/svc"
e "simrs-vx/internal/domain/main-entities/division"
esync "simrs-vx/internal/domain/sync-entities/log"
u "simrs-vx/internal/use-case/simgos-sync-use-case/division"
)
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) CreateLog(w http.ResponseWriter, r *http.Request) {
dto := esync.SimxLogDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.CreateSimxLog(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
}
val := uint16(id)
dto.Id = &val
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{}
val := uint16(id)
dto.Id = &val
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,68 @@
package patient
import (
"net/http"
rw "github.com/karincake/risoles"
// ua "github.com/karincake/tumpeng/auth/svc"
e "simrs-vx/internal/domain/main-entities/patient"
esync "simrs-vx/internal/domain/sync-entities/log"
u "simrs-vx/internal/use-case/simgos-sync-use-case/patient"
)
type myBase struct{}
var O myBase
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
dto := e.Patient{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.Create(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) CreateLog(w http.ResponseWriter, r *http.Request) {
dto := esync.SimxLogDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.CreateSimxLog(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.Patient{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint(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 = uint(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) GenerateNomr(w http.ResponseWriter, r *http.Request) {
res, err := u.GenerateNomr()
rw.DataResponse(w, res, err)
}
@@ -1,7 +1,9 @@
package simgossynchandler
import (
"fmt"
"net/http"
hc "simrs-vx/pkg/handler-crud-helper"
/******************** infra ********************/
gs "simrs-vx/internal/infra/gorm-setting"
@@ -14,11 +16,14 @@ import (
/******************** external ********************/
a "github.com/karincake/apem"
hk "github.com/karincake/hongkue"
/******************** internal ********************/
"simrs-vx/internal/interface/main-handler/home"
division "simrs-vx/internal/interface/simgos-sync-handler/division"
installation "simrs-vx/internal/interface/simgos-sync-handler/installation"
patient "simrs-vx/internal/interface/simgos-sync-handler/patient"
specialist "simrs-vx/internal/interface/simgos-sync-handler/specialist"
subspecialist "simrs-vx/internal/interface/simgos-sync-handler/subspecialist"
unit "simrs-vx/internal/interface/simgos-sync-handler/unit"
)
func SetRoutes() http.Handler {
@@ -35,12 +40,13 @@ func SetRoutes() http.Handler {
/******************** Source ******************/
prefix := "/new-to-old"
hk.GroupRoutes(prefix+"/v1/installation", r, hk.MapHandlerFunc{
"POST /": installation.O.Create,
"POST /log": installation.O.CreateLog,
"PATCH /{id}": installation.O.Update,
"DELETE /{id}": installation.O.Delete,
})
hc.SyncCrud(r, prefix+"/v1/installation", installation.O)
hc.SyncCrud(r, prefix+"/v1/unit", unit.O)
hc.SyncCrud(r, prefix+"/v1/division", division.O)
hc.SyncCrud(r, prefix+"/v1/specialist", specialist.O)
hc.SyncCrud(r, prefix+"/v1/subspecialist", subspecialist.O)
hc.SyncCrud(r, prefix+"/v1/patient", patient.O)
r.HandleFunc(fmt.Sprintf("GET %s/v1/patient-nomr-generator", prefix), patient.O.GenerateNomr)
return cmw.SetCors(handlerlogger.SetLog(r))
}
@@ -0,0 +1,66 @@
package specialist
import (
"net/http"
rw "github.com/karincake/risoles"
// ua "github.com/karincake/tumpeng/auth/svc"
e "simrs-vx/internal/domain/main-entities/specialist"
esync "simrs-vx/internal/domain/sync-entities/log"
u "simrs-vx/internal/use-case/simgos-sync-use-case/specialist"
)
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) CreateLog(w http.ResponseWriter, r *http.Request) {
dto := esync.SimxLogDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.CreateSimxLog(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
}
val := uint16(id)
dto.Id = &val
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{}
val := uint16(id)
dto.Id = &val
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,66 @@
package subspecialist
import (
"net/http"
rw "github.com/karincake/risoles"
// ua "github.com/karincake/tumpeng/auth/svc"
e "simrs-vx/internal/domain/main-entities/subspecialist"
esync "simrs-vx/internal/domain/sync-entities/log"
u "simrs-vx/internal/use-case/simgos-sync-use-case/subspecialist"
)
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) CreateLog(w http.ResponseWriter, r *http.Request) {
dto := esync.SimxLogDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.CreateSimxLog(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
}
val := uint16(id)
dto.Id = &val
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{}
val := uint16(id)
dto.Id = &val
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,66 @@
package unit
import (
"net/http"
rw "github.com/karincake/risoles"
// ua "github.com/karincake/tumpeng/auth/svc"
e "simrs-vx/internal/domain/main-entities/unit"
esync "simrs-vx/internal/domain/sync-entities/log"
u "simrs-vx/internal/use-case/simgos-sync-use-case/unit"
)
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) CreateLog(w http.ResponseWriter, r *http.Request) {
dto := esync.SimxLogDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.CreateSimxLog(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
}
val := uint16(id)
dto.Id = &val
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{}
val := uint16(id)
dto.Id = &val
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,277 @@
package vclaimsepcontrolletter
import (
"strconv"
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
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 = "vclaim-sep-control-letter"
func Create(input e.CreateDto) (*d.Data, error) {
data := e.VclaimSepControlLetter{}
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.VclaimSepControlLetter
var dataList []e.VclaimSepControlLetter
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.VclaimSepControlLetter
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{Number: input.Number}
var data *e.VclaimSepControlLetter
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{Number: input.Number}
var data *e.VclaimSepControlLetter
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
}
@@ -0,0 +1,24 @@
/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package vclaimsepcontrolletter
import (
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
)
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSepControlLetter) {
var inputSrc *e.CreateDto
if inputT, ok := any(input).(*e.CreateDto); ok {
inputSrc = inputT
} else {
inputTemp := any(input).(*e.UpdateDto)
inputSrc = &inputTemp.CreateDto
}
data.VclaimSep_Number = inputSrc.VclaimSep_Number
data.Number = inputSrc.Number
data.Value = inputSrc.Value
data.FileUrl = inputSrc.FileUrl
}
@@ -0,0 +1,148 @@
package vclaimsepcontrolletter
import (
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
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.VclaimSepControlLetter, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := e.VclaimSepControlLetter{}
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
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.VclaimSepControlLetter, *e.MetaDto, error) {
pl.SetLogInfo(event, input, "started", "DBReadList")
data := []e.VclaimSepControlLetter{}
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.VclaimSepControlLetter{}).
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.VclaimSepControlLetter, error) {
pl.SetLogInfo(event, input, "started", "DBReadDetail")
data := e.VclaimSepControlLetter{}
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
if input.Number != nil {
tx = tx.Where("\"Number\" = ?", *input.Number)
}
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
}
}
pl.SetLogInfo(event, nil, "complete")
return &data, nil
}
func UpdateData(input e.UpdateDto, data *e.VclaimSepControlLetter, 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.VclaimSepControlLetter, 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
}
@@ -0,0 +1,103 @@
package vclaimsepcontrolletter
import (
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
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.VclaimSepControlLetter) 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.VclaimSepControlLetter) 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.VclaimSepControlLetter) 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.VclaimSepControlLetter) 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.VclaimSepControlLetter) 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
}
@@ -0,0 +1,9 @@
package vclaimsepcontrolletter
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
@@ -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 vclaimsepcontrolletter
import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error
}
type readDetailMw struct {
Name string
Func func(input *e.ReadDetailDto, data *e.VclaimSepControlLetter, 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
@@ -0,0 +1,389 @@
package antibioticinuse
import (
"errors"
"strconv"
e "simrs-vx/internal/domain/main-entities/antibiotic-in-use"
ue "simrs-vx/internal/use-case/main-use-case/encounter"
umo "simrs-vx/internal/use-case/main-use-case/mcu-order"
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 = "antibiotic-in-use"
func Create(input e.CreateDto) (*d.Data, error) {
data := e.AntibioticInUse{}
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
}
// check if encounter is done
if ue.IsDone(*input.McuOrder_Id, &event, tx) {
return errors.New("encounter is already done")
}
// check if mcu-order is completed
if umo.IsCompleted(*input.McuOrder_Id, &event, tx) {
return errors.New("mcu-order is already completed")
}
// if !input.AuthInfo.IsDoctor() {
// 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)
// }
// doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx)
// if err != nil {
// return err
// }
// verify the mcu-order belongs to the same doctor
// rdDto := e.ReadDetailDto{Id: *input.McuOrder_Id}
// if err := ValidateMcuOrderDoctor(rdDto, doctor_id, &event, tx); 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.AntibioticInUse
var dataList []e.AntibioticInUse
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.AntibioticInUse
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.AntibioticInUse
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
}
// if data.IsCompleted() {
// return errors.New("data already completed")
// }
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil {
return err
}
// if !input.AuthInfo.IsDoctor() {
// 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)
// }
// doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx)
// if err != nil {
// return err
// }
// verify the mcu-order belongs to the same doctor
// if err := ValidateMcuOrderDoctor(e.ReadDetailDto{Id: *data.McuOrder_Id}, doctor_id, &event, tx); 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.AntibioticInUse
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 SetSchedule(input e.SetScheduleDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: input.Id}
var data *e.AntibioticInUse
var err error
event := pl.Event{
Feature: "SetSchedule",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "setSchedule")
err = dg.I.Transaction(func(tx *gorm.DB) error {
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
data, err = ReadDetailData(rdDto, &event, tx)
if err != nil {
return err
}
// if data.IsCompleted() {
// return errors.New("data already completed")
// }
// data.ExaminationDate = input.ExaminationDate
// 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": "setSchedule",
},
Data: data.ToResponse(),
}, nil
}
@@ -0,0 +1,56 @@
/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package antibioticinuse
import (
"errors"
e "simrs-vx/internal/domain/main-entities/antibiotic-in-use"
emo "simrs-vx/internal/domain/main-entities/mcu-order"
pl "simrs-vx/pkg/logger"
"gorm.io/gorm"
)
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.AntibioticInUse) {
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.McuOrder_Id = inputSrc.McuOrder_Id
data.AntibioticSrc_Id = inputSrc.AntibioticSrc_Id
// data.ExaminationDate = inputSrc.ExaminationDate
}
func ValidateMcuOrderDoctor(input e.ReadDetailDto, doctorId uint, event *pl.Event, tx *gorm.DB) error {
pl.SetLogInfo(event, input, "started", "ValidateMcuOrderDoctor")
var mcuOrder emo.McuOrder
if err := tx.First(&mcuOrder, input.Id).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return errors.New("mcu-order not found")
}
event.Status = "failed"
event.ErrInfo = pl.ErrorInfo{
Code: "data-get-fail",
Detail: "Failed to get mcu-order",
Raw: err,
}
return pl.SetLogError(event, input)
}
if mcuOrder.Doctor_Id == nil || *mcuOrder.Doctor_Id != doctorId {
return errors.New("doctor is not authorized for this mcu-order")
}
pl.SetLogInfo(event, nil, "complete")
return nil
}
@@ -0,0 +1,140 @@
package antibioticinuse
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-in-use"
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.AntibioticInUse, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := e.AntibioticInUse{}
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.AntibioticInUse, *e.MetaDto, error) {
pl.SetLogInfo(event, input, "started", "DBReadList")
data := []e.AntibioticInUse{}
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.AntibioticInUse{}).
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.AntibioticInUse, error) {
pl.SetLogInfo(event, input, "started", "DBReadDetail")
data := e.AntibioticInUse{}
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.AntibioticInUse, 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.AntibioticInUse, 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
}
@@ -0,0 +1,103 @@
package antibioticinuse
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-in-use"
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.AntibioticInUse) 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.AntibioticInUse) 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.AntibioticInUse) 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.AntibioticInUse) 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.AntibioticInUse) 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
}
@@ -0,0 +1,9 @@
package antibioticinuse
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
@@ -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 antibioticinuse
import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/antibiotic-in-use"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.AntibioticInUse, tx *gorm.DB) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.AntibioticInUse, tx *gorm.DB) error
}
type readDetailMw struct {
Name string
Func func(input *e.ReadDetailDto, data *e.AntibioticInUse, 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
@@ -0,0 +1,276 @@
package antibioticsrccategory
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src-category"
"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 = "antibiotic-src-category"
func Create(input e.CreateDto) (*d.Data, error) {
data := e.AntibioticSrcCategory{}
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.AntibioticSrcCategory
var dataList []e.AntibioticSrcCategory
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.AntibioticSrcCategory
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.AntibioticSrcCategory
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.AntibioticSrcCategory
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
}
@@ -0,0 +1,22 @@
/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package antibioticsrccategory
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src-category"
)
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.AntibioticSrcCategory) {
var inputSrc *e.CreateDto
if inputT, ok := any(input).(*e.CreateDto); ok {
inputSrc = inputT
} else {
inputTemp := any(input).(*e.UpdateDto)
inputSrc = &inputTemp.CreateDto
}
data.Code = inputSrc.Code
data.Name = inputSrc.Name
}
@@ -0,0 +1,140 @@
package antibioticsrccategory
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src-category"
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.AntibioticSrcCategory, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := e.AntibioticSrcCategory{}
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.AntibioticSrcCategory, *e.MetaDto, error) {
pl.SetLogInfo(event, input, "started", "DBReadList")
data := []e.AntibioticSrcCategory{}
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.AntibioticSrcCategory{}).
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.AntibioticSrcCategory, error) {
pl.SetLogInfo(event, input, "started", "DBReadDetail")
data := e.AntibioticSrcCategory{}
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.AntibioticSrcCategory, 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.AntibioticSrcCategory, 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
}
@@ -0,0 +1,103 @@
package antibioticsrccategory
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src-category"
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.AntibioticSrcCategory) 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.AntibioticSrcCategory) 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.AntibioticSrcCategory) 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.AntibioticSrcCategory) 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.AntibioticSrcCategory) 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
}
@@ -0,0 +1,9 @@
package antibioticsrccategory
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
@@ -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 antibioticsrccategory
import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/antibiotic-src-category"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.AntibioticSrcCategory, tx *gorm.DB) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.AntibioticSrcCategory, tx *gorm.DB) error
}
type readDetailMw struct {
Name string
Func func(input *e.ReadDetailDto, data *e.AntibioticSrcCategory, 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
@@ -0,0 +1,280 @@
package antibioticsrc
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src"
"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 = "antibiotic-src"
func Create(input e.CreateDto) (*d.Data, error) {
data := e.AntibioticSrc{}
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 err := createItem(&input, &event, tx); 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.AntibioticSrc
var dataList []e.AntibioticSrc
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.AntibioticSrc
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.AntibioticSrc
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.AntibioticSrc
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
}
@@ -0,0 +1,30 @@
package antibioticsrc
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src"
pl "simrs-vx/pkg/logger"
"gorm.io/gorm"
)
func setData(input any, data *e.AntibioticSrc) {
switch input.(type) {
case *e.CreateDto:
data.Code = input.(*e.CreateDto).Code
data.Name = input.(*e.CreateDto).Name
data.AntibioticSrcCategory_Code = input.(*e.CreateDto).AntibioticSrcCategory_Code
// data.Item_Id = input.(*e.CreateDto).Item_Id
case *e.UpdateDto:
data.Code = input.(*e.UpdateDto).Code
data.Name = input.(*e.UpdateDto).Name
data.AntibioticSrcCategory_Code = input.(*e.UpdateDto).AntibioticSrcCategory_Code
// data.Item_Id = input.(*e.UpdateDto).Item_Id
}
}
func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error {
// For antibiotic-src, we don't need to create items since Item_Id is commented out
// This function is kept for consistency with the pattern but does nothing
return nil
}
@@ -0,0 +1,140 @@
package antibioticsrc
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src"
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.AntibioticSrc, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := e.AntibioticSrc{}
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.AntibioticSrc, *e.MetaDto, error) {
pl.SetLogInfo(event, input, "started", "DBReadList")
data := []e.AntibioticSrc{}
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.AntibioticSrc{}).
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.AntibioticSrc, error) {
pl.SetLogInfo(event, input, "started", "DBReadDetail")
data := e.AntibioticSrc{}
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.AntibioticSrc, 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.AntibioticSrc, 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
}
@@ -0,0 +1,111 @@
package antibioticsrc
import (
e "simrs-vx/internal/domain/main-entities/antibiotic-src"
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.AntibioticSrc) 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.AntibioticSrc) 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.AntibioticSrc) 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.AntibioticSrc) 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.AntibioticSrc) 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
}
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// createMw{Name: "modif-input", Func: pm.ModifInput},
// createMw{Name: "check-data", Func: pm.CheckData},
// )
// }
@@ -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 antibioticsrc
import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/antibiotic-src"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.AntibioticSrc, tx *gorm.DB) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.AntibioticSrc, tx *gorm.DB) error
}
type readDetailMw struct {
Name string
Func func(input *e.ReadDetailDto, data *e.AntibioticSrc, 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
@@ -1,16 +1,19 @@
package division
import (
e "simrs-vx/internal/domain/main-entities/division"
"strconv"
dg "github.com/karincake/apem/db-gorm-pg"
d "github.com/karincake/dodol"
"gorm.io/gorm"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
"gorm.io/gorm"
erc "simrs-vx/internal/domain/references/common"
e "simrs-vx/internal/domain/main-entities/division"
esync "simrs-vx/internal/domain/sync-entities/log"
)
const source = "division"
@@ -25,36 +28,32 @@ func Create(input e.CreateDto) (*d.Data, error) {
// Start log
pl.SetLogInfo(&event, input, "started", "create")
mwRunner := newMiddlewareRunner(&event)
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
id := uint(data.Id)
input.Id = &id
}
mwRunner.setMwType(pu.MWTPost)
// Run post-middleware
if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil {
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunCreateMiddleware(createPreMw, &input); err != nil {
return err
}
pl.SetLogInfo(&event, nil, "complete")
return nil
})
if err != 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,
@@ -80,7 +79,7 @@ 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 := newMiddlewareRunner(&event)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil {
@@ -131,7 +130,7 @@ 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 := newMiddlewareRunner(&event)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil {
@@ -177,6 +176,7 @@ 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")
@@ -184,32 +184,26 @@ 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
}
input.Id = &data.Id
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 {
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunUpdateMiddleware(updatePreMw, &input); err != nil {
return err
}
return nil
})
if err != nil {
if err = runLogMiddleware(err, input, mwRunner); err != nil {
return nil, err
}
pl.SetLogInfo(&event, nil, "complete")
return &d.Data{
Meta: d.IS{
"source": source,
@@ -233,6 +227,7 @@ 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")
@@ -240,30 +235,26 @@ 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
}
input.Id = &data.Id
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.RunDeleteMiddleware(deletePreMw, &input); err != nil {
return err
}
return nil
})
if err != nil {
if err = runLogMiddleware(err, input, mwRunner); err != nil {
return nil, err
}
pl.SetLogInfo(&event, nil, "complete")
return &d.Data{
Meta: d.IS{
"source": source,
@@ -274,3 +265,32 @@ 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
}
@@ -1,35 +1,64 @@
package division
import (
e "simrs-vx/internal/domain/main-entities/division"
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/division"
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, tx *gorm.DB) *middlewareRunner {
func newMiddlewareRunner(event *pl.Event) *middlewareRunner {
return &middlewareRunner{
Event: event,
Tx: tx,
Event: event,
SyncOn: sync.O.Enable,
}
}
// ExecuteCreateMiddleware executes create middleware
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Division) error {
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto) error {
if !me.SyncOn {
return nil
}
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
}
// ExecuteCreateMiddleware executes createlog 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)
}
@@ -39,6 +68,10 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e
}
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Division) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
@@ -54,6 +87,10 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu
}
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Division) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
@@ -68,13 +105,17 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw,
return nil
}
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Division) error {
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []updateMw, input *e.UpdateDto) error {
if !me.SyncOn {
return nil
}
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 +124,17 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu
return nil
}
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Division) error {
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e.DeleteDto) error {
if !me.SyncOn {
return nil
}
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)
}
@@ -1,9 +1,20 @@
package division
import (
plugin "simrs-vx/internal/use-case/simgos-sync-plugin/division"
)
// 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: "sync-create-division", Func: plugin.Create})
createSimxLogMw = append(createSimxLogMw,
createLogMw{Name: "create-sync-log", Func: plugin.CreateLog})
updatePreMw = append(updatePreMw,
updateMw{Name: "sync-update-division", Func: plugin.Update})
deletePreMw = append(deletePreMw,
deleteMw{Name: "sync-delete-division", Func: plugin.Delete})
}
@@ -12,11 +12,27 @@ import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/division"
elog "simrs-vx/internal/domain/sync-entities/log"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.Division, tx *gorm.DB) error
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 {
@@ -29,16 +45,17 @@ type readDetailMw struct {
Func func(input *e.ReadDetailDto, data *e.Division, 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
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 []readDetailMw
var updatePreMw []updateMw
var updatePostMw []readDetailMw
var deletePreMw []readDetailMw
var deletePreMw []deleteMw
var deletePostMw []readDetailMw
@@ -10,7 +10,7 @@ import (
d "github.com/karincake/dodol"
"gorm.io/gorm"
eru "simrs-vx/internal/domain/references/upload"
ere "simrs-vx/internal/domain/references/encounter"
e "simrs-vx/internal/domain/main-entities/encounter-document"
)
@@ -244,7 +244,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
return err
}
if err := removeUploadedFile(string(eru.ETCEncounter), *data.FilePath, &event); err != nil {
if err := removeUploadedFile(string(ere.ETCEncounter), *data.FilePath, &event); err != nil {
return err
}
@@ -0,0 +1,295 @@
package generalconsent
import (
"errors"
"strconv"
// main entities
e "simrs-vx/internal/domain/main-entities/general-consent"
ue "simrs-vx/internal/use-case/main-use-case/encounter"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
dg "github.com/karincake/apem/db-gorm-pg"
d "github.com/karincake/dodol"
"gorm.io/gorm"
)
const source = "general-consent"
func Create(input e.CreateDto) (*d.Data, error) {
data := e.GeneralConsent{}
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
}
// check if encounter is done
if ue.IsDone(*input.Encounter_Id, &event, tx) {
return errors.New("encounter is already done")
}
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.GeneralConsent
var dataList []e.GeneralConsent
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.GeneralConsent
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.GeneralConsent
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
}
// check if encounter is done
if ue.IsDone(*input.Encounter_Id, &event, tx) {
return errors.New("encounter is already done")
}
if err := UpdateData(input, data, &event, tx); err != nil {
return err
}
// Get Updated Data
if data, err = ReadDetailData(rdDto, &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: uint(input.Id)}
var data *e.GeneralConsent
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
}
@@ -0,0 +1,22 @@
/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package generalconsent
import (
e "simrs-vx/internal/domain/main-entities/general-consent"
)
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.GeneralConsent) {
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.Value = inputSrc.Value
}
@@ -0,0 +1,140 @@
package generalconsent
import (
"errors"
e "simrs-vx/internal/domain/main-entities/general-consent"
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.GeneralConsent, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := e.GeneralConsent{}
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.GeneralConsent, *e.MetaDto, error) {
pl.SetLogInfo(event, input, "started", "DBReadList")
data := []e.GeneralConsent{}
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.GeneralConsent{}).
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 errors.Is(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.GeneralConsent, error) {
pl.SetLogInfo(event, input, "started", "DBReadDetail")
data := e.GeneralConsent{}
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.GeneralConsent, 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.GeneralConsent, 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
}
@@ -0,0 +1,103 @@
package generalconsent
import (
e "simrs-vx/internal/domain/main-entities/general-consent"
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.GeneralConsent) 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.GeneralConsent) 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.GeneralConsent) 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.GeneralConsent) 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.GeneralConsent) 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
}
@@ -0,0 +1,9 @@
package generalconsent
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
@@ -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 generalconsent
import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/general-consent"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.GeneralConsent, tx *gorm.DB) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.GeneralConsent, tx *gorm.DB) error
}
type readDetailMw struct {
Name string
Func func(input *e.ReadDetailDto, data *e.GeneralConsent, 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
@@ -0,0 +1,181 @@
package generatefile
import (
"encoding/json"
"errors"
evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep"
evscl "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
egc "simrs-vx/internal/domain/main-entities/general-consent"
uvs "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep"
uvscl "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-control-letter"
ugc "simrs-vx/internal/use-case/main-use-case/general-consent"
pc "simrs-vx/pkg/conv-helper"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
dg "github.com/karincake/apem/db-gorm-pg"
d "github.com/karincake/dodol"
"gorm.io/gorm"
erc "simrs-vx/internal/domain/references/common"
ere "simrs-vx/internal/domain/references/encounter"
)
const source = "generate-file"
func Generate(input GenerateDto) (*d.Data, error) {
event := pl.Event{
Feature: "Generate",
Source: source,
}
var response ResponseDto
// Start log
pl.SetLogInfo(&event, input, "started", "create")
err := dg.I.Transaction(func(tx *gorm.DB) error {
switch input.Type_Code {
// general-consent
case ere.DTCGC:
// get value from general consent by ref_id
gc, err := ugc.ReadDetailData(egc.ReadDetailDto{Id: uint(*pc.StringToUint64(*input.Ref_Id))}, &event)
if err != nil {
return err
}
if gc.FileUrl != nil {
if err := removeFile(string(input.EntityType_Code), *gc.FileUrl); err != nil {
return err
}
}
// map template data
templateData := GeneralConsentPDF{}
if gc.Value != nil {
err := json.Unmarshal([]byte(*gc.Value), &templateData)
if err != nil {
event.ErrInfo = pl.ErrorInfo{
Code: "data-unmarshal-fail",
Detail: err.Error(),
Raw: err,
}
return err
}
} else {
return errors.New("no value in this general consent")
}
input.FormatType = erc.DFTCPDF
input.TemplateName = TDNGC
input.Encounter_Id = gc.Encounter_Id
templateData.Date = pu.FormatIndonesianDate(gc.CreatedAt)
// generate file
urlPub, err := generateFile(input, templateData)
if err != nil {
return err
}
gc.FileUrl = &urlPub
if err := dg.I.Save(&gc).Error; err != nil {
return err
}
response = ResponseDto{
FileUrl: urlPub,
}
// control-letter
case ere.DTCVSCL:
// get value from control letter by ref_id
cl, err := uvscl.ReadDetailData(evscl.ReadDetailDto{Number: input.Ref_Id}, &event)
if err != nil {
if !pu.IsDataNotFoundError(err) {
return err
}
}
if cl != nil && cl.FileUrl != nil {
if err := removeFile(string(input.EntityType_Code), *cl.FileUrl); err != nil {
return err
}
}
// map template data
clData := VclaimControlLetter{}
if input.Data != nil {
err := json.Unmarshal([]byte(*input.Data), &clData)
if err != nil {
event.ErrInfo = pl.ErrorInfo{
Code: "data-unmarshal-fail",
Detail: err.Error(),
Raw: err,
}
return err
}
} else {
return errors.New("there is no data 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 err
}
}
// get encounter id by vclaim sep number
vs, err := uvs.ReadDetailData(evs.ReadDetailDto{Number: &clData.VclaimSep.Number}, &event)
if err != nil {
return err
}
input.FormatType = erc.DFTCPDF
input.TemplateName = TDNCL
input.Encounter_Id = vs.Encounter_Id
input.UseA5Lanscape = true
templateData := clData.generateTemplateData()
// generate file
urlPub, err := generateFile(input, templateData)
if err != nil {
return err
}
cl.FileUrl = &urlPub
if err := tx.Save(&cl).Error; err != nil {
return err
}
response = ResponseDto{
FileUrl: urlPub,
}
default:
return errors.New("invalid type code")
}
return nil
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.II{
"source": source,
"structure": "single-data",
"status": "created",
},
Data: response,
}, nil
}

Some files were not shown because too many files have changed in this diff Show More