Merge branch 'feat/data-vaksin-192' of github.com:dikstub-rssa/simrs-be into migration
This commit is contained in:
No files matched your search
@@ -27,8 +27,6 @@ go.work.sum
|
|||||||
# env file
|
# env file
|
||||||
.env
|
.env
|
||||||
config.yml
|
config.yml
|
||||||
Dockerfile-main-api
|
|
||||||
Dockerfile-sync-api
|
|
||||||
**/atlas.hcl
|
**/atlas.hcl
|
||||||
!**/atlas.hcl.example
|
!**/atlas.hcl.example
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/main-api/main-api ./cmd/main-api/
|
|||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=builder /src/assets .
|
COPY --from=builder /src/assets ./assets
|
||||||
COPY --from=builder /src/cmd/main-api/main-api .
|
COPY --from=builder /src/cmd/main-api/main-api .
|
||||||
COPY --from=builder /src/cmd/main-api/config.yml .
|
COPY --from=builder /src/cmd/main-api/config.yml .
|
||||||
EXPOSE 8010
|
EXPOSE 8010
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
FROM golang:1.24.10 AS builder
|
||||||
|
WORKDIR /src
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
RUN go mod download
|
||||||
|
COPY . .
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/sync-api/sync-api ./cmd/sync-api/main.go
|
||||||
|
|
||||||
|
FROM alpine:latest
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /src/assets ./assets
|
||||||
|
COPY --from=builder /src/cmd/sync-api/sync-api .
|
||||||
|
COPY --from=builder /src/cmd/sync-api/config.yml .
|
||||||
|
EXPOSE 8011
|
||||||
|
CMD ["./sync-api"]
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
FROM golang:1.24.10 AS builder
|
|
||||||
WORKDIR /src
|
|
||||||
COPY go.mod go.sum ./
|
|
||||||
RUN go mod download
|
|
||||||
COPY . .
|
|
||||||
RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/simgos-sync-api/simgos-sync-api ./cmd/simgos-sync-api/main.go
|
|
||||||
|
|
||||||
FROM alpine:latest
|
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=builder /src/assets .
|
|
||||||
COPY --from=builder /src/cmd/simgos-sync-api/simgos-sync-api .
|
|
||||||
COPY --from=builder /src/cmd/simgos-sync-api/config.yml .
|
|
||||||
EXPOSE 8011
|
|
||||||
CMD ["./simgos-sync-api"]
|
|
||||||
@@ -627,17 +627,17 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td style="width: 4rem;">Fasyankes</td>
|
<td style="width: 4rem;">Fasyankes</td>
|
||||||
<td class="data-colon">: </td>
|
<td class="data-colon">: </td>
|
||||||
<td>{{ .NIK }}</td>
|
<td>{{ .ControlHealthcare }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Tanggal</td>
|
<td>Tanggal</td>
|
||||||
<td>: </td>
|
<td>: </td>
|
||||||
<td>{{ .NIK }}</td>
|
<td>{{ .ControlDate }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Klinik</td>
|
<td>Klinik</td>
|
||||||
<td>: </td>
|
<td>: </td>
|
||||||
<td>{{ .NIK }}</td>
|
<td>{{ .ControlUnit }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ require (
|
|||||||
github.com/jackc/pgx/v5 v5.5.5
|
github.com/jackc/pgx/v5 v5.5.5
|
||||||
github.com/karincake/apem v0.0.17
|
github.com/karincake/apem v0.0.17
|
||||||
github.com/karincake/dodol v0.0.1
|
github.com/karincake/dodol v0.0.1
|
||||||
github.com/karincake/getuk v0.3.1
|
github.com/karincake/getuk v0.3.2
|
||||||
github.com/karincake/hongkue v0.0.4
|
github.com/karincake/hongkue v0.0.4
|
||||||
github.com/karincake/lepet v0.0.1
|
github.com/karincake/lepet v0.0.1
|
||||||
github.com/karincake/risoles v0.0.3
|
github.com/karincake/risoles v0.0.3
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ github.com/karincake/apem v0.0.17 h1:y3WXCr9GWLFFFH4Qyq/VWlWWpijHh5zpTc3Lm96twa4
|
|||||||
github.com/karincake/apem v0.0.17/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM=
|
github.com/karincake/apem v0.0.17/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM=
|
||||||
github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0=
|
github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0=
|
||||||
github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24=
|
github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24=
|
||||||
github.com/karincake/getuk v0.3.1 h1:yRqBTrwpnjYcZD3gPDoSxFlsLgI9/GKCr3ZCsS4TtYQ=
|
github.com/karincake/getuk v0.3.2 h1:Qe+PRQ2qdgdiJlWiVEq37N8rrgS654nUnY0PWS6pMzA=
|
||||||
github.com/karincake/getuk v0.3.1/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c=
|
github.com/karincake/getuk v0.3.2/go.mod h1:nFl133aKQqxRbe5q9lo8q7BxlYBavmbkpglBhq/dNWk=
|
||||||
github.com/karincake/hongkue v0.0.4 h1:oWthq6cDg5DvDm1Z3e7mCLOATQf+oAdtHxN9OPnCfA8=
|
github.com/karincake/hongkue v0.0.4 h1:oWthq6cDg5DvDm1Z3e7mCLOATQf+oAdtHxN9OPnCfA8=
|
||||||
github.com/karincake/hongkue v0.0.4/go.mod h1:YVi5Lyh3DE+GRHx2OSODOr7FwvLi8U4idvcPHO7yeag=
|
github.com/karincake/hongkue v0.0.4/go.mod h1:YVi5Lyh3DE+GRHx2OSODOr7FwvLi8U4idvcPHO7yeag=
|
||||||
github.com/karincake/lepet v0.0.1 h1:eq/cwn5BBg0jWZ1c/MmvhFIBma0zBpVs2LwkfDOncy4=
|
github.com/karincake/lepet v0.0.1 h1:eq/cwn5BBg0jWZ1c/MmvhFIBma0zBpVs2LwkfDOncy4=
|
||||||
|
|||||||
@@ -40,8 +40,9 @@ type UpdateDto struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type DeleteDto struct {
|
type DeleteDto struct {
|
||||||
Id uint `json:"id"`
|
Id uint `json:"id"`
|
||||||
Number *string `json:"number"`
|
Number *string `json:"number"`
|
||||||
|
RequestPayload string `json:"requestPayload" validate:"maxLength=1024"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MetaDto struct {
|
type MetaDto struct {
|
||||||
@@ -52,10 +53,11 @@ type MetaDto struct {
|
|||||||
|
|
||||||
type ResponseDto struct {
|
type ResponseDto struct {
|
||||||
ecore.Main
|
ecore.Main
|
||||||
VclaimSep_Number *string `json:"vclaimSep_number"`
|
VclaimSep_Number *string `json:"vclaimSep_number"`
|
||||||
Number *string `json:"number"`
|
Number *string `json:"number"`
|
||||||
Value *string `json:"value"`
|
Value *string `json:"value"`
|
||||||
FileUrl *string `json:"fileUrl"`
|
FileUrl *string `json:"fileUrl"`
|
||||||
|
Detail *FullResponse `json:"detail,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d VclaimSepControlLetter) ToResponse() ResponseDto {
|
func (d VclaimSepControlLetter) ToResponse() ResponseDto {
|
||||||
@@ -64,6 +66,7 @@ func (d VclaimSepControlLetter) ToResponse() ResponseDto {
|
|||||||
Number: d.Number,
|
Number: d.Number,
|
||||||
Value: d.Value,
|
Value: d.Value,
|
||||||
FileUrl: d.FileUrl,
|
FileUrl: d.FileUrl,
|
||||||
|
Detail: d.Detail,
|
||||||
}
|
}
|
||||||
resp.Main = d.Main
|
resp.Main = d.Main
|
||||||
return resp
|
return resp
|
||||||
@@ -77,6 +80,15 @@ func ToResponseList(data []VclaimSepControlLetter) []ResponseDto {
|
|||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d DeleteDto) RequestPayloadIntoJson() ([]byte, error) {
|
||||||
|
payload := map[string]interface{}{}
|
||||||
|
err := json.Unmarshal([]byte(d.RequestPayload), &payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return json.Marshal(payload)
|
||||||
|
}
|
||||||
|
|
||||||
func (c CreateDto) RequestPayloadIntoJson() ([]byte, error) {
|
func (c CreateDto) RequestPayloadIntoJson() ([]byte, error) {
|
||||||
payload := map[string]interface{}{}
|
payload := map[string]interface{}{}
|
||||||
err := json.Unmarshal([]byte(c.RequestPayload), &payload)
|
err := json.Unmarshal([]byte(c.RequestPayload), &payload)
|
||||||
@@ -122,3 +134,154 @@ func (v ResponseForPDF) GenerateBirthDate() string {
|
|||||||
t, _ := time.Parse("2006-01-02", v.VclaimSep.VclaimMember.BirthDate)
|
t, _ := time.Parse("2006-01-02", v.VclaimSep.VclaimMember.BirthDate)
|
||||||
return pu.FormatIndonesianDate(t)
|
return pu.FormatIndonesianDate(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SuratKontrol struct {
|
||||||
|
NoSuratKontrol string `json:"noSuratKontrol"`
|
||||||
|
TglRencanaKontrol string `json:"tglRencanaKontrol"`
|
||||||
|
TglTerbit string `json:"tglTerbit"`
|
||||||
|
JnsKontrol string `json:"jnsKontrol"`
|
||||||
|
PoliTujuan string `json:"poliTujuan"`
|
||||||
|
NamaPoliTujuan string `json:"namaPoliTujuan"`
|
||||||
|
KodeDokter string `json:"kodeDokter"`
|
||||||
|
NamaDokter string `json:"namaDokter"`
|
||||||
|
FlagKontrol string `json:"flagKontrol"`
|
||||||
|
KodeDokterPembuat *string `json:"kodeDokterPembuat"`
|
||||||
|
NamaDokterPembuat *string `json:"namaDokterPembuat"`
|
||||||
|
NamaJnsKontrol string `json:"namaJnsKontrol"`
|
||||||
|
Sep Sep `json:"sep"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Sep struct {
|
||||||
|
NoSep string `json:"noSep"`
|
||||||
|
TglSep string `json:"tglSep"`
|
||||||
|
JnsPelayanan string `json:"jnsPelayanan"`
|
||||||
|
Poli string `json:"poli"`
|
||||||
|
Diagnosa string `json:"diagnosa"`
|
||||||
|
Peserta Peserta `json:"peserta"`
|
||||||
|
ProvUmum ProvUmum `json:"provUmum"`
|
||||||
|
ProvPerujuk ProvPerujuk `json:"provPerujuk"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Peserta struct {
|
||||||
|
NoKartu string `json:"noKartu"`
|
||||||
|
Nama string `json:"nama"`
|
||||||
|
TglLahir string `json:"tglLahir"`
|
||||||
|
Kelamin string `json:"kelamin"`
|
||||||
|
HakKelas string `json:"hakKelas"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProvUmum struct {
|
||||||
|
KdProvider string `json:"kdProvider"`
|
||||||
|
NmProvider string `json:"nmProvider"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProvPerujuk struct {
|
||||||
|
KdProviderPerujuk string `json:"kdProviderPerujuk"`
|
||||||
|
NmProviderPerujuk string `json:"nmProviderPerujuk"`
|
||||||
|
AsalRujukan string `json:"asalRujukan"`
|
||||||
|
NoRujukan string `json:"noRujukan"`
|
||||||
|
TglRujukan string `json:"tglRujukan"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type VclaimResponse struct {
|
||||||
|
MetaData MetaData `json:"metaData"`
|
||||||
|
Response *SuratKontrol `json:"response"` // nullable
|
||||||
|
}
|
||||||
|
|
||||||
|
type DetailVclaimResponse struct {
|
||||||
|
MetaData MetaData `json:"metaData"`
|
||||||
|
Response *FullResponse `json:"response"` // nullable
|
||||||
|
}
|
||||||
|
|
||||||
|
type MetaData struct {
|
||||||
|
Code string `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r VclaimResponse) ToPDFNeeds() ([]byte, error) {
|
||||||
|
response := ResponseForPDF{
|
||||||
|
Number: r.Response.Sep.NoSep,
|
||||||
|
PlannedControlDate: r.Response.TglRencanaKontrol,
|
||||||
|
IssuedDate: r.Response.TglTerbit,
|
||||||
|
Doctor_Name: r.Response.NamaDokter,
|
||||||
|
DstUnit_Name: r.Response.NamaPoliTujuan,
|
||||||
|
ResponsibleDoctor_Name: *r.Response.NamaDokterPembuat,
|
||||||
|
VclaimSep: VclaimSep{
|
||||||
|
VclaimMember: VclaimMember{
|
||||||
|
CardNumber: r.Response.Sep.Peserta.NoKartu,
|
||||||
|
Name: r.Response.Sep.Peserta.Nama,
|
||||||
|
BirthDate: r.Response.Sep.Peserta.TglLahir,
|
||||||
|
Gender: r.Response.Sep.Peserta.Kelamin,
|
||||||
|
},
|
||||||
|
Diagnose: r.Response.Sep.Diagnosa,
|
||||||
|
Number: r.Response.Sep.NoSep,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return json.Marshal(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
type FullResponse struct {
|
||||||
|
NoSuratKontrol string `json:"noSuratKontrol"`
|
||||||
|
TglRencanaKontrol string `json:"tglRencanaKontrol"`
|
||||||
|
TglTerbit string `json:"tglTerbit"`
|
||||||
|
JnsKontrol string `json:"jnsKontrol"`
|
||||||
|
PoliTujuan string `json:"poliTujuan"`
|
||||||
|
NamaPoliTujuan string `json:"namaPoliTujuan"`
|
||||||
|
KodeDokter string `json:"kodeDokter"`
|
||||||
|
NamaDokter string `json:"namaDokter"`
|
||||||
|
FlagKontrol string `json:"flagKontrol"`
|
||||||
|
KodeDokterPembuat string `json:"kodeDokterPembuat"`
|
||||||
|
NamaDokterPembuat string `json:"namaDokterPembuat"`
|
||||||
|
NamaJnsKontrol string `json:"namaJnsKontrol"`
|
||||||
|
Sep Sep `json:"sep"`
|
||||||
|
FormPRB FormPRB `json:"formPRB"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Provider struct {
|
||||||
|
KdProvider string `json:"kdProvider"`
|
||||||
|
NmProvider string `json:"nmProvider"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FormPRB struct {
|
||||||
|
KdStatusPRB *string `json:"kdStatusPRB"`
|
||||||
|
Data PRBData `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PRBData struct {
|
||||||
|
HBA1C *string `json:"HBA1C"`
|
||||||
|
GDP *string `json:"GDP"`
|
||||||
|
GD2JPP *string `json:"GD2JPP"`
|
||||||
|
EGFR *string `json:"eGFR"`
|
||||||
|
TD_Sistolik *string `json:"TD_Sistolik"`
|
||||||
|
TD_Diastolik *string `json:"TD_Diastolik"`
|
||||||
|
LDL *string `json:"LDL"`
|
||||||
|
Rata_TD_Sistolik *string `json:"Rata_TD_Sistolik"`
|
||||||
|
Rata_TD_Diastolik *string `json:"Rata_TD_Diastolik"`
|
||||||
|
JantungKoroner *string `json:"JantungKoroner"`
|
||||||
|
Stroke *string `json:"Stroke"`
|
||||||
|
VaskularPerifer *string `json:"VaskularPerifer"`
|
||||||
|
Aritmia *string `json:"Aritmia"`
|
||||||
|
AtrialFibrilasi *string `json:"AtrialFibrilasi"`
|
||||||
|
SesakNapas3Bulan *string `json:"SesakNapas3Bulan"`
|
||||||
|
NyeriDada3Bulan *string `json:"NyeriDada3Bulan"`
|
||||||
|
Terkontrol *string `json:"Terkontrol"`
|
||||||
|
Gejala2xMinggu *string `json:"Gejala2xMinggu"`
|
||||||
|
BangunMalam *string `json:"BangunMalam"`
|
||||||
|
KeterbatasanFisik *string `json:"KeterbatasanFisik"`
|
||||||
|
FungsiParu *string `json:"FungsiParu"`
|
||||||
|
SkorMMRC *string `json:"SkorMMRC"`
|
||||||
|
Eksaserbasi1Tahun *string `json:"Eksaserbasi1Tahun"`
|
||||||
|
MampuAktivitas *string `json:"MampuAktivitas"`
|
||||||
|
Epileptik6Bulan *string `json:"Epileptik6Bulan"`
|
||||||
|
EfekSampingOAB *string `json:"EfekSampingOAB"`
|
||||||
|
HamilMenyusui *string `json:"HamilMenyusui"`
|
||||||
|
Remisi *string `json:"Remisi"`
|
||||||
|
TerapiRumatan *string `json:"TerapiRumatan"`
|
||||||
|
Usia *string `json:"Usia"`
|
||||||
|
AsamUrat *string `json:"AsamUrat"`
|
||||||
|
RemisiSLE *string `json:"RemisiSLE"`
|
||||||
|
Hamil *string `json:"Hamil"`
|
||||||
|
NadiIstirahat *string `json:"NadiIstirahat"`
|
||||||
|
SesakNapasAktivitas *string `json:"SesakNapasAktivitas"`
|
||||||
|
NyeriDadaAktivitas *string `json:"NyeriDadaAktivitas"`
|
||||||
|
}
|
||||||
@@ -10,4 +10,6 @@ type VclaimSepControlLetter struct {
|
|||||||
Number *string `json:"number" gorm:"unique;size:20"`
|
Number *string `json:"number" gorm:"unique;size:20"`
|
||||||
Value *string `json:"value"`
|
Value *string `json:"value"`
|
||||||
FileUrl *string `json:"fileUrl" gorm:"unique;size:1024"`
|
FileUrl *string `json:"fileUrl" gorm:"unique;size:1024"`
|
||||||
|
|
||||||
|
Detail *FullResponse `json:"detail,omitempty" gorm:"-"`
|
||||||
}
|
}
|
||||||
@@ -11,13 +11,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type CreateDto struct {
|
type CreateDto struct {
|
||||||
Parent_Id *uint `json:"parent_id"`
|
Parent_Id *uint `json:"parent_id"`
|
||||||
SeriesNumber *uint16 `json:"seriesNumber"`
|
SeriesNumber *uint16 `json:"seriesNumber"`
|
||||||
CycleNumber *uint `json:"cycleNumber"`
|
CycleNumber *uint `json:"cycleNumber"`
|
||||||
PlanDate *time.Time `json:"planDate"`
|
PlanDate *time.Time `json:"planDate"`
|
||||||
RealizationDate *time.Time `json:"realizationDate"`
|
RealizationDate *time.Time `json:"realizationDate"`
|
||||||
Notes *string `json:"notes"`
|
Notes *string `json:"notes"`
|
||||||
Status ere.StatusProtocolChemo `json:"status"`
|
Status *ere.StatusProtocolChemo `json:"status"`
|
||||||
|
Encounter_Id *uint `json:"encounter_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadListDto struct {
|
type ReadListDto struct {
|
||||||
@@ -32,17 +33,27 @@ type FilterDto struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ReadDetailDto struct {
|
type ReadDetailDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
Includes string `json:"includes"`
|
Includes string `json:"includes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UpdateDto struct {
|
type UpdateDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
CreateDto
|
CreateDto
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteDto struct {
|
type DeleteDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FailDto struct {
|
||||||
|
Id uint `json:"id"`
|
||||||
|
Reasons string `json:"reasons" validate:"required"`
|
||||||
|
}
|
||||||
|
type FailReason struct {
|
||||||
|
Date *time.Time `json:"date"`
|
||||||
|
FailReason string `json:"failReason"`
|
||||||
|
Encounter_Id *uint `json:"encounter_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MetaDto struct {
|
type MetaDto struct {
|
||||||
@@ -53,15 +64,15 @@ type MetaDto struct {
|
|||||||
|
|
||||||
type ResponseDto struct {
|
type ResponseDto struct {
|
||||||
ecore.Main
|
ecore.Main
|
||||||
Parent_Id *uint `json:"parent_id"` // chemo.Id
|
Parent_Id *uint `json:"parent_id"` // chemo.Id
|
||||||
Protocol_Id *uint `json:"protocol_id"`
|
Protocol_Id *uint `json:"protocol_id"`
|
||||||
SeriesNumber *uint16 `json:"seriesNumber"` // series ke -
|
SeriesNumber *uint16 `json:"seriesNumber"` // series ke -
|
||||||
CycleNumber *uint `json:"cycleNumber"` // cycle ke -
|
CycleNumber *uint `json:"cycleNumber"` // cycle ke -
|
||||||
PlanDate *time.Time `json:"planDate"`
|
PlanDate *time.Time `json:"planDate"`
|
||||||
RealizationDate *time.Time `json:"realizationDate"`
|
RealizationDate *time.Time `json:"realizationDate"`
|
||||||
Notes *string `json:"notes"`
|
Notes *string `json:"notes"`
|
||||||
Status ere.StatusProtocolChemo `json:"status"`
|
Status *ere.StatusProtocolChemo `json:"status"`
|
||||||
Reasons *string `json:"reasons"`
|
Reasons *string `json:"reasons"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d ChemoPlan) ToResponse() ResponseDto {
|
func (d ChemoPlan) ToResponse() ResponseDto {
|
||||||
|
|||||||
@@ -11,15 +11,15 @@ import (
|
|||||||
|
|
||||||
type ChemoPlan struct {
|
type ChemoPlan struct {
|
||||||
ecore.Main
|
ecore.Main
|
||||||
Parent_Id *uint `json:"parent_id"` // chemo.Id
|
Parent_Id *uint `json:"parent_id"` // chemo.Id
|
||||||
Protocol_Id *uint `json:"protocol_id"`
|
Protocol_Id *uint `json:"protocol_id"`
|
||||||
SeriesNumber *uint16 `json:"seriesNumber"` // series ke -
|
SeriesNumber *uint16 `json:"seriesNumber"` // series ke -
|
||||||
CycleNumber *uint `json:"cycleNumber"` // cycle ke -
|
CycleNumber *uint `json:"cycleNumber"` // cycle ke -
|
||||||
PlanDate *time.Time `json:"planDate"`
|
PlanDate *time.Time `json:"planDate"`
|
||||||
RealizationDate *time.Time `json:"realizationDate"`
|
RealizationDate *time.Time `json:"realizationDate"`
|
||||||
Notes *string `json:"notes"`
|
Notes *string `json:"notes"`
|
||||||
Status ere.StatusProtocolChemo `json:"status"`
|
Status *ere.StatusProtocolChemo `json:"status"`
|
||||||
Encounter_Id *uint `json:"encounter_id"`
|
Encounter_Id *uint `json:"encounter_id"`
|
||||||
Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"`
|
Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"`
|
||||||
Reasons *string `json:"reasons"` // json
|
Reasons *string `json:"reasons"` // json
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
package chemo_protocol
|
package chemo_protocol
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
eus "simrs-vx/internal/domain/main-entities/user"
|
||||||
|
pa "simrs-vx/internal/lib/auth"
|
||||||
// std
|
// std
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -11,19 +13,25 @@ import (
|
|||||||
ecore "simrs-vx/internal/domain/base-entities/core"
|
ecore "simrs-vx/internal/domain/base-entities/core"
|
||||||
|
|
||||||
ec "simrs-vx/internal/domain/main-entities/chemo"
|
ec "simrs-vx/internal/domain/main-entities/chemo"
|
||||||
|
ep "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateDto struct {
|
type CreateDto struct {
|
||||||
Chemo_Id *uint `json:"chemo_id"`
|
Encounter_Id *uint `json:"encounter_id" validate:"required"`
|
||||||
Patient_Weight *float32 `json:"patient_weight"`
|
Chemo_Id *uint `json:"chemo_id" validate:"required"`
|
||||||
Patient_Height *float32 `json:"patient_height"`
|
Patient_Weight *float32 `json:"patient_weight"`
|
||||||
Diagnoses *string `json:"diagnoses"`
|
Patient_Height *float32 `json:"patient_height"`
|
||||||
Interval *uint `json:"interval"`
|
Diagnoses *string `json:"diagnoses" validate:"required"`
|
||||||
Cycle *uint `json:"cycle"`
|
Interval *uint `json:"interval" validate:"required"`
|
||||||
Series *uint16 `json:"series"`
|
Cycle *uint `json:"cycle" validate:"required"`
|
||||||
StartDate *time.Time `json:"startDate"`
|
Series *uint16 `json:"series" validate:"required"`
|
||||||
EndDate *time.Time `json:"endDate"`
|
StartDate *time.Time `json:"startDate"`
|
||||||
Status_Code erc.DataVerifiedCode `json:"-"`
|
EndDate *time.Time `json:"endDate"`
|
||||||
|
Patient_Id *uint `json:"patient_id"`
|
||||||
|
ChemoPlans *[]ep.CreateDto `json:"chemoPlans" validate:"required"`
|
||||||
|
|
||||||
|
Id *uint `json:"-"`
|
||||||
|
Status_Code erc.DataVerifiedCode `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadListDto struct {
|
type ReadListDto struct {
|
||||||
@@ -33,21 +41,29 @@ type ReadListDto struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type FilterDto struct {
|
type FilterDto struct {
|
||||||
Chemo_Id *uint `json:"chemo-id"`
|
Chemo_Id *uint `json:"chemo-id"`
|
||||||
|
Patient_Id *uint `json:"patient-id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadDetailDto struct {
|
type ReadDetailDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
Includes string `json:"includes"`
|
Includes string `json:"includes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UpdateDto struct {
|
type UpdateDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
CreateDto
|
CreateDto
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteDto struct {
|
type DeleteDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type VerifyDto struct {
|
||||||
|
Id uint `json:"id"`
|
||||||
|
Status_Code erc.DataVerifiedCode `json:"-"`
|
||||||
|
|
||||||
|
pa.AuthInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type MetaDto struct {
|
type MetaDto struct {
|
||||||
@@ -58,32 +74,42 @@ type MetaDto struct {
|
|||||||
|
|
||||||
type ResponseDto struct {
|
type ResponseDto struct {
|
||||||
ecore.Main
|
ecore.Main
|
||||||
Chemo_Id *uint `json:"chemo_id"`
|
Chemo_Id *uint `json:"chemo_id"`
|
||||||
Chemo *ec.Chemo `json:"chemo,omitempty"`
|
Chemo *ec.Chemo `json:"chemo,omitempty"`
|
||||||
Patient_Weight *float32 `json:"patient_weight"`
|
Patient_Weight *float32 `json:"patient_weight"`
|
||||||
Patient_Height *float32 `json:"patient_height"`
|
Patient_Height *float32 `json:"patient_height"`
|
||||||
Diagnoses *string `json:"diagnoses"`
|
Diagnoses *string `json:"diagnoses"`
|
||||||
Interval *uint `json:"interval"`
|
Interval *uint `json:"interval"`
|
||||||
Cycle *uint `json:"cycle"`
|
Cycle *uint `json:"cycle"`
|
||||||
Series *uint16 `json:"series"`
|
Series *uint16 `json:"series"`
|
||||||
StartDate *time.Time `json:"startDate"`
|
StartDate *time.Time `json:"startDate"`
|
||||||
EndDate *time.Time `json:"endDate"`
|
EndDate *time.Time `json:"endDate"`
|
||||||
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
||||||
|
VerifiedAt *time.Time `json:"verifiedAt"`
|
||||||
|
VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"`
|
||||||
|
VerifiedBy *eus.User `json:"verifiedBy,omitempty"`
|
||||||
|
ChemoPlans *[]ep.ChemoPlan `json:"chemoPlans,omitempty"`
|
||||||
|
Patient_Id *uint `json:"patient_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d ChemoProtocol) ToResponse() ResponseDto {
|
func (d ChemoProtocol) ToResponse() ResponseDto {
|
||||||
resp := ResponseDto{
|
resp := ResponseDto{
|
||||||
Chemo_Id: d.Chemo_Id,
|
Chemo_Id: d.Chemo_Id,
|
||||||
Chemo: d.Chemo,
|
Chemo: d.Chemo,
|
||||||
Patient_Weight: d.Patient_Weight,
|
Patient_Weight: d.Patient_Weight,
|
||||||
Patient_Height: d.Patient_Height,
|
Patient_Height: d.Patient_Height,
|
||||||
Diagnoses: d.Diagnoses,
|
Diagnoses: d.Diagnoses,
|
||||||
Interval: d.Interval,
|
Interval: d.Interval,
|
||||||
Cycle: d.Cycle,
|
Cycle: d.Cycle,
|
||||||
Series: d.Series,
|
Series: d.Series,
|
||||||
StartDate: d.StartDate,
|
StartDate: d.StartDate,
|
||||||
EndDate: d.EndDate,
|
EndDate: d.EndDate,
|
||||||
Status_Code: d.Status_Code,
|
Status_Code: d.Status_Code,
|
||||||
|
VerifiedAt: d.VerifiedAt,
|
||||||
|
VerifiedBy_User_Id: d.VerifiedBy_User_Id,
|
||||||
|
VerifiedBy: d.VerifiedBy,
|
||||||
|
ChemoPlans: d.ChemoPlans,
|
||||||
|
Patient_Id: d.Patient_Id,
|
||||||
}
|
}
|
||||||
resp.Main = d.Main
|
resp.Main = d.Main
|
||||||
return resp
|
return resp
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package chemo
|
|||||||
import (
|
import (
|
||||||
ed "simrs-vx/internal/domain/main-entities/doctor"
|
ed "simrs-vx/internal/domain/main-entities/doctor"
|
||||||
es "simrs-vx/internal/domain/main-entities/specialist"
|
es "simrs-vx/internal/domain/main-entities/specialist"
|
||||||
|
ere "simrs-vx/internal/domain/references/encounter"
|
||||||
|
|
||||||
|
// std
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
// internal - lib
|
// internal - lib
|
||||||
@@ -21,6 +24,7 @@ type CreateDto struct {
|
|||||||
Encounter_Id *uint `json:"encounter_id"`
|
Encounter_Id *uint `json:"encounter_id"`
|
||||||
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
||||||
Specialist_Code *string `json:"specialist_code"`
|
Specialist_Code *string `json:"specialist_code"`
|
||||||
|
Class_Code ere.ChemoClassCode `json:"class_code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadListDto struct {
|
type ReadListDto struct {
|
||||||
@@ -34,28 +38,32 @@ type FilterDto struct {
|
|||||||
Status_Code *erc.DataVerifiedCode `json:"status-code"`
|
Status_Code *erc.DataVerifiedCode `json:"status-code"`
|
||||||
VerifiedBy_User_Id *uint `json:"verifiedBy-user-id"`
|
VerifiedBy_User_Id *uint `json:"verifiedBy-user-id"`
|
||||||
Specialist_Code *string `json:"specialist-code"`
|
Specialist_Code *string `json:"specialist-code"`
|
||||||
|
Patient_Id *uint `json:"patient-id"`
|
||||||
|
Class_Code ere.ChemoClassCode `json:"class-code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadDetailDto struct {
|
type ReadDetailDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
|
Includes string `json:"includes"`
|
||||||
|
FilterDto
|
||||||
}
|
}
|
||||||
|
|
||||||
type UpdateDto struct {
|
type UpdateDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
CreateDto
|
CreateDto
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteDto struct {
|
type DeleteDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type VerifyDto struct {
|
type VerifyDto struct {
|
||||||
Id uint16 `json:"id"`
|
Id uint `json:"id"`
|
||||||
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
||||||
Bed *string `json:"bed"`
|
Bed *string `json:"bed"`
|
||||||
Needs *string `json:"needs"`
|
Needs *string `json:"needs"`
|
||||||
Doctor_Code *string `json:"doctor_code" validate:"required"`
|
Doctor_Code *string `json:"doctor_code" validate:"required"`
|
||||||
NextChemoDate *time.Time `json:"nextChemoDate"`
|
NextChemoDate *time.Time `json:"nextChemoDate" validate:"required"`
|
||||||
|
|
||||||
pa.AuthInfo
|
pa.AuthInfo
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,14 +26,15 @@ type ReadListDto struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type FilterDto struct {
|
type FilterDto struct {
|
||||||
Code *string `json:"code"`
|
Code *string `json:"code"`
|
||||||
Employee_Id *uint `json:"employee-id"`
|
Employee_Id *uint `json:"employee-id"`
|
||||||
IHS_Number *string `json:"ihs-number" validate:"maxLength=20"`
|
IHS_Number *string `json:"ihs-number" validate:"maxLength=20"`
|
||||||
SIP_Number *string `json:"sip-number" validate:"maxLength=20"`
|
SIP_Number *string `json:"sip-number" validate:"maxLength=20"`
|
||||||
SIP_ExpiredDate *string `json:"sip-expiredDate"`
|
SIP_ExpiredDate *string `json:"sip-expiredDate"`
|
||||||
Unit_Code *string `json:"unit-code"`
|
Unit_Code *string `json:"unit-code"`
|
||||||
Specialist_Code *string `json:"specialist-code"`
|
Specialist_Code *string `json:"specialist-code"`
|
||||||
Subspecialist_Code *string `json:"subspecialist-code"`
|
Specialist_Code_Opt *string `json:"specialist-code-opt"`
|
||||||
|
Subspecialist_Code *string `json:"subspecialist-code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadDetailDto struct {
|
type ReadDetailDto struct {
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ type FilterDto struct {
|
|||||||
RegisteredAt *time.Time `json:"registeredAt"`
|
RegisteredAt *time.Time `json:"registeredAt"`
|
||||||
Class_Code ere.EncounterClassCode `json:"class-code" validate:"maxLength=10"`
|
Class_Code ere.EncounterClassCode `json:"class-code" validate:"maxLength=10"`
|
||||||
Specialist_Code *string `json:"specialist-code"`
|
Specialist_Code *string `json:"specialist-code"`
|
||||||
|
Specialist_Code_Opt *string `json:"specialist-code-opt"`
|
||||||
Subspecialist_Code *string `json:"subspecialist-code"`
|
Subspecialist_Code *string `json:"subspecialist-code"`
|
||||||
VisitDate time.Time `json:"visitDate"`
|
VisitDate time.Time `json:"visitDate"`
|
||||||
Appoinment_Doctor_Code *string `json:"appointment-doctor-code"`
|
Appoinment_Doctor_Code *string `json:"appointment-doctor-code"`
|
||||||
@@ -116,6 +117,7 @@ type FilterDto struct {
|
|||||||
MedicalDischargeEducation *string `json:"medicalDischargeEducation"`
|
MedicalDischargeEducation *string `json:"medicalDischargeEducation"`
|
||||||
AdmDischargeEducation *string `json:"admDischargeEducation"`
|
AdmDischargeEducation *string `json:"admDischargeEducation"`
|
||||||
DischargeReason *string `json:"dischargeReason"`
|
DischargeReason *string `json:"dischargeReason"`
|
||||||
|
ChemoClass *ere.ChemoClassCode `json:"chemo-class"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadDetailDto struct {
|
type ReadDetailDto struct {
|
||||||
@@ -293,6 +295,6 @@ func ToResponseList(data []Encounter) []ResponseDto {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CreateWithPatientDto struct {
|
type CreateWithPatientDto struct {
|
||||||
Encounter CreateDto `json:"encounter"`
|
CreateDto
|
||||||
Patient ep.CreateDto `json:"patient"`
|
Patient ep.CreateDto `json:"patient"`
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,10 @@ type CreateDto struct {
|
|||||||
EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code" validate:"maxLength=20"`
|
EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code" validate:"maxLength=20"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CreateBulkDto struct {
|
||||||
|
Value []CreateDto `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
type ReadListDto struct {
|
type ReadListDto struct {
|
||||||
FilterDto
|
FilterDto
|
||||||
Includes string `json:"includes"`
|
Includes string `json:"includes"`
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package resume
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
ecore "simrs-vx/internal/domain/base-entities/core"
|
ecore "simrs-vx/internal/domain/base-entities/core"
|
||||||
|
ed "simrs-vx/internal/domain/main-entities/doctor"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
erc "simrs-vx/internal/domain/references/common"
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
@@ -54,6 +55,7 @@ type ResponseDto struct {
|
|||||||
ecore.Main
|
ecore.Main
|
||||||
Encounter_Id *uint `json:"encounter_id"`
|
Encounter_Id *uint `json:"encounter_id"`
|
||||||
Doctor_Code *string `json:"doctor_code"`
|
Doctor_Code *string `json:"doctor_code"`
|
||||||
|
Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"`
|
||||||
Value *string `json:"value"`
|
Value *string `json:"value"`
|
||||||
FileUrl *string `json:"fileUrl"`
|
FileUrl *string `json:"fileUrl"`
|
||||||
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
Status_Code erc.DataVerifiedCode `json:"status_code"`
|
||||||
@@ -63,6 +65,7 @@ func (d Resume) ToResponse() ResponseDto {
|
|||||||
resp := ResponseDto{
|
resp := ResponseDto{
|
||||||
Encounter_Id: d.Encounter_Id,
|
Encounter_Id: d.Encounter_Id,
|
||||||
Doctor_Code: d.Doctor_Code,
|
Doctor_Code: d.Doctor_Code,
|
||||||
|
Doctor: d.Doctor,
|
||||||
Value: d.Value,
|
Value: d.Value,
|
||||||
FileUrl: d.FileUrl,
|
FileUrl: d.FileUrl,
|
||||||
Status_Code: d.Status_Code,
|
Status_Code: d.Status_Code,
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type CreateDto struct {
|
type CreateDto struct {
|
||||||
Id *uint `json:"id"`
|
Id *uint `json:"id"`
|
||||||
Installation_Code string `json:"installation_code"`
|
Installation_Code *string `json:"installation_code"`
|
||||||
Code string `json:"code" validate:"maxLength=10"`
|
Code string `json:"code" validate:"maxLength=10"`
|
||||||
Name string `json:"name" validate:"maxLength=50"`
|
Name string `json:"name" validate:"maxLength=50"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadListDto struct {
|
type ReadListDto struct {
|
||||||
@@ -42,6 +42,10 @@ type DeleteDto struct {
|
|||||||
Code *string `json:"code"`
|
Code *string `json:"code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CreateBulkDto struct {
|
||||||
|
Value []CreateDto `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
type MetaDto struct {
|
type MetaDto struct {
|
||||||
PageNumber int `json:"page_number"`
|
PageNumber int `json:"page_number"`
|
||||||
PageSize int `json:"page_size"`
|
PageSize int `json:"page_size"`
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ type DeleteDto struct {
|
|||||||
Code *string `json:"code"`
|
Code *string `json:"code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CreateBulkDto struct {
|
||||||
|
Value []CreateDto `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
type MetaDto struct {
|
type MetaDto struct {
|
||||||
PageNumber int `json:"page_number"`
|
PageNumber int `json:"page_number"`
|
||||||
PageSize int `json:"page_size"`
|
PageSize int `json:"page_size"`
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ const (
|
|||||||
OCCHcu OutpatientClassCode = "hcu" // HCU
|
OCCHcu OutpatientClassCode = "hcu" // HCU
|
||||||
OCCVk OutpatientClassCode = "vk" // Verlos kamer
|
OCCVk OutpatientClassCode = "vk" // Verlos kamer
|
||||||
|
|
||||||
ACCReg AmbulatoryClassCode = "reg" // Regular
|
ACCReg AmbulatoryClassCode = "regular" // Regular
|
||||||
// ACCRehab ACCRme AmbulatoryClassCode = "rme" // Rehab Medik
|
// ACCRehab ACCRme AmbulatoryClassCode = "rme" // Rehab Medik
|
||||||
// ACCCad AmbulatoryClassCode = "chemo-adm" // Chemotherapy
|
// ACCCad AmbulatoryClassCode = "chemo-adm" // Chemotherapy
|
||||||
// ACCCac AmbulatoryClassCode = "chemo-act" // Chemotherapy
|
// ACCCac AmbulatoryClassCode = "chemo-act" // Chemotherapy
|
||||||
@@ -130,9 +130,9 @@ const (
|
|||||||
ETCEncounter EntityTypeCode = "encounter"
|
ETCEncounter EntityTypeCode = "encounter"
|
||||||
ETCMCU EntityTypeCode = "mcu"
|
ETCMCU EntityTypeCode = "mcu"
|
||||||
|
|
||||||
SPCComplete StatusProtocolChemo = "complete"
|
SPCComplete StatusProtocolChemo = "complete" // Terealisasi
|
||||||
SPCPlanned StatusProtocolChemo = "planned"
|
SPCPlanned StatusProtocolChemo = "planned" // Terencana
|
||||||
SPCSchedule StatusProtocolChemo = "schedule"
|
SPCSchedule StatusProtocolChemo = "schedule" // Terjadwal
|
||||||
)
|
)
|
||||||
|
|
||||||
func (ec EncounterClassCode) Code() string {
|
func (ec EncounterClassCode) Code() string {
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package daftar_specialist
|
||||||
|
|
||||||
|
type DaftarSpesialis struct {
|
||||||
|
ID uint `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
|
||||||
|
Kode string `json:"kode" gorm:"column:Kode"`
|
||||||
|
Spesialis string `json:"spesialis" gorm:"column:Spesialis"`
|
||||||
|
IdGroupLocationSimgos *string `json:"id_group_location_simgos" gorm:"column:Id_group_location_simgos"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (DaftarSpesialis) TableName() string {
|
||||||
|
return "daftar_spesialis"
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package m_ruang
|
||||||
|
|
||||||
|
type MRuang struct {
|
||||||
|
No uint `json:"no" gorm:"column:no;primaryKey;autoIncrement"`
|
||||||
|
Nama string `json:"nama" gorm:"column:nama"`
|
||||||
|
Kelas string `json:"kelas" gorm:"column:kelas"`
|
||||||
|
IdxRuang string `json:"idx_ruang" gorm:"column:idx_ruang"`
|
||||||
|
Kelompok string `json:"kelompok" gorm:"column:kelompok"`
|
||||||
|
Ruang *string `json:"ruang" gorm:"column:ruang"`
|
||||||
|
KdUnit int `json:"kdunit" gorm:"column:kdunit"`
|
||||||
|
JumlahTT int `json:"jumlah_tt" gorm:"column:jumlah_tt"`
|
||||||
|
KetRuang *string `json:"ket_ruang" gorm:"column:ket_ruang"`
|
||||||
|
Fasilitas *string `json:"fasilitas" gorm:"column:fasilitas"`
|
||||||
|
Keterangan *string `json:"keterangan" gorm:"column:keterangan"`
|
||||||
|
SubSistem string `json:"subsistem" gorm:"column:subsistem"`
|
||||||
|
StAktif int16 `json:"st_aktif" gorm:"column:st_aktif"`
|
||||||
|
KodeRuang *string `json:"kode_ruang" gorm:"column:kode_ruang"`
|
||||||
|
IsPartial *string `json:"is_partial" gorm:"column:is_partial"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nama tabel (opsional jika nama struct ≠ nama tabel)
|
||||||
|
func (MRuang) TableName() string {
|
||||||
|
return "m_ruang"
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package simgos_db
|
||||||
|
|
||||||
|
import (
|
||||||
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetInstance() {
|
||||||
|
I = dg.IS["satu"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package simgos_db
|
||||||
|
|
||||||
|
import "gorm.io/gorm"
|
||||||
|
|
||||||
|
var I *gorm.DB
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
package chemo_protocol
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
rw "github.com/karincake/risoles"
|
||||||
|
sf "github.com/karincake/semprit"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
ep "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
||||||
|
u "simrs-vx/internal/use-case/main-use-case/chemo-plan"
|
||||||
|
)
|
||||||
|
|
||||||
|
type myBase struct{}
|
||||||
|
|
||||||
|
var O myBase
|
||||||
|
|
||||||
|
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
|
||||||
|
dto := ep.CreateDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := u.Create(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{}
|
||||||
|
sf.UrlQueryParam(&dto, *r.URL)
|
||||||
|
|
||||||
|
dto.Id = uint(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
|
||||||
|
}
|
||||||
|
|
||||||
|
dto := e.UpdateDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dto.Id = uint(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
|
||||||
|
}
|
||||||
|
|
||||||
|
dto := e.DeleteDto{}
|
||||||
|
dto.Id = uint(id)
|
||||||
|
res, err := u.Delete(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj myBase) Fail(w http.ResponseWriter, r *http.Request) {
|
||||||
|
id := rw.ValidateInt(w, "id", r.PathValue("id"))
|
||||||
|
if id <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dto := e.FailDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dto.Id = uint(id)
|
||||||
|
res, err := u.Fail(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
@@ -2,7 +2,10 @@ package chemo_protocol
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
|
pa "simrs-vx/internal/lib/auth"
|
||||||
|
|
||||||
|
d "github.com/karincake/dodol"
|
||||||
rw "github.com/karincake/risoles"
|
rw "github.com/karincake/risoles"
|
||||||
sf "github.com/karincake/semprit"
|
sf "github.com/karincake/semprit"
|
||||||
|
|
||||||
@@ -39,7 +42,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
|
|||||||
dto := e.ReadDetailDto{}
|
dto := e.ReadDetailDto{}
|
||||||
sf.UrlQueryParam(&dto, *r.URL)
|
sf.UrlQueryParam(&dto, *r.URL)
|
||||||
|
|
||||||
dto.Id = uint16(id)
|
dto.Id = uint(id)
|
||||||
res, err := u.ReadDetail(dto)
|
res, err := u.ReadDetail(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
@@ -54,7 +57,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
|
|||||||
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dto.Id = uint16(id)
|
dto.Id = uint(id)
|
||||||
res, err := u.Update(dto)
|
res, err := u.Update(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
@@ -66,7 +69,46 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dto := e.DeleteDto{}
|
dto := e.DeleteDto{}
|
||||||
dto.Id = uint16(id)
|
dto.Id = uint(id)
|
||||||
res, err := u.Delete(dto)
|
res, err := u.Delete(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (obj myBase) Verify(w http.ResponseWriter, r *http.Request) {
|
||||||
|
id := rw.ValidateInt(w, "id", r.PathValue("id"))
|
||||||
|
if id <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dto := e.VerifyDto{}
|
||||||
|
dto.Id = uint(id)
|
||||||
|
|
||||||
|
authInfo, err := pa.GetAuthInfo(r)
|
||||||
|
if err != nil {
|
||||||
|
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
dto.AuthInfo = *authInfo
|
||||||
|
dto.Status_Code = erc.DVCVerified
|
||||||
|
res, err := u.Verify(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj myBase) Reject(w http.ResponseWriter, r *http.Request) {
|
||||||
|
id := rw.ValidateInt(w, "id", r.PathValue("id"))
|
||||||
|
if id <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dto := e.VerifyDto{}
|
||||||
|
dto.Id = uint(id)
|
||||||
|
authInfo, err := pa.GetAuthInfo(r)
|
||||||
|
if err != nil {
|
||||||
|
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
dto.AuthInfo = *authInfo
|
||||||
|
dto.Status_Code = erc.DVCRejected
|
||||||
|
res, err := u.Verify(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
@@ -3,20 +3,16 @@ package chemo
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
rw "github.com/karincake/risoles"
|
|
||||||
sf "github.com/karincake/semprit"
|
|
||||||
|
|
||||||
// ua "github.com/karincake/tumpeng/auth/svc"
|
|
||||||
|
|
||||||
e "simrs-vx/internal/domain/main-entities/chemo"
|
|
||||||
|
|
||||||
erc "simrs-vx/internal/domain/references/common"
|
|
||||||
|
|
||||||
u "simrs-vx/internal/use-case/main-use-case/chemo"
|
|
||||||
|
|
||||||
pa "simrs-vx/internal/lib/auth"
|
pa "simrs-vx/internal/lib/auth"
|
||||||
|
|
||||||
d "github.com/karincake/dodol"
|
d "github.com/karincake/dodol"
|
||||||
|
rw "github.com/karincake/risoles"
|
||||||
|
sf "github.com/karincake/semprit"
|
||||||
|
|
||||||
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo"
|
||||||
|
u "simrs-vx/internal/use-case/main-use-case/chemo"
|
||||||
)
|
)
|
||||||
|
|
||||||
type myBase struct{}
|
type myBase struct{}
|
||||||
@@ -45,7 +41,8 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
dto := e.ReadDetailDto{}
|
dto := e.ReadDetailDto{}
|
||||||
dto.Id = uint16(id)
|
sf.UrlQueryParam(&dto, *r.URL)
|
||||||
|
dto.Id = uint(id)
|
||||||
res, err := u.ReadDetail(dto)
|
res, err := u.ReadDetail(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
@@ -60,7 +57,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
|
|||||||
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dto.Id = uint16(id)
|
dto.Id = uint(id)
|
||||||
res, err := u.Update(dto)
|
res, err := u.Update(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
@@ -72,7 +69,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dto := e.DeleteDto{}
|
dto := e.DeleteDto{}
|
||||||
dto.Id = uint16(id)
|
dto.Id = uint(id)
|
||||||
res, err := u.Delete(dto)
|
res, err := u.Delete(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
@@ -88,7 +85,7 @@ func (obj myBase) Verify(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dto.Id = uint16(id)
|
dto.Id = uint(id)
|
||||||
authInfo, err := pa.GetAuthInfo(r)
|
authInfo, err := pa.GetAuthInfo(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
|
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
|
||||||
@@ -107,7 +104,7 @@ func (obj myBase) Reject(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dto := e.VerifyDto{}
|
dto := e.VerifyDto{}
|
||||||
dto.Id = uint16(id)
|
dto.Id = uint(id)
|
||||||
authInfo, err := pa.GetAuthInfo(r)
|
authInfo, err := pa.GetAuthInfo(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
|
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
|
||||||
|
|||||||
@@ -325,7 +325,7 @@ func (obj myBase) CreateWithPatient(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// validate SubClass
|
// validate SubClass
|
||||||
if err := verifyClassCode(dto.Encounter); err != nil {
|
if err := verifyClassCode(dto.CreateDto); err != nil {
|
||||||
rw.DataResponse(w, nil, d.FieldError{
|
rw.DataResponse(w, nil, d.FieldError{
|
||||||
Code: dataValidationFail,
|
Code: dataValidationFail,
|
||||||
Message: err.Error(),
|
Message: err.Error(),
|
||||||
@@ -333,7 +333,7 @@ func (obj myBase) CreateWithPatient(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dto.Encounter.AuthInfo = *authInfo
|
dto.AuthInfo = *authInfo
|
||||||
dto.Patient.AuthInfo = *authInfo
|
dto.Patient.AuthInfo = *authInfo
|
||||||
res, err := u.CreateWithPatient(dto)
|
res, err := u.CreateWithPatient(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
|
|||||||
@@ -71,3 +71,12 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
|
|||||||
res, err := u.Delete(dto)
|
res, err := u.Delete(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (obj myBase) CreateBulk(w http.ResponseWriter, r *http.Request) {
|
||||||
|
dto := e.CreateBulkDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := u.CreateBulk(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
ambulancetransportrequest "simrs-vx/internal/interface/main-handler/ambulance-transport-req"
|
ambulancetransportrequest "simrs-vx/internal/interface/main-handler/ambulance-transport-req"
|
||||||
auth "simrs-vx/internal/interface/main-handler/authentication"
|
auth "simrs-vx/internal/interface/main-handler/authentication"
|
||||||
chemo "simrs-vx/internal/interface/main-handler/chemo"
|
chemo "simrs-vx/internal/interface/main-handler/chemo"
|
||||||
chemoprotocol "simrs-vx/internal/interface/main-handler/chemo-protocol"
|
|
||||||
consultation "simrs-vx/internal/interface/main-handler/consultation"
|
consultation "simrs-vx/internal/interface/main-handler/consultation"
|
||||||
controlletter "simrs-vx/internal/interface/main-handler/control-letter"
|
controlletter "simrs-vx/internal/interface/main-handler/control-letter"
|
||||||
counter "simrs-vx/internal/interface/main-handler/counter"
|
counter "simrs-vx/internal/interface/main-handler/counter"
|
||||||
@@ -43,6 +42,7 @@ import (
|
|||||||
screening "simrs-vx/internal/interface/main-handler/screening"
|
screening "simrs-vx/internal/interface/main-handler/screening"
|
||||||
soapi "simrs-vx/internal/interface/main-handler/soapi"
|
soapi "simrs-vx/internal/interface/main-handler/soapi"
|
||||||
uploadfile "simrs-vx/internal/interface/main-handler/upload-file"
|
uploadfile "simrs-vx/internal/interface/main-handler/upload-file"
|
||||||
|
vaccineData "simrs-vx/internal/interface/main-handler/vaccine-data"
|
||||||
|
|
||||||
/******************** actor ********************/
|
/******************** actor ********************/
|
||||||
authpartner "simrs-vx/internal/interface/main-handler/auth-partner"
|
authpartner "simrs-vx/internal/interface/main-handler/auth-partner"
|
||||||
@@ -82,6 +82,8 @@ import (
|
|||||||
/******************** sources ********************/
|
/******************** sources ********************/
|
||||||
antibioticsrc "simrs-vx/internal/interface/main-handler/antibiotic-src"
|
antibioticsrc "simrs-vx/internal/interface/main-handler/antibiotic-src"
|
||||||
antibioticsrccat "simrs-vx/internal/interface/main-handler/antibiotic-src-category"
|
antibioticsrccat "simrs-vx/internal/interface/main-handler/antibiotic-src-category"
|
||||||
|
chemoplan "simrs-vx/internal/interface/main-handler/chemo-plan"
|
||||||
|
chemoprotocol "simrs-vx/internal/interface/main-handler/chemo-protocol"
|
||||||
device "simrs-vx/internal/interface/main-handler/device"
|
device "simrs-vx/internal/interface/main-handler/device"
|
||||||
diagnosesrc "simrs-vx/internal/interface/main-handler/diagnose-src"
|
diagnosesrc "simrs-vx/internal/interface/main-handler/diagnose-src"
|
||||||
division "simrs-vx/internal/interface/main-handler/division"
|
division "simrs-vx/internal/interface/main-handler/division"
|
||||||
@@ -314,8 +316,20 @@ func SetRoutes() http.Handler {
|
|||||||
"PATCH /{id}/verify": therapyprotocol.O.Verify,
|
"PATCH /{id}/verify": therapyprotocol.O.Verify,
|
||||||
"PATCH /{id}/reject": therapyprotocol.O.Reject,
|
"PATCH /{id}/reject": therapyprotocol.O.Reject,
|
||||||
})
|
})
|
||||||
hc.RegCrud(r, "/v1/chemo-protocol", chemoprotocol.O)
|
hk.GroupRoutes("/v1/chemo-protocol", r, auth.GuardMW, hk.MapHandlerFunc{
|
||||||
|
"GET /": chemoprotocol.O.GetList,
|
||||||
|
"GET /{id}": chemoprotocol.O.GetDetail,
|
||||||
|
"POST /": chemoprotocol.O.Create,
|
||||||
|
"PATCH /{id}": chemoprotocol.O.Update,
|
||||||
|
"DELETE /{id}": chemoprotocol.O.Delete,
|
||||||
|
"PATCH /{id}/verify": chemoprotocol.O.Verify,
|
||||||
|
"PATCH /{id}/reject": chemoprotocol.O.Reject,
|
||||||
|
})
|
||||||
|
hk.GroupRoutes("/v1/chemo-plan", r, auth.GuardMW, hk.MapHandlerFunc{
|
||||||
|
"PATCH /{id}/fail": chemoplan.O.Fail,
|
||||||
|
})
|
||||||
hc.RegCrud(r, "/v1/upload-file", uploadfile.O)
|
hc.RegCrud(r, "/v1/upload-file", uploadfile.O)
|
||||||
|
hc.RegCrud(r, "/v1/vaccine-data", vaccineData.O)
|
||||||
hc.RegCrud(r, "/v1/encounter-document", encounterdocument.O)
|
hc.RegCrud(r, "/v1/encounter-document", encounterdocument.O)
|
||||||
hc.RegCrud(r, "/v1/general-consent", generalconsent.O)
|
hc.RegCrud(r, "/v1/general-consent", generalconsent.O)
|
||||||
r.HandleFunc("POST /v1/generate-file", generatefile.Generate)
|
r.HandleFunc("POST /v1/generate-file", generatefile.Generate)
|
||||||
@@ -366,10 +380,31 @@ func SetRoutes() http.Handler {
|
|||||||
/******************** sources ********************/
|
/******************** sources ********************/
|
||||||
hc.RegCrudByCode(r, "/v1/division", division.O)
|
hc.RegCrudByCode(r, "/v1/division", division.O)
|
||||||
hc.RegCrudByCode(r, "/v1/division-position", divisionposition.O)
|
hc.RegCrudByCode(r, "/v1/division-position", divisionposition.O)
|
||||||
hc.RegCrudByCode(r, "/v1/installation", installation.O)
|
hk.GroupRoutes("/v1/installation", r, hk.MapHandlerFunc{
|
||||||
|
"GET /": installation.O.GetList,
|
||||||
|
"GET /{id}": installation.O.GetDetail,
|
||||||
|
"POST /": installation.O.Create,
|
||||||
|
"PATCH /{id}": installation.O.Update,
|
||||||
|
"DELETE /{id}": installation.O.Delete,
|
||||||
|
"POST /bulk": installation.O.CreateBulk,
|
||||||
|
})
|
||||||
hc.RegCrudByCode(r, "/v1/installation-position", installationposition.O)
|
hc.RegCrudByCode(r, "/v1/installation-position", installationposition.O)
|
||||||
hc.RegCrudByCode(r, "/v1/specialist", specialist.O)
|
hk.GroupRoutes("/v1/specialist", r, hk.MapHandlerFunc{
|
||||||
hc.RegCrudByCode(r, "/v1/subspecialist", subspecialist.O)
|
"GET /": specialist.O.GetList,
|
||||||
|
"GET /{id}": specialist.O.GetDetail,
|
||||||
|
"POST /": specialist.O.Create,
|
||||||
|
"PATCH /{id}": specialist.O.Update,
|
||||||
|
"DELETE /{id}": specialist.O.Delete,
|
||||||
|
"POST /bulk": specialist.O.CreateBulk,
|
||||||
|
})
|
||||||
|
hk.GroupRoutes("/v1/subspecialist", r, hk.MapHandlerFunc{
|
||||||
|
"GET /": subspecialist.O.GetList,
|
||||||
|
"GET /{id}": subspecialist.O.GetDetail,
|
||||||
|
"POST /": subspecialist.O.Create,
|
||||||
|
"PATCH /{id}": subspecialist.O.Update,
|
||||||
|
"DELETE /{id}": subspecialist.O.Delete,
|
||||||
|
"POST /bulk": subspecialist.O.CreateBulk,
|
||||||
|
})
|
||||||
hc.RegCrudByCode(r, "/v1/specialist-position", specialistposition.O)
|
hc.RegCrudByCode(r, "/v1/specialist-position", specialistposition.O)
|
||||||
hc.RegCrudByCode(r, "/v1/subspecialist-position", subspecialistposition.O)
|
hc.RegCrudByCode(r, "/v1/subspecialist-position", subspecialistposition.O)
|
||||||
hc.RegCrudByCode(r, "/v1/infra", infra.O)
|
hc.RegCrudByCode(r, "/v1/infra", infra.O)
|
||||||
@@ -413,7 +448,9 @@ func SetRoutes() http.Handler {
|
|||||||
})
|
})
|
||||||
|
|
||||||
hk.GroupRoutes("/v1/vclaim-sep-control-letter", r, hk.MapHandlerFunc{
|
hk.GroupRoutes("/v1/vclaim-sep-control-letter", r, hk.MapHandlerFunc{
|
||||||
"POST /": vclaimsepcontrolletter.O.Create,
|
"POST /": vclaimsepcontrolletter.O.Create,
|
||||||
|
"GET /{number}": vclaimsepcontrolletter.O.GetDetail,
|
||||||
|
"DELETE /{number}": vclaimsepcontrolletter.O.Delete,
|
||||||
})
|
})
|
||||||
|
|
||||||
hk.GroupRoutes("/v1/vclaim-sep-hist", r, hk.MapHandlerFunc{
|
hk.GroupRoutes("/v1/vclaim-sep-hist", r, hk.MapHandlerFunc{
|
||||||
|
|||||||
@@ -71,3 +71,12 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
|
|||||||
res, err := u.Delete(dto)
|
res, err := u.Delete(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (obj myBase) CreateBulk(w http.ResponseWriter, r *http.Request) {
|
||||||
|
dto := e.CreateBulkDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := u.CreateBulk(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
@@ -71,3 +71,12 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
|
|||||||
res, err := u.Delete(dto)
|
res, err := u.Delete(dto)
|
||||||
rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (obj myBase) CreateBulk(w http.ResponseWriter, r *http.Request) {
|
||||||
|
dto := e.CreateBulkDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := u.CreateBulk(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package vaccinedata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
rw "github.com/karincake/risoles"
|
||||||
|
sf "github.com/karincake/semprit"
|
||||||
|
|
||||||
|
// ua "github.com/karincake/tumpeng/auth/svc"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/vaccine-data"
|
||||||
|
u "simrs-vx/internal/use-case/main-use-case/vaccine-data"
|
||||||
|
)
|
||||||
|
|
||||||
|
type myBase struct{}
|
||||||
|
|
||||||
|
var O myBase
|
||||||
|
|
||||||
|
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
|
||||||
|
dto := e.CreateDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := u.Create(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{}
|
||||||
|
sf.UrlQueryParam(&dto, *r.URL)
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
dto := e.UpdateDto{}
|
||||||
|
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dto.Id = uint(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
|
||||||
|
}
|
||||||
|
|
||||||
|
dto := e.DeleteDto{}
|
||||||
|
dto.Id = uint(id)
|
||||||
|
res, err := u.Delete(dto)
|
||||||
|
rw.DataResponse(w, res, err)
|
||||||
|
}
|
||||||
@@ -29,16 +29,16 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
|
|||||||
// rw.DataResponse(w, res, err)
|
// rw.DataResponse(w, res, err)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
|
func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
|
||||||
// number := rw.ValidateString(w, "number", r.PathValue("number"))
|
number := rw.ValidateString(w, "number", r.PathValue("number"))
|
||||||
// if number <= "" {
|
if number == "" {
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
// dto := e.ReadDetailDto{}
|
dto := e.ReadDetailDto{}
|
||||||
// dto.Number = &number
|
dto.Number = &number
|
||||||
// res, err := u.ReadDetail(dto)
|
res, err := u.ReadDetail(dto)
|
||||||
// rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
// }
|
}
|
||||||
|
|
||||||
// func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
|
// func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
|
||||||
// number := rw.ValidateString(w, "number", r.PathValue("number"))
|
// number := rw.ValidateString(w, "number", r.PathValue("number"))
|
||||||
@@ -55,13 +55,13 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
|
|||||||
// rw.DataResponse(w, res, err)
|
// rw.DataResponse(w, res, err)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
|
func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
|
||||||
// id := rw.ValidateInt(w, "id", r.PathValue("id"))
|
number := rw.ValidateString(w, "number", r.PathValue("number"))
|
||||||
// if id <= 0 {
|
if number == "" {
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
// dto := e.DeleteDto{}
|
dto := e.DeleteDto{}
|
||||||
// dto.Id = uint(id)
|
dto.Number = &number
|
||||||
// res, err := u.Delete(dto)
|
res, err := u.Delete(dto)
|
||||||
// rw.DataResponse(w, res, err)
|
rw.DataResponse(w, res, err)
|
||||||
// }
|
}
|
||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
/******************** infra ********************/
|
/******************** infra ********************/
|
||||||
gs "simrs-vx/internal/infra/gorm-setting"
|
gs "simrs-vx/internal/infra/gorm-setting"
|
||||||
|
satudb "simrs-vx/internal/infra/satu-db"
|
||||||
simgosdb "simrs-vx/internal/infra/simgos-db"
|
simgosdb "simrs-vx/internal/infra/simgos-db"
|
||||||
sync "simrs-vx/internal/infra/sync-cfg"
|
sync "simrs-vx/internal/infra/sync-cfg"
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@ func SetRoutes() http.Handler {
|
|||||||
a.RegisterExtCall(lh.Populate)
|
a.RegisterExtCall(lh.Populate)
|
||||||
a.RegisterExtCall(sync.SetConfig)
|
a.RegisterExtCall(sync.SetConfig)
|
||||||
a.RegisterExtCall(simgosdb.SetInstance)
|
a.RegisterExtCall(simgosdb.SetInstance)
|
||||||
|
a.RegisterExtCall(satudb.SetInstance)
|
||||||
|
|
||||||
r := http.NewServeMux()
|
r := http.NewServeMux()
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ func CreateSepControlLetter(input *e.CreateDto, data *e.VclaimSepControlLetter,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var vresp Response
|
var vresp e.VclaimResponse
|
||||||
if err := json.Unmarshal(body, &vresp); err != nil {
|
if err := json.Unmarshal(body, &vresp); err != nil {
|
||||||
return fmt.Errorf("failed to parse response JSON: %w", err)
|
return fmt.Errorf("failed to parse response JSON: %w", err)
|
||||||
}
|
}
|
||||||
@@ -55,71 +55,68 @@ func CreateSepControlLetter(input *e.CreateDto, data *e.VclaimSepControlLetter,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// func ReadDetailSep(input *e.ReadDetailDto, data *e.VclaimSep, tx *gorm.DB) error {
|
func DeleteSepControlLetter(input *e.DeleteDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error {
|
||||||
// endpoint := fmt.Sprintf("sep/%s", input.Number)
|
payload, err := input.RequestPayloadIntoJson()
|
||||||
// req, err := http.NewRequest("GET", ibpjs.O.BaseUrl+endpoint, nil)
|
if err != nil {
|
||||||
// if err != nil {
|
return err
|
||||||
// return err
|
}
|
||||||
// }
|
req, err := http.NewRequest("DELETE", ibpjs.O.BaseUrl+"RencanaKontrol/Delete", bytes.NewBuffer(payload))
|
||||||
// req.Header.Set("Content-Type", "application/json")
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
// resp, err := http.DefaultClient.Do(req)
|
resp, err := http.DefaultClient.Do(req)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
// body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
|
|
||||||
// var detail e.SepResponse
|
var vresp e.VclaimResponse
|
||||||
// if err := json.Unmarshal(body, &detail); err != nil {
|
if err := json.Unmarshal(body, &vresp); err != nil {
|
||||||
// return fmt.Errorf("failed to parse response JSON: %w", err)
|
return fmt.Errorf("failed to parse response JSON: %w", err)
|
||||||
// }
|
}
|
||||||
|
|
||||||
// data.Detail = detail.Response
|
if vresp.MetaData.Code != "200" {
|
||||||
|
return fmt.Errorf("failed to delete sep control letter: %s", vresp.MetaData.Message)
|
||||||
|
}
|
||||||
|
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
|
|
||||||
// func DeleteSep(input *e.DeleteDto, data *e.VclaimSep, tx *gorm.DB) error {
|
func GetDetailSepControlLetterByNumber(input *e.ReadDetailDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error {
|
||||||
// payload := e.SepDeleteRequest{}
|
req, err := http.NewRequest("GET", ibpjs.O.BaseUrl+"RencanaKontrol/noSuratKontrol/"+*input.Number, nil)
|
||||||
// payload.Request.TSep.NoSep = *input.Number
|
if err != nil {
|
||||||
// payload.Request.TSep.User = "Coba Ws"
|
return err
|
||||||
|
}
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
// jsonPayload, err := json.Marshal(payload)
|
resp, err := http.DefaultClient.Do(req)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
// req, err := http.NewRequest("DELETE", ibpjs.O.BaseUrl+"sep", bytes.NewBuffer(jsonPayload))
|
body, err := io.ReadAll(resp.Body)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
|
|
||||||
// req.Header.Set("Content-Type", "application/json")
|
var vresp e.DetailVclaimResponse
|
||||||
|
if err := json.Unmarshal(body, &vresp); err != nil {
|
||||||
|
return fmt.Errorf("failed to parse response JSON: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
// resp, err := http.DefaultClient.Do(req)
|
if vresp.MetaData.Code != "200" {
|
||||||
// if err != nil {
|
return fmt.Errorf("failed to get detail sep control letter by number: %s", vresp.MetaData.Message)
|
||||||
// return err
|
}
|
||||||
// }
|
|
||||||
// defer resp.Body.Close()
|
|
||||||
|
|
||||||
// body, err := io.ReadAll(resp.Body)
|
data.Detail = vresp.Response
|
||||||
// if err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var detail e.SepResponse
|
return nil
|
||||||
// if err := json.Unmarshal(body, &detail); err != nil {
|
}
|
||||||
// return fmt.Errorf("failed to parse response JSON: %w", err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if detail.MetaData.Message == SepNotFound {
|
|
||||||
// return fmt.Errorf("sep with number %s not found", *data.Number)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return nil
|
|
||||||
// }
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
package vclaimsepcontrolletter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SuratKontrol struct {
|
|
||||||
NoSuratKontrol string `json:"noSuratKontrol"`
|
|
||||||
TglRencanaKontrol string `json:"tglRencanaKontrol"`
|
|
||||||
TglTerbit string `json:"tglTerbit"`
|
|
||||||
JnsKontrol string `json:"jnsKontrol"`
|
|
||||||
PoliTujuan string `json:"poliTujuan"`
|
|
||||||
NamaPoliTujuan string `json:"namaPoliTujuan"`
|
|
||||||
KodeDokter string `json:"kodeDokter"`
|
|
||||||
NamaDokter string `json:"namaDokter"`
|
|
||||||
FlagKontrol string `json:"flagKontrol"`
|
|
||||||
KodeDokterPembuat *string `json:"kodeDokterPembuat"`
|
|
||||||
NamaDokterPembuat *string `json:"namaDokterPembuat"`
|
|
||||||
NamaJnsKontrol string `json:"namaJnsKontrol"`
|
|
||||||
Sep Sep `json:"sep"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Sep struct {
|
|
||||||
NoSep string `json:"noSep"`
|
|
||||||
TglSep string `json:"tglSep"`
|
|
||||||
JnsPelayanan string `json:"jnsPelayanan"`
|
|
||||||
Poli string `json:"poli"`
|
|
||||||
Diagnosa string `json:"diagnosa"`
|
|
||||||
Peserta Peserta `json:"peserta"`
|
|
||||||
ProvUmum ProvUmum `json:"provUmum"`
|
|
||||||
ProvPerujuk ProvPerujuk `json:"provPerujuk"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Peserta struct {
|
|
||||||
NoKartu string `json:"noKartu"`
|
|
||||||
Nama string `json:"nama"`
|
|
||||||
TglLahir string `json:"tglLahir"`
|
|
||||||
Kelamin string `json:"kelamin"`
|
|
||||||
HakKelas string `json:"hakKelas"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ProvUmum struct {
|
|
||||||
KdProvider string `json:"kdProvider"`
|
|
||||||
NmProvider string `json:"nmProvider"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ProvPerujuk struct {
|
|
||||||
KdProviderPerujuk string `json:"kdProviderPerujuk"`
|
|
||||||
NmProviderPerujuk string `json:"nmProviderPerujuk"`
|
|
||||||
AsalRujukan string `json:"asalRujukan"`
|
|
||||||
NoRujukan string `json:"noRujukan"`
|
|
||||||
TglRujukan string `json:"tglRujukan"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Response struct {
|
|
||||||
MetaData MetaData `json:"metaData"`
|
|
||||||
Response *SuratKontrol `json:"response"` // nullable
|
|
||||||
}
|
|
||||||
|
|
||||||
type MetaData struct {
|
|
||||||
Code string `json:"code"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r Response) ToPDFNeeds() ([]byte, error) {
|
|
||||||
response := e.ResponseForPDF{
|
|
||||||
Number: r.Response.Sep.NoSep,
|
|
||||||
PlannedControlDate: r.Response.TglRencanaKontrol,
|
|
||||||
IssuedDate: r.Response.TglTerbit,
|
|
||||||
Doctor_Name: r.Response.NamaDokter,
|
|
||||||
DstUnit_Name: r.Response.NamaPoliTujuan,
|
|
||||||
ResponsibleDoctor_Name: *r.Response.NamaDokterPembuat,
|
|
||||||
VclaimSep: e.VclaimSep{
|
|
||||||
VclaimMember: e.VclaimMember{
|
|
||||||
CardNumber: r.Response.Sep.Peserta.NoKartu,
|
|
||||||
Name: r.Response.Sep.Peserta.Nama,
|
|
||||||
BirthDate: r.Response.Sep.Peserta.TglLahir,
|
|
||||||
Gender: r.Response.Sep.Peserta.Kelamin,
|
|
||||||
},
|
|
||||||
Diagnose: r.Response.Sep.Diagnosa,
|
|
||||||
Number: r.Response.Sep.NoSep,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return json.Marshal(response)
|
|
||||||
}
|
|
||||||
@@ -9,4 +9,10 @@ func init() {
|
|||||||
createPreMw = append(createPreMw,
|
createPreMw = append(createPreMw,
|
||||||
createMw{Name: "create-sep-control-letter", Func: pvscl.CreateSepControlLetter},
|
createMw{Name: "create-sep-control-letter", Func: pvscl.CreateSepControlLetter},
|
||||||
)
|
)
|
||||||
|
readDetailPreMw = append(readDetailPreMw,
|
||||||
|
readDetailMw{Name: "get-detail-sep-control-letter-by-number", Func: pvscl.GetDetailSepControlLetterByNumber},
|
||||||
|
)
|
||||||
|
deletePreMw = append(deletePreMw,
|
||||||
|
DeleteMw{Name: "delete-sep-control-letter", Func: pvscl.DeleteSepControlLetter},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
@@ -30,7 +30,10 @@ type readDetailMw struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type UpdateMw = readDetailMw
|
type UpdateMw = readDetailMw
|
||||||
type DeleteMw = readDetailMw
|
type DeleteMw struct {
|
||||||
|
Name string
|
||||||
|
Func func(input *e.DeleteDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
var createPreMw []createMw // preprocess middleware
|
var createPreMw []createMw // preprocess middleware
|
||||||
var createPostMw []createMw // postprocess middleware
|
var createPostMw []createMw // postprocess middleware
|
||||||
@@ -40,5 +43,5 @@ var readDetailPreMw []readDetailMw
|
|||||||
var readDetailPostMw []readDetailMw
|
var readDetailPostMw []readDetailMw
|
||||||
var updatePreMw []readDetailMw
|
var updatePreMw []readDetailMw
|
||||||
var updatePostMw []readDetailMw
|
var updatePostMw []readDetailMw
|
||||||
var deletePreMw []readDetailMw
|
var deletePreMw []DeleteMw
|
||||||
var deletePostMw []readDetailMw
|
var deletePostMw []DeleteMw
|
||||||
@@ -0,0 +1,317 @@
|
|||||||
|
package chemo_plan
|
||||||
|
|
||||||
|
import (
|
||||||
|
ere "simrs-vx/internal/domain/references/encounter"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
|
d "github.com/karincake/dodol"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
ep "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
const source = "chemo-plan"
|
||||||
|
|
||||||
|
func Create(input ep.CreateDto) (*d.Data, error) {
|
||||||
|
data := []e.ChemoPlan{}
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Create",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "create")
|
||||||
|
|
||||||
|
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
input.Status_Code = erc.DVCNew
|
||||||
|
|
||||||
|
if resData, err := CreateData(&input, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
data = *resData
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.II{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "created",
|
||||||
|
},
|
||||||
|
Data: e.ToResponseList(data),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||||
|
var data *e.ChemoPlan
|
||||||
|
var dataList []e.ChemoPlan
|
||||||
|
var metaList *e.MetaDto
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "ReadList",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "readList")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if dataList, metaList, err = ReadListData(input, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "list-data",
|
||||||
|
"status": "fetched",
|
||||||
|
"page_number": strconv.Itoa(metaList.PageNumber),
|
||||||
|
"page_size": strconv.Itoa(metaList.PageSize),
|
||||||
|
"record_totalCount": strconv.Itoa(metaList.Count),
|
||||||
|
"record_currentCount": strconv.Itoa(len(dataList)),
|
||||||
|
},
|
||||||
|
Data: e.ToResponseList(dataList),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
||||||
|
var data *e.ChemoPlan
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "ReadDetail",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "readDetail")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if data, err = ReadDetailData(input, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "fetched",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Update(input e.UpdateDto) (*d.Data, error) {
|
||||||
|
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||||
|
var data *e.ChemoPlan
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Update",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "update")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||||
|
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := UpdateData(data, "", &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "updated",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||||
|
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||||
|
var data *e.ChemoPlan
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Delete",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "delete")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||||
|
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DeleteData(data, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "deleted",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fail(input e.FailDto) (*d.Data, error) {
|
||||||
|
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||||
|
var data *e.ChemoPlan
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Chemo-Fail",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "update")
|
||||||
|
|
||||||
|
if data, err = ReadDetailData(rdDto, &event); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dataSoapi, err := getSoapiByEncounterId(*data.Encounter_Id, &event)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if dataSoapi != nil && len(*dataSoapi) > 0 {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "soapi-exist",
|
||||||
|
Detail: "cancel soapi to proceed",
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(&event, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if *data.Status != ere.SPCPlanned {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "invalid-chemo-status",
|
||||||
|
Detail: "only chemo plans with status 'planned' can be deleted.",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
if err := UpdateFailData(input, data, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "updated",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
DESCRIPTION:
|
||||||
|
Any functions that are used internally by the use-case
|
||||||
|
*/
|
||||||
|
package chemo_plan
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
|
|
||||||
|
ere "simrs-vx/internal/domain/references/encounter"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
ep "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
||||||
|
es "simrs-vx/internal/domain/main-entities/soapi"
|
||||||
|
)
|
||||||
|
|
||||||
|
var now = time.Now()
|
||||||
|
|
||||||
|
func setDataCreate(input *ep.CreateDto) (data []e.ChemoPlan) {
|
||||||
|
for _, c := range *input.ChemoPlans {
|
||||||
|
data = append(data, e.ChemoPlan{
|
||||||
|
Parent_Id: input.Chemo_Id,
|
||||||
|
Protocol_Id: input.Id,
|
||||||
|
SeriesNumber: c.SeriesNumber,
|
||||||
|
CycleNumber: c.CycleNumber,
|
||||||
|
PlanDate: c.PlanDate,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDataCreateSoapi(data *e.ChemoPlan) {
|
||||||
|
data.RealizationDate = &now
|
||||||
|
|
||||||
|
status := ere.SPCComplete
|
||||||
|
data.Status = &status
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDataDeleteSoapi(data *e.ChemoPlan) {
|
||||||
|
status := ere.SPCPlanned
|
||||||
|
data.Status = &status
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDatafail(input e.FailDto, data *e.ChemoPlan) {
|
||||||
|
data.RealizationDate = nil
|
||||||
|
|
||||||
|
status := ere.SPCSchedule
|
||||||
|
data.Status = &status
|
||||||
|
|
||||||
|
var reasons []e.FailReason
|
||||||
|
|
||||||
|
if data.Reasons != nil {
|
||||||
|
json.Unmarshal([]byte(*data.Reasons), &reasons)
|
||||||
|
}
|
||||||
|
|
||||||
|
reasons = append(reasons, e.FailReason{
|
||||||
|
FailReason: input.Reasons,
|
||||||
|
Date: &now,
|
||||||
|
Encounter_Id: data.Encounter_Id,
|
||||||
|
})
|
||||||
|
|
||||||
|
if b, err := json.Marshal(reasons); err == nil {
|
||||||
|
jsonStr := string(b)
|
||||||
|
data.Reasons = &jsonStr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSoapiByEncounterId(encounterId uint, event *pl.Event) (*[]es.Soapi, error) {
|
||||||
|
pl.SetLogInfo(event, encounterId, "started", "DBReadDetail")
|
||||||
|
var data []es.Soapi
|
||||||
|
|
||||||
|
var tx = dg.I
|
||||||
|
|
||||||
|
if err := tx.
|
||||||
|
Model(&es.Soapi{}).
|
||||||
|
Where(`"Encounter_Id" = ?`, encounterId).
|
||||||
|
Find(&data).Error; err != nil {
|
||||||
|
if processedErr := pu.HandleReadError(err, event, source, encounterId, data); processedErr != nil {
|
||||||
|
return nil, processedErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
package chemo_plan
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
|
gh "github.com/karincake/getuk"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
ep "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CreateData(input *ep.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.ChemoPlan, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||||
|
|
||||||
|
data := setDataCreate(input)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Create(&data).Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ChemoPlan, *e.MetaDto, error) {
|
||||||
|
pl.SetLogInfo(event, input, "started", "DBReadList")
|
||||||
|
data := []e.ChemoPlan{}
|
||||||
|
pagination := gh.Pagination{}
|
||||||
|
count := int64(0)
|
||||||
|
meta := e.MetaDto{}
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
tx = tx.
|
||||||
|
Model(&e.ChemoPlan{}).
|
||||||
|
Scopes(gh.Preload(input.Includes)).
|
||||||
|
Scopes(gh.Filter(input.FilterDto)).
|
||||||
|
Count(&count).
|
||||||
|
Scopes(gh.Paginate(input, &pagination)).
|
||||||
|
Order("\"CreatedAt\" DESC")
|
||||||
|
|
||||||
|
if err := tx.Find(&data).Error; err != nil {
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
return nil, &meta, nil
|
||||||
|
}
|
||||||
|
return nil, nil, plh.HandleListError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
meta.Count = int(count)
|
||||||
|
meta.PageNumber = pagination.PageNumber
|
||||||
|
meta.PageSize = pagination.PageSize
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return data, &meta, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ChemoPlan, error) {
|
||||||
|
pl.SetLogInfo(event, input, "started", "DBReadDetail")
|
||||||
|
data := e.ChemoPlan{}
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.
|
||||||
|
Scopes(gh.Preload(input.Includes)).
|
||||||
|
First(&data, input.Id).
|
||||||
|
Error; err != nil {
|
||||||
|
|
||||||
|
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
|
||||||
|
return nil, processedErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateData(data *e.ChemoPlan, method string, event *pl.Event, dbx ...*gorm.DB) error {
|
||||||
|
pl.SetLogInfo(event, data, "started", "DBUpdate")
|
||||||
|
|
||||||
|
switch method {
|
||||||
|
case "c":
|
||||||
|
setDataCreateSoapi(data)
|
||||||
|
case "d":
|
||||||
|
setDataDeleteSoapi(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Save(&data).Error; err != nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-update-fail",
|
||||||
|
Detail: "Database update failed",
|
||||||
|
Raw: err,
|
||||||
|
}
|
||||||
|
return pl.SetLogError(event, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error {
|
||||||
|
pl.SetLogInfo(event, data, "started", "DBDelete")
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Delete(&data).Error; err != nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-delete-fail",
|
||||||
|
Detail: "Database delete failed",
|
||||||
|
Raw: err,
|
||||||
|
}
|
||||||
|
return pl.SetLogError(event, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateFailData(input e.FailDto, data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error {
|
||||||
|
pl.SetLogInfo(event, data, "started", "DBUpdate")
|
||||||
|
setDatafail(input, data)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Save(&data).Error; err != nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-update-fail",
|
||||||
|
Detail: "Database update failed",
|
||||||
|
Raw: err,
|
||||||
|
}
|
||||||
|
return pl.SetLogError(event, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package chemo_plan
|
||||||
|
|
||||||
|
import (
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type middlewareRunner struct {
|
||||||
|
Event *pl.Event
|
||||||
|
Tx *gorm.DB
|
||||||
|
MwType pu.MWType
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMiddlewareExecutor creates a new middleware executor
|
||||||
|
func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
|
||||||
|
return &middlewareRunner{
|
||||||
|
Event: event,
|
||||||
|
Tx: tx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecuteCreateMiddleware executes create middleware
|
||||||
|
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ChemoPlan) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ChemoPlan) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ChemoPlan) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ChemoPlan) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ChemoPlan) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) setMwType(mwType pu.MWType) {
|
||||||
|
me.MwType = mwType
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package chemo_plan
|
||||||
|
|
||||||
|
// example of middleware
|
||||||
|
// func init() {
|
||||||
|
// createPreMw = append(createPreMw,
|
||||||
|
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
|
||||||
|
// CreateMw{Name: "check-data", Func: pm.CheckData},
|
||||||
|
// )
|
||||||
|
// }
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
DESCRIPTION:
|
||||||
|
A sample, part of the package that contains type, constants, and/or variables.
|
||||||
|
|
||||||
|
In this sample it also provides type and variable regarding the needs of the
|
||||||
|
middleware to separate from main use-case which has the basic CRUD
|
||||||
|
functionality. The purpose of this is to make the code more maintainable.
|
||||||
|
*/
|
||||||
|
package chemo_plan
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
)
|
||||||
|
|
||||||
|
type createMw struct {
|
||||||
|
Name string
|
||||||
|
Func func(input *e.CreateDto, data *e.ChemoPlan, tx *gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type readListMw struct {
|
||||||
|
Name string
|
||||||
|
Func func(input *e.ReadListDto, data *e.ChemoPlan, tx *gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type readDetailMw struct {
|
||||||
|
Name string
|
||||||
|
Func func(input *e.ReadDetailDto, data *e.ChemoPlan, tx *gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type UpdateMw = readDetailMw
|
||||||
|
type DeleteMw = readDetailMw
|
||||||
|
|
||||||
|
var createPreMw []createMw // preprocess middleware
|
||||||
|
var createPostMw []createMw // postprocess middleware
|
||||||
|
var readListPreMw []readListMw // ..
|
||||||
|
var readListPostMw []readListMw // ..
|
||||||
|
var readDetailPreMw []readDetailMw
|
||||||
|
var readDetailPostMw []readDetailMw
|
||||||
|
var updatePreMw []readDetailMw
|
||||||
|
var updatePostMw []readDetailMw
|
||||||
|
var deletePreMw []readDetailMw
|
||||||
|
var deletePostMw []readDetailMw
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package chemo_protocol
|
package chemo_protocol
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
dg "github.com/karincake/apem/db-gorm-pg"
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
@@ -11,13 +12,22 @@ import (
|
|||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
|
|
||||||
|
ec "simrs-vx/internal/domain/main-entities/chemo"
|
||||||
e "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
e "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
||||||
|
ee "simrs-vx/internal/domain/main-entities/encounter"
|
||||||
|
|
||||||
|
uc "simrs-vx/internal/use-case/main-use-case/chemo"
|
||||||
|
ucp "simrs-vx/internal/use-case/main-use-case/chemo-plan"
|
||||||
|
ue "simrs-vx/internal/use-case/main-use-case/encounter"
|
||||||
)
|
)
|
||||||
|
|
||||||
const source = "chemo-protocol"
|
const source = "chemo-protocol"
|
||||||
|
|
||||||
func Create(input e.CreateDto) (*d.Data, error) {
|
func Create(input e.CreateDto) (*d.Data, error) {
|
||||||
data := e.ChemoProtocol{}
|
data := e.ChemoProtocol{}
|
||||||
|
var err error
|
||||||
|
|
||||||
event := pl.Event{
|
event := pl.Event{
|
||||||
Feature: "Create",
|
Feature: "Create",
|
||||||
@@ -27,23 +37,43 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
|||||||
// Start log
|
// Start log
|
||||||
pl.SetLogInfo(&event, input, "started", "create")
|
pl.SetLogInfo(&event, input, "started", "create")
|
||||||
|
|
||||||
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
if input.Patient_Id == nil {
|
||||||
mwRunner := newMiddlewareRunner(&event, tx)
|
// get encounter
|
||||||
mwRunner.setMwType(pu.MWTPre)
|
dataEncounter, err := ue.ReadDetailData(ee.ReadDetailDto{Id: *input.Encounter_Id}, &event)
|
||||||
// Run pre-middleware
|
if err != nil {
|
||||||
if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil {
|
return nil, err
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input.Patient_Id = dataEncounter.Patient_Id
|
||||||
|
input.Status_Code = erc.DVCNew
|
||||||
|
}
|
||||||
|
|
||||||
|
// get chemo
|
||||||
|
dataChemo, err := uc.ReadDetailData(ec.ReadDetailDto{Id: *input.Chemo_Id}, &event)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if dataChemo.Status_Code != erc.DVCVerified {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-validation-fail",
|
||||||
|
Detail: "chemo must be verified",
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(&event, input)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
// Insert Chemo-Protocol
|
||||||
if resData, err := CreateData(input, &event, tx); err != nil {
|
if resData, err := CreateData(input, &event, tx); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
data = *resData
|
data = *resData
|
||||||
}
|
}
|
||||||
|
|
||||||
mwRunner.setMwType(pu.MWTPost)
|
// Insert Chemo-Plans
|
||||||
// Run post-middleware
|
input.Id = &data.Id
|
||||||
if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil {
|
if data.ChemoPlans, err = ucp.CreateData(&input, &event, tx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +110,15 @@ func ReadList(input e.ReadListDto) (*d.Data, error) {
|
|||||||
// Start log
|
// Start log
|
||||||
pl.SetLogInfo(&event, input, "started", "readList")
|
pl.SetLogInfo(&event, input, "started", "readList")
|
||||||
|
|
||||||
|
if input.Patient_Id == nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-validation-fail",
|
||||||
|
Detail: "patient-id is required",
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(&event, input)
|
||||||
|
}
|
||||||
|
|
||||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
mwRunner := newMiddlewareRunner(&event, tx)
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
mwRunner.setMwType(pu.MWTPre)
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
@@ -275,3 +314,65 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Verify(input e.VerifyDto) (*d.Data, error) {
|
||||||
|
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||||
|
var data *e.ChemoProtocol
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Verify",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "verify")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||||
|
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Status_Code != erc.DVCNew {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-state-mismatch",
|
||||||
|
Detail: "data is not new",
|
||||||
|
Raw: errors.New("data is not new"),
|
||||||
|
}
|
||||||
|
return pl.SetLogError(&event, input)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.VerifiedAt = pu.GetTimeNow()
|
||||||
|
data.Status_Code = erc.DVCVerified
|
||||||
|
data.VerifiedBy_User_Id = &input.AuthInfo.User_Id
|
||||||
|
|
||||||
|
err = tx.Save(&data).Error
|
||||||
|
if err != nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-update-fail",
|
||||||
|
Detail: "Database update failed",
|
||||||
|
Raw: err,
|
||||||
|
}
|
||||||
|
return pl.SetLogError(&event, input)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "verify",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -17,9 +17,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ChemoProtocol) {
|
|||||||
inputSrc = &inputTemp.CreateDto
|
inputSrc = &inputTemp.CreateDto
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data.Chemo_Id = inputSrc.Chemo_Id
|
||||||
data.Patient_Weight = inputSrc.Patient_Weight
|
data.Patient_Weight = inputSrc.Patient_Weight
|
||||||
data.Patient_Height = inputSrc.Patient_Height
|
data.Patient_Height = inputSrc.Patient_Height
|
||||||
data.Diagnoses = inputSrc.Diagnoses
|
data.Diagnoses = inputSrc.Diagnoses
|
||||||
|
data.Interval = inputSrc.Interval
|
||||||
|
data.Cycle = inputSrc.Cycle
|
||||||
|
data.Series = inputSrc.Series
|
||||||
data.StartDate = inputSrc.StartDate
|
data.StartDate = inputSrc.StartDate
|
||||||
data.EndDate = inputSrc.EndDate
|
data.EndDate = inputSrc.EndDate
|
||||||
|
data.Status_Code = inputSrc.Status_Code
|
||||||
|
data.Patient_Id = inputSrc.Patient_Id
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,6 @@ package chemo_protocol
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
plh "simrs-vx/pkg/lib-helper"
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
pl "simrs-vx/pkg/logger"
|
pl "simrs-vx/pkg/logger"
|
||||||
pu "simrs-vx/pkg/use-case-helper"
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
|||||||
@@ -4,10 +4,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
e "simrs-vx/internal/domain/main-entities/chemo"
|
|
||||||
|
|
||||||
erc "simrs-vx/internal/domain/references/common"
|
|
||||||
|
|
||||||
dg "github.com/karincake/apem/db-gorm-pg"
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
d "github.com/karincake/dodol"
|
d "github.com/karincake/dodol"
|
||||||
|
|
||||||
@@ -15,9 +11,13 @@ import (
|
|||||||
pu "simrs-vx/pkg/use-case-helper"
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/chemo"
|
||||||
)
|
)
|
||||||
|
|
||||||
const source = "division"
|
const source = "chemo"
|
||||||
|
|
||||||
func Create(input e.CreateDto) (*d.Data, error) {
|
func Create(input e.CreateDto) (*d.Data, error) {
|
||||||
data := e.Chemo{}
|
data := e.Chemo{}
|
||||||
@@ -70,7 +70,6 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ReadList(input e.ReadListDto) (*d.Data, error) {
|
func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||||
var data *e.Chemo
|
|
||||||
var dataList []e.Chemo
|
var dataList []e.Chemo
|
||||||
var metaList *e.MetaDto
|
var metaList *e.MetaDto
|
||||||
var err error
|
var err error
|
||||||
@@ -83,28 +82,17 @@ func ReadList(input e.ReadListDto) (*d.Data, error) {
|
|||||||
// Start log
|
// Start log
|
||||||
pl.SetLogInfo(&event, input, "started", "readList")
|
pl.SetLogInfo(&event, input, "started", "readList")
|
||||||
|
|
||||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
if input.Patient_Id == nil {
|
||||||
mwRunner := newMiddlewareRunner(&event, tx)
|
event.Status = "failed"
|
||||||
mwRunner.setMwType(pu.MWTPre)
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
// Run pre-middleware
|
Code: "data-validation-fail",
|
||||||
if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil {
|
Detail: "patient-id is required",
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
return nil, pl.SetLogError(&event, input)
|
||||||
|
}
|
||||||
|
|
||||||
if dataList, metaList, err = ReadListData(input, &event, tx); err != nil {
|
input.Encounter_Id = nil
|
||||||
return err
|
if dataList, metaList, err = ReadListData(input, &event); err != nil {
|
||||||
}
|
|
||||||
|
|
||||||
mwRunner.setMwType(pu.MWTPost)
|
|
||||||
// Run post-middleware
|
|
||||||
if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,6 +122,15 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
|||||||
// Start log
|
// Start log
|
||||||
pl.SetLogInfo(&event, input, "started", "readDetail")
|
pl.SetLogInfo(&event, input, "started", "readDetail")
|
||||||
|
|
||||||
|
if input.Encounter_Id == nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-validation-fail",
|
||||||
|
Detail: "Encounter-Id is required",
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(&event, input)
|
||||||
|
}
|
||||||
|
|
||||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
mwRunner := newMiddlewareRunner(&event, tx)
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
mwRunner.setMwType(pu.MWTPre)
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
@@ -309,10 +306,12 @@ func Verify(input e.VerifyDto) (*d.Data, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
data.VerifiedAt = pu.GetTimeNow()
|
data.VerifiedAt = pu.GetTimeNow()
|
||||||
data.Status_Code = input.Status_Code
|
data.Status_Code = erc.DVCVerified
|
||||||
data.VerifiedBy_User_Id = &input.AuthInfo.User_Id
|
data.VerifiedBy_User_Id = &input.AuthInfo.User_Id
|
||||||
data.Bed = input.Bed
|
data.Bed = input.Bed
|
||||||
data.Needs = input.Needs
|
data.Needs = input.Needs
|
||||||
|
data.Doctor_Code = input.Doctor_Code
|
||||||
|
data.NextChemoDate = input.NextChemoDate
|
||||||
|
|
||||||
err = tx.Save(&data).Error
|
err = tx.Save(&data).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -20,4 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Chemo) {
|
|||||||
data.Encounter_Id = inputSrc.Encounter_Id
|
data.Encounter_Id = inputSrc.Encounter_Id
|
||||||
data.Status_Code = inputSrc.Status_Code
|
data.Status_Code = inputSrc.Status_Code
|
||||||
data.Specialist_Code = inputSrc.Specialist_Code
|
data.Specialist_Code = inputSrc.Specialist_Code
|
||||||
|
data.Class_Code = inputSrc.Class_Code
|
||||||
}
|
}
|
||||||
@@ -47,8 +47,16 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch
|
|||||||
tx = dg.I
|
tx = dg.I
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if input.Class_Code != "" {
|
||||||
|
tx = tx.Where(`"Chemo"."Class_Code" = ?`, input.Class_Code)
|
||||||
|
input.Class_Code = ""
|
||||||
|
}
|
||||||
|
|
||||||
tx = tx.
|
tx = tx.
|
||||||
Model(&e.Chemo{}).
|
Model(&e.Chemo{}).
|
||||||
|
Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`).
|
||||||
|
Joins(`LEFT JOIN "Patient" "p" ON "e"."Patient_Id" = "p"."Id"`).
|
||||||
|
Where(`"p"."Id" = ?`, input.Patient_Id).
|
||||||
Scopes(gh.Preload(input.Includes)).
|
Scopes(gh.Preload(input.Includes)).
|
||||||
Scopes(gh.Filter(input.FilterDto)).
|
Scopes(gh.Filter(input.FilterDto)).
|
||||||
Count(&count).
|
Count(&count).
|
||||||
@@ -81,7 +89,10 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e
|
|||||||
tx = dg.I
|
tx = dg.I
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tx.First(&data, input.Id).Error; err != nil {
|
if err := tx.
|
||||||
|
Scopes(gh.Preload(input.Includes)).
|
||||||
|
Scopes(gh.Filter(input.FilterDto)).
|
||||||
|
First(&data, input.Id).Error; err != nil {
|
||||||
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
|
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
|
||||||
return nil, processedErr
|
return nil, processedErr
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -889,7 +889,7 @@ func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set doctor_code; nil indicates no change.
|
// Set doctor_code; nil indicates no change.
|
||||||
if input.Dst_Doctor_Code == nil {
|
if input.Dst_Doctor_Code == nil || *input.Dst_Doctor_Code == "" {
|
||||||
input.Dst_Doctor_Code = irData.Doctor_Code
|
input.Dst_Doctor_Code = irData.Doctor_Code
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1094,17 +1094,17 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) {
|
|||||||
pl.SetLogInfo(&event, input, "started", "create")
|
pl.SetLogInfo(&event, input, "started", "create")
|
||||||
|
|
||||||
roleAllowed := []string{string(erg.EPCReg)}
|
roleAllowed := []string{string(erg.EPCReg)}
|
||||||
err = validateAuth(input.Encounter.AuthInfo, roleAllowed, "create-encounter", &event)
|
err = validateAuth(input.AuthInfo, roleAllowed, "create-encounter", &event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate rehab by bpjs
|
// validate rehab by bpjs
|
||||||
if input.Encounter.RefTypeCode == ere.RTCBpjs &&
|
if input.RefTypeCode == ere.RTCBpjs &&
|
||||||
input.Encounter.Class_Code == ere.ECAmbulatory &&
|
input.Class_Code == ere.ECAmbulatory &&
|
||||||
ere.AmbulatoryClassCode(*input.Encounter.SubClass_Code) == ere.ACCRehab {
|
ere.AmbulatoryClassCode(*input.SubClass_Code) == ere.ACCRehab {
|
||||||
// get latest rehab data
|
// get latest rehab data
|
||||||
recentRehabData, err := getLatestRehabData(input.Encounter, &event)
|
recentRehabData, err := getLatestRehabData(input.CreateDto, &event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1115,18 +1115,18 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) {
|
|||||||
// If the mode is "series", verify whether the visit count still remains
|
// If the mode is "series", verify whether the visit count still remains
|
||||||
// and whether the series has not expired.
|
// and whether the series has not expired.
|
||||||
// If visitMode is "series", then get encounterAdm
|
// If visitMode is "series", then get encounterAdm
|
||||||
input.Encounter.VisitMode_Code, input.Encounter.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input.Encounter, &event)
|
input.VisitMode_Code, input.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input.CreateDto, &event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
input.Encounter.VisitMode_Code = ere.VMCAdm
|
input.VisitMode_Code = ere.VMCAdm
|
||||||
}
|
}
|
||||||
|
|
||||||
// When visitMode_Code is "series", load the associated SOAPI record to copy its values.
|
// When visitMode_Code is "series", load the associated SOAPI record to copy its values.
|
||||||
if input.Encounter.VisitMode_Code == ere.VMCSeries {
|
if input.VisitMode_Code == ere.VMCSeries {
|
||||||
// get data soapi
|
// get data soapi
|
||||||
recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.Encounter.RecentEncounterAdm, &event)
|
recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.RecentEncounterAdm, &event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1134,13 +1134,13 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check if patient is new in the hospital
|
// check if patient is new in the hospital
|
||||||
input.Encounter.NewStatus, err = identifyPatientStatus(input.Encounter)
|
input.NewStatus, err = identifyPatientStatus(input.CreateDto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
input.Encounter.Adm_Employee_Id = input.Encounter.AuthInfo.Employee_Id
|
input.Adm_Employee_Id = input.AuthInfo.Employee_Id
|
||||||
|
|
||||||
mwRunner := newMiddlewareRunner(&event, input.Encounter.Sync)
|
mwRunner := newMiddlewareRunner(&event, input.Sync)
|
||||||
|
|
||||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
// create patient
|
// create patient
|
||||||
@@ -1155,28 +1155,28 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create encounter
|
// create encounter
|
||||||
input.Encounter.Patient_Id = &patientId
|
input.Patient_Id = &patientId
|
||||||
if resData, err := CreateData(input.Encounter, &event, tx); err != nil {
|
if resData, err := CreateData(input.CreateDto, &event, tx); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
data = *resData
|
data = *resData
|
||||||
input.Encounter.Id = data.Id
|
input.Id = data.Id
|
||||||
}
|
}
|
||||||
|
|
||||||
// insert ambulatory/emergency/inpatient
|
// insert ambulatory/emergency/inpatient
|
||||||
err = insertdataClassCode(input.Encounter, recentSoapiDataforCopy, &event, tx)
|
err = insertdataClassCode(input.CreateDto, recentSoapiDataforCopy, &event, tx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// insert vclaimReference
|
// insert vclaimReference
|
||||||
if vr := input.Encounter.VclaimReference; vr != nil {
|
if vr := input.VclaimReference; vr != nil {
|
||||||
t, _ := time.Parse("2006-01-02", vr.TglRujukan)
|
t, _ := time.Parse("2006-01-02", vr.TglRujukan)
|
||||||
_, err = uv.CreateData(ev.CreateDto{
|
_, err = uv.CreateData(ev.CreateDto{
|
||||||
Encounter_Id: &data.Id,
|
Encounter_Id: &data.Id,
|
||||||
Date: &t,
|
Date: &t,
|
||||||
SrcCode: input.Encounter.Ref_Number,
|
SrcCode: input.Ref_Number,
|
||||||
SrcName: input.Encounter.RefSource_Name,
|
SrcName: input.RefSource_Name,
|
||||||
Number: &vr.NoSep}, &event, tx)
|
Number: &vr.NoSep}, &event, tx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ package encounter
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
un "simrs-vx/internal/use-case/main-use-case/nurse"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -24,9 +23,10 @@ import (
|
|||||||
ere "simrs-vx/internal/domain/references/encounter"
|
ere "simrs-vx/internal/domain/references/encounter"
|
||||||
erg "simrs-vx/internal/domain/references/organization"
|
erg "simrs-vx/internal/domain/references/organization"
|
||||||
|
|
||||||
eaeh "simrs-vx/internal/domain/main-entities/adm-employee-hist"
|
|
||||||
ea "simrs-vx/internal/domain/main-entities/ambulatory"
|
ea "simrs-vx/internal/domain/main-entities/ambulatory"
|
||||||
ec "simrs-vx/internal/domain/main-entities/chemo"
|
ec "simrs-vx/internal/domain/main-entities/chemo"
|
||||||
|
ecpl "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
ecp "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
||||||
edo "simrs-vx/internal/domain/main-entities/device-order"
|
edo "simrs-vx/internal/domain/main-entities/device-order"
|
||||||
ed "simrs-vx/internal/domain/main-entities/doctor"
|
ed "simrs-vx/internal/domain/main-entities/doctor"
|
||||||
ee "simrs-vx/internal/domain/main-entities/emergency"
|
ee "simrs-vx/internal/domain/main-entities/emergency"
|
||||||
@@ -42,12 +42,9 @@ import (
|
|||||||
ep "simrs-vx/internal/domain/main-entities/prescription"
|
ep "simrs-vx/internal/domain/main-entities/prescription"
|
||||||
epi "simrs-vx/internal/domain/main-entities/prescription-item"
|
epi "simrs-vx/internal/domain/main-entities/prescription-item"
|
||||||
er "simrs-vx/internal/domain/main-entities/rehab"
|
er "simrs-vx/internal/domain/main-entities/rehab"
|
||||||
erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist"
|
|
||||||
es "simrs-vx/internal/domain/main-entities/soapi"
|
es "simrs-vx/internal/domain/main-entities/soapi"
|
||||||
esp "simrs-vx/internal/domain/main-entities/specialist"
|
esp "simrs-vx/internal/domain/main-entities/specialist"
|
||||||
|
|
||||||
// udo "simrs-vx/internal/use-case/main-use-case/device-order"
|
|
||||||
uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist"
|
|
||||||
ua "simrs-vx/internal/use-case/main-use-case/ambulatory"
|
ua "simrs-vx/internal/use-case/main-use-case/ambulatory"
|
||||||
uc "simrs-vx/internal/use-case/main-use-case/chemo"
|
uc "simrs-vx/internal/use-case/main-use-case/chemo"
|
||||||
ud "simrs-vx/internal/use-case/main-use-case/doctor"
|
ud "simrs-vx/internal/use-case/main-use-case/doctor"
|
||||||
@@ -58,10 +55,10 @@ import (
|
|||||||
umi "simrs-vx/internal/use-case/main-use-case/medicine-mix"
|
umi "simrs-vx/internal/use-case/main-use-case/medicine-mix"
|
||||||
ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item"
|
ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item"
|
||||||
_ "simrs-vx/internal/use-case/main-use-case/nurse"
|
_ "simrs-vx/internal/use-case/main-use-case/nurse"
|
||||||
|
un "simrs-vx/internal/use-case/main-use-case/nurse"
|
||||||
up "simrs-vx/internal/use-case/main-use-case/prescription"
|
up "simrs-vx/internal/use-case/main-use-case/prescription"
|
||||||
upi "simrs-vx/internal/use-case/main-use-case/prescription-item"
|
upi "simrs-vx/internal/use-case/main-use-case/prescription-item"
|
||||||
ur "simrs-vx/internal/use-case/main-use-case/rehab"
|
ur "simrs-vx/internal/use-case/main-use-case/rehab"
|
||||||
urdh "simrs-vx/internal/use-case/main-use-case/responsible-doctor-hist"
|
|
||||||
us "simrs-vx/internal/use-case/main-use-case/soapi"
|
us "simrs-vx/internal/use-case/main-use-case/soapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -396,192 +393,6 @@ func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func upsertResponsibleDoctorHist(input erdh.CreateDto, event *pl.Event, dbx ...*gorm.DB) error {
|
|
||||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
|
||||||
|
|
||||||
var tx *gorm.DB
|
|
||||||
if len(dbx) > 0 {
|
|
||||||
tx = dbx[0]
|
|
||||||
} else {
|
|
||||||
tx = dg.I
|
|
||||||
}
|
|
||||||
|
|
||||||
var latest erdh.ResponsibleDoctorHist
|
|
||||||
err := tx.
|
|
||||||
Where("\"Encounter_Id\" = ?", input.Encounter_Id).
|
|
||||||
Order("\"CreatedAt\" DESC").
|
|
||||||
Limit(1).
|
|
||||||
First(&latest).Error
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case errors.Is(err, gorm.ErrRecordNotFound):
|
|
||||||
// Insert
|
|
||||||
if _, err = urdh.CreateData(input, event, tx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case err != nil:
|
|
||||||
event.Status = "failed"
|
|
||||||
event.ErrInfo = pl.ErrorInfo{
|
|
||||||
Code: "read-fail",
|
|
||||||
Detail: "Failed to read responsible doctor history",
|
|
||||||
Raw: err,
|
|
||||||
}
|
|
||||||
return pl.SetLogError(event, input)
|
|
||||||
default:
|
|
||||||
// Update
|
|
||||||
if err := tx.Model(&latest).Updates(map[string]interface{}{
|
|
||||||
"Doctor_Code": input.Doctor_Code,
|
|
||||||
"StartedAt": input.StartedAt,
|
|
||||||
"UpdatedAt": time.Now(),
|
|
||||||
}).Error; err != nil {
|
|
||||||
event.Status = "failed"
|
|
||||||
event.ErrInfo = pl.ErrorInfo{
|
|
||||||
Code: "update-fail",
|
|
||||||
Detail: "Failed to update responsible doctor history",
|
|
||||||
Raw: err,
|
|
||||||
}
|
|
||||||
return pl.SetLogError(event, input)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pl.SetLogInfo(event, input, "complete")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func upsertAdmEmployeeHist(input eaeh.CreateDto, event *pl.Event, dbx ...*gorm.DB) error {
|
|
||||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
|
||||||
|
|
||||||
var tx *gorm.DB
|
|
||||||
if len(dbx) > 0 {
|
|
||||||
tx = dbx[0]
|
|
||||||
} else {
|
|
||||||
tx = dg.I
|
|
||||||
}
|
|
||||||
|
|
||||||
var latest eaeh.AdmEmployeeHist
|
|
||||||
err := tx.
|
|
||||||
Where("\"Encounter_Id\" = ?", input.Encounter_Id).
|
|
||||||
Order("\"CreatedAt\" DESC").
|
|
||||||
Limit(1).
|
|
||||||
First(&latest).Error
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case errors.Is(err, gorm.ErrRecordNotFound):
|
|
||||||
// Insert
|
|
||||||
if _, err = uaeh.CreateData(input, event, tx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case err != nil:
|
|
||||||
event.Status = "failed"
|
|
||||||
event.ErrInfo = pl.ErrorInfo{
|
|
||||||
Code: "read-fail",
|
|
||||||
Detail: "Failed to read responsible doctor history",
|
|
||||||
Raw: err,
|
|
||||||
}
|
|
||||||
return pl.SetLogError(event, input)
|
|
||||||
|
|
||||||
default:
|
|
||||||
// Update
|
|
||||||
if err := tx.Model(&latest).Updates(map[string]interface{}{
|
|
||||||
"Employee_Id": input.Employee_Id,
|
|
||||||
"StartedAt": input.StartedAt,
|
|
||||||
"UpdatedAt": time.Now(),
|
|
||||||
}).Error; err != nil {
|
|
||||||
event.Status = "failed"
|
|
||||||
event.ErrInfo = pl.ErrorInfo{
|
|
||||||
Code: "update-fail",
|
|
||||||
Detail: "Failed to update responsible doctor history",
|
|
||||||
Raw: err,
|
|
||||||
}
|
|
||||||
return pl.SetLogError(event, input)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pl.SetLogInfo(event, input, "complete")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateLatestResponsibleDoctorHist(input e.CheckinDto, event *pl.Event, dbx ...*gorm.DB) error {
|
|
||||||
pl.SetLogInfo(event, "started", "DBUpdate")
|
|
||||||
|
|
||||||
var tx *gorm.DB
|
|
||||||
if len(dbx) > 0 {
|
|
||||||
tx = dbx[0]
|
|
||||||
} else {
|
|
||||||
tx = dg.I
|
|
||||||
}
|
|
||||||
|
|
||||||
subQuery := tx.
|
|
||||||
Select("\"Id\"").
|
|
||||||
Model(&erdh.ResponsibleDoctorHist{}).
|
|
||||||
Where("\"Encounter_Id\" = ?", input.Id).
|
|
||||||
Order("\"CreatedAt\" DESC").
|
|
||||||
Limit(1)
|
|
||||||
|
|
||||||
result := tx.
|
|
||||||
Model(&erdh.ResponsibleDoctorHist{}).
|
|
||||||
Where("\"Id\" = (?)", subQuery).
|
|
||||||
Update("\"FinishedAt\"", input.FinishedAt)
|
|
||||||
|
|
||||||
if result.Error != nil {
|
|
||||||
event.Status = "failed"
|
|
||||||
event.ErrInfo = pl.ErrorInfo{
|
|
||||||
Code: "data-update-fail",
|
|
||||||
Detail: "Database update failed",
|
|
||||||
Raw: result.Error,
|
|
||||||
}
|
|
||||||
return pl.SetLogError(event, input)
|
|
||||||
}
|
|
||||||
|
|
||||||
if result.RowsAffected == 0 {
|
|
||||||
pl.SetLogInfo(event, input, "no previous data found to update")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pl.SetLogInfo(event, nil, "complete")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateLatestAdmEmployeeHist(input e.CheckinDto, event *pl.Event, dbx ...*gorm.DB) error {
|
|
||||||
pl.SetLogInfo(event, "started", "DBUpdate")
|
|
||||||
|
|
||||||
var tx *gorm.DB
|
|
||||||
if len(dbx) > 0 {
|
|
||||||
tx = dbx[0]
|
|
||||||
} else {
|
|
||||||
tx = dg.I
|
|
||||||
}
|
|
||||||
|
|
||||||
subQuery := tx.
|
|
||||||
Select("\"Id\"").
|
|
||||||
Model(&eaeh.AdmEmployeeHist{}).
|
|
||||||
Where("\"Encounter_Id\" = ?", input.Id).
|
|
||||||
Order("\"CreatedAt\" DESC").
|
|
||||||
Limit(1)
|
|
||||||
|
|
||||||
result := tx.
|
|
||||||
Model(&eaeh.AdmEmployeeHist{}).
|
|
||||||
Where("\"Id\" = (?)", subQuery).
|
|
||||||
Update("\"FinishedAt\"", input.FinishedAt)
|
|
||||||
|
|
||||||
if result.Error != nil {
|
|
||||||
event.Status = "failed"
|
|
||||||
event.ErrInfo = pl.ErrorInfo{
|
|
||||||
Code: "data-update-fail",
|
|
||||||
Detail: "Database update failed",
|
|
||||||
Raw: result.Error,
|
|
||||||
}
|
|
||||||
return pl.SetLogError(event, input)
|
|
||||||
}
|
|
||||||
|
|
||||||
if result.RowsAffected == 0 {
|
|
||||||
pl.SetLogInfo(event, input, "no previous data found to update")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pl.SetLogInfo(event, nil, "complete")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSoapiByResponsibleDoctor(enc e.Encounter, event *pl.Event) (data []es.Soapi, err error) {
|
func getSoapiByResponsibleDoctor(enc e.Encounter, event *pl.Event) (data []es.Soapi, err error) {
|
||||||
pl.SetLogInfo(event, enc, "started", "DBReadList")
|
pl.SetLogInfo(event, enc, "started", "DBReadList")
|
||||||
|
|
||||||
@@ -849,13 +660,31 @@ func insertdataClassCode(input e.CreateDto, soapiData []es.CreateDto, event *pl.
|
|||||||
|
|
||||||
func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, event *pl.Event, tx *gorm.DB) (err error) {
|
func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, event *pl.Event, tx *gorm.DB) (err error) {
|
||||||
subCode := ere.AmbulatoryClassCode(*input.SubClass_Code)
|
subCode := ere.AmbulatoryClassCode(*input.SubClass_Code)
|
||||||
|
var chemoPlan *ecpl.ChemoPlan
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case subCode == ere.ACCChemo:
|
case subCode == ere.ACCChemo:
|
||||||
|
// validate if encounter Chemo valid
|
||||||
|
chemoPlan, err = validateChemo(*input.Patient_Id, event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if chemoPlan == nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-not-found",
|
||||||
|
Detail: "chemo plan not found",
|
||||||
|
}
|
||||||
|
|
||||||
|
return pl.SetLogError(event, input)
|
||||||
|
}
|
||||||
|
|
||||||
chemoCreate := ec.CreateDto{
|
chemoCreate := ec.CreateDto{
|
||||||
Encounter_Id: &input.Id,
|
Encounter_Id: &input.Id,
|
||||||
Status_Code: erc.DVCNew,
|
Status_Code: erc.DVCVerified,
|
||||||
Specialist_Code: input.Specialist_Code,
|
Specialist_Code: input.Specialist_Code,
|
||||||
|
Class_Code: ere.CCCAct,
|
||||||
}
|
}
|
||||||
|
|
||||||
// create data chemo
|
// create data chemo
|
||||||
@@ -864,6 +693,13 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set chemo-plan to planned
|
||||||
|
chemoPlan.Encounter_Id = &input.Id
|
||||||
|
err = updateChemoPlan(chemoPlan, event, tx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
case subCode == ere.ACCRehab:
|
case subCode == ere.ACCRehab:
|
||||||
rehabData := er.CreateDto{
|
rehabData := er.CreateDto{
|
||||||
Encounter_Id: &input.Id,
|
Encounter_Id: &input.Id,
|
||||||
@@ -1009,18 +845,18 @@ func getDoctors(doctorIds []string, event *pl.Event) ([]ed.Doctor, error) {
|
|||||||
return doctors, nil
|
return doctors, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateSpecialistCodes(unitCodes map[string]struct{}, event *pl.Event) error {
|
func validateSpecialistCodes(speCodes map[string]struct{}, event *pl.Event) error {
|
||||||
if len(unitCodes) > 0 {
|
if len(speCodes) > 0 {
|
||||||
var codes []string
|
var codes []string
|
||||||
for code := range unitCodes {
|
for code := range speCodes {
|
||||||
codes = append(codes, code)
|
codes = append(codes, code)
|
||||||
}
|
}
|
||||||
|
|
||||||
units, err := getSpecialists(codes, event)
|
specialists, err := getSpecialists(codes, event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to fetch units: %w", err)
|
return fmt.Errorf("failed to fetch units: %w", err)
|
||||||
}
|
}
|
||||||
if len(units) != len(codes) {
|
if len(specialists) != len(codes) {
|
||||||
event.Status = "failed"
|
event.Status = "failed"
|
||||||
event.ErrInfo = pl.ErrorInfo{
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
Code: "data-validation-fail",
|
Code: "data-validation-fail",
|
||||||
@@ -1056,3 +892,127 @@ func validateDoctorCodes(doctorCodes map[string]struct{}, event *pl.Event) error
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateChemoPlan(data *ecpl.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "getChemoFromEncounter")
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
err := tx.Model(&data).Updates(map[string]interface{}{
|
||||||
|
`"Status"`: ere.SPCPlanned,
|
||||||
|
`"Encounter_Id"`: data.Encounter_Id}).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getChemoProtocol(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "getChemoProtocol")
|
||||||
|
data := ecp.ChemoProtocol{}
|
||||||
|
|
||||||
|
var tx = dg.I
|
||||||
|
|
||||||
|
tx = tx.Model(&ecp.ChemoProtocol{}).
|
||||||
|
Joins(`LEFT JOIN "ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`).
|
||||||
|
Where(`"ChemoProtocol"."Patient_Id" = ?`, patientId).
|
||||||
|
Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB {
|
||||||
|
return db.
|
||||||
|
Where(`"Status" IS NULL OR "Status" = ?`, ere.SPCSchedule).
|
||||||
|
Order(`"Id" ASC`).
|
||||||
|
Limit(1)
|
||||||
|
}).
|
||||||
|
Order(`"CreatedAt" DESC`).
|
||||||
|
First(&data)
|
||||||
|
|
||||||
|
if err := tx.Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateChemo(patientId uint, event *pl.Event) (*ecpl.ChemoPlan, error) {
|
||||||
|
// get chemo adm
|
||||||
|
chemoAdm, err := getChemoAdm(patientId, event)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-not-found",
|
||||||
|
Detail: "patient doesn't have active chemo",
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, pl.SetLogError(event, patientId)
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate is chemo verified
|
||||||
|
if chemoAdm.Status_Code != erc.DVCVerified {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-not-match",
|
||||||
|
Detail: fmt.Sprintf("chemo not yet verified"),
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(event, chemoAdm)
|
||||||
|
}
|
||||||
|
|
||||||
|
// get chemo protocol
|
||||||
|
chemoProtocol, err := getChemoProtocol(patientId, event)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if chemoProtocol.Status_Code != erc.DVCVerified {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-not-match",
|
||||||
|
Detail: fmt.Sprintf("protocol chemo not yet verified"),
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(event, chemoProtocol)
|
||||||
|
}
|
||||||
|
|
||||||
|
if now.Before(*chemoProtocol.StartDate) || now.After(*chemoProtocol.EndDate) {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "invalid-date-range",
|
||||||
|
Detail: "chemo cannot be performed because the current date is outside the allowed treatment window.",
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(event, chemoProtocol)
|
||||||
|
}
|
||||||
|
|
||||||
|
if chemoProtocol.ChemoPlans == nil || len(*chemoProtocol.ChemoPlans) == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the first chemo plan
|
||||||
|
return &(*chemoProtocol.ChemoPlans)[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getChemoAdm(patientId uint, event *pl.Event) (*ec.Chemo, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "getChemoProtocol")
|
||||||
|
data := ec.Chemo{}
|
||||||
|
|
||||||
|
var tx = dg.I
|
||||||
|
|
||||||
|
tx = tx.Model(&ec.Chemo{}).
|
||||||
|
Joins(`LEFT JOIN "Encounter" e ON e."Id" = "Chemo"."Encounter_Id"`).
|
||||||
|
Where(`e."Patient_Id" = ? AND "Chemo"."Class_Code" = ?`, patientId, ere.CCCAdm).
|
||||||
|
Order(`"CreatedAt" DESC`).
|
||||||
|
First(&data)
|
||||||
|
|
||||||
|
if err := tx.Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -59,10 +59,11 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En
|
|||||||
} else {
|
} else {
|
||||||
tx = dg.I
|
tx = dg.I
|
||||||
}
|
}
|
||||||
|
|
||||||
tx = tx.Model(&e.Encounter{})
|
tx = tx.Model(&e.Encounter{})
|
||||||
|
|
||||||
if input.AuthInfo.Doctor_Code != nil {
|
if input.AuthInfo.Doctor_Code != nil {
|
||||||
tx.Where("\"Responsible_Doctor_Code\" = ?", *input.AuthInfo.Doctor_Code) //
|
tx = tx.Where("\"Responsible_Doctor_Code\" = ?", *input.AuthInfo.Doctor_Code) //
|
||||||
}
|
}
|
||||||
|
|
||||||
if input.StartDate != nil && input.EndDate != nil {
|
if input.StartDate != nil && input.EndDate != nil {
|
||||||
@@ -75,7 +76,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En
|
|||||||
|
|
||||||
if input.Patient_Identifier != nil {
|
if input.Patient_Identifier != nil {
|
||||||
tx = tx.Joins("JOIN \"Patient\" ON \"Patient\".\"Id\" = \"Encounter\".\"Patient_Id\"").
|
tx = tx.Joins("JOIN \"Patient\" ON \"Patient\".\"Id\" = \"Encounter\".\"Patient_Id\"").
|
||||||
Joins("JOIN \"Person\" ON \"Person\".\"Id\" = \"Patient\".\"Person_Id\"").Where("\"Person\".\"Name\" ILIKE ? OR \"Patient\".\"Number\" = ?", "%"+*input.Patient_Identifier+"%", *input.Patient_Identifier)
|
Joins("JOIN \"Person\" ON \"Person\".\"Id\" = \"Patient\".\"Person_Id\"").
|
||||||
|
Where("\"Person\".\"Name\" ILIKE ? OR \"Patient\".\"Number\" = ?", "%"+*input.Patient_Identifier+"%", *input.Patient_Identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: getuk lib need to be updated to support this
|
// TODO: getuk lib need to be updated to support this
|
||||||
@@ -91,10 +93,15 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En
|
|||||||
tx = tx.Where("\"Encounter\".\"PaymentMethod_Code\" = ?", *input.PaymentMethod_Code)
|
tx = tx.Where("\"Encounter\".\"PaymentMethod_Code\" = ?", *input.PaymentMethod_Code)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx = tx.Scopes(gh.Preload(input.Includes)).
|
if input.ChemoClass != nil {
|
||||||
Count(&count).
|
tx = tx.Joins(`RIGHT JOIN "Chemo" "c" ON "c"."Encounter_Id" = "Encounter"."Id"`).
|
||||||
Scopes(gh.Paginate(input, &pagination)).
|
Where(`"c"."Class_Code" = ?`, *input.ChemoClass)
|
||||||
Order("\"CreatedAt\" DESC")
|
}
|
||||||
|
|
||||||
|
// count
|
||||||
|
if err := tx.Count(&count).Error; err != nil {
|
||||||
|
return nil, nil, plh.HandleListError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
// tx.Debug().Scopes(gh.Preload(input.Includes)).
|
// tx.Debug().Scopes(gh.Preload(input.Includes)).
|
||||||
// Scopes(gh.Filter(input.FilterDto)).
|
// Scopes(gh.Filter(input.FilterDto)).
|
||||||
@@ -102,7 +109,11 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En
|
|||||||
// Scopes(gh.Paginate(input, &pagination)).
|
// Scopes(gh.Paginate(input, &pagination)).
|
||||||
// Order("\"CreatedAt\" DESC")
|
// Order("\"CreatedAt\" DESC")
|
||||||
|
|
||||||
if err := tx.Find(&data).Error; err != nil {
|
if err := tx.
|
||||||
|
Scopes(gh.Preload(input.Includes)).
|
||||||
|
Scopes(gh.Paginate(input, &pagination)).
|
||||||
|
Order("\"CreatedAt\" DESC").
|
||||||
|
Find(&data).Error; err != nil {
|
||||||
if err == gorm.ErrRecordNotFound {
|
if err == gorm.ErrRecordNotFound {
|
||||||
return nil, &meta, nil
|
return nil, &meta, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -328,6 +328,10 @@ func generateResumeTemplateData(resume er.Resume, event pl.Event, tx *gorm.DB) (
|
|||||||
templateData.DischargeMethod = rData.Management.DischargeMethod
|
templateData.DischargeMethod = rData.Management.DischargeMethod
|
||||||
templateData.Medications = rData.Medication.Medications
|
templateData.Medications = rData.Medication.Medications
|
||||||
templateData.Date = pu.GetTimeNow().Format("02-01-2006")
|
templateData.Date = pu.GetTimeNow().Format("02-01-2006")
|
||||||
|
// this below is just my guess
|
||||||
|
// templateData.ControlHealthcare = get from vclaim sep eg. III
|
||||||
|
// templateData.ControlUnit = get from vclaim sep eg. R.KERINCI - KLS 3
|
||||||
|
// templateData.ControlDate = get from vclaim sep eg. 2022-01-01
|
||||||
|
|
||||||
return &templateData, nil
|
return &templateData, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,10 +62,10 @@ type ResumePDF struct {
|
|||||||
ConditionOnDischarge string
|
ConditionOnDischarge string
|
||||||
DischargeMethod string
|
DischargeMethod string
|
||||||
Medications []er.MedicationEntry
|
Medications []er.MedicationEntry
|
||||||
// fasyankes
|
ControlHealthcare string
|
||||||
// date
|
ControlUnit string
|
||||||
// klinik
|
ControlDate string
|
||||||
Date string
|
Date string
|
||||||
}
|
}
|
||||||
|
|
||||||
type ScreeningPDF struct {
|
type ScreeningPDF struct {
|
||||||
|
|||||||
@@ -241,6 +241,40 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulk(input e.CreateBulkDto) (*d.Data, error) {
|
||||||
|
var data []e.Installation
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Create",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "create")
|
||||||
|
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
if resData, err := CreateBulkData(input.Value, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
data = *resData
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.II{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "created",
|
||||||
|
},
|
||||||
|
Data: e.ToResponseList(data),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error {
|
func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error {
|
||||||
var errMsg string
|
var errMsg string
|
||||||
inputLog := esync.SimxLogDto{
|
inputLog := esync.SimxLogDto{
|
||||||
|
|||||||
@@ -21,3 +21,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Installation) {
|
|||||||
data.Name = inputSrc.Name
|
data.Name = inputSrc.Name
|
||||||
data.EncounterClass_Code = inputSrc.EncounterClass_Code
|
data.EncounterClass_Code = inputSrc.EncounterClass_Code
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setBulkData(input []e.CreateDto) (data []e.Installation) {
|
||||||
|
for _, i := range input {
|
||||||
|
data = append(data, e.Installation{
|
||||||
|
Code: *i.Code,
|
||||||
|
Name: i.Name,
|
||||||
|
EncounterClass_Code: i.EncounterClass_Code,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package installation
|
package installation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
e "simrs-vx/internal/domain/main-entities/installation"
|
e "simrs-vx/internal/domain/main-entities/installation"
|
||||||
|
|
||||||
plh "simrs-vx/pkg/lib-helper"
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
@@ -147,3 +148,26 @@ func DeleteData(data *e.Installation, event *pl.Event, dbx ...*gorm.DB) error {
|
|||||||
pl.SetLogInfo(event, nil, "complete")
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulkData(input []e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.Installation, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBBulkCreate")
|
||||||
|
|
||||||
|
data := setBulkData(input)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
result := tx.Create(&data)
|
||||||
|
if err := result.Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Inserted:", result.RowsAffected)
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -47,7 +47,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr
|
|||||||
tx = dg.I
|
tx = dg.I
|
||||||
}
|
}
|
||||||
|
|
||||||
tx = tx.Debug().
|
tx = tx.
|
||||||
Model(&e.PrescriptionItem{}).
|
Model(&e.PrescriptionItem{}).
|
||||||
Scopes(gh.Preload(input.Includes)).
|
Scopes(gh.Preload(input.Includes)).
|
||||||
Scopes(gh.Filter(input.FilterDto)).
|
Scopes(gh.Filter(input.FilterDto)).
|
||||||
|
|||||||
@@ -2,19 +2,20 @@ package soapi
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
erc "simrs-vx/internal/domain/references/common"
|
pl "simrs-vx/pkg/logger"
|
||||||
esync "simrs-vx/internal/domain/sync-entities/log"
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
e "simrs-vx/internal/domain/main-entities/soapi"
|
|
||||||
|
|
||||||
dg "github.com/karincake/apem/db-gorm-pg"
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
d "github.com/karincake/dodol"
|
d "github.com/karincake/dodol"
|
||||||
|
|
||||||
pl "simrs-vx/pkg/logger"
|
|
||||||
pu "simrs-vx/pkg/use-case-helper"
|
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/soapi"
|
||||||
|
esync "simrs-vx/internal/domain/sync-entities/log"
|
||||||
|
|
||||||
|
ucp "simrs-vx/internal/use-case/main-use-case/chemo-plan"
|
||||||
)
|
)
|
||||||
|
|
||||||
const source = "soapi"
|
const source = "soapi"
|
||||||
@@ -41,13 +42,26 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
|||||||
return nil, pl.SetLogError(&event, input)
|
return nil, pl.SetLogError(&event, input)
|
||||||
}
|
}
|
||||||
|
|
||||||
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
chemoPlan, err := validateIfEncounterIsChemo(*input.Encounter_Id, "c", &event)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
if resData, err := CreateData(input, &event, tx); err != nil {
|
if resData, err := CreateData(input, &event, tx); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
data = *resData
|
data = *resData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update chemoPlan
|
||||||
|
if chemoPlan != nil {
|
||||||
|
chemoPlan.Encounter_Id = input.Encounter_Id
|
||||||
|
if err = ucp.UpdateData(chemoPlan, "c", &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// get detail for sync
|
// get detail for sync
|
||||||
soapiData, err := ReadDetailData(e.ReadDetailDto{
|
soapiData, err := ReadDetailData(e.ReadDetailDto{
|
||||||
Id: data.Id,
|
Id: data.Id,
|
||||||
@@ -238,6 +252,18 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update chemoPlan
|
||||||
|
chemoPlan, err := validateIfEncounterIsChemo(*data.Encounter_Id, "d", &event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if chemoPlan != nil {
|
||||||
|
if err = ucp.UpdateData(chemoPlan, "d", &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mwRunner.setMwType(pu.MWTPre)
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
// Run pre-middleware
|
// Run pre-middleware
|
||||||
if err = mwRunner.ExecuteIfSyncOn(func() error {
|
if err = mwRunner.ExecuteIfSyncOn(func() error {
|
||||||
|
|||||||
@@ -5,6 +5,17 @@ Any functions that are used internally by the use-case
|
|||||||
package soapi
|
package soapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
|
||||||
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
ere "simrs-vx/internal/domain/references/encounter"
|
||||||
|
|
||||||
|
ecpl "simrs-vx/internal/domain/main-entities/chemo-plan"
|
||||||
|
ecp "simrs-vx/internal/domain/main-entities/chemo-protocol"
|
||||||
|
ee "simrs-vx/internal/domain/main-entities/encounter"
|
||||||
e "simrs-vx/internal/domain/main-entities/soapi"
|
e "simrs-vx/internal/domain/main-entities/soapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -39,3 +50,77 @@ func setBulkData(input []e.CreateDto, encounterId uint) []e.Soapi {
|
|||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateIfEncounterIsChemo(encounterId uint, method string, event *pl.Event) (*ecpl.ChemoPlan, error) {
|
||||||
|
// get encounter
|
||||||
|
enc, err := getEncounter(encounterId, event)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encounter must be Ambulatory and NOT Rehab
|
||||||
|
a := enc.Ambulatory
|
||||||
|
if a == nil || a.Class_Code == ere.ACCRehab {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// get chemo protocol
|
||||||
|
chemo, err := getChemo(*enc.Patient_Id, enc.Id, event)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return nil, pl.SetLogError(event, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
if chemo.ChemoPlans == nil || len(*chemo.ChemoPlans) == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the first chemo plan
|
||||||
|
return &(*chemo.ChemoPlans)[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getEncounter(encounterId uint, event *pl.Event) (*ee.Encounter, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "getEncounter")
|
||||||
|
data := ee.Encounter{}
|
||||||
|
|
||||||
|
var tx = dg.I
|
||||||
|
|
||||||
|
err := tx.Model(&ee.Encounter{}).
|
||||||
|
Joins(`LEFT JOIN "Ambulatory" a ON a."Encounter_Id" = "Encounter"."Id"`).
|
||||||
|
Where(`"Encounter"."Id" = ?`, encounterId).
|
||||||
|
Where(`"Encounter"."Class_Code" = ?`, ere.ECAmbulatory).
|
||||||
|
Preload("Ambulatory").
|
||||||
|
First(&data).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getChemo(patientId, encounterId uint, event *pl.Event) (*ecp.ChemoProtocol, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "getChemo")
|
||||||
|
data := ecp.ChemoProtocol{}
|
||||||
|
|
||||||
|
var tx = dg.I
|
||||||
|
|
||||||
|
tx = tx.Model(&ecp.ChemoProtocol{}).
|
||||||
|
Joins(`LEFT JOIN "ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`).
|
||||||
|
Where(`"ChemoProtocol"."Patient_Id" = ?`, patientId).
|
||||||
|
Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB {
|
||||||
|
return db.
|
||||||
|
Where(`"Encounter_Id" = ?`, encounterId)
|
||||||
|
}).
|
||||||
|
First(&data)
|
||||||
|
|
||||||
|
if err := tx.Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -295,3 +295,37 @@ func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulk(input e.CreateBulkDto) (*d.Data, error) {
|
||||||
|
var data []e.Specialist
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "CreateBulk",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "create")
|
||||||
|
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
if resData, err := CreateBulkData(input.Value, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
data = *resData
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.II{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "created",
|
||||||
|
},
|
||||||
|
Data: e.ToResponseList(data),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -21,3 +21,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) {
|
|||||||
data.Name = inputSrc.Name
|
data.Name = inputSrc.Name
|
||||||
data.Installation_Code = inputSrc.Installation_Code
|
data.Installation_Code = inputSrc.Installation_Code
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setBulkData(input []e.CreateDto) (data []e.Specialist) {
|
||||||
|
for _, i := range input {
|
||||||
|
data = append(data, e.Specialist{
|
||||||
|
Code: i.Code,
|
||||||
|
Name: i.Name,
|
||||||
|
Installation_Code: i.Installation_Code,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package specialist
|
package specialist
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
e "simrs-vx/internal/domain/main-entities/specialist"
|
e "simrs-vx/internal/domain/main-entities/specialist"
|
||||||
|
|
||||||
plh "simrs-vx/pkg/lib-helper"
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
@@ -147,3 +148,26 @@ func DeleteData(data *e.Specialist, event *pl.Event, dbx ...*gorm.DB) error {
|
|||||||
pl.SetLogInfo(event, nil, "complete")
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulkData(input []e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.Specialist, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBBulkCreate")
|
||||||
|
|
||||||
|
data := setBulkData(input)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
result := tx.Create(&data)
|
||||||
|
if err := result.Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Inserted:", result.RowsAffected)
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -293,3 +293,37 @@ func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulk(input e.CreateBulkDto) (*d.Data, error) {
|
||||||
|
var data []e.Subspecialist
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "CreateBulk",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "create")
|
||||||
|
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
if resData, err := CreateBulkData(input.Value, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
data = *resData
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.II{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "created",
|
||||||
|
},
|
||||||
|
Data: e.ToResponseList(data),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ package subspecialist
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
e "simrs-vx/internal/domain/main-entities/subspecialist"
|
e "simrs-vx/internal/domain/main-entities/subspecialist"
|
||||||
|
"simrs-vx/internal/domain/main-entities/subspecialist/base"
|
||||||
)
|
)
|
||||||
|
|
||||||
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Subspecialist) {
|
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Subspecialist) {
|
||||||
@@ -21,3 +22,16 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Subspecialist) {
|
|||||||
data.Name = inputSrc.Name
|
data.Name = inputSrc.Name
|
||||||
data.Specialist_Code = inputSrc.Specialist_Code
|
data.Specialist_Code = inputSrc.Specialist_Code
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setBulkData(input []e.CreateDto) (data []e.Subspecialist) {
|
||||||
|
for _, i := range input {
|
||||||
|
data = append(data, e.Subspecialist{
|
||||||
|
Basic: base.Basic{
|
||||||
|
Code: i.Code,
|
||||||
|
Name: i.Name,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package subspecialist
|
package subspecialist
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
e "simrs-vx/internal/domain/main-entities/subspecialist"
|
e "simrs-vx/internal/domain/main-entities/subspecialist"
|
||||||
|
|
||||||
plh "simrs-vx/pkg/lib-helper"
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
@@ -147,3 +148,26 @@ func DeleteData(data *e.Subspecialist, event *pl.Event, dbx ...*gorm.DB) error {
|
|||||||
pl.SetLogInfo(event, nil, "complete")
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulkData(input []e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.Subspecialist, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBBulkCreate")
|
||||||
|
|
||||||
|
data := setBulkData(input)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
result := tx.Create(&data)
|
||||||
|
if err := result.Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Inserted:", result.RowsAffected)
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,303 @@
|
|||||||
|
package vaccinedata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/vaccine-data"
|
||||||
|
ue "simrs-vx/internal/use-case/main-use-case/encounter"
|
||||||
|
|
||||||
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
|
d "github.com/karincake/dodol"
|
||||||
|
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
const source = "vaccine-data"
|
||||||
|
|
||||||
|
func Create(input e.CreateDto) (*d.Data, error) {
|
||||||
|
data := e.VaccineData{}
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Create",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "create")
|
||||||
|
|
||||||
|
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if pu.IsDateBeforeNow(input.Vaccination_datetime) {
|
||||||
|
return errors.New("vaccination date is in the past")
|
||||||
|
}
|
||||||
|
if pu.IsDateBeforeNow(input.Vaccine_expiration_date) {
|
||||||
|
return errors.New("vaccine expiration date is in the past")
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if encounter is done
|
||||||
|
if ue.IsDone(*input.Encounter_Id, &event, tx) {
|
||||||
|
return errors.New("encounter is already done")
|
||||||
|
}
|
||||||
|
|
||||||
|
if resData, err := CreateData(input, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
data = *resData
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.II{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "created",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||||
|
var data *e.VaccineData
|
||||||
|
var dataList []e.VaccineData
|
||||||
|
var metaList *e.MetaDto
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "ReadList",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "readList")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if dataList, metaList, err = ReadListData(input, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "list-data",
|
||||||
|
"status": "fetched",
|
||||||
|
"page_number": strconv.Itoa(metaList.PageNumber),
|
||||||
|
"page_size": strconv.Itoa(metaList.PageSize),
|
||||||
|
"record_totalCount": strconv.Itoa(metaList.Count),
|
||||||
|
"record_currentCount": strconv.Itoa(len(dataList)),
|
||||||
|
},
|
||||||
|
Data: e.ToResponseList(dataList),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
||||||
|
var data *e.VaccineData
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "ReadDetail",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "readDetail")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if data, err = ReadDetailData(input, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "fetched",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Update(input e.UpdateDto) (*d.Data, error) {
|
||||||
|
rdDto := e.ReadDetailDto{Id: uint16(input.Id)}
|
||||||
|
var data *e.VaccineData
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Update",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "update")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||||
|
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if pu.IsDateBeforeNow(input.Vaccination_datetime) {
|
||||||
|
return errors.New("vaccination date is in the past")
|
||||||
|
}
|
||||||
|
if pu.IsDateBeforeNow(input.Vaccine_expiration_date) {
|
||||||
|
return errors.New("vaccine expiration date is in the past")
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if encounter is done
|
||||||
|
if ue.IsDone(*input.Encounter_Id, &event, tx) {
|
||||||
|
return errors.New("encounter is already done")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := UpdateData(input, data, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(&event, nil, "complete")
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "updated",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||||
|
rdDto := e.ReadDetailDto{Id: uint16(input.Id)}
|
||||||
|
var data *e.VaccineData
|
||||||
|
var err error
|
||||||
|
|
||||||
|
event := pl.Event{
|
||||||
|
Feature: "Delete",
|
||||||
|
Source: source,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start log
|
||||||
|
pl.SetLogInfo(&event, input, "started", "delete")
|
||||||
|
|
||||||
|
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||||
|
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||||
|
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner := newMiddlewareRunner(&event, tx)
|
||||||
|
mwRunner.setMwType(pu.MWTPre)
|
||||||
|
// Run pre-middleware
|
||||||
|
if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DeleteData(data, &event, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mwRunner.setMwType(pu.MWTPost)
|
||||||
|
// Run post-middleware
|
||||||
|
if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &d.Data{
|
||||||
|
Meta: d.IS{
|
||||||
|
"source": source,
|
||||||
|
"structure": "single-data",
|
||||||
|
"status": "deleted",
|
||||||
|
},
|
||||||
|
Data: data.ToResponse(),
|
||||||
|
}, nil
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
DESCRIPTION:
|
||||||
|
Any functions that are used internally by the use-case
|
||||||
|
*/
|
||||||
|
package vaccinedata
|
||||||
|
|
||||||
|
import (
|
||||||
|
e "simrs-vx/internal/domain/main-entities/vaccine-data"
|
||||||
|
)
|
||||||
|
|
||||||
|
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VaccineData) {
|
||||||
|
var inputSrc *e.CreateDto
|
||||||
|
if inputT, ok := any(input).(*e.CreateDto); ok {
|
||||||
|
inputSrc = inputT
|
||||||
|
} else {
|
||||||
|
inputTemp := any(input).(*e.UpdateDto)
|
||||||
|
inputSrc = &inputTemp.CreateDto
|
||||||
|
}
|
||||||
|
|
||||||
|
data.Encounter_Id = inputSrc.Encounter_Id
|
||||||
|
data.Vaccine_type_Code = inputSrc.Vaccine_type_Code
|
||||||
|
data.Vaccine_batch_number = inputSrc.Vaccine_batch_number
|
||||||
|
data.Vaccine_dose = inputSrc.Vaccine_dose
|
||||||
|
data.Dose_order = inputSrc.Dose_order
|
||||||
|
data.Injection_location = inputSrc.Injection_location
|
||||||
|
data.Vaccination_datetime = inputSrc.Vaccination_datetime
|
||||||
|
data.Vaccine_expiration_date = inputSrc.Vaccine_expiration_date
|
||||||
|
}
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
package vaccinedata
|
||||||
|
|
||||||
|
import (
|
||||||
|
e "simrs-vx/internal/domain/main-entities/vaccine-data"
|
||||||
|
|
||||||
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
|
||||||
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
|
gh "github.com/karincake/getuk"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.VaccineData, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||||
|
|
||||||
|
data := e.VaccineData{}
|
||||||
|
setData(&input, &data)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Create(&data).Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.VaccineData, *e.MetaDto, error) {
|
||||||
|
pl.SetLogInfo(event, input, "started", "DBReadList")
|
||||||
|
data := []e.VaccineData{}
|
||||||
|
pagination := gh.Pagination{}
|
||||||
|
count := int64(0)
|
||||||
|
meta := e.MetaDto{}
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
tx = tx.
|
||||||
|
Model(&e.VaccineData{}).
|
||||||
|
Scopes(gh.Preload(input.Includes)).
|
||||||
|
Scopes(gh.Filter(input.FilterDto)).
|
||||||
|
Count(&count).
|
||||||
|
Scopes(gh.Paginate(input, &pagination)).
|
||||||
|
Order("\"CreatedAt\" DESC")
|
||||||
|
|
||||||
|
if err := tx.Find(&data).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
return nil, &meta, nil
|
||||||
|
}
|
||||||
|
return nil, nil, plh.HandleListError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
meta.Count = int(count)
|
||||||
|
meta.PageNumber = pagination.PageNumber
|
||||||
|
meta.PageSize = pagination.PageSize
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return data, &meta, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.VaccineData, error) {
|
||||||
|
pl.SetLogInfo(event, input, "started", "DBReadDetail")
|
||||||
|
data := e.VaccineData{}
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if input.Includes != "" {
|
||||||
|
tx = tx.Scopes(gh.Preload(input.Includes))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.First(&data, input.Id).Error; err != nil {
|
||||||
|
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
|
||||||
|
return nil, processedErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateData(input e.UpdateDto, data *e.VaccineData, event *pl.Event, dbx ...*gorm.DB) error {
|
||||||
|
pl.SetLogInfo(event, data, "started", "DBUpdate")
|
||||||
|
setData(&input, data)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Save(&data).Error; err != nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-update-fail",
|
||||||
|
Detail: "Database update failed",
|
||||||
|
Raw: err,
|
||||||
|
}
|
||||||
|
return pl.SetLogError(event, input)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteData(data *e.VaccineData, event *pl.Event, dbx ...*gorm.DB) error {
|
||||||
|
pl.SetLogInfo(event, data, "started", "DBDelete")
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Delete(&data).Error; err != nil {
|
||||||
|
event.Status = "failed"
|
||||||
|
event.ErrInfo = pl.ErrorInfo{
|
||||||
|
Code: "data-delete-fail",
|
||||||
|
Detail: "Database delete failed",
|
||||||
|
Raw: err,
|
||||||
|
}
|
||||||
|
return pl.SetLogError(event, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package vaccinedata
|
||||||
|
|
||||||
|
import (
|
||||||
|
e "simrs-vx/internal/domain/main-entities/vaccine-data"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type middlewareRunner struct {
|
||||||
|
Event *pl.Event
|
||||||
|
Tx *gorm.DB
|
||||||
|
MwType pu.MWType
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMiddlewareExecutor creates a new middleware executor
|
||||||
|
func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
|
||||||
|
return &middlewareRunner{
|
||||||
|
Event: event,
|
||||||
|
Tx: tx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecuteCreateMiddleware executes create middleware
|
||||||
|
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.VaccineData) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.VaccineData) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VaccineData) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VaccineData) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VaccineData) error {
|
||||||
|
for _, middleware := range middlewares {
|
||||||
|
logData := pu.GetLogData(input, data)
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||||
|
|
||||||
|
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||||
|
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetLogInfo(me.Event, nil, "complete")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *middlewareRunner) setMwType(mwType pu.MWType) {
|
||||||
|
me.MwType = mwType
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package vaccinedata
|
||||||
|
|
||||||
|
// example of middleware
|
||||||
|
// func init() {
|
||||||
|
// createPreMw = append(createPreMw,
|
||||||
|
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
|
||||||
|
// CreateMw{Name: "check-data", Func: pm.CheckData},
|
||||||
|
// )
|
||||||
|
// }
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
DESCRIPTION:
|
||||||
|
A sample, part of the package that contains type, constants, and/or variables.
|
||||||
|
|
||||||
|
In this sample it also provides type and variable regarding the needs of the
|
||||||
|
middleware to separate from main use-case which has the basic CRUD
|
||||||
|
functionality. The purpose of this is to make the code more maintainable.
|
||||||
|
*/
|
||||||
|
package vaccinedata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
e "simrs-vx/internal/domain/main-entities/vaccine-data"
|
||||||
|
)
|
||||||
|
|
||||||
|
type createMw struct {
|
||||||
|
Name string
|
||||||
|
Func func(input *e.CreateDto, data *e.VaccineData, tx *gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type readListMw struct {
|
||||||
|
Name string
|
||||||
|
Func func(input *e.ReadListDto, data *e.VaccineData, tx *gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type readDetailMw struct {
|
||||||
|
Name string
|
||||||
|
Func func(input *e.ReadDetailDto, data *e.VaccineData, tx *gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type UpdateMw = readDetailMw
|
||||||
|
type DeleteMw = readDetailMw
|
||||||
|
|
||||||
|
var createPreMw []createMw // preprocess middleware
|
||||||
|
var createPostMw []createMw // postprocess middleware
|
||||||
|
var readListPreMw []readListMw // ..
|
||||||
|
var readListPostMw []readListMw // ..
|
||||||
|
var readDetailPreMw []readDetailMw
|
||||||
|
var readDetailPostMw []readDetailMw
|
||||||
|
var updatePreMw []readDetailMw
|
||||||
|
var updatePostMw []readDetailMw
|
||||||
|
var deletePreMw []readDetailMw
|
||||||
|
var deletePostMw []readDetailMw
|
||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
esimgos "simrs-vx/internal/domain/simgos-entities/m-instalasi"
|
esimgos "simrs-vx/internal/domain/simgos-entities/m-instalasi"
|
||||||
esync "simrs-vx/internal/domain/sync-entities/installation"
|
esync "simrs-vx/internal/domain/sync-entities/installation"
|
||||||
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MInstalasi) {
|
func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MInstalasi) {
|
||||||
@@ -56,3 +57,14 @@ func setDataSimxLink(simxId, simgosId uint) (data esync.InstallationLink) {
|
|||||||
data.Simgos_Id = simgosId
|
data.Simgos_Id = simgosId
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setBulkDataSimxLink(input []e.Installation) (data []esync.InstallationLink) {
|
||||||
|
for _, i := range input {
|
||||||
|
kode, _ := strconv.Atoi(i.Code)
|
||||||
|
data = append(data, esync.InstallationLink{
|
||||||
|
Simx_Id: uint(i.Id),
|
||||||
|
Simgos_Id: uint(kode),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package installation
|
package installation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
plh "simrs-vx/pkg/lib-helper"
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
pl "simrs-vx/pkg/logger"
|
pl "simrs-vx/pkg/logger"
|
||||||
pu "simrs-vx/pkg/use-case-helper"
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
@@ -212,3 +213,25 @@ func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB)
|
|||||||
pl.SetLogInfo(event, nil, "complete")
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulkLinkData(input []e.Installation, event *pl.Event, dbx ...*gorm.DB) (*[]esync.InstallationLink, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||||
|
data := setBulkDataSimxLink(input)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
result := tx.Create(&data)
|
||||||
|
if err := result.Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Inserted Link:", result.RowsAffected)
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ package specialist
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
erc "simrs-vx/internal/domain/references/common"
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
e "simrs-vx/internal/domain/main-entities/specialist"
|
e "simrs-vx/internal/domain/main-entities/specialist"
|
||||||
esimgos "simrs-vx/internal/domain/simgos-entities/m-polihfis"
|
esimgos "simrs-vx/internal/domain/simgos-entities/m-polihfis"
|
||||||
@@ -58,3 +59,14 @@ func setDataSimxLink(simxId, simgosId uint) (data esync.SpecialistLink) {
|
|||||||
data.Simgos_Id = simgosId
|
data.Simgos_Id = simgosId
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setBulkDataSimxLink(input []e.Specialist) (data []esync.SpecialistLink) {
|
||||||
|
for _, i := range input {
|
||||||
|
kode, _ := strconv.Atoi(i.Code)
|
||||||
|
data = append(data, esync.SpecialistLink{
|
||||||
|
Simx_Id: uint(i.Id),
|
||||||
|
Simgos_Id: uint(kode),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package specialist
|
package specialist
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
plh "simrs-vx/pkg/lib-helper"
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
pl "simrs-vx/pkg/logger"
|
pl "simrs-vx/pkg/logger"
|
||||||
pu "simrs-vx/pkg/use-case-helper"
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
@@ -30,7 +31,7 @@ func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esi
|
|||||||
tx = dg.IS["simrs"]
|
tx = dg.IS["simrs"]
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tx.Debug().Create(&data).Error; err != nil {
|
if err := tx.Create(&data).Error; err != nil {
|
||||||
return nil, plh.HandleCreateError(input, event, err)
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,3 +190,25 @@ func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB)
|
|||||||
pl.SetLogInfo(event, nil, "complete")
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulkLinkData(input []e.Specialist, event *pl.Event, dbx ...*gorm.DB) (*[]esync.SpecialistLink, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||||
|
data := setBulkDataSimxLink(input)
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
result := tx.Create(&data)
|
||||||
|
if err := result.Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(input, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Inserted Link:", result.RowsAffected)
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
erc "simrs-vx/internal/domain/references/common"
|
erc "simrs-vx/internal/domain/references/common"
|
||||||
//esimgos "simrs-vx/internal/domain/simgos-entities/specialist"
|
//esimgos "simrs-vx/internal/domain/simgos-entities/specialist"
|
||||||
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
||||||
esync "simrs-vx/internal/domain/sync-entities/specialist"
|
esync "simrs-vx/internal/domain/sync-entities/subspecialist"
|
||||||
)
|
)
|
||||||
|
|
||||||
//func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MPolihfis) {
|
//func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MPolihfis) {
|
||||||
@@ -30,7 +30,7 @@ import (
|
|||||||
// return
|
// return
|
||||||
//}
|
//}
|
||||||
|
|
||||||
func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.SpecialistSimxLog) {
|
func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.SubspecialistSimxLog) {
|
||||||
// encode to JSON
|
// encode to JSON
|
||||||
jsonData, _ := json.MarshalIndent(input.Payload, "", " ")
|
jsonData, _ := json.MarshalIndent(input.Payload, "", " ")
|
||||||
jsonString := string(jsonData)
|
jsonString := string(jsonData)
|
||||||
@@ -52,7 +52,7 @@ func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.SpecialistSimxLog) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func setDataSimxLink(simxId, simgosId uint) (data esync.SpecialistLink) {
|
func setDataSimxLink(simxId, simgosId uint) (data esync.SubspecialistLink) {
|
||||||
data.Simx_Id = simxId
|
data.Simx_Id = simxId
|
||||||
data.Simgos_Id = simgosId
|
data.Simgos_Id = simgosId
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package subspecialist
|
package subspecialist
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
plh "simrs-vx/pkg/lib-helper"
|
plh "simrs-vx/pkg/lib-helper"
|
||||||
pl "simrs-vx/pkg/logger"
|
pl "simrs-vx/pkg/logger"
|
||||||
pu "simrs-vx/pkg/use-case-helper"
|
pu "simrs-vx/pkg/use-case-helper"
|
||||||
@@ -9,9 +10,8 @@ import (
|
|||||||
dg "github.com/karincake/apem/db-gorm-pg"
|
dg "github.com/karincake/apem/db-gorm-pg"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
|
||||||
//esimgos "simrs-vx/internal/domain/simgos-entities/specialist"
|
|
||||||
esynclog "simrs-vx/internal/domain/sync-entities/log"
|
esynclog "simrs-vx/internal/domain/sync-entities/log"
|
||||||
esync "simrs-vx/internal/domain/sync-entities/specialist"
|
esync "simrs-vx/internal/domain/sync-entities/subspecialist"
|
||||||
)
|
)
|
||||||
|
|
||||||
var now = time.Now()
|
var now = time.Now()
|
||||||
@@ -106,7 +106,7 @@ var now = time.Now()
|
|||||||
// return nil
|
// return nil
|
||||||
//}
|
//}
|
||||||
|
|
||||||
func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.SpecialistLink, error) {
|
func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.SubspecialistLink, error) {
|
||||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||||
data := setDataSimxLink(simxId, simgosId)
|
data := setDataSimxLink(simxId, simgosId)
|
||||||
|
|
||||||
@@ -125,9 +125,9 @@ func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*e
|
|||||||
return &data, nil
|
return &data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.SpecialistLink, error) {
|
func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.SubspecialistLink, error) {
|
||||||
pl.SetLogInfo(event, simxId, "started", "DBReadDetail")
|
pl.SetLogInfo(event, simxId, "started", "DBReadDetail")
|
||||||
data := esync.SpecialistLink{}
|
data := esync.SubspecialistLink{}
|
||||||
|
|
||||||
var tx = dg.I
|
var tx = dg.I
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.SpecialistLink,
|
|||||||
return &data, nil
|
return &data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteLinkData(data *esync.SpecialistLink, event *pl.Event, dbx ...*gorm.DB) error {
|
func DeleteLinkData(data *esync.SubspecialistLink, event *pl.Event, dbx ...*gorm.DB) error {
|
||||||
pl.SetLogInfo(event, data, "started", "DBDelete")
|
pl.SetLogInfo(event, data, "started", "DBDelete")
|
||||||
|
|
||||||
var tx *gorm.DB
|
var tx *gorm.DB
|
||||||
@@ -185,3 +185,24 @@ func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB)
|
|||||||
pl.SetLogInfo(event, nil, "complete")
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateBulkLinkData(data []esync.SubspecialistLink, event *pl.Event, dbx ...*gorm.DB) (*[]esync.SubspecialistLink, error) {
|
||||||
|
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||||
|
|
||||||
|
var tx *gorm.DB
|
||||||
|
if len(dbx) > 0 {
|
||||||
|
tx = dbx[0]
|
||||||
|
} else {
|
||||||
|
tx = dg.I
|
||||||
|
}
|
||||||
|
|
||||||
|
result := tx.Create(&data)
|
||||||
|
if err := result.Error; err != nil {
|
||||||
|
return nil, plh.HandleCreateError(data, event, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Inserted Link:", result.RowsAffected)
|
||||||
|
|
||||||
|
pl.SetLogInfo(event, nil, "complete")
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
type Dto struct {
|
type Dto struct {
|
||||||
LoginNip []string `json:"loginNip"`
|
LoginNip []string `json:"loginNip"`
|
||||||
Instalasi_Code string `json:"instalasi_code"`
|
Instalasi_Code string `json:"instalasi_code"`
|
||||||
|
SeedTableName string `json:"seedTableName"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) {
|
func Send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) {
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package installation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
ere "simrs-vx/internal/domain/references/encounter"
|
||||||
|
db "simrs-vx/pkg/dualtrx-helper"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
ei "simrs-vx/internal/domain/main-entities/installation"
|
||||||
|
eu "simrs-vx/internal/domain/simgos-entities/m-unit"
|
||||||
|
|
||||||
|
ui "simrs-vx/internal/use-case/simgos-sync-use-case/new/installation"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SeedInstallation(event *pl.Event, tx *db.Dualtx) error {
|
||||||
|
unit := []eu.MUnit{}
|
||||||
|
|
||||||
|
// Get M_Unit
|
||||||
|
err := tx.Simgos.Model(&eu.MUnit{}).
|
||||||
|
Find(&unit).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error Querying MUnit:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mapping To Installation
|
||||||
|
var installationData []ei.CreateDto
|
||||||
|
for _, v := range unit {
|
||||||
|
|
||||||
|
codeString := strconv.Itoa(int(v.KodeUnit))
|
||||||
|
installationData = append(installationData, ei.CreateDto{
|
||||||
|
Name: v.NamaUnit,
|
||||||
|
EncounterClass_Code: ere.ECAmbulatory,
|
||||||
|
Code: &codeString,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
dataInstallation, err := CreateBulkInstallation(ei.CreateBulkDto{Value: installationData})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = ui.CreateBulkLinkData(dataInstallation, event, tx.Sync)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateBulkInstallation(ins ei.CreateBulkDto) ([]ei.Installation, error) {
|
||||||
|
var path = "installation/bulk"
|
||||||
|
|
||||||
|
// create request body
|
||||||
|
jsonData, err := json.Marshal(ins)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
reqBody := bytes.NewBuffer(jsonData)
|
||||||
|
// send data to main-api
|
||||||
|
resp, err := seeder.Send(http.MethodPost, path, reqBody, "von")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type MetaData struct {
|
||||||
|
Source string `json:"source"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Structure string `json:"structure"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MainApiResp struct {
|
||||||
|
Meta MetaData `json:"meta"`
|
||||||
|
Data []ei.Installation `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// getting response
|
||||||
|
var data MainApiResp
|
||||||
|
err = json.Unmarshal(resp, &data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return data.Data, nil
|
||||||
|
}
|
||||||
@@ -2,9 +2,6 @@ package seeder
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor"
|
|
||||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse"
|
|
||||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/regular"
|
|
||||||
|
|
||||||
db "simrs-vx/pkg/dualtrx-helper"
|
db "simrs-vx/pkg/dualtrx-helper"
|
||||||
pl "simrs-vx/pkg/logger"
|
pl "simrs-vx/pkg/logger"
|
||||||
@@ -14,6 +11,13 @@ import (
|
|||||||
el "simrs-vx/internal/domain/simgos-entities/m-login"
|
el "simrs-vx/internal/domain/simgos-entities/m-login"
|
||||||
|
|
||||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||||
|
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/installation"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/regular"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/specialist"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/subspecialist"
|
||||||
)
|
)
|
||||||
|
|
||||||
const source = "seeder"
|
const source = "seeder"
|
||||||
@@ -33,52 +37,69 @@ func SeedToSimx(input seeder.Dto) (*d.Data, error) {
|
|||||||
kddokter, kdperawat []uint
|
kddokter, kdperawat []uint
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get M_login
|
switch input.SeedTableName {
|
||||||
err := tx.Simgos.Model(&el.MLogin{}).
|
case "installation":
|
||||||
Select(`DISTINCT ON (nip) m_login.*`).
|
if err := installation.SeedInstallation(&event, tx); err != nil {
|
||||||
Where(`"nip" IN (?)`, input.LoginNip).
|
return nil, err
|
||||||
Find(&mlogin).Error
|
}
|
||||||
if err != nil {
|
case "specialist":
|
||||||
log.Println("Error Querying Mlogin:", err)
|
if err := specialist.SeedSpecialist(&event, tx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
case "subspecialist":
|
||||||
|
if err := subspecialist.SeedSubspecialist(&event, tx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
// SET data
|
default:
|
||||||
if len(mlogin) > 0 {
|
|
||||||
for _, l := range mlogin {
|
// Get M_login
|
||||||
if l.KdDokter != 0 {
|
err := tx.Simgos.Model(&el.MLogin{}).
|
||||||
kddokter = append(kddokter, l.KdDokter)
|
Select(`DISTINCT ON (nip) m_login.*`).
|
||||||
continue
|
Where(`"nip" IN (?)`, input.LoginNip).
|
||||||
|
Find(&mlogin).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error Querying Mlogin:", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET data
|
||||||
|
if len(mlogin) > 0 {
|
||||||
|
for _, l := range mlogin {
|
||||||
|
if l.KdDokter != 0 {
|
||||||
|
kddokter = append(kddokter, l.KdDokter)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if l.KdPerawat != 0 {
|
||||||
|
kdperawat = append(kdperawat, l.KdPerawat)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
regLogin = append(regLogin, l)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if l.KdPerawat != 0 {
|
// Seed based on role
|
||||||
kdperawat = append(kdperawat, l.KdPerawat)
|
if len(kddokter) > 0 {
|
||||||
continue
|
err = doctor.SeedDoctor(kddokter, &event, tx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
regLogin = append(regLogin, l)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Seed based on role
|
if len(kdperawat) > 0 {
|
||||||
if len(kddokter) > 0 {
|
err = nurse.SeedNurse(kdperawat, &event, tx)
|
||||||
err = doctor.SeedDoctor(kddokter, &event, tx)
|
if err != nil {
|
||||||
if err != nil {
|
return nil, err
|
||||||
return nil, err
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if len(kdperawat) > 0 {
|
if len(regLogin) > 0 {
|
||||||
err = nurse.SeedNurse(kdperawat, &event, tx)
|
err = regular.SeedRegular(regLogin, input.Instalasi_Code)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if len(regLogin) > 0 {
|
|
||||||
err = regular.SeedRegular(regLogin, input.Instalasi_Code)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,101 @@
|
|||||||
|
package specialist
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
db "simrs-vx/pkg/dualtrx-helper"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
es "simrs-vx/internal/domain/main-entities/specialist"
|
||||||
|
er "simrs-vx/internal/domain/simgos-entities/m-ruang"
|
||||||
|
|
||||||
|
us "simrs-vx/internal/use-case/simgos-sync-use-case/new/specialist"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SeedSpecialist(event *pl.Event, tx *db.Dualtx) error {
|
||||||
|
ruang := []er.MRuang{}
|
||||||
|
|
||||||
|
// Get M_Ruang
|
||||||
|
err := tx.Simgos.Model(&er.MRuang{}).
|
||||||
|
Find(&ruang).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error Querying MRuang:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mapping To Specialist
|
||||||
|
var speData []es.CreateDto
|
||||||
|
for _, v := range ruang {
|
||||||
|
if v.StAktif == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
speCode := strconv.Itoa(int(v.No))
|
||||||
|
|
||||||
|
var insCode *string
|
||||||
|
if v.KdUnit != 0 {
|
||||||
|
code := strconv.Itoa(v.KdUnit)
|
||||||
|
insCode = &code
|
||||||
|
}
|
||||||
|
|
||||||
|
speData = append(speData, es.CreateDto{
|
||||||
|
Code: speCode,
|
||||||
|
Name: v.Nama,
|
||||||
|
Installation_Code: insCode,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
dataSpe, err := CreateBulkSpecialist(es.CreateBulkDto{Value: speData})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = us.CreateBulkLinkData(dataSpe, event, tx.Sync)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateBulkSpecialist(ins es.CreateBulkDto) ([]es.Specialist, error) {
|
||||||
|
var path = "specialist/bulk"
|
||||||
|
|
||||||
|
// create request body
|
||||||
|
jsonData, err := json.Marshal(ins)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
reqBody := bytes.NewBuffer(jsonData)
|
||||||
|
// send data to main-api
|
||||||
|
resp, err := seeder.Send(http.MethodPost, path, reqBody, "von")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type MetaData struct {
|
||||||
|
Source string `json:"source"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Structure string `json:"structure"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MainApiResp struct {
|
||||||
|
Meta MetaData `json:"meta"`
|
||||||
|
Data []es.Specialist `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// getting response
|
||||||
|
var data MainApiResp
|
||||||
|
err = json.Unmarshal(resp, &data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return data.Data, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package subspecialist
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
db "simrs-vx/pkg/dualtrx-helper"
|
||||||
|
pl "simrs-vx/pkg/logger"
|
||||||
|
|
||||||
|
es "simrs-vx/internal/domain/main-entities/subspecialist"
|
||||||
|
eds "simrs-vx/internal/domain/satu-entities/daftar-specialist"
|
||||||
|
esb "simrs-vx/internal/domain/sync-entities/subspecialist"
|
||||||
|
|
||||||
|
us "simrs-vx/internal/use-case/simgos-sync-use-case/new/subspecialist"
|
||||||
|
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SeedSubspecialist(event *pl.Event, tx *db.Dualtx) error {
|
||||||
|
dspe := []eds.DaftarSpesialis{}
|
||||||
|
subspeMap := make(map[string]uint)
|
||||||
|
|
||||||
|
// Get Daftar Specialist
|
||||||
|
err := tx.Satu.Model(&eds.DaftarSpesialis{}).
|
||||||
|
Find(&dspe).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error Querying DaftarSpecialist:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mapping To Subspecialist
|
||||||
|
var speData []es.CreateDto
|
||||||
|
for _, v := range dspe {
|
||||||
|
speData = append(speData, es.CreateDto{
|
||||||
|
Code: v.Kode,
|
||||||
|
Name: v.Spesialis,
|
||||||
|
})
|
||||||
|
|
||||||
|
subspeMap[v.Kode] = v.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
dataSpe, err := CreateBulkSubSpecialist(es.CreateBulkDto{Value: speData})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// mapping link for subspecialist
|
||||||
|
var subspecliast []esb.SubspecialistLink
|
||||||
|
for _, v := range dataSpe {
|
||||||
|
subspecliast = append(subspecliast, esb.SubspecialistLink{
|
||||||
|
Simx_Id: uint(v.Id),
|
||||||
|
Simgos_Id: subspeMap[v.Code],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = us.CreateBulkLinkData(subspecliast, event, tx.Sync)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateBulkSubSpecialist(ins es.CreateBulkDto) ([]es.Subspecialist, error) {
|
||||||
|
var path = "subspecialist/bulk"
|
||||||
|
|
||||||
|
// create request body
|
||||||
|
jsonData, err := json.Marshal(ins)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
reqBody := bytes.NewBuffer(jsonData)
|
||||||
|
// send data to main-api
|
||||||
|
resp, err := seeder.Send(http.MethodPost, path, reqBody, "von")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type MetaData struct {
|
||||||
|
Source string `json:"source"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Structure string `json:"structure"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MainApiResp struct {
|
||||||
|
Meta MetaData `json:"meta"`
|
||||||
|
Data []es.Subspecialist `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// getting response
|
||||||
|
var data MainApiResp
|
||||||
|
err = json.Unmarshal(resp, &data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return data.Data, nil
|
||||||
|
}
|
||||||
Loaded 100 of 101 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in New Issue
Block a user