diff --git a/assets/docs/screening-form-a.html b/assets/docs/screening-form-a.html new file mode 100644 index 00000000..768eb183 --- /dev/null +++ b/assets/docs/screening-form-a.html @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Tanggal Terbit + : {{ .Repalcable }}
+ No. RM + : {{ .Repalcable }}
+ Nama + : {{ .Repalcable }}
+ Tanggal Lahir + : {{ .Repalcable }}
+ +
+

+ FORM A +

+ +
+

Kajian Awal Medis:

+ + + + + + + +
+ ☑ Kasus Dengan Penyakit Kronis, Katastropik (memerlukan Pembiayaan Tinggi), Terminal +
+ ▢ Status Fungsional Rendah, Kebutuhan Bantuan ADL(Activity Daily Living) Yang Tinggi +
+
+ +
+

ASSESMEN:

+ + +
+
+ +
+

IDENTIFIKASI MASALAH:

+ + +
+
+ +
+

PERENCANAAN:

+ + +
+
+ + + + + + + + + + +
+ 2025-10-08 16:06:22 +
+ GATOT SUBROTO,AMd.Kep +
+ +
+ + + \ No newline at end of file diff --git a/assets/docs/screening-form-b.html b/assets/docs/screening-form-b.html new file mode 100644 index 00000000..1ae8a07c --- /dev/null +++ b/assets/docs/screening-form-b.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Tanggal Terbit + : {{ .Repalcable }}
+ No. RM + : {{ .Repalcable }}
+ Nama + : {{ .Repalcable }}
+ Tanggal Lahir + : {{ .Repalcable }}
+ +
+

+ FORM B +

+ + + + + + + + + + + + + + +
+ NO + + Tanggal/jam + + Implementasi, Monitoring, Fasilitasi, koordinasi, komunikasi dan kolaborasi, advokasi, hasil pelayanan, + Terminasi + + MPP +
+ 1 + + 2025-10-08 16:08:18 + +
    +
  • Implementasi: Pemantauan harian terhadap penggunaan alat medis (oksigen dan alat bantu + jalan) serta kepatuhan terapi.
  • +
  • Monitoring: Observasi respon pasien terhadap terapi dan edukasi keluarga untuk perawatan + mandiri di rumah.
  • +
  • Fasilitasi: Menyediakan alat bantu sesuai kebutuhan dan menghubungkan pasien dengan + layanan rehabilitasi medik.
  • +
  • Koordinasi: Melibatkan dokter penanggung jawab, perawat, dan keluarga dalam penyusunan + rencana tindak lanjut.
  • +
  • Komunikasi dan Kolaborasi: Diskusi rutin antar profesi untuk evaluasi perkembangan + pasien.
  • +
  • Advokasi: Memberikan dukungan informasi dan hak pasien terkait rencana pulang dan + kesinambungan terapi.
  • +
  • Hasil Pelayanan: Pasien menunjukkan perbaikan fungsi mobilitas, tingkat kepatuhan terapi + meningkat.
  • +
