This repository has been archived on 2023-10-10. You can view files and clone it, but cannot push or open issues/pull-requests.
inboice/render.go

126 lines
3.1 KiB
Go

package main
import (
"bytes"
"fmt"
"html/template"
"time"
wkhtml "github.com/SebastiaanKlippert/go-wkhtmltopdf"
"github.com/gobuffalo/packr"
pb "code.hackerspace.pl/q3k/inboice/proto"
)
var (
box = packr.NewBox("./templates")
invTmpl *template.Template
)
func init() {
inv := box.String("invoice.html")
invTmpl = template.Must(template.New("invoice.html").Parse(inv))
}
func renderInvoicePDF(i *pb.Invoice, number string, proforma bool) ([]byte, error) {
now := time.Now()
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: number,
Date: now,
DueDate: now.AddDate(0, 0, int(i.DaysDue)),
IBAN: i.Iban,
SWIFT: i.Swift,
InvoicerVAT: i.InvoicerVatId,
InvoicerCompanyNumber: i.InvoicerCompanyNumber,
InvoiceeVAT: i.CustomerVatId,
Proforma: proforma,
ReverseVAT: i.ReverseVat,
USCustomer: i.UsCustomer,
InvoicerBilling: make([]string, len(i.InvoicerBilling)),
InvoiceeBilling: make([]string, len(i.CustomerBilling)),
}
unit := "€"
for d, s := range i.InvoicerBilling {
data.InvoicerBilling[d] = s
}
for d, s := range i.CustomerBilling {
data.InvoiceeBilling[d] = s
}
totalNet := 0
total := 0
for _, i := range i.Item {
rowTotalNet := int(i.UnitPrice * i.Count)
rowTotal := int(float64(rowTotalNet) * (float64(1) + float64(i.Vat)/100000))
totalNet += rowTotalNet
total += rowTotal
data.Items = append(data.Items, item{
Title: i.Title,
Qty: fmt.Sprintf("%d", i.Count),
UnitPrice: fmt.Sprintf(unit+"%.2f", float64(i.UnitPrice)/100),
VATRate: fmt.Sprintf("%.2f%%", float64(i.Vat)/1000),
TotalNet: fmt.Sprintf(unit+"%.2f", float64(rowTotalNet)/100),
Total: fmt.Sprintf(unit+"%.2f", float64(rowTotal)/100),
})
}
data.TotalNet = fmt.Sprintf(unit+"%.2f", float64(totalNet)/100)
data.VATTotal = fmt.Sprintf(unit+"%.2f", float64(total-totalNet)/100)
data.Total = fmt.Sprintf(unit+"%.2f", float64(total)/100)
data.DeliveryCharge = fmt.Sprintf(unit+"%.2f", float64(0))
var b bytes.Buffer
err := invTmpl.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
}