Files
simrsx-be/internal/use-case/simgos-sync-use-case/seeder/nurse/seeder.go
T
2025-12-11 01:35:39 +07:00

148 lines
3.2 KiB
Go

package nurse
import (
"encoding/json"
"fmt"
"log"
"net/http"
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
db "simrs-vx/pkg/dualtrx-helper"
pl "simrs-vx/pkg/logger"
"strconv"
erg "simrs-vx/internal/domain/references/organization"
enr "simrs-vx/internal/domain/main-entities/nurse"
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"
en "simrs-vx/internal/domain/simgos-entities/m-perawat"
un "simrs-vx/internal/use-case/simgos-sync-use-case/new/nurse"
)
type user struct {
el.MLogin
en.MPerawat
}
func SeedNurse(kdnur []uint, event *pl.Event, tx *db.Dualtx) error {
log.Println("=== START SeedNurse ===")
var users []user
log.Println("Querying SIMGOS nurses...")
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(`m_perawat.idperawat IN (?)`, kdnur).
Order(`l.nip`).
Scan(&users).Error
if err != nil {
log.Println("Error Querying SIMGOS:", err)
return err
}
log.Printf("Found %d nurses to seed\n", len(users))
// mapping
for i, d := range users {
log.Printf("[%d/%d] Processing nurse KdPerawat=%d ...", i+1, len(users), d.Idperawat)
kdprawat := strconv.Itoa(int(*d.Idperawat))
nik := seeder.GenerateDummyNIK("F")
nursesimx := es.CreateDto{
Name: d.MLogin.NIP,
Password: "1234",
ContractPosition_Code: erg.CSCEmp,
Code: &kdprawat,
Person: &epr.UpdateDto{
CreateDto: epr.CreateDto{
Name: d.NamaPegawai,
ResidentIdentityNumber: &nik,
},
},
Employee: &es.EmployeUpdateDto{
Position_Code: erg.EPCNur,
},
}
log.Printf("[%d] Creating User for NIP=%v ...", i+1, d.MLogin.NIP)
// create user
userData, err := seeder.CreateUser(nursesimx)
if err != nil {
log.Println("Error createUser:", err)
return err
}
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 get nurses:", err)
return err
}
data := *dataNurse
ddata := data[0]
log.Printf("[%d] Linking nurse %d to %s ...", i+1, ddata.Id, kdprawat)
if _, err := un.CreateLinkData(ddata.Id, *d.Idperawat, event); err != nil {
return err
}
log.Printf("[%d] Link created successfully.", i+1)
}
log.Println("=== FINISH Seednurse ===")
return nil
}
func getNurse(code string) (*[]enr.Nurse, error) {
path := fmt.Sprintf("nurse?code=%s", code)
resp, err := seeder.Send(http.MethodGet, path, nil, "von")
if err != nil {
return nil, err
}
type MetaData struct {
Source string `json:"source"`
Status string `json:"status"`
Structure string `json:"structure"`
}
type MainApiResp struct {
Meta MetaData `json:"meta"`
Data []enr.Nurse `json:"data"`
}
// getting response
var data MainApiResp
err = json.Unmarshal(resp, &data)
if err != nil {
return nil, err
}
return &data.Data, nil
}