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() }