seeder finish

This commit is contained in:
vanilia
2025-12-11 01:35:39 +07:00
parent 58e3cb15ae
commit e6cc34ee94
10 changed files with 272 additions and 127 deletions
@@ -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)
}
@@ -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)
}
@@ -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)
}
@@ -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 ******************/
+6 -1
View File
@@ -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
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}