package main import ( "bytes" "fmt" "html/template" "time" wkhtml "github.com/sebastiaanklippert/go-wkhtmltopdf" pb "code.hackerspace.pl/hscloud/bgpwtf/invoice/proto" "code.hackerspace.pl/hscloud/bgpwtf/invoice/templates" ) var ( invTmpl map[string]*template.Template languages = []string{"en", "pl"} defaultLanguage = "en" ) func init() { invTmpl = make(map[string]*template.Template) for _, language := range languages { filename := fmt.Sprintf("invoice_%s.html", language) a, err := templates.Asset(filename) if err != nil { panic(err) } invTmpl[language] = template.Must(template.New(filename).Parse(string(a))) } } func renderInvoicePDF(i *pb.Invoice, language string) ([]byte, error) { type item struct { Title string UnitPrice string Qty string VATRate string TotalNet string Total string } data := struct { InvoiceNumber string InvoicerBilling []string InvoicerVAT string InvoicerCompanyNumber string InvoiceeBilling []string InvoiceeVAT string Date time.Time DueDate time.Time IBAN string SWIFT string Proforma bool ReverseVAT bool USCustomer bool Items []item TotalNet string VATTotal string Total string DeliveryCharge string }{ InvoiceNumber: i.FinalUid, Date: time.Unix(0, i.Date), DueDate: time.Unix(0, i.DueDate), IBAN: i.Data.Iban, SWIFT: i.Data.Swift, InvoicerVAT: i.Data.InvoicerVatId, InvoicerCompanyNumber: i.Data.InvoicerCompanyNumber, InvoiceeVAT: i.Data.CustomerVatId, Proforma: i.State == pb.Invoice_STATE_PROFORMA, ReverseVAT: i.Data.ReverseVat, USCustomer: i.Data.UsCustomer, InvoicerBilling: make([]string, len(i.Data.InvoicerBilling)), InvoiceeBilling: make([]string, len(i.Data.CustomerBilling)), } for d, s := range i.Data.InvoicerBilling { data.InvoicerBilling[d] = s } for d, s := range i.Data.CustomerBilling { data.InvoiceeBilling[d] = s } unit := i.Unit for _, it := range i.Data.Item { data.Items = append(data.Items, item{ Title: it.Title, Qty: fmt.Sprintf("%d", it.Count), UnitPrice: fmt.Sprintf(unit+"%.2f", float64(it.UnitPrice)/100), VATRate: fmt.Sprintf("%.2f%%", float64(it.Vat)/1000), TotalNet: fmt.Sprintf(unit+"%.2f", float64(it.TotalNet)/100), Total: fmt.Sprintf(unit+"%.2f", float64(it.Total)/100), }) } data.TotalNet = fmt.Sprintf(unit+"%.2f", float64(i.TotalNet)/100) data.VATTotal = fmt.Sprintf(unit+"%.2f", float64(i.Total-i.TotalNet)/100) data.Total = fmt.Sprintf(unit+"%.2f", float64(i.Total)/100) data.DeliveryCharge = fmt.Sprintf(unit+"%.2f", float64(0)) if _, ok := invTmpl[language]; !ok { language = defaultLanguage } var b bytes.Buffer err := invTmpl[language].Execute(&b, &data) if err != nil { return []byte{}, err } pdfg, err := wkhtml.NewPDFGenerator() if err != nil { return []byte{}, err } pdfg.Dpi.Set(600) pdfg.NoCollate.Set(false) pdfg.PageSize.Set(wkhtml.PageSizeA4) pdfg.AddPage(wkhtml.NewPageReader(&b)) if err := pdfg.Create(); err != nil { return []byte{}, err } return pdfg.Bytes(), nil }