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

148 lines
3.3 KiB
Go

package doctor
import (
"encoding/json"
"fmt"
"log"
"net/http"
pl "simrs-vx/pkg/logger"
"strconv"
db "simrs-vx/pkg/dualtrx-helper"
erg "simrs-vx/internal/domain/references/organization"
eed "simrs-vx/internal/domain/main-entities/doctor"
epr "simrs-vx/internal/domain/main-entities/person"
es "simrs-vx/internal/domain/main-entities/user"
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 {
Kddokter uint `gorm:"column:kddokter"`
Kdpoly uint `gorm:"column:kdpoly"`
NIP string `gorm:"column:nip"`
NamaPegawai string `gorm:"column:nama_pegawai"`
}
func SeedDoctor(kddoc []uint, event *pl.Event, tx *db.Dualtx) error {
log.Println("=== START SeedDoctor ===")
var users []user
log.Println("Querying SIMGOS doctors...")
err := tx.Simgos.
Table("m_dokter").
Select(`
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 {
return err
}
log.Printf("Found %d doctors to seed\n", len(users))
// mapping
for i, d := range users {
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")
doctorsimx := es.CreateDto{
Name: d.NIP,
Password: "1234",
ContractPosition_Code: erg.CSCEmp,
Code: &kddokter,
Person: &epr.UpdateDto{
CreateDto: epr.CreateDto{
Name: d.NamaPegawai,
ResidentIdentityNumber: &nik,
},
},
Employee: &es.EmployeUpdateDto{
Position_Code: erg.EPCDoc,
},
}
log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.NIP)
// create user
userData, err := seeder.CreateUser(doctorsimx)
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 doctor with code=%s ...", i+1, kddokter)
// get doctor
dataDoctor, err := getDoctors(kddokter)
if err != nil {
log.Println("Error getDoctors:", err)
return err
}
doc := *dataDoctor
ddoc := doc[0]
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
}
log.Printf("[%d] Link created successfully.", i+1)
}
log.Println("=== FINISH SeedDoctor ===")
return nil
}
func getDoctors(code string) (*[]eed.Doctor, error) {
path := fmt.Sprintf("doctor?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 []eed.Doctor `json:"data"`
}
// getting response
var data MainApiResp
err = json.Unmarshal(resp, &data)
if err != nil {
return nil, err
}
return &data.Data, nil
}