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
+}