feat (generate-file): control letter done

This commit is contained in:
dpurbosakti
2025-11-20 13:18:33 +07:00
parent a5ea881e1f
commit ffb8c4e413
5 changed files with 185 additions and 145 deletions
@@ -18,6 +18,7 @@ import (
dg "github.com/karincake/apem/db-gorm-pg"
d "github.com/karincake/dodol"
"gorm.io/gorm"
erc "simrs-vx/internal/domain/references/common"
ere "simrs-vx/internal/domain/references/encounter"
@@ -36,128 +37,137 @@ func Generate(input GenerateDto) (*d.Data, error) {
// Start log
pl.SetLogInfo(&event, input, "started", "create")
switch input.Type_Code {
// general-consent
case ere.DTCGC:
// get value from general consent by ref_id
gc, err := ugc.ReadDetailData(egc.ReadDetailDto{Id: uint(*pc.StringToUint64(*input.Ref_Id))}, &event)
if err != nil {
return nil, err
}
if gc.FileUrl != nil {
if err := removeFile(string(input.EntityType_Code), *gc.FileUrl); err != nil {
return nil, err
}
}
// map template data
templateData := GeneralConsentPDF{}
if gc.Value != nil {
err := json.Unmarshal([]byte(*gc.Value), &templateData)
err := dg.I.Transaction(func(tx *gorm.DB) error {
switch input.Type_Code {
// general-consent
case ere.DTCGC:
// get value from general consent by ref_id
gc, err := ugc.ReadDetailData(egc.ReadDetailDto{Id: uint(*pc.StringToUint64(*input.Ref_Id))}, &event)
if err != nil {
event.ErrInfo = pl.ErrorInfo{
Code: "data-unmarshal-fail",
Detail: err.Error(),
Raw: err,
return err
}
if gc.FileUrl != nil {
if err := removeFile(string(input.EntityType_Code), *gc.FileUrl); err != nil {
return err
}
return nil, err
}
} else {
return nil, errors.New("no value in this general consent")
}
input.FormatType = erc.DFTCPDF
input.TemplateName = TDNGC
input.Encounter_Id = gc.Encounter_Id
templateData.Date = pu.FormatIndonesianDate(gc.CreatedAt)
// generate file
urlPub, err := generateFile(input, templateData)
if err != nil {
return nil, err
}
gc.FileUrl = &urlPub
if err := dg.I.Save(&gc).Error; err != nil {
return nil, err
}
response = ResponseDto{
FileUrl: urlPub,
}
// control-letter
case ere.DTCVSCL:
// get value from control letter by ref_id
cl, err := uvscl.ReadDetailData(evscl.ReadDetailDto{Number: input.Ref_Id}, &event)
if err != nil {
if !pu.IsDataNotFoundError(err) {
return nil, err
// map template data
templateData := GeneralConsentPDF{}
if gc.Value != nil {
err := json.Unmarshal([]byte(*gc.Value), &templateData)
if err != nil {
event.ErrInfo = pl.ErrorInfo{
Code: "data-unmarshal-fail",
Detail: err.Error(),
Raw: err,
}
return err
}
} else {
return errors.New("no value in this general consent")
}
}
if cl != nil && cl.FileUrl != nil {
if err := removeFile(string(input.EntityType_Code), *cl.FileUrl); err != nil {
return nil, err
}
}
input.FormatType = erc.DFTCPDF
input.TemplateName = TDNGC
input.Encounter_Id = gc.Encounter_Id
templateData.Date = pu.FormatIndonesianDate(gc.CreatedAt)
// map template data
clData := VclaimControlLetter{}
if input.Data != nil {
err := json.Unmarshal([]byte(*input.Data), &clData)
// generate file
urlPub, err := generateFile(input, templateData)
if err != nil {
event.ErrInfo = pl.ErrorInfo{
Code: "data-unmarshal-fail",
Detail: err.Error(),
Raw: err,
return err
}
gc.FileUrl = &urlPub
if err := dg.I.Save(&gc).Error; err != nil {
return err
}
response = ResponseDto{
FileUrl: urlPub,
}
// control-letter
case ere.DTCVSCL:
// get value from control letter by ref_id
cl, err := uvscl.ReadDetailData(evscl.ReadDetailDto{Number: input.Ref_Id}, &event)
if err != nil {
if !pu.IsDataNotFoundError(err) {
return err
}
return nil, err
}
} else {
return nil, errors.New("there is no data to be used")
}
if cl == nil {
createCL := evscl.CreateDto{
VclaimSep_Number: &clData.VclaimSep.Number,
Number: &clData.Number,
Value: input.Data,
}
if cl, err = uvscl.CreateData(createCL, &event); err != nil {
return nil, err
}
}
// get encounter id by vclaim sep number
vs, err := uvs.ReadDetailData(evs.ReadDetailDto{Number: &clData.VclaimSep.Number}, &event)
if err != nil {
return nil, err
if cl != nil && cl.FileUrl != nil {
if err := removeFile(string(input.EntityType_Code), *cl.FileUrl); err != nil {
return err
}
}
// map template data
clData := VclaimControlLetter{}
if input.Data != nil {
err := json.Unmarshal([]byte(*input.Data), &clData)
if err != nil {
event.ErrInfo = pl.ErrorInfo{
Code: "data-unmarshal-fail",
Detail: err.Error(),
Raw: err,
}
return err
}
} else {
return errors.New("there is no data to be used")
}
if cl == nil {
createCL := evscl.CreateDto{
VclaimSep_Number: &clData.VclaimSep.Number,
Number: &clData.Number,
Value: input.Data,
}
if cl, err = uvscl.CreateData(createCL, &event, tx); err != nil {
return err
}
}
// get encounter id by vclaim sep number
vs, err := uvs.ReadDetailData(evs.ReadDetailDto{Number: &clData.VclaimSep.Number}, &event)
if err != nil {
return err
}
input.FormatType = erc.DFTCPDF
input.TemplateName = TDNCL
input.Encounter_Id = vs.Encounter_Id
input.UseA5Lanscape = true
templateData := clData.generateTemplateData()
// generate file
urlPub, err := generateFile(input, templateData)
if err != nil {
return err
}
cl.FileUrl = &urlPub
if err := tx.Save(&cl).Error; err != nil {
return err
}
response = ResponseDto{
FileUrl: urlPub,
}
default:
return errors.New("invalid type code")
}
input.FormatType = erc.DFTCPDF
input.TemplateName = TDNCL
input.Encounter_Id = vs.Encounter_Id
return nil
})
templateData := clData.generateTemplateData()
// generate file
urlPub, err := generateFile(input, templateData)
if err != nil {
return nil, err
}
cl.FileUrl = &urlPub
if err := dg.I.Save(&cl).Error; err != nil {
return nil, err
}
response = ResponseDto{
FileUrl: urlPub,
}
default:
return nil, errors.New("invalid type code")
if err != nil {
return nil, err
}
return &d.Data{
@@ -30,9 +30,10 @@ func generateFile(input GenerateDto, templateData any) (string, error) {
switch input.FormatType {
case erc.DFTCPDF:
if err := generatePDF(GeneratePDFdto{
TemplatePath: templatePath,
TemplateData: templateData,
PdfPath: fPath,
TemplatePath: templatePath,
TemplateData: templateData,
PdfPath: fPath,
UseA5Lanscape: input.UseA5Lanscape,
}); err != nil {
return "", err
}
@@ -73,7 +74,7 @@ func generatePDF(input GeneratePDFdto) error {
// parse template data into html template
r := pp.NewRequestPdf("")
if err := r.ParseTemplate(input.TemplatePath, input.TemplateData); err == nil {
_, err := r.GenerateByCommand(input.PdfPath, input.TemplatePath)
_, err := r.GenerateByCommand(input.PdfPath, input.TemplatePath, input.UseA5Lanscape)
if err != nil {
return errors.New("generate pdf by command error : " + err.Error())
}
@@ -39,6 +39,7 @@ type GenerateDto struct {
FormatType erc.DocFormatTypeCode `json:"formatType"`
TemplateName TemplateDocsName `json:"-"`
Encounter_Id *uint `json:"-"`
UseA5Lanscape bool `json:"-"`
Data *string `json:"data"`
}
@@ -46,7 +47,6 @@ type GenerateDto struct {
type VclaimControlLetter struct {
Number string `json:"noSuratKontrol"`
PlannedControlDate string `json:"tglRencanaKontrol"`
IssuedDate string `json:"tglTerbit"`
Doctor_Name string `json:"namaDokter"`
DstUnit_Name string `json:"namaPoliTujuan"`
ResponsibleDoctor_Name string `json:"namaDokterPembuat"`
@@ -67,9 +67,10 @@ type VclaimMember struct {
}
type GeneratePDFdto struct {
TemplatePath string
TemplateData any
PdfPath string
TemplatePath string
TemplateData any
PdfPath string
UseA5Lanscape bool
}
type ResponseDto struct {