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