feat (patient): now also create vclaim member + hit bpjs service

This commit is contained in:
dpurbosakti
2025-10-30 15:32:36 +07:00
parent ca29e4d7fd
commit 1b7c29dc11
12 changed files with 144 additions and 12 deletions

No files matched your search

@@ -4,8 +4,10 @@ import (
"errors"
"strconv"
evm "simrs-vx/internal/domain/bpjs-entities/vclaim-member"
e "simrs-vx/internal/domain/main-entities/patient"
uvm "simrs-vx/internal/use-case/bpjs-use-case/vclaim-member"
upe "simrs-vx/internal/use-case/main-use-case/person"
upa "simrs-vx/internal/use-case/main-use-case/person-address"
upc "simrs-vx/internal/use-case/main-use-case/person-contact"
@@ -49,6 +51,12 @@ func Create(input e.CreateDto) (*d.Data, error) {
input.Person_Id = person_id
}
if input.Person.VclaimMember_CardNumber != nil && input.Person.ResidentIdentityNumber != nil {
if err := uvm.CreateOrUpdateData(evm.CreateDto{CardNumber: input.Person.VclaimMember_CardNumber, Person_Id: input.Person_Id}, &event, tx); err != nil {
return err
}
}
for idx := range input.PersonAddresses {
input.PersonAddresses[idx].Person_Id = *input.Person_Id
}
@@ -12,6 +12,7 @@ import (
"time"
e "simrs-vx/internal/domain/main-entities/patient"
ibpjs "simrs-vx/internal/infra/bpjs"
pl "simrs-vx/pkg/logger"
pmh "simrs-vx/pkg/minio-helper"
@@ -135,3 +136,13 @@ func removeUploadedFile(bucket, fileUrl string, event *pl.Event) error {
pl.SetLogInfo(event, nil, "complete")
return nil
}
func endpointMapper(noBpjs string) string {
today := getTodayDate()
return fmt.Sprintf("%speserta/nokartu?noKartu=%s&tglpelayanan=%s", ibpjs.O.BaseUrl, noBpjs, today)
}
func getTodayDate() string {
return time.Now().Format("2006-01-02")
}
@@ -1,9 +1,65 @@
package patient
import (
"encoding/json"
"fmt"
"io"
"net/http"
e "simrs-vx/internal/domain/main-entities/patient"
"gorm.io/gorm"
)
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
func init() {
createPreMw = append(createPreMw,
createMw{Name: "check-vclaim-member", Func: checkVclaimMember},
)
}
func checkVclaimMember(input *e.CreateDto, data *e.Patient, tx *gorm.DB) error {
if input.Person.VclaimMember_CardNumber != nil && input.Person.ResidentIdentityNumber != nil {
return isVclaimMemberMatch(input)
}
return nil
}
func isVclaimMemberMatch(input *e.CreateDto) error {
endpoint := endpointMapper(*input.Person.VclaimMember_CardNumber)
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
var data BPJSResponse
if err := json.Unmarshal(body, &data); err != nil {
return fmt.Errorf("failed to parse response JSON: %w", err)
}
if data.MetaData.Code != "200" {
return fmt.Errorf("failed to get vclaim member: %s", data.MetaData.Message)
}
if data.Response.Peserta.NoKartu == "" || data.Response.Peserta.NIK == "" {
return fmt.Errorf("failed to get vclaim member: noKartu or nik is empty")
}
if data.Response.Peserta.NIK != *input.Person.ResidentIdentityNumber {
return fmt.Errorf("nik(residentIdentityNumber) is not match with bpjs number(vclaimMember_cardNumber)")
}
return nil
}
@@ -42,3 +42,16 @@ var updatePreMw []readDetailMw
var updatePostMw []readDetailMw
var deletePreMw []readDetailMw
var deletePostMw []readDetailMw
type BPJSResponse struct {
MetaData struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"metaData"`
Response *struct {
Peserta struct {
NoKartu string `json:"noKartu"`
NIK string `json:"nik"`
} `json:"peserta"`
} `json:"response"`
}