forked from hswaw/hscloud
Serge Bazanski
b456c18bb2
Also drive-by fix two proto issues: - rename gtu_codes to gtu_code (following convention) - move denormalized Item.due_date field past denormalized comment. Change-Id: Ibfe0a21aadc0a5d4e2f784b182e530b9603aae62
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
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
|
|
}
|