Enhance aggregation script to support annual reports

This commit is contained in:
Kevin Bataille
2026-02-09 10:45:33 +01:00
parent 84d165d6dc
commit 4933b35040
6 changed files with 190 additions and 74 deletions

View File

@@ -111,6 +111,12 @@ python aggregate_by_month.py
# Specify input and output directories # Specify input and output directories
python aggregate_by_month.py --input-dir /path/to/csv --output-dir /path/to/reports python aggregate_by_month.py --input-dir /path/to/csv --output-dir /path/to/reports
# Create annual reports
python aggregate_by_month.py --annual
# Create annual report for a specific year
python aggregate_by_month.py --annual --year 2025
``` ```
## Output ## Output

View File

@@ -0,0 +1,6 @@
Category,Transaction Count,Total Amount,Percentage
Other,35,8531.95,79.42%
Internal Transfer,12,1650.0,15.36%
Loan Repayment,3,450.0,4.19%
Google Services,1,77.64,0.72%
Bank Fees,11,33.0,0.31%
1 Category Transaction Count Total Amount Percentage
2 Other 35 8531.95 79.42%
3 Internal Transfer 12 1650.0 15.36%
4 Loan Repayment 3 450.0 4.19%
5 Google Services 1 77.64 0.72%
6 Bank Fees 11 33.0 0.31%

View File

