go/svc/{invoice,speedtest} -> bgpwtf/
Continued from https://gerrit.hackerspace.pl/c/hscloud/+/71 .
Change-Id: I5aef587c7e9a4cec301e3c95530c33914851ad44
diff --git a/bgpwtf/invoice/render.go b/bgpwtf/invoice/render.go
new file mode 100644
index 0000000..2353014
--- /dev/null
+++ b/bgpwtf/invoice/render.go
@@ -0,0 +1,129 @@
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "html/template"
+ "time"
+
+ wkhtml "github.com/sebastiaanklippert/go-wkhtmltopdf"
+
+ "code.hackerspace.pl/hscloud/bgpwtf/invoice/templates"
+ pb "code.hackerspace.pl/hscloud/proto/invoice"
+)
+
+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
+}