Sync old-to-new patient handler

This commit is contained in:
poetrasapoetra
2025-11-28 12:53:44 +07:00
parent a43b3f4a66
commit 856bcd8f3d
3 changed files with 366 additions and 0 deletions
@@ -0,0 +1,273 @@
package patient
import (
"fmt"
e "simrs-vx/internal/domain/main-entities/patient"
pr "simrs-vx/internal/domain/main-entities/person"
pa "simrs-vx/internal/domain/main-entities/person-address"
pc "simrs-vx/internal/domain/main-entities/person-contact"
cm "simrs-vx/internal/domain/references/common"
rf "simrs-vx/internal/domain/references/person"
"time"
)
type MPasienDto struct {
Id uint `json:"id" gorm:"primaryKey;autoIncrement;column:id"`
Nomr string `json:"nomr" gorm:"uniqueIndex;column:nomr"`
Title string `json:"title" gorm:"column:title"`
Nama string `json:"nama" gorm:"column:nama"`
Tempat string `json:"tempat" gorm:"column:tempat"`
Tgllahir string `json:"tgllahir" gorm:"column:tgllahir"`
Jeniskelamin string `json:"jeniskelamin" gorm:"column:jeniskelamin"`
Alamat string `json:"alamat" gorm:"column:alamat"`
Kelurahan uint64 `json:"kelurahan" gorm:"column:kelurahan"`
Kdkecamatan uint `json:"kdkecamatan" gorm:"column:kdkecamatan"`
Kota uint `json:"kota" gorm:"column:kota"`
Kdprovinsi uint `json:"kdprovinsi" gorm:"column:kdprovinsi"`
Notelp string `json:"notelp" gorm:"column:notelp"`
Noktp string `json:"noktp" gorm:"column:noktp"`
SuamiOrtu *string `json:"suami_ortu" gorm:"column:suami_ortu"`
Pekerjaan string `json:"pekerjaan" gorm:"column:pekerjaan"`
Status uint `json:"status" gorm:"column:status"`
Agama uint `json:"agama" gorm:"column:agama"`
Pendidikan uint `json:"pendidikan" gorm:"column:pendidikan"`
Kdcarabayar *uint `json:"kdcarabayar" gorm:"column:kdcarabayar"`
Nip *string `json:"nip" gorm:"column:nip"`
Tgldaftar string `json:"tgldaftar" gorm:"column:tgldaftar"`
AlamatKtp string `json:"alamat_ktp" gorm:"column:alamat_ktp"`
ParentNomr *string `json:"parent_nomr" gorm:"column:parent_nomr"`
Kepercayaan string `json:"kepercayaan" gorm:"column:kepercayaan"`
PenanggungjawabNama string `json:"penanggungjawab_nama" gorm:"column:penanggungjawab_nama"`
PenanggungjawabHubungan string `json:"penanggungjawab_hubungan" gorm:"column:penanggungjawab_hubungan"`
PenanggungjawabAlamat string `json:"penanggungjawab_alamat" gorm:"column:penanggungjawab_alamat"`
PenanggungjawabPhone string `json:"penanggungjawab_phone" gorm:"column:penanggungjawab_phone"`
NoKartu string `json:"no_kartu" gorm:"column:no_kartu"`
JnsPasien string `json:"jns_pasien" gorm:"column:jns_pasien"`
Nk *string `json:"nk" gorm:"column:nk"`
Kdprovider *string `json:"kdprovider" gorm:"column:kdprovider"`
Nmprovider *string `json:"nmprovider" gorm:"column:nmprovider"`
Kelas *uint `json:"kelas" gorm:"column:kelas"`
Sim *string `json:"sim" gorm:"column:sim"`
Paspor *string `json:"paspor" gorm:"column:paspor"`
Disabilitas *string `json:"disabilitas" gorm:"column:disabilitas"`
Bahasa string `json:"bahasa" gorm:"column:bahasa"`
HambatanKomunikasi string `json:"hambatan_komunikasi" gorm:"column:hambatan_komunikasi"`
Kebangsaan string `json:"kebangsaan" gorm:"column:kebangsaan"`
Notelprumah1 string `json:"notelprumah1" gorm:"column:notelprumah1"`
Notelprumah2 *string `json:"notelprumah2" gorm:"column:notelprumah2"`
Notelpkantor string `json:"notelpkantor" gorm:"column:notelpkantor"`
NoHp *string `json:"no_hp" gorm:"column:no_hp"`
AsalMasuk *string `json:"asal_masuk" gorm:"column:asal_masuk"`
Diagnosa *string `json:"diagnosa" gorm:"column:diagnosa"`
DiagnosaUtama *string `json:"diagnosa_utama" gorm:"column:diagnosa_utama"`
Suku string `json:"suku" gorm:"column:suku"`
AgamaLain string `json:"agama_lain" gorm:"column:agama_lain"`
StDisabilitas uint `json:"stDisabilitas" gorm:"column:st_disabilitas"`
TxtKelurahan string `json:"txt_kelurahan" gorm:"column:txt_kelurahan"`
TxtKecamatan string `json:"txt_kecamatan" gorm:"column:txt_kecamatan"`
TxtKota string `json:"txt_kota" gorm:"column:txt_kota"`
TxtProvinsi string `json:"txt_provinsi" gorm:"column:txt_provinsi"`
TxtStatus string `json:"txt_status" gorm:"column:txt_status"`
TxtAgama string `json:"txt_agama" gorm:"column:txt_agama"`
TxtPendidikan string `json:"txt_pendidikan" gorm:"column:txt_pendidikan"`
NamaAyah string `json:"nama_ayah" gorm:"column:nama_ayah"`
NamaIbu string `json:"nama_ibu" gorm:"column:nama_ibu"`
PendidikanAyah string `json:"pendidikan_ayah" gorm:"column:pendidikan_ayah"`
PendidikanIbu string `json:"pendidikan_ibu" gorm:"column:pendidikan_ibu"`
StIdentitasOrtu int `json:"st_identitas_ortu" gorm:"column:st_identitas_ortu"`
NomrBaru *string `json:"nomr_baru" gorm:"column:nomr_baru"`
KtpFile *string `json:"ktp_file" gorm:"column:ktp_file"`
KkFile *string `json:"kk_file" gorm:"column:kk_file"`
CreatedAt *time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt *time.Time `json:"updated_at" gorm:"column:updated_at"`
NoKk *string `json:"no_kk" gorm:"column:no_kk"`
NoktpBaru string `json:"noktp_baru" gorm:"column:noktp_baru"`
}
func (mp MPasienDto) ToPatient() e.Patient {
patient := e.Patient{
Person_Id: &mp.Id,
NewBornStatus: mp.ParentNomr != nil,
RegisteredAt: parseTimeDateOnly(mp.Tgldaftar),
RegisteredBy_User_Name: mp.Nip,
Number: &mp.Nomr,
Parent_Number: mp.ParentNomr,
// Status_Code: getActiveStatus(mp.Status),
// mp.Status is marital status
// Parent
}
// person
gc := getGender(mp.Jeniskelamin)
rc := getReligion(mp.Agama)
ec := getEducation(mp.Pendidikan)
mc := getMaritalStatus(mp.Status)
bc := getBirthRegencyCode(mp.Tempat)
et := getEthnicCode(mp.Suku)
lc := getLanguageCode(mp.Bahasa)
person := pr.Person{
Name: mp.Nama,
FrontTitle: &mp.Title,
BirthDate: parseTimeDateOnly(mp.Tgllahir),
BirthRegency_Code: &bc,
Gender_Code: &gc,
ResidentIdentityNumber: nilEmptyString(*mp.Nip),
PassportNumber: nilEmptyString(*mp.Paspor),
DrivingLicenseNumber: nilEmptyString(*mp.Sim),
Religion_Code: &rc,
Education_Code: &ec,
Ocupation_Name: &mp.Pekerjaan,
MaritalStatus_Code: &mc,
Nationality: &mp.Kebangsaan,
Ethnic_Code: &et,
Language_Code: &lc,
CommunicationIssueStatus: mp.HambatanKomunikasi == "Y",
Disability: mp.Disabilitas,
ResidentIdentityFileUrl: mp.KtpFile,
FamilyIdentityFileUrl: mp.KkFile,
// EndTitle
// Confidence
// Ocupation_Code
}
var addresses []pa.PersonAddress
if mp.Alamat != "" {
vc := fmt.Sprintf("%d", mp.Kelurahan)
addresses = append(addresses, pa.PersonAddress{
Address: mp.Alamat,
LocationType_Code: rf.ALTCDom,
Village_Code: &vc,
})
}
if mp.AlamatKtp != "" {
addresses = append(addresses, pa.PersonAddress{
Address: mp.AlamatKtp,
LocationType_Code: rf.ALTCIdn,
})
}
var contacts []pc.PersonContact
if mp.NoHp != nil {
}
person.Addresses = &addresses
person.Contacts = &contacts
patient.Person = &person
return patient
}
func getActiveStatus(s uint) cm.ActiveStatusCode {
if s == 1 {
return cm.SCActive
}
return cm.SCInactive
}
func nilEmptyString(s string) *string {
if s == "" {
return nil
}
return &s
}
func getGender(g string) rf.GenderCode {
if g == "L" {
return rf.GCMale
} else if g == "P" {
return rf.GCFemale
}
return rf.GCUnknown
}
func getReligion(r uint) rf.ReligionCode {
switch r {
case 1:
return rf.RCIslam
case 2:
return rf.RCProtestan
case 3:
return rf.RCKatolik
case 4:
return rf.RCHindu
case 5:
return rf.RCBudha
case 6:
return rf.RCKonghucu
default:
// 9 "Lainnya"
// 0 "Tidak diketahui"
return ""
}
}
func getEducation(e uint) rf.EducationCode {
switch e {
case 0:
return rf.ECTS
case 1:
return rf.ECSD
case 2:
return rf.ECSLTP
case 3:
return rf.ECSLTA
case 4:
return rf.ECD3
case 5:
return rf.ECS1
case 6:
return rf.ECOther
case 7:
return rf.ECUnkown
default:
return rf.ECUnkown
}
}
func getMaritalStatus(m uint) rf.MaritalStatusCode {
switch m {
case 1:
return rf.MaritalStatusSingle // S
case 2:
return rf.MaritalStatusMarried // M
case 3:
return rf.MaritalStatusWidowed // W
case 4:
return rf.MaritalStatusDivorced // D
default:
return "" // unknown
}
}
func getBirthRegencyCode(r string) string {
if r != "" {
// TODO get from database
}
return "3574"
}
func getEthnicCode(s string) string {
if s != "" {
// TODO check database
}
return "jawa"
}
func getLanguageCode(s string) string {
if s != "" {
// TODO check database
}
return "jawa"
}
func parseTimeDateOnly(d string) *time.Time {
do, err := time.Parse("2006-01-02", d)
if err == nil {
return &do
}
return nil
}
@@ -0,0 +1,88 @@
package patient
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
rw "github.com/karincake/risoles"
p "simrs-vx/internal/domain/simgos-entities/patient"
)
type myBase struct{}
var O myBase
const baseUrl string = "http://localhost:8000/v1/"
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
dto := p.MPasienDto{}
if !rw.ValidateStructByIOR(w, r.Body, &dto) {
return
}
// translate m_pasien ke Patient
patient := dto.ToPatient()
jsonPatient, err := json.Marshal(patient)
if err != nil {
fmt.Println(err)
}
// fmt.Println(string(jsonPatient))
// kirim request ke api sim-baru
reqBody := bytes.NewBuffer(jsonPatient)
err = send(http.MethodPost, baseUrl+"patient", reqBody)
if err != nil {
fmt.Println("request error:", err)
}
}
func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
dto := p.MPasienDto{}
if !rw.ValidateStructByIOR(w, r.Body, &dto) {
return
}
patient := dto.ToPatient()
jsonPatient, err := json.Marshal(patient)
if err != nil {
fmt.Println(err)
}
reqBody := bytes.NewBuffer(jsonPatient)
err = send(http.MethodPatch, fmt.Sprintf("%s%s%v", baseUrl, "patient/", patient.Id), reqBody)
if err != nil {
fmt.Println("request error:", err)
}
}
func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
dto := p.MPasienDto{}
if !rw.ValidateStructByIOR(w, r.Body, &dto) {
return
}
patient := dto.ToPatient()
jsonPatient, err := json.Marshal(patient)
if err != nil {
fmt.Println(err)
}
reqBody := bytes.NewBuffer(jsonPatient)
err = send(http.MethodDelete, fmt.Sprintf("%s%s%v", baseUrl, "patient/", patient.Id), reqBody)
if err != nil {
fmt.Println("request error:", err)
}
}
func (obj myBase) CreateLog(w http.ResponseWriter, r *http.Request) {
}
func send(method string, url string, body *bytes.Buffer) error {
req, err := http.NewRequest(method, url, body)
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
@@ -8,6 +8,7 @@ import (
/******************** infra ********************/
gs "simrs-vx/internal/infra/gorm-setting"
simgosdb "simrs-vx/internal/infra/simgos-db"
/******************** pkg ********************/
cmw "simrs-vx/pkg/cors-manager-mw"
lh "simrs-vx/pkg/lang-helper"
@@ -20,6 +21,7 @@ import (
"simrs-vx/internal/interface/main-handler/home"
division "simrs-vx/internal/interface/simgos-sync-handler/division"
installation "simrs-vx/internal/interface/simgos-sync-handler/installation"
oldPatient "simrs-vx/internal/interface/simgos-sync-handler/old/patient"
patient "simrs-vx/internal/interface/simgos-sync-handler/patient"
specialist "simrs-vx/internal/interface/simgos-sync-handler/specialist"
subspecialist "simrs-vx/internal/interface/simgos-sync-handler/subspecialist"
@@ -48,5 +50,8 @@ func SetRoutes() http.Handler {
hc.SyncCrud(r, prefix+"/v1/patient", patient.O)
r.HandleFunc(fmt.Sprintf("GET %s/v1/patient-nomr-generator", prefix), patient.O.GenerateNomr)
/*********** Source old-to-new ****************/
oldPrefix := "/old-to-new"
hc.SyncCrud(r, oldPrefix+"/v1/patient", oldPatient.O)
return cmw.SetCors(handlerlogger.SetLog(r))
}