318 lines
7.2 KiB
Go
318 lines
7.2 KiB
Go
/*
|
|
DESCRIPTION:
|
|
Any functions that are used internally by the use-case
|
|
*/
|
|
package patient
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
erc "simrs-vx/internal/domain/references/common"
|
|
erp "simrs-vx/internal/domain/references/person"
|
|
"strconv"
|
|
|
|
e "simrs-vx/internal/domain/main-entities/patient"
|
|
ep "simrs-vx/internal/domain/main-entities/person"
|
|
epa "simrs-vx/internal/domain/main-entities/person-address"
|
|
epc "simrs-vx/internal/domain/main-entities/person-contact"
|
|
epr "simrs-vx/internal/domain/main-entities/person-relative"
|
|
esimgos "simrs-vx/internal/domain/simgos-entities/patient"
|
|
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
|
esync "simrs-vx/internal/domain/sync-entities/patient"
|
|
|
|
dg "github.com/karincake/apem/db-gorm-pg"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
func setDataSimgos(input *e.Patient) (data esimgos.MPasien) {
|
|
if p := input.Person; p != nil {
|
|
mapPerson(p, &data)
|
|
}
|
|
|
|
if input.Person != nil && input.Person.Addresses != nil {
|
|
mapAddress(input.Person.Addresses, &data)
|
|
}
|
|
|
|
if input.Person != nil && input.Person.Contacts != nil {
|
|
mapContact(input.Person.Contacts, &data)
|
|
}
|
|
|
|
if input.Person != nil && input.Person.Relatives != nil {
|
|
mapRelative(input.Person.Relatives, &data)
|
|
}
|
|
|
|
data.Nip = input.RegisteredBy_User_Name
|
|
data.Tgldaftar = input.RegisteredAt
|
|
data.Nomr = *input.Number
|
|
|
|
return
|
|
}
|
|
|
|
func generateNomrPatient() (string, error) {
|
|
const prefix = "12" // fixed starting prefix (same as $awal_rm) in simgos
|
|
const maxSuffix = 999999
|
|
|
|
type Row struct {
|
|
Nomr string `gorm:"column:nomr"`
|
|
}
|
|
|
|
var r Row
|
|
|
|
// Lock rows for this prefix → prevents race condition
|
|
if err := dg.IS["simrs"].
|
|
Table("m_pasien").
|
|
Select("nomr").
|
|
Where("nomr LIKE ?", prefix+"%").
|
|
Order("nomr DESC").
|
|
Clauses(clause.Locking{Strength: "UPDATE"}).
|
|
Limit(1).
|
|
Scan(&r).Error; err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// No existing NOMR → start fresh
|
|
if r.Nomr == "" {
|
|
return prefix + "000001", nil
|
|
}
|
|
|
|
suffix := r.Nomr[len(prefix):] // extract numeric part
|
|
num, _ := strconv.Atoi(suffix)
|
|
|
|
// 3. If suffix reaches 999999 → increment the prefix
|
|
if num == maxSuffix {
|
|
p, _ := strconv.Atoi(prefix)
|
|
p++
|
|
return fmt.Sprintf("%d000001", p), nil
|
|
}
|
|
|
|
// 4. Normal increment
|
|
return prefix + fmt.Sprintf("%06d", num+1), nil
|
|
}
|
|
|
|
func mapPerson(p *ep.Person, data *esimgos.MPasien) {
|
|
if p.FrontTitle != nil {
|
|
data.Title = *p.FrontTitle
|
|
}
|
|
|
|
if p.BirthRegency != nil {
|
|
data.Tempat = p.BirthRegency.Name
|
|
}
|
|
|
|
if p.BirthDate != nil {
|
|
data.Tgllahir = p.BirthDate
|
|
}
|
|
|
|
if p.Gender_Code != nil {
|
|
if *p.Gender_Code == erp.GCMale {
|
|
data.Jeniskelamin = "L"
|
|
} else if *p.Gender_Code == erp.GCFemale {
|
|
data.Jeniskelamin = "P"
|
|
}
|
|
}
|
|
|
|
data.Nama = p.Name
|
|
data.Noktp = *p.ResidentIdentityNumber
|
|
data.NoktpBaru = *p.ResidentIdentityNumber
|
|
data.Pekerjaan = *p.Ocupation_Name
|
|
|
|
data.Status, data.TxtStatus = setMaritalStatus(p.MaritalStatus_Code)
|
|
data.Agama, data.TxtAgama = setReligion(p.Religion_Code)
|
|
data.Pendidikan, data.TxtPendidikan = setEducation(p.Education_Code)
|
|
|
|
if c := p.VclaimMember; c != nil && c.CardNumber != nil {
|
|
data.NoKartu = *c.CardNumber
|
|
}
|
|
|
|
if l := p.Language; l != nil {
|
|
data.Bahasa = l.Name
|
|
}
|
|
|
|
if p.CommunicationIssueStatus {
|
|
data.HambatanKomunikasi = "Y"
|
|
} else {
|
|
data.HambatanKomunikasi = "T"
|
|
}
|
|
|
|
if p.Nationality != nil {
|
|
data.Kebangsaan = *p.Nationality
|
|
}
|
|
|
|
if p.Ethnic != nil {
|
|
data.Suku = p.Ethnic.Name
|
|
}
|
|
}
|
|
|
|
func setMaritalStatus(code *erp.MaritalStatusCode) (uint, string) {
|
|
if code != nil {
|
|
switch *code {
|
|
case erp.MaritalStatusSingle:
|
|
return 1, "Belum Menikah"
|
|
case erp.MaritalStatusMarried:
|
|
return 2, "Menikah"
|
|
case erp.MaritalStatusDivorced:
|
|
return 4, "Cerai"
|
|
case erp.MaritalStatusWidowed:
|
|
return 3, "Janda/Duda"
|
|
default:
|
|
return 0, "Tidak Diketahui"
|
|
}
|
|
} else {
|
|
return 0, "Tidak Diketahui"
|
|
}
|
|
}
|
|
|
|
func setReligion(code *erp.ReligionCode) (uint, string) {
|
|
if code != nil {
|
|
switch *code {
|
|
case erp.RCIslam:
|
|
return 1, "Islam"
|
|
case erp.RCProtestan:
|
|
return 2, "Kristen Protestan"
|
|
case erp.RCKatolik:
|
|
return 3, "Katholik"
|
|
case erp.RCHindu:
|
|
return 4, "Hindu"
|
|
case erp.RCBudha:
|
|
return 5, "Budha"
|
|
case erp.RCKonghucu:
|
|
return 6, "Konghucu"
|
|
default:
|
|
return 9, "Lainnya"
|
|
}
|
|
} else {
|
|
return 0, "Tidak Diketahui"
|
|
}
|
|
}
|
|
|
|
func setEducation(code *erp.EducationCode) (uint, string) {
|
|
if code != nil {
|
|
switch *code {
|
|
case erp.ECTS:
|
|
return 0, "Tidak Sekolah"
|
|
case erp.ECSD:
|
|
return 1, string(erp.ECSD)
|
|
case erp.ECSLTP:
|
|
return 2, string(erp.ECSLTP)
|
|
case erp.ECSLTA:
|
|
return 3, string(erp.ECSLTA)
|
|
case erp.ECD1, erp.ECD2, erp.ECD3, erp.ECD4:
|
|
return 4, "D3/Akademik"
|
|
case erp.ECS1, erp.ECS2, erp.ECS3:
|
|
return 5, "Universitas"
|
|
case erp.ECOther:
|
|
return 6, "Lainnya"
|
|
default:
|
|
return 7, "Tidak Diketahui"
|
|
}
|
|
} else {
|
|
return 7, "Tidak Diketahui"
|
|
}
|
|
}
|
|
|
|
func mapAddress(addresses *[]epa.PersonAddress, data *esimgos.MPasien) {
|
|
if addresses == nil || len(*addresses) == 0 {
|
|
return
|
|
}
|
|
|
|
a := (*addresses)[0]
|
|
data.Alamat = a.Address
|
|
data.AlamatKtp = a.Address
|
|
|
|
if v := a.Village; v != nil {
|
|
villageCode, _ := strconv.Atoi(v.Code)
|
|
data.Kelurahan = uint64(villageCode)
|
|
data.TxtKelurahan = v.Name
|
|
|
|
if d := v.District; d != nil {
|
|
districtCode, _ := strconv.Atoi(d.Code)
|
|
data.Kdkecamatan = uint(districtCode)
|
|
data.TxtKecamatan = d.Name
|
|
|
|
if r := d.Regency; r != nil {
|
|
regencyCode, _ := strconv.Atoi(r.Code)
|
|
data.Kota = uint(regencyCode)
|
|
data.TxtKota = r.Name
|
|
|
|
if p := r.Province; p != nil {
|
|
provinceCode, _ := strconv.Atoi(p.Code)
|
|
data.Kdprovinsi = uint(provinceCode)
|
|
data.TxtProvinsi = p.Name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func mapContact(contact *[]epc.PersonContact, data *esimgos.MPasien) {
|
|
if contact == nil || len(*contact) == 0 {
|
|
return
|
|
}
|
|
|
|
for _, c := range *contact {
|
|
if c.Type_Code == erp.CTPhone || c.Type_Code == erp.CTMPhone {
|
|
data.Notelp = c.Value
|
|
break
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
func mapRelative(relative *[]epr.PersonRelative, data *esimgos.MPasien) {
|
|
if relative == nil || len(*relative) == 0 {
|
|
return
|
|
}
|
|
|
|
r := (*relative)[0]
|
|
data.PenanggungjawabNama = *r.Name
|
|
|
|
switch r.Relationship_Code {
|
|
case erp.RCMother, erp.RCFather:
|
|
data.PenanggungjawabHubungan = "ORANG TUA"
|
|
switch {
|
|
case r.Relationship_Code == erp.RCMother:
|
|
data.NamaIbu = *r.Name
|
|
eduCode, _ := setEducation(r.Education_Code)
|
|
data.PendidikanIbu = strconv.Itoa(int(eduCode))
|
|
case r.Relationship_Code == erp.RCFather:
|
|
data.NamaAyah = *r.Name
|
|
eduCode, _ := setEducation(r.Education_Code)
|
|
data.PendidikanAyah = strconv.Itoa(int(eduCode))
|
|
}
|
|
case erp.RCChild:
|
|
data.PenanggungjawabHubungan = "ANAK"
|
|
default:
|
|
data.PenanggungjawabHubungan = "LAINNYA"
|
|
}
|
|
|
|
data.PenanggungjawabAlamat = *r.Address
|
|
data.PenanggungjawabPhone = *r.PhoneNumber
|
|
}
|
|
|
|
func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.PatientSimxLog) {
|
|
// encode to JSON
|
|
jsonData, _ := json.MarshalIndent(input.Payload, "", " ")
|
|
jsonString := string(jsonData)
|
|
|
|
var status erc.ProcessStatusCode
|
|
if input.IsSuccess {
|
|
status = erc.PSCSuccess
|
|
} else {
|
|
status = erc.PSCFailed
|
|
if input.ErrMessage != nil {
|
|
data.ErrMessage = input.ErrMessage
|
|
}
|
|
}
|
|
|
|
data.Value = &jsonString
|
|
data.Date = &now
|
|
data.Status = status
|
|
|
|
return
|
|
}
|
|
|
|
func setDataSimxLink(simxId, simgosId uint) (data esync.PatientLink) {
|
|
data.Simx_Id = simxId
|
|
data.Simgos_Id = simgosId
|
|
return
|
|
}
|