1 Commits
Author SHA256 Message Date
ahdan.zeeda.0103 b1bd324e54 first commit 2025-06-30 08:51:07 +07:00
18 changed files with 620 additions and 4359 deletions
+2 -9
View File
@@ -4,17 +4,11 @@ SATUDATA_PASSWORD=stim*RS54
SATUDATA_NAME=satu_db
SATUDATA_PORT=5000
SIMRS_HOST=10.10.123.163
SIMRS_USERNAME=simrs
SIMRS_PASSWORD=simrs.rssa
SIMRS_NAME=simrs
SIMRS_PORT=5432
BASEURL_BPJS=https://apijkn.bpjs-kesehatan.go.id
ANTREAN_RS=/antreanrs
CONS_ID=5257
USER_KEY=4cf1cbef8c008440bbe9ef9ba789e482
SECRET_KEY=UKu0o2wLB3
SECRET_KEY=1bV363512D
CONS_ID_DEV=16041
USER_KEY_DEV=467a2817fde5070f66c9a41fbeb8dc2c
@@ -38,5 +32,4 @@ GET_NOMOR_RUJUKAN_BATCH=/Rujukan/List/Peserta/
GET_FKRTL=/api/rs/validate
GET_FKTP=/api/pcare/validate
INSERT_SPRI=/RencanaKontrol/InsertSPRI
UPDATE_SPRI=/RencanaKontrol/UpdateSPRI
-16
View File
@@ -1,16 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="GoDfaConstantCondition" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="GoDfaErrorMayBeNotNil" enabled="false" level="WARNING" enabled_by_default="false">
<functions>
<function importPath="bridging-rssa/handlers/bpjs/surat_kontrol" name="ResponseUpdateSuratKontrol" />
<function importPath="bridging-rssa/handlers/bpjs/surat_kontrol" name="PostData" />
<function importPath="bridging-rssa/handlers/bpjs/surat_kontrol" name="ResponseDeleteSuratKontrol" />
</functions>
</inspection_tool>
<inspection_tool class="GoDfaNilDereference" enabled="false" level="WARNING" enabled_by_default="false">
<scope name="Project Files" level="WARNING" enabled="false" />
</inspection_tool>
</profile>
</component>
+1 -1
View File
@@ -22,5 +22,5 @@ WORKDIR /root/
COPY --from=builder /app/main .
COPY --from=builder /app/.env .
EXPOSE 8080
EXPOSE 8083
CMD ["./main"]
-17
View File
@@ -17,7 +17,6 @@ import (
var DB *gorm.DB
var SatuDataDB *gorm.DB
var DBsimrs *gorm.DB
var err error
func ConnectDB() {
@@ -27,12 +26,6 @@ func ConnectDB() {
dbNameSatuData := os.Getenv("SATUDATA_NAME")
portSatuData := os.Getenv("SATUDATA_PORT")
hostDBsimrs := os.Getenv("SIMRS_HOST")
userNameDBsimrs := os.Getenv("SIMRS_USERNAME")
passwordDBsimrs := os.Getenv("SIMRS_PASSWORD")
dbNameDBsimrs := os.Getenv("SIMRS_NAME")
portDBsimrs := os.Getenv("SIMRS_PORT")
satuData := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Jakarta", hostSatuData, userNameSatuData, passwordSatuData, dbNameSatuData, portSatuData)
SatuDataDB, err = gorm.Open(postgres.Open(satuData), &gorm.Config{})
@@ -41,16 +34,6 @@ func ConnectDB() {
} else {
log.Println("Successfully connected to the database")
}
dbSimrs := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Jakarta",
hostDBsimrs, userNameDBsimrs, passwordDBsimrs, dbNameDBsimrs, portDBsimrs)
DB, err = gorm.Open(postgres.Open(dbSimrs), &gorm.Config{})
if err != nil {
log.Fatal("Failed to connect to DBsimrs database: ", err)
} else {
log.Println("Successfully connected to the DBsimrs database")
}
}
func SetHeader(isIcare bool, cfg config.ConfigBpjs) *config.Header {
+2 -2
View File
@@ -69,9 +69,9 @@ func GetJadwalDokterBySpesialis(hari string, spesialis string) ([]string, error)
return listDokter, nil
}
func GetJadwalDokterBySubpesialis(hari string, subspesialis string) ([]string, error) {
func GetJadwalDokterBySubpesialis(tanggal string, subspesialis string) ([]string, error) {
var listDokter []string
errSelect := config.SatuDataDB.Raw(`select "Dokter" from "daftar_jadwal_dokter" where "Nama_hari" = ? and "Sub_spesialis" = ? order by "Sub_spesialis"`, hari, subspesialis).Scan(&listDokter).Error
errSelect := config.SatuDataDB.Raw(`select "Dokter" from "data_jadwal_dokter" where "Tanggal_jadwal" = ? and "Sub_spesialis" = ? order by "Sub_spesialis"`, tanggal, subspesialis).Scan(&listDokter).Error
if errSelect != nil {
log.Printf("Failed get data : %v", errSelect)
return nil, errSelect
+3
View File
@@ -3,6 +3,7 @@ package logapi
import (
"bridging-rssa/config"
logapi "bridging-rssa/models/log_api"
"fmt"
"log"
)
@@ -30,5 +31,7 @@ func InsertLogAPI(reqInsert *logapi.DataLogAPI) error {
log.Println(err)
return err
}
log.Println(err)
fmt.Printf("insert log: ", err)
return nil
}
@@ -4,76 +4,11 @@ import (
"bridging-rssa/config"
suratkontrol "bridging-rssa/models/bpjs/surat_kontrol"
"errors"
"fmt"
"log"
"gorm.io/gorm"
)
func GetPendaftaran(idxdaftar string) (*suratkontrol.Pendaftaran, error) {
var dataPendaftaran suratkontrol.Pendaftaran
err := config.DB.Raw(`select tp."kddokter",mp."nama",mp."noktp",mp."jeniskelamin",
mp.noktp,tp."nosep" ,tp."idxdaftar",tp."nomr" ,tp."jamreg"
from t_pendaftaran tp
join m_pasien mp on tp.nomr = mp.nomr
where tp.idxdaftar = ?`, idxdaftar).Scan(&dataPendaftaran).Error
if err != nil {
log.Println(err)
return nil, nil
}
log.Println(dataPendaftaran)
return &dataPendaftaran, nil
}
func GetAdmission(idxdaftar string) (*suratkontrol.Addmission, error) {
var dataAdmission suratkontrol.Addmission
result := config.DB.Raw(`select "dokterpengirim","id_admission","dokter_penanggungjawab","nosep",mp."nama",mp."noktp",mp."jeniskelamin",
"masukrs", mp.noktp,ta."nomr"
from t_admission ta
join m_pasien mp on ta."nomr" = mp."nomr"
where id_admission = ?`, idxdaftar).Scan(&dataAdmission)
if result.Error != nil {
log.Println(result.Error)
return nil, result.Error
}
if result.RowsAffected == 0 {
// Data tidak ditemukan, kembalikan error khusus
return nil, fmt.Errorf("Data Tidak Ditemukan")
}
log.Println(dataAdmission)
return &dataAdmission, nil
}
func Getdokter(kddokter int) (string, error) {
var idDokter string
err := config.SatuDataDB.Raw(`select "id" from data_pegawai where "KDDOKTER" = ? LIMIT 1`, kddokter).Scan(&idDokter).Error
if err != nil {
return "", err
}
return idDokter, err
}
func InsertKunjunganPasien(reqInsert *suratkontrol.InsertKunjunganPasien) error {
log.Println("Req Insert Database : ", reqInsert)
insertQuery := `insert into "data_kunjungan_pasien" ("id", "IDXDAFTAR","NOMR","Nama_lengkap","NIK","DPJP","Tanggal_masuk","Jam_masuk","date_created")
values (?, ?, ?, ?, ?, ?, ?, ?, ?)`
err := config.SatuDataDB.Exec(insertQuery,
reqInsert.ID,
reqInsert.IdxDaftar,
reqInsert.Nomr,
reqInsert.NamaLengkap,
reqInsert.NIK,
reqInsert.DPJP,
reqInsert.TanggalMasuk,
reqInsert.JamMasuk,
reqInsert.DateCreated,
).Error
if err != nil {
log.Println(err)
return err
}
return nil
}
func GetDataKunjunganPasien(idxdaftar string) (*suratkontrol.KunjunganPasien, error) {
var kunjunganPasien *suratkontrol.KunjunganPasien
err := config.SatuDataDB.Raw(`select dkp."id", dkp."IDXDAFTAR" as idxdaftar, dkp."Nomor_sep" as nomorsep,
@@ -121,8 +56,8 @@ func InsertDataSuratKontrol(reqInsert *suratkontrol.DataSuratKontrol) error {
log.Println("Req Insert Database : ", reqInsert)
insertQuery := `insert into "data_surat_kontrol" ("id", "date_created", "Tanggal_cetak_surat_kontrol", "Tanggal_rencana_kontrol",
"Nomor_surat_kontrol", "Kunjungan_pasien", "Ruangan_surat_kontrol", "DPJP_surat_kontrol", "Status_surat_kontrol",
"User_created_surat_kontrol", "Tipe_surat_kontrol", "User_updated_surat_kontrol", "Tipe_rawat","Nomor_kartu","Kode_icd","Diagnosa")
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?)`
"User_created_surat_kontrol", "Tipe_surat_kontrol", "User_updated_surat_kontrol", "Tipe_rawat")
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
err := config.SatuDataDB.Exec(insertQuery,
reqInsert.ID,
reqInsert.DateCreated,
@@ -137,9 +72,6 @@ func InsertDataSuratKontrol(reqInsert *suratkontrol.DataSuratKontrol) error {
reqInsert.TipeSurKon,
reqInsert.UserUpdatedSurKon,
reqInsert.TipeRawat,
reqInsert.NomorKartu,
reqInsert.KodeIcd,
reqInsert.Diagnosa,
).Error
if err != nil {
log.Println(err)
@@ -151,7 +83,7 @@ func InsertDataSuratKontrol(reqInsert *suratkontrol.DataSuratKontrol) error {
func GetDataSuratKontrol(offset, limit string) ([]*suratkontrol.GetDataSuratKontrol, error) {
var dataSurKon []*suratkontrol.GetDataSuratKontrol
err := config.SatuDataDB.Raw(`select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol",
dsk."Nomor_surat_kontrol", dsk."Tipe_rawat" ,
dsk."Nomor_surat_kontrol",
(select dlr."Nama"
from data_kunjungan_pasien dkp
left join daftar_lokasi_ruang dlr on dkp."Ruangan" = dlr.id where dkp."id" = dsk."Kunjungan_pasien" LIMIT 1) as "Poli_asal",
@@ -225,11 +157,7 @@ func GetDataSuratKontrolByIDTipe(idxdaftar string, tipe string) (*suratkontrol.G
dkp2."Diagnosis_primer_utama" as "Kode_diagnosa",
dkp2."Display_diagnosis_primer_utama" as "Nama_diagnosa",
dsk."Tipe_surat_kontrol" as "Tipe_SurKon",
dsk."User_created_surat_kontrol" as "User",
dsk."Kode_icd",
dsk."Diagnosa",
dsk."Nomor_kartu",
dsk."Tipe_rawat"
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"
@@ -247,205 +175,6 @@ func GetDataSuratKontrolByIDTipe(idxdaftar string, tipe string) (*suratkontrol.G
return dataSurKon, nil
}
func GetDataSuratKontrolByIDnomor(idxdaftar string, nomor string) (*suratkontrol.GetDataSuratKontrol, error) {
var dataSurKon *suratkontrol.GetDataSuratKontrol
err := config.SatuDataDB.Raw(`select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol",dsk."Nomor_surat_kontrol",dsk."Kode_icd",dsk."Diagnosa",
(select dlr."Nama"
from data_kunjungan_pasien dkp
left join daftar_lokasi_ruang dlr on dkp."Ruangan" = dlr.id where dkp."id" = dsk."Kunjungan_pasien" LIMIT 1) as "Poli_asal",
dlr."Nama" as "Poli_tuju",
dkp2."Nomor_sep", dkp2."Nama_lengkap", dkp2."IDXDAFTAR",
array(
select dgd. "Gelar_depan"
from data_pegawai_daftar_gelar_depan dpdgd
left join daftar_gelar_depan dgd on dpdgd.daftar_gelar_depan_id = dgd.id where dpdgd.data_pegawai_id = dp.id
) AS gelardepan ,
dk."Nama_lengkap" as "Nama_lengkap_dokter",
array(
select dgb. "Gelar_belakang"
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,
ds."Subspesialis",
ds."Kode" as "Kode_poli",
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."User_created_surat_kontrol" as "User",
dsk."Nomor_kartu" as "No_kartu",
dsk."Tipe_rawat"
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 dkp2."IDXDAFTAR" = ? and dsk."Nomor_surat_kontrol" = ?`, idxdaftar, nomor).First(&dataSurKon).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
errMsg := errors.New("Data tidak ada")
log.Println(errMsg)
return nil, errMsg
}
}
return dataSurKon, nil
}
func GetDataSuratKontrolnomor(nomor string) (*suratkontrol.GetDataSuratKontrol, error) {
var dataSurKon *suratkontrol.GetDataSuratKontrol
err := config.SatuDataDB.Raw(`select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol",dsk."Nomor_surat_kontrol",dsk."Kode_icd",dsk."Diagnosa",
(select dlr."Nama"
from data_kunjungan_pasien dkp
left join daftar_lokasi_ruang dlr on dkp."Ruangan" = dlr.id where dkp."id" = dsk."Kunjungan_pasien" LIMIT 1) as "Poli_asal",
dlr."Nama" as "Poli_tuju",
dkp2."Nomor_sep", dkp2."Nama_lengkap", dkp2."IDXDAFTAR",
array(
select dgd. "Gelar_depan"
from data_pegawai_daftar_gelar_depan dpdgd
left join daftar_gelar_depan dgd on dpdgd.daftar_gelar_depan_id = dgd.id where dpdgd.data_pegawai_id = dp.id
) AS gelardepan ,
dk."Nama_lengkap" as "Nama_lengkap_dokter",
array(
select dgb. "Gelar_belakang"
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,
ds."Subspesialis",
ds."Kode" as "Kode_poli",
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."User_created_surat_kontrol" as "User",
dsk."Nomor_kartu" as "No_kartu",
dsk."Tipe_rawat"
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."Nomor_surat_kontrol" = ?`, nomor).First(&dataSurKon).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
errMsg := errors.New("Data tidak ada")
log.Println(errMsg)
return nil, errMsg
}
}
return dataSurKon, nil
}
func GetDataSuratKontrolByIDsrukon(idxdaftar string, id string) (*suratkontrol.GetDataSuratKontrol, error) {
var dataSurKon *suratkontrol.GetDataSuratKontrol
err := config.SatuDataDB.Raw(`select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol",dsk."Nomor_surat_kontrol",
(select dlr."Nama"
from data_kunjungan_pasien dkp
left join daftar_lokasi_ruang dlr on dkp."Ruangan" = dlr.id where dkp."id" = dsk."Kunjungan_pasien" LIMIT 1) as "Poli_asal",
dlr."Nama" as "Poli_tuju",
dkp2."Nomor_sep", dkp2."Nama_lengkap", dkp2."IDXDAFTAR",
array(
select dgd. "Gelar_depan"
from data_pegawai_daftar_gelar_depan dpdgd
left join daftar_gelar_depan dgd on dpdgd.daftar_gelar_depan_id = dgd.id where dpdgd.data_pegawai_id = dp.id
) AS gelardepan ,
dk."Nama_lengkap" as "Nama_lengkap_dokter",
array(
select dgb. "Gelar_belakang"
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,
ds."Subspesialis",
ds."Kode" as "Kode_poli",
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."User_created_surat_kontrol" as "User",
dsk."Kode_icd",
dsk."Diagnosa",
dsk."Nomor_kartu" as "No_kartu",
dsk."Tipe_rawat"
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 dkp2."IDXDAFTAR" = ? and dsk."id" = ? `, idxdaftar, id).First(&dataSurKon).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
errMsg := errors.New("Data tidak ada")
log.Println(errMsg)
return nil, errMsg
}
}
return dataSurKon, nil
}
func GetDataSuratKontrolidsurkon(id string) (*suratkontrol.GetDataSuratKontrol, error) {
var dataSurKon *suratkontrol.GetDataSuratKontrol
err := config.SatuDataDB.Raw(`select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol",dsk."Nomor_surat_kontrol",
(select dlr."Nama"
from data_kunjungan_pasien dkp
left join daftar_lokasi_ruang dlr on dkp."Ruangan" = dlr.id where dkp."id" = dsk."Kunjungan_pasien" LIMIT 1) as "Poli_asal",
dlr."Nama" as "Poli_tuju",
dkp2."Nomor_sep", dkp2."Nama_lengkap", dkp2."IDXDAFTAR",
array(
select dgd. "Gelar_depan"
from data_pegawai_daftar_gelar_depan dpdgd
left join daftar_gelar_depan dgd on dpdgd.daftar_gelar_depan_id = dgd.id where dpdgd.data_pegawai_id = dp.id
) AS gelardepan ,
dk."Nama_lengkap" as "Nama_lengkap_dokter",
array(
select dgb. "Gelar_belakang"
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,
ds."Subspesialis",
ds."Kode" as "Kode_poli",
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."User_created_surat_kontrol" as "User",
dsk."Nomor_kartu" as "No_kartu",
dsk."Kode_icd",
dsk."Diagnosa",
dsk."Tipe_rawat"
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."id" = ?`, id).First(&dataSurKon).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
errMsg := errors.New("Data tidak ada")
log.Println(errMsg)
return nil, errMsg
}
}
return dataSurKon, nil
}
func GetDataSuratKontrolByID(idxdaftar string) (*suratkontrol.GetDataSuratKontrol, error) {
var dataSurKon *suratkontrol.GetDataSuratKontrol
err := config.SatuDataDB.Raw(`select dsk."id", dsk."Tanggal_cetak_surat_kontrol", dsk."Tanggal_rencana_kontrol",
@@ -476,16 +205,14 @@ func GetDataSuratKontrolByID(idxdaftar string) (*suratkontrol.GetDataSuratKontro
dkp2."Diagnosis_primer_utama" as "Kode_diagnosa",
dkp2."Display_diagnosis_primer_utama" as "Nama_diagnosa",
dsk."Tipe_surat_kontrol" as "Tipe_SurKon",
dsk."User_created_surat_kontrol" as "User",
dsk."Tipe_rawat",
dsk."Nomor_kartu"
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"
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 dkp2."IDXDAFTAR" = ? `, idxdaftar).First(&dataSurKon).Error
where dsk."Status_surat_kontrol" = '1' and dkp2."IDXDAFTAR" = ? and dsk."Tipe_rawat" is null`, idxdaftar).First(&dataSurKon).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
errMsg := errors.New("Data tidak ada")
@@ -505,24 +232,6 @@ func UpdateDataSuratKontrol(reqUpdate *suratkontrol.DataSuratKontrol) error {
return nil
}
func GetIdDokterByHFIS(KodeHFIS string) (string, error) {
var idDokter string
err := config.SatuDataDB.Raw(`select "id" from data_pegawai where "HFIS_code" = ? LIMIT 1`, KodeHFIS).Scan(&idDokter).Error
if err != nil {
return "", err
}
return idDokter, err
}
func GetUserCreated(user string) (*suratkontrol.Created, error) {
var UserCreated *suratkontrol.Created
err := config.SatuDataDB.Raw(`select "User_created_surat_kontrol","date_created", "Tanggal_rencana_kontrol" from data_surat_kontrol where "id" = ? `, user).Scan(&UserCreated).Error
if err != nil {
return nil, err
}
return UserCreated, err
}
func GetIDXDaftarBySurKon(idSurKon string) (string, error) {
var idxDaftar string
err := config.SatuDataDB.Raw(`select dkp."IDXDAFTAR"
@@ -576,8 +285,7 @@ func SearchDataSurKon(req suratkontrol.RequestCariPasien, query string, args []i
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_SurKon2",
dsk."Tipe_rawat"
dsk."Tipe_surat_kontrol" as "Tipe_SurKon"
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"
@@ -626,22 +334,10 @@ func GetNomorSurKon(idPasien string) (string, error) {
return noSurKon, nil
}
func GetNomorSurKonnew(idxdaftar string) (string, error) {
var noSurKon string
querySelect := `select dsk."Nomor_surat_kontrol" from data_surat_kontrol dsk where dsk."Idxdaftar_surat_kontrol" = ? and dsk."Tipe_surat_kontrol" <> '2' order by dsk."date_created"`
err := config.SatuDataDB.Raw(querySelect, idxdaftar).Scan(&noSurKon).Error
if err != nil {
log.Println(err)
return "", err
}
log.Println("Nomor SurKon :", noSurKon)
return noSurKon, nil
}
func Getdatahistori(norm string, offset, limit string) ([]*suratkontrol.HistoriSurkon, error) {
var dataHistoriSurKon []*suratkontrol.HistoriSurkon
err := config.SatuDataDB.Raw(`select dkp2."Nama_lengkap",dkp2."Nomor_sep",dsk."id",dkp2."IDXDAFTAR",dsk."Nomor_surat_kontrol",dsk."Tanggal_rencana_kontrol",dsk."Tanggal_cetak_surat_kontrol",
ds2."Spesialis",ds."Subspesialis",dsk."Tipe_surat_kontrol",
ds2."Spesialis",ds."Subspesialis",
array(
select dgd. "Gelar_depan"
from data_pegawai_daftar_gelar_depan dpdgd
@@ -661,7 +357,7 @@ func Getdatahistori(norm string, offset, limit string) ([]*suratkontrol.HistoriS
left join data_ktp dk on dp."KTP" = dk. "id"
left join daftar_subspesialis ds on dp."Subspesialis" = ds."id"
left join daftar_spesialis ds2 on ds."FK_daftar_spesialis_ID" = ds2."id"
where dkp2."NOMR" = ? order by dsk."Status_surat_kontrol" != '1',dsk."Tanggal_rencana_kontrol" desc offset ? limit ?`, norm, offset, limit).Scan(&dataHistoriSurKon).Error
where dkp2."NOMR" = ? order by dsk."Tanggal_rencana_kontrol" desc offset ? limit ?`, norm, offset, limit).Scan(&dataHistoriSurKon).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
errMsg := errors.New("data tidak ada")
+2 -2
View File
@@ -7,7 +7,7 @@ services:
container_name: api-rssa
restart: always
ports:
- 8080:8080
- 8083:8083
volumes:
- .:/app
- /etc/localtime:/etc/localtime:ro
@@ -31,7 +31,7 @@ services:
- BASEURL_BPJS=https://apijkn.bpjs-kesehatan.go.id/
- CONS_ID=5257
- USER_KEY=4cf1cbef8c008440bbe9ef9ba789e482
- SECRET_KEY=UKu0o2wLB3
- SECRET_KEY=1bV363512D
# SERVICE ANTROL
- ANTREAN_RS=antreanrs
# BPJS VCLAIM
+4 -1
View File
@@ -3,11 +3,12 @@ module bridging-rssa
go 1.23.0
require (
github.com/andrean360/bridging-bpjs-go v1.0.1
github.com/daku10/go-lz-string v0.0.6
github.com/gin-contrib/cors v1.7.2
github.com/gin-gonic/gin v1.10.0
github.com/joho/godotenv v1.5.1
github.com/mashingan/smapping v0.1.19
github.com/rs/cors v1.11.1
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
github.com/swaggo/swag v1.16.3
@@ -22,6 +23,7 @@ require (
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
github.com/gin-contrib/cors v1.7.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
@@ -41,6 +43,7 @@ require (
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
+6
View File
@@ -1,5 +1,7 @@
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/andrean360/bridging-bpjs-go v1.0.1 h1:06eJ23vcI2tNyPryr8p3jxJ+Vy4P4/nneNPWuUrgnLg=
github.com/andrean360/bridging-bpjs-go v1.0.1/go.mod h1:sRBG5zI4Ky/UMCI7u/QuMTlrzREV2UQn043lhrejfFE=
github.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=
github.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
@@ -82,6 +84,8 @@ github.com/mashingan/smapping v0.1.19 h1:SsEtuPn2UcM1croIupPtGLgWgpYRuS0rSQMvKD9
github.com/mashingan/smapping v0.1.19/go.mod h1:FjfiwFxGOuNxL/OT1WcrNAwTPx0YJeg5JiXwBB1nyig=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -96,6 +100,8 @@ 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=
github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+4 -615
View File
@@ -256,25 +256,20 @@ 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 {
@@ -300,24 +295,20 @@ func GetDokterBySpesialis(c *gin.Context) {
func GetDokterBySubspesialis(c *gin.Context) {
subspesialis := c.Param("subspesialis")
tanggal := c.Param("tanggal")
date, err := time.Parse("2006-01-02", tanggal)
if err != nil {
c.JSON(http.StatusInternalServerError, err)
}
log.Println("subspesialis: ", subspesialis)
log.Println("tanggal: ", tanggal)
hari := date.Local().Weekday().String()
hari = utils.ConvertDay(hari)
idDokter, err := dokter.GetJadwalDokterBySubpesialis(hari, subspesialis)
idDokter, err := dokter.GetJadwalDokterBySubpesialis(tanggal, subspesialis)
if err != nil {
c.JSON(http.StatusInternalServerError, err)
}
namaDokter, err := dokter.GetNamaLengkapDokter(idDokter)
if err != nil {
c.JSON(http.StatusInternalServerError, err)
}
var resDokter []dktr.ResponseDokterNew
idSubspesialis, err := strconv.Atoi(subspesialis)
if err != nil {
@@ -582,7 +573,6 @@ func GetJadwalDokterNew() bool {
"X-signature": header.XSignature,
"user_key": header.UserKey,
}
kdPoly := value.Kode
param := "/jadwaldokter/kodepoli/" + kdPoly + "/tanggal/" + tanggal
linkurl := url + param
@@ -591,7 +581,6 @@ 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
@@ -602,7 +591,6 @@ func GetJadwalDokterNew() bool {
log.Println("Skip Proses")
continue
}
jadwalLibur, isLibur, errLibur := jadwal.GetJadwalLibur(tanggal)
if errLibur != nil {
log.Println(errLibur)
@@ -615,20 +603,18 @@ func GetJadwalDokterNew() bool {
return false
}
isLibur = false
for j := 0; j < 7; j++ {
for i := 0; i < 7; i++ {
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{
@@ -685,600 +671,3 @@ func GetJadwalDokterNew() bool {
}
return true
}
func GetJadwalbaru(*gin.Context) {
baseUrl := os.Getenv("BASEURL_BPJS")
endpoint := os.Getenv("ANTREAN_RS")
url := baseUrl + endpoint
log.Println(url)
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,
}
log.Println(headers)
spesialis, err := dokter.GetSpesialis()
if err != nil {
return
}
var listIdSpesialis = make(map[string]int)
for _, kodeDokter := range spesialis {
listIdSpesialis[kodeDokter.Kode] = kodeDokter.ID
break
}
log.Println(listIdSpesialis)
subspesialis, err := dokter.GetSubspesialis()
if err != nil {
return
}
var listIdSubspesialis = make(map[string]int)
for _, kodeDokter := range subspesialis {
listIdSubspesialis[kodeDokter.Kode] = kodeDokter.ID
}
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
}
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
}
-322
View File
@@ -1,322 +0,0 @@
package bpjs
import (
sk "bridging-rssa/models/bpjs/surat_kontrol"
"github.com/gin-gonic/gin"
"net/http"
"strconv"
)
func HandleResponse(c *gin.Context, res *sk.Response) {
code, err := strconv.Atoi(res.MetaData.Code)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Invalid status code"})
return
}
// Map status codes ke HTTP status constants
switch code {
// 1xx Informational
case 100:
c.JSON(http.StatusContinue, res.MetaData)
case 101:
c.JSON(http.StatusSwitchingProtocols, res.MetaData)
case 102:
c.JSON(http.StatusProcessing, res.MetaData)
case 103:
c.JSON(http.StatusEarlyHints, res.MetaData)
// 2xx Success
//case 200:
// c.JSON(http.StatusOK, &sk.Response{
// MetaData: sk.MetadataString{
// Code: res.MetaData.Code,
// Message: res.MetaData.Message,
// },
// })
case 200:
c.JSON(http.StatusOK, res.MetaData)
case 201:
c.JSON(http.StatusCreated, res.MetaData)
case 202:
c.JSON(http.StatusAccepted, res.MetaData)
case 203:
c.JSON(http.StatusNonAuthoritativeInfo, res.MetaData)
case 204:
c.JSON(http.StatusNoContent, res.MetaData)
case 205:
c.JSON(http.StatusResetContent, res.MetaData)
case 206:
c.JSON(http.StatusPartialContent, res.MetaData)
case 207:
c.JSON(http.StatusMultiStatus, res.MetaData)
case 208:
c.JSON(http.StatusAlreadyReported, res.MetaData)
case 226:
c.JSON(http.StatusIMUsed, res.MetaData)
// 3xx Redirection
case 300:
c.JSON(http.StatusMultipleChoices, res.MetaData)
case 301:
c.JSON(http.StatusMovedPermanently, res.MetaData)
case 302:
c.JSON(http.StatusFound, res.MetaData)
case 303:
c.JSON(http.StatusSeeOther, res.MetaData)
case 304:
c.JSON(http.StatusNotModified, res.MetaData)
case 305:
c.JSON(http.StatusUseProxy, res.MetaData)
case 307:
c.JSON(http.StatusTemporaryRedirect, res.MetaData)
case 308:
c.JSON(http.StatusPermanentRedirect, res.MetaData)
// 4xx Client Error
case 400:
c.JSON(http.StatusBadRequest, res.MetaData)
case 401:
c.JSON(http.StatusUnauthorized, res.MetaData)
case 402:
c.JSON(http.StatusPaymentRequired, res.MetaData)
case 403:
c.JSON(http.StatusForbidden, res.MetaData)
case 404:
c.JSON(http.StatusNotFound, res.MetaData)
case 405:
c.JSON(http.StatusMethodNotAllowed, res.MetaData)
case 406:
c.JSON(http.StatusNotAcceptable, res.MetaData)
case 407:
c.JSON(http.StatusProxyAuthRequired, res.MetaData)
case 408:
c.JSON(http.StatusRequestTimeout, res.MetaData)
case 409:
c.JSON(http.StatusConflict, res.MetaData)
case 410:
c.JSON(http.StatusGone, res.MetaData)
case 411:
c.JSON(http.StatusLengthRequired, res.MetaData)
case 412:
c.JSON(http.StatusPreconditionFailed, res.MetaData)
case 413:
c.JSON(http.StatusRequestEntityTooLarge, res.MetaData)
case 414:
c.JSON(http.StatusRequestURITooLong, res.MetaData)
case 415:
c.JSON(http.StatusUnsupportedMediaType, res.MetaData)
case 416:
c.JSON(http.StatusRequestedRangeNotSatisfiable, res.MetaData)
case 417:
c.JSON(http.StatusExpectationFailed, res.MetaData)
case 418:
c.JSON(http.StatusTeapot, res.MetaData)
case 421:
c.JSON(http.StatusMisdirectedRequest, res.MetaData)
case 422:
c.JSON(http.StatusUnprocessableEntity, res.MetaData)
case 425:
c.JSON(http.StatusTooEarly, res.MetaData)
case 423:
c.JSON(http.StatusLocked, res.MetaData)
case 424:
c.JSON(http.StatusFailedDependency, res.MetaData)
case 426:
c.JSON(http.StatusUpgradeRequired, res.MetaData)
case 428:
c.JSON(http.StatusPreconditionRequired, res.MetaData)
case 429:
c.JSON(http.StatusTooManyRequests, res.MetaData)
case 431:
c.JSON(http.StatusRequestHeaderFieldsTooLarge, res.MetaData)
case 451:
c.JSON(http.StatusUnavailableForLegalReasons, res.MetaData)
// 5xx Server Error
case 500:
c.JSON(http.StatusInternalServerError, res.MetaData)
case 501:
c.JSON(http.StatusNotImplemented, res.MetaData)
case 502:
c.JSON(http.StatusBadGateway, res.MetaData)
case 503:
c.JSON(http.StatusServiceUnavailable, res.MetaData)
case 504:
c.JSON(http.StatusGatewayTimeout, res.MetaData)
case 505:
c.JSON(http.StatusHTTPVersionNotSupported, res.MetaData)
case 506:
c.JSON(http.StatusVariantAlsoNegotiates, res.MetaData)
case 507:
c.JSON(http.StatusInsufficientStorage, res.MetaData)
case 508:
c.JSON(http.StatusLoopDetected, res.MetaData)
case 510:
c.JSON(http.StatusNotExtended, res.MetaData)
case 511:
c.JSON(http.StatusNetworkAuthenticationRequired, res.MetaData)
// Default case untuk status code yang tidak dikenali
default:
c.JSON(http.StatusInternalServerError, gin.H{"error": "Unknown status code"})
}
}
func HandleResponseSPRI(c *gin.Context, res *sk.Responsespri) {
code, err := strconv.Atoi(res.MetaData.Code)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Invalid status code"})
return
}
// Map status codes ke HTTP status constants
switch code {
// 1xx Informational
case 100:
c.JSON(http.StatusContinue, res.MetaData)
case 101:
c.JSON(http.StatusSwitchingProtocols, res.MetaData)
case 102:
c.JSON(http.StatusProcessing, res.MetaData)
case 103:
c.JSON(http.StatusEarlyHints, res.MetaData)
// 2xx Success
//case 200:
// c.JSON(http.StatusOK, &sk.Response{
// MetaData: sk.MetadataString{
// Code: res.MetaData.Code,
// Message: res.MetaData.Message,
// },
// })
case 200:
c.JSON(http.StatusOK, res.MetaData)
case 201:
c.JSON(http.StatusCreated, res.MetaData)
case 202:
c.JSON(http.StatusAccepted, res.MetaData)
case 203:
c.JSON(http.StatusNonAuthoritativeInfo, res.MetaData)
case 204:
c.JSON(http.StatusNoContent, res.MetaData)
case 205:
c.JSON(http.StatusResetContent, res.MetaData)
case 206:
c.JSON(http.StatusPartialContent, res.MetaData)
case 207:
c.JSON(http.StatusMultiStatus, res.MetaData)
case 208:
c.JSON(http.StatusAlreadyReported, res.MetaData)
case 226:
c.JSON(http.StatusIMUsed, res.MetaData)
// 3xx Redirection
case 300:
c.JSON(http.StatusMultipleChoices, res.MetaData)
case 301:
c.JSON(http.StatusMovedPermanently, res.MetaData)
case 302:
c.JSON(http.StatusFound, res.MetaData)
case 303:
c.JSON(http.StatusSeeOther, res.MetaData)
case 304:
c.JSON(http.StatusNotModified, res.MetaData)
case 305:
c.JSON(http.StatusUseProxy, res.MetaData)
case 307:
c.JSON(http.StatusTemporaryRedirect, res.MetaData)
case 308:
c.JSON(http.StatusPermanentRedirect, res.MetaData)
// 4xx Client Error
case 400:
c.JSON(http.StatusBadRequest, res.MetaData)
case 401:
c.JSON(http.StatusUnauthorized, res.MetaData)
case 402:
c.JSON(http.StatusPaymentRequired, res.MetaData)
case 403:
c.JSON(http.StatusForbidden, res.MetaData)
case 404:
c.JSON(http.StatusNotFound, res.MetaData)
case 405:
c.JSON(http.StatusMethodNotAllowed, res.MetaData)
case 406:
c.JSON(http.StatusNotAcceptable, res.MetaData)
case 407:
c.JSON(http.StatusProxyAuthRequired, res.MetaData)
case 408:
c.JSON(http.StatusRequestTimeout, res.MetaData)
case 409:
c.JSON(http.StatusConflict, res.MetaData)
case 410:
c.JSON(http.StatusGone, res.MetaData)
case 411:
c.JSON(http.StatusLengthRequired, res.MetaData)
case 412:
c.JSON(http.StatusPreconditionFailed, res.MetaData)
case 413:
c.JSON(http.StatusRequestEntityTooLarge, res.MetaData)
case 414:
c.JSON(http.StatusRequestURITooLong, res.MetaData)
case 415:
c.JSON(http.StatusUnsupportedMediaType, res.MetaData)
case 416:
c.JSON(http.StatusRequestedRangeNotSatisfiable, res.MetaData)
case 417:
c.JSON(http.StatusExpectationFailed, res.MetaData)
case 418:
c.JSON(http.StatusTeapot, res.MetaData)
case 421:
c.JSON(http.StatusMisdirectedRequest, res.MetaData)
case 422:
c.JSON(http.StatusUnprocessableEntity, res.MetaData)
case 423:
c.JSON(http.StatusLocked, res.MetaData)
case 424:
c.JSON(http.StatusFailedDependency, res.MetaData)
case 425:
c.JSON(http.StatusTooEarly, res.MetaData)
case 426:
c.JSON(http.StatusUpgradeRequired, res.MetaData)
case 428:
c.JSON(http.StatusPreconditionRequired, res.MetaData)
case 429:
c.JSON(http.StatusTooManyRequests, res.MetaData)
case 431:
c.JSON(http.StatusRequestHeaderFieldsTooLarge, res.MetaData)
case 451:
c.JSON(http.StatusUnavailableForLegalReasons, res.MetaData)
// 5xx Server Error
case 500:
c.JSON(http.StatusInternalServerError, res.MetaData)
case 501:
c.JSON(http.StatusNotImplemented, res.MetaData)
case 502:
c.JSON(http.StatusBadGateway, res.MetaData)
case 503:
c.JSON(http.StatusServiceUnavailable, res.MetaData)
case 504:
c.JSON(http.StatusGatewayTimeout, res.MetaData)
case 505:
c.JSON(http.StatusHTTPVersionNotSupported, res.MetaData)
case 506:
c.JSON(http.StatusVariantAlsoNegotiates, res.MetaData)
case 507:
c.JSON(http.StatusInsufficientStorage, res.MetaData)
case 508:
c.JSON(http.StatusLoopDetected, res.MetaData)
case 510:
c.JSON(http.StatusNotExtended, res.MetaData)
case 511:
c.JSON(http.StatusNetworkAuthenticationRequired, res.MetaData)
// Default case untuk status code yang tidak dikenali
default:
c.JSON(http.StatusInternalServerError, gin.H{"error": "Unknown status code"})
}
}
-209
View File
@@ -14,108 +14,6 @@ import (
"strings"
)
func PostDataSPRI(url string, header *config.Header, headers map[string]string, request *suratkontrol.RequestHeaderRencanaKontrol) (*suratkontrol.Responsespri, 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{}
responses := &suratkontrol.Responsespri{}
response, err := client.Do(req)
if err != nil {
responses.MetaData.Code = "203"
responses.MetaData.Message = err.Error()
log.Printf("Error making external API request: %v", err)
log.Println("responses: ", responses)
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, errMsg
}
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 resSuratKontrolRaw suratkontrol.ResponseRaw
err = json.Unmarshal([]byte(string(res)), &resSuratKontrolRaw)
if err != nil {
log.Printf("Error Unmarshaling: %v", err)
return nil, err
}
log.Println("ResponseRaw : ", resSuratKontrolRaw)
if resSuratKontrolRaw.MetaData.Code != "200" {
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 resSuratKontrolRaw.MetaData.Message == "Gagal simpan! Poli Tujuan Kontrol tidak sama dengan Poli Asal Rujukan Awal." {
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
}
dataResp, err := docs.StringDecrypt(key, resSuratKontrolRaw.Response)
if err != nil {
log.Printf("Error Decrypt: %v", err)
log.Println("res: ", dataResp)
return nil, err
}
var resSuratKontrol suratkontrol.ResponseSuratKontrolSPRI
log.Println("dataresp: ", dataResp)
err = json.Unmarshal([]byte(dataResp), &resSuratKontrol)
if err != nil {
log.Printf("Error Decode: %v", err)
return nil, err
}
responses = &suratkontrol.Responsespri{
MetaData: resSuratKontrolRaw.MetaData,
Response: resSuratKontrol,
}
return responses, nil
}
func PostData(url string, header *config.Header, headers map[string]string, request *suratkontrol.RequestHeaderRencanaKontrol) (*suratkontrol.Response, error) {
log.Println("URL", url)
@@ -159,15 +57,6 @@ func PostData(url string, header *config.Header, headers map[string]string, requ
return responses, errMsg
}
if response.StatusCode == http.StatusInternalServerError { // 500
errMsg := errors.New("Server BPJS Down")
log.Printf("error : %v", errMsg)
responses.MetaData.Code = "500"
responses.MetaData.Message = errMsg.Error()
log.Println("responses: ", responses)
return responses, errMsg
}
key := header.ConsID + header.SecretKey + header.TimeStamp
res, err := io.ReadAll(response.Body)
if err != nil {
@@ -327,105 +216,7 @@ func ResponseUpdateSuratKontrol(url string, header *config.Header, headers map[s
return responses, nil
}
func ResponseUpdateSuratKontrolSPRI(url string, header *config.Header, headers map[string]string, request *suratkontrol.RequestHeaderRencanaKontrol) (*suratkontrol.Responsespri, 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("PUT", 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{}
responses := &suratkontrol.Responsespri{}
response, err := client.Do(req)
if err != nil {
responses.MetaData.Code = "504"
responses.MetaData.Message = err.Error()
log.Println("responses: ", responses)
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
}
log.Println("RESPONSE: ", response)
key := header.ConsID + header.SecretKey + header.TimeStamp
res, err := io.ReadAll(response.Body)
if err != nil {
fmt.Println(err)
return nil, err
}
var resSuratKontrolRaw suratkontrol.ResponseRawUpper
err = json.Unmarshal([]byte(res), &resSuratKontrolRaw)
if err != nil {
log.Printf("Error Unmarshaling: %v", err)
return nil, err
}
if resSuratKontrolRaw.MetaData.Code != "200" {
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
}
dataResp, err := docs.StringDecrypt(key, resSuratKontrolRaw.Response)
if err != nil {
log.Printf("Error Decrypt: %v", err)
log.Println("res: ", dataResp)
return nil, err
}
var resSuratKontrol *suratkontrol.ResponseSuratKontrolSPRI
log.Println("dataresp: ", dataResp)
err = json.Unmarshal([]byte(dataResp), &resSuratKontrol)
if err != nil {
log.Printf("Error Decode: %v", err)
return nil, err
}
responses = &suratkontrol.Responsespri{
MetaData: resSuratKontrolRaw.MetaData,
Response: *resSuratKontrol,
}
return responses, nil
}
func ResponseDeleteSuratKontrol(url string, header *config.Header, headers map[string]string, request *suratkontrol.RequestHeaderRencanaKontrol) (*suratkontrol.Response, error) {
log.Println("URL", url)
File diff suppressed because it is too large Load Diff
+13 -36
View File
@@ -7,16 +7,15 @@ 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"
_ "bridging-rssa/docs"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
//cron "github.com/robfig/cron/v3"
cron "github.com/robfig/cron/v3"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
)
// @title Crud User
@@ -40,30 +39,24 @@ func main() {
AllowHeaders: []string{"Origin", "Content-Type"},
AllowCredentials: true,
}))
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.POST("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.PUT("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.DELETE("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
scheduler := cron.New()
defer scheduler.Stop()
// SCHEDULE HARIAN
scheduler.AddFunc("10 4 * * *", func() {
scheduler.AddFunc("15 2 * * *", func() {
log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER ===")
for {
success := jadwal_dokter.GetJadwalDokternew()
success := jadwal_dokter.GetJadwalDokterNew()
if success {
log.Println("=== SCHEDULE GET JADWAL HARIAN DOKTER DONE ===")
log.Println("=== SCHEDULE GET JADWAL DOKTER DONE ===")
break
}
}
})
//SCHEDULE TIAP 3 BULAN
scheduler.AddFunc("35 4 * * 2", func() {
scheduler.AddFunc("20 2 * * 5", func() {
log.Println("=== RUNNING SCHEDULE GET JADWAL DOKTER MONTHLY===")
for {
success := jadwal_dokter.GetDataJadwalDokter()
@@ -82,16 +75,10 @@ func main() {
{
subspesialis.GET("/", bpjs.GetAllSubspesialis)
}
test := v1.Group("/test")
{
test.GET("/test", jadwal_dokter.GetJadwalbaru)
}
//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)
@@ -104,22 +91,15 @@ func main() {
{
suratKontrol.GET("/offset/:offset/limit/:limit", suratkontrol.GetDataSurKon)
suratKontrol.GET("/idxdaftar/:idxdaftar/tiperawat/:tiperawat", suratkontrol.GetDataSurKonByID)
suratKontrol.GET("datapasien/idxdaftar/:idxdaftar/tiperawat/:tiperawat", suratkontrol.NewGetDataSurKonByID)
suratKontrol.GET("/preview/idxdaftar/:idxdaftar/nomorsurkon/:nomorsurkon", suratkontrol.GetDataSurKonByNoSurkon)
suratKontrol.GET("/previewbyid/idxdaftar/:idxdaftar/id/:id", suratkontrol.GetDataSurKonByIDSurkon)
suratKontrol.GET("/noSuratKontrol/:noSuratKontrol", suratkontrol.GetNomorSuratKontrol)
suratKontrol.GET("/noSEP/:noSEP", suratkontrol.GetSuratKontrolBySEP)
suratKontrol.GET("/printSurKon/:idxdaftar/tiperawat/:tiperawat", suratkontrol.PrintSurKon)
suratKontrol.POST("/cari", suratkontrol.CariPasienTPP)
suratKontrol.POST("/insert", suratkontrol.InsertSuratKontrol)
suratKontrol.POST("/insertnew", suratkontrol.InsertSuratkontrolNew)
suratKontrol.PUT("/update", suratkontrol.UpdateSuratKontrol)
suratKontrol.POST("/delete", suratkontrol.DeleteSuratKontrol)
suratKontrol.GET("/norm/:norm/limit/:limit/offset/:offset", suratkontrol.GethistoribyNorm)
suratKontrol.POST("/insertsurkon", suratkontrol.InsertSuratkontrolNew)
suratKontrol.PUT("/updatesurkon", suratkontrol.UpdateSuratKontrolnew)
suratKontrol.POST("/deletesurkon", suratkontrol.DeleteSuratKontrolNew)
suratKontrol.POST("/parse", suratkontrol.Parse)
suratKontrol.POST("/IDX", suratkontrol.Coba)
}
iCare := v1.Group("/icare")
@@ -127,16 +107,13 @@ func main() {
iCare.POST("/rs/validate", icare.GetFKRTL)
iCare.POST("/pcare/validate", icare.GetFKTP)
}
Spri := v1.Group("/spri")
{
Spri.POST("/insert", suratkontrol.InsertSpri)
Spri.PUT("/update", suratkontrol.UpdateSpri)
Spri.DELETE("/delete", suratkontrol.DeleteSpri)
}
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.POST("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.PUT("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.DELETE("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
log.Println("JALAN DI PORT : 8080")
err = r.Run(":8080")
err = r.Run(":8083")
if err != nil {
log.Fatal(err)
}
@@ -23,35 +23,3 @@ type KunjunganPasien struct {
DisplayDiagnosisPrimerUtama string `gorm:"column:Display_diagnosis_primer_utama" json:"Display_diagnosis_primer_utama"`
NomorRM string `gorm:"column:No_rm" json:"No_rm"`
}
type Addmission struct {
ID int `gorm:"column:id_admission" json:"id"`
Nomr string `gorm:"column:nomr" json:"nomr"`
DokterPengirim int `gorm:"column:dokterpengirim" json:"dokterpengirim"`
NoSEP string `gorm:"column:nosep" json:"no_sep"`
NamaLengkap string `gorm:"column:nama" json:"namalengkap"`
NoKTP string `gorm:"column:noktp" json:"noktp"`
MasukRS string `gorm:"column:masukrs" json:"masukrs"`
}
type Pendaftaran struct {
ID int `gorm:"column:idxdaftar" json:"idxdaftar"`
Nomr string `gorm:"column:nomr" json:"nomr"`
DokterPengirim int `gorm:"column:kddokter" json:"kddokter"`
NoSEP string `gorm:"column:nosep" json:"nosep"`
NamaLengkap string `gorm:"column:nama" json:"namalengkap"`
NoKTP string `gorm:"column:noktp" json:"noktp"`
MasukRS string `gorm:"column:jamreg" json:"jamreg"`
}
type InsertKunjunganPasien struct {
ID string `gorm:"column:id" json:"id"`
IdxDaftar int `gorm:"column:IDXDAFTAR" json:"idxdaftar"`
Nomr string `gorm:"column:NOMR" json:"nomr"`
NamaLengkap string `gorm:"column:Nama_lengkap" json:"namalengkap"`
NIK string `gorm:"column:NIK" json:"nik"`
DPJP string `gorm:"column:DPJP" json:"dpjp"`
TanggalMasuk string `gorm:"column:Tanggal_masuk" json:"tanggalmasuk"`
JamMasuk string `gorm:"column:Jam_masuk" json:"jammasuk"`
DateCreated string `gorm:"column:date_created" json:"date_created"`
}
+1 -115
View File
@@ -21,14 +21,6 @@ type ReqUpdateRencanaKontrol struct {
User string `json:"user"`
}
type ReqUpdateRencanaKontrolspri struct {
NoSPRI string `json:"noSPRI"`
KodeDokter string `json:"kodeDokter"`
PoliKontrol string `json:"poliKontrol"`
TglRencanaKontrol string `json:"tglRencanaKontrol"`
User string `json:"user"`
}
type RequestInsertRencanaKontrol struct {
IDXDaftar string `json:"idxdaftar"`
NoSEP string `json:"noSEP"`
@@ -45,6 +37,7 @@ type RequestInsertRencanaKontrol struct {
TipeRawat string `json:"tipe_rawat"`
Ruangan string `json:"ruangan"`
}
type ReqDeleteRencanaKontrol struct {
IDDataSurKon string `json:"id_surat_kontrol"`
NomorSurKon string `json:"Nomor_surat_kontrol"`
@@ -52,12 +45,6 @@ type ReqDeleteRencanaKontrol struct {
TipeSurKon string `json:"tipe_surkon"`
}
type ReqDeleteRencanaKontrolSPRI 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 {
IDXDaftar string `json:"idxdaftar"`
IDSurKon string `json:"idSurKon"`
@@ -74,29 +61,6 @@ type RequestUpdateRencanaKontrol struct {
TipeRawat string `json:"tipe_rawat"`
}
type RequestUpdateRencanaKontrolNew struct {
IDXDaftar string `json:"idxdaftar"`
IDSurKon string `json:"idSurKon"`
NoSuratKontrol string `json:"noSuratKontrol"`
NoSEP string `json:"noSEP"`
KodeHFIS string `json:"kodeHFIS"`
KodePoli string `json:"kodePoli"`
TglRencanaKontrol string `json:"tglRencanaKontrol"`
User string `json:"user"`
TipeSurKon string `json:"tipe_surkon"`
TipeRawat string `json:"tipe_rawat"`
}
type RequestUpdateRencanaKontrolspri struct {
IDXDaftar string `json:"idxdaftar"`
IDSurKon string `json:"idSurKon"`
NoSPRI string `json:"noSuratKontrol"`
KodeHFIS string `json:"kodeHFIS"`
KodePoli string `json:"kodePoli"`
TglRencanaKontrol string `json:"tglRencanaKontrol"`
User string `json:"user"`
TipeSurKon string `json:"tipe_surkon"`
TipeRawat string `json:"tipe_rawat"`
}
type TSuratKontrol struct {
RequestDelete RequestDeleteRencanaKontrol `json:"t_suratkontrol"`
}
@@ -146,11 +110,6 @@ type Response struct {
Response ResponseSuratKontrol `json:"response"`
}
type Responsespri struct {
MetaData MetadataString `json:"metadata"`
Response ResponseSuratKontrolSPRI `json:"response"`
}
type ResponseUpper struct {
MetaData MetadataString `json:"metaData"`
Response ResponseSuratKontrol `json:"response"`
@@ -183,16 +142,6 @@ type ResponseSuratKontrol struct {
TglLahir string `json:"tglLahir"`
NamaDiagnosa string `json:"namaDiagnosa"`
}
type ResponseSuratKontrolSPRI struct {
NoSPRI string `json:"noSPRI"`
TglRencanaKontrol string `json:"tglRencanaKontrol"`
NamaDokter string `json:"namaDokter"`
NoKartu string `json:"noKartu"`
Nama string `json:"nama"`
Kelamin string `json:"kelamin"`
TglLahir string `json:"tglLahir"`
NamaDiagnosa string `json:"namaDiagnosa"`
}
type RequestRencanaKontrol struct {
IDXDaftar string `json:"idxdaftar"`
@@ -262,9 +211,6 @@ type DataSuratKontrol struct {
TglCetakSurKon string `gorm:"column:Tanggal_cetak_surat_kontrol" json:"Tanggal_cetak_surat_kontrol"`
TglRencanaKontrol string `gorm:"column:Tanggal_rencana_kontrol" json:"Tanggal_rencana_kontrol"`
NomorSurKon string `gorm:"column:Nomor_surat_kontrol" json:"Nomor_surat_kontrol"`
NomorKartu string `gorm:"column:Nomor_kartu" json:"Nomor_kartu"`
KodeIcd string `gorm:"column:Kode_icd" json:"Kode_icd"`
Diagnosa string `gorm:"column:Diagnosa" json:"Diagnosa"`
KunjunganPasien string `gorm:"column:Kunjungan_pasien" json:"Kunjungan_pasien"`
RuanganSurKon int `gorm:"column:Ruangan_surat_kontrol" json:"Ruangan_surat_kontrol"`
DPJPSurKon string `gorm:"column:DPJP_surat_kontrol" json:"DPJP_surat_kontrol"`
@@ -273,7 +219,6 @@ type DataSuratKontrol struct {
TipeSurKon string `gorm:"column:Tipe_surat_kontrol" json:"Tipe_surat_kontrol"`
UserUpdatedSurKon string `gorm:"column:User_updated_surat_kontrol" json:"User_updated_surat_kontrol"`
TipeRawat string `gorm:"column:Tipe_rawat" json:"Tipe_rawat"`
IdxDaftarSurkon string `gorm:"column:Idxdaftar_surat_kontrol" json:"IdxDaftar_surkon"`
}
type ResponseSuratKontrolBySEP struct {
@@ -310,10 +255,7 @@ type GetDataSuratKontrol struct {
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"`
KodeIcd string `gorm:"column:Kode_icd" json:"Kode_icd"`
Diagnosa string `gorm:"column:Diagnosa" json:"Diagnosa"`
TipeSurKon string `gorm:"column:Tipe_SurKon" json:"Tipe_SurKon"`
TipeRawat string `gorm:"column:Tipe_rawat" json:"Tipe_rawat"`
User string `gorm:"column:User" json:"User"`
}
@@ -338,10 +280,7 @@ type ResponseGetDataSuratKontrol struct {
NoRM string `json:"No_rm"`
KodeDiagnosa string `json:"Kode_diagnosa"`
NamaDiagnosa string `json:"Nama_diagnosa"`
KodeIcd string `json:"Kode_icd"`
Diagnosa string `json:"Diagnosa"`
TipeSurKon string `json:"Tipe_SurKon"`
TipeRawat string `json:"Tipe_rawat"`
User string `json:"User"`
}
@@ -375,7 +314,6 @@ type HistoriSurkon struct {
NamaDokter string `gorm:"column:Nama_lengkap_dokter" json:"Nama_dokter"`
GelarBelakang string `gorm:"column:gelarbelakang" json:"Gelar_belakang"`
Tiperawat string `gorm:"column:Tipe_rawat" json:"Tipe_rawat"`
TipeSurkon string `gorm:"column:Tipe_surat_kontrol" json:"Tipe_surat_kontrol"`
UserCreate string `gorm:"column:User_created_surat_kontrol" json:"User_create"`
UserUpdate string `gorm:"column:User_updated_surat_kontrol" json:"User_update"`
Status string `gorm:"column:Status_surat_kontrol" json:"Status_surat_kontrol"`
@@ -393,59 +331,7 @@ type Dataresponse struct {
Subspesialis string `json:"Subspesialis"`
NamaLengkap string `json:"Dpjp"`
Tiperawat string `json:"Tipe_rawat"`
TipeSurkon string `json:"Tipe_surat_kontrol"`
UserCreate string `json:"User_create"`
UserUpdate string `json:"User_update"`
Status string `json:"Status_surat_kontrol"`
}
type RequestInsertSPRI struct {
NoKartu string `json:"noKartu"`
IDXDaftar string `json:"idxdaftar"`
NoRM string `json:"noRM"`
KodeHFIS string `json:"kodeHFIS"`
KodePoli string `json:"kodePoli"`
TglRencanaKontrol string `json:"tglRencanaKontrol"`
User string `json:"user"`
KodeDiagnosa string `json:"Kode_diagnosa"`
NamaDiagnosa string `json:"Nama_diagnosa"`
TipeSurKon string `json:"tipe_surkon"`
TipeRawat string `json:"tipe_rawat"`
Ruangan string `json:"ruangan"`
}
type ReqInsertSPRIbpjs struct {
NoKartu string `json:"noKartu"`
KodeDokter string `json:"kodeDokter"`
PoliKontrol string `json:"poliKontrol"`
TglRencanaKontrol string `json:"tglRencanaKontrol"`
User string `json:"user"`
}
type ResponseInsertSuratKontrolSPRI struct {
MetaData MetadataString `json:"metaData"`
Response ResponseDataSPRI `json:"response"`
}
type ResponseDataSPRI struct {
NoSPRI string `json:"noSPRI"`
TglRencanaKontrol string `json:"tglRencanaKontrol"`
NamaDokter string `json:"namaDokter"`
NoKartu string `json:"noKartu"`
Nama string `json:"nama"`
Kelamin string `json:"kelamin"`
TglLahir string `json:"tglLahir"`
NamaDiagnosa string `json:"namaDiagnosa"`
}
type Created struct {
UserCreate string `gorm:"column:User_created_surat_kontrol" json:"User_created_surat_kontrol"`
DataCreate string `gorm:"column:date_created" json:"date_created"`
TanggalKontrol string `gorm:"column:Tanggal_rencana_kontrol" json:"Tanggal_rencana_kontrol"`
}
type Parse struct {
Diagnosa string `json:"diagnosa"`
}
type IDXDAFTAR struct {
IDXDAFTAR string `json:"IDXDAFTAR"`
}