diff --git a/database/satu_data/dokter/dokter.go b/database/satu_data/dokter/dokter.go new file mode 100644 index 0000000..79ddcb9 --- /dev/null +++ b/database/satu_data/dokter/dokter.go @@ -0,0 +1,42 @@ +package dokter + +import ( + "bridging-rssa/config" + "bridging-rssa/models/dokter" + "errors" + "log" + "strconv" + "strings" + + "gorm.io/gorm" +) + +func GetDokter() ([]dokter.DaftarDokterRes, error) { + var listDokter []dokter.DaftarDokter + var res []dokter.DaftarDokterRes + result := config.SatuDataDB.Debug().Raw(`select "id", "HFIS_code" from "data_pegawai" where "HFIS_code" is not null`).Scan(&listDokter) + if result.Error != nil { + if !errors.Is(result.Error, gorm.ErrRecordNotFound) { + log.Fatalf("Error get data : %v", result.Error) + return nil, result.Error + } + log.Fatalf("Data kosong: %v", result.Error) + return nil, nil + } + + log.Println("Data Pegawai: ", listDokter) + for _, v := range listDokter { + v.HfisCode = strings.TrimSpace(v.HfisCode) + hfisCode, err := strconv.Atoi(v.HfisCode) + if err != nil { + log.Fatalf("Failed Convert ID to Int %v", err) + return nil, err + } + res = append(res, dokter.DaftarDokterRes{ + ID: v.ID, + HfisCode: hfisCode, + }) + } + log.Println("Data Pegawai: ", res) + return res, nil +} diff --git a/database/satu_data/dokter/jadwal_dokter.go b/database/satu_data/dokter/jadwal_dokter.go index 6870f91..1b4aff7 100644 --- a/database/satu_data/dokter/jadwal_dokter.go +++ b/database/satu_data/dokter/jadwal_dokter.go @@ -3,20 +3,51 @@ package dokter import ( "bridging-rssa/config" "bridging-rssa/models/bpjs/jadwal_dokter" + "log" + "strconv" + + "github.com/google/uuid" ) -func InsertJadwalDokter(reqInsert *jadwal_dokter.JadwalDokterSatuData) (error) { - +func DeleteJadwalDokter() error { + err := config.SatuDataDB.Debug().Exec(`truncate table "daftar_jadwal_dokter"`).Error + if err != nil { + log.Fatalf("Failed truncate data : %v", err) + return err + } + log.Println("Success truncate data") return nil } -func UpdateJadwalDokter(reqInsert *jadwal_dokter.JadwalDokterSatuData) (error) { - +func DeleteJadwalDokterTemp() error { + err := config.SatuDataDB.Debug().Exec(`truncate table "daftar_jadwal_dokter_temp"`).Error + if err != nil { + log.Fatalf("Failed truncate data : %v", err) + return err + } + log.Println("Success truncate data") return nil } -func GetJadwalDokter(req *jadwal_dokter.JadwalDokterSatuData) (error) { - var jadwalDokter *[]jadwal_dokter.JadwalDokterSatuData - result := config.SatuDataDB.Debug().Raw(`select * from "daftar_jadwal_dokter"`).Find(&) +func InsertJadwalDokter(reqInsert *jadwal_dokter.JadwalDokterSatuData) error { + err := config.SatuDataDB.Debug().Exec(`insert into "daftar_jadwal_dokter" ("Hari", "Nama_hari", "Waktu", "Dokter", "Spesialis", "Sub_spesialis", "Status") values (?, ? ,?, ?, ?, ?, ?)`, reqInsert.Hari, reqInsert.NamaHari, reqInsert.Waktu, reqInsert.Dokter, reqInsert.Spesialis, reqInsert.SubSpesialis, reqInsert.Status).Error + if err != nil { + log.Fatalf("Failed insert data : %v", err) + return err + } + log.Println("Success insert data") return nil -} \ No newline at end of file +} + +func InsertJadwalDokterTemp(reqInsert *jadwal_dokter.JadwalDokterSatuData) error { + spesialis := strconv.Itoa(reqInsert.Spesialis) + subspesialis := strconv.Itoa(reqInsert.SubSpesialis) + id := uuid.New() + err := config.SatuDataDB.Debug().Exec(`insert into "daftar_jadwal_dokter_temp" ("id", "Hari", "Nama_hari", "Waktu", "Dokter", "Spesialis", "Sub_spesialis", "Status") values (?, ?, ?, ?, ?, ?, ?, ?)`, id, reqInsert.Hari, reqInsert.NamaHari, reqInsert.Waktu, reqInsert.Dokter, spesialis, subspesialis, reqInsert.Status).Error + if err != nil { + log.Fatalf("Failed insert data : %v", err) + return err + } + log.Println("Success insert data") + return nil +} diff --git a/database/satu_data/dokter/spesialis.go b/database/satu_data/dokter/spesialis.go index ba03896..873e554 100644 --- a/database/satu_data/dokter/spesialis.go +++ b/database/satu_data/dokter/spesialis.go @@ -9,8 +9,8 @@ import ( "gorm.io/gorm" ) -func GetSpesialis() (*[]dokter.DaftarSpesialis, error) { - var daftarSpesialis *[]dokter.DaftarSpesialis +func GetSpesialis() ([]dokter.DaftarSpesialis, error) { + var daftarSpesialis []dokter.DaftarSpesialis result := config.SatuDataDB.Debug().Raw(`select * from "daftar_spesialis"`).Find(&daftarSpesialis) if result.Error != nil { @@ -22,6 +22,5 @@ func GetSpesialis() (*[]dokter.DaftarSpesialis, error) { return daftarSpesialis, nil } - log.Print(&daftarSpesialis) return daftarSpesialis, nil } diff --git a/database/satu_data/dokter/subspesialis.go b/database/satu_data/dokter/subspesialis.go index 2a559fb..191fcba 100644 --- a/database/satu_data/dokter/subspesialis.go +++ b/database/satu_data/dokter/subspesialis.go @@ -9,8 +9,8 @@ import ( "gorm.io/gorm" ) -func GetSubspesialis() (*[]dokter.DaftarSubspesialis, error) { - var daftarSubspesialis *[]dokter.DaftarSubspesialis +func GetSubspesialis() ([]dokter.DaftarSubspesialis, error) { + var daftarSubspesialis []dokter.DaftarSubspesialis result := config.SatuDataDB.Debug().Raw(`select * from "daftar_subspesialis"`).Find(&daftarSubspesialis) if result.Error != nil { @@ -22,6 +22,6 @@ func GetSubspesialis() (*[]dokter.DaftarSubspesialis, error) { return daftarSubspesialis, nil } - log.Print(&daftarSubspesialis) + log.Println(daftarSubspesialis) return daftarSubspesialis, nil } diff --git a/docs/utils/utils.go b/docs/utils/utils.go new file mode 100644 index 0000000..70f4cd9 --- /dev/null +++ b/docs/utils/utils.go @@ -0,0 +1,17 @@ +package utils + +import "log" + +// Function to convert Kode to ID +func KodeToIDConverter(kode string, kodeDokter map[string]int) int { + log.Println("Kode :", kode) + id := kodeDokter[kode] + log.Println("ID :", id) + return id +} + +// Convert Hfis Code to ID Satu Data +func HfisCodeToIDConverter(kode int, kodeDokter map[int]string) string { + id := kodeDokter[kode] + return id +} diff --git a/go.mod b/go.mod index 7e33643..4c17746 100644 --- a/go.mod +++ b/go.mod @@ -61,6 +61,7 @@ require ( ) require ( + github.com/google/uuid v1.6.0 github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect golang.org/x/text v0.18.0 // indirect diff --git a/go.sum b/go.sum index 4858eb9..2e8ae1b 100644 --- a/go.sum +++ b/go.sum @@ -46,6 +46,8 @@ github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PU github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= diff --git a/handlers/bpjs/jadwal_dokter/jadwal_dokter.go b/handlers/bpjs/jadwal_dokter/jadwal_dokter.go index 461533a..abc1f8b 100644 --- a/handlers/bpjs/jadwal_dokter/jadwal_dokter.go +++ b/handlers/bpjs/jadwal_dokter/jadwal_dokter.go @@ -3,11 +3,13 @@ package jadwal_dokter import ( cfg "bridging-rssa/config" "bridging-rssa/database/satu_data/dokter" + "bridging-rssa/docs/utils" "bridging-rssa/models/bpjs/jadwal_dokter" "bridging-rssa/models/config" "log" "net/http" "os" + "strconv" "time" "github.com/gin-gonic/gin" @@ -18,17 +20,49 @@ func GetJadwalDokter(c *gin.Context) { endpoint := os.Getenv("ANTREAN_RS") url := baseUrl + endpoint + errTruncate := dokter.DeleteJadwalDokter() + if errTruncate != nil { + log.Fatal(errTruncate) + c.JSON(http.StatusInternalServerError, errTruncate) + } + + errTruncateTemp := dokter.DeleteJadwalDokterTemp() + if errTruncateTemp != nil { + log.Fatal(errTruncateTemp) + c.JSON(http.StatusInternalServerError, errTruncateTemp) + } + // Select from daftar spesialis spesialis, err := dokter.GetSpesialis() if err != nil { c.JSON(http.StatusInternalServerError, err) } + var listIdSpesialis = make(map[string]int) + for _, kodeDokter := range spesialis { + listIdSpesialis[kodeDokter.Kode] = kodeDokter.ID + } + subspesialis, err := dokter.GetSubspesialis() if err != nil { c.JSON(http.StatusInternalServerError, err) } + var listIdSubspesialis = make(map[string]int) + for _, kodeDokter := range subspesialis { + listIdSubspesialis[kodeDokter.Kode] = kodeDokter.ID + } + + listDokter, err := dokter.GetDokter() + if err != nil { + c.JSON(http.StatusInternalServerError, err) + } + + var listIddokter = make(map[int]string) + for _, kodeDokter := range listDokter { + listIddokter[kodeDokter.HfisCode] = kodeDokter.ID + } + conf := config.ConfigBpjs{} cons_id, secretKey, User_key, tstamp, X_signature := cfg.SetHeader(conf) @@ -41,8 +75,11 @@ func GetJadwalDokter(c *gin.Context) { } var res *[]jadwal_dokter.ListDokter log.Println("Headers : ", headers) - tanggal := time.Now().Format("2006-01-02") - for _, value := range *spesialis { + // var reqSelect *jadwal_dokter.JadwalDokterSatuData + var reqInsert *jadwal_dokter.JadwalDokterSatuData + + for _, value := range spesialis { + tanggal := time.Now().Format("2006-01-02") for i := 0; i < 7; i++ { kdPoly := value.Kode res, err = JadwalDokterGetResponse(url, secretKey, cons_id, User_key, tstamp, X_signature, kdPoly, tanggal, headers) @@ -50,15 +87,45 @@ func GetJadwalDokter(c *gin.Context) { log.Fatalf("Error making external API request: %v", err) c.JSON(http.StatusInternalServerError, err) } - - err = dokter. + if res == nil { + log.Println("Skip Proses") + continue + } + for _, v := range *res { + idSpesialis := utils.KodeToIDConverter(v.KodePoli, listIdSpesialis) + idSubspesialis := utils.KodeToIDConverter(v.KodeSubspesialis, listIdSubspesialis) + idDokter := utils.HfisCodeToIDConverter(v.KodeDokter, listIddokter) + reqInsert = &jadwal_dokter.JadwalDokterSatuData{ + Hari: v.Hari, + NamaHari: v.NamaHari, + Waktu: v.Jadwal, + Dokter: idDokter, + Spesialis: idSpesialis, + SubSpesialis: idSubspesialis, + Status: 1, // When available always set to 1 + } + if reqInsert.Dokter != "" { + errInsert := dokter.InsertJadwalDokter(reqInsert) + if errInsert != nil { + log.Println(errInsert) + c.JSON(http.StatusInternalServerError, errInsert) + } + } else { + reqInsert.Dokter = strconv.Itoa(v.KodeDokter) + errInsertTemp := dokter.InsertJadwalDokterTemp(reqInsert) + if errInsertTemp != nil { + log.Println(errInsertTemp) + c.JSON(http.StatusInternalServerError, errInsertTemp) + } + } + } date, errParse := time.Parse("2006-01-02", tanggal) if errParse != nil { c.JSON(http.StatusInternalServerError, errParse) } tanggal = date.AddDate(0, 0, 1).Format("2006-01-02") + log.Println("Tanggal :", tanggal) } } - c.JSON(http.StatusOK, res) } diff --git a/handlers/bpjs/jadwal_dokter/response.go b/handlers/bpjs/jadwal_dokter/response.go index 66d029c..7f9b053 100644 --- a/handlers/bpjs/jadwal_dokter/response.go +++ b/handlers/bpjs/jadwal_dokter/response.go @@ -43,6 +43,11 @@ func JadwalDokterGetResponse(url string, secretKey string, cons_id string, User_ log.Fatalf("Error Unmarshaling: %v", err) } + if jadwalDokterRaw.MetaData.Code == 201 { + log.Println("No Data Found") + return nil, nil + } + dataResp, err := docs.StringDecrypt(key, jadwalDokterRaw.Response) if err != nil { log.Fatalf("Error Decrypt: %v", err) diff --git a/main.go b/main.go index 856a9dd..5d6bc41 100644 --- a/main.go +++ b/main.go @@ -39,7 +39,7 @@ func main() { jadwalDokter := v1.Group("/jadwaldokter") { - jadwalDokter.GET("/kdpoly/:kdpoly/tanggal/:tanggal", jadwal_dokter.GetJadwalDokter) + jadwalDokter.GET("/", jadwal_dokter.GetJadwalDokter) } r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) @@ -47,7 +47,7 @@ func main() { r.PUT("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) r.DELETE("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) log.Println("JALAN DI PORT : 8081") - err = r.Run(":8080") + err = r.Run(":8081") if err != nil { log.Fatal(err) } diff --git a/models/bpjs/jadwal_dokter/jadwal_dokter.go b/models/bpjs/jadwal_dokter/jadwal_dokter.go index e6a16bb..9d5611a 100644 --- a/models/bpjs/jadwal_dokter/jadwal_dokter.go +++ b/models/bpjs/jadwal_dokter/jadwal_dokter.go @@ -31,11 +31,23 @@ type DaftarSpesialis struct { } type JadwalDokterSatuData struct { - ID int `json:"id"` - Hari int `json:"Hari"` - NamaHari string `json:"Nama_hari"` - Waktu string `json:"Waktu"` - Spesialis int `json:"Spesialis"` - SubSpesialis int `json:"Sub_spesialis"` - Status int `json:"Status"` -} \ No newline at end of file + ID int `gorm:"id" json:"id"` + Hari int `gorm:"Hari" json:"Hari"` + NamaHari string `gorm:"Nama_hari" json:"Nama_hari"` + Waktu string `gorm:"Waktu" json:"Waktu"` + Dokter string `gorm:"Dokter" json:"Dokter"` + Spesialis int `gorm:"Spesialis" json:"Spesialis"` + SubSpesialis int `gorm:"Sub_spesialis" json:"Sub_spesialis"` + Status int `gorm:"Status" json:"Status"` +} + +type JadwalDokterTempSatuData struct { + ID int `gorm:"id" json:"id"` + Hari int `gorm:"Hari" json:"Hari"` + NamaHari string `gorm:"Nama_hari" json:"Nama_hari"` + Waktu string `gorm:"Waktu" json:"Waktu"` + Dokter string `gorm:"Dokter" json:"Dokter"` + Spesialis string `gorm:"Spesialis" json:"Spesialis"` + SubSpesialis string `gorm:"Sub_spesialis" json:"Sub_spesialis"` + Status int `gorm:"Status" json:"Status"` +} diff --git a/models/dokter/dokter.go b/models/dokter/dokter.go new file mode 100644 index 0000000..d17a114 --- /dev/null +++ b/models/dokter/dokter.go @@ -0,0 +1,11 @@ +package dokter + +type DaftarDokter struct { + ID string `gorm:"column:id" json:"id"` + HfisCode string `gorm:"column:HFIS_code" json:"HFIS_code"` +} + +type DaftarDokterRes struct { + ID string `gorm:"column:id" json:"id"` + HfisCode int `gorm:"column:HFIS_code" json:"HFIS_code"` +} diff --git a/models/dokter/spesialis.go b/models/dokter/spesialis.go index 9ceaa3f..3e161c3 100644 --- a/models/dokter/spesialis.go +++ b/models/dokter/spesialis.go @@ -4,4 +4,4 @@ type DaftarSpesialis struct { ID int `json:"id"` Kode string `json:"Kode"` Spesialis string `json:"Spesialis"` -} +} \ No newline at end of file