diff --git a/internal/interface/simgos-sync-handler/seeder/doctor/handler.go b/internal/interface/simgos-sync-handler/seeder/doctor/handler.go deleted file mode 100644 index 38c11cc4..00000000 --- a/internal/interface/simgos-sync-handler/seeder/doctor/handler.go +++ /dev/null @@ -1,18 +0,0 @@ -package doctor - -import ( - "net/http" - "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor" - - rw "github.com/karincake/risoles" -) - -type myBase struct{} - -var O myBase - -func (obj myBase) Seeder(w http.ResponseWriter, r *http.Request) { - - err := doctor.SeedDoctor() - rw.DataResponse(w, nil, err) -} diff --git a/internal/interface/simgos-sync-handler/seeder/handler.go b/internal/interface/simgos-sync-handler/seeder/handler.go new file mode 100644 index 00000000..0d0f70c6 --- /dev/null +++ b/internal/interface/simgos-sync-handler/seeder/handler.go @@ -0,0 +1,23 @@ +package seeder + +import ( + "net/http" + seeder "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" + main "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/seeder" + + rw "github.com/karincake/risoles" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Seeder(w http.ResponseWriter, r *http.Request) { + dto := seeder.Dto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + + res, err := main.SeedToSimx(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/simgos-sync-handler/seeder/nurse/handler.go b/internal/interface/simgos-sync-handler/seeder/nurse/handler.go deleted file mode 100644 index 93d58045..00000000 --- a/internal/interface/simgos-sync-handler/seeder/nurse/handler.go +++ /dev/null @@ -1,18 +0,0 @@ -package nurse - -import ( - "net/http" - "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse" - - rw "github.com/karincake/risoles" -) - -type myBase struct{} - -var O myBase - -func (obj myBase) Seeder(w http.ResponseWriter, r *http.Request) { - - err := nurse.SeedNurse() - rw.DataResponse(w, nil, err) -} diff --git a/internal/interface/simgos-sync-handler/simgos-sync-handler.go b/internal/interface/simgos-sync-handler/simgos-sync-handler.go index e7a6c597..c8a08b7f 100644 --- a/internal/interface/simgos-sync-handler/simgos-sync-handler.go +++ b/internal/interface/simgos-sync-handler/simgos-sync-handler.go @@ -30,8 +30,7 @@ import ( "simrs-vx/internal/interface/simgos-sync-handler/new/subspecialist" "simrs-vx/internal/interface/simgos-sync-handler/new/unit" - sd "simrs-vx/internal/interface/simgos-sync-handler/seeder/doctor" - sn "simrs-vx/internal/interface/simgos-sync-handler/seeder/nurse" + sd "simrs-vx/internal/interface/simgos-sync-handler/seeder" oldpatient "simrs-vx/internal/interface/simgos-sync-handler/old/patient" @@ -79,11 +78,10 @@ func SetRoutes() http.Handler { }) hc.SyncCrud(r, prefixnew+"/v1/soapi", soapi.O) - /******************** SvcToNew ******************/ - prefixseeder := "/new-seeder" + /******************** Seeder ******************/ + prefixseeder := "/seeder" hk.GroupRoutes(prefixseeder+"/v1", r, hk.MapHandlerFunc{ - "POST /doctor": sd.O.Seeder, - "POST /nurse": sn.O.Seeder, + "POST /": sd.O.Seeder, }) /******************** SvcToNew ******************/ diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index 1ea8c6ea..154695fb 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -169,9 +169,14 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } case ero.EPCReg, ero.EPCScr: + var instalationCode string + if input.Installation_Code != nil { + instalationCode = *input.Installation_Code + } + createSub := er.CreateDto{ Employee_Id: employeeData.Id, - Installation_Code: *input.Installation_Code, + Installation_Code: instalationCode, } if _, err := ur.CreateData(createSub, &event, tx); err != nil { return err diff --git a/internal/use-case/simgos-sync-use-case/seeder/doctor/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/doctor/seeder.go index 63626d16..e575c26b 100644 --- a/internal/use-case/simgos-sync-use-case/seeder/doctor/seeder.go +++ b/internal/use-case/simgos-sync-use-case/seeder/doctor/seeder.go @@ -6,7 +6,6 @@ import ( "log" "net/http" - "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" pl "simrs-vx/pkg/logger" "strconv" @@ -18,44 +17,40 @@ import ( epr "simrs-vx/internal/domain/main-entities/person" es "simrs-vx/internal/domain/main-entities/user" - ed "simrs-vx/internal/domain/simgos-entities/m-dokter" - el "simrs-vx/internal/domain/simgos-entities/m-login" - ee "simrs-vx/internal/domain/simgos-entities/m-pegawai" - ud "simrs-vx/internal/use-case/simgos-sync-use-case/new/doctor" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" ) type user struct { - Login el.MLogin `gorm:"embedded"` - Doctor ed.MDokter `gorm:"embedded"` - Employee ee.MPegawai `gorm:"embedded"` + Kddokter uint `gorm:"column:kddokter"` + Kdpoly uint `gorm:"column:kdpoly"` + NIP string `gorm:"column:nip"` + NamaPegawai string `gorm:"column:nama_pegawai"` } -func SeedDoctor() error { +func SeedDoctor(kddoc []uint, event *pl.Event, tx *db.Dualtx) error { log.Println("=== START SeedDoctor ===") - tx := db.NewTx() - var users []user - log.Println("Querying SIMRS doctors...") + log.Println("Querying SIMGOS doctors...") - err := tx.Simgos.Table("m_dokter"). + err := tx.Simgos. + Table("m_dokter"). Select(` - m_dokter.*, - l.*, - p.* - `). - Joins(`LEFT JOIN m_login l ON l.kddokter = m_dokter.kddokter`). - Joins(`LEFT JOIN m_pegawai p ON p.no_peg = m_dokter.kddokter`). - Where(`p.nik != '' AND p.nik != '0' AND l.nip != ''`). - Order(`m_dokter.kddokter DESC`). - Limit(10). + DISTINCT ON (l.nip) + m_dokter.kddokter as kddokter, + m_dokter.kdpoly as kdpoly, + l.nip as nip, + l.nama_pegawai as nama_pegawai + `). + Joins(`LEFT JOIN m_login l ON l.kddokter = m_dokter.kddokter`). + Where(`m_dokter.kddokter IN (?)`, kddoc). + Order(`l.nip`). Scan(&users).Error if err != nil { - log.Println("Error Querying SIMRS:", err) return err } @@ -63,19 +58,21 @@ func SeedDoctor() error { // mapping for i, d := range users { - log.Printf("[%d/%d] Processing doctor KdDokter=%d ...", i+1, len(users), d.Doctor.Kddokter) + log.Printf("[%d/%d] Processing doctor KdDokter=%d ...", i+1, len(users), d.Kddokter) + + kddokter := strconv.Itoa(int(d.Kddokter)) + //kdpoly := strconv.Itoa(int(d.MDokter.Kdpoly)) + nik := seeder.GenerateDummyNIK("F") - kddokter := strconv.Itoa(int(d.Doctor.Kddokter)) doctorsimx := es.CreateDto{ - Name: d.Login.NIP, + Name: d.NIP, Password: "1234", ContractPosition_Code: erg.CSCEmp, Code: &kddokter, Person: &epr.UpdateDto{ CreateDto: epr.CreateDto{ - Name: d.Employee.NamaPeg, - BirthPlace: &d.Employee.TempatLahir, - ResidentIdentityNumber: &d.Employee.NIK, + Name: d.NamaPegawai, + ResidentIdentityNumber: &nik, }, }, Employee: &es.EmployeUpdateDto{ @@ -83,18 +80,19 @@ func SeedDoctor() error { }, } - log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.Login.NIP) + log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.NIP) // create user - user, err := seeder.CreateUser(doctorsimx) + userData, err := seeder.CreateUser(doctorsimx) if err != nil { log.Println("Error createUser:", err) return err } - log.Printf("[%d] User created: ID=%d", i+1, user.Id) + log.Printf("[%d] User created: ID=%d", i+1, userData.Id) log.Printf("[%d] Fetching doctor with code=%s ...", i+1, kddokter) + // get doctor dataDoctor, err := getDoctors(kddokter) if err != nil { @@ -105,8 +103,8 @@ func SeedDoctor() error { doc := *dataDoctor ddoc := doc[0] - log.Printf("[%d] Linking doctor %d to %d ...", i+1, ddoc.Id, d.Doctor.Kddokter) - if _, err := ud.CreateLinkData(ddoc.Id, d.Doctor.Kddokter, &pl.Event{}); err != nil { + log.Printf("[%d] Linking doctor %d to %s ...", i+1, ddoc.Id, kddokter) + if _, err = ud.CreateLinkData(ddoc.Id, d.Kddokter, event); err != nil { return err } diff --git a/internal/use-case/simgos-sync-use-case/seeder/helper.go b/internal/use-case/simgos-sync-use-case/seeder/helper.go index b9b7336f..74006fe2 100644 --- a/internal/use-case/simgos-sync-use-case/seeder/helper.go +++ b/internal/use-case/simgos-sync-use-case/seeder/helper.go @@ -5,11 +5,18 @@ import ( "encoding/json" "fmt" "io" + "math/rand" "net/http" es "simrs-vx/internal/domain/main-entities/user" cfg "simrs-vx/internal/infra/sync-cfg" + "time" ) +type Dto struct { + LoginNip []string `json:"loginNip"` + Instalasi_Code string `json:"instalasi_code"` +} + func Send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) { var url string = cfg.O.NewHost + "v1/" + endpoint var reader io.Reader = nil @@ -73,3 +80,31 @@ func CreateUser(user es.CreateDto) (*es.User, error) { return &data.Data, nil } + +func GenerateDummyNIK(gender string) string { + rand.Seed(time.Now().UnixNano()) + + // 1️⃣ Kode wilayah (6 digit) + // Bisa di-random, atau gunakan kode tetap seperti Jakarta: 317301 + region := rand.Intn(999999) // 000000 - 999999 + regionCode := fmt.Sprintf("%06d", region) + + // 2️⃣ Tanggal lahir (DDMMYY) + year := rand.Intn(30) + 70 // antara tahun 1970-1999 (bisa diganti range lain) + month := rand.Intn(12) + 1 + day := rand.Intn(28) + 1 // selalu valid + + if gender == "F" { + day += 40 // aturan NIK perempuan: tanggal lahir + 40 + } + + birth := fmt.Sprintf("%02d%02d%02d", day, month, year) + + // 3️⃣ Nomor urut (4 digit) + sequence := fmt.Sprintf("%04d", rand.Intn(9999)) + + // 4️⃣ Susun NIK akhir + nik := regionCode + birth + sequence + + return nik +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go index 8f1732ff..5ea60fb2 100644 --- a/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go +++ b/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go @@ -4,15 +4,12 @@ import ( "encoding/json" "fmt" "log" - "math/rand" "net/http" "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" + db "simrs-vx/pkg/dualtrx-helper" pl "simrs-vx/pkg/logger" "strconv" - "time" - - db "simrs-vx/pkg/dualtrx-helper" erg "simrs-vx/internal/domain/references/organization" @@ -31,26 +28,30 @@ type user struct { en.MPerawat } -func SeedNurse() error { +func SeedNurse(kdnur []uint, event *pl.Event, tx *db.Dualtx) error { log.Println("=== START SeedNurse ===") - tx := db.NewTx() - var users []user - log.Println("Querying SIMRS nurses...") + log.Println("Querying SIMGOS nurses...") - err := tx.Simgos.Table("m_perawat"). - Select("m_perawat.idperawat, m_perawat.nama, l.*"). + err := tx.Simgos. + Table("m_perawat"). + Select(` + DISTINCT ON (l.nip) + m_perawat.idperawat, + m_perawat.nama, + l.nip, + l.nama_pegawai + `). Joins("LEFT JOIN m_login l ON l.kdperawat = m_perawat.idperawat"). - Where("l.roles = ?", 4). - Order("m_perawat.idperawat DESC"). - Limit(10). + Where(`m_perawat.idperawat IN (?)`, kdnur). + Order(`l.nip`). Scan(&users).Error if err != nil { - log.Println("Error Querying SIMRS:", err) + log.Println("Error Querying SIMGOS:", err) return err } @@ -61,7 +62,8 @@ func SeedNurse() error { log.Printf("[%d/%d] Processing nurse KdPerawat=%d ...", i+1, len(users), d.Idperawat) kdprawat := strconv.Itoa(int(*d.Idperawat)) - nik := GenerateDummyNIK("F") + nik := seeder.GenerateDummyNIK("F") + nursesimx := es.CreateDto{ Name: d.MLogin.NIP, Password: "1234", @@ -78,11 +80,7 @@ func SeedNurse() error { }, } - log.Printf("[%d] Creating User for NIP=%v ...", i+1, d.Idperawat) - - if i == 0 { - continue - } + log.Printf("[%d] Creating User for NIP=%v ...", i+1, d.MLogin.NIP) // create user userData, err := seeder.CreateUser(nursesimx) @@ -94,10 +92,11 @@ func SeedNurse() error { log.Printf("[%d] User created: ID=%d", i+1, userData.Id) log.Printf("[%d] Fetching nurse with code=%s ...", i+1, kdprawat) + // get nurse dataNurse, err := getNurse(kdprawat) if err != nil { - log.Println("Error getnurses:", err) + log.Println("Error get nurses:", err) return err } @@ -105,7 +104,7 @@ func SeedNurse() error { ddata := data[0] log.Printf("[%d] Linking nurse %d to %s ...", i+1, ddata.Id, kdprawat) - if _, err := un.CreateLinkData(ddata.Id, *d.Idperawat, &pl.Event{}); err != nil { + if _, err := un.CreateLinkData(ddata.Id, *d.Idperawat, event); err != nil { return err } @@ -146,31 +145,3 @@ func getNurse(code string) (*[]enr.Nurse, error) { return &data.Data, nil } - -func GenerateDummyNIK(gender string) string { - rand.Seed(time.Now().UnixNano()) - - // 1️⃣ Kode wilayah (6 digit) - // Bisa di-random, atau gunakan kode tetap seperti Jakarta: 317301 - region := rand.Intn(999999) // 000000 - 999999 - regionCode := fmt.Sprintf("%06d", region) - - // 2️⃣ Tanggal lahir (DDMMYY) - year := rand.Intn(30) + 70 // antara tahun 1970-1999 (bisa diganti range lain) - month := rand.Intn(12) + 1 - day := rand.Intn(28) + 1 // selalu valid - - if gender == "F" { - day += 40 // aturan NIK perempuan: tanggal lahir + 40 - } - - birth := fmt.Sprintf("%02d%02d%02d", day, month, year) - - // 3️⃣ Nomor urut (4 digit) - sequence := fmt.Sprintf("%04d", rand.Intn(9999)) - - // 4️⃣ Susun NIK akhir - nik := regionCode + birth + sequence - - return nik -} diff --git a/internal/use-case/simgos-sync-use-case/seeder/regular/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/regular/seeder.go new file mode 100644 index 00000000..1ef0c292 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/regular/seeder.go @@ -0,0 +1,57 @@ +package regular + +import ( + "log" + erg "simrs-vx/internal/domain/references/organization" + + epr "simrs-vx/internal/domain/main-entities/person" + es "simrs-vx/internal/domain/main-entities/user" + + el "simrs-vx/internal/domain/simgos-entities/m-login" + + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +func SeedRegular(regLogin []el.MLogin, instalasiCode string) error { + + log.Println("=== START SeedRegular ===") + + // mapping + for i, d := range regLogin { + log.Printf("[%d/%d] Processing Regular NIP=%s ...", i+1, len(regLogin), d.NIP) + + nik := seeder.GenerateDummyNIK("F") + + regularsimx := es.CreateDto{ + Name: d.NIP, + Password: "1234", + ContractPosition_Code: erg.CSCEmp, + Installation_Code: &instalasiCode, + Person: &epr.UpdateDto{ + CreateDto: epr.CreateDto{ + Name: d.NamaPegawai, + ResidentIdentityNumber: &nik, + }, + }, + Employee: &es.EmployeUpdateDto{ + Position_Code: erg.EPCReg, + }, + } + + log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.NIP) + + // create user + userData, err := seeder.CreateUser(regularsimx) + if err != nil { + log.Println("Error createUser:", err) + return err + } + + log.Printf("[%d] User created: ID=%d", i+1, userData.Id) + } + + log.Println("=== FINISH SeedRegular ===") + + return nil + +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go new file mode 100644 index 00000000..49f59b99 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go @@ -0,0 +1,94 @@ +package seeder + +import ( + "log" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/regular" + + db "simrs-vx/pkg/dualtrx-helper" + pl "simrs-vx/pkg/logger" + + d "github.com/karincake/dodol" + + el "simrs-vx/internal/domain/simgos-entities/m-login" + + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +const source = "seeder" + +func SeedToSimx(input seeder.Dto) (*d.Data, error) { + event := pl.Event{ + Feature: "Seeder", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + var ( + tx = db.NewTx() + mlogin, regLogin []el.MLogin + kddokter, kdperawat []uint + ) + + // Get M_login + err := tx.Simgos.Model(&el.MLogin{}). + Select(`DISTINCT ON (nip) m_login.*`). + Where(`"nip" IN (?)`, input.LoginNip). + Find(&mlogin).Error + if err != nil { + log.Println("Error Querying Mlogin:", err) + return nil, err + } + + // SET data + if len(mlogin) > 0 { + for _, l := range mlogin { + if l.KdDokter != 0 { + kddokter = append(kddokter, l.KdDokter) + continue + } + + if l.KdPerawat != 0 { + kdperawat = append(kdperawat, l.KdPerawat) + continue + } + + regLogin = append(regLogin, l) + } + } + + // Seed based on role + if len(kddokter) > 0 { + err = doctor.SeedDoctor(kddokter, &event, tx) + if err != nil { + return nil, err + } + } + + if len(kdperawat) > 0 { + err = nurse.SeedNurse(kdperawat, &event, tx) + if err != nil { + return nil, err + } + } + + if len(regLogin) > 0 { + err = regular.SeedRegular(regLogin, input.Instalasi_Code) + if err != nil { + return nil, err + } + } + + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + }, nil +}