From 0cd73e8ad20c8cf7ee159e222aa059de272d9a02 Mon Sep 17 00:00:00 2001 From: renaldybrada Date: Tue, 10 Feb 2026 13:24:53 +0700 Subject: [PATCH] create/update validation. validate diagnosa, tindakan, pasien --- internal/domain/antrian_operasi/handler.go | 13 ++++- .../antrian_operasi/requestValidation.go | 29 ++++++++++- internal/domain/antrian_operasi/routes.go | 8 ++- .../domain/reference/diagnosa/repository.go | 49 +++++++++++++++++++ .../domain/reference/pasien/repository.go | 10 ++-- .../domain/reference/tindakan/repository.go | 48 ++++++++++++++++-- 6 files changed, 143 insertions(+), 14 deletions(-) diff --git a/internal/domain/antrian_operasi/handler.go b/internal/domain/antrian_operasi/handler.go index 9955b92..2975136 100644 --- a/internal/domain/antrian_operasi/handler.go +++ b/internal/domain/antrian_operasi/handler.go @@ -3,9 +3,12 @@ package antrianoperasi import ( "log" + diagnosa "antrian-operasi/internal/domain/reference/diagnosa" dokter "antrian-operasi/internal/domain/reference/dokter" kategori "antrian-operasi/internal/domain/reference/kategori" + "antrian-operasi/internal/domain/reference/pasien" spesialis "antrian-operasi/internal/domain/reference/spesialis" + tindakan "antrian-operasi/internal/domain/reference/tindakan" "antrian-operasi/internal/shared" "github.com/gin-gonic/gin" @@ -16,15 +19,21 @@ type AntrianOperasiHandler struct { repoKategori kategori.IKategoriRepository repoSpesialis spesialis.ISpesialisRepository repoDokter dokter.IDokterRepository + repoDiagnosa diagnosa.IDiagnosaRepository + repoTindakan tindakan.ITindakanRepository + repoPasien pasien.IPasienRepository } func NewAntrianOperasiHandler( repo IAntrianOperasiRepository, repoKategori kategori.IKategoriRepository, repoSpesialis spesialis.ISpesialisRepository, - repoDokter dokter.IDokterRepository) AntrianOperasiHandler { + repoDokter dokter.IDokterRepository, + repoDiagnosa diagnosa.IDiagnosaRepository, + repoTindakan tindakan.ITindakanRepository, + repoPasien pasien.IPasienRepository) AntrianOperasiHandler { return AntrianOperasiHandler{ - repo, repoKategori, repoSpesialis, repoDokter, + repo, repoKategori, repoSpesialis, repoDokter, repoDiagnosa, repoTindakan, repoPasien, } } diff --git a/internal/domain/antrian_operasi/requestValidation.go b/internal/domain/antrian_operasi/requestValidation.go index 522879f..86a6342 100644 --- a/internal/domain/antrian_operasi/requestValidation.go +++ b/internal/domain/antrian_operasi/requestValidation.go @@ -10,8 +10,6 @@ func (req CreatePasienOperasiRequest) DataValidation(c *gin.Context, handler Ant isValid := false var errValidation []string - // validasi status operasi (1,2,3,4) - // validasi kategori _, err := handler.repoKategori.GetKategoriById(c, req.RencanaOperasiData.KategoriOperasi) if err != nil { @@ -40,6 +38,33 @@ func (req CreatePasienOperasiRequest) DataValidation(c *gin.Context, handler Ant } } + // validasi kode diagnosa + for _, dd := range req.DiagnosisItem { + _, err := handler.repoDiagnosa.GetDiagnosaByKode(c, dd.KodeDiagnosa) + if err != nil { + log.Println(err) + errValidation = append(errValidation, err.Error()) + continue + } + } + + // validasi kode tindakan + for _, dt := range req.TindakanItems { + _, err := handler.repoTindakan.GetTindakanByKode(c, *dt.KodeTindakan) + if err != nil { + log.Println(err) + errValidation = append(errValidation, err.Error()) + continue + } + } + + // validasi no rekam medis + _, err = handler.repoPasien.GetPasienByNoMr(c, req.FormData.NoRekamMedis) + if err != nil { + log.Println(err) + errValidation = append(errValidation, err.Error()) + } + if len(errValidation) == 0 { isValid = true } diff --git a/internal/domain/antrian_operasi/routes.go b/internal/domain/antrian_operasi/routes.go index 762a480..0dfc6be 100644 --- a/internal/domain/antrian_operasi/routes.go +++ b/internal/domain/antrian_operasi/routes.go @@ -2,9 +2,12 @@ package antrianoperasi import ( "antrian-operasi/internal/database" + "antrian-operasi/internal/domain/reference/diagnosa" "antrian-operasi/internal/domain/reference/dokter" "antrian-operasi/internal/domain/reference/kategori" + "antrian-operasi/internal/domain/reference/pasien" "antrian-operasi/internal/domain/reference/spesialis" + "antrian-operasi/internal/domain/reference/tindakan" "github.com/gin-gonic/gin" ) @@ -14,9 +17,12 @@ func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) { kategoriRepo := kategori.NewRepository(dbService) spesialisRepo := spesialis.NewRepository(dbService) dokterRepo := dokter.NewRepository(dbService) + diagnosaRepo := diagnosa.NewRepository(dbService) + tindakanRepo := tindakan.NewRepository(dbService) + pasienRepo := pasien.NewRepository(dbService) antrianOperasiHandler := NewAntrianOperasiHandler( - antrianOperasiRepo, kategoriRepo, spesialisRepo, dokterRepo) + antrianOperasiRepo, kategoriRepo, spesialisRepo, dokterRepo, diagnosaRepo, tindakanRepo, pasienRepo) r.POST("/antrian-operasi", antrianOperasiHandler.CreateAntrianOperasi) r.GET("/antrian-operasi", antrianOperasiHandler.GetListAntrianOperasi) diff --git a/internal/domain/reference/diagnosa/repository.go b/internal/domain/reference/diagnosa/repository.go index 75ba706..f3f7089 100644 --- a/internal/domain/reference/diagnosa/repository.go +++ b/internal/domain/reference/diagnosa/repository.go @@ -2,9 +2,12 @@ package diagnosa import ( "antrian-operasi/internal/database" + "log" queryUtils "antrian-operasi/internal/utils/query" + "errors" + "github.com/gin-gonic/gin" ) @@ -13,6 +16,7 @@ const TBL_NAME = "icd" type IDiagnosaRepository interface { SearchableListDiagnosa(c *gin.Context) (ListDiagnosaModel, error) + GetDiagnosaByKode(c *gin.Context, kode string) (DiagnosaModel, error) } type diagnosaRepo struct { @@ -69,3 +73,48 @@ func (r diagnosaRepo) SearchableListDiagnosa(c *gin.Context) (ListDiagnosaModel, return result, nil } + +func (r diagnosaRepo) GetDiagnosaByKode(c *gin.Context, kode string) (DiagnosaModel, error) { + var resultQuery []DiagnosaModel + var result DiagnosaModel + + query := queryUtils.DynamicQuery{ + From: TBL_NAME, + Fields: []queryUtils.SelectField{ + {Expression: "icd_code"}, + {Expression: "jenis_penyakit"}, + {Expression: "sebabpenyakit"}, + }, + Filters: []queryUtils.FilterGroup{ + { + Filters: []queryUtils.DynamicFilter{ + {Column: "icd_code", Operator: queryUtils.OpILike, Value: kode}, + }, LogicOp: "AND", + }, + }, + Limit: 1, + } + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &resultQuery) + if err != nil { + return result, err + } + + if len(resultQuery) == 0 { + log.Println(query) + notFoundError := errors.New("diagnosa not found : " + kode) + return result, notFoundError + } + + for _, x := range resultQuery { + log.Println(x.KodeDiagnosa) + } + + return resultQuery[0], nil +} diff --git a/internal/domain/reference/pasien/repository.go b/internal/domain/reference/pasien/repository.go index 8d8b1f9..f88095a 100644 --- a/internal/domain/reference/pasien/repository.go +++ b/internal/domain/reference/pasien/repository.go @@ -14,7 +14,7 @@ const TBL_NAME = "m_pasien" type IPasienRepository interface { SearchableListPasien(c *gin.Context) (ListPasienModel, error) - GetPasienByNoMr(c *gin.Context, id int) (PasienModel, error) + GetPasienByNoMr(c *gin.Context, noMr string) (PasienModel, error) } type pasienRepo struct { @@ -93,31 +93,29 @@ func (r pasienRepo) SearchableListPasien(c *gin.Context) (ListPasienModel, error return result, nil } -func (r pasienRepo) GetPasienByNoMr(c *gin.Context, id int) (PasienModel, error) { +func (r pasienRepo) GetPasienByNoMr(c *gin.Context, noMr string) (PasienModel, error) { var resultQuery ListPasienModel var result PasienModel query := baseSelectQuery() query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: []queryUtils.DynamicFilter{ - {Column: "id", Operator: queryUtils.OpEqual, Value: id}, + {Column: "nomr", Operator: queryUtils.OpEqual, Value: noMr}, }}) dbconn, err := r.db.GetSQLXDB(DB_NAME) if err != nil { - // log.Fatalf("unable to connect db %s", err) return result, err } err = r.queryBuilder.ExecuteQuery( c, dbconn, query, &resultQuery) if err != nil { - // log.Fatalf("unable to execute query %s", err) return result, err } if len(resultQuery) == 0 { - notFoundError := errors.New("kategori not found") + notFoundError := errors.New("pasien not found, no rekam medis : " + noMr) return result, notFoundError } diff --git a/internal/domain/reference/tindakan/repository.go b/internal/domain/reference/tindakan/repository.go index 3c0aea2..d111071 100644 --- a/internal/domain/reference/tindakan/repository.go +++ b/internal/domain/reference/tindakan/repository.go @@ -5,6 +5,8 @@ import ( queryUtils "antrian-operasi/internal/utils/query" + "errors" + "github.com/gin-gonic/gin" ) @@ -13,9 +15,10 @@ const TBL_NAME = "icd_cm" type ITindakanRepository interface { SearchableListTindakan(c *gin.Context) (ListTindakanModel, error) + GetTindakanByKode(c *gin.Context, kode string) (TindakanModel, error) } -type diagnosaRepo struct { +type tindakanRepo struct { queryBuilder *queryUtils.QueryBuilder db database.Service } @@ -27,13 +30,13 @@ func NewRepository(dbService database.Service) ITindakanRepository { }). SetSecurityOptions(false, 100) - return diagnosaRepo{ + return tindakanRepo{ queryBuilder: queryBuilder, db: dbService, } } -func (r diagnosaRepo) SearchableListTindakan(c *gin.Context) (ListTindakanModel, error) { +func (r tindakanRepo) SearchableListTindakan(c *gin.Context) (ListTindakanModel, error) { var result ListTindakanModel search := c.Query("search") @@ -67,3 +70,42 @@ func (r diagnosaRepo) SearchableListTindakan(c *gin.Context) (ListTindakanModel, return result, nil } + +func (r tindakanRepo) GetTindakanByKode(c *gin.Context, kode string) (TindakanModel, error) { + var resultQuery []TindakanModel + var result TindakanModel + + query := queryUtils.DynamicQuery{ + From: TBL_NAME, + Fields: []queryUtils.SelectField{ + {Expression: "kode"}, + {Expression: "keterangan"}, + }, + Filters: []queryUtils.FilterGroup{ + { + Filters: []queryUtils.DynamicFilter{ + {Column: "kode", Operator: queryUtils.OpILike, Value: kode}, + }, LogicOp: "AND", + }, + }, + Limit: 1, + } + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &resultQuery) + if err != nil { + return result, err + } + + if len(resultQuery) == 0 { + notFoundError := errors.New("tindakan not found : " + kode) + return result, notFoundError + } + + return resultQuery[0], nil +}