diff --git a/.env b/.env index 7960c82..dceb696 100644 --- a/.env +++ b/.env @@ -13,12 +13,23 @@ SECRET_KEY=1bV363512D CONS_ID_DEV=16041 USER_KEY_DEV=467a2817fde5070f66c9a41fbeb8dc2c SECRET_KEY_DEV=8pP3D5431E +USER_KEY_ICARE=1cd65acaa349684be6353bea5149e2e2 BASEURL_BPJS_DEV=https://apijkn-dev.bpjs-kesehatan.go.id/ +VCLAIM_RS_DEV=vclaim-rest-dev SURAT_KONTROL_RS=vclaim-rest +I_CARE_JKN=wsihs +I_CARE_JKN_DEV=ihs_dev + INSERT_SURAT_KONTROL=/RencanaKontrol/insert UPDATE_SURAT_KONTROL=/RencanaKontrol/Update DELETE_SURAT_KONTROL=/RencanaKontrol/Delete GET_NOMOR_SURAT_KONTROL=/RencanaKontrol/noSuratKontrol/ GET_SURAT_KONTROL_SEP=/RencanaKontrol/nosep/ +GET_NOMOR_RUJUKAN=/Rujukan/ +GET_NOMOR_RUJUKAN_BATCH=/Rujukan/List/Peserta/ + +GET_FKRTL=/api/rs/validate +GET_FKTP=/api/pcare/validate + diff --git a/config/config.go b/config/config.go index 3bd7076..275cc78 100644 --- a/config/config.go +++ b/config/config.go @@ -36,20 +36,19 @@ func ConnectDB() { } } -func SetHeader(cfg config.ConfigBpjs) *config.Header { +func SetHeader(isIcare bool, cfg config.ConfigBpjs) *config.Header { timenow := time.Now().UTC() time := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC) tstamp := timenow.Unix() - time.Unix() - // cfg.Cons_id = os.Getenv("CONS_ID_DEV") - // cfg.User_key = os.Getenv("USER_KEY_DEV") - // cfg.Secret_key = os.Getenv("SECRET_KEY_DEV") - cfg.Cons_id = os.Getenv("CONS_ID") cfg.User_key = os.Getenv("USER_KEY") cfg.Secret_key = os.Getenv("SECRET_KEY") + if isIcare { + cfg.User_key = os.Getenv("USER_KEY_ICARE") + } secret := []byte(cfg.Secret_key) message := []byte(cfg.Cons_id + "&" + fmt.Sprint(tstamp)) hash := hmac.New(sha256.New, secret) diff --git a/database/satu_data/dokter/dokter.go b/database/satu_data/dokter/dokter.go index ea9a295..6d9c515 100644 --- a/database/satu_data/dokter/dokter.go +++ b/database/satu_data/dokter/dokter.go @@ -55,7 +55,8 @@ func GetNamaLengkapDokter(idDokter []string) ([]dokter.NamaLengkap, error) { from data_pegawai_daftar_gelar_belakang dpdgb left join daftar_gelar_belakang dgb on dpdgb.daftar_gelar_belakang_id = dgb.id where dpdgb.data_pegawai_id = dp.id ) AS gelarbelakang, - dp."HFIS_code" + dp."HFIS_code", + dp."Code_dpjp" as "DPJP_code" from "data_pegawai" dp left join data_ktp dk on dp."KTP" = dk.id WHERE dp.id in ?`, idDokter).Find(&namaDokter) @@ -70,3 +71,19 @@ func GetNamaLengkapDokter(idDokter []string) ([]dokter.NamaLengkap, error) { return namaDokter, nil } + +func GetHFISCode(dpjp string) (*dokter.DaftarDokter, error) { + var dataDokter *dokter.DaftarDokter + err := config.SatuDataDB.Debug().Raw(`select dp."id", dp."HFIS_code" from data_pegawai dp where dp."Code_dpjp" = ?`, dpjp).First(&dataDokter).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data tidak ditemukan") + log.Println("error :", errMsg) + return nil, errMsg + } + log.Println("error :", err) + return nil, err + } + log.Println("Daftar Dokter :", dataDokter) + return dataDokter, nil +} diff --git a/database/satu_data/log_api/log_api.go b/database/satu_data/log_api/log_api.go new file mode 100644 index 0000000..69156a7 --- /dev/null +++ b/database/satu_data/log_api/log_api.go @@ -0,0 +1,34 @@ +package logapi + +import ( + "bridging-rssa/config" + logapi "bridging-rssa/models/log_api" + "log" +) + +func InsertLogAPI(reqInsert *logapi.DataLogAPI) error { + query := `insert into "data_log_api" ( + "id", "date_created", "User_agent", "IP", "Parameter", "Header", "Method", "URL", "Request", "Respon", "Respon_code", "Respontime_start", "Respontime_end", "Comment" + ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` + err := config.SatuDataDB.Debug().Exec(query, + reqInsert.ID, + reqInsert.DateCreated, + reqInsert.UserAgent, + reqInsert.IP, + reqInsert.Parameter, + reqInsert.Header, + reqInsert.Method, + reqInsert.Url, + reqInsert.Request, + reqInsert.Respon, + reqInsert.ResponCode, + reqInsert.ResponTimeStart, + reqInsert.ResponTimeEnd, + reqInsert.Comment, + ).Error + if err != nil { + log.Println(err) + return err + } + return nil +} diff --git a/database/satu_data/log_api/log_icare.go b/database/satu_data/log_api/log_icare.go new file mode 100644 index 0000000..94cbdf9 --- /dev/null +++ b/database/satu_data/log_api/log_icare.go @@ -0,0 +1,24 @@ +package logapi + +import ( + "bridging-rssa/config" + logapi "bridging-rssa/models/log_api" + "log" +) + +func InsertLogICare(reqInsert *logapi.InsertLogICare) error { + query := `insert into "data_log_icare_bpjs" ("id", "date_created", "Ruangan", "Dokter", "Kunjungan_pasien", "Waktu_transaksi") + values (?, ?, ?, ?, ?, ?)` + errInsert := config.SatuDataDB.Debug().Exec(query, + reqInsert.ID, + reqInsert.DateCreated, + reqInsert.Ruangan, + reqInsert.Dokter, + reqInsert.Kunjungan_pasien, + reqInsert.WaktuTransaksi).Error + if errInsert != nil { + log.Println(errInsert) + return errInsert + } + return nil +} diff --git a/database/satu_data/pasien/kunjungan_pasien.go b/database/satu_data/pasien/kunjungan_pasien.go new file mode 100644 index 0000000..39361ac --- /dev/null +++ b/database/satu_data/pasien/kunjungan_pasien.go @@ -0,0 +1,27 @@ +package pasien + +import ( + "bridging-rssa/config" + "bridging-rssa/models/pasien" + "errors" + "log" + + "gorm.io/gorm" +) + +func GetDataKunjunganPasien(idxdaftar string) (*pasien.KunjunganPasien, error) { + var kunjunganPasien *pasien.KunjunganPasien + query := `select dks."id", dks."Ruangan" from "data_kunjungan_pasien" dks where dks."IDXDAFTAR" = ?` + err := config.SatuDataDB.Debug().Raw(query, idxdaftar).First(&kunjunganPasien).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + errMsg := errors.New("Data Tidak Ditemukan") + log.Println(errMsg) + return nil, errMsg + } + log.Println(err) + return nil, err + } + log.Println("Data Kunjungan Pasien : ", kunjunganPasien) + return kunjunganPasien, nil +} diff --git a/database/satu_data/surat_kontrol/surat_kontrol.go b/database/satu_data/surat_kontrol/surat_kontrol.go index b8595ac..f865ea6 100644 --- a/database/satu_data/surat_kontrol/surat_kontrol.go +++ b/database/satu_data/surat_kontrol/surat_kontrol.go @@ -30,7 +30,8 @@ func GetDataKunjunganPasien(idxdaftar string) (*suratkontrol.KunjunganPasien, er where dpdgb.data_pegawai_id = dp.id ) AS gelarbelakang, dkp."Ruangan" as ruangan, - dkp."DPJP" as id_dokter + dkp."DPJP" as id_dokter, + dkp."NOMR" as "No_rm" from data_kunjungan_pasien dkp left join daftar_lokasi_ruang dlr on dkp."Ruangan" = dlr.id left join data_pegawai dp on dkp."DPJP" = dp.id @@ -78,7 +79,7 @@ func InsertDataSuratKontrol(reqInsert *suratkontrol.DataSuratKontrol) error { return nil } -func GetDataSuratKontrol() ([]*suratkontrol.GetDataSuratKontrol, error) { +func GetDataSuratKontrol(offset, limit string) ([]*suratkontrol.GetDataSuratKontrol, error) { var dataSurKon []*suratkontrol.GetDataSuratKontrol err := config.SatuDataDB.Debug().Raw(`select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol", dsk."Nomor_surat_kontrol", @@ -103,6 +104,7 @@ func GetDataSuratKontrol() ([]*suratkontrol.GetDataSuratKontrol, error) { ds."id" as "ID_poli", dp."HFIS_code" as "Kode_dokter", dp."id" as "id_dokter", + dp."Code_dpjp" as "Kode_dpjp", dkp2."NOMR" as "No_rm", dkp2."Diagnosis_primer_utama" as "Kode_diagnosa", dkp2."Display_diagnosis_primer_utama" as "Nama_diagnosa", @@ -113,17 +115,14 @@ func GetDataSuratKontrol() ([]*suratkontrol.GetDataSuratKontrol, error) { left join data_pegawai dp on dsk."DPJP_surat_kontrol" = dp."id" left join data_ktp dk on dp."KTP" = dk. "id" left join daftar_subspesialis ds on dp."Subspesialis" = ds."id" - where dsk."Status_surat_kontrol" = '1'`).Scan(&dataSurKon).Error + where dsk."Status_surat_kontrol" = '1' offset ? limit ?`, offset, limit).Scan(&dataSurKon).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { errMsg := errors.New("DPJP anda belum ada subspesialis") log.Println(errMsg) return nil, errMsg } - log.Println(err) - return nil, err } - log.Println("Data Surat Kontrol : ", dataSurKon) return dataSurKon, nil } @@ -152,10 +151,12 @@ func GetDataSuratKontrolByID(idxdaftar string) (*suratkontrol.GetDataSuratKontro ds."id" as "ID_poli", dp."HFIS_code" as "Kode_dokter", dp."id" as "id_dokter", + dp."Code_dpjp" as "Kode_dpjp", dkp2."NOMR" as "No_rm", dkp2."Diagnosis_primer_utama" as "Kode_diagnosa", dkp2."Display_diagnosis_primer_utama" as "Nama_diagnosa", - dsk."Tipe_surat_kontrol" as "Tipe_SurKon" + dsk."Tipe_surat_kontrol" as "Tipe_SurKon", + dsk."User_created_surat_kontrol" as "User" from data_surat_kontrol dsk left join data_kunjungan_pasien dkp2 on dkp2."id" = dsk."Kunjungan_pasien" left join daftar_lokasi_ruang dlr on dsk."Ruangan_surat_kontrol" = dlr."id" @@ -169,10 +170,7 @@ func GetDataSuratKontrolByID(idxdaftar string) (*suratkontrol.GetDataSuratKontro log.Println(errMsg) return nil, errMsg } - log.Println(err) - return nil, err } - log.Println("Data Surat Kontrol : ", dataSurKon) return dataSurKon, nil } @@ -184,6 +182,7 @@ func UpdateDataSuratKontrol(reqUpdate *suratkontrol.DataSuratKontrol) error { } return nil } + func GetIDXDaftarBySurKon(idSurKon string) (string, error) { var idxDaftar string err := config.SatuDataDB.Debug().Raw(`select dkp."IDXDAFTAR" @@ -209,7 +208,7 @@ func GetAllDataSuratKontrol(idSurKon string) (*suratkontrol.DataSuratKontrol, er func SearchDataSurKon(req suratkontrol.RequestCariPasien, query string, args []interface{}) ([]*suratkontrol.GetDataSuratKontrol, error) { var dataSurKon []*suratkontrol.GetDataSuratKontrol - query += ` and date(dsk."Tanggal_rencana_kontrol") between ? and ?` + query += ` and date(dsk."Tanggal_rencana_kontrol") between ? and ? offset ? limit ?` querySelect := `select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol", dsk."Nomor_surat_kontrol", (select dlr."Nama" @@ -233,6 +232,7 @@ func SearchDataSurKon(req suratkontrol.RequestCariPasien, query string, args []i ds."id" as "ID_poli", dp."HFIS_code" as "Kode_dokter", dp."id" as "id_dokter", + dp."Code_dpjp" as "Kode_dpjp", dkp2."NOMR" as "No_rm", dkp2."Diagnosis_primer_utama" as "Kode_diagnosa", dkp2."Display_diagnosis_primer_utama" as "Nama_diagnosa", @@ -243,13 +243,44 @@ func SearchDataSurKon(req suratkontrol.RequestCariPasien, query string, args []i left join data_pegawai dp on dsk."DPJP_surat_kontrol" = dp."id" left join data_ktp dk on dp."KTP" = dk. "id" left join daftar_subspesialis ds on dp."Subspesialis" = ds."id" - where dsk."Status_surat_kontrol" = '1' ` + where dsk."Status_surat_kontrol" = '1' and dsk."Tipe_surat_kontrol" = ? ` querySelect += query err := config.SatuDataDB.Debug().Raw(querySelect, args...).Find(&dataSurKon).Error if err != nil { log.Println(err) return nil, err } - log.Println("Data Surat Kontrol : ", dataSurKon) return dataSurKon, nil } + +func CountDataSurKon(req suratkontrol.RequestCariPasien, query string, args []interface{}) (int, error) { + var jumlahData int + query += ` and date(dsk."Tanggal_rencana_kontrol") between ? and ?` + querySelect := `select count(dsk.*) + from data_surat_kontrol dsk + left join data_kunjungan_pasien dkp2 on dkp2."id" = dsk."Kunjungan_pasien" + left join daftar_lokasi_ruang dlr on dsk."Ruangan_surat_kontrol" = dlr."id" + left join data_pegawai dp on dsk."DPJP_surat_kontrol" = dp."id" + left join data_ktp dk on dp."KTP" = dk. "id" + left join daftar_subspesialis ds on dp."Subspesialis" = ds."id" + where dsk."Status_surat_kontrol" = '1' and dsk."Tipe_surat_kontrol" = ? ` + querySelect += query + err := config.SatuDataDB.Debug().Raw(querySelect, args...).Find(&jumlahData).Error + if err != nil { + log.Println(err) + return 0, err + } + return jumlahData, nil +} + +func GetNomorSurKon(idPasien string) (string, error) { + var noSurKon string + querySelect := `select dsk."Nomor_surat_kontrol" from data_surat_kontrol dsk where dsk."Kunjungan_pasien" = ? and dsk."Tipe_surat_kontrol" <> '1' order by dsk."date_created"` + err := config.SatuDataDB.Debug().Raw(querySelect, idPasien).Scan(&noSurKon).Error + if err != nil { + log.Println(err) + return "", err + } + log.Println("Nomor SurKon :", noSurKon) + return noSurKon, nil +} diff --git a/docs/utils/utils.go b/docs/utils/utils.go index 2a5f1d1..bf6d46b 100644 --- a/docs/utils/utils.go +++ b/docs/utils/utils.go @@ -1,7 +1,9 @@ package utils import ( + "fmt" "log" + "strconv" "strings" ) @@ -43,3 +45,17 @@ func ReplaceGelar(gelar string) string { gelar = strings.ReplaceAll(gelar, ",", " ") return gelar } + +func GetNoUrut(noSurKon string) (string, error) { + noSurKonSlice := strings.Split(noSurKon, "/") + noUrut := noSurKonSlice[3] + noUrutInt, err := strconv.Atoi(noUrut) + if err != nil { + return "", err + } + + noUrutInt++ + noUrutStr := fmt.Sprintf("%03d", noUrutInt) + log.Println("No Urut: ", noUrutStr) + return noUrutStr, nil +} diff --git a/go.mod b/go.mod index 4874b1d..c78cb6c 100644 --- a/go.mod +++ b/go.mod @@ -65,6 +65,7 @@ require ( github.com/google/uuid v1.6.0 github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/robfig/cron/v3 v3.0.1 golang.org/x/text v0.18.0 // indirect gorm.io/driver/postgres v1.5.9 ) diff --git a/go.sum b/go.sum index 9b93f1e..2a98a09 100644 --- a/go.sum +++ b/go.sum @@ -96,6 +96,8 @@ github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xl github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= diff --git a/handlers/bpjs/i_care/i_care.go b/handlers/bpjs/i_care/i_care.go new file mode 100644 index 0000000..edb6e29 --- /dev/null +++ b/handlers/bpjs/i_care/i_care.go @@ -0,0 +1,264 @@ +package icare + +import ( + "bridging-rssa/database/satu_data/dokter" + log_api "bridging-rssa/database/satu_data/log_api" + "bridging-rssa/database/satu_data/pasien" + "bridging-rssa/models/config" + logapi "bridging-rssa/models/log_api" + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "strconv" + "strings" + "time" + + cfg "bridging-rssa/config" + ic "bridging-rssa/models/bpjs/i_care" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" +) + +func GetFKRTL(c *gin.Context) { + baseUrl := os.Getenv("BASEURL_BPJS") + endpoint := os.Getenv("I_CARE_JKN") + param := os.Getenv("GET_FKRTL") + url := baseUrl + endpoint + param + + log.Println("URL :", url) + var req *ic.ReqICare + + err := c.Bind(&req) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + + reqICare := &ic.RequestICare{ + Param: req.Param, + KodeDokter: req.KodeDokter, + } + + reqJson, errMarshal := json.Marshal(reqICare) + if errMarshal != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: errMarshal.Error(), + }) + return + } + + log.Println("REQUEST: ", string(reqJson)) + + conf := config.ConfigBpjs{} + + icare := true + header := cfg.SetHeader(icare, conf) + + headers := map[string]string{ + "X-cons-id": header.ConsID, + "X-timestamp": header.TimeStamp, + "X-signature": header.XSignature, + "user_key": header.UserKey, + "Content-Type": "application/json", + } + log.Println("Headers : ", headers) + + var headerStringBuilder strings.Builder + for key, value := range headers { + headerStringBuilder.WriteString(fmt.Sprintf("%s: %s; ", key, value)) + } + headerString := strings.TrimSuffix(headerStringBuilder.String(), "; ") + + dpjp := strconv.Itoa(req.KodeDokter) + + dataDokter, err := dokter.GetHFISCode(dpjp) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + + reqICare.KodeDokter, err = strconv.Atoi(dataDokter.HfisCode) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + + kunjunganPasien, err := pasien.GetDataKunjunganPasien(req.IDXDaftar) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + + uuid := uuid.New().String() + logTimeStart := time.Now().Format("2006-01-02 15:04:05") + res, err := ResponseGetFKRTL(url, header, headers, reqICare) + if err != nil { + responJson, errMarshal2 := json.Marshal(res) + if errMarshal2 != nil { + log.Println(errMarshal2) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: errMarshal2.Error(), + }) + return + } + logTimeEnd := time.Now().Format("2006-01-02 15:04:05") + reqInsertLog := &logapi.DataLogAPI{ + ID: uuid, + DateCreated: logTimeEnd, + UserAgent: req.User, + IP: c.ClientIP(), + Parameter: "BPJS-ICare-FKRTL", + Header: headerString, + Method: "POST", + Url: url, + Request: reqJson, + Respon: responJson, + ResponCode: strconv.Itoa(res.MetaData.Code), + ResponTimeStart: logTimeStart, + ResponTimeEnd: logTimeEnd, + Comment: res.MetaData.Message, + } + + errInsert := log_api.InsertLogAPI(reqInsertLog) + if errInsert != nil { + log.Println(errInsert) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: errInsert.Error(), + }) + return + } + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + responJson, err := json.Marshal(res) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + logTimeEnd := time.Now().Format("2006-01-02 15:04:05") + reqInsertLog := &logapi.DataLogAPI{ + ID: uuid, + DateCreated: logTimeEnd, + UserAgent: req.User, + IP: c.ClientIP(), + Parameter: "BPJS-ICare-FKRTL", + Header: headerString, + Method: "POST", + Url: url, + Request: reqJson, + Respon: responJson, + ResponCode: strconv.Itoa(res.MetaData.Code), + ResponTimeStart: logTimeStart, + ResponTimeEnd: logTimeEnd, + Comment: res.MetaData.Message, + } + + err = log_api.InsertLogAPI(reqInsertLog) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + + reqInsert := &logapi.InsertLogICare{ + ID: uuid, + DateCreated: logTimeEnd, + Ruangan: kunjunganPasien.Ruangan, + Dokter: dataDokter.ID, + Kunjungan_pasien: kunjunganPasien.ID, + WaktuTransaksi: logTimeEnd, + } + + errInsert := log_api.InsertLogICare(reqInsert) + if errInsert != nil { + log.Println(errInsert) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: errInsert.Error(), + }) + return + } + + c.JSON(http.StatusOK, res) +} + +func GetFKTP(c *gin.Context) { + baseUrl := os.Getenv("BASEURL_BPJS") + endpoint := os.Getenv("I_CARE_JKN") + param := os.Getenv("GET_FKRTL") + url := baseUrl + endpoint + param + + log.Println("URL :", url) + var req *ic.RequestICare + + err := c.Bind(&req) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + + log.Println("REQUEST: ", req) + + conf := config.ConfigBpjs{} + + header := cfg.SetHeaderDev(conf) + + headers := map[string]string{ + "X-cons-id": header.ConsID, + "X-timestamp": header.TimeStamp, + "X-signature": header.XSignature, + "user_key": header.UserKey, + "Content-Type": "application/json", + } + log.Println("Headers : ", headers) + + res, err := ResponseGetFKRTL(url, header, headers, req) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &ic.Metadata{ + Code: 0, + Message: err.Error(), + }) + return + } + + c.JSON(http.StatusOK, res) +} diff --git a/handlers/bpjs/i_care/response.go b/handlers/bpjs/i_care/response.go new file mode 100644 index 0000000..9ed5cca --- /dev/null +++ b/handlers/bpjs/i_care/response.go @@ -0,0 +1,222 @@ +package icare + +import ( + "bridging-rssa/docs" + ic "bridging-rssa/models/bpjs/i_care" + "bridging-rssa/models/config" + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "log" + "net/http" + "strings" + "time" +) + +func ResponseGetFKRTL(url string, header *config.Header, headers map[string]string, request *ic.RequestICare) (*ic.ResponseGet, error) { + log.Println("URL", url) + + reqMarshall, err := json.Marshal(request) + if err != nil { + log.Printf("Error json marshal: %v", err) + } + + log.Println("REQUEST: ", string(reqMarshall)) + + req, err := http.NewRequest("POST", url, bytes.NewReader(reqMarshall)) + if err != nil { + log.Printf("Error creating request: %v", err) + return nil, err + } + for key, value := range headers { + req.Header.Set(key, value) + } + + log.Println("REQ", req.Header) + client := http.Client{ + Timeout: 10 * time.Second, + } + + responses := &ic.ResponseGet{} + response, err := client.Do(req) + if err != nil { + if strings.Contains(strings.ToLower(err.Error()), "deadline exceeded") { + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") + log.Printf("error : %v", errMsg) + responses.MetaData.Message = errMsg.Error() + log.Println("responses: ", responses) + return responses, err + } + log.Printf("Error making external API request: %v", err) + return responses, err + } + log.Println("RESPONSE: ", response) + + if response.StatusCode == http.StatusGatewayTimeout { // 504 + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") + log.Printf("error : %v", errMsg) + responses.MetaData.Code = 504 + responses.MetaData.Message = errMsg.Error() + log.Println("responses: ", responses) + return responses, err + } + + key := header.ConsID + header.SecretKey + header.TimeStamp + res, err := io.ReadAll(response.Body) + if err != nil { + fmt.Println(err) + return nil, err + } + + log.Println("Res:", string(res)) + + var resFkrtlRaw ic.ResponseGetRaw + err = json.Unmarshal([]byte(string(res)), &resFkrtlRaw) + if err != nil { + log.Printf("Error Unmarshaling: %v", err) + return nil, err + } + + log.Println("ResponseRaw : ", resFkrtlRaw) + + if resFkrtlRaw.MetaData.Code != 200 { + errMsg := errors.New(resFkrtlRaw.MetaData.Message) + if strings.Contains(strings.ToLower(resFkrtlRaw.MetaData.Message), "Gagal simpan!") { + message := "Surat kontrol gagal diterbitkan, pastikan klinik tujuan sama dengan klinik asal pada rujukan awal" + resFkrtlRaw.MetaData.Message = message + } + log.Printf("error : %v", errMsg) + responses.MetaData.Code = resFkrtlRaw.MetaData.Code + responses.MetaData.Message = resFkrtlRaw.MetaData.Message + log.Println("responses: ", responses) + return responses, errMsg + } + + dataResp, err := docs.StringDecrypt(key, resFkrtlRaw.Response) + if err != nil { + log.Printf("Error Decrypt: %v", err) + log.Println("res: ", dataResp) + return nil, err + } + + var resFkrtl ic.Response + + log.Println("dataresp: ", dataResp) + + err = json.Unmarshal([]byte(dataResp), &resFkrtl) + if err != nil { + log.Printf("Error Decode: %v", err) + return nil, err + } + + responses = &ic.ResponseGet{ + Response: resFkrtl, + MetaData: resFkrtlRaw.MetaData, + } + return responses, nil +} + +func ResponseGetFKTP(url string, header *config.Header, headers map[string]string, request *ic.ReqFKTP) (*ic.ResponseGet, error) { + log.Println("URL", url) + + reqMarshall, err := json.Marshal(request) + if err != nil { + log.Printf("Error json marshal: %v", err) + } + + log.Println("REQUEST: ", string(reqMarshall)) + + req, err := http.NewRequest("POST", url, bytes.NewReader(reqMarshall)) + if err != nil { + log.Printf("Error creating request: %v", err) + return nil, err + } + for key, value := range headers { + req.Header.Set(key, value) + } + + log.Println("REQ", req.Header) + client := http.Client{ + Timeout: 10 * time.Second, + } + + responses := &ic.ResponseGet{} + response, err := client.Do(req) + if err != nil { + if strings.Contains(strings.ToLower(err.Error()), "deadline exceeded") { + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") + log.Printf("error : %v", errMsg) + responses.MetaData.Message = errMsg.Error() + log.Println("responses: ", responses) + return responses, err + } + log.Printf("Error making external API request: %v", err) + return responses, err + } + log.Println("RESPONSE: ", response) + + if response.StatusCode == http.StatusGatewayTimeout { // 504 + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") + log.Printf("error : %v", errMsg) + responses.MetaData.Code = 504 + responses.MetaData.Message = errMsg.Error() + log.Println("responses: ", responses) + return responses, err + } + + key := header.ConsID + header.SecretKey + header.TimeStamp + res, err := io.ReadAll(response.Body) + if err != nil { + fmt.Println(err) + return nil, err + } + + log.Println("Res:", string(res)) + + var resFkrtlRaw ic.ResponseGetRaw + err = json.Unmarshal([]byte(string(res)), &resFkrtlRaw) + if err != nil { + log.Printf("Error Unmarshaling: %v", err) + return nil, err + } + + log.Println("ResponseRaw : ", resFkrtlRaw) + + if resFkrtlRaw.MetaData.Code != 200 { + errMsg := errors.New(resFkrtlRaw.MetaData.Message) + if strings.Contains(strings.ToLower(resFkrtlRaw.MetaData.Message), "Gagal simpan!") { + message := "Surat kontrol gagal diterbitkan, pastikan klinik tujuan sama dengan klinik asal pada rujukan awal" + resFkrtlRaw.MetaData.Message = message + } + log.Printf("error : %v", errMsg) + responses.MetaData.Code = resFkrtlRaw.MetaData.Code + responses.MetaData.Message = resFkrtlRaw.MetaData.Message + log.Println("responses: ", responses) + return responses, errMsg + } + + dataResp, err := docs.StringDecrypt(key, resFkrtlRaw.Response) + if err != nil { + log.Printf("Error Decrypt: %v", err) + log.Println("res: ", dataResp) + return nil, err + } + + var resFkrtl ic.Response + + log.Println("dataresp: ", dataResp) + + err = json.Unmarshal([]byte(dataResp), &resFkrtl) + if err != nil { + log.Printf("Error Decode: %v", err) + return nil, err + } + + responses = &ic.ResponseGet{ + Response: resFkrtl, + MetaData: resFkrtlRaw.MetaData, + } + return responses, nil +} diff --git a/handlers/bpjs/jadwal_dokter/jadwal_dokter.go b/handlers/bpjs/jadwal_dokter/jadwal_dokter.go index ec82326..b62f759 100644 --- a/handlers/bpjs/jadwal_dokter/jadwal_dokter.go +++ b/handlers/bpjs/jadwal_dokter/jadwal_dokter.go @@ -17,14 +17,14 @@ import ( "github.com/gin-gonic/gin" ) -func GetJadwalDokter(c *gin.Context) { +func GetJadwalDokter() bool { baseUrl := os.Getenv("BASEURL_BPJS") endpoint := os.Getenv("ANTREAN_RS") url := baseUrl + endpoint conf := config.ConfigBpjs{} - header := cfg.SetHeader(conf) + header := cfg.SetHeader(false, conf) headers := map[string]string{ "X-cons-id": header.ConsID, @@ -36,20 +36,20 @@ func GetJadwalDokter(c *gin.Context) { errTruncate := dokter.DeleteJadwalDokter() if errTruncate != nil { - log.Fatal(errTruncate) - c.JSON(http.StatusInternalServerError, errTruncate) + log.Println(errTruncate) + return false } errTruncateTemp := dokter.DeleteJadwalDokterTemp() if errTruncateTemp != nil { - log.Fatal(errTruncateTemp) - c.JSON(http.StatusInternalServerError, errTruncateTemp) + log.Println(errTruncateTemp) + return false } // Select from daftar spesialis spesialis, err := dokter.GetSpesialis() if err != nil { - c.JSON(http.StatusInternalServerError, err) + return false } var listIdSpesialis = make(map[string]int) @@ -59,7 +59,7 @@ func GetJadwalDokter(c *gin.Context) { subspesialis, err := dokter.GetSubspesialis() if err != nil { - c.JSON(http.StatusInternalServerError, err) + return false } var listIdSubspesialis = make(map[string]int) @@ -69,7 +69,7 @@ func GetJadwalDokter(c *gin.Context) { listDokter, err := dokter.GetDokter() if err != nil { - c.JSON(http.StatusInternalServerError, err) + return false } var listIddokter = make(map[int]string) @@ -86,9 +86,15 @@ func GetJadwalDokter(c *gin.Context) { kdPoly := value.Kode res, err = JadwalDokterGetResponse(url, header, kdPoly, tanggal, headers) if err != nil { - log.Fatalf("Error making external API request: %v", err) - c.JSON(http.StatusInternalServerError, err) + log.Println("Error making external API request: %v", err) + return false } + date, errParse := time.Parse("2006-01-02", tanggal) + if errParse != nil { + return false + } + tanggal = date.AddDate(0, 0, 1).Format("2006-01-02") + log.Println("Tanggal :", tanggal) if res == nil { log.Println("Skip Proses") continue @@ -110,27 +116,20 @@ func GetJadwalDokter(c *gin.Context) { errInsert := dokter.InsertJadwalDokter(reqInsert) if errInsert != nil { log.Println(errInsert) - c.JSON(http.StatusInternalServerError, errInsert) + return false } } else { reqInsert.Dokter = strconv.Itoa(v.KodeDokter) errInsertTemp := dokter.InsertJadwalDokterTemp(reqInsert) if errInsertTemp != nil { log.Println(errInsertTemp) - c.JSON(http.StatusInternalServerError, errInsertTemp) + return false } } } - date, errParse := time.Parse("2006-01-02", tanggal) - if errParse != nil { - c.JSON(http.StatusInternalServerError, errParse) - return - } - tanggal = date.AddDate(0, 0, 1).Format("2006-01-02") - log.Println("Tanggal :", tanggal) } } - c.JSON(http.StatusOK, res) + return true } func GetDokterByDPJP(c *gin.Context) { @@ -189,7 +188,7 @@ func GetDokterByDPJP(c *gin.Context) { Kode: listSubspesialis.Kode, Spesialis: listSubspesialis.Spesialis, Subspesialis: listSubspesialis.Subspesialis, - IDSubspesialis: listSubspesialis.Kode, + IDSubspesialis: listSubspesialis.ID, NamaLengkap: namaLengkap, HFISCode: hfisCode, KodeDPJP: dpjp, diff --git a/handlers/bpjs/surat_kontrol/response.go b/handlers/bpjs/surat_kontrol/response.go index a469c14..fe9314a 100644 --- a/handlers/bpjs/surat_kontrol/response.go +++ b/handlers/bpjs/surat_kontrol/response.go @@ -36,14 +36,34 @@ func PostData(url string, header *config.Header, headers map[string]string, requ } log.Println("REQ", req.Header) - client := http.Client{} + client := http.Client{ + Timeout: 10 * time.Second, + } + + responses := &suratkontrol.Response{} response, err := client.Do(req) if err != nil { + if strings.Contains(strings.ToLower(err.Error()), "deadline exceeded") { + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") + log.Printf("error : %v", errMsg) + responses.MetaData.Message = errMsg.Error() + log.Println("responses: ", responses) + return responses, err + } log.Printf("Error making external API request: %v", err) - return nil, err + return responses, err } log.Println("RESPONSE: ", response) + if response.StatusCode == http.StatusGatewayTimeout { // 504 + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") + log.Printf("error : %v", errMsg) + responses.MetaData.Code = "504" + responses.MetaData.Message = errMsg.Error() + log.Println("responses: ", responses) + return responses, err + } + key := header.ConsID + header.SecretKey + header.TimeStamp res, err := io.ReadAll(response.Body) if err != nil { @@ -62,12 +82,19 @@ func PostData(url string, header *config.Header, headers map[string]string, requ log.Println("ResponseRaw : ", resSuratKontrolRaw) - responses := &suratkontrol.Response{} if resSuratKontrolRaw.MetaData.Code != "200" { - errMsg := errors.New(resSuratKontrolRaw.MetaData.Message) - log.Printf("error : %v", errMsg) + if resSuratKontrolRaw.MetaData.Message == "Gagal simpan! Nomor SEP Sudah pernah digunakan!." { + message := "Gagal simpan! Nomor SEP pernah diterbitkan Surat Kontrol!." + resSuratKontrolRaw.MetaData.Message = message + log.Println("masuk sini kan") + } else if strings.Contains(strings.ToLower(resSuratKontrolRaw.MetaData.Message), "gagal simpan") { + message := "Surat kontrol gagal diterbitkan, pastikan klinik tujuan sama dengan klinik asal pada rujukan awal" + resSuratKontrolRaw.MetaData.Message = message + } + log.Printf("error : %v", resSuratKontrolRaw.MetaData.Message) responses.MetaData.Code = resSuratKontrolRaw.MetaData.Code responses.MetaData.Message = resSuratKontrolRaw.MetaData.Message + errMsg := errors.New(resSuratKontrolRaw.MetaData.Message) log.Println("responses: ", responses) return responses, errMsg } @@ -125,7 +152,7 @@ func ResponseUpdateSuratKontrol(url string, header *config.Header, headers map[s response, err := client.Do(req) if err != nil { if strings.Contains(strings.ToLower(err.Error()), "deadline exceeded") { - errMsg := errors.New("Gagal Proses Selama 10 Detik, Silahkan Coba Lagi") + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") log.Printf("error : %v", errMsg) responses.MetaData.Message = errMsg.Error() log.Println("responses: ", responses) @@ -137,7 +164,7 @@ func ResponseUpdateSuratKontrol(url string, header *config.Header, headers map[s log.Println("RESPONSE: ", response) if response.StatusCode == http.StatusGatewayTimeout { // 504 - errMsg := errors.New("Gagal Proses Selama 10 Detik, Silahkan Coba Lagi") + errMsg := errors.New("Koneksi BPJS Terputus, Silahkan Coba Lagi") log.Printf("error : %v", errMsg) responses.MetaData.Code = "504" responses.MetaData.Message = errMsg.Error() @@ -162,10 +189,18 @@ func ResponseUpdateSuratKontrol(url string, header *config.Header, headers map[s } if resSuratKontrolRaw.MetaData.Code != "200" { - errMsg := errors.New(resSuratKontrolRaw.MetaData.Message) - log.Printf("error : %v", errMsg) + if resSuratKontrolRaw.MetaData.Message == "Gagal simpan! Nomor SEP Sudah pernah digunakan!." { + message := "Gagal simpan! Nomor SEP pernah diterbitkan Surat Kontrol!." + resSuratKontrolRaw.MetaData.Message = message + log.Println("masuk sini kan") + } else if strings.Contains(strings.ToLower(resSuratKontrolRaw.MetaData.Message), "gagal simpan") { + message := "Surat kontrol gagal diterbitkan, pastikan klinik tujuan sama dengan klinik asal pada rujukan awal" + resSuratKontrolRaw.MetaData.Message = message + } + log.Printf("error : %v", resSuratKontrolRaw.MetaData.Message) responses.MetaData.Code = resSuratKontrolRaw.MetaData.Code responses.MetaData.Message = resSuratKontrolRaw.MetaData.Message + errMsg := errors.New(resSuratKontrolRaw.MetaData.Message) log.Println("responses: ", responses) return responses, errMsg } @@ -237,7 +272,17 @@ func ResponseDeleteSuratKontrol(url string, header *config.Header, headers map[s return nil, err } - responses := &suratkontrol.Response{ + responses := &suratkontrol.Response{} + if resSuratKontrolRaw.MetaData.Code != "200" { + errMsg := errors.New(resSuratKontrolRaw.MetaData.Message) + log.Printf("error : %v", errMsg) + responses.MetaData.Code = resSuratKontrolRaw.MetaData.Code + responses.MetaData.Message = resSuratKontrolRaw.MetaData.Message + log.Println("responses: ", responses) + return responses, errMsg + } + + responses = &suratkontrol.Response{ MetaData: resSuratKontrolRaw.MetaData, } @@ -280,6 +325,16 @@ func ResponseGetNomorSuratKontrol(url string, header *config.Header, headers map return nil, err } + responses := &suratkontrol.ResponseGetSuratKontrol{} + if resNoSuratKontrolRaw.MetaData.Code != "200" { + errMsg := errors.New(resNoSuratKontrolRaw.MetaData.Message) + log.Printf("error : %v", errMsg) + responses.MetaData.Code = resNoSuratKontrolRaw.MetaData.Code + responses.MetaData.Message = resNoSuratKontrolRaw.MetaData.Message + log.Println("responses: ", responses) + return responses, errMsg + } + dataResp, err := docs.StringDecrypt(key, resNoSuratKontrolRaw.Response) if err != nil { log.Printf("Error Decrypt: %v", err) @@ -295,7 +350,7 @@ func ResponseGetNomorSuratKontrol(url string, header *config.Header, headers map return nil, err } - responses := &suratkontrol.ResponseGetSuratKontrol{ + responses = &suratkontrol.ResponseGetSuratKontrol{ MetaData: resNoSuratKontrolRaw.MetaData, Response: responseNoSuratKontrol, } @@ -337,6 +392,16 @@ func ResponseGetSuratKontrolBySEP(url string, header *config.Header, headers map return nil, err } + responses := &suratkontrol.ResponseGetSuratKontrolBySEP{} + if resSurKonSEP.MetaData.Code != "200" { + errMsg := errors.New(resSurKonSEP.MetaData.Message) + log.Printf("error : %v", errMsg) + responses.MetaData.Code = resSurKonSEP.MetaData.Code + responses.MetaData.Message = resSurKonSEP.MetaData.Message + log.Println("responses: ", responses) + return responses, errMsg + } + dataResp, err := docs.StringDecrypt(key, resSurKonSEP.Response) if err != nil { log.Printf("Error Decrypt: %v", err) @@ -354,7 +419,7 @@ func ResponseGetSuratKontrolBySEP(url string, header *config.Header, headers map log.Println("res: ", resSurKonSEP) - responses := &suratkontrol.ResponseGetSuratKontrolBySEP{ + responses = &suratkontrol.ResponseGetSuratKontrolBySEP{ MetaData: resSurKonSEP.MetaData, Response: responseNoSuratKontrol, } diff --git a/handlers/bpjs/surat_kontrol/surat_kontrol.go b/handlers/bpjs/surat_kontrol/surat_kontrol.go index 2ed6f9f..4ae4c8b 100644 --- a/handlers/bpjs/surat_kontrol/surat_kontrol.go +++ b/handlers/bpjs/surat_kontrol/surat_kontrol.go @@ -2,10 +2,14 @@ package suratkontrol import ( cfg "bridging-rssa/config" + log_api "bridging-rssa/database/satu_data/log_api" suratkontrol "bridging-rssa/database/satu_data/surat_kontrol" "bridging-rssa/docs/utils" sk "bridging-rssa/models/bpjs/surat_kontrol" "bridging-rssa/models/config" + logapi "bridging-rssa/models/log_api" + "encoding/json" + "fmt" "log" "net/http" "os" @@ -29,15 +33,28 @@ func InsertSuratKontrol(c *gin.Context) { err := c.Bind(&req) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } - log.Println("Request: ", req) + reqJson, err := json.Marshal(req) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + + log.Println("Request: ", string(reqJson)) conf := config.ConfigBpjs{} - header := cfg.SetHeader(conf) + header := cfg.SetHeader(false, conf) headers := map[string]string{ "X-cons-id": header.ConsID, @@ -48,7 +65,11 @@ func InsertSuratKontrol(c *gin.Context) { } log.Println("Headers : ", headers) - tipeSurKon := "1" + var headerStringBuilder strings.Builder + for key, value := range headers { + headerStringBuilder.WriteString(fmt.Sprintf("%s: %s; ", key, value)) + } + headerString := strings.TrimSuffix(headerStringBuilder.String(), "; ") kunjunganPasien, err := suratkontrol.GetDataKunjunganPasien(req.IDXDaftar) if err != nil { @@ -61,28 +82,67 @@ func InsertSuratKontrol(c *gin.Context) { } uuid := uuid.New().String() - if req.NoSEP == "" { - tipeSurKon = "0" + if req.TipeSurKon != "1" { + dataSurkon, err := suratkontrol.GetNomorSurKon(kunjunganPasien.ID) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + + noUrut := "001" + if dataSurkon != "" { + noUrut, err = utils.GetNoUrut(dataSurkon) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + } + + noSurKon := "SI/" + req.TipeRawat + "/" + kunjunganPasien.NomorRM + "/" + noUrut reqInsert := &sk.DataSuratKontrol{ ID: uuid, DateCreated: timeNow, TglCetakSurKon: timeNow, TglRencanaKontrol: req.TglRencanaKontrol, - NomorSurKon: "", //TODO How to get Nomor SurKon + NomorSurKon: noSurKon, KunjunganPasien: kunjunganPasien.ID, RuanganSurKon: kunjunganPasien.Ruangan, DPJPSurKon: req.IDDokter, StatusSurKon: 1, // First Insert status always set to 1 UserCreatedSurKon: req.User, - TipeSurKon: tipeSurKon, + TipeSurKon: req.TipeSurKon, } err = suratkontrol.InsertDataSuratKontrol(reqInsert) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } - c.JSON(http.StatusOK, nil) + + err = suratkontrol.UpdateKunjunganPasien(req) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + c.JSON(http.StatusOK, &sk.MetadataString{ + Code: "200", + Message: "Berhasil Insert Surat Kontrol", + }) return } @@ -95,13 +155,60 @@ func InsertSuratKontrol(c *gin.Context) { User: req.User, }, } + logTimeStart := time.Now().Format("2006-01-02 15:04:05") res, err := PostData(url, header, headers, reqSuratKontrol) if err != nil { + responJson, err := json.Marshal(res) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + logTimeEnd := time.Now().Format("2006-01-02 15:04:05") + reqInsertLog := &logapi.DataLogAPI{ + ID: uuid, + DateCreated: logTimeEnd, + UserAgent: req.User, + IP: c.ClientIP(), + Parameter: "BPJS-VClaim-RencanaKontrol", + Header: headerString, + Method: "POST", + Url: url, + Request: reqJson, + Respon: responJson, + ResponCode: res.MetaData.Code, + ResponTimeStart: logTimeStart, + ResponTimeEnd: logTimeEnd, + Comment: res.MetaData.Message, + } + + err = log_api.InsertLogAPI(reqInsertLog) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } log.Println(err) c.JSON(http.StatusInternalServerError, res.MetaData) return } + responJson, err := json.Marshal(res) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + logTimeEnd := time.Now().Format("2006-01-02 15:04:05") reqInsert := &sk.DataSuratKontrol{ ID: uuid, DateCreated: timeNow, @@ -113,13 +220,16 @@ func InsertSuratKontrol(c *gin.Context) { DPJPSurKon: req.IDDokter, StatusSurKon: 1, // First Insert status always set to 1 UserCreatedSurKon: req.User, - TipeSurKon: tipeSurKon, + TipeSurKon: "1", } err = suratkontrol.InsertDataSuratKontrol(reqInsert) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } @@ -132,7 +242,37 @@ func InsertSuratKontrol(c *gin.Context) { err = suratkontrol.UpdateKunjunganPasien(req) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + + reqInsertLog := &logapi.DataLogAPI{ + ID: uuid, + DateCreated: logTimeEnd, + UserAgent: req.User, + IP: c.ClientIP(), + Parameter: "BPJS-VClaim-RencanaKontrol", + Header: headerString, + Method: "POST", + Url: url, + Request: reqJson, + Respon: responJson, + ResponCode: res.MetaData.Code, + ResponTimeStart: logTimeStart, + ResponTimeEnd: logTimeEnd, + Comment: res.MetaData.Message, + } + + err = log_api.InsertLogAPI(reqInsertLog) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } @@ -167,11 +307,24 @@ func UpdateSuratKontrol(c *gin.Context) { err := c.Bind(&req) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } - log.Println("Request: ", req) + reqJson, err := json.Marshal(req) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + + log.Println("Request: ", string(reqJson)) timeNow := time.Now().Format("2006-01-02 15:04:05") @@ -184,48 +337,69 @@ func UpdateSuratKontrol(c *gin.Context) { }) return } - uuid := uuid.New().String() - tipeSurKon := "1" - if req.NoSEP == "" { - tipeSurKon = "0" + uuid := uuid.New().String() + if req.TipeSurKon != "1" { + dataSurkon, err := suratkontrol.GetNomorSurKon(kunjunganPasien.ID) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + reqInsert := &sk.DataSuratKontrol{ ID: uuid, DateCreated: timeNow, TglCetakSurKon: timeNow, TglRencanaKontrol: req.TglRencanaKontrol, - NomorSurKon: "", //TODO How to get Nomor SurKon + NomorSurKon: dataSurkon, //TODO How to get Nomor SurKon KunjunganPasien: kunjunganPasien.ID, RuanganSurKon: kunjunganPasien.Ruangan, DPJPSurKon: req.IDDokter, StatusSurKon: 1, // First Insert status always set to 1 - TipeSurKon: tipeSurKon, + TipeSurKon: req.TipeSurKon, UserUpdatedSurKon: req.User, } reqUpdate := &sk.DataSuratKontrol{ - DateUpdated: timeNow, - ID: req.IDSurKon, - StatusSurKon: 2, + DateUpdated: timeNow, + ID: req.IDSurKon, + StatusSurKon: 2, + UserUpdatedSurKon: req.User, } err = suratkontrol.UpdateDataSuratKontrol(reqUpdate) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } err = suratkontrol.InsertDataSuratKontrol(reqInsert) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } - c.JSON(http.StatusOK, nil) + c.JSON(http.StatusOK, &sk.MetadataString{ + Code: "200", + Message: "Berhasil Update Surat Kontrol", + }) return } + + log.Println("Request: ", reqJson) + conf := config.ConfigBpjs{} - header := cfg.SetHeader(conf) + header := cfg.SetHeader(false, conf) headers := map[string]string{ "X-cons-id": header.ConsID, @@ -236,6 +410,12 @@ func UpdateSuratKontrol(c *gin.Context) { } log.Println("Headers : ", headers) + var headerStringBuilder strings.Builder + for key, value := range headers { + headerStringBuilder.WriteString(fmt.Sprintf("%s: %s; ", key, value)) + } + headerString := strings.TrimSuffix(headerStringBuilder.String(), "; ") + reqSuratKontrol := &sk.RequestHeaderRencanaKontrol{ Request: &sk.ReqUpdateRencanaKontrol{ NoSuratKontrol: req.NoSuratKontrol, @@ -246,27 +426,80 @@ func UpdateSuratKontrol(c *gin.Context) { User: req.User, }, } + + logTimeStart := time.Now().Format("2006-01-02 15:04:05") res, err := ResponseUpdateSuratKontrol(url, header, headers, reqSuratKontrol) if err != nil { + responJson, err := json.Marshal(res) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + logTimeEnd := time.Now().Format("2006-01-02 15:04:05") if res.MetaData.Code == "504" { log.Println(err) c.JSON(http.StatusGatewayTimeout, res.MetaData) return } + reqInsertLog := &logapi.DataLogAPI{ + ID: uuid, + DateCreated: logTimeEnd, + UserAgent: req.User, + IP: c.ClientIP(), + Parameter: "BPJS-VClaim-RencanaKontrol", + Header: headerString, + Method: "PUT", + Url: url, + Request: reqJson, + Respon: responJson, + ResponCode: res.MetaData.Code, + ResponTimeStart: logTimeStart, + ResponTimeEnd: logTimeEnd, + Comment: res.MetaData.Message, + } + + err = log_api.InsertLogAPI(reqInsertLog) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } log.Println(err) c.JSON(http.StatusInternalServerError, res.MetaData) return } + responJson, err := json.Marshal(res) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + logTimeEnd := time.Now().Format("2006-01-02 15:04:05") + reqUpdate := &sk.DataSuratKontrol{ - DateUpdated: timeNow, - ID: req.IDSurKon, - StatusSurKon: 2, + DateUpdated: timeNow, + ID: req.IDSurKon, + StatusSurKon: 2, + UserUpdatedSurKon: req.User, } err = suratkontrol.UpdateDataSuratKontrol(reqUpdate) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } @@ -280,7 +513,7 @@ func UpdateSuratKontrol(c *gin.Context) { RuanganSurKon: kunjunganPasien.Ruangan, DPJPSurKon: req.IDDokter, StatusSurKon: 1, // Insert status always set to 1 - TipeSurKon: tipeSurKon, + TipeSurKon: "1", UserUpdatedSurKon: req.User, } @@ -291,7 +524,36 @@ func UpdateSuratKontrol(c *gin.Context) { err = suratkontrol.InsertDataSuratKontrol(reqInsert) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + reqInsertLog := &logapi.DataLogAPI{ + ID: uuid, + DateCreated: logTimeEnd, + UserAgent: req.User, + IP: c.ClientIP(), + Parameter: "BPJS-VClaim-RencanaKontrol", + Header: headerString, + Method: "PUT", + Url: url, + Request: reqJson, + Respon: responJson, + ResponCode: res.MetaData.Code, + ResponTimeStart: logTimeStart, + ResponTimeEnd: logTimeEnd, + Comment: res.MetaData.Message, + } + + err = log_api.InsertLogAPI(reqInsertLog) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } @@ -309,7 +571,10 @@ func DeleteSuratKontrol(c *gin.Context) { err := c.Bind(&req) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } @@ -317,7 +582,7 @@ func DeleteSuratKontrol(c *gin.Context) { timeNow := time.Now().Format("2006-01-02 15:04:05") - if req.NomorSurKon == "" { + if req.TipeSurKon != "1" { reqUpdate := &sk.DataSuratKontrol{ DateUpdated: timeNow, ID: req.IDDataSurKon, @@ -328,7 +593,10 @@ func DeleteSuratKontrol(c *gin.Context) { err = suratkontrol.UpdateDataSuratKontrol(reqUpdate) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } res := &sk.MetadataString{ @@ -336,11 +604,12 @@ func DeleteSuratKontrol(c *gin.Context) { Message: "Berhasil Hapus Data", } c.JSON(http.StatusOK, res) + return } conf := config.ConfigBpjs{} - header := cfg.SetHeader(conf) + header := cfg.SetHeader(false, conf) headers := map[string]string{ "X-cons-id": header.ConsID, @@ -377,7 +646,10 @@ func DeleteSuratKontrol(c *gin.Context) { err = suratkontrol.UpdateDataSuratKontrol(reqUpdate) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } c.JSON(http.StatusOK, res) @@ -392,7 +664,7 @@ func GetNomorSuratKontrol(c *gin.Context) { conf := config.ConfigBpjs{} - header := cfg.SetHeader(conf) + header := cfg.SetHeader(false, conf) headers := map[string]string{ "X-cons-id": header.ConsID, @@ -422,7 +694,7 @@ func GetSuratKontrolBySEP(c *gin.Context) { conf := config.ConfigBpjs{} - header := cfg.SetHeader(conf) + header := cfg.SetHeader(false, conf) headers := map[string]string{ "X-cons-id": header.ConsID, @@ -444,7 +716,9 @@ func GetSuratKontrolBySEP(c *gin.Context) { } func GetDataSurKon(c *gin.Context) { - data, err := suratkontrol.GetDataSuratKontrol() + offset := c.Param("offset") + limit := c.Param("limit") + data, err := suratkontrol.GetDataSuratKontrol(offset, limit) if err != nil { log.Println(err) c.JSON(http.StatusInternalServerError, &sk.MetadataString{ @@ -479,6 +753,8 @@ func GetDataSurKon(c *gin.Context) { Subspesialis: v.Subspesialis, KodePoli: v.KodePoli, KodeDokter: v.KodeDokter, + IDDokter: v.IDDokter, + KodeDPJP: v.KodeDPJP, NoRM: v.NoRM, KodeDiagnosa: v.KodeDiagnosa, NamaDiagnosa: v.NamaDiagnosa, @@ -493,7 +769,10 @@ func GetDataSurKonByID(c *gin.Context) { data, err := suratkontrol.GetDataSuratKontrolByID(id) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } @@ -523,10 +802,12 @@ func GetDataSurKonByID(c *gin.Context) { KodeDokter: data.KodeDokter, IDPoli: data.IDPoli, IDDokter: data.IDDokter, + KodeDPJP: data.KodeDPJP, NoRM: data.NoRM, KodeDiagnosa: data.KodeDiagnosa, NamaDiagnosa: data.NamaDiagnosa, TipeSurKon: data.TipeSurKon, + User: data.User, } c.JSON(http.StatusOK, resSurKon) } @@ -576,7 +857,10 @@ func CariPasienTPP(c *gin.Context) { err := c.ShouldBindJSON(&req) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } @@ -584,45 +868,98 @@ func CariPasienTPP(c *gin.Context) { query := `` var args []interface{} + var argsCount []interface{} var data []*sk.GetDataSuratKontrol + var count int if req.NoRM != "" { query += `and dkp2."NOMR" = ?` - args = append(args, req.NoRM, req.TanggalAwal, req.TanggalAkhir) + argsCount = append(argsCount, req.TipeSurKon, req.NoRM, req.TanggalAwal, req.TanggalAkhir) + count, err = suratkontrol.CountDataSurKon(req, query, argsCount) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + args = append(args, req.TipeSurKon, req.NoRM, req.TanggalAwal, req.TanggalAkhir, req.Offset, req.Limit) data, err = suratkontrol.SearchDataSurKon(req, query, args) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } } else if req.NoSEP != "" { query += `and dkp2."Nomor_sep" = ?` - args = append(args, req.NoSEP, req.TanggalAwal, req.TanggalAkhir) + argsCount = append(argsCount, req.TipeSurKon, req.NoSEP, req.TanggalAwal, req.TanggalAkhir) + count, err = suratkontrol.CountDataSurKon(req, query, argsCount) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + args = append(args, req.TipeSurKon, req.NoSEP, req.TanggalAwal, req.TanggalAkhir, req.Offset, req.Limit) data, err = suratkontrol.SearchDataSurKon(req, query, args) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } } else if req.PoliKlinik != "" { query += `and ds."id" = ?` - args = append(args, req.PoliKlinik, req.TanggalAwal, req.TanggalAkhir) + argsCount = append(argsCount, req.TipeSurKon, req.PoliKlinik, req.TanggalAwal, req.TanggalAkhir) + count, err = suratkontrol.CountDataSurKon(req, query, argsCount) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + args = append(args, req.TipeSurKon, req.PoliKlinik, req.TanggalAwal, req.TanggalAkhir, req.Offset, req.Limit) data, err = suratkontrol.SearchDataSurKon(req, query, args) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } } else { - args = append(args, req.TanggalAwal, req.TanggalAkhir) + argsCount = append(argsCount, req.TipeSurKon, req.TanggalAwal, req.TanggalAkhir) + count, err = suratkontrol.CountDataSurKon(req, query, argsCount) + if err != nil { + log.Println(err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) + return + } + args = append(args, req.TipeSurKon, req.TanggalAwal, req.TanggalAkhir, req.Offset, req.Limit) data, err = suratkontrol.SearchDataSurKon(req, query, args) if err != nil { log.Println(err) - c.JSON(http.StatusInternalServerError, err) + c.JSON(http.StatusInternalServerError, &sk.MetadataString{ + Code: "", + Message: err.Error(), + }) return } } - - var resSurKon []*sk.ResponseGetDataSuratKontrol + var listData []*sk.ResponseGetDataSuratKontrol for _, v := range data { gelarDepan := utils.ReplaceGelar(v.GelarDepan) gelarBelakang := utils.ReplaceGelar(v.GelarBelakang) @@ -633,7 +970,7 @@ func CariPasienTPP(c *gin.Context) { dateCetakSurkonString := dateCetakSurkon.Format("2006-01-02") dateRencanaSurkon, _ := time.Parse(time.RFC3339, v.TglRencanaKontrol) dateRencanaSurkonString := dateRencanaSurkon.Format("2006-01-02") - resSurKon = append(resSurKon, &sk.ResponseGetDataSuratKontrol{ + listData = append(listData, &sk.ResponseGetDataSuratKontrol{ IDDataSurKon: v.IDDataSurKon, IDXDaftar: v.IDXDaftar, TglCetakSurKon: dateCetakSurkonString, @@ -648,11 +985,18 @@ func CariPasienTPP(c *gin.Context) { Subspesialis: v.Subspesialis, KodePoli: v.KodePoli, KodeDokter: v.KodeDokter, + IDDokter: v.IDDokter, + KodeDPJP: v.KodeDPJP, NoRM: v.NoRM, KodeDiagnosa: v.KodeDiagnosa, NamaDiagnosa: v.NamaDiagnosa, TipeSurKon: v.TipeSurKon, }) } + + resSurKon := &sk.ResponseCariDataSuratKontrol{ + JumlahData: count, + ListDataSuratKontrol: listData, + } c.JSON(http.StatusOK, resSurKon) } diff --git a/main.go b/main.go index e3c5aec..3bf238a 100644 --- a/main.go +++ b/main.go @@ -3,15 +3,18 @@ package main import ( "bridging-rssa/config" "bridging-rssa/handlers/bpjs" + icare "bridging-rssa/handlers/bpjs/i_care" "bridging-rssa/handlers/bpjs/jadwal_dokter" suratkontrol "bridging-rssa/handlers/bpjs/surat_kontrol" "log" + "time" _ "bridging-rssa/docs" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/joho/godotenv" + cron "github.com/robfig/cron/v3" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) @@ -32,6 +35,24 @@ func main() { r := gin.Default() + jakartaTime, _ := time.LoadLocation("Asia/Jakarta") + scheduler := cron.New(cron.WithLocation(jakartaTime)) + + defer scheduler.Stop() + + scheduler.AddFunc("* 02 * * *", func() { + log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER ===") + for { + success := jadwal_dokter.GetJadwalDokter() + if success { + log.Println("=== SCHEDULE GET JADWAL DOKTER DONE ===") + break + } + } + }) + + go scheduler.Start() + v1 := r.Group("/api") subspesialis := v1.Group("/subspesialis") @@ -41,7 +62,7 @@ func main() { jadwalDokter := v1.Group("/jadwaldokter") { - jadwalDokter.GET("/", jadwal_dokter.GetJadwalDokter) + // jadwalDokter.GET("/", jadwal_dokter.GetJadwalDokter) jadwalDokter.GET("/dpjp/:dpjp", jadwal_dokter.GetDokterByDPJP) // jadwalDokter.GET("/tanggal/:tanggal", jadwal_dokter.GetSpesialisByDate) jadwalDokter.GET("/tanggal/:tanggal", jadwal_dokter.GetJadwalSubspesialisByDate) @@ -51,7 +72,7 @@ func main() { suratKontrol := v1.Group("/suratkontrol") { - suratKontrol.GET("/", suratkontrol.GetDataSurKon) + suratKontrol.GET("/offset/:offset/limit/:limit", suratkontrol.GetDataSurKon) suratKontrol.GET("/idxdaftar/:idxdaftar", suratkontrol.GetDataSurKonByID) suratKontrol.GET("/noSuratKontrol/:noSuratKontrol", suratkontrol.GetNomorSuratKontrol) suratKontrol.GET("/noSEP/:noSEP", suratkontrol.GetSuratKontrolBySEP) @@ -62,6 +83,11 @@ func main() { suratKontrol.POST("/delete", suratkontrol.DeleteSuratKontrol) } + iCare := v1.Group("/icare") + { + iCare.POST("/rs/validate", icare.GetFKRTL) + iCare.POST("/pcare/validate", icare.GetFKTP) + } r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) r.POST("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) r.PUT("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) diff --git a/models/bpjs/i_care/i_care.go b/models/bpjs/i_care/i_care.go new file mode 100644 index 0000000..6401c26 --- /dev/null +++ b/models/bpjs/i_care/i_care.go @@ -0,0 +1,36 @@ +package icare + +type ReqICare struct { + IDXDaftar string `json:"idxdaftar"` + Param string `json:"param"` + KodeDokter int `json:"kodedokter"` + User string `json:"user"` +} + +type RequestICare struct { + Param string `json:"param"` + KodeDokter int `json:"kodedokter"` +} + +type ReqFKTP struct { + Param string `json:"param"` +} + +type Metadata struct { + Code int `json:"code"` + Message string `json:"message"` +} + +type Response struct { + Url string `json:"url"` +} + +type ResponseGet struct { + Response Response `json:"response"` + MetaData Metadata `json:"metaData"` +} + +type ResponseGetRaw struct { + Response string `json:"response"` + MetaData Metadata `json:"metaData"` +} diff --git a/models/bpjs/jadwal_dokter/jadwal_dokter.go b/models/bpjs/jadwal_dokter/jadwal_dokter.go index cbbe6b0..796d0ec 100644 --- a/models/bpjs/jadwal_dokter/jadwal_dokter.go +++ b/models/bpjs/jadwal_dokter/jadwal_dokter.go @@ -57,7 +57,7 @@ type ResponseListHari struct { Kode string `json:"Kode"` Spesialis string `json:"Spesialis"` Subspesialis string `json:"Subspesialis"` - IDSubspesialis string `json:"id_subspesialis"` + IDSubspesialis int `json:"id_subspesialis"` NamaLengkap string `json:"nama_lengkap"` HFISCode string `json:"HFIS_code"` KodeDPJP string `json:"DPJP_code"` diff --git a/models/bpjs/surat_kontrol/kunjugan_pasien.go b/models/bpjs/surat_kontrol/kunjugan_pasien.go index 3410c6f..243682b 100644 --- a/models/bpjs/surat_kontrol/kunjugan_pasien.go +++ b/models/bpjs/surat_kontrol/kunjugan_pasien.go @@ -21,4 +21,5 @@ type KunjunganPasien struct { DisplayDiagnosisAkhirKeluar string `gorm:"column:Display_diagnosis_akhir_keluar" json:"Display_diagnosis_akhir_keluar"` DiagnosisPrimerUtama string `gorm:"column:Diagnosis_primer_utama" json:"Diagnosis_primer_utama"` DisplayDiagnosisPrimerUtama string `gorm:"column:Display_diagnosis_primer_utama" json:"Display_diagnosis_primer_utama"` + NomorRM string `gorm:"column:No_rm" json:"No_rm"` } diff --git a/models/bpjs/surat_kontrol/surat_kontrol.go b/models/bpjs/surat_kontrol/surat_kontrol.go index 3dba70e..7bca893 100644 --- a/models/bpjs/surat_kontrol/surat_kontrol.go +++ b/models/bpjs/surat_kontrol/surat_kontrol.go @@ -30,14 +30,17 @@ type RequestInsertRencanaKontrol struct { TglRencanaKontrol string `json:"tglRencanaKontrol"` User string `json:"user"` IDDokter string `json:"id_dokter"` - KodeDiagnosa string `json:"kode_diagnosa"` - NamaDiagnosa string `json:"nama_diagnosa"` + KodeDiagnosa string `json:"Kode_diagnosa"` + NamaDiagnosa string `json:"Nama_diagnosa"` + TipeSurKon string `json:"tipe_surkon"` + TipeRawat string `json:"tipe_rawat"` } type ReqDeleteRencanaKontrol struct { IDDataSurKon string `json:"id_surat_kontrol"` NomorSurKon string `json:"Nomor_surat_kontrol"` User string `json:"user"` + TipeSurKon string `json:"tipe_surkon"` } type RequestUpdateRencanaKontrol struct { @@ -52,6 +55,8 @@ type RequestUpdateRencanaKontrol struct { User string `json:"user"` KodeDiagnosa string `json:"Kode_diagnosa"` NamaDiagnosa string `json:"Nama_diagnosa"` + TipeSurKon string `json:"tipe_surkon"` + TipeRawat string `json:"tipe_rawat"` } type TSuratKontrol struct { @@ -181,8 +186,8 @@ type Peserta struct { } type ProvUmum struct { - KodedProvider string `json:"kdProvider"` - NamaProvider string `json:"nmProvider"` + KodeProvider string `json:"kdProvider"` + NamaProvider string `json:"nmProvider"` } type ProvPerujuk struct { @@ -243,10 +248,12 @@ type GetDataSuratKontrol struct { NomorKartu string `gorm:"column:No_kartu" json:"No_kartu"` IDPoli string `gorm:"column:ID_poli" json:"id_poli"` IDDokter string `gorm:"column:id_dokter" json:"id_dokter"` + KodeDPJP string `gorm:"column:Kode_dpjp" json:"Kode_dpjp"` NoRM string `gorm:"column:No_rm" json:"No_rm"` KodeDiagnosa string `gorm:"column:Kode_diagnosa" json:"Kode_diagnosa"` NamaDiagnosa string `gorm:"column:Nama_diagnosa" json:"Nama_diagnosa"` TipeSurKon string `gorm:"column:Tipe_SurKon" json:"Tipe_SurKon"` + User string `gorm:"column:User" json:"User"` } type ResponseGetDataSuratKontrol struct { @@ -264,12 +271,19 @@ type ResponseGetDataSuratKontrol struct { Subspesialis string `json:"Subspesialis"` KodePoli string `json:"Kode_poli"` KodeDokter string `json:"Kode_dokter"` + KodeDPJP string `json:"Kode_dpjp"` IDPoli string `json:"id_poli"` IDDokter string `json:"id_dokter"` NoRM string `json:"No_rm"` KodeDiagnosa string `json:"Kode_diagnosa"` NamaDiagnosa string `json:"Nama_diagnosa"` TipeSurKon string `json:"Tipe_SurKon"` + User string `json:"User"` +} + +type ResponseCariDataSuratKontrol struct { + JumlahData int `json:"jumlah_data"` + ListDataSuratKontrol []*ResponseGetDataSuratKontrol `json:"list_data"` } type RequestCariPasien struct { @@ -278,4 +292,7 @@ type RequestCariPasien struct { PoliKlinik string `json:"poliklinik"` TanggalAwal string `json:"tanggal_awal"` TanggalAkhir string `json:"tanggal_akhir"` + TipeSurKon string `json:"tipe_surkon"` + Offset string `json:"offset"` + Limit string `json:"limit"` } diff --git a/models/dokter/dokter.go b/models/dokter/dokter.go index 3139fe0..3034407 100644 --- a/models/dokter/dokter.go +++ b/models/dokter/dokter.go @@ -16,6 +16,7 @@ type NamaLengkap struct { NamaLengkap string `gorm:"column:Nama_lengkap" json:"Nama_lengkap"` GelarBelakang string `gorm:"column:gelarbelakang" json:"gelarbelakang"` HFISCode string `gorm:"column:HFIS_code" json:"HFIS_code"` + DPJPCode string `gorm:"column:DPJP_code" json:"DPJP_code"` } type ResponseDokter struct { @@ -31,4 +32,5 @@ type ResponseDokterNew struct { Subspesialis int `json:"subspesialis"` HFISCode string `json:"HFIS_code"` KodePoli string `json:"kode_poli"` + DPJPCode string `json:"DPJP_code"` } diff --git a/models/log_api/log_api.go b/models/log_api/log_api.go new file mode 100644 index 0000000..896a892 --- /dev/null +++ b/models/log_api/log_api.go @@ -0,0 +1,20 @@ +package logapi + +import "encoding/json" + +type DataLogAPI struct { + ID string `gorm:"column:id" json:"ID"` + DateCreated string `gorm:"column:date_created" json:"date_created"` + UserAgent string `gorm:"column:User_agent" json:"User_agent"` + IP string `gorm:"column:IP" json:"IP"` + Parameter string `gorm:"column:Parameter" json:"Parameter"` + Header string `gorm:"column:Header" json:"Header"` + Method string `gorm:"column:Method" json:"Method"` + Url string `gorm:"column:URL" json:"URL"` + Request json.RawMessage `gorm:"column:Request" json:"Request"` + Respon json.RawMessage `gorm:"column:Respon" json:"Respon"` + ResponCode string `gorm:"column:Respon_code" json:"Respon_code"` + ResponTimeStart string `gorm:"column:Respontime_start" json:"Respontime_start"` + ResponTimeEnd string `gorm:"column:Respontime_end" json:"Respontime_end"` + Comment string `gorm:"column:Comment" json:"Comment"` +} diff --git a/models/log_api/log_icare.go b/models/log_api/log_icare.go new file mode 100644 index 0000000..b78c696 --- /dev/null +++ b/models/log_api/log_icare.go @@ -0,0 +1,10 @@ +package logapi + +type InsertLogICare struct { + ID string `gorm:"column:id" json:"id"` + DateCreated string `gorm:"column:date_created" json:"date_created"` + Ruangan int `gorm:"column:Ruangan" json:"Ruangan"` + Dokter string `gorm:"column:Dokter" json:"Dokter"` + Kunjungan_pasien string `gorm:"column:Kunjungan_pasien" json:"Kunjungan_pasien"` + WaktuTransaksi string `gorm:"column:Waktu_transaksi" json:"Waktu_transaksi"` +} diff --git a/models/pasien/kunjungan_pasien.go b/models/pasien/kunjungan_pasien.go new file mode 100644 index 0000000..f25d5d9 --- /dev/null +++ b/models/pasien/kunjungan_pasien.go @@ -0,0 +1,6 @@ +package pasien + +type KunjunganPasien struct { + ID string `gorm:"column:id" json:"id"` + Ruangan int `gorm:"column:Ruangan" json:"Ruangan"` +}