go/svc/invoice: refactor

We unify calculation logic, move the existing Invoice proto message into
InvoiceData, and create other messages/fields around it to hold
denormalized data.
diff --git a/go/svc/invoice/calc.go b/go/svc/invoice/calc.go
new file mode 100644
index 0000000..5df763f
--- /dev/null
+++ b/go/svc/invoice/calc.go
@@ -0,0 +1,29 @@
+package main
+
+import (
+	"time"
+
+	pb "code.hackerspace.pl/hscloud/proto/invoice"
+)
+
+func calculateInvoiceData(p *pb.Invoice) {
+	p.Unit = p.Data.Unit
+	if p.Unit == "" {
+		p.Unit = "€"
+	}
+
+	p.TotalNet = 0
+	p.Total = 0
+	for _, i := range p.Data.Item {
+		rowTotalNet := uint64(i.UnitPrice * i.Count)
+		rowTotal := uint64(float64(rowTotalNet) * (float64(1) + float64(i.Vat)/100000))
+
+		p.TotalNet += rowTotalNet
+		p.Total += rowTotal
+		i.TotalNet = rowTotalNet
+		i.Total = rowTotal
+	}
+
+	due := int64(time.Hour*24) * p.Data.DaysDue
+	p.DueDate = time.Unix(0, p.Date).Add(time.Duration(due)).UnixNano()
+}