diff --git a/handlers/bpjs/jadwal_dokter/jadwal_dokter.go b/handlers/bpjs/jadwal_dokter/jadwal_dokter.go index af3649e..7636488 100644 --- a/handlers/bpjs/jadwal_dokter/jadwal_dokter.go +++ b/handlers/bpjs/jadwal_dokter/jadwal_dokter.go @@ -577,6 +577,7 @@ func GetJadwalDokterNew() bool { "X-signature": header.XSignature, "user_key": header.UserKey, } + kdPoly := value.Kode param := "/jadwaldokter/kodepoli/" + kdPoly + "/tanggal/" + tanggal linkurl := url + param @@ -585,6 +586,7 @@ func GetJadwalDokterNew() bool { log.Println("Error making external API request: %v", err) return false } + date, errParse := time.Parse("2006-01-02", tanggal) if errParse != nil { return false @@ -595,6 +597,7 @@ func GetJadwalDokterNew() bool { log.Println("Skip Proses") continue } + jadwalLibur, isLibur, errLibur := jadwal.GetJadwalLibur(tanggal) if errLibur != nil { log.Println(errLibur) @@ -607,18 +610,20 @@ func GetJadwalDokterNew() bool { return false } isLibur = false - for i := 0; i < 7; i++ { + for j := 0; j < 7; j++ { log.Println(jadwalLibur.NamaLiburPelayanan) tanggalTemp = tanggalTemp.AddDate(0, 0, 7) tanggalTempString := tanggalTemp.Format("2006-01-02") log.Println(tanggalTempString) paramLibur := "/jadwaldokter/kodepoli/" + kdPoly + "/tanggal/" + tanggalTempString linkUrl := url + paramLibur + resNew, errRes := JadwalDokterGetResponseApi(linkUrl, header, headers) if errRes != nil { log.Println("Error making external API request: ", errRes) return false } + if resNew != nil { for _, v := range resNew { res = append(res, &jadwal_dokter.ListDokter{ @@ -717,3 +722,192 @@ func GetJadwalbaru(*gin.Context) { } log.Println(listIdSubspesialis) } + +func GetJadwalDokternew() bool { + baseUrl := os.Getenv("BASEURL_BPJS") + endpoint := os.Getenv("ANTREAN_RS") + url := baseUrl + endpoint + + errTruncate := dokter.DeleteJadwalDokter() + if errTruncate != nil { + log.Println(errTruncate) + return false + } + + errTruncateTemp := dokter.DeleteJadwalDokterTemp() + if errTruncateTemp != nil { + log.Println(errTruncateTemp) + return false + } + + spesialis, err := dokter.GetSpesialis() + if err != nil { + return false + } + + var listIdSpesialis = make(map[string]int) + for _, kodeDokter := range spesialis { + listIdSpesialis[kodeDokter.Kode] = kodeDokter.ID + } + + subspesialis, err := dokter.GetSubspesialis() + if err != nil { + return false + } + + var listIdSubspesialis = make(map[string]int) + for _, kodeDokter := range subspesialis { + listIdSubspesialis[kodeDokter.Kode] = kodeDokter.ID + } + + listDokter, err := dokter.GetDokter() + if err != nil { + return false + } + + var listIddokter = make(map[int]string) + for _, kodeDokter := range listDokter { + listIddokter[kodeDokter.HfisCode] = kodeDokter.ID + } + + var reqInsert *jadwal_dokter.JadwalDokterSatuData + + for _, value := range spesialis { + + tanggal := time.Now().Format("2006-01-02") + // tanggal := "2025-04-11" + for i := 0; i < 30; i++ { + + tanggalRequest := tanggal + + jadwalLibur, isLibur, errLibur := jadwal.GetJadwalLibur(tanggalRequest) + if errLibur != nil { + log.Println(errLibur) + return false + } + + conf := config.ConfigBpjs{} + header := cfg.SetHeader(false, conf) + headers := map[string]string{ + "X-cons-id": header.ConsID, + "X-timestamp": header.TimeStamp, + "X-signature": header.XSignature, + "user_key": header.UserKey, + } + + kdPoly := value.Kode + var res []*jadwal_dokter.ListDokter + + // PERBAIKAN : Logika libur pakai tanggalRequest + if isLibur { + log.Println("Tanggal", tanggalRequest, "adalah hari libur:", jadwalLibur.NamaLiburPelayanan) + + tanggalTemp, errParseTemp := time.Parse("2006-01-02", tanggalRequest) + if errParseTemp != nil { + log.Println(errParseTemp) + return false + } + + foundReplacement := false + for j := 1; j <= 7; j++ { + tanggalTemp = tanggalTemp.AddDate(0, 0, 7) + tanggalTempString := tanggalTemp.Format("2006-01-02") + log.Println("Mencoba ambil jadwal pengganti minggu ke-", j, ":", tanggalTempString) + + paramLibur := "/jadwaldokter/kodepoli/" + kdPoly + "/tanggal/" + tanggalTempString + linkUrl := url + paramLibur + + resNew, errRes := JadwalDokterGetResponseApi(linkUrl, header, headers) + if errRes != nil { + log.Println("Error making external API request: ", errRes) + return false + } + + if resNew != nil && len(resNew) > 0 { + res = resNew + log.Println("Ada data pengganti pada tanggal", tanggalTempString) + foundReplacement = true + break + } else { + log.Println("Tidak ada data pada tanggal", tanggalTempString) + } + } + + if !foundReplacement { + log.Println("Tidak ada jadwal pengganti untuk hari libur", tanggalRequest) + // Geser tanggal untuk iterasi berikutnya + 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 berikutnya:", tanggal) + continue + } + + } else { + // PERBAIKAN 5: Kalau BUKAN libur, panggil API seperti biasa + param := "/jadwaldokter/kodepoli/" + kdPoly + "/tanggal/" + tanggalRequest + linkurl := url + param + resTemp, err := JadwalDokterGetResponseApi(linkurl, header, headers) + if err != nil { + log.Println("Error making external API request:", err) + return false + } + + if resTemp == nil || len(resTemp) == 0 { + log.Println("Skip Proses - tidak ada jadwal pada tanggal", tanggalRequest) + // Geser tanggal untuk iterasi berikutnya + 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 berikutnya:", tanggal) + continue + } + + res = resTemp + } + + // PERBAIKAN 6: Insert jadwal (dari hari normal atau pengganti libur) + 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) + return false + } + } else { + reqInsert.Dokter = strconv.Itoa(v.KodeDokter) + errInsertTemp := dokter.InsertJadwalDokterTemp(reqInsert) + if errInsertTemp != nil { + log.Println(errInsertTemp) + return false + } + } + } + + // PERBAIKAN 7: Geser tanggal di AKHIR setelah semua proses selesai + 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 berikutnya:", tanggal) + } + } + return true +} diff --git a/main.go b/main.go index bef4c68..304877e 100644 --- a/main.go +++ b/main.go @@ -53,9 +53,9 @@ func main() { scheduler.AddFunc("0 5 * * *", func() { log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER ===") for { - success := jadwal_dokter.GetJadwalDokterNew() + success := jadwal_dokter.GetJadwalDokternew() if success { - log.Println("=== SCHEDULE GET JADWAL DOKTER DONE ===") + log.Println("=== SCHEDULE GET JADWAL HARIAN DOKTER DONE ===") break } }