From c67fc44270b0ce4eba4a8c46109280c4786f1e3f Mon Sep 17 00:00:00 2001 From: renaldybrada Date: Wed, 11 Feb 2026 14:15:36 +0700 Subject: [PATCH] API update status antrian --- docs/docs.go | 33 +++++++++ docs/swagger.json | 33 +++++++++ docs/swagger.yaml | 21 ++++++ internal/domain/antrian_operasi/handler.go | 69 ++++++++++++++++--- internal/domain/antrian_operasi/repository.go | 54 +++++++++++++-- .../antrian_operasi/requestValidation.go | 19 +++++ internal/domain/antrian_operasi/routes.go | 1 + 7 files changed, 217 insertions(+), 13 deletions(-) diff --git a/docs/docs.go b/docs/docs.go index 8bb8a0e..57556fd 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -173,6 +173,39 @@ const docTemplate = `{ } } }, + "/antrian-operasi/{id}/update-status": { + "put": { + "tags": [ + "Antrian Operasi" + ], + "summary": "Update Status Antrian Operasi", + "parameters": [ + { + "description": "Update Status Pasien Operasi", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/antrianoperasi.StatusPasienRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/shared.BaseResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/shared.BaseErrorResponse" + } + } + } + } + }, "/dashboard/antrian-per-kategori/": { "get": { "tags": [ diff --git a/docs/swagger.json b/docs/swagger.json index 378df5a..b757c91 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -167,6 +167,39 @@ } } }, + "/antrian-operasi/{id}/update-status": { + "put": { + "tags": [ + "Antrian Operasi" + ], + "summary": "Update Status Antrian Operasi", + "parameters": [ + { + "description": "Update Status Pasien Operasi", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/antrianoperasi.StatusPasienRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/shared.BaseResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/shared.BaseErrorResponse" + } + } + } + } + }, "/dashboard/antrian-per-kategori/": { "get": { "tags": [ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 28d2cc9..55b863e 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -485,6 +485,27 @@ paths: summary: Update Antrian Operasi tags: - Antrian Operasi + /antrian-operasi/{id}/update-status: + put: + parameters: + - description: Update Status Pasien Operasi + in: body + name: body + required: true + schema: + $ref: '#/definitions/antrianoperasi.StatusPasienRequest' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/shared.BaseResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/shared.BaseErrorResponse' + summary: Update Status Antrian Operasi + tags: + - Antrian Operasi /dashboard/antrian-per-kategori/: get: responses: diff --git a/internal/domain/antrian_operasi/handler.go b/internal/domain/antrian_operasi/handler.go index 2975136..30011b2 100644 --- a/internal/domain/antrian_operasi/handler.go +++ b/internal/domain/antrian_operasi/handler.go @@ -48,9 +48,9 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) { var req CreatePasienOperasiRequest // Binding format JSON if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(500, shared.BaseErrorResponse{ + c.JSON(400, shared.BaseErrorResponse{ Success: false, - Code: 500, + Code: 400, Message: "error bind json", Errors: shared.ValidationError(err), }) @@ -61,9 +61,9 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) { isValid, errValidation := req.DataValidation(c, h) if isValid == false { log.Printf("validation error : %s", errValidation) - c.JSON(500, shared.BaseErrorResponse{ + c.JSON(400, shared.BaseErrorResponse{ Success: false, - Code: 500, + Code: 400, Message: "validation error", Errors: errValidation, }) @@ -153,9 +153,9 @@ func (h AntrianOperasiHandler) UpdateAntrianOperasi(c *gin.Context) { var req CreatePasienOperasiRequest // Binding format JSON if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(500, shared.BaseErrorResponse{ + c.JSON(400, shared.BaseErrorResponse{ Success: false, - Code: 500, + Code: 400, Message: "error bind json", Errors: shared.ValidationError(err), }) @@ -166,9 +166,9 @@ func (h AntrianOperasiHandler) UpdateAntrianOperasi(c *gin.Context) { isValid, errValidation := req.DataValidation(c, h) if isValid == false { log.Printf("validation error : %s", errValidation) - c.JSON(500, shared.BaseErrorResponse{ + c.JSON(400, shared.BaseErrorResponse{ Success: false, - Code: 500, + Code: 400, Message: "validation error", Errors: errValidation, }) @@ -189,5 +189,56 @@ func (h AntrianOperasiHandler) UpdateAntrianOperasi(c *gin.Context) { return } - c.JSON(201, shared.ToBaseResponse(res, true, 201, "success update antrian operasi")) + c.JSON(200, shared.ToBaseResponse(res, true, 200, "success update antrian operasi")) +} + +// UpdateStatusAntrianOperasi godoc +// @Summary Update Status Antrian Operasi +// @Tags Antrian Operasi +// @Param body body StatusPasienRequest true "Update Status Pasien Operasi" +// @Success 200 {object} shared.BaseResponse +// @Failure 500 {object} shared.BaseErrorResponse +// @Router /antrian-operasi/{id}/update-status [put] +func (h AntrianOperasiHandler) UpdateStatusAntrianOperasi(c *gin.Context) { + id := c.Param("id") + var req StatusPasienRequest + // Binding format JSON + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(400, shared.BaseErrorResponse{ + Success: false, + Code: 400, + Message: "error bind json", + Errors: shared.ValidationError(err), + }) + return + } + + // Request data master validation + isValid, errValidation := req.UpdateStatusValidation() + if isValid == false { + log.Printf("validation error : %s", errValidation) + c.JSON(400, shared.BaseErrorResponse{ + Success: false, + Code: 400, + Message: "validation error", + Errors: errValidation, + }) + return + } + + // Start update database + res, err := h.repo.UpdateStatusAntrianOperasi(c, id, req) + if err != nil { + log.Printf("update antrian error : %s", err) + errMessage := []string{err.Error()} + c.JSON(500, shared.BaseErrorResponse{ + Success: false, + Code: 500, + Message: "update error", + Errors: errMessage, + }) + return + } + + c.JSON(200, shared.ToBaseResponse(res, true, 200, "success update antrian operasi")) } diff --git a/internal/domain/antrian_operasi/repository.go b/internal/domain/antrian_operasi/repository.go index 3021329..b1756ae 100644 --- a/internal/domain/antrian_operasi/repository.go +++ b/internal/domain/antrian_operasi/repository.go @@ -26,6 +26,7 @@ type IAntrianOperasiRepository interface { SearchableListAntrianOperasi(c *gin.Context) (ListPasienOperasiPaginate, error) GetAntrianOperasiById(c *gin.Context, id string) (DetailPasienOperasiResultQuery, error) UpdateAntrianOperasi(c *gin.Context, id string, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) + UpdateStatusAntrianOperasi(c *gin.Context, id string, req StatusPasienRequest) (StatusPasienRequest, error) } type antrianOperasiRepo struct { @@ -307,7 +308,7 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasie "\"Nomor_spesialis\"", "\"Nomor_sub_spesialis\"", }, Values: []interface{}{ idAntrian, - req.StatusPasienData.StatusOperasi, + "draft", time.Now(), req.FormData.NoRekamMedis, req.FormData.NoKtp, @@ -319,7 +320,7 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasie req.RencanaOperasiData.TanggalDaftar, req.RencanaOperasiData.KategoriOperasi, req.RencanaOperasiData.RencanaOperasi, - req.StatusPasienData.StatusOperasi, + "1", 1, // nomor req.RencanaOperasiData.Spesialis, req.RencanaOperasiData.SubSpesialis, @@ -778,13 +779,13 @@ func (r antrianOperasiRepo) UpdateAntrianOperasi(c *gin.Context, id string, req Columns: []string{ "date_updated", "\"No_rekam_medis\"", "\"No_KTP\"", "\"Nama_pasien\"", "\"Jenis_kelamin\"", "\"Tanggal_lahir\"", "\"Umur\"", "\"Alamat\"", "\"Kategori_operasi\"", - "\"Rencana_operasi\"", "\"Keterangan\"", "\"Tanggal_selesai_operasi\"", + "\"Rencana_operasi\"", "\"Keterangan\"", "\"Status_operasi\"", "\"Spesialis\"", "\"Sub_spesialis\"", }, Values: []interface{}{ time.Now(), req.FormData.NoRekamMedis, req.FormData.NoKtp, req.FormData.NamaPasien, req.FormData.JenisKelamin, req.FormData.TglLahir, req.FormData.Umur, req.FormData.Alamat, req.RencanaOperasiData.KategoriOperasi, - req.RencanaOperasiData.RencanaOperasi, req.RencanaOperasiData.Keterangan, req.StatusPasienData.TglSelesai, + req.RencanaOperasiData.RencanaOperasi, req.RencanaOperasiData.Keterangan, req.StatusPasienData.StatusOperasi, req.RencanaOperasiData.Spesialis, req.RencanaOperasiData.SubSpesialis, }, } @@ -842,3 +843,48 @@ func (r antrianOperasiRepo) UpdateAntrianOperasi(c *gin.Context, id string, req return req, nil } + +func (r antrianOperasiRepo) UpdateStatusAntrianOperasi(c *gin.Context, id string, req StatusPasienRequest) (StatusPasienRequest, error) { + // Update main table + updateMainQuery := queryUtils.UpdateData{ + Columns: []string{ + "date_updated", "\"Keterangan\"", "\"Status_operasi\"", + }, + Values: []interface{}{ + time.Now(), req.KeteranganStatus, req.StatusOperasi, + }, + } + + if req.StatusOperasi == "2" { + updateMainQuery.Columns = append(updateMainQuery.Columns, "\"Tanggal_selesai_operasi\"") + updateMainQuery.Values = append(updateMainQuery.Values, req.TglSelesai) + } + + filters := []queryUtils.FilterGroup{ + { + Filters: []queryUtils.DynamicFilter{ + {Column: "id", Operator: queryUtils.OpEqual, Value: id}, + }, + }, + } + + sqlUpdateMain, args, err := r.queryBuilder.BuildUpdateQuery(TBL_NAME, updateMainQuery, filters) + if err != nil { + log.Printf("Unable to create query update : %s", err) + return req, err + } + + db, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + log.Printf("Erorr initiating db : %v", err) + return req, err + } + + _, err = db.ExecContext(c, sqlUpdateMain, args...) + if err != nil { + log.Printf("Error executing query : %v", err) + return req, err + } + + return req, nil +} diff --git a/internal/domain/antrian_operasi/requestValidation.go b/internal/domain/antrian_operasi/requestValidation.go index 86a6342..6ed177d 100644 --- a/internal/domain/antrian_operasi/requestValidation.go +++ b/internal/domain/antrian_operasi/requestValidation.go @@ -71,3 +71,22 @@ func (req CreatePasienOperasiRequest) DataValidation(c *gin.Context, handler Ant return isValid, errValidation } + +func (req StatusPasienRequest) UpdateStatusValidation() (bool, []string) { + isValid := false + var errValidation []string + + if req.StatusOperasi != "2" && req.TglSelesai != nil { + errValidation = append(errValidation, "Tanggal selesai terisi ketika status belum selesai") + } + + if req.StatusOperasi == "2" && req.TglSelesai == nil { + errValidation = append(errValidation, "Tanggal selesai harus diisi ketika status selesai") + } + + if len(errValidation) == 0 { + isValid = true + } + + return isValid, errValidation +} diff --git a/internal/domain/antrian_operasi/routes.go b/internal/domain/antrian_operasi/routes.go index 0dfc6be..d33c416 100644 --- a/internal/domain/antrian_operasi/routes.go +++ b/internal/domain/antrian_operasi/routes.go @@ -28,4 +28,5 @@ func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) { r.GET("/antrian-operasi", antrianOperasiHandler.GetListAntrianOperasi) r.GET("/antrian-operasi/:id", antrianOperasiHandler.GetDetailAntrianOperasi) r.PUT("/antrian-operasi/:id", antrianOperasiHandler.UpdateAntrianOperasi) + r.PUT("/antrian-operasi/:id/update-status", antrianOperasiHandler.UpdateStatusAntrianOperasi) }