diff --git a/internal/table_writer.go b/internal/table_writer.go index 95c181a..07834c0 100644 --- a/internal/table_writer.go +++ b/internal/table_writer.go @@ -2,8 +2,10 @@ package internal import ( "context" + "fmt" "io" + "github.com/biter777/countries" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/shopspring/decimal" @@ -26,6 +28,21 @@ func NewTableWriter(w io.Writer) *TableWriter { t.SetOutputMirror(w) t.SetAutoIndex(true) t.SetStyle(table.StyleLight) + t.SetColumnConfigs([]table.ColumnConfig{ + colCountry(1), + colOther(2), + colOther(3), + colOther(4), + colOther(5), + colEuros(6), + colOther(7), + colOther(8), + colOther(9), + colEuros(10), + colEuros(11), + colEuros(12), + colCountry(13), + }) t.AppendHeader(table.Row{"", "", "Realisation", "Realisation", "Realisation", "Realisation", "Acquisition", "Acquisition", "Acquisition", "Acquisition", "", "", ""}, table.RowConfig{AutoMerge: true}) t.AppendHeader(table.Row{"Source Country", "Code", "Year", "Month", "Day", "Value", "Year", "Month", "Day", "Value", "Expenses", "Paid Taxes", "Counter Country"}) @@ -37,17 +54,62 @@ func NewTableWriter(w io.Writer) *TableWriter { } func (tw *TableWriter) Write(_ context.Context, ri ReportItem) error { - tw.totalEarned = tw.totalEarned.Add(ri.SellValue) - tw.totalSpent = tw.totalSpent.Add(ri.BuyValue) - tw.totalFees = tw.totalFees.Add(ri.Fees) - tw.totalTaxes = tw.totalTaxes.Add(ri.Taxes) + tw.totalEarned = tw.totalEarned.Add(ri.SellValue.Round(2)) + tw.totalSpent = tw.totalSpent.Add(ri.BuyValue.Round(2)) + tw.totalFees = tw.totalFees.Add(ri.Fees.Round(2)) + tw.totalTaxes = tw.totalTaxes.Add(ri.Taxes.Round(2)) - tw.table.AppendRow(table.Row{ri.AssetCountry, ri.Nature, ri.SellTimestamp.Year(), int(ri.SellTimestamp.Month()), ri.SellTimestamp.Day(), ri.SellValue, ri.BuyTimestamp.Year(), ri.BuyTimestamp.Month(), ri.BuyTimestamp.Day(), ri.BuyValue, ri.Fees, ri.Taxes, ri.BrokerCountry}) + tw.table.AppendRow(table.Row{ + ri.AssetCountry, ri.Nature, + ri.SellTimestamp.Year(), int(ri.SellTimestamp.Month()), ri.SellTimestamp.Day(), ri.SellValue.StringFixed(2), + ri.BuyTimestamp.Year(), int(ri.BuyTimestamp.Month()), ri.BuyTimestamp.Day(), ri.BuyValue.StringFixed(2), + ri.Fees.StringFixed(2), ri.Taxes.StringFixed(2), ri.BrokerCountry, + }) return nil } func (tw *TableWriter) Render() { - tw.table.AppendFooter(table.Row{"SUM", "SUM", "SUM", "SUM", "SUM", tw.totalEarned, "", "", "", tw.totalSpent, tw.totalFees, tw.totalTaxes}, table.RowConfig{AutoMerge: true, AutoMergeAlign: text.AlignRight}) + tw.table.AppendFooter(table.Row{"SUM", "SUM", "SUM", "SUM", "SUM", tw.totalEarned.StringFixed(2), "", "", "", tw.totalSpent.StringFixed(2), tw.totalFees.StringFixed(2), tw.totalTaxes.StringFixed(2)}, table.RowConfig{AutoMerge: true, AutoMergeAlign: text.AlignRight}) tw.table.Render() } + +func colEuros(n int) table.ColumnConfig { + return table.ColumnConfig{ + Number: n, + Align: text.AlignRight, + AlignFooter: text.AlignRight, + AlignHeader: text.AlignRight, + WidthMin: 12, + Transformer: func(val any) string { + return fmt.Sprintf("%v €", val) + }, + TransformerFooter: func(val any) string { + return fmt.Sprintf("%v €", val) + }, + } +} + +func colOther(n int) table.ColumnConfig { + return table.ColumnConfig{ + Number: n, + Align: text.AlignLeft, + AlignFooter: text.AlignLeft, + AlignHeader: text.AlignLeft, + } +} + +func colCountry(n int) table.ColumnConfig { + return table.ColumnConfig{ + Number: n, + Align: text.AlignLeft, + AlignFooter: text.AlignLeft, + AlignHeader: text.AlignLeft, + WidthMax: 24, + WidthMaxEnforcer: text.Trim, + Transformer: func(val any) string { + countryCode := val.(int64) + return fmt.Sprintf("%v - %s", val, countries.ByNumeric(int(countryCode)).Info().Name) + }, + } +}