penambahan jadwal manual

This commit is contained in:
2026-05-20 09:19:34 +07:00
parent 6371a79d22
commit e9be766489
3 changed files with 431 additions and 29 deletions

No files matched your search

@@ -256,20 +256,25 @@ func GetJadwalSubspesialisByDate(c *gin.Context) {
func GetDokterBySpesialis(c *gin.Context) {
spesialis := c.Param("spesialis")
tanggal := c.Param("tanggal")
date, err := time.Parse("2006-01-02", tanggal)
if err != nil {
c.JSON(http.StatusInternalServerError, err)
}
hari := date.Local().Weekday().String()
hari = utils.ConvertDay(hari)
idDokter, err := dokter.GetJadwalDokterBySpesialis(hari, spesialis)
if err != nil {
c.JSON(http.StatusInternalServerError, err)
}
namaDokter, err := dokter.GetNamaLengkapDokter(idDokter)
if err != nil {
c.JSON(http.StatusInternalServerError, err)
}
var resDokter []dktr.ResponseDokter
idSpesialis, err := strconv.Atoi(spesialis)
if err != nil {
@@ -911,3 +916,369 @@ func GetJadwalDokternew() bool {
}
return true
}
func GetJadwalDokterManual(c *gin.Context) {
baseUrl := os.Getenv("BASEURL_BPJS")
endpoint := os.Getenv("ANTREAN_RS")
url := baseUrl + endpoint
errTruncate := dokter.DeleteJadwalDokter()
if errTruncate != nil {
log.Println(errTruncate)
return
}
errTruncateTemp := dokter.DeleteJadwalDokterTemp()
if errTruncateTemp != nil {
log.Println(errTruncateTemp)
return
}
spesialis, err := dokter.GetSpesialis()
if err != nil {
return
}
var listIdSpesialis = make(map[string]int)
for _, kodeDokter := range spesialis {
listIdSpesialis[kodeDokter.Kode] = kodeDokter.ID
}
subspesialis, err := dokter.GetSubspesialis()
if err != nil {
return
}
var listIdSubspesialis = make(map[string]int)
for _, kodeDokter := range subspesialis {
listIdSubspesialis[kodeDokter.Kode] = kodeDokter.ID
}
listDokter, err := dokter.GetDokter()
if err != nil {
return
}
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
}
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
}
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
}
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
}
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
}
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
}
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
}
} else {
reqInsert.Dokter = strconv.Itoa(v.KodeDokter)
errInsertTemp := dokter.InsertJadwalDokterTemp(reqInsert)
if errInsertTemp != nil {
log.Println(errInsertTemp)
return
}
}
}
// PERBAIKAN 7: Geser tanggal di AKHIR setelah semua proses selesai
date, errParse := time.Parse("2006-01-02", tanggal)
if errParse != nil {
return
}
tanggal = date.AddDate(0, 0, 1).Format("2006-01-02")
log.Println("Tanggal berikutnya:", tanggal)
}
}
c.JSON(200, gin.H{
"code": 200,
"massage": "berhasil ambil daftar jadwal dokter",
})
return
}
func GetDataJadwalDokterbulanan(c *gin.Context) {
baseUrl := os.Getenv("BASEURL_BPJS")
endpoint := os.Getenv("ANTREAN_RS")
conf := config.ConfigBpjs{}
spesialis, err := dokter.GetSpesialis()
if err != nil {
log.Println("Error getting spesialis", err)
return
}
var listIdSpesialis = make(map[string]int)
for _, kodeDokter := range spesialis {
listIdSpesialis[kodeDokter.Kode] = kodeDokter.ID
}
subspesialis, err := dokter.GetSubspesialis()
if err != nil {
log.Println("Error getting subspesialis", err)
return
}
var listIdSubspesialis = make(map[string]int)
for _, kodeDokter := range subspesialis {
listIdSubspesialis[kodeDokter.Kode] = kodeDokter.ID
}
listDokter, err := dokter.GetDokter()
if err != nil {
log.Println("Error getting dokter", err)
return
}
var listIddokter = make(map[int]string)
for _, kodeDokter := range listDokter {
listIddokter[kodeDokter.HfisCode] = kodeDokter.ID
}
db := cfg.SatuDataDB
errTx := db.Transaction(func(tx *gorm.DB) error {
errTruncate := dokter.TruncateDataJadwalDokter()
if errTruncate != nil {
log.Println(errTruncate)
return errTruncate
}
for _, value := range spesialis {
url := baseUrl + endpoint + "/jadwaldokter/kodepoli/" + value.Kode
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,
}
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(), "; ")
startDate := time.Now()
endDate := startDate.AddDate(0, 3, 0)
logTimeStart := time.Now().Format("2006-01-02 15:04:05")
var res *jadwal_dokter.JadwalDokter
var reqLog []*jadwal_dokter.RequestJadwalDokter
var resLog []*jadwal_dokter.JadwalDokter
for current := startDate; current.Before(endDate); current = current.AddDate(0, 0, 1) {
tanggal := current.Format("2006-01-02")
log.Println("Tanggal :", tanggal)
urlReq := url + "/tanggal/" + tanggal
res, err = JadwalDokterGetResponse(urlReq, header, headers)
if err != nil {
log.Printf("Error making external API request: %v", err)
return err
}
reqLog = append(reqLog, &jadwal_dokter.RequestJadwalDokter{
KodePoli: value.Kode,
Tanggal: tanggal,
})
resLog = append(resLog, &jadwal_dokter.JadwalDokter{
Response: res.Response,
MetaData: res.MetaData,
})
if res.MetaData.Code != 200 {
resLog = append(resLog, &jadwal_dokter.JadwalDokter{
Response: res.Response,
MetaData: res.MetaData,
})
continue
}
for _, v := range res.Response {
idSpesialis := utils.KodeToIDConverter(v.KodePoli, listIdSpesialis)
idSubspesialis := utils.KodeToIDConverter(v.KodeSubspesialis, listIdSubspesialis)
idDokter := utils.HfisCodeToIDConverter(v.KodeDokter, listIddokter)
reqInsert := &jadwal_dokter.DataJadwalDokterSatuData{
ID: uuid.NewString(),
DateCreated: logTimeStart,
Hari: strconv.Itoa(v.Hari),
NamaHari: v.NamaHari,
Waktu: v.Jadwal,
Dokter: idDokter,
Spesialis: idSpesialis,
SubSpesialis: idSubspesialis,
TanggalJadwal: tanggal,
}
if reqInsert.Dokter != "" {
errInsert := dokter.InsertDataJadwalDokter(tx, reqInsert)
if errInsert != nil {
log.Println(errInsert)
return errInsert
}
} else {
log.Println("Dokter tidak punya HFIS")
continue
}
}
}
reqLogJson, errMarshal := json.Marshal(reqLog)
if errMarshal != nil {
log.Println(errMarshal)
return errMarshal
}
resLogJson, errMarshal2 := json.Marshal(resLog)
if errMarshal2 != nil {
log.Println(errMarshal2)
return errMarshal2
}
logTimeEnd := time.Now().Format("2006-01-02 15:04:05")
reqLogApi := &logapi.DataLogAPI{
ID: uuid.NewString(),
DateCreated: logTimeEnd,
Parameter: "BPJS-AntreanRS-JadwalDokter",
Header: headerString,
Method: "GET",
Url: url,
Request: reqLogJson,
Respon: resLogJson,
ResponCode: strconv.Itoa(res.MetaData.Code),
ResponTimeStart: logTimeStart,
ResponTimeEnd: logTimeEnd,
Comment: res.MetaData.Message,
}
errLog := log_api.InsertLogAPI(reqLogApi)
if errLog != nil {
log.Printf("Error making external API request: %v", err)
return errLog
}
}
return nil
})
if errTx != nil {
log.Println(errTx)
return
}
log.Println("Berhasil ambil jadwal data dokter")
c.JSON(200, gin.H{
"code": 200,
"massage": "berhasil ambil data jadwal dokter",
})
return
}
+32 -4
View File
@@ -149,7 +149,7 @@ func InsertSuratkontrolNew(c *gin.Context) {
log.Println("kesini kag error nya", errAdmission)
if errAdmission != nil {
log.Println("Admission error, coba ambil pendaftaran")
// Penambahan: fallback ke GetPendaftaran
dataPendaftaran, errPendaftaran := suratkontrol.GetPendaftaran(req.IDXDaftar)
if errPendaftaran != nil {
log.Println("masuk sini, pendaftaran juga error")
@@ -160,7 +160,7 @@ func InsertSuratkontrolNew(c *gin.Context) {
return
}
log.Println("INI DATA PENDAFTARAN :", dataPendaftaran)
// Ambil dokter dari data pendaftaran
IdDokter, err := suratkontrol.Getdokter(dataPendaftaran.DokterPengirim)
log.Println("ID E DOKTER dari pendaftaran", IdDokter)
if err != nil {
@@ -171,7 +171,7 @@ func InsertSuratkontrolNew(c *gin.Context) {
})
return
}
layout := "2006-01-02 15:04:05" // sesuaikan format string input
layout := "2006-01-02 15:04:05"
masukrsTime, err := time.Parse(layout, dataPendaftaran.MasukRS)
Tanggalmasuk := masukrsTime.Format("2006-01-02")
@@ -1724,7 +1724,7 @@ func UpdateSuratKontrolnew(c *gin.Context) {
KunjunganPasien: kunjunganPasien.ID,
RuanganSurKon: kunjunganPasien.Ruangan,
DPJPSurKon: idDokter,
StatusSurKon: 1, // Insert status always set to 1
StatusSurKon: 1,
TipeSurKon: req.TipeSurKon,
TipeRawat: req.TipeRawat,
UserCreatedSurKon: UserCreated.UserCreate,
@@ -1744,6 +1744,34 @@ func UpdateSuratKontrolnew(c *gin.Context) {
Code: "201",
Message: err.Error(),
})
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,
}
log.Println("MASUK LOG DISINI: ", reqInsertLog)
err = log_api.InsertLogAPI(reqInsertLog)
if err != nil {
log.Println(err)
c.JSON(http.StatusCreated, &sk.MetadataString{
Code: "201",
Message: err.Error(),
})
return
}
return
}
+28 -25
View File
@@ -7,6 +7,7 @@ import (
"bridging-rssa/handlers/bpjs/jadwal_dokter"
suratkontrol "bridging-rssa/handlers/bpjs/surat_kontrol"
"github.com/gin-contrib/cors"
"github.com/robfig/cron/v3"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
"log"
@@ -15,7 +16,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
cron "github.com/robfig/cron/v3"
//cron "github.com/robfig/cron/v3"
)
// @title Crud User
@@ -50,30 +51,30 @@ func main() {
defer scheduler.Stop()
// SCHEDULE HARIAN
//scheduler.AddFunc("20 11 * * *", func() {
// log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER ===")
// for {
// success := jadwal_dokter.GetJadwalDokternew()
// if success {
// log.Println("=== SCHEDULE GET JADWAL HARIAN DOKTER DONE ===")
// break
// }
// }
//})
//
////SCHEDULE TIAP 3 BULAN
//scheduler.AddFunc("35 5 * * 2", func() {
// log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER MONTHLY===")
// for {
// success := jadwal_dokter.GetDataJadwalDokter()
// if success {
// log.Println("=== SCHEDULE GET JADWAL DOKTER MONTHLY DONE ===")
// break
// }
// }
//})
//
//go scheduler.Start()
scheduler.AddFunc("10 4 * * *", func() {
log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER ===")
for {
success := jadwal_dokter.GetJadwalDokternew()
if success {
log.Println("=== SCHEDULE GET JADWAL HARIAN DOKTER DONE ===")
break
}
}
})
//SCHEDULE TIAP 3 BULAN
scheduler.AddFunc("35 4 * * 2", func() {
log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER MONTHLY===")
for {
success := jadwal_dokter.GetDataJadwalDokter()
if success {
log.Println("=== SCHEDULE GET JADWAL DOKTER MONTHLY DONE ===")
break
}
}
})
go scheduler.Start()
v1 := r.Group("/api")
@@ -89,6 +90,8 @@ func main() {
//API UNTUK JADWAL DOKTER
jadwalDokter := v1.Group("/jadwaldokter")
{
jadwalDokter.GET("/daftar", jadwal_dokter.GetJadwalDokterManual)
jadwalDokter.GET("/data", jadwal_dokter.GetDataJadwalDokterbulanan)
jadwalDokter.GET("/date/:tanggal", jadwal_dokter.GetJadwalDokter)
jadwalDokter.GET("/dpjp/:dpjp", jadwal_dokter.GetDokterByDPJP)
jadwalDokter.GET("/tanggal/:tanggal", jadwal_dokter.GetJadwalSubspesialisByDate)