From 7276b2a985106beebe85f97b3deb59429ce7e75d Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 3 Dec 2025 14:02:29 +0700 Subject: [PATCH 1/4] fix soapi sync --- internal/use-case/main-use-case/soapi/case.go | 4 +-- .../main-use-case/soapi/middleware.go | 2 +- .../simgos-sync-plugin/new/soapi/plugin.go | 2 +- .../new/encounter/case.go | 30 +++++++++++++++++++ .../simgos-sync-use-case/new/patient/case.go | 5 ++++ 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index 8f4d29e2..49f37ba7 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -51,7 +51,7 @@ func Create(input e.CreateDto) (*d.Data, error) { // get detail for sync soapiData, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, - Includes: "Encounter,Employee"}, &event) + Includes: "Encounter,Employee"}, &event, tx) if err != nil { return err } @@ -59,7 +59,7 @@ func Create(input e.CreateDto) (*d.Data, error) { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err = mwRunner.ExecuteIfSyncOn(func() error { - return mwRunner.RunCreateMiddleware(createPostMw, soapiData) + return mwRunner.RunCreateMiddleware(createPreMw, soapiData) }); err != nil { return err } diff --git a/internal/use-case/main-use-case/soapi/middleware.go b/internal/use-case/main-use-case/soapi/middleware.go index 049b0415..548d27fd 100644 --- a/internal/use-case/main-use-case/soapi/middleware.go +++ b/internal/use-case/main-use-case/soapi/middleware.go @@ -4,7 +4,7 @@ import plugin "simrs-vx/internal/use-case/simgos-sync-plugin/new/soapi" func init() { createPreMw = append(createPreMw, - createMw{Name: "sync-update-soapi", Func: plugin.Create}) + createMw{Name: "sync-create-soapi", Func: plugin.Create}) createSimxLogMw = append(createSimxLogMw, createLogMw{Name: "create-sync-log", Func: plugin.CreateLog}) diff --git a/internal/use-case/simgos-sync-plugin/new/soapi/plugin.go b/internal/use-case/simgos-sync-plugin/new/soapi/plugin.go index 8cc40723..20fabfac 100644 --- a/internal/use-case/simgos-sync-plugin/new/soapi/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/soapi/plugin.go @@ -32,5 +32,5 @@ func Delete(input *e.DeleteDto) error { } func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/encounter", sync.O.TargetHost, sync.O.Prefix) + return fmt.Sprintf("%s%s/v1/soapi", sync.O.TargetHost, sync.O.Prefix) } diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/case.go b/internal/use-case/simgos-sync-use-case/new/encounter/case.go index 4258e4a3..05c77915 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/case.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/case.go @@ -135,6 +135,11 @@ func Update(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 2: Update Simgos if err = UpdateTPendaftaranData(input, simgos, "update", &event, tx); err != nil { return err @@ -238,6 +243,11 @@ func CheckIn(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 2: Update Simgos if err = UpdateTPendaftaranData(input, simgos, "check-in", &event, tx); err != nil { return err @@ -280,6 +290,11 @@ func CheckOut(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 2: Update Simgos if err = UpdateTPendaftaranData(input, simgos, "check-out", &event, tx); err != nil { return err @@ -322,6 +337,11 @@ func UpdateStatus(input e.Encounter) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 2: Update TPendaftaran if err = UpdateTPendaftaranData(input, simgos, "update-status", &event, tx); err != nil { return err @@ -434,6 +454,11 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 3: Update TPemeriksaanHist if err := utph.UpdateSimgosData(input, tPemeriksaanHist, "approve", &event, tx); err != nil { return err @@ -476,6 +501,11 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 3: Update TPemeriksaanHist if err := utph.UpdateSimgosData(input, tPemeriksaanHist, "cancel", &event, tx); err != nil { return err diff --git a/internal/use-case/simgos-sync-use-case/new/patient/case.go b/internal/use-case/simgos-sync-use-case/new/patient/case.go index a147524c..03497eed 100644 --- a/internal/use-case/simgos-sync-use-case/new/patient/case.go +++ b/internal/use-case/simgos-sync-use-case/new/patient/case.go @@ -122,6 +122,11 @@ func Update(input e.Patient) (*d.Data, error) { tx := db.NewTx() err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // SET LOCAL + if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil { + return err + } + // Step 3: Update Simgos if err = UpdateSimgosData(input, patientData, &event, tx); err != nil { return err From a44ba9ab1cd133c8fa1c250c68f5ad2a4272208e Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 3 Dec 2025 14:20:28 +0700 Subject: [PATCH 2/4] add partial index for patient number --- cmd/main-migration/migrations/atlas.sum | 4 ++-- internal/domain/main-entities/patient/entity.go | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index c949eadc..341a35d3 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:MO6ze6e6ClW/WxUyiZxT6Lmhz8BDgXmmYeLDSN4xEJw= +h1:DgMML95zGYI7JMvZaIb/gySCvncMu62CANOIXNX0A6w= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -143,4 +143,4 @@ h1:MO6ze6e6ClW/WxUyiZxT6Lmhz8BDgXmmYeLDSN4xEJw= 20251202130629.sql h1:9mvalqfhqGCdkcJepJDzHprU2xb0i5sYys1Htf62ioo= 20251202160848.sql h1:Kd2/TziKSMezrt4XgbjQcYvY/Lo9rX0qw7/Lz0/oyKk= 20251202180207.sql h1:IHmSMIO3ia+YV5GULixbdlV1joaUAWtnjQHPd8+HKiM= -20251202231005.sql h1:iVzsqbqmfncDXPPXoRqCQdcvgvLBv57TbzdbzQAmSVc= +20251202231005.sql h1:lua0KKoeBptSfs/6ehZE6Azo6YUlNkOJwGFyb1HQWkY= diff --git a/internal/domain/main-entities/patient/entity.go b/internal/domain/main-entities/patient/entity.go index 83afa6ce..9ad63ce8 100644 --- a/internal/domain/main-entities/patient/entity.go +++ b/internal/domain/main-entities/patient/entity.go @@ -15,7 +15,14 @@ type Patient struct { RegisteredAt *time.Time `json:"registeredAt"` RegisteredBy_User_Name *string `json:"registeredBy_user_name" gorm:"size:100"` Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` - Number *string `json:"number" gorm:"unique;size:15"` - Parent_Number *string `json:"parent_number"` - Parent *Patient `json:"parent,omitempty" gorm:"foreignKey:Parent_Number;references:Number"` + + // Normal UNIQUE index — required for the foreign key reference + Number *string `json:"number" gorm:"size:15;unique"` + + // Partial unique index — keeps Number unique only for non–soft-deleted records. + // Allows duplicate Number values when previous records are soft-deleted. + _ struct{} `gorm:"uniqueIndex:idx_number_active,where:\"DeletedAt\" IS NULL"` + + Parent_Number *string `json:"parent_number"` + Parent *Patient `json:"parent,omitempty" gorm:"foreignKey:Parent_Number;references:Number"` } From 09068877878c7712bae83357badccf807d3554c1 Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 3 Dec 2025 15:24:28 +0700 Subject: [PATCH 3/4] rollback patient --- internal/domain/main-entities/patient/entity.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/internal/domain/main-entities/patient/entity.go b/internal/domain/main-entities/patient/entity.go index 9ad63ce8..fc6d8833 100644 --- a/internal/domain/main-entities/patient/entity.go +++ b/internal/domain/main-entities/patient/entity.go @@ -15,14 +15,7 @@ type Patient struct { RegisteredAt *time.Time `json:"registeredAt"` RegisteredBy_User_Name *string `json:"registeredBy_user_name" gorm:"size:100"` Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` - - // Normal UNIQUE index — required for the foreign key reference - Number *string `json:"number" gorm:"size:15;unique"` - - // Partial unique index — keeps Number unique only for non–soft-deleted records. - // Allows duplicate Number values when previous records are soft-deleted. - _ struct{} `gorm:"uniqueIndex:idx_number_active,where:\"DeletedAt\" IS NULL"` - - Parent_Number *string `json:"parent_number"` - Parent *Patient `json:"parent,omitempty" gorm:"foreignKey:Parent_Number;references:Number"` + Number *string `json:"number" gorm:"size:15;unique"` + Parent_Number *string `json:"parent_number"` + Parent *Patient `json:"parent,omitempty" gorm:"foreignKey:Parent_Number;references:Number"` } From 5406a9b292155bc7fe183d531ea4ebfad73b8a77 Mon Sep 17 00:00:00 2001 From: vanilia Date: Thu, 4 Dec 2025 07:45:16 +0700 Subject: [PATCH 4/4] solve entity and finish soapi --- .../t-diagnosadanterapi/entity.go | 36 +++++++++---------- .../domain/simgos-entities/t-icd-cm/entity.go | 12 +++---- .../domain/simgos-entities/t-icd/entity.go | 12 +++---- internal/use-case/main-use-case/soapi/case.go | 2 +- .../simgos-sync-use-case/new/soapi/helper.go | 15 ++++---- 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/internal/domain/simgos-entities/t-diagnosadanterapi/entity.go b/internal/domain/simgos-entities/t-diagnosadanterapi/entity.go index 2e77d362..9579168c 100644 --- a/internal/domain/simgos-entities/t-diagnosadanterapi/entity.go +++ b/internal/domain/simgos-entities/t-diagnosadanterapi/entity.go @@ -11,29 +11,29 @@ type TDiagnosaDanTerapi struct { GolonganDarah string `json:"golongan_darah" gorm:"column:golongan_darah"` TinggiBadan float64 `json:"tinggi_badan" gorm:"column:tinggi_badan"` BeratBadan float64 `json:"berat_badan" gorm:"column:berat_badan"` - Diagnosa string `json:"diagnosa" gorm:"column:diagnosa"` - Komplikasi string `json:"komplikasi" gorm:"column:komplikasi"` - Terapi string `json:"terapi" gorm:"column:terapi"` - Anamnesa string `json:"anamnesa" gorm:"column:anamnesa"` + Diagnosa *string `json:"diagnosa" gorm:"column:diagnosa"` + Komplikasi *string `json:"komplikasi" gorm:"column:komplikasi"` + Terapi *string `json:"terapi" gorm:"column:terapi"` + Anamnesa *string `json:"anamnesa" gorm:"column:anamnesa"` Kdpoly uint `json:"kdpoly" gorm:"column:kdpoly"` Kddokter uint `json:"kddokter" gorm:"column:kddokter"` - Kdtujuanrujuk uint `json:"kdtujuanrujuk" gorm:"column:kdtujuanrujuk"` + Kdtujuanrujuk *uint `json:"kdtujuanrujuk" gorm:"column:kdtujuanrujuk"` Nip string `json:"nip" gorm:"column:nip"` - IcdCode string `json:"icd_code" gorm:"column:icd_code"` + IcdCode *string `json:"icd_code" gorm:"column:icd_code"` KunjunganBl uint `json:"kunjungan_bl" gorm:"column:kunjungan_bl"` KasusBl uint `json:"kasus_bl" gorm:"column:kasus_bl"` - Icdcm string `json:"icdcm" gorm:"column:icdcm"` - Icd9 string `json:"icd_9" gorm:"column:icd_9"` - Klb uint `json:"klb" gorm:"column:klb"` - Bedah uint `json:"bedah" gorm:"column:bedah"` - Jenis uint `json:"jenis" gorm:"column:jenis"` - Perawat string `json:"perawat" gorm:"column:perawat"` - Status string `json:"status" gorm:"column:status"` - PemeriksaanFisik string `json:"pemeriksaan_fisik" gorm:"column:pemeriksaan_fisik"` - RiwayatPasien string `json:"riwayat_pasien" gorm:"column:riwayat_pasien"` - TindakanMedis string `json:"tindakan_medis" gorm:"column:tindakan_medis"` + Icdcm *string `json:"icdcm" gorm:"column:icdcm"` + Icd9 *string `json:"icd_9" gorm:"column:icd_9"` + Klb *uint `json:"klb" gorm:"column:klb"` + Bedah *uint `json:"bedah" gorm:"column:bedah"` + Jenis *uint `json:"jenis" gorm:"column:jenis"` + Perawat *string `json:"perawat" gorm:"column:perawat"` + Status *string `json:"status" gorm:"column:status"` + PemeriksaanFisik *string `json:"pemeriksaan_fisik" gorm:"column:pemeriksaan_fisik"` + RiwayatPasien *string `json:"riwayat_pasien" gorm:"column:riwayat_pasien"` + TindakanMedis *string `json:"tindakan_medis" gorm:"column:tindakan_medis"` Rajal uint `json:"rajal" gorm:"column:rajal"` - UserBatal string `json:"user_batal" gorm:"column:user_batal"` + UserBatal *string `json:"user_batal" gorm:"column:user_batal"` TglBatal *time.Time `json:"tgl_batal" gorm:"column:tgl_batal"` SudahVaksin string `json:"sudah_vaksin" gorm:"column:sudah_vaksin"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` @@ -41,7 +41,7 @@ type TDiagnosaDanTerapi struct { Pernapasan string `json:"pernapasan" gorm:"column:pernapasan"` Suhu string `json:"suhu" gorm:"column:suhu"` Sp02 string `json:"sp02" gorm:"column:sp02"` - TujuanPerawatan string `json:"tujuan_perawatan" gorm:"column:tujuan_perawatan"` + TujuanPerawatan *string `json:"tujuan_perawatan" gorm:"column:tujuan_perawatan"` TargetCapaian string `json:"target_capaian" gorm:"column:target_capaian"` } diff --git a/internal/domain/simgos-entities/t-icd-cm/entity.go b/internal/domain/simgos-entities/t-icd-cm/entity.go index 198b29ea..6ea7f935 100644 --- a/internal/domain/simgos-entities/t-icd-cm/entity.go +++ b/internal/domain/simgos-entities/t-icd-cm/entity.go @@ -7,15 +7,15 @@ type TIcdCm struct { Nomr string `json:"nomr" gorm:"column:nomr"` Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"` Kddokter uint `json:"kddokter" gorm:"column:kddokter"` - Icd string `json:"icd" gorm:"column:icd"` - IcdVerified string `json:"icd_verified" gorm:"column:icd_verified"` + Icd *string `json:"icd" gorm:"column:icd"` + IcdVerified *string `json:"icd_verified" gorm:"column:icd_verified"` StatusRajal uint16 `json:"status_rajal" gorm:"column:status_rajal"` Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"` - StatusVerif uint16 `json:"status_verif" gorm:"column:status_verif"` - IcdVerifiedOrder uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"` - IcdVerifBy string `json:"icd_verif_by" gorm:"column:icd_verif_by"` + StatusVerif *uint16 `json:"status_verif" gorm:"column:status_verif"` + IcdVerifiedOrder *uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"` + IcdVerifBy *string `json:"icd_verif_by" gorm:"column:icd_verif_by"` IcdVerifDate *time.Time `json:"icd_verif_date" gorm:"column:icd_verif_date"` - IcdActive uint16 `json:"icd_active" gorm:"column:icd_active"` + IcdActive *uint16 `json:"icd_active" gorm:"column:icd_active"` } func (TIcdCm) TableName() string { diff --git a/internal/domain/simgos-entities/t-icd/entity.go b/internal/domain/simgos-entities/t-icd/entity.go index f2191ecc..73ee49e1 100644 --- a/internal/domain/simgos-entities/t-icd/entity.go +++ b/internal/domain/simgos-entities/t-icd/entity.go @@ -8,15 +8,15 @@ type TIcd struct { Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"` Kddokter uint `json:"kddokter" gorm:"column:kddokter"` Icd string `json:"icd" gorm:"column:icd"` - IcdVerified string `json:"icd_verified" gorm:"column:icd_verified"` + IcdVerified *string `json:"icd_verified" gorm:"column:icd_verified"` StatusRajal uint16 `json:"status_rajal" gorm:"column:status_rajal"` Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"` - StatusVerif uint16 `json:"status_verif" gorm:"column:status_verif"` - IcdVerifiedOrder uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"` - IcdVerifBy string `json:"icd_verif_by" gorm:"column:icd_verif_by"` + StatusVerif *uint16 `json:"status_verif" gorm:"column:status_verif"` + IcdVerifiedOrder *uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"` + IcdVerifBy *string `json:"icd_verif_by" gorm:"column:icd_verif_by"` IcdVerifDate *time.Time `json:"icd_verif_date" gorm:"column:icd_verif_date"` - IcdActive uint16 `json:"icd_active" gorm:"column:icd_active"` - StSebabMati uint16 `json:"st_sebab_mati" gorm:"column:st_sebab_mati"` + IcdActive *uint16 `json:"icd_active" gorm:"column:icd_active"` + StSebabMati *uint16 `json:"st_sebab_mati" gorm:"column:st_sebab_mati"` } func (TIcd) TableName() string { diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index 49f37ba7..ebf1c7d8 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -51,7 +51,7 @@ func Create(input e.CreateDto) (*d.Data, error) { // get detail for sync soapiData, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, - Includes: "Encounter,Employee"}, &event, tx) + Includes: "Encounter,Employee.User"}, &event, tx) if err != nil { return err } diff --git a/internal/use-case/simgos-sync-use-case/new/soapi/helper.go b/internal/use-case/simgos-sync-use-case/new/soapi/helper.go index 65213761..b9d761a1 100644 --- a/internal/use-case/simgos-sync-use-case/new/soapi/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/soapi/helper.go @@ -66,16 +66,16 @@ func setEarlyMedicTDT(input es.Soapi, data *etdt.TDiagnosaDanTerapi) { data.TinggiBadan = float64(value.Height) data.BeratBadan = float64(value.Weight) - data.Diagnosa = value.EarlyMedicDiagnose - data.Terapi = value.Therapy - data.Anamnesa = value.PrimaryComplain + data.Diagnosa = &value.EarlyMedicDiagnose + data.Terapi = &value.Therapy + data.Anamnesa = &value.PrimaryComplain // TODO : status, tindakan_mdeis (?) data.KunjunganBl = uint(value.EncounterStatus) data.KasusBl = uint(value.CaseStatus) - data.PemeriksaanFisik = value.PhysicalExamination - data.RiwayatPasien = value.CurrentDiseaseHistory + data.PemeriksaanFisik = &value.PhysicalExamination + data.RiwayatPasien = &value.CurrentDiseaseHistory if value.Vaccinated { data.SudahVaksin = "YA" @@ -93,7 +93,8 @@ func setEarlyMedicTDT(input es.Soapi, data *etdt.TDiagnosaDanTerapi) { for _, v := range o { expectedOutput = append(expectedOutput, v.Name) } - jsonData, _ := json.MarshalIndent(value.ExpectedOutcome, "", " ") + + jsonData, _ := json.Marshal(expectedOutput) data.TargetCapaian = string(jsonData) } return @@ -155,7 +156,7 @@ func setDataIcdCm(input es.Soapi, enc *etp.TPendaftaran) (data []eicdcm.TIcdCm) Nomr: enc.Nomr, Idxdaftar: enc.Idxdaftar, Kddokter: enc.Kddokter, - Icd: v.Code, + Icd: &v.Code, StatusRajal: ambulatory, Tanggal: visitDate, })