blob: 72933d36fc61dd19ac95046cb9d5708980f311b2 [file] [log] [blame]
package main
import (
"sort"
"time"
pb "code.hackerspace.pl/hscloud/bgpwtf/invoice/proto"
)
// calculateInvoiceData applies all business logic to populate an Invoice's
// denormalized fields from its InvoiceData.
func calculateInvoiceData(p *pb.Invoice) {
// Populate default unit.
// TODO(q3k): this really should be done on invoice submit instead.
p.Unit = p.Data.Unit
if p.Unit == "" {
p.Unit = "€"
}
// Calculate totals.
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
}
// Calculate due date.
due := int64(time.Hour*24) * p.Data.DaysDue
p.DueDate = time.Unix(0, p.Date).Add(time.Duration(due)).UnixNano()
// Denormalize Items' GTUCodes into the Invoice's summary GTU codes.
codeSet := make(map[pb.GTUCode]bool)
for _, item := range p.Data.Item {
for _, code := range item.GtuCode {
codeSet[code] = true
}
}
var codes []pb.GTUCode
for c, _ := range codeSet {
codes = append(codes, c)
}
sort.Slice(codes, func(i, j int) bool { return codes[i] < codes[j] })
p.GtuCode = codes
}