diff --git a/cmd/main-migration/migrations/20251125125303.sql b/cmd/main-migration/migrations/20251125125303.sql new file mode 100644 index 00000000..56d16371 --- /dev/null +++ b/cmd/main-migration/migrations/20251125125303.sql @@ -0,0 +1,2 @@ +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" ADD COLUMN "Responsible_Nurse_Code" character varying(20) NULL, ADD CONSTRAINT "fk_Encounter_Responsible_Nurse" FOREIGN KEY ("Responsible_Nurse_Code") REFERENCES "public"."Nurse" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 707ee3ca..719dffff 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:87NyL1nIRuVvOiLbfdC1+PF+v2R/joAnBYyh2CrlGdU= +h1:u2pc+PayIbiG5HRFUzun7cApIwlt9SMNTl74DtPz1xg= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -128,4 +128,5 @@ h1:87NyL1nIRuVvOiLbfdC1+PF+v2R/joAnBYyh2CrlGdU= 20251120005512.sql h1:Ek6qpacAI/qVuTYxKno+uJyzn7s5z9pf3t7VA8gTzm4= 20251120074415.sql h1:NNUeJVA03EeBHJhHqPXEZoDv/PnC6yK1/cRhmukyaJo= 20251121033803.sql h1:/vfvFX/3pzSCIHnSbMUT9EMBDykOpVkvyfeTEle9Vas= -20251124071457.sql h1:HBaNJQIzUe6wK8CgBxamuKor7ZiAASzgkkXzL6kWsjY= +20251124071457.sql h1:qg2dhCL9YwD13xnfJ175lW/p6MGfzFKaBqd908FByRc= +20251125125303.sql h1:P94UsZOeo7b0r2yLoSGBfj0+PcMTf4Y10lF+Rl9FxAE= diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index d4eeda3f..273cdf31 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -1,14 +1,6 @@ package encounter import ( - eam "simrs-vx/internal/domain/main-entities/ambulatory" - edc "simrs-vx/internal/domain/main-entities/death-cause" - eem "simrs-vx/internal/domain/main-entities/emergency" - eed "simrs-vx/internal/domain/main-entities/encounter-document" - eip "simrs-vx/internal/domain/main-entities/inpatient" - eir "simrs-vx/internal/domain/main-entities/internal-reference" - er "simrs-vx/internal/domain/main-entities/rehab/base" - // std "time" @@ -24,10 +16,18 @@ import ( // internal - domain - main-entities evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + eam "simrs-vx/internal/domain/main-entities/ambulatory" ea "simrs-vx/internal/domain/main-entities/appointment" + edc "simrs-vx/internal/domain/main-entities/death-cause" ed "simrs-vx/internal/domain/main-entities/doctor" + eem "simrs-vx/internal/domain/main-entities/emergency" ee "simrs-vx/internal/domain/main-entities/employee" + eed "simrs-vx/internal/domain/main-entities/encounter-document" + eip "simrs-vx/internal/domain/main-entities/inpatient" + eir "simrs-vx/internal/domain/main-entities/internal-reference" + en "simrs-vx/internal/domain/main-entities/nurse" ep "simrs-vx/internal/domain/main-entities/patient" + er "simrs-vx/internal/domain/main-entities/rehab/base" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" @@ -147,7 +147,7 @@ type DischargeDto struct { type CheckinDto struct { Id uint `json:"id"` Responsible_Doctor_Code *string `json:"responsible_doctor_code"` - Adm_Employee_Id *uint `json:"adm_employee_id"` + Responsible_Nurse_Code *string `json:"responsible_nurse_code"` StartedAt *time.Time `json:"startedAt"` FinishedAt *time.Time `json:"finishedAt"` @@ -211,6 +211,8 @@ type ResponseDto struct { Rehab *er.Basic `json:"rehab,omitempty"` RehabChildren *[]er.Basic `json:"rehabChildren,omitempty"` EncounterDocuments *[]eed.EncounterDocument `json:"encounterDocuments,omitempty"` + Responsible_Nurse_Code *string `json:"responsible_nurse_code"` + Responsible_Nurse *en.Nurse `json:"responsible_nurse,omitempty"` } func (d Encounter) ToResponse() ResponseDto { @@ -258,6 +260,8 @@ func (d Encounter) ToResponse() ResponseDto { Rehab: d.Rehab, RehabChildren: d.RehabChildren, EncounterDocuments: d.EncounterDocuments, + Responsible_Nurse_Code: d.Responsible_Nurse_Code, + Responsible_Nurse: d.Responsible_Nurse, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 0cbf5da1..d1458f7c 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -20,6 +20,7 @@ import ( eip "simrs-vx/internal/domain/main-entities/inpatient" ei "simrs-vx/internal/domain/main-entities/insurance-company" eir "simrs-vx/internal/domain/main-entities/internal-reference" + en "simrs-vx/internal/domain/main-entities/nurse" ep "simrs-vx/internal/domain/main-entities/patient" er "simrs-vx/internal/domain/main-entities/rehab/base" es "simrs-vx/internal/domain/main-entities/specialist" @@ -77,6 +78,8 @@ type Encounter struct { EncounterDocuments *[]eed.EncounterDocument `json:"encounterDocuments,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` GeneralConsents *[]egc.GeneralConsent `json:"generalConsents,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` VclaimReference *evr.VclaimReference `json:"vclaimReference,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Responsible_Nurse_Code *string `json:"responsible_nurse_code"` + Responsible_Nurse *en.Nurse `json:"responsible_nurse,omitempty" gorm:"foreignKey:Responsible_Nurse_Code;references:Code"` } func (d Encounter) IsDone() bool { diff --git a/internal/interface/simgos-sync-handler/new/encounter/handler.go b/internal/interface/simgos-sync-handler/new/encounter/handler.go index bec44cd4..be7a6e1e 100644 --- a/internal/interface/simgos-sync-handler/new/encounter/handler.go +++ b/internal/interface/simgos-sync-handler/new/encounter/handler.go @@ -77,12 +77,12 @@ func (obj myBase) Checkout(w http.ResponseWriter, r *http.Request) { rw.DataResponse(w, res, err) } -func (obj myBase) Cancel(w http.ResponseWriter, r *http.Request) { +func (obj myBase) UpdateStatus(w http.ResponseWriter, r *http.Request) { dto := e.Encounter{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := u.Cancel(dto) + res, err := u.UpdateStatus(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/simgos-sync-handler/simgos-sync-handler.go b/internal/interface/simgos-sync-handler/simgos-sync-handler.go index ccfa6cda..5a1ffc8b 100644 --- a/internal/interface/simgos-sync-handler/simgos-sync-handler.go +++ b/internal/interface/simgos-sync-handler/simgos-sync-handler.go @@ -56,13 +56,13 @@ func SetRoutes() http.Handler { "POST /nomr": patient.O.GenerateNomr, }) hk.GroupRoutes(prefixnew+"/v1/encounter", r, hk.MapHandlerFunc{ - "POST /": encounter.O.Create, - "POST /log": encounter.O.CreateLog, - "PATCH /{id}": encounter.O.Update, - "DELETE /{id}": encounter.O.Delete, - "PATCH /{id}/checkin": encounter.O.Checkin, - "PATCH /{id}/checkout": encounter.O.Checkout, - "PATCH /{id}/cancel": encounter.O.Cancel, + "POST /": encounter.O.Create, + "POST /log": encounter.O.CreateLog, + "PATCH /{id}": encounter.O.Update, + "DELETE /{id}": encounter.O.Delete, + "PATCH /{id}/checkin": encounter.O.Checkin, + "PATCH /{id}/checkout": encounter.O.Checkout, + "PATCH /{id}/update-status": encounter.O.UpdateStatus, }) /******************** SvcToNew ******************/ diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 2a8ee1ba..2eac5083 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -19,7 +19,6 @@ import ( erg "simrs-vx/internal/domain/references/organization" ev "simrs-vx/internal/domain/bpjs-entities/vclaim-reference" - eaeh "simrs-vx/internal/domain/main-entities/adm-employee-hist" edc "simrs-vx/internal/domain/main-entities/death-cause" e "simrs-vx/internal/domain/main-entities/encounter" eir "simrs-vx/internal/domain/main-entities/internal-reference" @@ -28,7 +27,6 @@ import ( esync "simrs-vx/internal/domain/sync-entities/log" uv "simrs-vx/internal/use-case/bpjs-use-case/vclaim-reference" - uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist" udc "simrs-vx/internal/use-case/main-use-case/death-cause" uir "simrs-vx/internal/use-case/main-use-case/internal-reference" urdh "simrs-vx/internal/use-case/main-use-case/responsible-doctor-hist" @@ -126,14 +124,6 @@ func Create(input e.CreateDto) (*d.Data, error) { Number: &vr.NoSep}, &event, tx) } - // insert adm_employee_hist (employee with role reg for create) - if _, err = uaeh.CreateData(eaeh.CreateDto{ - Encounter_Id: &data.Id, - Employee_Id: data.Adm_Employee_Id, - StartedAt: &now}, &event, tx); err != nil { - return err - } - dataEncounter, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, Includes: "Adm_Employee.User,Patient.Person.Relatives," + @@ -430,7 +420,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { } func CheckOut(input e.DischargeDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Ambulatory,Rehab"} + rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Ambulatory,Rehab,InternalReferences"} var data *e.Encounter var err error @@ -467,7 +457,7 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { } if data.Ambulatory != nil && (data.Ambulatory.Class_Code == ere.ACCReg || data.Ambulatory.Class_Code == ere.ACCRehab) { - // validate if soapi exist + // Validate SOAPI completeness: abort checkout if any required SOAPI is missing. if err = getSoapiByTypeCode(data, &event, "check-out"); err != nil { return err } @@ -479,12 +469,13 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { } } } else { - // chemo TBC + // TODO: chemo TBC (to be confirm) if err := checkSoapiByDocExists(data.Id, &event, tx); err != nil { return err } } + // update encounter if err := updateDischargeData(input, data, &event, tx); err != nil { return err } @@ -499,16 +490,6 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { } } - // update finishedAt in latest responsible_doctor_hist - if err = updateLatestResponsibleDoctorHist(e.CheckinDto{Id: input.Id, FinishedAt: &now}, &event, tx); err != nil { - return err - } - - // update finishedAt in latest adm_employee_hist - if err = updateLatestAdmEmployeeHist(e.CheckinDto{Id: input.Id, FinishedAt: &now}, &event, tx); err != nil { - return err - } - // insert data death-cause if *input.Discharge_Method_Code == ere.DMCDeath { if _, err = udc.CreateData(edc.CreateDto{Encounter_Id: &input.Id, Value: input.DeathCause}, &event, tx); err != nil { @@ -516,6 +497,14 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { } } + // perform additional validation when discharge_method_code is "consul-poly" or "consul-executive" + if *data.Discharge_Method_Code == ere.DMCConsulPoly || *data.Discharge_Method_Code == ere.DMCConsulExecutive { + for _, v := range *data.InternalReferences { + + } + } + + // read newest data encounter for sync dataEncounter, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, Includes: "DeathCause"}, @@ -561,6 +550,14 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") + + // TODO: Only "supervisi pendaftaran" could cancel encounter + roleAllowed := []string{string(erg.EPCReg), string(erg.EPCNur), string(erg.EPCDoc)} + err = validateAuth(input.AuthInfo, roleAllowed, "update-status-encounter", &event) + if err != nil { + return nil, err + } + mwRunner := newMiddlewareRunner(&event) err = dg.I.Transaction(func(tx *gorm.DB) error { @@ -582,34 +579,6 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { if input.StatusCode == erc.DSCCancel { // TODO: Prevent cancellation if the billing has been verified - // TODO: Only "supervisi pendaftaran" could cancel encounter - roleAllowedToCancel := []string{ - string(erg.EPCReg), - string(erg.EPCNur), - string(erg.EPCDoc), - } - - // check if user has employee position - if !input.AuthInfo.HasEmployeePosition() { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "auth-forbidden", - Detail: "user has no employee position", - Raw: errors.New("authentication failed"), - } - return pl.SetLogError(&event, input) - } - - if input.AuthInfo.Employee_Position_Code != nil && !pu.Contains(roleAllowedToCancel, *input.AuthInfo.Employee_Position_Code) { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "auth-forbidden", - Detail: "user position is not allowed, only user with registration, nurse, or doctor position is allowed to cancel encounter", - Raw: errors.New("authentication failed"), - } - return pl.SetLogError(&event, input) - } - // Prevent cancellation if soapi exist dataSoapi, _, err := us.ReadListData(es.ReadListDto{ FilterDto: es.FilterDto{Encounter_Id: &data.Id}}, &event, tx) @@ -632,7 +601,7 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { return err } - if input.StatusCode == erc.DSCCancel { + if input.StatusCode == erc.DSCProcess || input.StatusCode == erc.DSCCancel { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err := mwRunner.RunUpdateStatusMiddleware(updatestatusEncounter, data); err != nil { @@ -643,10 +612,12 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { return nil }) - if err != nil { + if err = runLogMiddleware(err, input, mwRunner); err != nil { return nil, err } + pl.SetLogInfo(&event, nil, "complete") + return &d.Data{ Meta: d.IS{ "source": source, @@ -676,10 +647,10 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { if err != nil { return nil, err } - input.Adm_Employee_Id = input.AuthInfo.Employee_Id + input.Responsible_Nurse_Code = input.AuthInfo.Nurse_Code // validate foreign key - if err := validateForeignKey(input); err != nil { + if err := validateForeignKey(input, &event); err != nil { return nil, err } @@ -706,7 +677,7 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - // validate if soapi exist + // prevent repeated check-in. If SOAPI already exists, block the check-in process. if data.Ambulatory != nil && (data.Ambulatory.Class_Code == ere.ACCReg || data.Ambulatory.Class_Code == ere.ACCRehab) { err = getSoapiByTypeCode(data, &event, "check-in") if err != nil { @@ -714,30 +685,6 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { } } - // Upsert responsible_doctor_hist if responsible_doctor_code has changed - if data.Responsible_Doctor_Code == nil || *input.Responsible_Doctor_Code != *data.Responsible_Doctor_Code { - // upsert responsibleDoctorHist - if err = upsertResponsibleDoctorHist(erdh.CreateDto{ - Encounter_Id: &data.Id, - Doctor_Code: input.Responsible_Doctor_Code, - StartedAt: input.StartedAt, - }, &event, tx); err != nil { - return err - } - } - - // Upsert adm_employee_hist if adm_employee_id has changed - if *input.Adm_Employee_Id != *data.Adm_Employee_Id { - // upsert admEmployeeHist - if err = upsertAdmEmployeeHist(eaeh.CreateDto{ - Encounter_Id: &data.Id, - Employee_Id: input.Adm_Employee_Id, - StartedAt: input.StartedAt, - }, &event, tx); err != nil { - return err - } - } - // update encounter data if err := updateCheckInData(input, data, &event, tx); err != nil { return err @@ -745,7 +692,7 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { dataEncounter, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, - Includes: "Adm_Employee.User"}, + Includes: "Responsible_Nurse.Employee.User"}, &event, tx) if err != nil { return err @@ -901,15 +848,15 @@ func ApproveSwitchUnit(input e.ApproveUnitDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - //if data.IsDone() { - // event.Status = "failed" - // event.ErrInfo = pl.ErrorInfo{ - // Code: "data-state-mismatch", - // Detail: "encounter is done", - // Raw: errors.New("encounter is done"), - // } - // return pl.SetLogError(&event, input) - //} + if data.IsDone() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "encounter is done", + Raw: errors.New("encounter is done"), + } + return pl.SetLogError(&event, input) + } // verify Soapi exist for current responsible doctor dataSoapi, err := getSoapiByResponsibleDoctor(*data, &event) diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 73b053e5..cdc07a8f 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -7,6 +7,7 @@ package encounter import ( "errors" "fmt" + un "simrs-vx/internal/use-case/main-use-case/nurse" "strings" "time" @@ -29,7 +30,6 @@ import ( edo "simrs-vx/internal/domain/main-entities/device-order" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/emergency" - eem "simrs-vx/internal/domain/main-entities/employee" e "simrs-vx/internal/domain/main-entities/encounter" ei "simrs-vx/internal/domain/main-entities/inpatient" emo "simrs-vx/internal/domain/main-entities/material-order" @@ -38,6 +38,7 @@ import ( emei "simrs-vx/internal/domain/main-entities/medication-item" emi "simrs-vx/internal/domain/main-entities/medicine-mix" emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" + en "simrs-vx/internal/domain/main-entities/nurse" ep "simrs-vx/internal/domain/main-entities/prescription" epi "simrs-vx/internal/domain/main-entities/prescription-item" er "simrs-vx/internal/domain/main-entities/rehab" @@ -51,12 +52,12 @@ import ( uc "simrs-vx/internal/use-case/main-use-case/chemo" ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/emergency" - uem "simrs-vx/internal/use-case/main-use-case/employee" ui "simrs-vx/internal/use-case/main-use-case/inpatient" um "simrs-vx/internal/use-case/main-use-case/medication" umei "simrs-vx/internal/use-case/main-use-case/medication-item" umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" + _ "simrs-vx/internal/use-case/main-use-case/nurse" up "simrs-vx/internal/use-case/main-use-case/prescription" upi "simrs-vx/internal/use-case/main-use-case/prescription-item" ur "simrs-vx/internal/use-case/main-use-case/rehab" @@ -122,10 +123,7 @@ func setDataUpdateStatus(src e.UpdateStatusDto, dst *e.Encounter) { } func setDataCheckIn(src e.CheckinDto, dst *e.Encounter) { - if src.Adm_Employee_Id != nil { - dst.Adm_Employee_Id = src.Adm_Employee_Id - } - + dst.Responsible_Nurse_Code = src.Responsible_Nurse_Code dst.Responsible_Doctor_Code = src.Responsible_Doctor_Code dst.StartedAt = src.StartedAt } @@ -905,17 +903,17 @@ func updateRehabStatus(input er.UpdateDto, event *pl.Event, dbx ...*gorm.DB) err return nil } -func validateForeignKey(input e.CheckinDto) error { +func validateForeignKey(input e.CheckinDto, event *pl.Event) error { // validate employee_Id - if input.Adm_Employee_Id != nil { - if _, err := uem.ReadDetail(eem.ReadDetailDto{Id: uint16(*input.Adm_Employee_Id)}); err != nil { + if input.Responsible_Nurse_Code != nil { + if _, err := un.ReadDetailData(en.ReadDetailDto{Code: input.Responsible_Nurse_Code}, event); err != nil { return err } } // validate doctor_Code if input.Responsible_Doctor_Code != nil { - if _, err := ud.ReadDetail(ed.ReadDetailDto{Code: input.Responsible_Doctor_Code}); err != nil { + if _, err := ud.ReadDetailData(ed.ReadDetailDto{Code: input.Responsible_Doctor_Code}, event); err != nil { return err } } diff --git a/internal/use-case/main-use-case/encounter/middleware.go b/internal/use-case/main-use-case/encounter/middleware.go index fb2ce0a0..fe941372 100644 --- a/internal/use-case/main-use-case/encounter/middleware.go +++ b/internal/use-case/main-use-case/encounter/middleware.go @@ -21,5 +21,5 @@ func init() { checkoutEncounter = checkoutMw{Name: "sync-checkout-encounter", Func: plugin.Checkout} updatestatusEncounter = append(updatestatusEncounter, - updateStatusMw{Name: "sync-update-status-encounter", Func: plugin.Cancel}) + updateStatusMw{Name: "sync-update-status-encounter", Func: plugin.UpdateStatus}) } diff --git a/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go b/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go index 617f2e93..7e779aec 100644 --- a/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go @@ -43,9 +43,9 @@ func Checkout(input *e.Encounter) error { return helper.DoJsonRequest(input, "PATCH", endpoint) } -func Cancel(input *e.Encounter) error { +func UpdateStatus(input *e.Encounter) error { prefixEndpoint := getPrefixEndpoint() - endpoint := fmt.Sprintf("%s/%v/cancel", prefixEndpoint, input.Id) + endpoint := fmt.Sprintf("%s/%v/update-status", prefixEndpoint, input.Id) return helper.DoJsonRequest(input, "PATCH", endpoint) } 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 f9f48c11..56edb70a 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 @@ -292,7 +292,7 @@ func CheckOut(input e.Encounter) (*d.Data, error) { }, nil } -func Cancel(input e.Encounter) (*d.Data, error) { +func UpdateStatus(input e.Encounter) (*d.Data, error) { event := pl.Event{ Feature: "Cancel", Source: source, diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/helper.go b/internal/use-case/simgos-sync-use-case/new/encounter/helper.go index fe1d5b42..aaef624d 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/helper.go @@ -114,16 +114,30 @@ func setDataTPendaftaran(input *e.Encounter, data *etp.TPendaftaran) { return } +func setDataUpdateStatus(input e.Encounter, data *etp.TPendaftaran) { + switch input.Status_Code { + case erc.DSCProcess: + data.Masukpoly = &now + } + + if input.Status_Code == erc.DSCCancel { + data.Status = 11 + } +} + func setDataCheckIn(input e.Encounter, data *etp.TPendaftaran) { // set kddokter kddokter, _ := strconv.Atoi(*input.Responsible_Doctor_Code) data.Kddokter = uint(kddokter) // set petugas_klinik - if data.PetugasKlinik != "" { - if a := input.Adm_Employee; a != nil { - if u := a.User; u != nil { - data.PetugasKlinik = u.Name + // only update once + if data.PetugasKlinik == "" { + if n := input.Responsible_Nurse; n != nil { + if emp := n.Employee; emp != nil { + if u := emp.User; u != nil { + data.PetugasKlinik = u.Name + } } } } @@ -132,6 +146,44 @@ func setDataCheckIn(input e.Encounter, data *etp.TPendaftaran) { return } +func setDataCheckOut(input e.Encounter, data *etp.TPendaftaran) { + data.Keluarpoly = input.FinishedAt + + // set status + setStatus(input.Discharge_Method_Code, data) + if data.Status == 8 || data.Status == 3 { + if dc := input.DeathCause; dc != nil { + + var dcSrc []DeathCauseSrc + _ = json.Unmarshal([]byte(*dc.Value), &dcSrc) + + for i, v := range dcSrc { + switch i { + case 0: + data.SebabMati1 = &v.Name + data.IcdMati1 = &v.Code + case 1: + data.SebabMati2 = &v.Name + data.IcdMati2 = &v.Code + case 2: + data.SebabMati3 = &v.Name + data.IcdMati3 = &v.Code + default: + break + } + } + } + death := uint(1) + data.StMeninggal = &death + data.DtMeninggal = data.Keluarpoly + } + + setPelayanan := uint(1) + data.StPelayanan = &setPelayanan + + return +} + func setDataRequestSwitchUnit(input e.Encounter, data *etp.TPendaftaran) (hist []etph.TPemeriksaanHist) { if enc := input.InternalReferences; enc != nil { for i, ref := range *enc { @@ -158,30 +210,6 @@ func setDataRequestSwitchUnit(input e.Encounter, data *etp.TPendaftaran) (hist [ return } -func setDataCheckOut(input e.Encounter, data *etp.TPendaftaran) { - data.Keluarpoly = input.Discharge_Date - - // set status - setStatus(input.Discharge_Method_Code, data) - if data.Status == 8 || data.Status == 3 { - if dc := input.DeathCause; dc != nil { - data.SebabMati1 = dc.Value - } - - } - - setPelayanan := uint(1) - data.StPelayanan = &setPelayanan - - return -} - -func setDataUpdateStatus(input e.Encounter, data *etp.TPendaftaran) { - if input.Status_Code == erc.DSCCancel { - data.Status = 11 - } -} - func setKdrujuk(input *ere.RefTypeCode, data *etp.TPendaftaran) { switch *input { case ere.RTCGov: diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/tycovar.go b/internal/use-case/simgos-sync-use-case/new/encounter/tycovar.go index 17890a1b..7d3d19db 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/tycovar.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/tycovar.go @@ -42,3 +42,10 @@ var updatePreMw []readDetailMw var updatePostMw []readDetailMw var deletePreMw []readDetailMw var deletePostMw []readDetailMw + +type DeathCauseSrc struct { + Id uint `json:"id"` + Code string `json:"code"` + Name string `json:"name"` + IndName string `json:"indName"` +}