diff --git a/handlers/dev/md.nonlabtemplate.handlers.go b/handlers/dev/md.nonlabtemplate.handlers.go index 4fdee8c..f978d0e 100644 --- a/handlers/dev/md.nonlabtemplate.handlers.go +++ b/handlers/dev/md.nonlabtemplate.handlers.go @@ -13,6 +13,7 @@ import ( dev_mdnonlabtemplateview "cpone/views/dev/mdnonlabtemplate" "fmt" "strconv" + "strings" "github.com/a-h/templ" "github.com/labstack/echo/v4" @@ -24,6 +25,12 @@ type MDNonlabTemplateServices interface { GetListNonlabTemplate(search string, currentPage int, rowPerPage int) ([]models.MDNonlabTemplate, int, error) GetMDNonlabTemplateByID(id string) (models.MDNonlabTemplate, error) DeleteDataNonlabTemplate(id string) (models.MDNonlabTemplate, error) + AddNonlabTemplate(nama string, fisik string) (models.MDNonlabTemplate, error) + UpdateNonlabTemplate(id string, nama string, fisik string) (models.MDNonlabTemplate, error) + GetIDNonlabTemplate(name string) (int, error) + GetDetailByIDNonlabTemplate(id string) (models.NonlabTemplateDetail, error) + ListDetailByIDNonlabTemplate(id string) ([]models.NonlabTemplateDetail, error) + AddDetailNonlabTemplate(idnonlab string, kode string, name string, flagActive string) (models.NonlabTemplateDetail, error) } type MDNonlabTemplateHandler struct { @@ -128,16 +135,15 @@ func (nlt *MDNonlabTemplateHandler) HandleShowNonlabTemplateScreen(c echo.Contex dialogAddBody := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( dialogAddBodyID, models.CustomTextFieldv2Prm{ - Name: "nonlabtemplateid", - ID: "nonlabtemplateinputid", - Type: "hidden", - Value: dialogAddBodyID, + Name: "nonlabtemplateid", + ID: "nonlabtemplateinputid", + Type: "hidden", }, models.CustomTextFieldv2Prm{ - Label: "Nama Template", - Name: "nonlabtemplatename", - ID: "nonlabtemplateinputname", - Type: "text", + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", }, models.CustomCheckboxv1Prm{ Text: "Template Fisik", @@ -145,12 +151,31 @@ func (nlt *MDNonlabTemplateHandler) HandleShowNonlabTemplateScreen(c echo.Contex ID: "nonlabtemplateinputname", Value: "N", }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + }, dev_mdnonlabtemplateview.BtnSimpanNama( "/dev/md/nonlabtemplate/simpanama", "#"+dialogAddBodyID, "outerHTML", "#"+dialogAddID, - "#tableID, #paginationID, #searchID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, ), dev_mdnonlabtemplateview.JSShowModal(""), ) @@ -497,10 +522,10 @@ func (nlt *MDNonlabTemplateHandler) HandleCloseFormAdd(c echo.Context) error { Type: "hidden", }, models.CustomTextFieldv2Prm{ - Label: "Nama Template", - Name: "nonlabtemplatename", - ID: "nonlabtemplateinputname", - Type: "text", + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", }, models.CustomCheckboxv1Prm{ Text: "Template Fisik", @@ -508,12 +533,31 @@ func (nlt *MDNonlabTemplateHandler) HandleCloseFormAdd(c echo.Context) error { ID: "nonlabtemplateinputname", Value: "N", }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + }, dev_mdnonlabtemplateview.BtnSimpanNama( "/dev/md/nonlabtemplate/simpanama", "#"+dialogAddBodyID, "outerHTML", "#"+dialogAddID, - "#tableID, #paginationID, #searchID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, ), dev_mdnonlabtemplateview.JSHideModal("#"+dialogAddID), ) @@ -526,26 +570,159 @@ func (nlt *MDNonlabTemplateHandler) HandleSimpanNama(c echo.Context) error { dialogAddID := c.FormValue("dialogAddID") searchID := c.FormValue("searchID") paginationID := c.FormValue("paginationID") - logger.Info("Test Button") fisik := c.FormValue("nonlabtemplatefisik") name := c.FormValue("nonlabtemplatename") id := c.FormValue("nonlabtemplateid") - logger.Info("Component ID", zap.Any("ID", id)) - dialogAddBody := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + flagFisik := "N" + if fisik == "on" { + flagFisik = "Y" + } + + formValidation := "" + namaValidation := "" + + if strings.TrimSpace(name) == "" { + formValidation = "Nama tidak boleh kosong" + namaValidation = "Nama tidak boleh kosong" + } + + if formValidation != "" || namaValidation != "" { + nf := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + dialogAddBodyID, + models.CustomTextFieldv2Prm{ + Name: "nonlabtemplateid", + ID: "nonlabtemplateinputid", + Type: "hidden", + Value: id, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", + Value: name, + ErrorMsg: namaValidation, + }, + models.CustomCheckboxv1Prm{ + Text: "Template Fisik", + Name: "nonlabtemplatefisik", + ID: "nonlabtemplateinputname", + Value: fisik, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + }, + dev_mdnonlabtemplateview.BtnSimpanNama( + "/dev/md/nonlabtemplate/simpanama", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.JSShowModal(""), + ) + toast := customtoastv2.CustomToastV2Show("Warning", formValidation, "warning") + return utils.ViewMulti(c, []templ.Component{toast, nf}) + } + + var respAdd models.MDNonlabTemplate + var err error + + if id != "" { + respAdd, err = nlt.MDNonlabTemplateServices.UpdateNonlabTemplate(id, name, flagFisik) + } else { + respAdd, err = nlt.MDNonlabTemplateServices.AddNonlabTemplate(name, flagFisik) + } + + if err != nil { + defer logger.Sync() + logger.Info("Error", zap.Any("Error", err), zap.Any("nama", name), zap.Any("fisik", flagFisik)) + nf := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + dialogAddBodyID, + models.CustomTextFieldv2Prm{ + Name: "nonlabtemplateid", + ID: "nonlabtemplateinputid", + Type: "hidden", + Value: strconv.Itoa(int(respAdd.NonlabTemplateID)), + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", + Value: name, + }, + models.CustomCheckboxv1Prm{ + Text: "Template Fisik", + Name: "nonlabtemplatefisik", + ID: "nonlabtemplateinputname", + Value: fisik, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + }, + dev_mdnonlabtemplateview.BtnSimpanNama( + "/dev/md/nonlabtemplate/simpanama", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.JSShowModal(""), + ) + toast := customtoastv2.CustomToastV2Show("Error", err.Error(), "danger") + return utils.ViewMulti(c, []templ.Component{toast, nf}) + } + logger.Info("ADD Nonlab Template", zap.Any("response", respAdd)) + + returnBody := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( dialogAddBodyID, models.CustomTextFieldv2Prm{ - Name: "nonlabtemplateid", - ID: "nonlabtemplateinputid", - Type: "hidden", + Name: "nonlabtemplateid", + ID: "nonlabtemplateinputid", + Type: "hidden", + Value: strconv.Itoa(int(respAdd.NonlabTemplateID)), }, models.CustomTextFieldv2Prm{ - Label: "Nama Template", - Name: "nonlabtemplatename", - ID: "nonlabtemplateinputname", - Type: "text", - Value: name, + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", + Value: name, }, models.CustomCheckboxv1Prm{ Text: "Template Fisik", @@ -553,14 +730,256 @@ func (nlt *MDNonlabTemplateHandler) HandleSimpanNama(c echo.Context) error { ID: "nonlabtemplateinputname", Value: fisik, }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + }, dev_mdnonlabtemplateview.BtnSimpanNama( "/dev/md/nonlabtemplate/simpanama", "#"+dialogAddBodyID, "outerHTML", "#"+dialogAddID, - "#tableID, #paginationID, #searchID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, ), dev_mdnonlabtemplateview.JSShowModal(""), ) - return utils.View(c, dialogAddBody) + + var msg string + if id != "" { + msg = "Success update data nonlab template " + } else { + msg = "Success insert data nonlab template " + } + + toast := customtoastv2.CustomToastV2Show("Success", msg+name, "success") + return utils.ViewMulti(c, []templ.Component{toast, returnBody}) +} + +func (nlt *MDNonlabTemplateHandler) HandleAddDetail(c echo.Context) error { + logger, _ := zap.NewProduction() + + dialogAddBodyID := c.FormValue("dialogAddBodyID") + dialogAddID := c.FormValue("dialogAddID") + searchID := c.FormValue("searchID") + paginationID := c.FormValue("paginationID") + + id := c.FormValue("nonlabtemplateid") + template := c.FormValue("nonlabtemplatename") + fisik := c.FormValue("nonlabtemplatefisik") + + kode := c.FormValue("nltdetailkode") + name := c.FormValue("nltdetailname") + + if fisik == "Y" { + fisik = "on" + } else { + fisik = "off" + } + + // default active + flagActive := "Y" + + formValidation := "" + templateValidation := "" + kodeValidation := "" + namaValidation := "" + + if strings.TrimSpace(id) == "" { + formValidation = "Simpan nama template dulu" + templateValidation = "Simpan nama template dulu" + } + if strings.TrimSpace(kode) == "" { + formValidation = "Kode tidak boleh kosong" + kodeValidation = "Kode tidak boleh kosong" + } + if strings.TrimSpace(name) == "" { + formValidation = "Nama tidak boleh kosong" + namaValidation = "Nama tidak boleh kosong" + } + + if formValidation != "" || templateValidation != "" || kodeValidation != "" || namaValidation != "" { + nf := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + dialogAddBodyID, + models.CustomTextFieldv2Prm{ + Name: "nonlabtemplateid", + ID: "nonlabtemplateinputid", + Type: "hidden", + Value: id, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", + Value: template, + ErrorMsg: templateValidation, + }, + models.CustomCheckboxv1Prm{ + Text: "Template Fisik", + Name: "nonlabtemplatefisik", + ID: "nonlabtemplateinputname", + Value: fisik, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + Value: kode, + ErrorMsg: kodeValidation, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + Value: name, + ErrorMsg: namaValidation, + }, + dev_mdnonlabtemplateview.BtnSimpanNama( + "/dev/md/nonlabtemplate/simpanama", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.JSShowModal(""), + ) + toast := customtoastv2.CustomToastV2Show("Warning", formValidation, "warning") + return utils.ViewMulti(c, []templ.Component{toast, nf}) + } + + resp, err := nlt.MDNonlabTemplateServices.AddDetailNonlabTemplate(id, kode, name, flagActive) + if err != nil { + defer logger.Sync() + logger.Info("Error", zap.Any("Error", err), zap.Any("id", id), zap.Any("kode", kode), zap.Any("nama", name)) + nf := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + dialogAddBodyID, + models.CustomTextFieldv2Prm{ + Name: "nonlabtemplateid", + ID: "nonlabtemplateinputid", + Type: "hidden", + Value: id, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", + Value: template, + }, + models.CustomCheckboxv1Prm{ + Text: "Template Fisik", + Name: "nonlabtemplatefisik", + ID: "nonlabtemplateinputname", + Value: fisik, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + Value: kode, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + Value: name, + }, + dev_mdnonlabtemplateview.BtnSimpanNama( + "/dev/md/nonlabtemplate/simpanama", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.JSShowModal(""), + ) + toast := customtoastv2.CustomToastV2Show("Error", err.Error(), "danger") + return utils.ViewMulti(c, []templ.Component{toast, nf}) + } + logger.Info("ADD Nonlab Template Detail", zap.Any("response", resp)) + + returnBody := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + dialogAddBodyID, + models.CustomTextFieldv2Prm{ + Name: "nonlabtemplateid", + ID: "nonlabtemplateinputid", + Type: "hidden", + Value: id, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Template", + Name: "nonlabtemplatename", + ID: "nonlabtemplateinputname", + Type: "text", + Value: template, + }, + models.CustomCheckboxv1Prm{ + Text: "Template Fisik", + Name: "nonlabtemplatefisik", + ID: "nonlabtemplateinputname", + Value: fisik, + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Kode", + Name: "nltdetailkode", + ID: "nltdetailinputkode", + Type: "text", + }, + models.CustomTextFieldv2Prm{ + Placeholder: "Nama Detail", + Name: "nltdetailname", + ID: "nltdetailinputkode", + Type: "text", + }, + dev_mdnonlabtemplateview.BtnSimpanNama( + "/dev/md/nonlabtemplate/simpanama", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.BtnAddDetail( + "/dev/md/nonlabtemplate/adddetail", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #"+searchID+", #currpage"+paginationID, + ), + dev_mdnonlabtemplateview.JSShowModal(""), + ) + toast := customtoastv2.CustomToastV2Show("Success", "success insert detail "+name, "success") + return utils.ViewMulti(c, []templ.Component{toast, returnBody}) } diff --git a/handlers/routes.go b/handlers/routes.go index 8620177..c7d02ff 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -289,6 +289,7 @@ func SetupRoutesDev(app *echo.Echo, appStore db.AppStore) { dev.POST("/md/nonlabtemplate/delete", devMDNonlabTemplateHandlers.HandleDelete) dev.POST("/md/nonlabtemplate/simpanama", devMDNonlabTemplateHandlers.HandleSimpanNama) dev.POST("/md/nonlabtemplate/closeaddform", devMDNonlabTemplateHandlers.HandleCloseFormAdd) + dev.POST("/md/nonlabtemplate/adddetail", devMDNonlabTemplateHandlers.HandleAddDetail) // masterdata nat unit devMdNatUnitServices := dev_services.NewMdNatUnitServices(appStore) diff --git a/models/nonlabtemplate.models.go b/models/nonlabtemplate.models.go index ac50cb4..556e79d 100644 --- a/models/nonlabtemplate.models.go +++ b/models/nonlabtemplate.models.go @@ -15,6 +15,17 @@ type MDNonlabTemplate struct { NonlabTemplateDeleteUserID string `db:"NonlabTemplateDeleteUserID"` } +type NonlabTemplateDetail struct { + NonlabTemplateDetailID int `db:"NonlabTemplateDetailID"` + NonlabTemplateDetailNonlabTemplateID int `db:"NonlabTemplateDetailNonlabTemplateID"` + NonlabTemplateDetailCode string `db:"NonlabTemplateDetailCode"` + NonlabTemplateDetailName string `db:"NonlabTemplateDetailName"` + NonlabTemplateDetaiNat_UnitID string `db:"NonlabTemplateDetaiNat_UnitID"` + NonlabTemplateDetailFlagActive string `db:"NonlabTemplateDetailFlagActive"` + NonlabTemplateDetaiM_LangID string `db:"NonlabTemplateDetaiM_LangID"` + NonlabTemplateDetailIsActive string `db:"NonlabTemplateDetailIsActive"` +} + type MDNonlabTemplateForm struct { IDComponent string Link string diff --git a/services/dev/md.nonlabtemplate.services.go b/services/dev/md.nonlabtemplate.services.go index 5403033..4a7cd53 100644 --- a/services/dev/md.nonlabtemplate.services.go +++ b/services/dev/md.nonlabtemplate.services.go @@ -6,6 +6,7 @@ import ( dbx "cpone/package/database" "fmt" "math" + "strconv" "strings" "go.uber.org/zap" @@ -133,3 +134,225 @@ func (nlt *MDNonlabTemplateServices) DeleteDataNonlabTemplate(id string) (models return nlt.GetMDNonlabTemplateByID(id) } + +func (nlt *MDNonlabTemplateServices) AddNonlabTemplate(nama string, fisik string) (models.MDNonlabTemplate, error) { + logger, _ := zap.NewProduction() + var ret models.MDNonlabTemplate + + var count int + var prmName = "%" + nama + "%" + q := ` + SELECT COUNT(*) + FROM nonlab_template + WHERE NonlabTemplateName LIKE ? + AND NonlabTemplateIsActive = 'Y' + ` + err := dbx.Handlex.Get(&count, q, prmName) + if err != nil { + defer logger.Sync() + logger.Error("cek duplicate", zap.Any("nama", prmName)) + return ret, fmt.Errorf("query failed to cek duplicate: %v", err) + } + if count > 0 { + defer logger.Sync() + logger.Error("duplicate data", zap.Any("nama", nama)) + return ret, fmt.Errorf("duplicate nama") + } + + q = ` + INSERT INTO nonlab_template ( + NonlabTemplateName, + NonlabTemplateFlagFisik, + NonlabTemplateCreated, + NonlabTemplateCreatedUserID + ) VALUES (?,?,NOW(),1); + ` + rsp := dbx.Handlex.MustExec(q, nama, fisik) + insertedID, err := rsp.LastInsertId() + if err != nil { + defer logger.Sync() + logger.Error("error insert data", zap.Any("nama", nama)) + return ret, fmt.Errorf("failed insert data: %v", err) + } + + s := strconv.Itoa(int(insertedID)) + return nlt.GetMDNonlabTemplateByID(s) +} + +func (nlt *MDNonlabTemplateServices) UpdateNonlabTemplate(id string, nama string, fisik string) (models.MDNonlabTemplate, error) { + logger, _ := zap.NewProduction() + var ret models.MDNonlabTemplate + + var count int + var prmNama = "%" + nama + "%" + q := ` + SELECT COUNT(*) + FROM nonlab_template + WHERE NonlabTemplateName LIKE ? + AND NonlabTemplateIsActive = 'Y' + AND NonlabTemplateID <> ? + ` + err := dbx.Handlex.Get(&count, q, prmNama, id) + if err != nil { + defer logger.Sync() + logger.Error("cek duplicate", zap.Any("nama", prmNama)) + return ret, fmt.Errorf("query failed to cek duplicate: %v", err) + } + if count > 0 { + defer logger.Sync() + logger.Error("duplicate data", zap.Any("nama", nama)) + return ret, fmt.Errorf("duplicate nama") + } + + q = ` + UPDATE nonlab_template SET + NonlabTemplateName = ?, + NonlabTemplateFlagFisik = ?, + NonlabTemplateLastUpdated = NOW(), + NonlabTemplateLastUpdatedUserID = 1 + WHERE NonlabTemplateID = ?; + ` + respUpdt := dbx.Handlex.MustExec(q, nama, fisik, id) + _, err = respUpdt.RowsAffected() + if err != nil { + defer logger.Sync() + logger.Error("error update data", zap.Any("name", nama)) + return ret, fmt.Errorf("query failed to update data") + } + + return nlt.GetMDNonlabTemplateByID(id) +} + +func (nlt *MDNonlabTemplateServices) GetIDNonlabTemplate(name string) (int, error) { + logger, _ := zap.NewProduction() + var ret int + + prmName := "%" + name + "%" + q := ` + SELECT + NonlabTemplateID + FROM nonlab_template + WHERE NonlabTemplateName LIKE ? + AND NonlabTemplateIsActive = 'Y' + ` + err := dbx.Handlex.Get(&ret, q, prmName) + if err != nil { + defer logger.Sync() + logger.Error("Error get data non lab template by id vs", + zap.String("name", prmName), + zap.Error(err), + ) + return ret, fmt.Errorf("QUERY FAILED GET DATA BY NAME") + } + return ret, nil +} + +func (nlt *MDNonlabTemplateServices) GetDetailByIDNonlabTemplate(id string) (models.NonlabTemplateDetail, error) { + logger, _ := zap.NewProduction() + var ret models.NonlabTemplateDetail + + q := ` + SELECT + NonlabTemplateDetailID, + NonlabTemplateDetailNonlabTemplateID, + NonlabTemplateDetailCode, + NonlabTemplateDetailName, + NonlabTemplateDetaiNat_UnitID, + NonlabTemplateDetailFlagActive, + NonlabTemplateDetaiM_LangID, + NonlabTemplateDetailIsActive + FROM nonlab_template_detail + WHERE NonlabTemplateDetailNonlabTemplateID = ? + AND NonlabTemplateDetailIsActive = 'Y' + ` + err := dbx.Handlex.Get(&ret, q, id) + if err != nil { + defer logger.Sync() + logger.Error("Error get data detail nonlab template", zap.Any("ID", id)) + return ret, fmt.Errorf("query failed, error get data by id : %v", err) + } + return ret, nil +} + +func (nlt *MDNonlabTemplateServices) ListDetailByIDNonlabTemplate(id string) ([]models.NonlabTemplateDetail, error) { + var ret []models.NonlabTemplateDetail + var totalData int + + query := ` + SELECT COUNT(*) + FROM nonlab_template_detail + WHERE NonlabTemplateDetailNonlabTemplateID = ? + AND NonlabTemplateDetailIsActive = 'Y' + ` + if err := dbx.Handlex.Get(&totalData, query, id); err != nil { + return ret, fmt.Errorf("error querying databases: %v", err) + } + + query = ` + SELECT + NonlabTemplateDetailID, + NonlabTemplateDetailNonlabTemplateID, + NonlabTemplateDetailCode, + NonlabTemplateDetailName, + NonlabTemplateDetaiNat_UnitID, + NonlabTemplateDetailFlagActive, + NonlabTemplateDetaiM_LangID, + NonlabTemplateDetailIsActive + FROM nonlab_template_detail + WHERE NonlabTemplateDetailNonlabTemplateID = ? + AND NonlabTemplateDetailIsActive = 'Y' + ` + if err := dbx.Handlex.Select(&ret, query, id); err != nil { + return ret, fmt.Errorf("error querying database: %v", err) + } + + return ret, nil +} + +func (nlt *MDNonlabTemplateServices) AddDetailNonlabTemplate(idnonlab string, kode string, name string, flagActive string) (models.NonlabTemplateDetail, error) { + logger, _ := zap.NewProduction() + var ret models.NonlabTemplateDetail + + var count int + prmKode := "%" + kode + "%" + prmName := "%" + name + "%" + q := ` + SELECT COUNT(*) + FROM nonlab_template_detail + WHERE (NonlabTemplateDetailCode LIKE ? OR NonlabTemplateDetailName LIKE ?) + AND NonlabTemplateDetailNonlabTemplateID = ? + AND NonlabTemplateDetailIsActive = 'Y' + ` + err := dbx.Handlex.Get(&count, q, prmKode, prmName, idnonlab) + if err != nil { + defer logger.Sync() + logger.Error("cek duplicate", zap.Any("kode", prmKode), zap.Any("nama", prmName)) + return ret, fmt.Errorf("query failed to cek duplicate: %v", err) + } + if count > 0 { + defer logger.Sync() + logger.Error("data duplicate", zap.Any("kode", prmKode), zap.Any("nama", prmName)) + return ret, fmt.Errorf("terdapat data duplikat") + } + + q = ` + INSERT INTO nonlab_template_detail ( + NonlabTemplateDetailNonlabTemplateID, + NonlabTemplateDetailCode, + NonlabTemplateDetailName, + NonlabTemplateDetailFlagActive, + NonlabTemplateDetailCreated + ) VALUES(?,?,?,?,NOW()) + ` + rsp := dbx.Handlex.MustExec(q, idnonlab, kode, name, flagActive) + insertedID, err := rsp.LastInsertId() + if err != nil { + defer logger.Sync() + logger.Error("error insert data", zap.Any("kode", prmKode), zap.Any("nama", prmName)) + return ret, fmt.Errorf("query failed to insert data: %v", err) + } + + s := strconv.Itoa(int(insertedID)) + + return nlt.GetDetailByIDNonlabTemplate(s) +} diff --git a/views/dev/mdnonlabtemplate/mdnonlabtmptmodal.templ b/views/dev/mdnonlabtemplate/mdnonlabtmptmodal.templ index f72f252..f98da87 100644 --- a/views/dev/mdnonlabtemplate/mdnonlabtmptmodal.templ +++ b/views/dev/mdnonlabtemplate/mdnonlabtmptmodal.templ @@ -18,6 +18,14 @@ templ MDNonlabTmpltForm(data models.MDNonlabTemplateForm) { hx-on::before-request={ HandleFormBeforeRequest() } hx-on::after-request={ HandleFormAfterRequest() } > + if data.ModalTitle == "Delete - Nonlab Template" { + @modalcomponent.Modal(data.ModalID, + data.ModalTitle, + data.DialogBody, + data.DialogAction, + data.ButtonClose, + ) + } @modalcomponent.ModalXL(data.ModalID, data.ModalTitle, data.DialogBody, @@ -57,11 +65,16 @@ templ BodyFormMDNonlabTemplate( inputID models.CustomTextFieldv2Prm, inputName models.CustomTextFieldv2Prm, inputFlag models.CustomCheckboxv1Prm, + detailKode models.CustomTextFieldv2Prm, + detailNama models.CustomTextFieldv2Prm, btnSimpan templ.Component, + btnAddDetail templ.Component, + tableDetail templ.Component, hxOnLoad templ.ComponentScript, ) {
@customtextfield.CustomTextFieldv2(inputID) +
Nama Template
@customtextfield.CustomTextFieldv2(inputName) @@ -70,7 +83,22 @@ templ BodyFormMDNonlabTemplate( @customcheckbox.MainCustomCheckboxInput(inputFlag)
- @btnSimpan +
+ @btnSimpan +
+
Detail Hasil
+
+
+ @customtextfield.CustomTextFieldv2(detailKode) +
+
+ @customtextfield.CustomTextFieldv2(detailNama) +
+
+ @btnAddDetail +
+
+ @tableDetail
") + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
Detail Hasil
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = customtextfield.CustomTextFieldv2(detailKode).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = customtextfield.CustomTextFieldv2(detailNama).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = btnAddDetail.Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -334,7 +372,7 @@ func ActionFormMDNonlabTmplt(LinkClose string, targetClose string, hxSwapClose s var templ_7745c5c3_Var14 string templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(LinkClose) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 103, Col: 31} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 129, Col: 31} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) if templ_7745c5c3_Err != nil { @@ -347,7 +385,7 @@ func ActionFormMDNonlabTmplt(LinkClose string, targetClose string, hxSwapClose s var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(targetClose) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 104, Col: 35} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 130, Col: 35} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) if templ_7745c5c3_Err != nil { @@ -360,7 +398,7 @@ func ActionFormMDNonlabTmplt(LinkClose string, targetClose string, hxSwapClose s var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(hxSwapClose) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 105, Col: 33} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 131, Col: 33} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) if templ_7745c5c3_Err != nil { @@ -401,7 +439,7 @@ func BtnCloseFormMDNonlabTmplt(LinkClose string, targetClose string, hxSwapClose var templ_7745c5c3_Var18 string templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(LinkClose) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 126, Col: 27} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 152, Col: 27} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) if templ_7745c5c3_Err != nil { @@ -414,7 +452,7 @@ func BtnCloseFormMDNonlabTmplt(LinkClose string, targetClose string, hxSwapClose var templ_7745c5c3_Var19 string templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(targetClose) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 127, Col: 31} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 153, Col: 31} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) if templ_7745c5c3_Err != nil { @@ -427,7 +465,7 @@ func BtnCloseFormMDNonlabTmplt(LinkClose string, targetClose string, hxSwapClose var templ_7745c5c3_Var20 string templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(hxSwapClose) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 128, Col: 29} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 154, Col: 29} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) if templ_7745c5c3_Err != nil { @@ -473,7 +511,7 @@ func BtnSimpanNama(Link string, target string, hxSwap string, modalID string, hx var templ_7745c5c3_Var23 string templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(Link) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 141, Col: 22} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 167, Col: 22} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23)) if templ_7745c5c3_Err != nil { @@ -486,7 +524,7 @@ func BtnSimpanNama(Link string, target string, hxSwap string, modalID string, hx var templ_7745c5c3_Var24 string templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(target) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 142, Col: 26} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 168, Col: 26} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24)) if templ_7745c5c3_Err != nil { @@ -499,7 +537,7 @@ func BtnSimpanNama(Link string, target string, hxSwap string, modalID string, hx var templ_7745c5c3_Var25 string templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(hxSwap) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 143, Col: 24} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 169, Col: 24} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25)) if templ_7745c5c3_Err != nil { @@ -512,7 +550,7 @@ func BtnSimpanNama(Link string, target string, hxSwap string, modalID string, hx var templ_7745c5c3_Var26 string templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(hxInclude) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 144, Col: 30} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\dev\mdnonlabtemplate\mdnonlabtmptmodal.templ`, Line: 170, Col: 30} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26)) if templ_7745c5c3_Err != nil { @@ -528,3 +566,79 @@ func BtnSimpanNama(Link string, target string, hxSwap string, modalID string, hx return templ_7745c5c3_Err }) } + +func BtnAddDetail(Link string, target string, hxSwap string, modalID string, hxInclude string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var27 := templ.GetChildren(ctx) + if templ_7745c5c3_Var27 == nil { + templ_7745c5c3_Var27 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/views/dev/mdnonlabtemplate/tabledetail.templ b/views/dev/mdnonlabtemplate/tabledetail.templ new file mode 100644 index 0000000..8c2dcd2 --- /dev/null +++ b/views/dev/mdnonlabtemplate/tabledetail.templ @@ -0,0 +1,104 @@ +package dev_mdnonlabtemplateview + +import "cpone/models" +import "strconv" +import "cpone/component/table" + +templ TableDetail(data []models.NonlabTemplateDetail, + tableDetailID string, + hxGetEdit string, + hxTargetEdit string, + hxSwapEdit string, + hxIncludeEdit string, + hxGetDelete string, + hxTargetDelete string, + hxSwapDelete string, + hxIncludeDelete string, +) { +
+ @tablecomponent.TableV3([]string{"KODE", "TEST", "AKSI"}, + []string{"20%","60%","20%"}, + RowDetail(data, + hxGetEdit, + hxTargetEdit, + hxSwapEdit, + hxIncludeEdit, + hxGetDelete, + hxTargetDelete, + hxSwapDelete, + hxIncludeDelete, + )) +
+} + +templ RowDetail( + data []models.NonlabTemplateDetail, + hxGetEdit string, + hxTargetEdit string, + hxSwapEdit string, + hxIncludeEdit string, + hxGetDelete string, + hxTargetDelete string, + hxSwapDelete string, + hxIncludeDelete string, +) { + if len(data) == 0 { + + Data Tidak Ditemukan + + } + for _, v := range data { + + { v.NonlabTemplateDetailCode } + { v.NonlabTemplateDetailName } + + @ActionRow(v.NonlabTemplateDetailID, + hxGetEdit, + hxTargetEdit, + hxSwapEdit, + hxIncludeEdit, + hxGetDelete, + hxTargetDelete, + hxSwapDelete, + hxIncludeDelete, + ) + + + } +} + + +templ ActionRow( + id int, + hxGetEdit string, + hxTargetEdit string, + hxSwapEdit string, + hxIncludeEdit string, + hxGetDelete string, + hxTargetDelete string, + hxSwapDelete string, + hxIncludeDelete string, +) { +
+ + +