cmc-sales/go/internal/cmc/documents/packing_list_builder.go

101 lines
2.8 KiB
Go

package pdf
import (
"bytes"
"fmt"
"html/template"
"path/filepath"
)
// PackingListLineItemTemplateData represents a packing list line item for template rendering
type PackingListLineItemTemplateData struct {
Title string
Description template.HTML
Quantity string
Weight string
}
// BuildPackingListHTML generates the complete HTML for a packing list using templates
func (g *HTMLDocumentGenerator) BuildPackingListHTML(data *PackingListPDFData, totalPages int, currentPage int) string {
packingListNumber := data.PackingList.CmcReference
// Prepare line items
lineItemsData := []PackingListLineItemTemplateData{}
for _, item := range data.LineItems {
lineItemsData = append(lineItemsData, PackingListLineItemTemplateData{
Title: item.Title,
Description: template.HTML(item.Description),
Quantity: item.Quantity,
Weight: "", // Weight not currently in LineItem model
})
}
// Prepare template data
templateData := struct {
PackingListNumber string
IssueDateString string
JobTitle string
CustomerOrderNumber string
FromAddress string
ShipTo string
LineItems []PackingListLineItemTemplateData
LogoDataURI string
}{
PackingListNumber: packingListNumber,
IssueDateString: data.IssueDateString,
JobTitle: data.JobTitle,
CustomerOrderNumber: data.CustomerOrderNumber,
FromAddress: "CMC TECHNOLOGIES\n1/50 Carrington Road\nMarrickville NSW 2204\nAustralia",
ShipTo: data.ShipTo,
LineItems: lineItemsData,
LogoDataURI: g.loadLogo("quote_logo.png"),
}
// Define template functions
funcMap := template.FuncMap{}
// Parse and execute template
possiblePathSets := [][]string{
{
filepath.Join("internal", "cmc", "documents", "templates", "packing-list.html"),
filepath.Join("internal", "cmc", "documents", "templates", "header.html"),
},
{
filepath.Join("go", "internal", "cmc", "documents", "templates", "packing-list.html"),
filepath.Join("go", "internal", "cmc", "documents", "templates", "header.html"),
},
{
filepath.Join("templates", "pdf", "packing-list.html"),
filepath.Join("templates", "pdf", "header.html"),
},
{
"/app/templates/pdf/packing-list.html",
"/app/templates/pdf/header.html",
},
}
var tmpl *template.Template
var err error
for _, pathSet := range possiblePathSets {
tmpl, err = template.New("packing-list.html").Funcs(funcMap).ParseFiles(pathSet...)
if err == nil {
break
}
}
if tmpl == nil || err != nil {
fmt.Printf("Error parsing template from any path: %v\n", err)
return ""
}
var buf bytes.Buffer
if err := tmpl.Execute(&buf, templateData); err != nil {
fmt.Printf("Error executing template: %v\n", err)
return ""
}
return buf.String()
}