66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
|
package invoice
|
||
|
|
||
|
import (
|
||
|
"sort"
|
||
|
"strings"
|
||
|
|
||
|
"dev.tandem.ws/tandem/camper/pkg/auth"
|
||
|
"dev.tandem.ws/tandem/camper/pkg/locale"
|
||
|
"dev.tandem.ws/tandem/camper/pkg/ods"
|
||
|
)
|
||
|
|
||
|
func mustWriteInvoicesOds(invoices []*IndexEntry, taxes map[int]taxMap, taxColumns map[int]string, company *auth.Company, locale *locale.Locale) []byte {
|
||
|
taxIDs := extractTaxIDs(taxColumns)
|
||
|
columns := make([]string, 6+len(taxIDs))
|
||
|
columns[0] = "Date"
|
||
|
columns[1] = "Invoice Num."
|
||
|
columns[2] = "Customer"
|
||
|
columns[3] = "Status"
|
||
|
i := 4
|
||
|
for _, taxID := range taxIDs {
|
||
|
columns[i] = taxColumns[taxID]
|
||
|
i++
|
||
|
}
|
||
|
columns[i] = "Amount"
|
||
|
table, err := ods.WriteTable(invoices, columns, locale, func(sb *strings.Builder, invoice *IndexEntry) error {
|
||
|
ods.WriteCellDate(sb, invoice.Date)
|
||
|
if err := ods.WriteCellString(sb, invoice.Number); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err := ods.WriteCellString(sb, invoice.CustomerName); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err := ods.WriteCellString(sb, invoice.StatusLabel); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
writeTaxes(sb, taxes[invoice.ID], taxIDs, company, locale)
|
||
|
ods.WriteCellFloat(sb, invoice.Total, company, locale)
|
||
|
return nil
|
||
|
})
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
return table
|
||
|
}
|
||
|
|
||
|
func extractTaxIDs(taxColumns map[int]string) []int {
|
||
|
taxIDs := make([]int, len(taxColumns))
|
||
|
i := 0
|
||
|
for k := range taxColumns {
|
||
|
taxIDs[i] = k
|
||
|
i++
|
||
|
}
|
||
|
sort.Ints(taxIDs[:])
|
||
|
return taxIDs
|
||
|
}
|
||
|
|
||
|
func writeTaxes(sb *strings.Builder, taxes taxMap, taxIDs []int, company *auth.Company, locale *locale.Locale) {
|
||
|
for _, taxID := range taxIDs {
|
||
|
var amount string
|
||
|
if taxes != nil {
|
||
|
amount = taxes[taxID]
|
||
|
}
|
||
|
ods.WriteCellFloat(sb, amount, company, locale)
|
||
|
}
|
||
|
}
|