seeder finish
This commit is contained in:
@@ -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 ******************/
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user