+
+ GATOT SUBROTO,AMd.Kep +
+ +
+ + + \ No newline at end of file diff --git a/internal/domain/main-entities/screening/dto.go b/internal/domain/main-entities/screening/dto.go index 5dfed2c7..cdcc96dc 100644 --- a/internal/domain/main-entities/screening/dto.go +++ b/internal/domain/main-entities/screening/dto.go @@ -84,3 +84,39 @@ func ToResponseList(data []Screening) []ResponseDto { } return resp } + +type FormA struct { + AgeAtRisk bool `json:"ageAtRisk"` // Usia Dengan Risiko + LowCognitiveFunction bool `json:"lowCognitiveFunction"` // Pasien Dengan Fungsi Kognitif Rendah + HighRiskPatient bool `json:"highRiskPatient"` // Pasien Dengan Risiko Tinggi + HighComplaintPotential bool `json:"highComplaintPotential"` // Potensi Komplain Tinggi (Medik dan Non Medik) + ChronicOrCatastrophicOrTerminal bool `json:"chronicOrCatastrophicOrTerminal"` // Kasus Dengan Penyakit Kronis, Katastropik, Terminal + LowFunctionalStatus bool `json:"lowFunctionalStatus"` // Status Fungsional Rendah, Kebutuhan Bantuan ADL Tinggi + HistoryOfMedicalDeviceUse bool `json:"historyOfMedicalDeviceUse"` // Pasien Dengan Riwayat Penggunaan Peralatan Medis Masa Lalu + MentalOrSocialIssues bool `json:"mentalOrSocialIssues"` // Riwayat Gangguan Mental, Bunuh Diri, Krisis Keluarga, Isu Sosial + FrequentERVisitsOrReadmission bool `json:"frequentERVisitsOrReadmission"` // Sering Masuk IGD, Readmisi RS + HighCareCostEstimate bool `json:"highCareCostEstimate"` // Perkiraan Asuhan Dengan Biaya Tinggi + ComplexFinancingSystem bool `json:"complexFinancingSystem"` // Kemungkinan Sistem Pembiayaan Yang Kompleks + AboveAverageLengthOfStay bool `json:"aboveAverageLengthOfStay"` // Kasus Yang Melebihi Rata-Rata Lama Dirawat + ImportantOrHighRiskDischargePlanning bool `json:"importantOrHighRiskDischargePlanning"` // Rencana Pemulangan Penting / Kontinuitas Pelayanan + Stagnation bool `json:"stagnation"` // Stagnasi +} + +type ProblemIdentification struct { + CareNotFollowingGuidelines bool `json:"careNotFollowingGuidelines"` // Tingkat Asuhan Tidak Sesuai Panduan/ Norma + OverUtilization bool `json:"overUtilization"` // Over Utilization Pelayanan + UnderUtilization bool `json:"underUtilization"` // Under Utilization Pelayanan + PatientNonCompliance bool `json:"patientNonCompliance"` // Ketidakpatuhan Pasien + InadequateEducation bool `json:"inadequateEducation"` // Edukasi Kurang Memadai + LackOfFamilySupport bool `json:"lackOfFamilySupport"` // Kurang Dukungan Keluarga + DecreasedDetermination bool `json:"decreasedDetermination"` // Penurunan Determinasi Ketika Komplikasi Meningkat + FinancialDifficultyDuringComplications bool `json:"financialDifficultyDuringComplications"` // Kendala Keuangan Ketika Komplikasi Meningkat + DischargeCriteriaNotMetOrDelayed bool `json:"dischargeCriteriaNotMetOrDelayed"` // Pemulangan/ Rujukan Belum Memenuhi Kriteria/ Ditunda +} + +type AssessmentForm struct { + Screening Screening `json:"screening"` + AssessmentDetail string `json:"assessmentDetail"` // Masukkan detail assesmen + ProblemIdentification ProblemIdentification `json:"problemIdentification"` + PlanningDetail string `json:"planningDetail"` // Masukkan detail perencanaan +} diff --git a/internal/domain/main-entities/screening/entity.go b/internal/domain/main-entities/screening/entity.go index a6284c16..fa650165 100644 --- a/internal/domain/main-entities/screening/entity.go +++ b/internal/domain/main-entities/screening/entity.go @@ -18,3 +18,5 @@ type Screening struct { Value *string `json:"value"` FileUrl *string `json:"fileUrl" gorm:"size:1024"` } + +// func (d Screening) UnMarshal(data []byte) (error {} diff --git a/internal/interface/main-handler/screening/handler.go b/internal/interface/main-handler/screening/handler.go index 28ca7027..29ea5c73 100644 --- a/internal/interface/main-handler/screening/handler.go +++ b/internal/interface/main-handler/screening/handler.go @@ -4,7 +4,7 @@ import ( "net/http" rw "github.com/karincake/risoles" - sf "github.com/karincake/semprit" + // sf "github.com/karincake/semprit" // ua "github.com/karincake/tumpeng/auth/svc" @@ -34,47 +34,47 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { rw.DataResponse(w, res, err) } -func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { - dto := e.ReadListDto{} - sf.UrlQueryParam(&dto, *r.URL) - res, err := u.ReadList(dto) - rw.DataResponse(w, res, err) -} +// func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { +// dto := e.ReadListDto{} +// sf.UrlQueryParam(&dto, *r.URL) +// res, err := u.ReadList(dto) +// rw.DataResponse(w, res, err) +// } -func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { - return - } - dto := e.ReadDetailDto{} - dto.Id = uint16(id) - res, err := u.ReadDetail(dto) - rw.DataResponse(w, res, err) -} +// func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { +// id := rw.ValidateInt(w, "id", r.PathValue("id")) +// if id <= 0 { +// return +// } +// dto := e.ReadDetailDto{} +// dto.Id = uint16(id) +// res, err := u.ReadDetail(dto) +// rw.DataResponse(w, res, err) +// } -func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { - return - } +// func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { +// id := rw.ValidateInt(w, "id", r.PathValue("id")) +// if id <= 0 { +// return +// } - dto := e.UpdateDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } - dto.Id = uint16(id) - res, err := u.Update(dto) - rw.DataResponse(w, res, err) -} +// dto := e.UpdateDto{} +// if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { +// return +// } +// dto.Id = uint16(id) +// res, err := u.Update(dto) +// rw.DataResponse(w, res, err) +// } -func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { - return - } +// func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { +// id := rw.ValidateInt(w, "id", r.PathValue("id")) +// if id <= 0 { +// return +// } - dto := e.DeleteDto{} - dto.Id = uint16(id) - res, err := u.Delete(dto) - rw.DataResponse(w, res, err) -} +// dto := e.DeleteDto{} +// dto.Id = uint16(id) +// res, err := u.Delete(dto) +// rw.DataResponse(w, res, err) +// } diff --git a/internal/lib/auth/tycovar.go b/internal/lib/auth/tycovar.go index 117d0c73..c673eb04 100644 --- a/internal/lib/auth/tycovar.go +++ b/internal/lib/auth/tycovar.go @@ -65,6 +65,13 @@ func (a AuthInfo) IsPharmacist() bool { return *a.Employee_Position_Code == string(ero.EPCPha) } +func (a AuthInfo) IsScreener() bool { // MPP, petugas skrining + if a.Employee_Position_Code == nil { + return false + } + return *a.Employee_Position_Code == string(ero.EPCScr) +} + // func (a AuthInfo) IsPayment() bool { // if a.Employee_Position_Code == nil { // return false diff --git a/internal/use-case/main-use-case/screening/case.go b/internal/use-case/main-use-case/screening/case.go index 84ae4727..f6673450 100644 --- a/internal/use-case/main-use-case/screening/case.go +++ b/internal/use-case/main-use-case/screening/case.go @@ -38,7 +38,11 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } - if !input.AuthInfo.IsDoctor() && !input.AuthInfo.IsNurse() { + if !pu.Contains([]erc.ScreeningFormTypeCode{erc.SFTCB, erc.SFTCA}, input.Type) { + return errors.New("invalid screening form type") + } + + if !input.AuthInfo.IsScreener() { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "auth-forbidden", @@ -55,12 +59,21 @@ func Create(input e.CreateDto) (*d.Data, error) { input.Employee_Id = nil } - if input.Type == erc.SFTCB { + switch input.Type { + case erc.SFTCA: s, _, err := ReadListData(e.ReadListDto{FilterDto: e.FilterDto{Type: erc.SFTCA}}, &event, tx) if err != nil { return err } - if len(s) != 0 { + if len(s) > 0 { + return errors.New("screening form type A is already created for this encounter") + } + case erc.SFTCB: + s, _, err := ReadListData(e.ReadListDto{FilterDto: e.FilterDto{Type: erc.SFTCA}}, &event, tx) + if err != nil { + return err + } + if len(s) < 1 { return errors.New("screening form type A is not created yet, please create it first") } } diff --git a/internal/use-case/main-use-case/screening/helper.go b/internal/use-case/main-use-case/screening/helper.go index 5174d753..94692281 100644 --- a/internal/use-case/main-use-case/screening/helper.go +++ b/internal/use-case/main-use-case/screening/helper.go @@ -6,12 +6,14 @@ package screening import ( e "simrs-vx/internal/domain/main-entities/screening" + erc "simrs-vx/internal/domain/references/common" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Screening) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT + data.Status = erc.DVCValidated } else { inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto