From 961f0eed384d6a3cf0259a60d3b542da243646f4 Mon Sep 17 00:00:00 2001 From: Natercio Moniz Date: Wed, 19 Nov 2025 11:38:46 +0000 Subject: [PATCH 1/2] add go report card --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 10e0424..2766c5d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # any2anexoj +[![Go Report Card](https://goreportcard.com/badge/github.com/nmoniz/any2anexoj)](https://goreportcard.com/report/github.com/nmoniz/any2anexoj) + ![Screenshot](https://i.ibb.co/TDDypq8X/Screenshot-2025-11-18-at-16-17-16.png) This tool converts the statements from known brokers and exchanges into a format compatible with section 9 from the Portuguese IRS form: [Mod_3_anexo_j](https://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/modelos_formularios/irs/Documents/Mod_3_anexo_J.pdf) -- 2.49.1 From 1c3fd0397a2f8829580fd674bf0d46f2fa70e3e4 Mon Sep 17 00:00:00 2001 From: Natercio Moniz Date: Wed, 19 Nov 2025 11:40:09 +0000 Subject: [PATCH 2/2] fix typos --- internal/filler_test.go | 8 ++++---- internal/table_writer.go | 4 ++-- internal/trading212/record.go | 6 +++--- internal/trading212/record_test.go | 20 ++++++++++---------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/internal/filler_test.go b/internal/filler_test.go index 3609232..0244a96 100644 --- a/internal/filler_test.go +++ b/internal/filler_test.go @@ -18,7 +18,7 @@ func TestFillerQueue(t *testing.T) { var rq FillerQueue if rq.Len() != 0 { - t.Fatalf("zero value should have zero lenght") + t.Fatalf("zero value should have zero length") } _, ok := rq.Pop() @@ -38,12 +38,12 @@ func TestFillerQueue(t *testing.T) { rq.Push(NewFiller(newRecord())) if rq.Len() != 1 { - t.Fatalf("pushing 1st record should result in lenght of 1") + t.Fatalf("pushing 1st record should result in length of 1") } rq.Push(NewFiller(newRecord())) if rq.Len() != 2 { - t.Fatalf("pushing 2nd record should result in lenght of 2") + t.Fatalf("pushing 2nd record should result in length of 2") } peekFiller, ok := rq.Peek() @@ -85,7 +85,7 @@ func TestFillerQueueNilReceiver(t *testing.T) { var rq *FillerQueue if rq.Len() > 0 { - t.Fatalf("nil receiver should have zero lenght") + t.Fatalf("nil receiver should have zero length") } _, ok := rq.Peek() diff --git a/internal/table_writer.go b/internal/table_writer.go index a85a217..0dd822d 100644 --- a/internal/table_writer.go +++ b/internal/table_writer.go @@ -27,8 +27,8 @@ func NewTableWriter(w io.Writer) *TableWriter { t.SetAutoIndex(true) t.SetStyle(table.StyleLight) - t.AppendHeader(table.Row{"", "", "Realisation", "Realisation", "Realisation", "Realisation", "Aquisition", "Aquisition", "Aquisition", "Aquisition", "", "", ""}, table.RowConfig{AutoMerge: true}) - t.AppendHeader(table.Row{"Source Country", "Code", "Year", "Month", "Day", "Value", "Year", "Month", "Day", "Value", "Expenses", "Payed Taxes", "Counter Country"}) + 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"}) return &TableWriter{ table: t, diff --git a/internal/trading212/record.go b/internal/trading212/record.go index 1c74f44..a291c82 100644 --- a/internal/trading212/record.go +++ b/internal/trading212/record.go @@ -110,9 +110,9 @@ func (rr RecordReader) ReadRecord(_ context.Context) (internal.Record, error) { return Record{}, fmt.Errorf("parse record timestamp: %w", err) } - convertionFee, err := parseOptinalDecimal(raw[16]) + conversionFee, err := parseOptinalDecimal(raw[16]) if err != nil { - return Record{}, fmt.Errorf("parse record convertion fee: %w", err) + return Record{}, fmt.Errorf("parse record conversion fee: %w", err) } stampDutyTax, err := parseOptinalDecimal(raw[14]) @@ -131,7 +131,7 @@ func (rr RecordReader) ReadRecord(_ context.Context) (internal.Record, error) { quantity: qant, price: price, timestamp: ts, - fees: convertionFee, + fees: conversionFee, taxes: stampDutyTax.Add(frenchTxTax), }, nil } diff --git a/internal/trading212/record_test.go b/internal/trading212/record_test.go index b464f1a..6dae9ae 100644 --- a/internal/trading212/record_test.go +++ b/internal/trading212/record_test.go @@ -25,7 +25,7 @@ func TestRecordReader_ReadRecord(t *testing.T) { }, { name: "well-formed buy", - r: bytes.NewBufferString(`Market buy,2025-07-03 10:44:29,SYM123456ABXY,ABXY,"Aspargus Brocoli",EOF987654321,2.4387014200,7.3690000000,USD,1.17995999,,"EUR",15.25,"EUR",0.25,"EUR",0.02,"EUR",,`), + r: bytes.NewBufferString(`Market buy,2025-07-03 10:44:29,SYM123456ABXY,ABXY,"Aspargus Broccoli",EOF987654321,2.4387014200,7.3690000000,USD,1.17995999,,"EUR",15.25,"EUR",0.25,"EUR",0.02,"EUR",,`), want: Record{ symbol: "SYM123456ABXY", side: internal.SideBuy, @@ -38,7 +38,7 @@ func TestRecordReader_ReadRecord(t *testing.T) { }, { name: "well-formed sell", - r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:30,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",0.1,"EUR"`), + r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:30,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",0.1,"EUR"`), want: Record{ symbol: "IE000GA3D489", side: internal.SideSell, @@ -51,42 +51,42 @@ func TestRecordReader_ReadRecord(t *testing.T) { }, { name: "malformed side", - r: bytes.NewBufferString(`Aljksdaf Balsjdkf,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`Aljksdaf Balsjdkf,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, { name: "empty side", - r: bytes.NewBufferString(`,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,0x1234,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,0x1234,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, { name: "malformed qantity", - r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,0x1234,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,0x1234,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, { name: "empty qantity", - r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, { name: "malformed price", - r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,2.4387014200,0b101010,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,2.4387014200,0b101010,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, { name: "empty price", - r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,2.4387014200,,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`Market sell,2025-08-04 11:45:39,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,2.4387014200,,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, { name: "malformed timestamp", - r: bytes.NewBufferString(`Market sell,2006-01-02T15:04:05Z07:00,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`Market sell,2006-01-02T15:04:05Z07:00,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, { name: "empty timestamp", - r: bytes.NewBufferString(`Market sell,,IE000GA3D489,ABXY,"Aspargus Brocoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), + r: bytes.NewBufferString(`Market sell,,IE000GA3D489,ABXY,"Aspargus Broccoli",EOF987654321,2.4387014200,7.9999999999,USD,1.17995999,,"EUR",15.25,"EUR",,,0.02,"EUR",,`), wantErr: true, }, } -- 2.49.1