@@ -0,0 +1,63 @@
Date,Description,Category,Amount,Institution,Source
02/01/2025,AGIOS/FRAIS,Other,18.48,Monabanq,Extrait de comptes au 2025-01-31.pdf
08/01/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-01-31.pdf
04/02/2025,PRLV SEPA URSSAF D'ILE DE FRANC,Other,35.0,Monabanq,Extrait de comptes au 2025-02-28.pdf
07/02/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-02-28.pdf
27/02/2025,VIR INST MR BATAILLE KEVIN,Other,700.0,Monabanq,Extrait de comptes au 2025-02-28.pdf
06/03/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-03-31.pdf
06/03/2025,VIR SEPA BOURSORAMA PERSO,Other,100.0,Monabanq,Extrait de comptes au 2025-03-31.pdf
06/03/2025,VIR SEPA INTERNE,Other,200.0,Monabanq,Extrait de comptes au 2025-03-31.pdf
12/03/2025,VIR INST BATAILLE KEVIN (REVOLU,Other,100.0,Monabanq,Extrait de comptes au 2025-03-31.pdf
12/03/2025,VIR INST BOURSORAMA PERSO,Other,230.0,Monabanq,Extrait de comptes au 2025-03-31.pdf
24/03/2025,GOOGLE IRELAND LTD,Google Services,77.64,Monabanq,Extrait de comptes au 2025-03-31.pdf
04/04/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-04-30.pdf
07/04/2025,VIR INST MR BATAILLE KEVIN,Other,200.0,Monabanq,Extrait de comptes au 2025-04-30.pdf
11/04/2025,VIR INST BOURSORAMA PERSO,Other,333.34,Monabanq,Extrait de comptes au 2025-04-30.pdf
29/04/2025,VIR AMAZON EUROPE CORE S.A R,Other,25.77,Monabanq,Extrait de comptes au 2025-04-30.pdf
05/05/2025,PRLV SEPA URSSAF D ILE DE FRANC,Other,18.0,Monabanq,Extrait de comptes au 2025-06-02.pdf
05/05/2025,VIR MR BATAILLE KEVIN,Internal Transfer,0.0,Monabanq,Extrait de comptes au 2025-06-02.pdf
08/05/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-06-02.pdf
04/06/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-06-30.pdf
05/06/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-06-30.pdf
03/07/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-07-31.pdf
07/07/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-07-31.pdf
09/07/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-07-31.pdf
11/07/2025,VIR INST BOURSORAMA PERSO,Other,761.24,Monabanq,Extrait de comptes au 2025-07-31.pdf
11/07/2025,VIR INST KEVIN BATAILLE,Other,700.09,Monabanq,Extrait de comptes au 2025-07-31.pdf
29/07/2025,VIR INST KEVIN BATAILLE,Other,107.78,Monabanq,Extrait de comptes au 2025-07-31.pdf
29/08/2025,VIR INST BATAILLE KEVIN (REVOLU,Other,120.0,Monabanq,Extrait de comptes au 2025-09-01.pdf
29/08/2025,VIR SEPA BOURSORAMA PERSO,Other,280.0,Monabanq,Extrait de comptes au 2025-09-01.pdf
03/09/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
04/09/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
07/09/2025,VIR INST BATAILLE KEVIN,Other,250.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
07/09/2025,VIR INST BOURSORAMA PERSO,Other,800.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
09/09/2025,VIR INST BATAILLE KEVIN,Other,200.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
10/09/2025,VIR INST KEVIN BATAILLE,Other,200.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
11/09/2025,VIR INST BOURSORAMA PERSO,Other,247.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
11/09/2025,VIR INST KEVIN BATAILLE,Other,200.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
11/09/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
14/09/2025,VIR INST BATAILLE KEVIN (REVOLU,Other,130.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
14/09/2025,VIR INST KEVIN BATAILLE,Other,270.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
21/09/2025,VIR INST BATAILLE KEVIN (REVOLU,Other,100.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
21/09/2025,VIR INST BATAILLE KEVIN (REVOLU,Other,100.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
23/09/2025,VIR INST BOURSORAMA PERSO,Other,200.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
26/09/2025,VIR INST BOURSORAMA PERSO,Other,350.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
30/09/2025,VIR INST BOURSORAMA PERSO,Other,300.0,Monabanq,Extrait de comptes au 2025-09-30.pdf
03/10/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
04/10/2025,ECH PRET 28943002099054,Loan Repayment,150.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
06/10/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
08/10/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
12/10/2025,VIR INST BOURSORAMA PERSO,Other,700.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
23/10/2025,VIR INST BOURSORAMA PERSO,Other,100.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
23/10/2025,VIR INST KEVIN BATAILLE,Other,100.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
29/10/2025,VIR INST BOURSORAMA PERSO,Other,90.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
30/10/2025,VIR INST BOURSORAMA PERSO,Other,40.0,Monabanq,Extrait de comptes au 2025-10-31.pdf
04/11/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-12-01.pdf
06/11/2025,ECH PRET 28943002099054,Loan Repayment,150.0,Monabanq,Extrait de comptes au 2025-12-01.pdf
07/11/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-12-01.pdf
10/11/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-12-01.pdf
03/12/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-12-31.pdf
04/12/2025,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2025-12-31.pdf
06/12/2025,ECH PRET 28943002099054,Loan Repayment,150.0,Monabanq,Extrait de comptes au 2025-12-31.pdf
09/12/2025,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2025-12-31.pdf
25/12/2025,VIR INST MR BATAILLE KEVIN,Other,225.25,Monabanq,Extrait de comptes au 2025-12-31.pdf
1 Date Description Category Amount Institution Source
2 02/01/2025 AGIOS/FRAIS Other 18.48 Monabanq Extrait de comptes au 2025-01-31.pdf
3 08/01/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-01-31.pdf
4 04/02/2025 PRLV SEPA URSSAF D'ILE DE FRANC Other 35.0 Monabanq Extrait de comptes au 2025-02-28.pdf
5 07/02/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-02-28.pdf
6 27/02/2025 VIR INST MR BATAILLE KEVIN Other 700.0 Monabanq Extrait de comptes au 2025-02-28.pdf
7 06/03/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-03-31.pdf
8 06/03/2025 VIR SEPA BOURSORAMA PERSO Other 100.0 Monabanq Extrait de comptes au 2025-03-31.pdf
9 06/03/2025 VIR SEPA INTERNE Other 200.0 Monabanq Extrait de comptes au 2025-03-31.pdf
10 12/03/2025 VIR INST BATAILLE KEVIN (REVOLU Other 100.0 Monabanq Extrait de comptes au 2025-03-31.pdf
11 12/03/2025 VIR INST BOURSORAMA PERSO Other 230.0 Monabanq Extrait de comptes au 2025-03-31.pdf
12 24/03/2025 GOOGLE IRELAND LTD Google Services 77.64 Monabanq Extrait de comptes au 2025-03-31.pdf
13 04/04/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-04-30.pdf
14 07/04/2025 VIR INST MR BATAILLE KEVIN Other 200.0 Monabanq Extrait de comptes au 2025-04-30.pdf
15 11/04/2025 VIR INST BOURSORAMA PERSO Other 333.34 Monabanq Extrait de comptes au 2025-04-30.pdf
16 29/04/2025 VIR AMAZON EUROPE CORE S.A R Other 25.77 Monabanq Extrait de comptes au 2025-04-30.pdf
17 05/05/2025 PRLV SEPA URSSAF D ILE DE FRANC Other 18.0 Monabanq Extrait de comptes au 2025-06-02.pdf
18 05/05/2025 VIR MR BATAILLE KEVIN Internal Transfer 0.0 Monabanq Extrait de comptes au 2025-06-02.pdf
19 08/05/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-06-02.pdf
20 04/06/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-06-30.pdf
21 05/06/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-06-30.pdf
22 03/07/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-07-31.pdf
23 07/07/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-07-31.pdf
24 09/07/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-07-31.pdf
25 11/07/2025 VIR INST BOURSORAMA PERSO Other 761.24 Monabanq Extrait de comptes au 2025-07-31.pdf
26 11/07/2025 VIR INST KEVIN BATAILLE Other 700.09 Monabanq Extrait de comptes au 2025-07-31.pdf
27 29/07/2025 VIR INST KEVIN BATAILLE Other 107.78 Monabanq Extrait de comptes au 2025-07-31.pdf
28 29/08/2025 VIR INST BATAILLE KEVIN (REVOLU Other 120.0 Monabanq Extrait de comptes au 2025-09-01.pdf
29 29/08/2025 VIR SEPA BOURSORAMA PERSO Other 280.0 Monabanq Extrait de comptes au 2025-09-01.pdf
30 03/09/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-09-30.pdf
31 04/09/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-09-30.pdf
32 07/09/2025 VIR INST BATAILLE KEVIN Other 250.0 Monabanq Extrait de comptes au 2025-09-30.pdf
33 07/09/2025 VIR INST BOURSORAMA PERSO Other 800.0 Monabanq Extrait de comptes au 2025-09-30.pdf
34 09/09/2025 VIR INST BATAILLE KEVIN Other 200.0 Monabanq Extrait de comptes au 2025-09-30.pdf
35 10/09/2025 VIR INST KEVIN BATAILLE Other 200.0 Monabanq Extrait de comptes au 2025-09-30.pdf
36 11/09/2025 VIR INST BOURSORAMA PERSO Other 247.0 Monabanq Extrait de comptes au 2025-09-30.pdf
37 11/09/2025 VIR INST KEVIN BATAILLE Other 200.0 Monabanq Extrait de comptes au 2025-09-30.pdf
38 11/09/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-09-30.pdf
39 14/09/2025 VIR INST BATAILLE KEVIN (REVOLU Other 130.0 Monabanq Extrait de comptes au 2025-09-30.pdf
40 14/09/2025 VIR INST KEVIN BATAILLE Other 270.0 Monabanq Extrait de comptes au 2025-09-30.pdf
41 21/09/2025 VIR INST BATAILLE KEVIN (REVOLU Other 100.0 Monabanq Extrait de comptes au 2025-09-30.pdf
42 21/09/2025 VIR INST BATAILLE KEVIN (REVOLU Other 100.0 Monabanq Extrait de comptes au 2025-09-30.pdf
43 23/09/2025 VIR INST BOURSORAMA PERSO Other 200.0 Monabanq Extrait de comptes au 2025-09-30.pdf
44 26/09/2025 VIR INST BOURSORAMA PERSO Other 350.0 Monabanq Extrait de comptes au 2025-09-30.pdf
45 30/09/2025 VIR INST BOURSORAMA PERSO Other 300.0 Monabanq Extrait de comptes au 2025-09-30.pdf
46 03/10/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-10-31.pdf
47 04/10/2025 ECH PRET 28943002099054 Loan Repayment 150.0 Monabanq Extrait de comptes au 2025-10-31.pdf
48 06/10/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-10-31.pdf
49 08/10/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-10-31.pdf
50 12/10/2025 VIR INST BOURSORAMA PERSO Other 700.0 Monabanq Extrait de comptes au 2025-10-31.pdf
51 23/10/2025 VIR INST BOURSORAMA PERSO Other 100.0 Monabanq Extrait de comptes au 2025-10-31.pdf
52 23/10/2025 VIR INST KEVIN BATAILLE Other 100.0 Monabanq Extrait de comptes au 2025-10-31.pdf
53 29/10/2025 VIR INST BOURSORAMA PERSO Other 90.0 Monabanq Extrait de comptes au 2025-10-31.pdf
54 30/10/2025 VIR INST BOURSORAMA PERSO Other 40.0 Monabanq Extrait de comptes au 2025-10-31.pdf
55 04/11/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-12-01.pdf
56 06/11/2025 ECH PRET 28943002099054 Loan Repayment 150.0 Monabanq Extrait de comptes au 2025-12-01.pdf
57 07/11/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-12-01.pdf
58 10/11/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-12-01.pdf
59 03/12/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-12-31.pdf
60 04/12/2025 F COTIS PRATIQ+ Bank Fees 3.0 Monabanq Extrait de comptes au 2025-12-31.pdf
61 06/12/2025 ECH PRET 28943002099054 Loan Repayment 150.0 Monabanq Extrait de comptes au 2025-12-31.pdf
62 09/12/2025 VIR MR BATAILLE KEVIN Internal Transfer 150.0 Monabanq Extrait de comptes au 2025-12-31.pdf
63 25/12/2025 VIR INST MR BATAILLE KEVIN Other 225.25 Monabanq Extrait de comptes au 2025-12-31.pdf

View File

@@ -1,28 +1,2 @@
Year,Month,Total Income,Total Expenses,Net Balance,Transaction Count,Institutions Year,Month,Total Income,Total Expenses,Net Balance,Transaction Count,Institutions
25,January,0,0,0,1,SNCF 2026,February,0,19534.26,19534.26,318,American Express
25,February,0,0,0,1,SNCF
25,March,0,0,0,1,SNCF
25,April,0,0,0,1,SNCF
25,May,0,0,0,1,SNCF
25,June,0,0,0,1,SNCF
25,July,0,0,0,1,SNCF
25,August,0,0,0,1,SNCF
25,September,0,0,0,1,SNCF
25,October,0,0,0,1,SNCF
25,November,0,0,0,1,SNCF
25,December,0,0,0,1,SNCF
26,January,0,0,0,1,SNCF
2025,January,0,21.48,21.48,2,Monabanq
2025,February,0,738.0,738.0,3,Monabanq
2025,March,0,710.64,710.64,6,Monabanq
2025,April,0,562.11,562.11,4,Monabanq
2025,May,0,21.0,21.0,3,Monabanq
2025,June,0,153.0,153.0,2,Monabanq
2025,July,0,1872.1100000000001,1872.1100000000001,6,Monabanq
2025,August,0,400.0,400.0,2,Monabanq
2025,September,0,3650.0,3650.0,16,Monabanq
2025,October,0,1483.0,1483.0,9,Monabanq
2025,November,0,453.0,453.0,4,Monabanq
2025,December,0,678.25,678.25,5,Monabanq
2026,January,0,523.9300000000001,523.9300000000001,5,Monabanq
2026,February,0,19534.26,19534.26,319,"American Express, SNCF"
1 Year Month Total Income Total Expenses Net Balance Transaction Count Institutions
2 25 2026 January February 0 0 19534.26 0 19534.26 1 318 SNCF American Express
25 February 0 0 0 1 SNCF
25 March 0 0 0 1 SNCF
25 April 0 0 0 1 SNCF
25 May 0 0 0 1 SNCF
25 June 0 0 0 1 SNCF
25 July 0 0 0 1 SNCF
25 August 0 0 0 1 SNCF
25 September 0 0 0 1 SNCF
25 October 0 0 0 1 SNCF
25 November 0 0 0 1 SNCF
25 December 0 0 0 1 SNCF
26 January 0 0 0 1 SNCF
2025 January 0 21.48 21.48 2 Monabanq
2025 February 0 738.0 738.0 3 Monabanq
2025 March 0 710.64 710.64 6 Monabanq
2025 April 0 562.11 562.11 4 Monabanq
2025 May 0 21.0 21.0 3 Monabanq
2025 June 0 153.0 153.0 2 Monabanq
2025 July 0 1872.1100000000001 1872.1100000000001 6 Monabanq
2025 August 0 400.0 400.0 2 Monabanq
2025 September 0 3650.0 3650.0 16 Monabanq
2025 October 0 1483.0 1483.0 9 Monabanq
2025 November 0 453.0 453.0 4 Monabanq
2025 December 0 678.25 678.25 5 Monabanq
2026 January 0 523.9300000000001 523.9300000000001 5 Monabanq
2026 February 0 19534.26 19534.26 319 American Express, SNCF

View File

@@ -1,5 +1,2 @@
Year,Total Income,Total Expenses,Net Balance,Transaction Count Year,Total Income,Total Expenses,Net Balance,Transaction Count
25,0,0.0,0.0,12 2026,0,19534.260000000013,19534.260000000013,318
26,0,0.0,0.0,1
2025,0,10742.59,10742.59,62
2026,0,20058.190000000013,20058.190000000013,324
1 Year Total Income Total Expenses Net Balance Transaction Count
2 25 2026 0 0.0 19534.260000000013 0.0 19534.260000000013 12 318
26 0 0.0 0.0 1
2025 0 10742.59 10742.59 62
2026 0 20058.190000000013 20058.190000000013 324

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Script to aggregate all account statements by month Script to aggregate all account statements by month or year
""" """
import os import os
@@ -106,21 +106,28 @@ def process_csv_file(file_path):
return transactions return transactions
def main(): def main():
parser = argparse.ArgumentParser(description='Aggregate all account statements by month') parser = argparse.ArgumentParser(description='Aggregate all account statements by month or year')
parser.add_argument('--input-dir', default='output/csv', parser.add_argument('--input-dir', default='output/csv',
help='Directory containing CSV files to aggregate (default: output/csv)') help='Directory containing CSV files to aggregate (default: output/csv)')
parser.add_argument('--output-dir', default='output/reports', parser.add_argument('--output-dir', default='output/reports',
help='Directory to save aggregated reports (default: output/reports)') help='Directory to save aggregated reports (default: output/reports)')
parser.add_argument('--annual', action='store_true',
help='Create annual reports instead of monthly reports')
parser.add_argument('--year', type=int,
help='Generate reports for a specific year only')
args = parser.parse_args() args = parser.parse_args()
# Create output directory # Create output directory
os.makedirs(args.output_dir, exist_ok=True) os.makedirs(args.output_dir, exist_ok=True)
report_type = "Annual" if args.annual else "Monthly"
print(f"\n{'='*60}") print(f"\n{'='*60}")
print(f"Monthly Aggregation of All Account Statements") print(f"{report_type} Aggregation of All Account Statements")
print(f"Input Directory: {os.path.abspath(args.input_dir)}") print(f"Input Directory: {os.path.abspath(args.input_dir)}")
print(f"Output Directory: {os.path.abspath(args.output_dir)}") print(f"Output Directory: {os.path.abspath(args.output_dir)}")
if args.year:
print(f"Year Filter: {args.year}")
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"{'='*60}") print(f"{'='*60}")
@@ -160,7 +167,7 @@ def main():
]) ])
# Process each month # Process each month
for (year, month) in sorted(monthly_transactions.keys()): for year, month in sorted(monthly_transactions.keys()):
transactions = monthly_transactions[(year, month)] transactions = monthly_transactions[(year, month)]
month_name = calendar.month_name[month] month_name = calendar.month_name[month]
@@ -180,8 +187,98 @@ def main():
transaction_count, institutions_str transaction_count, institutions_str
]) ])
# Create detailed monthly transactions file for each month # Create yearly summary
for (year, month) in sorted(monthly_transactions.keys()): yearly_summary = defaultdict(lambda: {'income': 0, 'expenses': 0, 'count': 0})
for transaction in all_transactions:
year = transaction['year']
yearly_summary[year]['count'] += 1
if transaction['amount'] < 0:
yearly_summary[year]['income'] += transaction['amount']
else:
yearly_summary[year]['expenses'] += transaction['amount']
# Create yearly summary file
yearly_file = os.path.join(args.output_dir, 'yearly_summary.csv')
with open(yearly_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Year', 'Total Income', 'Total Expenses', 'Net Balance', 'Transaction Count'])
for year in sorted(yearly_summary.keys()):
data = yearly_summary[year]
net_balance = data['income'] + data['expenses']
writer.writerow([
year, data['income'], data['expenses'], net_balance, data['count']
])
# Create annual reports if requested
generated_files = [
os.path.basename(summary_file),
os.path.basename(yearly_file)
]
if args.annual:
# Create annual reports
for year in sorted(yearly_summary.keys()):
if args.year and year != args.year:
continue # Skip years not matching filter
print(f"\nCreating annual report for {year}...")
# Get all transactions for the year
year_transactions = [t for t in all_transactions if t['year'] == year]
# Group by category for the annual report
categories = defaultdict(lambda: {'count': 0, 'total': 0})
for transaction in year_transactions:
category = transaction['category']
amount = transaction['amount']
categories[category]['count'] += 1
categories[category]['total'] += amount
# Create annual detailed report
annual_file = os.path.join(args.output_dir, f'annual_report_{year}.csv')
with open(annual_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Category', 'Transaction Count', 'Total Amount', 'Percentage'])
year_total = sum(c['total'] for c in categories.values())
# Sort categories by total amount
sorted_categories = sorted(categories.items(), key=lambda x: x[1]['total'], reverse=True)
for category, data in sorted_categories:
percentage = (data['total'] / year_total) * 100 if year_total != 0 else 0
writer.writerow([category, data['count'], data['total'], f"{percentage:.2f}%"])
# Create annual transactions file
annual_transactions_file = os.path.join(args.output_dir, f'annual_transactions_{year}.csv')
with open(annual_transactions_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=[
'Date', 'Description', 'Category', 'Amount',
'Institution', 'Source'
])
writer.writeheader()
# Sort transactions by date
sorted_transactions = sorted(year_transactions, key=lambda x: (x['month'], x['day'], x['description']))
for transaction in sorted_transactions:
writer.writerow({
'Date': transaction['date_str'],
'Description': transaction['description'],
'Category': transaction['category'],
'Amount': transaction['amount'],
'Institution': transaction['institution'],
'Source': transaction['source']
})
generated_files.append(os.path.basename(annual_file))
generated_files.append(os.path.basename(annual_transactions_file))
print(f" Created {os.path.basename(annual_file)} and {os.path.basename(annual_transactions_file)}")
else:
# Create monthly reports (existing functionality)
for year, month in sorted(monthly_transactions.keys()):
month_name = calendar.month_name[month].lower() month_name = calendar.month_name[month].lower()
transactions = monthly_transactions[(year, month)] transactions = monthly_transactions[(year, month)]
@@ -208,45 +305,18 @@ def main():
'Source': transaction['source'] 'Source': transaction['source']
}) })
# Create yearly summary generated_files.append(f'transactions_{year}_{month_name}.csv')
yearly_summary = defaultdict(lambda: {'income': 0, 'expenses': 0, 'count': 0})
for transaction in all_transactions:
year = transaction['year']
yearly_summary[year]['count'] += 1
if transaction['amount'] < 0:
yearly_summary[year]['income'] += transaction['amount']
else:
yearly_summary[year]['expenses'] += transaction['amount']
# Create yearly summary file
yearly_file = os.path.join(args.output_dir, 'yearly_summary.csv')
with open(yearly_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Year', 'Total Income', 'Total Expenses', 'Net Balance', 'Transaction Count'])
for year in sorted(yearly_summary.keys()):
data = yearly_summary[year]
net_balance = data['income'] + data['expenses']
writer.writerow([
year, data['income'], data['expenses'], net_balance, data['count']
])
# Print summary statistics # Print summary statistics
print(f"\n{'='*60}") print(f"\n{'='*60}")
print(f"Aggregation Complete") print(f"Aggregation Complete")
print(f"Total Transactions: {len(all_transactions)}") print(f"Total Transactions: {len(all_transactions)}")
print(f"Years with Data: {len(yearly_summary)}")
if not args.annual:
print(f"Months with Data: {len(monthly_transactions)}") print(f"Months with Data: {len(monthly_transactions)}")
print(f"{'='*60}") print(f"{'='*60}")
# List generated files # List generated files
generated_files = [
os.path.basename(summary_file),
os.path.basename(yearly_file)
]
for (year, month) in sorted(monthly_transactions.keys()):
month_name = calendar.month_name[month].lower()
generated_files.append(f'transactions_{year}_{month_name}.csv')
print("\nGenerated Files:") print("\nGenerated Files:")
for file in generated_files: for file in generated_files:
file_path = os.path.join(args.output_dir, file) file_path = os.path.join(args.output_dir, file)