Skip to content

Commit

Permalink
fix: pdf generation for referral reports
Browse files Browse the repository at this point in the history
  • Loading branch information
Salaton committed Mar 26, 2024
1 parent cb5777b commit 2fdacea
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 22 deletions.
12 changes: 7 additions & 5 deletions pkg/clinical/presentation/rest/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -377,18 +377,20 @@ func (p PresentationHandlersImpl) ListQuestionnaire(c *gin.Context) {
c.JSON(http.StatusOK, questionnaire)
}

// GenerateReferralReport handles incoming HTTP requests to generate referral reports in PDF format.
func (p PresentationHandlersImpl) GenerateReferralReport(c *gin.Context) {
queryParams := c.Request.URL.Query()
serviceRequestID := queryParams.Get("servicerequest")

c.Header("Content-Type", "application/pdf")
// c.Header("Content-Disposition", "attachment; filename=referral_report.pdf")

err := p.usecases.GenerateReferralReportPDF(c.Request.Context(), serviceRequestID)
pdfBytes, err := p.usecases.GenerateReferralReportPDF(c.Request.Context(), serviceRequestID)
if err != nil {
jsonErrorResponse(c, http.StatusBadRequest, err)
return
}

c.JSON(http.StatusOK, gin.H{"Status": "Ok"})
fileName := "referral_report.pdf"

c.Header("Content-Type", "application/pdf")
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
c.Data(http.StatusOK, "application/pdf", pdfBytes)
}
32 changes: 17 additions & 15 deletions pkg/clinical/usecases/clinical/referral_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import (
"context"
"fmt"
"html/template"
"log"
"strings"
"time"

"github.com/SebastiaanKlippert/go-wkhtmltopdf"
"github.com/savannahghi/clinical/pkg/clinical/application/utils"
)

type Patient struct {
Expand Down Expand Up @@ -89,19 +89,21 @@ type TemplateData struct {
// information, to construct a comprehensive referral report. The report is formatted
// as a PDF, making it suitable for clinical review, record-keeping, or sharing with
// other healthcare professionals.
func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, serviceRequestID string) error {
func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, serviceRequestID string) ([]byte, error) {
if serviceRequestID == "" {
return fmt.Errorf("service request ID cannot be empty")
return nil, fmt.Errorf("service request ID cannot be empty")
}

serviceRequest, err := c.infrastructure.FHIR.GetFHIRServiceRequest(ctx, serviceRequestID)
if err != nil {
return err
utils.ReportErrorToSentry(err)
return nil, err
}

patient, err := c.infrastructure.FHIR.GetFHIRPatient(ctx, *serviceRequest.Resource.Subject.ID)
if err != nil {
return err
utils.ReportErrorToSentry(err)
return nil, err
}

age := time.Since(patient.Resource.BirthDate.AsTime()).Hours() / 24 / 365
Expand Down Expand Up @@ -159,16 +161,17 @@ func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, se

tmpl, err := template.ParseFiles("templates/referral_report_template.html")
if err != nil {
log.Print(err)
return err
utils.ReportErrorToSentry(err)
return nil, err
}

// Fill the template with data
var htmlBuffer bytes.Buffer

err = tmpl.Execute(&htmlBuffer, data)
if err != nil {
log.Fatalf("Error executing template: %v", err)
utils.ReportErrorToSentry(err)
return nil, err
}

// Convert template output to string
Expand All @@ -177,7 +180,8 @@ func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, se
// Create a new PDF generator
pdfg, err := wkhtmltopdf.NewPDFGenerator()
if err != nil {
return err
utils.ReportErrorToSentry(err)
return nil, err
}

// Add one page from an URL, a file, or HTML content
Expand All @@ -186,13 +190,11 @@ func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, se
// Create PDF document in internal buffer
err = pdfg.Create()
if err != nil {
return err
utils.ReportErrorToSentry(err)
return nil, err
}

err = pdfg.WriteFile("referral_report.pdf")
if err != nil {
return err
}
pdfBytes := pdfg.Bytes()

return nil
return pdfBytes, nil
}
2 changes: 1 addition & 1 deletion pkg/clinical/usecases/clinical/referral_report_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func TestUseCasesClinicalImpl_GenerateReferralReportPDF(t *testing.T) {
}
}

if err := c.GenerateReferralReportPDF(tt.args.ctx, tt.args.serviceRequestID); (err != nil) != tt.wantErr {
if _, err := c.GenerateReferralReportPDF(tt.args.ctx, tt.args.serviceRequestID); (err != nil) != tt.wantErr {
t.Errorf("UseCasesClinicalImpl.GenerateReferralReportPDF() error = %v, wantErr %v", err, tt.wantErr)
}
})
Expand Down
2 changes: 1 addition & 1 deletion templates/referral_report_template.html
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ <h2>Patient details</h2>
</div>
{{end}}

{{if .NextOfKin}}
{{if or .NextOfKin.Name .NextOfKin.PhoneNumber .NextOfKin.Relationship}}
<div class="detail-section">
<h2>Next of kin details</h2>
{{if .NextOfKin.Name}}<div class="detail"><strong>Name:</strong> {{.NextOfKin.Name}}</div>{{end}}
Expand Down

0 comments on commit 2fdacea

Please sign in to comment.