Refactor SNCF processor and add Revolut aggregator
- Fix SNCF NET PAYÉ EN EUROS extraction to correctly parse MENSUEL line - Extract month/year from PDF content instead of filename - Add new Revolut CSV processor to aggregate account statements - Organize Revolut data files into data/csv/revolut/ - Clean up redundant scripts and reports
This commit is contained in:
BIN
data/pdf/boursobank/Releve-compte-28-02-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-28-02-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-28-11-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-28-11-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-29-08-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-29-08-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-30-01-2026.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-30-01-2026.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-30-04-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-30-04-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-30-05-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-30-05-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-30-06-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-30-06-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-30-09-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-30-09-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-31-01-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-31-01-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-31-03-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-31-03-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-31-07-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-31-07-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-31-10-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-31-10-2025.pdf
Normal file
Binary file not shown.
BIN
data/pdf/boursobank/Releve-compte-31-12-2025.pdf
Normal file
BIN
data/pdf/boursobank/Releve-compte-31-12-2025.pdf
Normal file
Binary file not shown.
206
docs/README.md
206
docs/README.md
@@ -1,206 +0,0 @@
|
|||||||
# Comptabilité Scripts
|
|
||||||
|
|
||||||
This repository contains Python scripts to process financial statements from various banks and financial institutions, extract transaction data, and categorize expenses.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- Processes PDF and CSV financial statements from multiple sources
|
|
||||||
- Categorizes transactions automatically based on descriptions
|
|
||||||
- Generates expense summaries with percentages
|
|
||||||
- Optional CSV output for all transactions
|
|
||||||
- Support for Boursobank, American Express, Monabanq, Revolut, SNCF, and La Poste
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
comptabilite/
|
|
||||||
├── .gitignore
|
|
||||||
├── docs/ # Documentation files
|
|
||||||
│ └── README.md
|
|
||||||
├── scripts/ # All processing scripts
|
|
||||||
│ ├── process_bourso.py # Boursobank account statements
|
|
||||||
│ ├── process_amex.py # American Express credit card statements
|
|
||||||
│ ├── process_monabanq.py # Monabanq account statements
|
|
||||||
│ ├── process_expenses.py # Revolut account statements (CSV format)
|
|
||||||
│ ├── process_sncf.py # SNCF salary statements
|
|
||||||
│ ├── process_laposte.py # La Poste (CCP) account statements
|
|
||||||
│ └── process_all.py # Master script that runs all processing scripts
|
|
||||||
├── data/ # Input data
|
|
||||||
│ ├── pdf/ # PDF statements by institution
|
|
||||||
│ │ ├── boursobank/
|
|
||||||
│ │ ├── american_express/
|
|
||||||
│ │ ├── monabanq/
|
|
||||||
│ │ ├── sncf/
|
|
||||||
│ │ ├── la_poste/
|
|
||||||
│ │ └── impots/
|
|
||||||
│ └── raw_csv/ # Raw CSV files (e.g., Revolut statements)
|
|
||||||
└── output/ # Generated output
|
|
||||||
├── csv/ # CSV exports of transactions
|
|
||||||
└── reports/ # Financial reports and summaries
|
|
||||||
```
|
|
||||||
|
|
||||||
## Scripts Overview
|
|
||||||
|
|
||||||
### Main Scripts
|
|
||||||
|
|
||||||
1. **process_bourso.py** - Processes Boursobank account statements
|
|
||||||
2. **process_amex.py** - Processes American Express credit card statements
|
|
||||||
3. **process_monabanq.py** - Processes Monabanq account statements
|
|
||||||
4. **process_expenses.py** - Processes Revolut account statements (CSV format)
|
|
||||||
5. **process_sncf.py** - Processes SNCF salary statements
|
|
||||||
6. **process_laposte.py** - Processes La Poste (CCP) account statements
|
|
||||||
|
|
||||||
### Master Script
|
|
||||||
|
|
||||||
- **process_all.py** - Master script that runs all processing scripts with unified options
|
|
||||||
- **export_all_csv.py** - Exports CSV files for all account statements in one run
|
|
||||||
- **aggregate_by_month.py** - Aggregates all account statements by month and creates reports
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Individual Scripts
|
|
||||||
|
|
||||||
From the `scripts/` directory:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Process without CSV output
|
|
||||||
python process_bourso.py
|
|
||||||
|
|
||||||
# Process with CSV output
|
|
||||||
python process_bourso.py --csv
|
|
||||||
|
|
||||||
# Process all PDFs in a specific directory
|
|
||||||
python process_bourso.py --pdf-dir ../data/pdf/boursobank --output-dir ../../output/csv --csv
|
|
||||||
```
|
|
||||||
|
|
||||||
### Master Scripts
|
|
||||||
|
|
||||||
From the `scripts/` directory, you can use these master scripts:
|
|
||||||
|
|
||||||
#### process_all.py
|
|
||||||
Process statements with the standard individual scripts:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Process all statements
|
|
||||||
python process_all.py
|
|
||||||
|
|
||||||
# Process all statements with CSV output
|
|
||||||
python process_all.py --csv
|
|
||||||
|
|
||||||
# Process only specific accounts
|
|
||||||
python process_all.py --bourso --amex --csv
|
|
||||||
```
|
|
||||||
|
|
||||||
#### export_all_csv.py
|
|
||||||
Export CSV files for all account statements in one run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Export all account statements to CSV
|
|
||||||
python export_all_csv.py
|
|
||||||
|
|
||||||
# Export to specific output directory
|
|
||||||
python export_all_csv.py --output-dir /path/to/output
|
|
||||||
```
|
|
||||||
|
|
||||||
#### dynamic_all_processor.py (NEW)
|
|
||||||
Fully dynamic processor that auto-discovers all PDF directories and processes them:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Automatically discover and process all accounts
|
|
||||||
python dynamic_all_processor.py
|
|
||||||
|
|
||||||
# Specify custom data directory
|
|
||||||
python dynamic_all_processor.py --data-dir /custom/path/to/pdfs
|
|
||||||
|
|
||||||
# Generate CSV outputs
|
|
||||||
python dynamic_all_processor.py --csv
|
|
||||||
|
|
||||||
# Custom data and output directories
|
|
||||||
python dynamic_all_processor.py --data-dir /path/to/pdfs --output-dir /path/to/output
|
|
||||||
```
|
|
||||||
|
|
||||||
**Features:**
|
|
||||||
- Automatically scans for any directory containing PDF files
|
|
||||||
- Processes all discovered directories without requiring predefined paths
|
|
||||||
- Handles special cases (Revolut uses CSV files, Impôts are skipped)
|
|
||||||
- Displays progress and results for each account type
|
|
||||||
- Provides clear success/failure feedback
|
|
||||||
|
|
||||||
#### aggregate_by_month.py
|
|
||||||
Create monthly and yearly aggregated reports from all CSV files:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Aggregate all transactions by month
|
|
||||||
python aggregate_by_month.py
|
|
||||||
|
|
||||||
# Specify input and output directories
|
|
||||||
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
|
|
||||||
|
|
||||||
When run with `--csv` flag, each script generates:
|
|
||||||
- Individual CSV files for each input file (when applicable)
|
|
||||||
- A consolidated CSV file containing all transactions in the `output/csv/` directory
|
|
||||||
|
|
||||||
The CSV files include:
|
|
||||||
- Date
|
|
||||||
- Description
|
|
||||||
- Category
|
|
||||||
- Amount/Debit/Credit
|
|
||||||
- Source file
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
- Python 3.6+
|
|
||||||
- pdftotext utility (for PDF processing)
|
|
||||||
- Required Python packages: csv, subprocess, re, os, glob, collections
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
1. Install pdftotext:
|
|
||||||
```bash
|
|
||||||
# Ubuntu/Debian
|
|
||||||
sudo apt-get install poppler-utils
|
|
||||||
|
|
||||||
# macOS
|
|
||||||
brew install poppler
|
|
||||||
|
|
||||||
# Windows
|
|
||||||
# Download from https://github.com/xfftt/poppler-windows/releases/
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Clone or download this repository
|
|
||||||
|
|
||||||
## CSV Export Feature
|
|
||||||
|
|
||||||
The scripts support exporting all transaction data to CSV format. This allows for:
|
|
||||||
- Further analysis in spreadsheet applications
|
|
||||||
- Data archiving
|
|
||||||
- Integration with other financial tools
|
|
||||||
- Transaction-level review and editing
|
|
||||||
|
|
||||||
To enable CSV export, add the `--csv` flag when running any script.
|
|
||||||
|
|
||||||
## Organization
|
|
||||||
|
|
||||||
This project has been reorganized with a clean directory structure:
|
|
||||||
- Input files are separated from processing scripts
|
|
||||||
- All generated outputs go to the `output/` directory
|
|
||||||
- Scripts are organized in their own directory
|
|
||||||
- Documentation is in the `docs/` directory
|
|
||||||
|
|
||||||
## Git Repository
|
|
||||||
|
|
||||||
This is a Git repository. To start tracking changes:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add .
|
|
||||||
git commit -m "Your commit message"
|
|
||||||
```
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Recommendation: Which Scripts to Keep or Remove
|
|
||||||
|
|
||||||
## Scripts to Remove (Useless):
|
|
||||||
|
|
||||||
1. quality_check.py, quality_control.py, simple_qc
|
|
||||||
- These are development/testing scripts
|
|
||||||
|
|
||||||
2. batch_qc.py
|
|
||||||
- Redundant quality checking
|
|
||||||
|
|
||||||
3. process_all.py (Optional)
|
|
||||||
- Superseded by export_all_csv.py
|
|
||||||
|
|
||||||
## Scripts to Keep (Essential):
|
|
||||||
|
|
||||||
1. export_all_csv.py
|
|
||||||
- Exports all account statements to CSV
|
|
||||||
|
|
||||||
2. aggregate_by_month.py
|
|
||||||
- Creates monthly and annual reports
|
|
||||||
|
|
||||||
3. Individual processing scripts (Optional)
|
|
||||||
- Keep only if you need to process specific accounts
|
|
||||||
188
finanancial_processor.py
Normal file
188
finanancial_processor.py
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Main script to process all financial statements with a clean one-file-per-structure
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import glob
|
||||||
|
import subprocess
|
||||||
|
import argparse
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# Import functionality from the dynamic processor
|
||||||
|
# Add the directory to the path so we can import it
|
||||||
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
from dynamic_processor import discover_pdf_directories, process_dynamic_pdf_files
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Main function with a clean, organized structure
|
||||||
|
"""
|
||||||
|
parser = argparse.ArgumentParser(description='Process financial statements with one file per entity')
|
||||||
|
parser.add_argument('--data-dir',
|
||||||
|
help='Base directory containing PDF files (default: auto-discovered)')
|
||||||
|
parser.add_argument('--output-dir', default=None,
|
||||||
|
help='Directory to save CSV output files (default: auto-discovered)')
|
||||||
|
parser.add_argument('--csv', action='store_true',
|
||||||
|
help='Generate CSV output files')
|
||||||
|
parser.add_argument('--single', action='store_true',
|
||||||
|
help='Process only the current entity (for testing)')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Get paths
|
||||||
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
project_root = os.path.dirname(script_dir)
|
||||||
|
|
||||||
|
# Determine data directory
|
||||||
|
if args.data_dir:
|
||||||
|
data_dir = args.data_dir
|
||||||
|
if not os.path.isabs(data_dir):
|
||||||
|
data_dir = os.path.join(project_root, data_dir)
|
||||||
|
else:
|
||||||
|
data_dir = os.path.join(project_root, 'data/pdf')
|
||||||
|
|
||||||
|
# Set output directory
|
||||||
|
output_dir = args.output_dir or os.path.join(project_root, 'output/csv')
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
print(f"\n{'='*60}")
|
||||||
|
print(f"Financial Statement Processor")
|
||||||
|
print(f"Data Directory: {os.path.abspath(data_dir)}")
|
||||||
|
print(f"Output Directory: {os.path.abspath(output_dir)}")
|
||||||
|
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||||
|
print(f"{'='*60}")
|
||||||
|
|
||||||
|
# Discover all PDF directories
|
||||||
|
pdf_dirs = discover_pdf_directories(data_dir)
|
||||||
|
|
||||||
|
if not pdf_dirs:
|
||||||
|
print("No directories with PDF files found!")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"\nDiscovered {len(pdf_dirs)} directories with PDF files:")
|
||||||
|
for account_type, info in pdf_dirs.items():
|
||||||
|
print(f" - {account_type}: {info['count']} files in {info['path']}")
|
||||||
|
|
||||||
|
# Process each account type to its own file
|
||||||
|
for account_type, info in pdf_dirs.items():
|
||||||
|
if account_type not in ['Boursobank', 'American Express', 'Monabanq', 'SNCF', 'La Poste']:
|
||||||
|
continue # Skip unsupported types
|
||||||
|
|
||||||
|
# Create a specialized processor for each account type
|
||||||
|
if account_type == 'Revolut':
|
||||||
|
# Special case for Revolut (CSV files)
|
||||||
|
process_revolut(data_dir, output_dir, args.csv)
|
||||||
|
else:
|
||||||
|
process_pdf_account(account_type, info, output_dir, args.csv, args.single)
|
||||||
|
|
||||||
|
print(f"\n{'='*60}")
|
||||||
|
print(f"Processing Complete")
|
||||||
|
|
||||||
|
def process_revolut(data_dir, output_dir, generate_csv, single_mode=False):
|
||||||
|
"""Process Revolut CSV files"""
|
||||||
|
# Revolut CSV files are in raw_csv directory
|
||||||
|
csv_dir = os.path.join(os.path.dirname(data_dir), 'raw_csv')
|
||||||
|
csv_files = glob.glob(os.path.join(csv_dir, "*.csv"))
|
||||||
|
|
||||||
|
if not csv_files:
|
||||||
|
print(f"No Revolut CSV files found in {csv_dir}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Sort files by date
|
||||||
|
csv_files.sort()
|
||||||
|
|
||||||
|
for csv_file in csv_files:
|
||||||
|
print(f"Processing Revolut CSV: {os.path.basename(csv_file)}")
|
||||||
|
|
||||||
|
# Build the command
|
||||||
|
cmd = [
|
||||||
|
sys.executable,
|
||||||
|
os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||||
|
'process_expenses.py',
|
||||||
|
'--csv-dir', csv_dir,
|
||||||
|
'--output-dir', output_dir
|
||||||
|
]
|
||||||
|
|
||||||
|
if generate_csv:
|
||||||
|
cmd.append('--csv')
|
||||||
|
|
||||||
|
if single_mode:
|
||||||
|
cmd.append('--single')
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = subprocess.run(cmd, check=True, capture_output=True)
|
||||||
|
if result.stdout:
|
||||||
|
print(result.stdout)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Error processing {csv_file}: {e}")
|
||||||
|
|
||||||
|
def process_pdf_account(account_type, info, output_dir, generate_csv, single_mode=False):
|
||||||
|
"""Create and run a specialized processor for a PDF-based account"""
|
||||||
|
# Create a temporary processor script
|
||||||
|
processor_name = f"{account_type.lower().replace(' ', '_')}_processor.py"
|
||||||
|
|
||||||
|
processor_content = f'''#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Temporary processor for {account_type}
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import glob
|
||||||
|
import csv
|
||||||
|
|
||||||
|
def main():
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Process {account_type} statements')
|
||||||
|
parser.add_argument('--pdf-dir')
|
||||||
|
parser.add_argument('--output-dir')
|
||||||
|
parser.add_argument('--csv')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
cmd = [
|
||||||
|
sys.executable, os.path.join(os.path.dirname(os.path.abspath(__file__))),
|
||||||
|
'process_{"account_type.lower().replace(' ', '_')}.py',
|
||||||
|
'--pdf-dir', args.pdf_dir,
|
||||||
|
'--output-dir', args.output_dir
|
||||||
|
]
|
||||||
|
|
||||||
|
if args.csv:
|
||||||
|
cmd.append('--csv')
|
||||||
|
|
||||||
|
subprocess.run(cmd, check=True)
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Write the processor script
|
||||||
|
processor_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), processor_name)
|
||||||
|
with open(processor_path, 'w') as f:
|
||||||
|
f.write(processor_content)
|
||||||
|
|
||||||
|
# Make it executable and run it
|
||||||
|
os.chmod(processor_path, 0o755)
|
||||||
|
|
||||||
|
cmd = [sys.executable, processor_path, '--pdf-dir', info['path'], '--output-dir', output_dir]
|
||||||
|
|
||||||
|
if generate_csv:
|
||||||
|
cmd.append('--csv')
|
||||||
|
|
||||||
|
if single_mode:
|
||||||
|
cmd.append('--single')
|
||||||
|
|
||||||
|
print(f"Running: {' '.join(cmd[2:])}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = subprocess.run(cmd, check=True, capture_output=True)
|
||||||
|
if result.stdout:
|
||||||
|
print(result.stdout)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Error: {e}")
|
||||||
|
|
||||||
|
# Clean up the temporary script
|
||||||
|
os.remove(processor_path)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
53
output/csv/boursobank_all_transactions.csv
Normal file
53
output/csv/boursobank_all_transactions.csv
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
Date,Description,Category,Debit,Credit,Value Date
|
||||||
|
01/12/2025,PRLV SEPA ORANGE SA-ORANGE,Utilities,18.96,0,01/12/2025
|
||||||
|
01/12/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),12.6,0,01/12/2025
|
||||||
|
01/12/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),23.96,0,01/12/2025
|
||||||
|
01/12/2025,CARTE 27/11/25 ESPACE YOYO CB*6131,Card Payment,3.0,0,01/12/2025
|
||||||
|
01/12/2025,CARTE 28/11/25 REST DU MOULIN CB*6131,Card Payment,4.5,0,01/12/2025
|
||||||
|
01/12/2025,CARTE 28/11/25 REST DU MOULIN CB*6131,Card Payment,15.0,0,01/12/2025
|
||||||
|
01/12/2025,CARTE 28/11/25 REST DU MOULIN CB*6131,Card Payment,31.4,0,01/12/2025
|
||||||
|
11/12/2025,CARTE 10/12/25 MEYCLUB CB*6131,Card Payment,10.5,0,11/12/2025
|
||||||
|
12/12/2025,VIR Virement depuis COMPTE SUR LIVRE,Other,70.0,0,12/12/2025
|
||||||
|
12/12/2025,VIR INST KEVIN BATAILLE,Other,41.63,0,12/12/2025
|
||||||
|
12/12/2025,VIR INST MR BATAILLE KEVIN,Other,353.51,0,12/12/2025
|
||||||
|
12/12/2025,PRLV SEPA American Express Carte-France,Credit Card Payment (Amex),402.48,0,12/12/2025
|
||||||
|
12/12/2025,CARTE 10/12/25 UGC BORNES BERCY2 CB*6131,Card Payment,13.9,0,12/12/2025
|
||||||
|
15/12/2025,CARTE 13/12/25 PAUL 2 CB*6131,Card Payment,7.9,0,15/12/2025
|
||||||
|
15/12/2025,CARTE 14/12/25 LE PABLO CB*6131,Card Payment,3.0,0,15/12/2025
|
||||||
|
15/12/2025,CARTE 13/12/25 LAURA TODD CB*6131,Card Payment,5.8,0,15/12/2025
|
||||||
|
16/12/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),24.91,0,16/12/2025
|
||||||
|
16/12/2025,RETRAIT DAB 13/12/25 VELIZY CTRE CB*6131,Cash Withdrawal,30.0,0,16/12/2025
|
||||||
|
16/12/2025,CARTE 14/12/25 LE PABLO CB*6131,Card Payment,10.0,0,16/12/2025
|
||||||
|
16/12/2025,CARTE 14/12/25 LE PABLO CB*6131,Card Payment,10.0,0,16/12/2025
|
||||||
|
18/12/2025,VIR INST MR BATAILLE KEVIN,Other,110.97,0,18/12/2025
|
||||||
|
18/12/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),15.7,0,18/12/2025
|
||||||
|
19/12/2025,CARTE 18/12/25 BK PRODUCTIONS CB*6131,Card Payment,12.0,0,19/12/2025
|
||||||
|
22/12/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),10.6,0,22/12/2025
|
||||||
|
10/11/2025,VIR INST MR BATAILLE KEVIN,Other,252.69,0,08/11/2025
|
||||||
|
10/11/2025,VIR INST KEVIN BATAILLE,Other,54.71,0,08/11/2025
|
||||||
|
10/11/2025,PRLV SEPA American Express Carte-France,Credit Card Payment (Amex),246.91,0,10/11/2025
|
||||||
|
11/11/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),15.5,0,11/11/2025
|
||||||
|
11/11/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),23.8,0,11/11/2025
|
||||||
|
13/11/2025,VIR INST MR BATAILLE KEVIN,Other,170.0,0,13/11/2025
|
||||||
|
13/11/2025,ECH PRET:80486000604801731111,Loan Repayment,166.66,0,13/11/2025
|
||||||
|
18/11/2025,CARTE 17/11/25 B VICTOR HUGO CB*6131,Card Payment,5.2,0,18/11/2025
|
||||||
|
19/11/2025,CARTE 17/11/25 SC-PBO CB*6131,Card Payment,9.5,0,19/11/2025
|
||||||
|
24/11/2025,VIR Versement Financement CLIC,Other,500.0,0,24/11/2025
|
||||||
|
24/11/2025,PRLV SEPA BASIC FIT FRANCE,Other,34.98,0,24/11/2025
|
||||||
|
24/11/2025,CARTE 23/11/25 B VICTOR HUGO CB*6131,Card Payment,6.75,0,24/11/2025
|
||||||
|
24/11/2025,PRLV FRAIS CLIC,Other,5.0,0,24/11/2025
|
||||||
|
25/11/2025,CARTE 24/11/25 TRADI. DE CHATIL CB*6131,Card Payment,5.3,0,25/11/2025
|
||||||
|
26/11/2025,CARTE 25/11/25 MINT CB*6131,Card Payment,7.5,0,26/11/2025
|
||||||
|
26/11/2025,CARTE 24/11/25 SC-PBO CB*6131,Card Payment,9.5,0,26/11/2025
|
||||||
|
26/11/2025,CARTE 25/11/25 BIGEM INTERMARCHE CB*6131,Card Payment,20.56,0,26/11/2025
|
||||||
|
27/11/2025,VIR INST KEVIN BATAILLE,Other,74.0,0,27/11/2025
|
||||||
|
27/11/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),30.98,0,27/11/2025
|
||||||
|
27/11/2025,CARTE 26/11/25 SumUp *ANAS FRUI CB*6131,Card Payment,20.0,0,27/11/2025
|
||||||
|
27/11/2025,CARTE 26/11/25 LA ROTISSERIE CB*6131,Card Payment,7.0,0,27/11/2025
|
||||||
|
28/11/2025,CARTE 27/11/25 BK PRODUCTIONS CB*6131,Card Payment,12.0,0,28/11/2025
|
||||||
|
28/11/2025,CARTE 27/11/25 BK PRODUCTIONS CB*6131,Card Payment,12.0,0,28/11/2025
|
||||||
|
28/11/2025,CARTE 27/11/25 MINT CB*6131,Card Payment,6.5,0,28/11/2025
|
||||||
|
11/07/2025,VIR INST M KEVIN BATAILLE,Other,761.24,0,11/07/2025
|
||||||
|
11/07/2025,PRLV SEPA American Express Carte-France,Credit Card Payment (Amex),866.28,0,11/07/2025
|
||||||
|
11/02/2025,PRLV SEPA PayPal Europe S.a.r.l. et Cie,Online Purchases (Paypal),13.2,0,11/02/2025
|
||||||
|
11/02/2025,CARTE 11/02/25 infomaniak.com CB*5253,Card Payment,20.62,0,11/02/2025
|
||||||
|
542
output/csv/laposte_all_transactions.csv
Normal file
542
output/csv/laposte_all_transactions.csv
Normal file
@@ -0,0 +1,542 @@
|
|||||||
|
Date,Description,Category,Amount,Source
|
||||||
|
,27/12,Other,2524.14,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,31/12,Other,2000.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,02/01,Other,55.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,02/01,Other,350.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,03/01,Other,22.05,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,06/01,Other,29.95,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,06/01,Other,234.72,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,06/01,Other,1017.2,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,06/01,Other,100.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,08/01,Other,24.99,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,08/01,Other,43.5,releve_CCP0447956B018_20250121.pdf
|
||||||
|
10/01,VIREMENT DE MR BATAILLE KEVIN,Transfer,500.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
10/01,VIREMENT INSTANTANE A,Transfer,291.74,releve_CCP0447956B018_20250121.pdf
|
||||||
|
20/01,VIREMENT INSTANTANE DE,Transfer,20.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,31/12 INTERETS ACQUIS POUR 2024,Other,21.26,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,06/01 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,09/01 VIREMENT POUR,Transfer,500.0,releve_CCP0447956B018_20250121.pdf
|
||||||
|
,29/01,Other,2516.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,03/02,Other,227.26,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,03/02,Other,130.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,03/02,Other,200.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,03/02,Other,800.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,03/02,Other,136.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,03/02,Other,350.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,04/02,Other,29.95,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,05/02,Other,300.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,05/02,Other,100.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,06/02,Other,500.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,06/02,Other,100.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,06/02,Other,150.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
06/02,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1029.58,releve_CCP0447956B018_20250221.pdf
|
||||||
|
10/02,PRELEVEMENT DE Bouygues Telecom,Utilities,24.99,releve_CCP0447956B018_20250221.pdf
|
||||||
|
10/02,PRELEVEMENT DE MUTUELLE ENTRAIN COT,Other,43.5,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,02/02 VIREMENT DE MR BATAILLE KEVIN,Transfer,200.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,05/02 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,06/02 VIREMENT POUR,Transfer,500.0,releve_CCP0447956B018_20250221.pdf
|
||||||
|
,24/02,Other,300.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,24/02,Other,150.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,26/02,Other,2542.5,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,27/02,Other,700.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,27/02,Other,700.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,03/03,Other,78.82,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,03/03,Other,100.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
03/03,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
03/03,VIREMENT PERMANENT POUR,Transfer,350.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
04/03,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20250321.pdf
|
||||||
|
05/03,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
06/03,VIREMENT INSTANTANE DE,Transfer,300.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
06/03,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1029.58,releve_CCP0447956B018_20250321.pdf
|
||||||
|
10/03,VIREMENT DE MR BATAILLE GEORGES,Transfer,300.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
10/03,PRELEVEMENT DE Bouygues Telecom,Utilities,36.24,releve_CCP0447956B018_20250321.pdf
|
||||||
|
11/03,PRELEVEMENT DE MUTUELLE ENTRAIN COT,Other,43.5,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,22/02 VIREMENT POUR,Transfer,300.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,05/03 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250321.pdf
|
||||||
|
,24/03,Other,40.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,26/03,Other,60.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,28/03,Other,2542.5,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,28/03,Other,40.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,31/03,Other,69.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,31/03,Other,60.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,31/03,Other,50.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,31/03,Other,491.63,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,01/04,Other,131.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,02/04,Other,22.05,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,02/04,Other,350.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,04/04,Other,29.95,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,07/04,Other,100.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
07/04,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1029.58,releve_CCP0447956B018_20250418.pdf
|
||||||
|
07/04,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
07/04,VIREMENT INSTANTANE A,Transfer,200.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
07/04,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
08/04,PRELEVEMENT DE Bouygues Telecom,Utilities,39.99,releve_CCP0447956B018_20250418.pdf
|
||||||
|
09/04,PRELEVEMENT DE MUTUELLE ENTRAIN COT,Other,43.5,releve_CCP0447956B018_20250418.pdf
|
||||||
|
10/04,VIREMENT DE MR BATAILLE KEVIN,Transfer,150.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
10/04,VIREMENT INSTANTANE A,Transfer,30.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
10/04,VIREMENT INSTANTANE A,Transfer,45.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
11/04,VIREMENT DE MR BATAILLE GEORGES,Transfer,300.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
14/04,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
14/04,VIREMENT INSTANTANE A,Transfer,50.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,07/04 VIREMENT POUR,Transfer,100.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,07/04 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,10/04 VIREMENT POUR,Transfer,150.0,releve_CCP0447956B018_20250418.pdf
|
||||||
|
,22/04,Other,9.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,28/04,Other,4208.38,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,28/04,Other,100.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,02/05,Other,69.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,02/05,Other,1000.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,02/05,Other,167.31,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,02/05,Other,800.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,05/05,Other,100.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
06/05,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20250521.pdf
|
||||||
|
09/05,PRELEVEMENT DE Bouygues Telecom,Utilities,39.99,releve_CCP0447956B018_20250521.pdf
|
||||||
|
09/05,PRELEVEMENT DE MUTUELLE ENTRAIN COT,Other,43.5,releve_CCP0447956B018_20250521.pdf
|
||||||
|
12/05,VIREMENT INSTANTANE A,Transfer,200.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
12/05,VIREMENT INSTANTANE A,Transfer,500.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
14/05,VIREMENT DE MR BATAILLE GEORGES,Transfer,300.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
15/05,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1029.58,releve_CCP0447956B018_20250521.pdf
|
||||||
|
19/05,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
20/05,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,05/05 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250521.pdf
|
||||||
|
,23/05,Other,127.98,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,26/05,Other,60.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,26/05,Other,100.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,28/05,Other,3082.84,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,02/06,Other,69.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,02/06,Other,100.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,02/06,Other,100.84,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,02/06,Other,282.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,03/06,Other,100.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,03/06,Other,500.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
03/06,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
04/06,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20250620.pdf
|
||||||
|
05/06,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1029.58,releve_CCP0447956B018_20250620.pdf
|
||||||
|
05/06,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
10/06,PRELEVEMENT DE Bouygues Telecom,Utilities,39.99,releve_CCP0447956B018_20250620.pdf
|
||||||
|
10/06,PRELEVEMENT DE MUTUELLE ENTRAIN COT,Other,43.5,releve_CCP0447956B018_20250620.pdf
|
||||||
|
12/06,VIREMENT DE MR BATAILLE GEORGES,Transfer,300.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
16/06,VIREMENT INSTANTANE A,Transfer,237.98,releve_CCP0447956B018_20250620.pdf
|
||||||
|
19/06,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,05/06 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250620.pdf
|
||||||
|
,23/06,Other,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,23/06,Other,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,23/06,Other,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,23/06,Other,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,24/06,Other,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,27/06,Other,3020.27,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,30/06,Other,150.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,01/07,Other,69.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,01/07,Other,110.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,01/07,Other,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,02/07,Other,22.05,releve_CCP0447956B018_20250721.pdf
|
||||||
|
02/07,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
04/07,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20250721.pdf
|
||||||
|
04/07,VIREMENT INSTANTANE A,Transfer,750.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
07/07,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,904.06,releve_CCP0447956B018_20250721.pdf
|
||||||
|
07/07,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
07/07,VIREMENT INSTANTANE A,Transfer,99.17,releve_CCP0447956B018_20250721.pdf
|
||||||
|
07/07,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
07/07,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
08/07,PRELEVEMENT DE Bouygues Telecom,Utilities,39.99,releve_CCP0447956B018_20250721.pdf
|
||||||
|
08/07,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
09/07,PRELEVEMENT DE MUTUELLE ENTRAIN COT,Other,43.5,releve_CCP0447956B018_20250721.pdf
|
||||||
|
09/07,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
09/07,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
11/07,VIREMENT INSTANTANE DE,Transfer,461.15,releve_CCP0447956B018_20250721.pdf
|
||||||
|
11/07,VIREMENT INSTANTANE A,Transfer,50.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
15/07,VIREMENT DE MR BATAILLE GEORGES,Transfer,300.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
15/07,VIREMENT INSTANTANE A,Transfer,110.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
15/07,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,VIREMENT INSTANTANE DE,Transfer,200.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB SC-100 % CROUS 20.07.25,Other,1.5,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB ALICE PIZZA 19.07.25,Other,4.85,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB MEZZE DU VILLA 19.07.25,Other,9.5,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB L S B A 19.07.25,Other,10.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB SC-100 % CROUS 20.07.25,Other,11.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB ELEGANCE ET PR 19.07.25,Other,12.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB ELEGANCE ET PR 19.07.25,Other,12.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB ELEGANCE ET PR 19.07.25,Other,12.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB ELECTRO DEPOT 19.07.25,Other,60.48,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB Belisoft 20.07.25,Other,92.72,releve_CCP0447956B018_20250721.pdf
|
||||||
|
21/07,ACHAT CB L S B A 19.07.25,Other,95.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,07/07 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250721.pdf
|
||||||
|
,22/07,Other,18.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,22/07,Other,44.19,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,23/07,Other,11.31,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,23/07,Other,33.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,25/07,Other,6.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,25/07,Other,11.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,25/07,Other,11.4,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,25/07,Other,23.5,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,25/07,Other,24.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,25/07,Other,24.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
25/07,ACHAT CB L'EMBARCADERE 25.07.25,Other,28.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB L'ESSENTIEL 26.07.25,Other,4.2,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB SIX EPIS D'OR 26.07.25,Other,4.8,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB SUMUP *MALAK 25.07.25,Other,4.9,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB RELAY 26.07.25,Other,5.8,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB LE TABAC DE L 26.07.25,Other,6.9,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB AFCHAIN LAUREN 25.07.25,Other,7.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB RELAY 25.07.25,Other,9.3,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB BIGEM INTERMAR 25.07.25,Other,23.27,releve_CCP0447956B018_20250821.pdf
|
||||||
|
28/07,ACHAT CB BARBER CIE VEL 26.07.25,Other,35.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
29/07,VIREMENT DE SNCF RESEAU,Transfer,2371.73,releve_CCP0447956B018_20250821.pdf
|
||||||
|
31/07,PRELEVEMENT DE EDF clients particul,Utilities,69.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
01/08,VIREMENT INSTANTANE A,Transfer,449.81,releve_CCP0447956B018_20250821.pdf
|
||||||
|
01/08,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB BRIOCHE DOREE 02.08.25,Other,3.9,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB COLUMBUS CAFE 01.08.25,Other,4.7,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB fournildevanve 02.08.25,Other,5.2,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB BARAKA 4 01.08.25,Other,6.75,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB BARAKA 4 01.08.25,Other,8.15,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB BRENDY S CAFE 02.08.25,Other,13.95,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB BIGEM INTERMAR 02.08.25,Other,15.97,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB DB DISTRIBUTIO 03.08.25,Other,17.15,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB RESTO SAS XB 03.08.25,Other,19.5,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,ACHAT CB MAG0080 02.08.25,Other,26.18,releve_CCP0447956B018_20250821.pdf
|
||||||
|
04/08,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
05/08,ACHAT CB BARAKA 4 04.08.25,Other,7.3,releve_CCP0447956B018_20250821.pdf
|
||||||
|
05/08,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20250821.pdf
|
||||||
|
05/08,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1022.58,releve_CCP0447956B018_20250821.pdf
|
||||||
|
05/08,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
07/08,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
08/08,VIREMENT DE MR BATAILLE KEVIN,Transfer,171.26,releve_CCP0447956B018_20250821.pdf
|
||||||
|
08/08,VIREMENT INSTANTANE DE,Transfer,209.33,releve_CCP0447956B018_20250821.pdf
|
||||||
|
08/08,PRELEVEMENT DE Bouygues Telecom,Utilities,39.99,releve_CCP0447956B018_20250821.pdf
|
||||||
|
08/08,VIREMENT INSTANTANE A,Transfer,450.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,VIREMENT DE MR BATAILLE KEVIN,Transfer,150.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,VIREMENT DE MR BATAILLE KEVIN,Transfer,250.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,ACHAT CB fournildevanve 09.08.25,Other,5.8,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,ACHAT CB KEHIL 10.08.25,Other,10.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,ACHAT CB TLMP 09.08.25,Other,11.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,ACHAT CB ALIM KAJOL MAR 09.08.25,Other,17.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,ACHAT CB TLMP 09.08.25,Other,33.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,PRELEVEMENT DE MUTUELLE ENTRAIN COT,Other,43.5,releve_CCP0447956B018_20250821.pdf
|
||||||
|
11/08,VIREMENT INSTANTANE A,Transfer,200.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
12/08,VIREMENT DE MR BATAILLE GEORGES,Transfer,300.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
18/08,ACHAT CB BARAKA 4 17.08.25,Other,15.5,releve_CCP0447956B018_20250821.pdf
|
||||||
|
18/08,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
18/08,VIREMENT INSTANTANE A,Transfer,59.02,releve_CCP0447956B018_20250821.pdf
|
||||||
|
19/08,CARTE X0449 16/08/25 A 23H29,Card Payment,30.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,05/08 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,07/08 VIREMENT POUR,Transfer,171.26,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,09/08 VIREMENT POUR,Transfer,250.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,09/08 VIREMENT POUR,Transfer,150.0,releve_CCP0447956B018_20250821.pdf
|
||||||
|
,22/08,Other,2.3,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,22/08,Other,7.3,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,22/08,Other,10.4,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,22/08,Other,12.6,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,22/08,Other,100.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,25/08,Other,60.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
25/08,ACHAT CB LIBERTALIA-LIB 23.08.25,Other,12.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
25/08,ACHAT CB LIBERTALIA-LIB 23.08.25,Other,20.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
28/08,VIREMENT DE SNCF RESEAU,Transfer,2371.73,releve_CCP0447956B018_20250919.pdf
|
||||||
|
01/09,ACHAT CB SUMUP *MYC NI 31.08.25,Other,30.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
01/09,ACHAT CB SumUp *MYC NI 31.08.25,Other,40.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
01/09,ACHAT CB SUMUP *MYC NI 31.08.25,Other,251.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
01/09,PRELEVEMENT DE EDF clients particul,Utilities,69.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
01/09,VIREMENT INSTANTANE A,Transfer,400.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
01/09,VIREMENT POUR,Transfer,111.63,releve_CCP0447956B018_20250919.pdf
|
||||||
|
02/09,CARTE X0449 31/08/25 A 06H06,Card Payment,20.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
02/09,ACHAT CB BIZOUK 02.09.25,Other,10.99,releve_CCP0447956B018_20250919.pdf
|
||||||
|
02/09,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
03/09,ACHAT CB BIGEM INTERMAR 02.09.25,Other,48.63,releve_CCP0447956B018_20250919.pdf
|
||||||
|
04/09,ACHAT CB BIGEM INTERMAR 03.09.25,Other,14.6,releve_CCP0447956B018_20250919.pdf
|
||||||
|
04/09,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20250919.pdf
|
||||||
|
05/09,ACHAT CB RESTO SAS XB 04.09.25,Other,3.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
05/09,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1022.58,releve_CCP0447956B018_20250919.pdf
|
||||||
|
05/09,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB AMORINO 06.09.25,Other,6.5,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB SUMUP *NOUT T 07.09.25,Other,8.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB MANGOS VL2 06.09.25,Other,8.95,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB LIBERTALIA-LIB 07.09.25,Other,12.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB LIBERTALIA-LIB 07.09.25,Other,12.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB LIBERTALIA-LIB 07.09.25,Other,12.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB LIBERTALIA 07.09.25,Other,20.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB Rituals 06.09.25,Other,39.9,releve_CCP0447956B018_20250919.pdf
|
||||||
|
08/09,ACHAT CB MAROUCH 07.09.25,Other,85.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
09/09,ACHAT CB BARAKA 4 08.09.25,Other,9.7,releve_CCP0447956B018_20250919.pdf
|
||||||
|
10/09,VIREMENT INSTANTANE DE,Transfer,200.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
10/09,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
11/09,VIREMENT INSTANTANE DE,Transfer,200.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
11/09,ACHAT CB BIGEM INTERMAR 10.09.25,Other,14.81,releve_CCP0447956B018_20250919.pdf
|
||||||
|
12/09,ACHAT CB RELAY 11.09.25,Other,13.35,releve_CCP0447956B018_20250919.pdf
|
||||||
|
12/09,ACHAT CB BOUYGUES APP 11.09.25,Utilities,42.99,releve_CCP0447956B018_20250919.pdf
|
||||||
|
12/09,RETRAIT Av de J Igles 11.09.25,Cash Withdrawal,24.95,releve_CCP0447956B018_20250919.pdf
|
||||||
|
15/09,VIREMENT INSTANTANE DE,Transfer,270.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
15/09,ACHAT CB AVANZA MOVILID 11.09.25,Other,6.33,releve_CCP0447956B018_20250919.pdf
|
||||||
|
15/09,ACHAT CB CONGA 14.09.25,Other,7.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
15/09,ACHAT CB HELADERIA GINO 12.09.25,Other,8.7,releve_CCP0447956B018_20250919.pdf
|
||||||
|
15/09,ACHAT CB ATELIER DE EMP 12.09.25,Other,10.5,releve_CCP0447956B018_20250919.pdf
|
||||||
|
15/09,ACHAT CB SUPERMARKET CI 13.09.25,Other,23.5,releve_CCP0447956B018_20250919.pdf
|
||||||
|
16/09,VIREMENT DE MR BATAILLE GEORGES,Transfer,150.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
16/09,CARTE X0449 14/09/25 A 20H36,Card Payment,90.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
17/09,ACHAT CB 20811 TBC 16.09.25,Other,35.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
19/09,ACHAT CB COLUMBUS CAFE 18.09.25,Other,4.9,releve_CCP0447956B018_20250919.pdf
|
||||||
|
19/09,ACHAT CB TRADI. DE CHAT 18.09.25,Other,9.6,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,01/09 VIREMENT DE MR BATAILLE KEVIN,Transfer,111.63,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,05/09 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20250919.pdf
|
||||||
|
,22/09,Other,9.3,releve_CCP0447956B018_20251006.pdf
|
||||||
|
,22/09,Other,9.7,releve_CCP0447956B018_20251006.pdf
|
||||||
|
,22/09,Other,11.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
,25/09,Other,10.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
,26/09,Other,2496.05,releve_CCP0447956B018_20251006.pdf
|
||||||
|
,26/09,Other,8.7,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB SIX EPIS D'OR 27.09.25,Other,4.2,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB MCDONALDS 101 27.09.25,Other,4.5,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB COLUMBUS CAFE 26.09.25,Other,4.9,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB MM EVENT 28.09.25,Other,10.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB MM EVENT 28.09.25,Other,10.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB SC-SARL AMH 28.09.25,Other,10.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB SC-SARL AMH 28.09.25,Other,10.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB BARAKA 4 28.09.25,Other,14.95,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB NOUVEAU CHALET 28.09.25,Other,24.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB NOUVEAU CHALET 28.09.25,Other,25.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
29/09,ACHAT CB MM EVENT 28.09.25,Other,50.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
01/10,PRELEVEMENT DE EDF clients particul,Utilities,69.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
01/10,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
02/10,COTISATION TRIMESTRIELLE,Bank Fees,22.05,releve_CCP0447956B018_20251006.pdf
|
||||||
|
02/10,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
06/10,ACHAT CB COLUMBUS CAFE 05.10.25,Other,4.9,releve_CCP0447956B018_20251006.pdf
|
||||||
|
06/10,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20251006.pdf
|
||||||
|
06/10,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1022.58,releve_CCP0447956B018_20251006.pdf
|
||||||
|
06/10,VIREMENT INSTANTANE A,Transfer,130.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
06/10,VIREMENT INSTANTANE A,Transfer,333.32,releve_CCP0447956B018_20251006.pdf
|
||||||
|
06/10,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20251006.pdf
|
||||||
|
,07/10,Other,6.99,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,07/10,Other,10.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,07/10,Other,311.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,07/10,Other,150.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,08/10,Other,18.04,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,08/10,Other,24.9,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,08/10,Other,52.99,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,08/10,Other,87.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,09/10,Other,5.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,09/10,Other,7.05,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,09/10,Other,14.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
13/10,VIREMENT DE MR BATAILLE KEVIN,Transfer,311.64,releve_CCP0447956B018_20251105.pdf
|
||||||
|
13/10,VIREMENT INSTANTANE A,Transfer,200.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
14/10,VIREMENT DE MR BATAILLE GEORGES,Transfer,150.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
15/10,ACHAT CB CAFE JOSEPH 14.10.25,Other,4.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
15/10,ACHAT CB POUSSE PAS MEM 14.10.25,Other,16.4,releve_CCP0447956B018_20251105.pdf
|
||||||
|
16/10,ACHAT CB RELAY MONOP OC 15.10.25,Other,9.7,releve_CCP0447956B018_20251105.pdf
|
||||||
|
17/10,ACHAT CB HORETO PARIS 16.10.25,Other,9.9,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB BARAKA 4 19.10.25,Other,4.15,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB SAS LA RENAISS 18.10.25,Other,4.2,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB COLUMBUS CAFE 19.10.25,Other,4.7,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB Maison Besnier 17.10.25,Other,6.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB L'ESSENTIEL 17.10.25,Other,7.2,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB BARAKA 4 17.10.25,Other,7.8,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB WAFFLE FACTORY 18.10.25,Other,8.6,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB SumUp *L oasi 17.10.25,Other,17.4,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB RECYCLEWARE-MI 18.10.25,Other,21.99,releve_CCP0447956B018_20251105.pdf
|
||||||
|
20/10,ACHAT CB BIGEM INTERMAR 19.10.25,Other,30.85,releve_CCP0447956B018_20251105.pdf
|
||||||
|
21/10,ACHAT CB LA SEVINOISE 20.10.25,Other,4.5,releve_CCP0447956B018_20251105.pdf
|
||||||
|
22/10,ACHAT CB MINT 21.10.25,Other,9.1,releve_CCP0447956B018_20251105.pdf
|
||||||
|
22/10,ACHAT CB BIGEM INTERMAR 21.10.25,Other,30.51,releve_CCP0447956B018_20251105.pdf
|
||||||
|
23/10,ACHAT CB SC-PBO 22.10.25,Other,7.5,releve_CCP0447956B018_20251105.pdf
|
||||||
|
24/10,VIREMENT INSTANTANE WERO DE,Transfer,20.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
27/10,CARTE X0449 25/10/25 A 17H53,Card Payment,20.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
27/10,ACHAT CB PAUL 25.10.25,Other,2.4,releve_CCP0447956B018_20251105.pdf
|
||||||
|
27/10,ACHAT CB TRADI. DE CHAT 26.10.25,Other,4.05,releve_CCP0447956B018_20251105.pdf
|
||||||
|
27/10,ACHAT CB Maison Besnier 24.10.25,Other,5.58,releve_CCP0447956B018_20251105.pdf
|
||||||
|
27/10,ACHAT CB BARAKA 4 24.10.25,Other,9.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
27/10,ACHAT CB 20811 TBC 25.10.25,Other,50.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
27/10,VIREMENT INSTANTANE A,Transfer,20.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
29/10,VIREMENT DE MR BATAILLE KEVIN,Transfer,40.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
29/10,VIREMENT DE SNCF RESEAU,Transfer,2508.5,releve_CCP0447956B018_20251105.pdf
|
||||||
|
31/10,ACHAT CB A LA GAIETE 31.10.25,Other,14.5,releve_CCP0447956B018_20251105.pdf
|
||||||
|
31/10,PRELEVEMENT DE EDF clients particul,Utilities,69.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
31/10,FRAIS IRREGULARITES ET INCIDENTS,Bank Fees,40.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
31/10,VIREMENT INSTANTANE A,Transfer,340.21,releve_CCP0447956B018_20251105.pdf
|
||||||
|
31/10,VIREMENT INSTANTANE A,Transfer,200.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
03/11,ACHAT CB HIGH LEVEL - K 01.11.25,Other,10.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
03/11,ACHAT CB JOEFAB 31.10.25,Other,29.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
03/11,ACHAT CB MAG0080 01.11.25,Other,75.98,releve_CCP0447956B018_20251105.pdf
|
||||||
|
03/11,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
04/11,ACHAT CB B VICTOR HUGO 03.11.25,Other,8.4,releve_CCP0447956B018_20251105.pdf
|
||||||
|
04/11,ACHAT CB SC-PBO 03.11.25,Other,10.6,releve_CCP0447956B018_20251105.pdf
|
||||||
|
04/11,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20251105.pdf
|
||||||
|
05/11,ACHAT CB CHEZ SHAN 04.11.25,Other,17.6,releve_CCP0447956B018_20251105.pdf
|
||||||
|
05/11,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1022.58,releve_CCP0447956B018_20251105.pdf
|
||||||
|
05/11,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,06/10 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,12/10 VIREMENT POUR,Transfer,311.64,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,29/10 VIREMENT POUR,Transfer,40.0,releve_CCP0447956B018_20251105.pdf
|
||||||
|
,06/11,Other,7.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,06/11,Other,15.2,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,06/11,Other,17.5,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,07/11,Other,150.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,10/11,Other,120.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,10/11,Other,94.36,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,10/11,Other,5.3,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,10/11,Other,20.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,10/11,Other,25.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,10/11,Other,42.99,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,10/11,Other,43.5,releve_CCP0447956B018_20251205.pdf
|
||||||
|
10/11,VIREMENT INSTANTANE A,Transfer,252.69,releve_CCP0447956B018_20251205.pdf
|
||||||
|
12/11,VIREMENT INSTANTANE DE,Transfer,49.09,releve_CCP0447956B018_20251205.pdf
|
||||||
|
12/11,CARTE X0449 10/11/25 A 19H35,Card Payment,90.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
13/11,VIREMENT INSTANTANE DE,Transfer,16.49,releve_CCP0447956B018_20251205.pdf
|
||||||
|
13/11,VIREMENT INSTANTANE DE,Transfer,33.22,releve_CCP0447956B018_20251205.pdf
|
||||||
|
13/11,VIREMENT INSTANTANE DE,Transfer,150.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
14/11,VIREMENT DE MR BATAILLE GEORGES,Transfer,150.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
14/11,VIREMENT INSTANTANE A,Transfer,170.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
17/11,ACHAT CB B VICTOR HUGO 16.11.25,Other,7.25,releve_CCP0447956B018_20251205.pdf
|
||||||
|
17/11,ACHAT CB KAWOK CHATILLO 15.11.25,Other,17.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
19/11,ACHAT CB BIGEM INTERMAR 18.11.25,Other,21.31,releve_CCP0447956B018_20251205.pdf
|
||||||
|
24/11,ACHAT CB SIX EPIS D'OR 21.11.25,Other,10.5,releve_CCP0447956B018_20251205.pdf
|
||||||
|
24/11,VIREMENT INSTANTANE A,Transfer,90.81,releve_CCP0447956B018_20251205.pdf
|
||||||
|
24/11,VIREMENT INSTANTANE A,Transfer,20.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
27/11,VIREMENT DE SNCF RESEAU,Transfer,2477.41,releve_CCP0447956B018_20251205.pdf
|
||||||
|
28/11,FRAIS IRREGULARITES ET INCIDENTS,Bank Fees,8.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,ACHAT CB PAUL 29.11.25,Other,3.7,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,ACHAT CB WAFFLE FACTORY 29.11.25,Other,9.2,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,ACHAT CB Maison Besnier 28.11.25,Other,11.6,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,ACHAT CB LOCCITANE 29.11.25,Other,13.5,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,ACHAT CB LA FATTORIA 29.11.25,Other,15.2,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,ACHAT CB BIGEM INTERMAR 30.11.25,Other,49.67,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,PRELEVEMENT DE EDF clients particul,Utilities,69.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,VIREMENT INSTANTANE A,Transfer,100.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
01/12,VIREMENT INSTANTANE A,Transfer,98.91,releve_CCP0447956B018_20251205.pdf
|
||||||
|
02/12,ACHAT CB THE FROG & BRI 01.12.25,Other,23.95,releve_CCP0447956B018_20251205.pdf
|
||||||
|
02/12,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
04/12,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20251205.pdf
|
||||||
|
05/12,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1022.58,releve_CCP0447956B018_20251205.pdf
|
||||||
|
05/12,VIREMENT POUR,Transfer,60.01,releve_CCP0447956B018_20251205.pdf
|
||||||
|
05/12,VIREMENT INSTANTANE A,Transfer,64.22,releve_CCP0447956B018_20251205.pdf
|
||||||
|
05/12,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,05/11 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,08/11 VIREMENT POUR,Transfer,120.0,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,05/12 VIREMENT DE MR BATAILLE KEVIN,Transfer,60.01,releve_CCP0447956B018_20251205.pdf
|
||||||
|
,08/12,Other,42.99,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,08/12,Other,43.5,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,08/12,Other,157.42,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,08/12,Other,150.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,12/12,Other,150.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,15/12,Other,5.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,15/12,Other,7.4,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,15/12,Other,353.51,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,16/12,Other,2484.12,releve_CCP0447956B018_20260105.pdf
|
||||||
|
16/12,ACHAT CB SELECTA SAS 15.12.25,Other,1.8,releve_CCP0447956B018_20260105.pdf
|
||||||
|
16/12,ACHAT CB BOULANGERIE VI 15.12.25,Other,7.95,releve_CCP0447956B018_20260105.pdf
|
||||||
|
16/12,ACHAT CB SC-PBO 15.12.25,Other,10.3,releve_CCP0447956B018_20260105.pdf
|
||||||
|
16/12,ACHAT CB BIGEM INTERMAR 15.12.25,Other,10.7,releve_CCP0447956B018_20260105.pdf
|
||||||
|
16/12,VIREMENT INSTANTANE A,Transfer,10.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
18/12,ACHAT CB BIGEM INTERMAR 17.12.25,Other,20.04,releve_CCP0447956B018_20260105.pdf
|
||||||
|
18/12,VIREMENT INSTANTANE A,Transfer,110.97,releve_CCP0447956B018_20260105.pdf
|
||||||
|
19/12,ACHAT CB ESPACE YOYO 18.12.25,Other,10.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
19/12,ACHAT CB BK PRODUCTIONS 18.12.25,Other,10.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
19/12,ACHAT CB BK PRODUCTIONS 18.12.25,Other,12.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
19/12,ACHAT CB PLACE MINUTE 18.12.25,Other,19.99,releve_CCP0447956B018_20260105.pdf
|
||||||
|
19/12,ACHAT CB BK PRODUCTIONS 18.12.25,Other,30.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
22/12,ACHAT CB BIGEM INTERMAR 20.12.25,Other,19.75,releve_CCP0447956B018_20260105.pdf
|
||||||
|
22/12,ACHAT CB BIGEM INTERMAR 19.12.25,Other,35.37,releve_CCP0447956B018_20260105.pdf
|
||||||
|
22/12,VIREMENT INSTANTANE A,Transfer,97.97,releve_CCP0447956B018_20260105.pdf
|
||||||
|
23/12,ACHAT CB BOULANGERIE VI 22.12.25,Other,9.05,releve_CCP0447956B018_20260105.pdf
|
||||||
|
24/12,ACHAT CB NATUREFRESH 23.12.25,Other,7.17,releve_CCP0447956B018_20260105.pdf
|
||||||
|
24/12,ACHAT CB BIGEM INTERMAR 23.12.25,Other,10.59,releve_CCP0447956B018_20260105.pdf
|
||||||
|
24/12,ACHAT CB JULES 23.12.25,Other,19.99,releve_CCP0447956B018_20260105.pdf
|
||||||
|
24/12,ACHAT CB LOCCITANE 23.12.25,Other,37.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
24/12,VIREMENT INSTANTANE A,Transfer,65.83,releve_CCP0447956B018_20260105.pdf
|
||||||
|
26/12,ACHAT CB RELAY 25.12.25,Other,2.7,releve_CCP0447956B018_20260105.pdf
|
||||||
|
26/12,ACHAT CB BOULANGERIE VI 25.12.25,Other,5.35,releve_CCP0447956B018_20260105.pdf
|
||||||
|
26/12,ACHAT CB PARIS LOUNGE N 25.12.25,Other,80.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
26/12,VIREMENT INSTANTANE A,Transfer,225.25,releve_CCP0447956B018_20260105.pdf
|
||||||
|
26/12,VIREMENT INSTANTANE A,Transfer,200.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
29/12,VIREMENT DE SNCF RESEAU,Transfer,2813.89,releve_CCP0447956B018_20260105.pdf
|
||||||
|
29/12,ACHAT CB MC DO ST PIERR 28.12.25,Other,7.64,releve_CCP0447956B018_20260105.pdf
|
||||||
|
29/12,ACHAT CB TCSHMR 27.12.25,Other,60.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
30/12,ACHAT CB PASTA & BURGER 28.12.25,Other,8.75,releve_CCP0447956B018_20260105.pdf
|
||||||
|
30/12,VIREMENT INSTANTANE A,Transfer,41.95,releve_CCP0447956B018_20260105.pdf
|
||||||
|
31/12,ACHAT CB LA PALMERAIE 30.12.25,Other,44.45,releve_CCP0447956B018_20260105.pdf
|
||||||
|
31/12,PRELEVEMENT DE EDF clients particul,Utilities,69.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
02/01,CARTE X0449 01/01/26 A 20H39,Card Payment,120.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
02/01,ACHAT CB MALARD FAMILY 01.01.26,Other,35.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
02/01,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,CARTE X0449 04/01/26 A 22H20,Card Payment,40.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,COTISATION TRIMESTRIELLE,Bank Fees,23.1,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB SUCRE FARINE 03.01.26,Other,3.6,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB MALARD FAMILY 04.01.26,Other,5.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB SARL SEFA 03.01.26,Other,8.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB LE TENDRE EPI 02.01.26,Other,11.9,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB LECLERCSODYOUE 03.01.26,Other,13.66,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB LE LOFT 05.01.26,Other,15.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB PHIE DES ALIZE 03.01.26,Other,18.7,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,ACHAT CB LECLERCESPCULT 03.01.26,Other,42.93,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,PRELEVEMENT DE LBP ASSURANCES IARD,Other,234.45,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1026.27,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,VIREMENT INSTANTANE A,Transfer,40.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,VIREMENT INSTANTANE A,Transfer,69.05,releve_CCP0447956B018_20260105.pdf
|
||||||
|
05/01,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,05/12 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,12/12 VIREMENT POUR,Transfer,150.0,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,31/12 INTERETS ACQUIS POUR 2025,Other,6.75,releve_CCP0447956B018_20260105.pdf
|
||||||
|
,06/01,Other,5.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,06/01,Other,7.4,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,06/01,Other,16.1,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,06/01,Other,29.95,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,06/01,Other,3.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,07/01,Other,10.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,07/01,Other,150.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,08/01,Other,14.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,08/01,Other,42.99,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,08/01,Other,46.05,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,08/01,Other,105.94,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,09/01,Other,27.9,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,09/01,Other,32.9,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,09/01,Other,1213.23,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB SARL LMB 12.01.26,Other,5.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB LE CHOCAMANDE 10.01.26,Other,6.2,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB MATINPEI PORTA 10.01.26,Other,7.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB BLACK PEARL 11.01.26,Other,12.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB SAO 11.01.26,Other,12.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB SAO 11.01.26,Other,12.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB CONFISERIE D'E 10.01.26,Other,12.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB SUMUP *PAPILL 10.01.26,Other,12.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB BRIOCHE DOREE 09.01.26,Other,20.85,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,ACHAT CB TECHTRONIK 09.01.26,Other,34.9,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,VIREMENT INSTANTANE A,Transfer,70.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
12/01,VIREMENT INSTANTANE A,Transfer,102.93,releve_CCP0447956B018_20260205.pdf
|
||||||
|
13/01,ACHAT CB LE BALCON 12.01.26,Other,4.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
13/01,ACHAT CB DETOX INVEST 12.01.26,Other,6.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
13/01,ACHAT CB MALARD FAMILY 12.01.26,Other,10.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
13/01,ACHAT CB LA CASE BAMBOU 12.01.26,Other,12.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
13/01,ACHAT CB FAST AND GOOD 12.01.26,Other,14.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
14/01,CARTE X0449 13/01/26 A 17H35,Card Payment,30.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
14/01,ACHAT CB MATINPEI PORTA 13.01.26,Other,6.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
15/01,ACHAT CB MATINPEI PORTA 14.01.26,Other,8.9,releve_CCP0447956B018_20260205.pdf
|
||||||
|
16/01,VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
16/01,ACHAT CB LE KAZ BAR 15.01.26,Other,23.8,releve_CCP0447956B018_20260205.pdf
|
||||||
|
19/01,VIREMENT DE MR BATAILLE KEVIN,Transfer,16.65,releve_CCP0447956B018_20260205.pdf
|
||||||
|
19/01,VIREMENT DE MR BATAILLE KEVIN,Transfer,20.1,releve_CCP0447956B018_20260205.pdf
|
||||||
|
19/01,ACHAT CB BLACK PEARL 16.01.26,Other,5.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
19/01,ACHAT CB DELTASUD SAVAN 17.01.26,Other,6.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
19/01,ACHAT CB DELTASUD SAVAN 17.01.26,Other,10.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
19/01,ACHAT CB MOULIN DU TANG 17.01.26,Other,20.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
19/01,ACHAT CB SARL ANDY GROU 16.01.26,Other,33.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
22/01,VIREMENT DE EDF CLT PART RBT SCT,Transfer,29.18,releve_CCP0447956B018_20260205.pdf
|
||||||
|
23/01,VIREMENT INSTANTANE WERO DE,Transfer,30.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
26/01,VIREMENT INSTANTANE A,Transfer,40.76,releve_CCP0447956B018_20260205.pdf
|
||||||
|
29/01,VIREMENT DE SNCF RESEAU,Transfer,2162.4,releve_CCP0447956B018_20260205.pdf
|
||||||
|
29/01,ACHAT CB GRANDE PHARMAC 28.01.26,Other,7.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
30/01,VIREMENT INSTANTANE A,Transfer,114.02,releve_CCP0447956B018_20260205.pdf
|
||||||
|
02/02,CARTE X0449 31/01/26 A 18H20,Card Payment,30.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
02/02,ACHAT CB AU BUREAU 01.02.26,Other,65.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
02/02,VIREMENT INSTANTANE A,Transfer,30.9,releve_CCP0447956B018_20260205.pdf
|
||||||
|
02/02,VIREMENT PERMANENT POUR,Transfer,150.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
03/02,ACHAT CB BIOCOOP CAISSE 02.02.26,Other,22.55,releve_CCP0447956B018_20260205.pdf
|
||||||
|
04/02,VIREMENT DE MUTUELLE ENTRAIN PRESTA,Transfer,9.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
04/02,ACHAT CB MINT 03.02.26,Other,6.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
04/02,ACHAT CB ESPRIT FAMILLE 03.02.26,Other,12.5,releve_CCP0447956B018_20260205.pdf
|
||||||
|
04/02,ACHAT CB SERVICE NAVIGO 03.02.26,Other,90.8,releve_CCP0447956B018_20260205.pdf
|
||||||
|
04/02,PRELEVEMENT DE OVERNESS - FP BAGNEU,Other,29.95,releve_CCP0447956B018_20260205.pdf
|
||||||
|
04/02,VIREMENT INSTANTANE A,Transfer,70.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
05/02,ACHAT CB MINT 04.02.26,Other,1.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
05/02,PRELEVEMENT DE CA IMMOBILIER SERVIC,Other,1030.75,releve_CCP0447956B018_20260205.pdf
|
||||||
|
05/02,VIREMENT PERMANENT POUR,Transfer,100.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,05/01 VIREMENT DE MR BATAILLE KEVIN,Transfer,100.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,16/01 VIREMENT POUR,Transfer,100.0,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,17/01 VIREMENT POUR,Transfer,16.65,releve_CCP0447956B018_20260205.pdf
|
||||||
|
,18/01 VIREMENT POUR,Transfer,20.1,releve_CCP0447956B018_20260205.pdf
|
||||||
|
2164
output/csv/revolut_all_transactions.csv
Normal file
2164
output/csv/revolut_all_transactions.csv
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,15 @@
|
|||||||
Date,Description,Category,Amount,Source
|
Date,Description,Category,Amount,Source,Brut Mensuel,Net Imposable,Cumul Annuel
|
||||||
01/August/25,Salaire August 25,Salary,3578.49,salaire de AOUT 2025.pdf
|
01/August/2025,Salaire August 2025,Salary,2371.73,salaire de AOUT 2025.pdf,3578.49,2960.05,0.0
|
||||||
01/April/25,Salaire April 25,Salary,5602.35,salaire de AVRIL 2025.pdf
|
01/April/2025,Salaire April 2025,Salary,4208.38,salaire de AVRIL 2025.pdf,5602.35,4856.24,0.0
|
||||||
01/December/25,Salaire December 25,Salary,3978.49,salaire de DECEMBRE 2025.pdf
|
01/December/2025,Salaire December 2025,Salary,2813.89,salaire de DECEMBRE 2025.pdf,3978.49,3333.33,0.0
|
||||||
01/February/25,Salaire February 25,Salary,3546.95,salaire de FEVRIER 2025.pdf
|
01/February/2025,Salaire February 2025,Salary,2542.5,salaire de FEVRIER 2025.pdf,3546.95,2944.45,0.0
|
||||||
01/January/25,Salaire January 25,Salary,3546.95,salaire de JANVIER 2025.pdf
|
01/January/2025,Salaire January 2025,Salary,2516.0,salaire de JANVIER 2025.pdf,3546.95,2944.45,0.0
|
||||||
01/January/26,Salaire January 26,Salary,3578.49,salaire de JANVIER 2026.pdf
|
01/January/2026,Salaire January 2026,Salary,2162.4,salaire de JANVIER 2026.pdf,3578.49,3100.71,0.0
|
||||||
01/July/25,Salaire July 25,Salary,3578.49,salaire de JUILLET 2025.pdf
|
01/July/2025,Salaire July 2025,Salary,2371.73,salaire de JUILLET 2025.pdf,3578.49,2960.05,0.0
|
||||||
01/June/25,Salaire June 25,Salary,4553.93,salaire de JUIN 2025.pdf
|
01/June/2025,Salaire June 2025,Salary,3020.27,salaire de JUIN 2025.pdf,4553.93,3765.33,0.0
|
||||||
01/May/25,Salaire May 25,Salary,3578.49,salaire de MAI 2025.pdf
|
01/May/2025,Salaire May 2025,Salary,3082.84,salaire de MAI 2025.pdf,3578.49,3565.85,0.0
|
||||||
01/March/25,Salaire March 25,Salary,3546.95,salaire de MARS 2025.pdf
|
01/March/2025,Salaire March 2025,Salary,2542.5,salaire de MARS 2025.pdf,3546.95,2944.45,0.0
|
||||||
01/November/25,Salaire November 25,Salary,3554.89,salaire de NOVEMBRE 2025.pdf
|
01/November/2025,Salaire November 2025,Salary,2477.41,salaire de NOVEMBRE 2025.pdf,3554.89,2938.14,0.0
|
||||||
01/October/25,Salaire October 25,Salary,3594.22,salaire de OCTOBRE 2025.pdf
|
01/October/2025,Salaire October 2025,Salary,2508.5,salaire de OCTOBRE 2025.pdf,3594.22,2974.67,0.0
|
||||||
01/January/2025,Salaire January 2025,Salary,3547.79,salaire de PRIME 2025.pdf
|
01/January/2025,Salaire January 2025,Salary,2484.12,salaire de PRIME 2025.pdf,3547.79,2931.54,0.0
|
||||||
01/September/25,Salaire September 25,Salary,3578.49,salaire de SEPTEMBRE 2025.pdf
|
01/September/2025,Salaire September 2025,Salary,2496.05,salaire de SEPTEMBRE 2025.pdf,3578.49,2960.05,0.0
|
||||||
|
|||||||
|
@@ -1,6 +0,0 @@
|
|||||||
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,63 +0,0 @@
|
|||||||
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,2 +0,0 @@
|
|||||||
Year,Month,Total Income,Total Expenses,Net Balance,Transaction Count,Institutions
|
|
||||||
2026,February,0,19534.26,19534.26,318,American Express
|
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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,4 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
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
|
|
||||||
|
@@ -1,7 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,7 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,4 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,17 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
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
|
|
||||||
|
@@ -1,320 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
1 juil,1 juil INTERMARCHE CHATILLO CHATILLON,Groceries,41.24,American Express,2025-07-02.pdf
|
|
||||||
1 mars,1 mars AUCHAN 0048M VELIZY,Other,16.49,American Express,2025-03-02.pdf
|
|
||||||
1 mars,1 mars BIZOUK CLICHY,Other,15.99,American Express,2025-03-02.pdf
|
|
||||||
1 nov,1 nov AUCHAN 0048M VELIZY,Other,28.9,American Express,2025-11-02.pdf
|
|
||||||
1 nov,1 nov INTERMARCHE CHATILLO CHATILLON,Groceries,34.25,American Express,2025-11-02.pdf
|
|
||||||
31 août,1 sept Dépense payée avec des points,Other,7.5,American Express,2025-09-02.pdf
|
|
||||||
31 août,1 sept Dépense payée avec des points,Other,20.99,American Express,2025-09-02.pdf
|
|
||||||
10 août,10 août BIZOUK CLICHY,Other,15.99,American Express,2025-09-02.pdf
|
|
||||||
10 août,10 août CHATILLON SOUS BAGNEUX CHATILLON,Other,14.06,American Express,2025-09-02.pdf
|
|
||||||
10 avr,10 avr Gebrüder Heinemann Gebr Wien-Flughafen,Other,54.47,American Express,2025-05-02.pdf
|
|
||||||
10 fév,10 fév ALIPAY LUXEMBOURG,Other,6.56,American Express,2025-03-02.pdf
|
|
||||||
11 fév,10 fév ALIPAY LUXEMBOURG,Other,11.78,American Express,2025-03-02.pdf
|
|
||||||
10 fév,10 fév LA BELLE VIE IVRY SUR SEINE,Other,106.37,American Express,2025-03-02.pdf
|
|
||||||
10 fév,10 fév PROTEIN WORKS RUNCORN,Other,72.96,American Express,2025-03-02.pdf
|
|
||||||
10 jan,10 jan ENGEN TAMPON 400 TAMPON,Other,21.3,American Express,2026-02-02.pdf
|
|
||||||
10 jan,10 jan MON BRICO AH HOT LE TAM LE TAMPON,Shopping,32.75,American Express,2026-02-02.pdf
|
|
||||||
10 jan,10 jan MON BRICO AH HOT LE TAM LE TAMPON,Shopping,30.0,American Express,2026-02-02.pdf
|
|
||||||
10 jan,10 jan SUMUP*GUICHARD LUCIANO PLAINE DES CAFR,Other,28.0,American Express,2026-02-02.pdf
|
|
||||||
10 juin,10 juin ALI*ALIEXPRESS Alipay SINGAPORE,Other,26.38,American Express,2025-07-02.pdf
|
|
||||||
10 mai,10 mai INTERMARCHE CHATILLO CHATILLON,Groceries,16.4,American Express,2025-06-02.pdf
|
|
||||||
9 mars,10 mars VILLA BEACH LISSES,Other,10.0,American Express,2025-04-02.pdf
|
|
||||||
10 nov,10 nov COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,7.3,American Express,2025-12-02.pdf
|
|
||||||
10 nov,10 nov SERVPERSO* INVOICE PRO BATTICE,Online Services/Subscriptions,44.0,American Express,2025-12-02.pdf
|
|
||||||
9 août,11 août MAMMAMIA DEAUVILLE,Other,44.9,American Express,2025-09-02.pdf
|
|
||||||
11 déc,11 déc FAL FEATURES LABELS SAN FRANCISCO,Other,8.86,American Express,2026-01-02.pdf
|
|
||||||
11 jan,11 jan MALARD FAMILY SAINT GILLES LE,Other,10.0,American Express,2025-02-02.pdf
|
|
||||||
11 jan,11 jan MALARD FAMILY SAINT GILLES LE,Other,40.0,American Express,2025-02-02.pdf
|
|
||||||
11 jan,11 jan MALARD FAMILY SAINT GILLES LE,Other,40.0,American Express,2025-02-02.pdf
|
|
||||||
11 jan,11 jan TOTAL JEAN-DAVID LE PORT,Other,20.9,American Express,2025-02-02.pdf
|
|
||||||
11 mai,11 mai SUMUP*ESPACE TRADITION ?VREUX,Other,21.0,American Express,2025-06-02.pdf
|
|
||||||
11 oct,11 oct BIZOUK CLICHY,Other,30.02,American Express,2025-11-02.pdf
|
|
||||||
11 sept,11 sept 027 T3 PRETAMANGER AER MALAGA,Other,7.65,American Express,2025-10-02.pdf
|
|
||||||
11 sept,11 sept 351 - CT AER MAL T3 AIR MALAGA,Other,5.5,American Express,2025-10-02.pdf
|
|
||||||
11 sept,11 sept HOTEL BENABOLA 34636404 NUEVA ANDALUC,Other,32.0,American Express,2025-10-02.pdf
|
|
||||||
12 août,12 août INTERMARCHE CHATILLO CHATILLON,Groceries,42.87,American Express,2025-09-02.pdf
|
|
||||||
12 avr,12 avr AUCHAN 0048M VELIZY,Other,33.13,American Express,2025-05-02.pdf
|
|
||||||
12 déc,12 déc CLAUDE.AI SUBSCRIPTION SAN FRANCISCO 20.00,Online Services/Subscriptions,17.58,American Express,2026-01-02.pdf
|
|
||||||
12 fév,12 fév LS LA TAVERNE NEUCHÂTE NEUCHÂTEL 28.80,Other,31.45,American Express,2025-03-02.pdf
|
|
||||||
12 jan,12 jan MALARD FAMILY SAINT GILLES LE,Other,15.0,American Express,2025-02-02.pdf
|
|
||||||
12 juin,12 juin INTERMARCHE CHATILLO CHATILLON,Groceries,52.26,American Express,2025-07-02.pdf
|
|
||||||
12 mars,12 mars LA BELLE VIE IVRY SUR SEINE,Other,98.97,American Express,2025-04-02.pdf
|
|
||||||
12 nov,12 nov INTERMARCHE CHATILLO CHATILLON,Groceries,29.06,American Express,2025-12-02.pdf
|
|
||||||
12 sept,12 sept FRANCE FRANCE -,Other,13.0,American Express,2025-10-02.pdf
|
|
||||||
12 sept,12 sept MARKET HIGUERON MAG-664 BENALMADENA,Other,6.58,American Express,2025-10-02.pdf
|
|
||||||
12 août,13 août RESEAU FLEURISAS CABRIERES-D'AIG,Other,51.85,American Express,2025-09-02.pdf
|
|
||||||
12 déc,13 déc Achat payé avec vos points - AIR AUSTRAL,Travel,12.72,American Express,2026-01-02.pdf
|
|
||||||
13 déc,13 déc BIZOUK CLICHY,Other,31.98,American Express,2025-01-02.pdf
|
|
||||||
12 déc,13 déc MAXIMILIEN PARIS,Other,40.0,American Express,2025-01-02.pdf
|
|
||||||
12 déc,13 déc MAXIMILIEN PARIS,Other,35.0,American Express,2025-01-02.pdf
|
|
||||||
12 déc,13 déc MAXIMILIEN PARIS,Other,4.5,American Express,2025-01-02.pdf
|
|
||||||
12 déc,13 déc MAXIMILIEN PARIS,Other,19.46,American Express,2025-01-02.pdf
|
|
||||||
13 fév,13 fév GATE GOURMET HELVETIA PARIS,Other,8.5,American Express,2025-03-02.pdf
|
|
||||||
13 fév,13 fév HÄTEL ALPES ET LAC NEUCHÂTEL 18.00,Other,19.67,American Express,2025-03-02.pdf
|
|
||||||
13 jan,13 jan CLAUDE.AI SUBSCRIPTION SAN FRANCISCO 20.00,Online Services/Subscriptions,17.61,American Express,2026-02-02.pdf
|
|
||||||
13 jan,13 jan ENGEN LAGON SAINT GILLES LE,Other,22.2,American Express,2025-02-02.pdf
|
|
||||||
13 jan,13 jan LEADER PRICE ERMITAGE O ST GILLES LES B,Other,42.9,American Express,2025-02-02.pdf
|
|
||||||
13 jan,13 jan MALARD FAMILY SAINT GILLES LE,Other,20.0,American Express,2025-02-02.pdf
|
|
||||||
13 mai,13 mai INTERMARCHE CHATILLO CHATILLON,Groceries,21.18,American Express,2025-06-02.pdf
|
|
||||||
13 sept,13 sept AYO NERJA 034705780 NERJA,Other,62.5,American Express,2025-10-02.pdf
|
|
||||||
13 sept,13 sept CRYSTALS KARAOKE PUERTO MARBELLA,Other,18.0,American Express,2025-10-02.pdf
|
|
||||||
13 sept,13 sept CRYSTALS KARAOKE PUERTO MARBELLA,Other,8.0,American Express,2025-10-02.pdf
|
|
||||||
13 sept,13 sept FEEL NERJA 005433750 FUENTE DEL BA,Other,48.0,American Express,2025-10-02.pdf
|
|
||||||
13 sept,13 sept ZETTLE *MARHELA 2023 SL MARBELLA,Other,7.5,American Express,2025-10-02.pdf
|
|
||||||
14 août,14 août BIZOUK CLICHY,Other,31.05,American Express,2025-09-02.pdf
|
|
||||||
14 août,14 août GUSS EXPERIENCE 93110 ROSNY-SOUS-BO,Other,15.0,American Express,2025-09-02.pdf
|
|
||||||
14 août,14 août GUSS EXPERIENCE 93110 ROSNY-SOUS-BO,Other,15.0,American Express,2025-09-02.pdf
|
|
||||||
15 août,14 août GUSS EXPERIENCE 93110 ROSNY-SOUS-BO,Other,10.0,American Express,2025-09-02.pdf
|
|
||||||
15 août,14 août GUSS EXPERIENCE 93110 ROSNY-SOUS-BO,Other,10.0,American Express,2025-09-02.pdf
|
|
||||||
15 août,14 août GUSS EXPERIENCE 93110 ROSNY-SOUS-BO,Other,10.0,American Express,2025-09-02.pdf
|
|
||||||
15 août,14 août GUSS EXPERIENCE 93110 ROSNY-SOUS-BO,Other,10.0,American Express,2025-09-02.pdf
|
|
||||||
14 déc,14 déc AIR AUSTRAL AIR AUSTRAL SAINT DENIS CED,Travel,710.05,American Express,2026-01-02.pdf
|
|
||||||
14 déc,14 déc SUMUP*LES SAVEURS DE SA MONTLH?RY,Other,23.0,American Express,2025-01-02.pdf
|
|
||||||
14 juin,14 juin BRICORAMA CHATILLON,Other,45.4,American Express,2025-07-02.pdf
|
|
||||||
14 mai,14 mai INTERMARCHE CHATILLO CHATILLON,Groceries,22.14,American Express,2025-06-02.pdf
|
|
||||||
14 nov,14 nov INTERMARCHE CHATILLO CHATILLON,Groceries,23.77,American Express,2025-12-02.pdf
|
|
||||||
14 sept,14 sept AGP GIRAFFE T5209 12418 MALAGA,Other,10.95,American Express,2025-10-02.pdf
|
|
||||||
14 sept,14 sept CRYSTALS KARAOKE PUERTO MARBELLA,Other,13.0,American Express,2025-10-02.pdf
|
|
||||||
14 sept,14 sept FRANPRIX PHENIX DISTRIB CHATILLON,Other,21.67,American Express,2025-10-02.pdf
|
|
||||||
14 sept,14 sept PLAZA MAYOR 337171482 MALAGA,Other,35.73,American Express,2025-10-02.pdf
|
|
||||||
14 sept,14 sept RYFI 036276848 ESTEPONA,Other,15.0,American Express,2025-10-02.pdf
|
|
||||||
14 sept,14 sept SIXT RENT A CAR SLU POS PALMA DE MALLOR,Other,230.31,American Express,2025-10-02.pdf
|
|
||||||
16 août,15 août BIZOUK CLICHY,Other,20.99,American Express,2025-09-02.pdf
|
|
||||||
15 avr,15 avr INTERMARCHE CHATILLO CHATILLON,Groceries,22.48,American Express,2025-05-02.pdf
|
|
||||||
14 avr,15 avr NATUREFRESH CHATILLON,Other,11.8,American Express,2025-05-02.pdf
|
|
||||||
15 fév,15 fév HEMA PARIS VELIZY II VELIZY-VILLACOU,Other,21.95,American Express,2025-03-02.pdf
|
|
||||||
15 jan,15 jan ALI*ALIEXPRESS Alipay SINGAPORE,Other,66.07,American Express,2025-02-02.pdf
|
|
||||||
16 jan,15 jan ESKO BAR SAINT PAUL,Restaurants/Food,26.0,American Express,2026-02-02.pdf
|
|
||||||
16 jan,15 jan ESKO BAR SAINT PAUL,Restaurants/Food,13.0,American Express,2026-02-02.pdf
|
|
||||||
15 juil,15 juil INTERMARCHE CHATILLO CHATILLON,Groceries,40.53,American Express,2025-08-02.pdf
|
|
||||||
15 juin,15 juin INTERMARCHE CHATILLO CHATILLON,Groceries,63.36,American Express,2025-07-02.pdf
|
|
||||||
15 nov,15 nov COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,4.9,American Express,2025-12-02.pdf
|
|
||||||
15 sept,15 sept FRANCE FRANCE -,Other,6.0,American Express,2025-10-02.pdf
|
|
||||||
16 août,16 août BIZOUK CLICHY,Other,15.99,American Express,2025-09-02.pdf
|
|
||||||
16 août,16 août DU BRUIT DANS LA CUISIN VELIZY VILLAVOU,Other,25.4,American Express,2025-09-02.pdf
|
|
||||||
16 fév,16 fév CHATILLON SOUS BAGNEUX CHATILLON,Other,26.24,American Express,2025-03-02.pdf
|
|
||||||
16 jan,16 jan LE CHOKA BLEU SAINT PAUL,Restaurants/Food,6.0,American Express,2026-02-02.pdf
|
|
||||||
16 jan,16 jan LE CHOKA BLEU SAINT PAUL,Restaurants/Food,6.0,American Express,2026-02-02.pdf
|
|
||||||
16 jan,16 jan LE CHOKA BLEU SAINT PAUL,Restaurants/Food,10.0,American Express,2026-02-02.pdf
|
|
||||||
16 jan,16 jan LE CHOKA BLEU SAINT PAUL,Restaurants/Food,10.0,American Express,2026-02-02.pdf
|
|
||||||
16 jan,16 jan SUMUP*GLAMPORT SAINT PAUL,Shopping,11.5,American Express,2026-02-02.pdf
|
|
||||||
16 jan,16 jan SUMUP*KULTURE METISSE SAINT PAUL,Shopping,10.0,American Express,2026-02-02.pdf
|
|
||||||
15 juil,16 juil BRASSERIE DES PRES PARIS,Other,23.5,American Express,2025-08-02.pdf
|
|
||||||
16 juin,16 juin L'ESPRIT DE FAMILLE SAINT-DENIS,Other,18.0,American Express,2025-07-02.pdf
|
|
||||||
16 mai,16 mai INTERMARCHE CHATILLO CHATILLON,Groceries,16.32,American Express,2025-06-02.pdf
|
|
||||||
17 août,17 août COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,11.2,American Express,2025-09-02.pdf
|
|
||||||
17 août,17 août SUMUP*SAVOURETACAISSE BOBIGNY,Other,10.0,American Express,2025-09-02.pdf
|
|
||||||
17 avr,17 avr INTERMARCHE CHATILLO CHATILLON,Groceries,21.14,American Express,2025-05-02.pdf
|
|
||||||
16 avr,17 avr RELAY 323337 P-LYON MED PARIS,Shopping,14.2,American Express,2025-05-02.pdf
|
|
||||||
16 jan,17 jan LE CHOKA BLEU SAINT PAUL,Restaurants/Food,5.0,American Express,2026-02-02.pdf
|
|
||||||
17 jan,17 jan OLA TAMARINS SAINT PAUL,Other,35.9,American Express,2025-02-02.pdf
|
|
||||||
17 jan,17 jan RUN MARKET SAVANNA ORIK SAINT PAUL,Groceries,30.23,American Express,2026-02-02.pdf
|
|
||||||
17 mai,17 mai AUCHAN 0048M VELIZY,Other,54.52,American Express,2025-06-02.pdf
|
|
||||||
12 sept,17 sept AUTOPISTA DEL SOL (AUS SAN PEDRO ALCAN,Other,8.9,American Express,2025-10-02.pdf
|
|
||||||
12 sept,17 sept AUTOPISTA DEL SOL (AUS SAN PEDRO ALCAN,Other,8.9,American Express,2025-10-02.pdf
|
|
||||||
13 sept,17 sept AUTOPISTA DEL SOL (AUS SAN PEDRO ALCAN,Other,5.55,American Express,2025-10-02.pdf
|
|
||||||
19 déc,18 déc LE SPEAKEASY PARIS,Other,189.5,American Express,2026-01-02.pdf
|
|
||||||
18 jan,18 jan AIR AUSTRAL STE MARIE STE MARIE,Travel,60.0,American Express,2026-02-02.pdf
|
|
||||||
18 jan,18 jan E LECLERC PITON SAINT LEU,Other,20.9,American Express,2025-02-02.pdf
|
|
||||||
18 jan,18 jan RELAY 373001/56 SAINTE MARIE SA,Shopping,11.8,American Express,2026-02-02.pdf
|
|
||||||
18 jan,18 jan RUN DUTY FREE LAGARDDF4 LA REUNION,Travel,42.1,American Express,2026-02-02.pdf
|
|
||||||
19 juil,18 juil BIZOUK CLICHY,Other,15.99,American Express,2025-08-02.pdf
|
|
||||||
18 mai,18 mai INTERMARCHE CHATILLO CHATILLON,Groceries,12.37,American Express,2025-06-02.pdf
|
|
||||||
19 nov,18 nov ALIPAY LUXEMBOURG,Other,11.68,American Express,2025-12-02.pdf
|
|
||||||
19 août,19 août INTERMARCHE CHATILLO CHATILLON,Groceries,10.24,American Express,2025-09-02.pdf
|
|
||||||
19 avr,19 avr AUCHAN 0048M VELIZY,Other,17.72,American Express,2025-05-02.pdf
|
|
||||||
19 fév,19 fév INTERMARCHE CHATILLO CHATILLON,Groceries,18.04,American Express,2025-03-02.pdf
|
|
||||||
19 jan,19 jan INTERMARCHE CHATILLO CHATILLON,Groceries,26.91,American Express,2026-02-02.pdf
|
|
||||||
19 juin,19 juin NATUREFRESH CHATILLON,Other,19.11,American Express,2025-07-02.pdf
|
|
||||||
19 juin,19 juin ST DENIS GRAND STADE DE SAINT DENIS,Other,29.46,American Express,2025-07-02.pdf
|
|
||||||
2 août,2 août DU BRUIT DANS LA CUISIN VELIZY VILLAVOU,Other,8.95,American Express,2025-09-02.pdf
|
|
||||||
2 août,2 août SASU RITUALS COSMETICS PARIS,Other,22.07,American Express,2025-09-02.pdf
|
|
||||||
2 déc,2 déc SCALEWAY PARIS,Online Services/Subscriptions,1.7,American Express,2025-12-02.pdf
|
|
||||||
1 déc,2 déc SERVPERSO* INVOICE PRO BATTICE,Online Services/Subscriptions,14.0,American Express,2025-12-02.pdf
|
|
||||||
2 fév,2 fév SCALEWAY PARIS,Online Services/Subscriptions,13.48,American Express,2026-02-02.pdf
|
|
||||||
1 fév,2 fév SERVPERSO* INVOICE PRO BATTICE,Online Services/Subscriptions,14.0,American Express,2026-02-02.pdf
|
|
||||||
1 jan,2 jan SERVPERSO* INVOICE PRO BATTICE,Online Services/Subscriptions,14.0,American Express,2026-01-02.pdf
|
|
||||||
2 juin,2 juin INTERMARCHE CHATILLO CHATILLON,Groceries,48.16,American Express,2025-07-02.pdf
|
|
||||||
2 mai,2 mai COTISATION - MERCI POUR VOTRE CONFIANCE.,Other,192.0,American Express,2025-05-02.pdf
|
|
||||||
2 mai,2 mai INTERMARCHE CHATILLO CHATILLON,Groceries,40.74,American Express,2025-06-02.pdf
|
|
||||||
2 mars,2 mars COURIR SASSENAGE,Other,127.0,American Express,2025-04-02.pdf
|
|
||||||
20 avr,20 avr INTERMARCHE CHATILLO CHATILLON,Groceries,21.49,American Express,2025-05-02.pdf
|
|
||||||
20 déc,20 déc Achat payé avec vos points - AIR AUSTRAL,Travel,164.28,American Express,2025-01-02.pdf
|
|
||||||
20 jan,20 jan AIR AUSTRAL AIR AUSTRAL SAINT DENIS CED,Travel,100.0,American Express,2025-02-02.pdf
|
|
||||||
20 jan,20 jan INTERMARCHE CHATILLO CHATILLON,Groceries,35.55,American Express,2026-02-02.pdf
|
|
||||||
20 juil,20 juil AMAZON AMEX CLICHY,Other,1.99,American Express,2025-08-02.pdf
|
|
||||||
20 mai,20 mai INTERMARCHE CHATILLO CHATILLON,Groceries,25.31,American Express,2025-06-02.pdf
|
|
||||||
20 nov,20 nov INTERMARCHE CHATILLO CHATILLON,Groceries,26.36,American Express,2025-12-02.pdf
|
|
||||||
21 août,21 août ENVATO *71018263 SALT LAKE CITY 72.00,Other,63.63,American Express,2025-09-02.pdf
|
|
||||||
21 août,21 août H1535 MER LYON LUMIERE LYON 03,Other,106.5,American Express,2025-09-02.pdf
|
|
||||||
21 déc,21 déc AIR AUSTRAL AIR AUSTRAL SAINT DENIS CED,Travel,999.65,American Express,2025-01-02.pdf
|
|
||||||
21 fév,21 fév COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,11.2,American Express,2025-03-02.pdf
|
|
||||||
21 juin,21 juin AUCHAN 0048M VELIZY,Other,31.84,American Express,2025-07-02.pdf
|
|
||||||
21 juin,21 juin DOCTEUR RODOLPH DUONG ANTONY,Other,50.0,American Express,2025-07-02.pdf
|
|
||||||
21 mai,21 mai INTERMARCHE CHATILLO CHATILLON,Groceries,16.34,American Express,2025-06-02.pdf
|
|
||||||
22 août,22 août BARRIO CLUB Lyon,Other,11.0,American Express,2025-09-02.pdf
|
|
||||||
22 août,22 août BARRIO CLUB Lyon,Other,26.0,American Express,2025-09-02.pdf
|
|
||||||
22 août,22 août BARRIO CLUB Lyon,Other,37.0,American Express,2025-09-02.pdf
|
|
||||||
22 août,22 août BIZOUK CLICHY,Other,20.99,American Express,2025-09-02.pdf
|
|
||||||
22 août,22 août INTERMARCHE CHATILLO CHATILLON,Groceries,27.61,American Express,2025-09-02.pdf
|
|
||||||
22 fév,22 fév BIZOUK CLICHY,Other,166.53,American Express,2025-03-02.pdf
|
|
||||||
22 jan,22 jan INTERMARCHE CHATILLO CHATILLON,Groceries,67.9,American Express,2026-02-02.pdf
|
|
||||||
21 nov,22 nov 3CPAYMENT*STARBUCKS 131 PARIS,Other,12.45,American Express,2025-12-02.pdf
|
|
||||||
22 nov,22 nov COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,4.9,American Express,2025-12-02.pdf
|
|
||||||
22 sept,22 sept CHATILLON SOUS BAGNEUX CHATILLON,Other,35.97,American Express,2025-10-02.pdf
|
|
||||||
23 août,23 août COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,4.7,American Express,2025-09-02.pdf
|
|
||||||
22 août,23 août DISTRIKT 12 LYON,Other,12.0,American Express,2025-09-02.pdf
|
|
||||||
22 août,23 août F&K 10 LYON,Other,5.0,American Express,2025-09-02.pdf
|
|
||||||
22 août,23 août F&K 9 LYON,Other,37.0,American Express,2025-09-02.pdf
|
|
||||||
23 août,23 août INTERMARCHE CHATILLO CHATILLON,Groceries,23.91,American Express,2025-09-02.pdf
|
|
||||||
23 août,23 août SUMUP*BURGER NIGHT FOOD SEVRAN,Other,20.0,American Express,2025-09-02.pdf
|
|
||||||
23 avr,23 avr AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2025-05-02.pdf
|
|
||||||
23 avr,23 avr AMAZON PAYMENT EUROPE LUXEMBOURG,Other,10.79,American Express,2025-05-02.pdf
|
|
||||||
23 avr,23 avr INTERMARCHE CHATILLO CHATILLON,Groceries,25.1,American Express,2025-05-02.pdf
|
|
||||||
23 déc,23 déc AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2025-01-02.pdf
|
|
||||||
23 déc,23 déc INTERMARCHE CHATILLO CHATILLON,Groceries,47.69,American Express,2025-01-02.pdf
|
|
||||||
23 fév,23 fév AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2025-03-02.pdf
|
|
||||||
23 jan,23 jan AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2025-02-02.pdf
|
|
||||||
23 jan,23 jan RELAY 324466 KAYSER MON PARIS,Shopping,9.4,American Express,2026-02-02.pdf
|
|
||||||
23 juil,23 juil AMAZON AMEX CLICHY,Other,1.8,American Express,2025-08-02.pdf
|
|
||||||
23 juin,23 juin AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2025-07-02.pdf
|
|
||||||
23 juin,23 juin INTERMARCHE CHATILLO CHATILLON,Groceries,44.92,American Express,2025-07-02.pdf
|
|
||||||
23 mai,23 mai AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2025-06-02.pdf
|
|
||||||
23 mars,23 mars AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2025-04-02.pdf
|
|
||||||
25 août,24 août BIZOUK CLICHY,Other,20.99,American Express,2025-09-02.pdf
|
|
||||||
25 août,24 août BIZOUK CLICHY,Other,15.99,American Express,2025-09-02.pdf
|
|
||||||
24 avr,24 avr INTERMARCHE CHATILLO CHATILLON,Groceries,16.99,American Express,2025-05-02.pdf
|
|
||||||
24 mai,24 mai SASU RITUALS COSMETICS PARIS,Other,36.8,American Express,2025-06-02.pdf
|
|
||||||
25 août,25 août ALIPAY LUXEMBOURG,Other,27.87,American Express,2025-09-02.pdf
|
|
||||||
25 août,25 août ALIPAY LUXEMBOURG,Other,29.08,American Express,2025-09-02.pdf
|
|
||||||
25 avr,25 avr AUCHAN 0048M VELIZY,Other,21.0,American Express,2025-05-02.pdf
|
|
||||||
25 déc,25 déc 812040 CDG2 C RELAY ZSD ROISSY CDG CEDE,Shopping,37.89,American Express,2026-01-02.pdf
|
|
||||||
25 déc,25 déc AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2026-01-02.pdf
|
|
||||||
25 jan,25 jan AMA EU SARL PRIME_NEW LUXEMBOURG,Online Services/Subscriptions,6.99,American Express,2026-02-02.pdf
|
|
||||||
25 jan,25 jan INTERMARCHE CHATILLO CHATILLON,Groceries,50.61,American Express,2025-02-02.pdf
|
|
||||||
25 jan,25 jan INTERMARCHE CHATILLO CHATILLON,Groceries,31.56,American Express,2026-02-02.pdf
|
|
||||||
26 avr,26 avr FNAC VELIZY 4010 VELIZY,Other,15.35,American Express,2025-05-02.pdf
|
|
||||||
26 avr,26 avr INTERMARCHE CHATILLO CHATILLON,Groceries,7.85,American Express,2025-05-02.pdf
|
|
||||||
26 avr,26 avr INTERMARCHE CHATILLO CHATILLON,Groceries,29.13,American Express,2025-05-02.pdf
|
|
||||||
26 jan,26 jan AMAZON PAYMENT EUROPE LUXEMBOURG,Other,23.98,American Express,2025-02-02.pdf
|
|
||||||
26 juil,26 juil AUCHAN 0048M VELIZY,Other,22.07,American Express,2025-08-02.pdf
|
|
||||||
26 juil,26 juil BIZOUK CLICHY,Other,124.2,American Express,2025-08-02.pdf
|
|
||||||
25 mai,26 mai ANTHROPIC SAN FRANCISCO 6.00,Other,5.45,American Express,2025-06-02.pdf
|
|
||||||
26 oct,26 oct BIZOUK CLICHY,Other,38.3,American Express,2025-11-02.pdf
|
|
||||||
26 sept,26 sept INTERMARCHE CHATILLO CHATILLON,Groceries,30.9,American Express,2025-10-02.pdf
|
|
||||||
27 août,27 août CHATILLON SOUS BAGNEUX CHATILLON,Other,45.02,American Express,2025-09-02.pdf
|
|
||||||
27 avr,27 avr INTERMARCHE CHATILLO CHATILLON,Groceries,24.6,American Express,2025-05-02.pdf
|
|
||||||
27 déc,27 déc AMAZON PAYMENT EUROPE LUXEMBOURG,Other,15.58,American Express,2026-01-02.pdf
|
|
||||||
27 jan,27 jan ALI*ALIEXPRESS Alipay SINGAPORE,Other,11.19,American Express,2025-02-02.pdf
|
|
||||||
27 jan,27 jan INTERMARCHE CHATILLO CHATILLON,Groceries,19.62,American Express,2026-02-02.pdf
|
|
||||||
27 oct,27 oct COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,10.2,American Express,2025-11-02.pdf
|
|
||||||
27 août,28 août COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,7.5,American Express,2025-09-02.pdf
|
|
||||||
28 avr,28 avr L'ESPRIT DE FAMILLE SAINT-DENIS,Other,18.5,American Express,2025-05-02.pdf
|
|
||||||
28 avr,28 avr L'ESPRIT DE FAMILLE SAINT-DENIS,Other,13.5,American Express,2025-05-02.pdf
|
|
||||||
28 déc,28 déc RESTAURANT LABOU A4 ST x,Other,15.0,American Express,2026-01-02.pdf
|
|
||||||
28 mai,28 mai INTERMARCHE CHATILLO CHATILLON,Groceries,22.99,American Express,2025-06-02.pdf
|
|
||||||
28 août,29 août RESTAURANT ELYSE PARIS,Other,220.0,American Express,2025-09-02.pdf
|
|
||||||
29 août,29 août RESTAURANT ELYSE PARIS,Other,280.0,American Express,2025-09-02.pdf
|
|
||||||
29 avr,29 avr INTERMARCHE CHATILLO CHATILLON,Groceries,15.57,American Express,2025-05-02.pdf
|
|
||||||
29 déc,29 déc AIR AUSTRAL ROISSY CHARLES,Travel,970.0,American Express,2025-01-02.pdf
|
|
||||||
29 déc,29 déc AIR AUSTRAL ROISSY CHARLES,Travel,36.0,American Express,2025-01-02.pdf
|
|
||||||
29 déc,29 déc TOUT LE MONDE EN PARLE PARIS,Other,36.0,American Express,2025-01-02.pdf
|
|
||||||
29 déc,29 déc TOUT LE MONDE EN PARLE PARIS,Other,26.0,American Express,2025-01-02.pdf
|
|
||||||
29 jan,29 jan ALIPAY LUXEMBOURG,Other,15.36,American Express,2025-02-02.pdf
|
|
||||||
29 juin,29 juin FNAC LYON BELLECOUR 020 LYON BELLECOUR,Other,260.0,American Express,2025-07-02.pdf
|
|
||||||
29 juin,29 juin FNAC LYON BELLECOUR 020 LYON BELLECOUR,Other,19.99,American Express,2025-07-02.pdf
|
|
||||||
29 juin,29 juin LYON PD STARB VIL LYON -,Other,16.15,American Express,2025-07-02.pdf
|
|
||||||
29 juin,29 juin PRET A MANGER 967006 LYON,Other,13.85,American Express,2025-07-02.pdf
|
|
||||||
29 oct,29 oct L'ESPRIT DE FAMILLE SAINT-DENIS,Other,14.0,American Express,2025-11-02.pdf
|
|
||||||
28 sept,29 sept 3CPAYMENT*STARBUCKS 131 PARIS,Other,22.3,American Express,2025-10-02.pdf
|
|
||||||
3 avr,3 avr ALI*ALIEXPRESS Alipay SINGAPORE,Other,20.57,American Express,2025-05-02.pdf
|
|
||||||
3 avr,3 avr AMAZON PAYMENT EUROPE LUXEMBOURG,Other,77.67,American Express,2025-05-02.pdf
|
|
||||||
3 déc,3 déc INTERMARCHE CHATILLO CHATILLON,Groceries,15.63,American Express,2026-01-02.pdf
|
|
||||||
2 jan,"3 jan OPENROUTER, INC NEW YORK 10.80",Online Services/Subscriptions,9.47,American Express,2026-02-02.pdf
|
|
||||||
3 jan,3 jan STRIPE-Z.AI SINGAPORE 15.00,Online Services/Subscriptions,13.16,American Express,2026-02-02.pdf
|
|
||||||
3 juin,3 juin FNAC PARIS GARE DE LYON PARIS,Other,54.99,American Express,2025-07-02.pdf
|
|
||||||
3 mai,3 mai AUCHAN 0048M VELIZY,Other,24.51,American Express,2025-06-02.pdf
|
|
||||||
3 mai,3 mai TRESOR 415 78140 VELIZY VELIZY VILLACOU,Other,59.0,American Express,2025-06-02.pdf
|
|
||||||
30 août,30 août INTERMARCHE CHATILLO CHATILLON,Groceries,28.97,American Express,2025-09-02.pdf
|
|
||||||
30 mai,30 mai AUCHAN 0048M VELIZY,Other,29.03,American Express,2025-06-02.pdf
|
|
||||||
15 oct,30 oct SNCF-VOYAGEURS SNCF204 PARIS,Other,2.0,American Express,2025-11-02.pdf
|
|
||||||
31 août,31 août SUMUP*MYC NIGHT SL. MARBELLA,Other,30.0,American Express,2025-09-02.pdf
|
|
||||||
31 août,31 août SUMUP*MYC NIGHT SL. MARBELLA,Other,90.0,American Express,2025-09-02.pdf
|
|
||||||
31 août,31 août SUMUP*MYC NIGHT SL. MARBELLA,Other,30.0,American Express,2025-09-02.pdf
|
|
||||||
31 août,31 août SUMUP*MYC NIGHT SL. MARBELLA,Other,30.0,American Express,2025-09-02.pdf
|
|
||||||
31 août,31 août SUMUP*MYC NIGHT SL. MARBELLA,Other,250.0,American Express,2025-09-02.pdf
|
|
||||||
31 août,31 août SUMUP*MYC NIGHT SL. MARBELLA,Other,100.0,American Express,2025-09-02.pdf
|
|
||||||
31 jan,31 jan COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,10.4,American Express,2026-02-02.pdf
|
|
||||||
31 juil,31 juil INTERMARCHE CHATILLO CHATILLON,Groceries,11.77,American Express,2025-08-02.pdf
|
|
||||||
31 mai,31 mai INTERMARCHE CHATILLO CHATILLON,Groceries,16.08,American Express,2025-06-02.pdf
|
|
||||||
31 oct,31 oct AUCHAN 0048M VELIZY,Other,54.34,American Express,2025-11-02.pdf
|
|
||||||
31 oct,31 oct JEFF DE BRUGES N 26 VELIZY VILLACOU,Other,34.9,American Express,2025-11-02.pdf
|
|
||||||
4 août,4 août CHATILLON SOUS BAGNEUX CHATILLON,Other,27.38,American Express,2025-09-02.pdf
|
|
||||||
3 août,4 août FLOW SPECTACLES PARIS,Other,14.0,American Express,2025-09-02.pdf
|
|
||||||
4 août,4 août INTERMARCHE CHATILLO CHATILLON,Groceries,28.12,American Express,2025-09-02.pdf
|
|
||||||
4 jan,4 jan SUMUP*KULTURE METISSE SAINT PAUL,Shopping,15.0,American Express,2026-02-02.pdf
|
|
||||||
4 juil,4 juil INTERMARCHE CHATILLO CHATILLON,Groceries,9.68,American Express,2025-08-02.pdf
|
|
||||||
4 mai,4 mai INTERMARCHE CHATILLO CHATILLON,Groceries,29.39,American Express,2025-06-02.pdf
|
|
||||||
5 août,5 août INTERMARCHE CHATILLO CHATILLON,Groceries,37.36,American Express,2025-09-02.pdf
|
|
||||||
5 déc,5 déc AMAZON EU SARL GUYANCOURT,Other,99.99,American Express,2026-01-02.pdf
|
|
||||||
5 déc,5 déc SUMUP*KRISSH VITRY-SUR-SEINE,Other,90.0,American Express,2025-01-02.pdf
|
|
||||||
5 jan,5 jan SUMUP*KULTURE METISSE SAINT PAUL,Shopping,10.0,American Express,2025-02-02.pdf
|
|
||||||
5 jan,5 jan TITTY TWISTER ST GILLES LES B,Other,9.0,American Express,2025-02-02.pdf
|
|
||||||
5 juil,5 juil HISTOIRE D'OR 001 78140 VELIZY-VILLACOU,Other,39.0,American Express,2025-08-02.pdf
|
|
||||||
5 juil,5 juil SUMUP*BATISTAS PARIS 16,Other,13.0,American Express,2025-08-02.pdf
|
|
||||||
5 juil,5 juil TOUT LE MONDE EN PARLE PARIS,Other,22.0,American Express,2025-08-02.pdf
|
|
||||||
5 juil,5 juil TOUT LE MONDE EN PARLE PARIS,Other,16.0,American Express,2025-08-02.pdf
|
|
||||||
5 sept,5 sept TRANSAVIA FRANCE S.A.S. PARAY-VIEILLE-P,Other,295.0,American Express,2025-10-02.pdf
|
|
||||||
6 août,6 août PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,364.94,American Express,2025-09-02.pdf
|
|
||||||
5 avr,6 avr RESEAU FLEURISAS CABRIERES-D'AIG,Other,57.85,American Express,2025-05-02.pdf
|
|
||||||
6 déc,6 déc INTERMARCHE CHATILLO CHATILLON,Groceries,20.21,American Express,2026-01-02.pdf
|
|
||||||
6 déc,6 déc LACOSTE PARIS,Other,43.0,American Express,2026-01-02.pdf
|
|
||||||
6 déc,6 déc PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,701.27,American Express,2025-01-02.pdf
|
|
||||||
6 déc,6 déc SASU RITUALS COSMETICS PARIS,Other,11.9,American Express,2026-01-02.pdf
|
|
||||||
6 déc,6 déc VELIZY DECATING49 VELIZY,Other,18.77,American Express,2026-01-02.pdf
|
|
||||||
6 fév,6 fév INTERMARCHE CHATILLO CHATILLON,Groceries,39.68,American Express,2025-03-02.pdf
|
|
||||||
6 fév,6 fév PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,635.27,American Express,2025-03-02.pdf
|
|
||||||
6 jan,6 jan ENGEN LAGON SAINT GILLES LE,Other,24.8,American Express,2025-02-02.pdf
|
|
||||||
6 jan,6 jan INTER SPORT ST PAUL,Other,49.47,American Express,2025-02-02.pdf
|
|
||||||
6 jan,6 jan PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI 1,Other,212.23,American Express,2026-02-02.pdf
|
|
||||||
6 jan,6 jan PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI 2,Other,331.38,American Express,2025-02-02.pdf
|
|
||||||
6 jan,6 jan SCALEWAY PARIS,Online Services/Subscriptions,1.89,American Express,2026-02-02.pdf
|
|
||||||
6 juin,6 juin PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,510.35,American Express,2025-07-02.pdf
|
|
||||||
6 mai,6 mai INTERMARCHE CHATILLO CHATILLON,Groceries,11.59,American Express,2025-06-02.pdf
|
|
||||||
6 mai,6 mai PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,749.89,American Express,2025-06-02.pdf
|
|
||||||
6 mars,6 mars PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,580.4,American Express,2025-04-02.pdf
|
|
||||||
6 nov,6 nov PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,246.91,American Express,2025-12-02.pdf
|
|
||||||
6 nov,6 nov SCALEWAY PARIS,Online Services/Subscriptions,1.69,American Express,2025-12-02.pdf
|
|
||||||
6 nov,6 nov SCW* C-8510 PARIS,Other,1.0,American Express,2025-12-02.pdf
|
|
||||||
6 oct,6 oct PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI 1,Other,347.1,American Express,2025-11-02.pdf
|
|
||||||
7 sept,6 sept BIZOUK CLICHY,Other,20.99,American Express,2025-10-02.pdf
|
|
||||||
7 sept,6 sept HOTEL ON BOOKING.COM AMSTERDAM,Other,299.2,American Express,2025-10-02.pdf
|
|
||||||
7 août,7 août PARIS -BERGER PARIS PARIS,Other,7.73,American Express,2025-09-02.pdf
|
|
||||||
7 avr,7 avr PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,321.05,American Express,2025-05-02.pdf
|
|
||||||
7 déc,7 déc AUCHAN 0048M VELIZY,Other,28.75,American Express,2025-01-02.pdf
|
|
||||||
7 déc,7 déc INTERMARCHE CHATILLO CHATILLON,Groceries,22.92,American Express,2025-01-02.pdf
|
|
||||||
8 déc,7 déc LE B 75018 PARIS,Other,13.0,American Express,2025-01-02.pdf
|
|
||||||
7 déc,7 déc TOUT LE MONDE EN PARLE PARIS,Other,28.0,American Express,2025-01-02.pdf
|
|
||||||
7 juil,7 juil PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,866.28,American Express,2025-08-02.pdf
|
|
||||||
7 juin,7 juin INTERMARCHE CHATILLO CHATILLON,Groceries,15.47,American Express,2025-07-02.pdf
|
|
||||||
7 mai,7 mai L'ESPRIT DE FAMILLE SAINT-DENIS,Other,12.0,American Express,2025-06-02.pdf
|
|
||||||
8 août,8 août COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,9.8,American Express,2025-09-02.pdf
|
|
||||||
8 déc,8 déc PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI,Other,402.48,American Express,2026-01-02.pdf
|
|
||||||
8 juil,8 juil INTERMARCHE CHATILLO CHATILLON,Groceries,27.01,American Express,2025-08-02.pdf
|
|
||||||
8 mars,8 mars BIZOUK CLICHY,Other,62.1,American Express,2025-04-02.pdf
|
|
||||||
8 mars,8 mars BIZOUK CLICHY,Other,15.99,American Express,2025-04-02.pdf
|
|
||||||
8 nov,8 nov FOOT LOCKER FRANCE SAS PUTEAUX,Other,128.97,American Express,2025-12-02.pdf
|
|
||||||
8 nov,8 nov GROQ INC MOUNTAIN VIEW,Other,9.35,American Express,2025-12-02.pdf
|
|
||||||
8 nov,8 nov INTERMARCHE CHATILLO CHATILLON,Groceries,25.7,American Express,2025-12-02.pdf
|
|
||||||
8 nov,8 nov SCW* C-8510 PARIS,Other,1.0,American Express,2025-12-02.pdf
|
|
||||||
8 sept,8 sept PRELEVEMENT AUTOMATIQUE ENREGISTRE-MERCI 2,Other,108.22,American Express,2025-10-02.pdf
|
|
||||||
8 sept,8 sept TRANSAVIA FRANCE S.A.S. PARAY-VIEILLE-P,Other,78.0,American Express,2025-10-02.pdf
|
|
||||||
9 août,9 août TOUT LE MONDE EN PARLE PARIS,Other,16.0,American Express,2025-09-02.pdf
|
|
||||||
9 déc,9 déc INTERMARCHE CHATILLO CHATILLON,Groceries,36.72,American Express,2025-01-02.pdf
|
|
||||||
9 jan,9 jan CARREFOUR SAINT PIERRE SAINT PIERRE,Groceries,64.99,American Express,2026-02-02.pdf
|
|
||||||
9 jan,9 jan LM SAINT LOUIS LEROYM4 SAINT LOUIS,Travel,351.8,American Express,2026-02-02.pdf
|
|
||||||
9 juin,9 juin INTERMARCHE CLAMART CLAMART,Groceries,8.71,American Express,2025-07-02.pdf
|
|
||||||
9 mai,9 mai COLUMBUS CAFE COLUMBUS CHATILLON,Restaurants/Food,10.2,American Express,2025-06-02.pdf
|
|
||||||
9 nov,9 nov INTERMARCHE CHATILLO CHATILLON,Groceries,56.65,American Express,2025-12-02.pdf
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de PRIME 2025.pdf
|
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
05/01/2026,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2026-02-02.pdf
|
|
||||||
06/01/2026,ECH PRET 28943002099054,Loan Repayment,150.0,Monabanq,Extrait de comptes au 2026-02-02.pdf
|
|
||||||
08/01/2026,F COTIS PRATIQ+,Bank Fees,3.0,Monabanq,Extrait de comptes au 2026-02-02.pdf
|
|
||||||
08/01/2026,VIR MR BATAILLE KEVIN,Internal Transfer,150.0,Monabanq,Extrait de comptes au 2026-02-02.pdf
|
|
||||||
22/01/2026,GOOGLE IRELAND LIMITED,Google Services,70.93,Monabanq,Extrait de comptes au 2026-02-02.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de AVRIL 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de AOUT 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de DECEMBRE 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de FEVRIER 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de JANVIER 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de JUILLET 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de JUIN 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de MARS 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de MAI 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de NOVEMBRE 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de OCTOBRE 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de SEPTEMBRE 2025.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Description,Category,Amount,Institution,Source
|
|
||||||
01/Unknown/2025,Salaire Unknown 2025,Salary,0.0,SNCF,salaire de JANVIER 2026.pdf
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Year,Total Income,Total Expenses,Net Balance,Transaction Count
|
|
||||||
2026,0,19534.260000000013,19534.260000000013,318
|
|
||||||
|
@@ -1,328 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Script to aggregate all account statements by month or year
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import csv
|
|
||||||
import sys
|
|
||||||
import argparse
|
|
||||||
import re
|
|
||||||
from datetime import datetime
|
|
||||||
from collections import defaultdict
|
|
||||||
import calendar
|
|
||||||
|
|
||||||
def parse_date(date_str, source_file):
|
|
||||||
"""
|
|
||||||
Parse date from various formats and return normalized (year, month, day)
|
|
||||||
"""
|
|
||||||
# Try different date formats
|
|
||||||
formats = [
|
|
||||||
'%d/%m/%Y', # DD/MM/YYYY
|
|
||||||
'%m/%d/%Y', # MM/DD/YYYY (Amex format)
|
|
||||||
'%Y-%m-%d', # YYYY-MM-DD (Revolut format)
|
|
||||||
]
|
|
||||||
|
|
||||||
for fmt in formats:
|
|
||||||
try:
|
|
||||||
dt = datetime.strptime(date_str, fmt)
|
|
||||||
return (dt.year, dt.month, dt.day)
|
|
||||||
except ValueError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Try to extract from filename (for SNCF)
|
|
||||||
if 'salaire' in source_file.lower():
|
|
||||||
months = ['janvier', 'fevrier', 'mars', 'avril', 'mai', 'juin',
|
|
||||||
'juillet', 'aout', 'septembre', 'octobre', 'novembre', 'decembre']
|
|
||||||
for i, month in enumerate(months, 1):
|
|
||||||
if month.lower() in source_file.lower():
|
|
||||||
year_match = re.search(r'20(\d{2})', source_file)
|
|
||||||
year = int(year_match.group(1)) if year_match else datetime.now().year
|
|
||||||
return (year, i, 1)
|
|
||||||
|
|
||||||
# Default: return current date
|
|
||||||
return (datetime.now().year, datetime.now().month, 1)
|
|
||||||
|
|
||||||
def categorize_institution(source_file):
|
|
||||||
"""
|
|
||||||
Determine the institution based on the source filename
|
|
||||||
"""
|
|
||||||
source_lower = source_file.lower()
|
|
||||||
|
|
||||||
if 'boursobank' in source_lower or 'releve-compte' in source_lower:
|
|
||||||
return 'Boursobank'
|
|
||||||
elif 'american_express' in source_lower or 'amex' in source_lower:
|
|
||||||
return 'American Express'
|
|
||||||
elif 'monabanq' in source_lower or 'extrait de comptes' in source_lower:
|
|
||||||
return 'Monabanq'
|
|
||||||
elif 'revolut' in source_lower:
|
|
||||||
return 'Revolut'
|
|
||||||
elif 'sncf' in source_lower or 'salaire' in source_lower:
|
|
||||||
return 'SNCF'
|
|
||||||
elif 'la_poste' in source_lower or '2-la.poste' in source_lower or 'releve_ccp' in source_lower:
|
|
||||||
return 'La Poste'
|
|
||||||
|
|
||||||
return 'Other'
|
|
||||||
|
|
||||||
def process_csv_file(file_path):
|
|
||||||
"""
|
|
||||||
Process a CSV file and return a list of transactions
|
|
||||||
"""
|
|
||||||
transactions = []
|
|
||||||
institution = categorize_institution(os.path.basename(file_path))
|
|
||||||
|
|
||||||
with open(file_path, 'r', encoding='utf-8') as f:
|
|
||||||
reader = csv.DictReader(f)
|
|
||||||
|
|
||||||
for row in reader:
|
|
||||||
# Get the date
|
|
||||||
date_str = row.get('Date', '')
|
|
||||||
if not date_str:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Parse and normalize the date
|
|
||||||
year, month, day = parse_date(date_str, row.get('Source', ''))
|
|
||||||
|
|
||||||
# Get amount (handle different column names)
|
|
||||||
amount_str = row.get('Amount', '') or row.get('Debit', '') or row.get('Credit', '0')
|
|
||||||
try:
|
|
||||||
amount = float(amount_str.replace(',', '.')) if amount_str else 0
|
|
||||||
except ValueError:
|
|
||||||
amount = 0
|
|
||||||
|
|
||||||
# Create transaction record
|
|
||||||
transactions.append({
|
|
||||||
'year': year,
|
|
||||||
'month': month,
|
|
||||||
'day': day,
|
|
||||||
'date_str': date_str,
|
|
||||||
'description': row.get('Description', ''),
|
|
||||||
'category': row.get('Category', 'Other'),
|
|
||||||
'amount': amount,
|
|
||||||
'institution': institution,
|
|
||||||
'source': row.get('Source', os.path.basename(file_path))
|
|
||||||
})
|
|
||||||
|
|
||||||
return transactions
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(description='Aggregate all account statements by month or year')
|
|
||||||
parser.add_argument('--input-dir', default='output/csv',
|
|
||||||
help='Directory containing CSV files to aggregate (default: output/csv)')
|
|
||||||
parser.add_argument('--output-dir', 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()
|
|
||||||
|
|
||||||
# Create output directory
|
|
||||||
os.makedirs(args.output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
report_type = "Annual" if args.annual else "Monthly"
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"{report_type} Aggregation of All Account Statements")
|
|
||||||
print(f"Input Directory: {os.path.abspath(args.input_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"{'='*60}")
|
|
||||||
|
|
||||||
# Collect all transactions
|
|
||||||
all_transactions = []
|
|
||||||
|
|
||||||
# Find all CSV files in input directory
|
|
||||||
csv_files = [f for f in os.listdir(args.input_dir) if f.endswith('.csv')]
|
|
||||||
|
|
||||||
if not csv_files:
|
|
||||||
print(f"\nError: No CSV files found in {args.input_dir}")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Process each CSV file
|
|
||||||
for csv_file in csv_files:
|
|
||||||
file_path = os.path.join(args.input_dir, csv_file)
|
|
||||||
print(f"\nProcessing: {csv_file}")
|
|
||||||
transactions = process_csv_file(file_path)
|
|
||||||
all_transactions.extend(transactions)
|
|
||||||
print(f" Found {len(transactions)} transactions")
|
|
||||||
|
|
||||||
# Group transactions by month
|
|
||||||
monthly_transactions = defaultdict(list)
|
|
||||||
for transaction in all_transactions:
|
|
||||||
key = (transaction['year'], transaction['month'])
|
|
||||||
monthly_transactions[key].append(transaction)
|
|
||||||
|
|
||||||
# Create monthly summary report
|
|
||||||
summary_file = os.path.join(args.output_dir, 'monthly_summary.csv')
|
|
||||||
with open(summary_file, 'w', newline='', encoding='utf-8') as f:
|
|
||||||
writer = csv.writer(f)
|
|
||||||
|
|
||||||
# Header
|
|
||||||
writer.writerow([
|
|
||||||
'Year', 'Month', 'Total Income', 'Total Expenses', 'Net Balance',
|
|
||||||
'Transaction Count', 'Institutions'
|
|
||||||
])
|
|
||||||
|
|
||||||
# Process each month
|
|
||||||
for year, month in sorted(monthly_transactions.keys()):
|
|
||||||
transactions = monthly_transactions[(year, month)]
|
|
||||||
month_name = calendar.month_name[month]
|
|
||||||
|
|
||||||
# Calculate totals
|
|
||||||
total_income = sum(t['amount'] for t in transactions if t['amount'] < 0) # Negative amounts are income in Revolut
|
|
||||||
total_expenses = sum(t['amount'] for t in transactions if t['amount'] > 0)
|
|
||||||
net_balance = total_income + total_expenses
|
|
||||||
transaction_count = len(transactions)
|
|
||||||
|
|
||||||
# Get unique institutions
|
|
||||||
institutions = sorted(list(set(t['institution'] for t in transactions)))
|
|
||||||
institutions_str = ', '.join(institutions)
|
|
||||||
|
|
||||||
# Write row
|
|
||||||
writer.writerow([
|
|
||||||
year, month_name, total_income, total_expenses, net_balance,
|
|
||||||
transaction_count, institutions_str
|
|
||||||
])
|
|
||||||
|
|
||||||
# Create yearly summary
|
|
||||||
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()
|
|
||||||
transactions = monthly_transactions[(year, month)]
|
|
||||||
|
|
||||||
# Create filename
|
|
||||||
detail_file = os.path.join(args.output_dir, f'transactions_{year}_{month_name}.csv')
|
|
||||||
|
|
||||||
with open(detail_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(transactions, key=lambda x: (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(f'transactions_{year}_{month_name}.csv')
|
|
||||||
|
|
||||||
# Print summary statistics
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Aggregation Complete")
|
|
||||||
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"{'='*60}")
|
|
||||||
|
|
||||||
# List generated files
|
|
||||||
print("\nGenerated Files:")
|
|
||||||
for file in generated_files:
|
|
||||||
file_path = os.path.join(args.output_dir, file)
|
|
||||||
if os.path.exists(file_path):
|
|
||||||
file_size = os.path.getsize(file_path)
|
|
||||||
print(f" - {file} ({file_size:,} bytes)")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[["pdftotext", "-layout", "/home/acid/Downloads/comptabilite/american.express/2025-01-02.pdf", "-"], ["line for line in amex_lines if re.match(r'd{1,2} w{3}', line) and not line.endswith('CR')]\n \n print(\"=== AMEX JANUARY QC ===\")\n print(f\"Transactions found: {len(amex_trans)}\")\n for i, line in enumerate(amex_trans[:5]):\n parts = line.split()\n try:\n amount = float(parts[-1].replace(',', '.'))\n desc = ' '.join(parts[2:-1])\n print(f\" {i+1}. {desc}: u20ac{amount:.2f}\")\n except:\n print(f\" {i+1}. {line}\")\nexcept Exception as e:\n print(f\"Amex QC error: {e}\")\n\n# MONABANQ QC\ntry:\n result = subprocess.run(['pdftotext', '-layout', '/home/acid/Downloads/comptabilite/monabanq/Extrait de comptes au 2025-01-31.pdf', '-'], capture_output=True, text=True)\n monabanq_lines = result.stdout.split('\\n')\n trans_started = False\n monabanq_debits = []\n \n for line in monabanq_lines:\n if \"SOLDE\" in line:\n trans_started = True\n continue\n if trans_started and \"IBAN", "in line:\n break\n if trans_started and re.search(r'd+,d+$', line):\n parts = line.split()\n if len(parts) >= 4:\n try:\n amount = float(parts[-1].replace(',', '.'))\n desc = ' '.join(parts[2:-1])\n monabanq_debits.append((desc, amount))\n except:\n continue\n \n print(f\"\n=== MONABANQ JANUARY QC ===\")\n print(f\"Debits found: {len(monabanq_debits)}\")\n for i, (desc, amt) in enumerate(monabanq_debits[:5]):\n print(f\" {i+1}. {desc}: u20ac{amt:.2f}\")\nexcept Exception as e:\n print(f\"Monabanq QC error: {e}\")\n\n# REVOLUT QC\ntry:\n with open('/home/acid/Downloads/comptabilite/revolut/account-statement_2025-01-01_2025-01-31_en-us_58f89a.csv', 'r') as f:\n reader = csv.DictReader(f)\n revolut_expenses = []\n for row in reader:\n if row['Currency'] == 'EUR' and float(row['Amount']) < 0:\n desc = row['Description']\n amt = abs(float(row['Amount']))\n revolut_expenses.append((desc, amt))\n \n print(f\"\n=== REVOLUT JANUARY QC ===\")\n print(f\"Expenses found: {len(revolut_expenses)}\")\n for i, (desc, amt) in enumerate(revolut_expenses[:5]):\n print(f\" {i+1}. {desc}: u20ac{amt:.2f}\")\nexcept Exception as e:\n print(f\"Revolut QC error: {e}\")\n\nprint(\"\n=== QUALITY CONTROL SUMMARY ===\")\nprint(\"u2713 Scripts are extracting transactions from source files\")\nprint(\"u2713 Transaction amounts appear to be parsed correctly\")\nprint(\"u2192 Data processing is working as expected\")"]]
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Fully dynamic script to auto-discover and process all financial statements
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import glob
|
|
||||||
import re
|
|
||||||
import argparse
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""
|
|
||||||
Main function to dynamically discover and process all financial statements
|
|
||||||
"""
|
|
||||||
parser = argparse.ArgumentParser(description='Dynamically process all financial statements')
|
|
||||||
parser.add_argument('--data-dir',
|
|
||||||
help='Base directory containing PDF files (default: ../data/pdf)')
|
|
||||||
parser.add_argument('--output-dir', default=None,
|
|
||||||
help='Directory to save CSV output files (default: ../output/csv)')
|
|
||||||
parser.add_argument('--csv', action='store_true',
|
|
||||||
help='Generate CSV output files')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Get paths
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
project_root = os.path.dirname(script_dir)
|
|
||||||
|
|
||||||
# Determine data directory
|
|
||||||
if args.data_dir:
|
|
||||||
data_dir = args.data_dir
|
|
||||||
if not os.path.isabs(data_dir):
|
|
||||||
data_dir = os.path.join(project_root, data_dir)
|
|
||||||
else:
|
|
||||||
data_dir = os.path.join(project_root, 'data/pdf')
|
|
||||||
|
|
||||||
# Set output directory
|
|
||||||
if args.output_dir:
|
|
||||||
output_dir = args.output_dir
|
|
||||||
if not os.path.isabs(output_dir):
|
|
||||||
output_dir = os.path.join(project_root, args.output_dir)
|
|
||||||
else:
|
|
||||||
output_dir = os.path.join(project_root, 'output/csv')
|
|
||||||
|
|
||||||
# Create output directory if needed
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Dynamic Financial Statement Processor")
|
|
||||||
print(f"Data Directory: {os.path.abspath(data_dir)}")
|
|
||||||
print(f"Output Directory: {os.path.abspath(output_dir)}")
|
|
||||||
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
# Discover all PDF directories
|
|
||||||
pdf_dirs = {}
|
|
||||||
|
|
||||||
# Get all directories in the data directory
|
|
||||||
if not os.path.exists(data_dir):
|
|
||||||
print(f"Error: Data directory not found: {data_dir}")
|
|
||||||
return
|
|
||||||
|
|
||||||
for item in os.listdir(data_dir):
|
|
||||||
dir_path = os.path.join(data_dir, item)
|
|
||||||
if os.path.isdir(dir_path):
|
|
||||||
# Check if this directory contains PDF files
|
|
||||||
pdf_files = glob.glob(os.path.join(dir_path, "*.pdf"))
|
|
||||||
if pdf_files:
|
|
||||||
# Determine account type based on directory name
|
|
||||||
dir_name_lower = item.lower()
|
|
||||||
if 'boursobank' in dir_name_lower or 'releve-compte' in dir_name_lower:
|
|
||||||
account_type = 'Boursobank'
|
|
||||||
script_name = 'process_bourso.py'
|
|
||||||
elif 'american_express' in dir_name_lower or 'amex' in dir_name_lower:
|
|
||||||
account_type = 'American Express'
|
|
||||||
script_name = 'process_amex.py'
|
|
||||||
elif 'monabanq' in dir_name_lower or 'extrait' in dir_name_lower:
|
|
||||||
account_type = 'Monabanq'
|
|
||||||
script_name = 'process_monabanq.py'
|
|
||||||
elif 'sncf' in dir_name_lower or 'salaire' in dir_name_lower:
|
|
||||||
account_type = 'SNCF'
|
|
||||||
script_name = 'process_sncf_improved.py'
|
|
||||||
elif 'la_poste' in dir_name_lower or 'la-poste' in dir_name_lower or 'releve_ccp' in dir_name_lower:
|
|
||||||
account_type = 'La Poste'
|
|
||||||
script_name = 'process_laposte_improved.py'
|
|
||||||
elif 'impots' in dir_name_lower or 'impot' in dir_name_lower:
|
|
||||||
account_type = 'Impôts'
|
|
||||||
script_name = None # Skip tax documents
|
|
||||||
else:
|
|
||||||
account_type = item.replace('_', ' ').title()
|
|
||||||
script_name = f'process_{account_type.lower().replace(" ", "_")}.py'
|
|
||||||
|
|
||||||
pdf_dirs[account_type] = {
|
|
||||||
'path': dir_path,
|
|
||||||
'count': len(pdf_files),
|
|
||||||
'files': pdf_files,
|
|
||||||
'script': script_name
|
|
||||||
}
|
|
||||||
|
|
||||||
if not pdf_dirs:
|
|
||||||
print("No directories with PDF files found!")
|
|
||||||
return
|
|
||||||
|
|
||||||
print(f"\nDiscovered {len(pdf_dirs)} directories with PDF files:")
|
|
||||||
for account_type, info in pdf_dirs.items():
|
|
||||||
print(f" - {account_type}: {info['count']} PDF files")
|
|
||||||
|
|
||||||
# Process each account type
|
|
||||||
success_count = 0
|
|
||||||
|
|
||||||
for account_type, info in pdf_dirs.items():
|
|
||||||
if not info['script']:
|
|
||||||
print(f"\nSkipping {account_type}: No processing script available")
|
|
||||||
continue
|
|
||||||
|
|
||||||
# For Revolut, use CSV directory instead of PDF directory
|
|
||||||
process_dir = info['path']
|
|
||||||
if account_type == 'Revolut':
|
|
||||||
process_dir = os.path.join(os.path.dirname(data_dir), 'raw_csv') # CSV files are in raw_csv
|
|
||||||
|
|
||||||
if process_dir and not os.path.exists(process_dir):
|
|
||||||
print(f"Warning: Directory not found: {process_dir}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Build command
|
|
||||||
cmd = [sys.executable,
|
|
||||||
os.path.join(script_dir, info['script']),
|
|
||||||
'--pdf-dir' if account_type != 'Revolut' else '--csv-dir',
|
|
||||||
process_dir,
|
|
||||||
'--output-dir', output_dir]
|
|
||||||
|
|
||||||
if args.csv:
|
|
||||||
cmd.append('--csv')
|
|
||||||
|
|
||||||
print(f"\nProcessing {account_type}...")
|
|
||||||
print(f"Running: {' '.join(cmd[2:])}")
|
|
||||||
|
|
||||||
try:
|
|
||||||
result = subprocess.run(cmd, check=True, capture_output=True)
|
|
||||||
if result.stdout:
|
|
||||||
print(result.stdout)
|
|
||||||
if result.returncode == 0:
|
|
||||||
success_count += 1
|
|
||||||
print(f"✓ {account_type} processing completed successfully")
|
|
||||||
else:
|
|
||||||
print(f"✗ {account_type} processing failed with exit code {result.returncode}")
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print(f"✗ Error processing {account_type}: {e}")
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Processing Complete: {success_count}/{len(pdf_dirs)} accounts processed successfully")
|
|
||||||
print(f"CSV files saved to: {os.path.abspath(output_dir)}")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Dynamic script to auto-discover and process all financial statements
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import glob
|
|
||||||
import re
|
|
||||||
from collections import defaultdict
|
|
||||||
import calendar
|
|
||||||
import argparse
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
def discover_pdf_directories(base_data_dir):
|
|
||||||
"""
|
|
||||||
Scan base data directory and return all subdirectories containing PDF files
|
|
||||||
"""
|
|
||||||
pdf_dirs = {}
|
|
||||||
|
|
||||||
# Get all directories in the base data directory
|
|
||||||
for item in os.listdir(base_data_dir):
|
|
||||||
dir_path = os.path.join(base_data_dir, item)
|
|
||||||
if os.path.isdir(dir_path):
|
|
||||||
# Check if this directory contains PDF files
|
|
||||||
pdf_files = glob.glob(os.path.join(dir_path, "*.pdf"))
|
|
||||||
if pdf_files:
|
|
||||||
# Determine account type based on directory name
|
|
||||||
dir_name_lower = item.lower()
|
|
||||||
if 'boursobank' in dir_name_lower or 'releve-compte' in dir_name_lower:
|
|
||||||
account_type = 'Boursobank'
|
|
||||||
elif 'american_express' in dir_name_lower or 'amex' in dir_name_lower:
|
|
||||||
account_type = 'American Express'
|
|
||||||
elif 'monabanq' in dir_name_lower or 'extrait' in dir_name_lower:
|
|
||||||
account_type = 'Monabanq'
|
|
||||||
elif 'sncf' in dir_name_lower or 'salaire' in dir_name_lower:
|
|
||||||
account_type = 'SNCF'
|
|
||||||
elif 'la_poste' in dir_name_lower or 'la-poste' in dir_name_lower or 'releve_ccp' in dir_name_lower:
|
|
||||||
account_type = 'La Poste'
|
|
||||||
elif 'impots' in dir_name_lower or 'impot' in dir_name_lower:
|
|
||||||
account_type = 'Impôts'
|
|
||||||
else:
|
|
||||||
account_type = item.replace('_', ' ').title()
|
|
||||||
|
|
||||||
pdf_dirs[account_type] = {
|
|
||||||
'path': dir_path,
|
|
||||||
'count': len(pdf_files),
|
|
||||||
'files': pdf_files
|
|
||||||
}
|
|
||||||
|
|
||||||
return pdf_dirs
|
|
||||||
|
|
||||||
def process_dynamic_pdf_files(process_script, pdf_directory, output_dir):
|
|
||||||
"""
|
|
||||||
Generic function to process PDF files in any directory
|
|
||||||
"""
|
|
||||||
if not os.path.exists(pdf_directory):
|
|
||||||
print(f"Warning: Directory not found: {pdf_directory}")
|
|
||||||
return []
|
|
||||||
|
|
||||||
# Get all PDF files
|
|
||||||
pdf_files = glob.glob(os.path.join(pdf_directory, "*.pdf"))
|
|
||||||
|
|
||||||
if not pdf_files:
|
|
||||||
print(f"No PDF files found in {pdf_directory}")
|
|
||||||
return []
|
|
||||||
|
|
||||||
# Build command
|
|
||||||
script_path = os.path.abspath(process_script)
|
|
||||||
script_dir = os.path.dirname(script_path)
|
|
||||||
cmd = [sys.executable, os.path.join(script_dir, os.path.basename(process_script)),
|
|
||||||
'--pdf-dir', pdf_directory, '--output-dir', output_dir, '--csv']
|
|
||||||
|
|
||||||
# Run the processing script
|
|
||||||
try:
|
|
||||||
result = subprocess.run(cmd, check=True, capture_output=True)
|
|
||||||
print(result.stdout)
|
|
||||||
return result.returncode == 0
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print(f"Error processing {pdf_directory}: {e}")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""
|
|
||||||
Main function to dynamically discover and process all financial statements
|
|
||||||
"""
|
|
||||||
parser = argparse.ArgumentParser(description='Dynamically process all financial statements')
|
|
||||||
parser.add_argument('--data-dir',
|
|
||||||
help='Base directory containing PDF files (default: auto-discovered)')
|
|
||||||
parser.add_argument('--output-dir', default=None,
|
|
||||||
help='Directory to save CSV output files')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Get paths
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
project_root = os.path.dirname(script_dir)
|
|
||||||
|
|
||||||
# Determine data directory
|
|
||||||
if args.data_dir:
|
|
||||||
data_dir = args.data_dir
|
|
||||||
if not os.path.isabs(data_dir):
|
|
||||||
data_dir = os.path.join(project_root, data_dir)
|
|
||||||
else:
|
|
||||||
data_dir = os.path.join(project_root, 'data/pdf')
|
|
||||||
|
|
||||||
# Set output directory
|
|
||||||
output_dir = args.output_dir or os.path.join(project_root, 'output/csv')
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Dynamic Financial Statement Processor")
|
|
||||||
print(f"Data Directory: {os.path.abspath(data_dir)}")
|
|
||||||
print(f"Output Directory: {os.path.abspath(output_dir)}")
|
|
||||||
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
# Discover all PDF directories
|
|
||||||
pdf_dirs = discover_pdf_directories(data_dir)
|
|
||||||
|
|
||||||
if not pdf_dirs:
|
|
||||||
print("No directories with PDF files found!")
|
|
||||||
return
|
|
||||||
|
|
||||||
print(f"\nDiscovered {len(pdf_dirs)} directories with PDF files:")
|
|
||||||
for account_type, info in pdf_dirs.items():
|
|
||||||
print(f" - {account_type}: {info['count']} files in {info['path']}")
|
|
||||||
|
|
||||||
# Define processing scripts for each account type
|
|
||||||
script_map = {
|
|
||||||
'Boursobank': 'process_bourso.py',
|
|
||||||
'American Express': 'process_amex.py',
|
|
||||||
'Monabanq': 'process_monabanq.py',
|
|
||||||
'SNCF': 'process_sncf_improved.py',
|
|
||||||
'La Poste': 'process_laposte_improved.py',
|
|
||||||
'Revolut': 'process_expenses.py', # Special case: uses CSV input
|
|
||||||
'Impôts': None # No processing script for tax documents yet
|
|
||||||
}
|
|
||||||
|
|
||||||
# Process each account type
|
|
||||||
success_count = 0
|
|
||||||
|
|
||||||
for account_type, info in pdf_dirs.items():
|
|
||||||
if account_type not in script_map:
|
|
||||||
print(f"\nWarning: No processing script available for {account_type}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
# For Revolut, use CSV directory instead of PDF directory
|
|
||||||
process_dir = info['path']
|
|
||||||
if account_type == 'Revolut':
|
|
||||||
process_dir = os.path.join(os.path.dirname(data_dir), 'raw_csv') # CSV files are in raw_csv
|
|
||||||
|
|
||||||
if process_dir and not os.path.exists(process_dir):
|
|
||||||
print(f"Warning: Directory not found: {process_dir}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
success = process_dynamic_pdf_files(
|
|
||||||
script_map[account_type],
|
|
||||||
process_dir,
|
|
||||||
output_dir
|
|
||||||
)
|
|
||||||
|
|
||||||
if success:
|
|
||||||
success_count += 1
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Processing Complete: {success_count}/{len(pdf_dirs)} accounts processed successfully")
|
|
||||||
print(f"CSV files saved to: {os.path.abspath(output_dir)}")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Dynamic script to auto-discover and process all financial statements
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""
|
|
||||||
Main function to dynamically discover and process all financial statements
|
|
||||||
"""
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Dynamically process all financial statements')
|
|
||||||
parser.add_argument('--output-dir', default=None,
|
|
||||||
help='Directory to save CSV output files')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Get paths
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
project_root = os.path.dirname(script_dir)
|
|
||||||
data_dir = os.path.join(project_root, 'data/pdf')
|
|
||||||
|
|
||||||
# Set output directory
|
|
||||||
output_dir = args.output_dir or os.path.join(project_root, 'output/csv')
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Dynamic Financial Statement Processor")
|
|
||||||
print(f"Data Directory: {os.path.abspath(data_dir)}")
|
|
||||||
print(f"Output Directory: {os.path.abspath(output_dir)}")
|
|
||||||
|
|
||||||
# Build command
|
|
||||||
cmd = [sys.executable, os.path.join(script_dir, 'dynamic_processor.py'),
|
|
||||||
'--data-dir', data_dir, '--output-dir', output_dir]
|
|
||||||
|
|
||||||
# Run the dynamic processor
|
|
||||||
try:
|
|
||||||
result = subprocess.run(cmd, check=True, capture_output=True)
|
|
||||||
print(f"\nDiscovery Results:")
|
|
||||||
print(result.stdout)
|
|
||||||
|
|
||||||
if result.returncode == 0:
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Dynamic Processing Complete: CSV files saved to {os.path.abspath(output_dir)}")
|
|
||||||
else:
|
|
||||||
print(f"\nError during dynamic processing: exit code {result.returncode}")
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print(f"\nError running dynamic processor: {e}")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
# Add date to print
|
|
||||||
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
main()
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Dynamic script to auto-discover and process all financial statements
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""
|
|
||||||
Main function to dynamically discover and process all financial statements
|
|
||||||
"""
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Dynamically process all financial statements')
|
|
||||||
parser.add_argument('--output-dir', default=None,
|
|
||||||
help='Directory to save CSV output files')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Get paths
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
project_root = os.path.dirname(script_dir)
|
|
||||||
data_dir = os.path.join(project_root, 'data/pdf')
|
|
||||||
|
|
||||||
# Set output directory
|
|
||||||
output_dir = args.output_dir or os.path.join(project_root, 'output/csv')
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Dynamic Financial Statement Processor")
|
|
||||||
print(f"Data Directory: {os.path.abspath(data_dir)}")
|
|
||||||
print(f"Output Directory: {os.path.abspath(output_dir)}")
|
|
||||||
|
|
||||||
# Build command
|
|
||||||
cmd = [sys.executable, os.path.join(script_dir, 'dynamic_processor.py'),
|
|
||||||
'--data-dir', data_dir, '--output-dir', output_dir]
|
|
||||||
|
|
||||||
# Run the dynamic processor
|
|
||||||
try:
|
|
||||||
result = subprocess.run(cmd, check=True, capture_output=True)
|
|
||||||
print(f"\nDiscovery Results:")
|
|
||||||
print(result.stdout)
|
|
||||||
|
|
||||||
if result.returncode == 0:
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Dynamic Processing Complete: CSV files saved to {os.path.abspath(output_dir)}")
|
|
||||||
else:
|
|
||||||
print(f"\nError during dynamic processing: exit code {result.returncode}")
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print(f"\nError running dynamic processor: {e}")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Master script to process all financial statements and generate CSV outputs
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
def run_script(script_name, csv_output=False):
|
|
||||||
"""Run a processing script with optional CSV output"""
|
|
||||||
cmd = [sys.executable, script_name]
|
|
||||||
if csv_output:
|
|
||||||
cmd.append('--csv')
|
|
||||||
|
|
||||||
try:
|
|
||||||
print(f"\n{'='*50}")
|
|
||||||
print(f"Processing {script_name.replace('process_', '').replace('.py', '').replace('_', ' ').title()}...")
|
|
||||||
print('='*50)
|
|
||||||
subprocess.run(cmd, check=True)
|
|
||||||
return True
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print(f"Error running {script_name}: {e}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
def main():
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Process all financial statements')
|
|
||||||
parser.add_argument('--csv', action='store_true',
|
|
||||||
help='Output transaction data to CSV files')
|
|
||||||
parser.add_argument('--bourso', action='store_true',
|
|
||||||
help='Process only BoursoBank statements')
|
|
||||||
parser.add_argument('--amex', action='store_true',
|
|
||||||
help='Process only American Express statements')
|
|
||||||
parser.add_argument('--monabanq', action='store_true',
|
|
||||||
help='Process only Monabanq statements')
|
|
||||||
parser.add_argument('--revolut', action='store_true',
|
|
||||||
help='Process only Revolut statements')
|
|
||||||
parser.add_argument('--sncf', action='store_true',
|
|
||||||
help='Process only SNCF statements')
|
|
||||||
parser.add_argument('--laposte', action='store_true',
|
|
||||||
help='Process only La Poste statements')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Financial Statement Processor")
|
|
||||||
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
scripts_to_run = []
|
|
||||||
|
|
||||||
# Determine which scripts to run based on arguments
|
|
||||||
if args.bourso or not any([args.bourso, args.amex, args.monabanq, args.revolut, args.sncf, args.laposte]):
|
|
||||||
scripts_to_run.append('process_bourso.py')
|
|
||||||
if args.amex or not any([args.bourso, args.amex, args.monabanq, args.revolut, args.sncf, args.laposte]):
|
|
||||||
scripts_to_run.append('process_amex.py')
|
|
||||||
if args.monabanq or not any([args.bourso, args.amex, args.monabanq, args.revolut, args.sncf, args.laposte]):
|
|
||||||
scripts_to_run.append('process_monabanq.py')
|
|
||||||
if args.revolut or not any([args.bourso, args.amex, args.monabanq, args.revolut, args.sncf, args.laposte]):
|
|
||||||
scripts_to_run.append('process_expenses.py')
|
|
||||||
if args.sncf or not any([args.bourso, args.amex, args.monabanq, args.revolut, args.sncf, args.laposte]):
|
|
||||||
scripts_to_run.append('process_sncf.py')
|
|
||||||
if args.laposte or not any([args.bourso, args.amex, args.monabanq, args.revolut, args.sncf, args.laposte]):
|
|
||||||
scripts_to_run.append('process_laposte.py')
|
|
||||||
|
|
||||||
# Run each script
|
|
||||||
success_count = 0
|
|
||||||
output_dir = '../output/csv'
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
for script in scripts_to_run:
|
|
||||||
if os.path.exists(script):
|
|
||||||
# Pass CSV flag and output directory to all scripts
|
|
||||||
if run_script(script, args.csv):
|
|
||||||
success_count += 1
|
|
||||||
else:
|
|
||||||
print(f"Script not found: {script}")
|
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
|
||||||
print(f"Processing Complete: {success_count}/{len(scripts_to_run)} scripts executed successfully")
|
|
||||||
if args.csv:
|
|
||||||
print("CSV files have been generated for each directory")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
1
scripts/process_amex.py
Normal file → Executable file
1
scripts/process_amex.py
Normal file → Executable file
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
|
|||||||
3
scripts/process_bourso.py
Normal file → Executable file
3
scripts/process_bourso.py
Normal file → Executable file
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import csv
|
import csv
|
||||||
@@ -67,7 +68,7 @@ def process_bourso_statement(file_path, output_csv=False, output_dir='../../outp
|
|||||||
|
|
||||||
# Output CSV if requested
|
# Output CSV if requested
|
||||||
if output_csv:
|
if output_csv:
|
||||||
csv_file = os.path.join(output_dir, os.path.splitext(os.path.basename(file_path))[0] + '_transactions.csv')
|
csv_file = os.path.join(output_dir, 'boursobank_all_transactions.csv')
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
||||||
fieldnames = ['Date', 'Description', 'Category', 'Debit', 'Credit', 'Value Date']
|
fieldnames = ['Date', 'Description', 'Category', 'Debit', 'Credit', 'Value Date']
|
||||||
|
|||||||
1
scripts/process_expenses.py
Normal file → Executable file
1
scripts/process_expenses.py
Normal file → Executable file
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
import glob
|
import glob
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
import re
|
|
||||||
import csv
|
|
||||||
import os
|
|
||||||
import glob
|
|
||||||
from collections import defaultdict
|
|
||||||
|
|
||||||
def categorize_laposte_transaction(description):
|
|
||||||
description = description.lower()
|
|
||||||
|
|
||||||
if 'virement' in description or 'vir' in description:
|
|
||||||
return 'Transfer'
|
|
||||||
if 'retrait' in description:
|
|
||||||
return 'Cash Withdrawal'
|
|
||||||
if 'carte' in description or 'paiement' in description:
|
|
||||||
return 'Card Payment'
|
|
||||||
if 'frais' in description:
|
|
||||||
return 'Bank Fees'
|
|
||||||
if 'cotisation' in description:
|
|
||||||
return 'Deductions'
|
|
||||||
if 'impot' in description:
|
|
||||||
return 'Tax'
|
|
||||||
|
|
||||||
return 'Other'
|
|
||||||
|
|
||||||
def process_laposte_pdf_files(directory, output_csv=False, output_dir='../../output/csv'):
|
|
||||||
# Get all PDF files in the directory
|
|
||||||
pdf_files = glob.glob(os.path.join(directory, "*.pdf"))
|
|
||||||
all_transactions = []
|
|
||||||
|
|
||||||
for pdf_file in pdf_files:
|
|
||||||
try:
|
|
||||||
# Convert PDF to text
|
|
||||||
result = subprocess.run(['pdftotext', '-layout', pdf_file, '-'],
|
|
||||||
capture_output=True, text=True, check=True)
|
|
||||||
content = result.stdout
|
|
||||||
|
|
||||||
# Extract transactions from the PDF
|
|
||||||
lines = content.split('\n')
|
|
||||||
for line in lines:
|
|
||||||
# Basic regex to find transaction lines (may need refinement based on actual format)
|
|
||||||
if re.match(r'\s*\d{2}/\d{2}/\d{4}', line):
|
|
||||||
parts = line.split()
|
|
||||||
if len(parts) > 2:
|
|
||||||
try:
|
|
||||||
date = parts[0]
|
|
||||||
# Extract description parts between date and amount
|
|
||||||
description_parts = []
|
|
||||||
amount = 0
|
|
||||||
|
|
||||||
# Find amount (last numeric value)
|
|
||||||
for part in reversed(parts):
|
|
||||||
if re.match(r'[\d,.]+', part):
|
|
||||||
amount = float(part.replace(',', '.'))
|
|
||||||
break
|
|
||||||
description_parts.insert(0, part)
|
|
||||||
|
|
||||||
description = ' '.join(description_parts).strip()
|
|
||||||
category = categorize_laposte_transaction(description)
|
|
||||||
|
|
||||||
# Store transaction for CSV output
|
|
||||||
all_transactions.append({
|
|
||||||
'Date': date,
|
|
||||||
'Description': description,
|
|
||||||
'Category': category,
|
|
||||||
'Amount': amount,
|
|
||||||
'Source': os.path.basename(pdf_file)
|
|
||||||
})
|
|
||||||
|
|
||||||
except (ValueError, IndexError):
|
|
||||||
continue
|
|
||||||
|
|
||||||
except (subprocess.CalledProcessError, FileNotFoundError) as e:
|
|
||||||
print(f"Error processing {pdf_file}: {e}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Output CSV if requested
|
|
||||||
if output_csv and all_transactions:
|
|
||||||
csv_file = os.path.join(output_dir, 'laposte_all_transactions.csv')
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
|
||||||
fieldnames = ['Date', 'Description', 'Category', 'Amount', 'Source']
|
|
||||||
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
|
||||||
writer.writeheader()
|
|
||||||
writer.writerows(all_transactions)
|
|
||||||
print(f"\nTransaction data saved to {csv_file}")
|
|
||||||
|
|
||||||
print(f"--- La Poste Account Statements ---")
|
|
||||||
print(f"Found {len(pdf_files)} account statement files")
|
|
||||||
print(f"Processed {len(all_transactions)} transactions")
|
|
||||||
|
|
||||||
return all_transactions
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Process La Poste account statements')
|
|
||||||
parser.add_argument('--pdf-dir', default='../data/pdf/la_poste',
|
|
||||||
help='Directory containing La Poste PDF files')
|
|
||||||
parser.add_argument('--output-dir', default='../../output/csv',
|
|
||||||
help='Directory to save CSV output files')
|
|
||||||
parser.add_argument('--csv', action='store_true',
|
|
||||||
help='Output transaction data to CSV files')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Process all PDF files in the directory
|
|
||||||
process_laposte_pdf_files(args.pdf_dir, args.csv, args.output_dir)
|
|
||||||
12
scripts/process_laposte_improved.py
Normal file → Executable file
12
scripts/process_laposte_improved.py
Normal file → Executable file
@@ -1,3 +1,7 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
import csv
|
import csv
|
||||||
@@ -54,7 +58,7 @@ def process_laposte_pdf_files(directory, output_csv=False, output_dir='../../out
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
# Match transaction lines - they have date and amount
|
# Match transaction lines - they have date and amount
|
||||||
if re.match(r'\s*\d{2}/\d{2}/\d{4}', line):
|
if re.match(r'\s*\d{2}/\d{2}', line):
|
||||||
parts = re.split(r'\s{2,}', line)
|
parts = re.split(r'\s{2,}', line)
|
||||||
if len(parts) >= 3:
|
if len(parts) >= 3:
|
||||||
try:
|
try:
|
||||||
@@ -64,9 +68,9 @@ def process_laposte_pdf_files(directory, output_csv=False, output_dir='../../out
|
|||||||
# Extract amount (look for numeric values with ¤ or €)
|
# Extract amount (look for numeric values with ¤ or €)
|
||||||
amount = 0
|
amount = 0
|
||||||
for part in parts[2:]:
|
for part in parts[2:]:
|
||||||
part = part.strip().replace('¤', '').replace('€', '')
|
part = part.strip().replace('¤', '').replace('€', '').replace(' ', '')
|
||||||
if re.match(r'[\d.,]+', part):
|
if re.match(r'[\d.,]+', part):
|
||||||
amount_str = part.replace(' ', '').replace(',', '.')
|
amount_str = part.replace(',', '.')
|
||||||
try:
|
try:
|
||||||
amount = float(amount_str)
|
amount = float(amount_str)
|
||||||
break
|
break
|
||||||
@@ -121,4 +125,4 @@ if __name__ == "__main__":
|
|||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
# Process all PDF files in the directory
|
# Process all PDF files in the directory
|
||||||
process_laposte_pdf_files(args.pdf_dir, args.csv, args.output_dir)
|
process_laposte_pdf_files(args.pdf_dir, args.csv, args.output_dir)
|
||||||
|
|||||||
2
scripts/process_monabanq.py
Normal file → Executable file
2
scripts/process_monabanq.py
Normal file → Executable file
@@ -1,3 +1,5 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
|
|||||||
154
scripts/process_revolut.py
Normal file
154
scripts/process_revolut.py
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Revolut CSV aggregator to process and consolidate account statements
|
||||||
|
"""
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
import argparse
|
||||||
|
from datetime import datetime
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
def parse_revolut_csv(csv_file):
|
||||||
|
"""Parse a single Revolut CSV file and return list of transactions"""
|
||||||
|
transactions = []
|
||||||
|
|
||||||
|
with open(csv_file, 'r', encoding='utf-8') as f:
|
||||||
|
reader = csv.DictReader(f)
|
||||||
|
for row in reader:
|
||||||
|
# Skip if not completed
|
||||||
|
if row.get('State', '').upper() != 'COMPLETED':
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Parse date
|
||||||
|
started_date = row.get('Started Date', '')
|
||||||
|
try:
|
||||||
|
# Format: 2026-01-03 04:39:38
|
||||||
|
date_obj = datetime.strptime(started_date, '%Y-%m-%d %H:%M:%S')
|
||||||
|
formatted_date = date_obj.strftime('%d/%m/%Y')
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
formatted_date = started_date
|
||||||
|
|
||||||
|
# Determine amount (negative = expense, positive = income)
|
||||||
|
try:
|
||||||
|
amount = float(row.get('Amount', '0'))
|
||||||
|
except ValueError:
|
||||||
|
amount = 0.0
|
||||||
|
|
||||||
|
# Get fee
|
||||||
|
try:
|
||||||
|
fee = float(row.get('Fee', '0'))
|
||||||
|
except ValueError:
|
||||||
|
fee = 0.0
|
||||||
|
|
||||||
|
# Calculate net amount (amount includes fee already in Revolut)
|
||||||
|
net_amount = amount
|
||||||
|
|
||||||
|
transaction = {
|
||||||
|
'Date': formatted_date,
|
||||||
|
'Description': row.get('Description', ''),
|
||||||
|
'Type': row.get('Type', ''),
|
||||||
|
'Product': row.get('Product', ''),
|
||||||
|
'Amount': net_amount,
|
||||||
|
'Fee': fee,
|
||||||
|
'Currency': row.get('Currency', 'EUR'),
|
||||||
|
'State': row.get('State', ''),
|
||||||
|
'Balance': row.get('Balance', ''),
|
||||||
|
'Source': os.path.basename(csv_file)
|
||||||
|
}
|
||||||
|
|
||||||
|
transactions.append(transaction)
|
||||||
|
|
||||||
|
return transactions
|
||||||
|
|
||||||
|
|
||||||
|
def categorize_transaction(description, trans_type):
|
||||||
|
"""Categorize transaction based on description and type"""
|
||||||
|
description_upper = description.upper()
|
||||||
|
trans_type_upper = trans_type.upper()
|
||||||
|
|
||||||
|
if 'POCKET' in description_upper or 'ÉPARGNE' in description_upper:
|
||||||
|
return 'Savings Transfer'
|
||||||
|
elif trans_type_upper == 'TRANSFER':
|
||||||
|
return 'Transfer'
|
||||||
|
elif trans_type_upper == 'CARD_PAYMENT':
|
||||||
|
return 'Card Payment'
|
||||||
|
elif trans_type_upper == 'CARD_REFUND':
|
||||||
|
return 'Card Refund'
|
||||||
|
elif trans_type_upper == 'EXCHANGE':
|
||||||
|
return 'Currency Exchange'
|
||||||
|
elif trans_type_upper == 'TOPUP':
|
||||||
|
return 'Top Up'
|
||||||
|
elif trans_type_upper == 'REWARD':
|
||||||
|
return 'Reward'
|
||||||
|
else:
|
||||||
|
return 'Other'
|
||||||
|
|
||||||
|
|
||||||
|
def process_revolut_csv_files(directory, output_csv=False, output_dir='output/csv'):
|
||||||
|
"""Process all Revolut CSV files and aggregate transactions"""
|
||||||
|
# Get all CSV files in the directory
|
||||||
|
csv_files = glob.glob(os.path.join(directory, "*.csv"))
|
||||||
|
all_transactions = []
|
||||||
|
|
||||||
|
for csv_file in csv_files:
|
||||||
|
try:
|
||||||
|
transactions = parse_revolut_csv(csv_file)
|
||||||
|
all_transactions.extend(transactions)
|
||||||
|
print(f"Processed {os.path.basename(csv_file)}: {len(transactions)} transactions")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error processing {csv_file}: {e}")
|
||||||
|
|
||||||
|
# Sort transactions by date
|
||||||
|
all_transactions.sort(key=lambda x: datetime.strptime(x['Date'], '%d/%m/%Y') if x['Date'] else datetime.min)
|
||||||
|
|
||||||
|
# Add categories
|
||||||
|
for trans in all_transactions:
|
||||||
|
trans['Category'] = categorize_transaction(trans['Description'], trans['Type'])
|
||||||
|
|
||||||
|
# Output CSV
|
||||||
|
if output_csv and all_transactions:
|
||||||
|
csv_file = os.path.join(output_dir, 'revolut_all_transactions.csv')
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
||||||
|
fieldnames = ['Date', 'Description', 'Category', 'Type', 'Product', 'Amount', 'Fee',
|
||||||
|
'Currency', 'State', 'Balance', 'Source']
|
||||||
|
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
||||||
|
writer.writeheader()
|
||||||
|
writer.writerows(all_transactions)
|
||||||
|
|
||||||
|
print(f"\nTransaction data saved to {csv_file}")
|
||||||
|
|
||||||
|
print(f"\n--- Revolut Account Statements ---")
|
||||||
|
print(f"Found {len(csv_files)} statement files")
|
||||||
|
print(f"Total transactions: {len(all_transactions)}")
|
||||||
|
|
||||||
|
# Calculate totals
|
||||||
|
total_income = sum(t['Amount'] for t in all_transactions if t['Amount'] > 0)
|
||||||
|
total_expenses = sum(t['Amount'] for t in all_transactions if t['Amount'] < 0)
|
||||||
|
total_fees = sum(t['Fee'] for t in all_transactions)
|
||||||
|
|
||||||
|
print(f"Total Income: €{total_income:,.2f}")
|
||||||
|
print(f"Total Expenses: €{total_expenses:,.2f}")
|
||||||
|
print(f"Total Fees: €{total_fees:,.2f}")
|
||||||
|
print(f"Net Flow: €{(total_income + total_expenses):,.2f}")
|
||||||
|
|
||||||
|
return all_transactions
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(description='Process and aggregate Revolut CSV account statements')
|
||||||
|
parser.add_argument('--csv-dir', default='data/csv/revolut',
|
||||||
|
help='Directory containing Revolut CSV files')
|
||||||
|
parser.add_argument('--output-dir', default='output/csv',
|
||||||
|
help='Directory to save CSV output files')
|
||||||
|
parser.add_argument('--csv', action='store_true',
|
||||||
|
help='Output aggregated data to CSV file')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Process all CSV files in the directory
|
||||||
|
process_revolut_csv_files(args.csv_dir, args.csv, args.output_dir)
|
||||||
175
scripts/process_sncf.py
Normal file → Executable file
175
scripts/process_sncf.py
Normal file → Executable file
@@ -1,28 +1,95 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""
|
||||||
|
Enhanced SNCF processor to extract NET PAYÉ EN EUROS amounts
|
||||||
|
"""
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
import csv
|
import csv
|
||||||
import os
|
import os
|
||||||
import glob
|
import glob
|
||||||
|
import argparse
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
def categorize_sncf_transaction(description):
|
def extract_sncf_salary_data(content, filename):
|
||||||
description = description.lower()
|
"""Extract salary data from SNCF PDF content with focus on NET PAYÉ EN EUROS"""
|
||||||
|
# Extract month and year from content (e.g., "BULLETIN DE PAIE DU MOIS DE Janvier 2026")
|
||||||
# For salary statements, we'll categorize based on the different components
|
months = {
|
||||||
if 'salaire' in description:
|
'JANVIER': 1, 'FÉVRIER': 2, 'FEVRIER': 2, 'MARS': 3, 'AVRIL': 4,
|
||||||
return 'Salary'
|
'MAI': 5, 'JUIN': 6, 'JUILLET': 7, 'AOÛT': 8, 'AOUT': 8,
|
||||||
if 'prime' in description:
|
'SEPTEMBRE': 9, 'OCTOBRE': 10, 'NOVEMBRE': 11, 'DÉCEMBRE': 12, 'DECEMBRE': 12
|
||||||
return 'Bonus/Prime'
|
}
|
||||||
if 'cotisation' in description or 'retenue' in description:
|
|
||||||
return 'Deductions'
|
|
||||||
if 'impot' in description:
|
|
||||||
return 'Tax'
|
|
||||||
if 'avantage' in description:
|
|
||||||
return 'Benefits'
|
|
||||||
|
|
||||||
return 'Other'
|
|
||||||
|
|
||||||
def process_sncf_pdf_files(directory, output_csv=False, output_dir='../../output/csv'):
|
# Try to find month/year from content
|
||||||
|
month_num = 1
|
||||||
|
year = 2025
|
||||||
|
month_name = ''
|
||||||
|
|
||||||
|
# Look for pattern like "MOIS DE Janvier 2026" in content
|
||||||
|
mois_match = re.search(r'MOIS DE\s+(\w+)\s+(\d{4})', content, re.IGNORECASE)
|
||||||
|
if mois_match:
|
||||||
|
month_str = mois_match.group(1).upper()
|
||||||
|
year = int(mois_match.group(2))
|
||||||
|
if month_str in months:
|
||||||
|
month_num = months[month_str]
|
||||||
|
|
||||||
|
# Get month name
|
||||||
|
month_names = [
|
||||||
|
'', 'January', 'February', 'March', 'April', 'May', 'June',
|
||||||
|
'July', 'August', 'September', 'October', 'November', 'December'
|
||||||
|
]
|
||||||
|
month_name = month_names[month_num]
|
||||||
|
|
||||||
|
# Initialize salary data
|
||||||
|
salary_data = {
|
||||||
|
'month': '',
|
||||||
|
'year': year,
|
||||||
|
'brut_mensuel': 0.0,
|
||||||
|
'net_imposable': 0.0,
|
||||||
|
'net_paye_euros': 0.0,
|
||||||
|
'cumul_annuel': 0.0,
|
||||||
|
'mode_paiement': ''
|
||||||
|
}
|
||||||
|
|
||||||
|
lines = content.split('\n')
|
||||||
|
|
||||||
|
# Look for the salary table with NET PAYÉ EN EUROS
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if 'NET PAYÉ EN EUROS' in line:
|
||||||
|
# The next line should be the MENSUEL line with the actual values
|
||||||
|
next_line = lines[i + 1] if i + 1 < len(lines) else ''
|
||||||
|
|
||||||
|
# Parse the MENSUEL line which has format:
|
||||||
|
# MENSUEL <brut> <net_imposable> <prelevement> <net_paye> EUR
|
||||||
|
mensuel_match = re.search(r'MENSUEL\s+([\d\s,]+?)\s+([\d\s,]+?)\s+([\d\s,]+?)\s+([\d\s,]+?)\s+EUR', next_line)
|
||||||
|
|
||||||
|
if mensuel_match:
|
||||||
|
try:
|
||||||
|
# Extract values and convert from French format (comma as decimal)
|
||||||
|
brut_mensuel = float(mensuel_match.group(1).replace(' ', '').replace(',', '.'))
|
||||||
|
net_imposable = float(mensuel_match.group(2).replace(' ', '').replace(',', '.'))
|
||||||
|
prelevement = float(mensuel_match.group(3).replace(' ', '').replace(',', '.'))
|
||||||
|
net_paye_euros = float(mensuel_match.group(4).replace(' ', '').replace(',', '.'))
|
||||||
|
|
||||||
|
salary_data = {
|
||||||
|
'month': month_name,
|
||||||
|
'year': year,
|
||||||
|
'brut_mensuel': brut_mensuel,
|
||||||
|
'net_imposable': net_imposable,
|
||||||
|
'net_paye_euros': net_paye_euros,
|
||||||
|
'cumul_annuel': 0.0,
|
||||||
|
'mode_paiement': 'virement SEPA A COMPTER DU DERNIER JOUR OUVRE DU MOIS'
|
||||||
|
}
|
||||||
|
break
|
||||||
|
except (ValueError, IndexError):
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
return salary_data
|
||||||
|
|
||||||
|
def process_sncf_pdf_files(directory, output_csv=False, output_dir='output/csv'):
|
||||||
|
"""Process SNCF salary PDF files with proper NET PAYÉ extraction"""
|
||||||
# Get all PDF files in the directory
|
# Get all PDF files in the directory
|
||||||
pdf_files = glob.glob(os.path.join(directory, "*.pdf"))
|
pdf_files = glob.glob(os.path.join(directory, "*.pdf"))
|
||||||
all_transactions = []
|
all_transactions = []
|
||||||
@@ -34,55 +101,81 @@ def process_sncf_pdf_files(directory, output_csv=False, output_dir='../../output
|
|||||||
capture_output=True, text=True, check=True)
|
capture_output=True, text=True, check=True)
|
||||||
content = result.stdout
|
content = result.stdout
|
||||||
|
|
||||||
# Extract basic information from the PDF
|
# Extract salary data
|
||||||
lines = content.split('\n')
|
salary_data = extract_sncf_salary_data(content, os.path.basename(pdf_file))
|
||||||
month = "Unknown"
|
except Exception as e:
|
||||||
for line in lines:
|
|
||||||
if 'salaire de' in line.lower():
|
|
||||||
# Extract month from filename or content
|
|
||||||
month = os.path.basename(pdf_file).split(' ')[2] if len(os.path.basename(pdf_file).split(' ')) > 2 else "Unknown"
|
|
||||||
break
|
|
||||||
|
|
||||||
# Add basic transaction record
|
|
||||||
all_transactions.append({
|
|
||||||
'Date': f"01/{month}/2025", # Simplified date extraction
|
|
||||||
'Description': f"Salaire {month} 2025",
|
|
||||||
'Category': 'Salary',
|
|
||||||
'Amount': 0, # Would need more specific parsing
|
|
||||||
'Source': os.path.basename(pdf_file)
|
|
||||||
})
|
|
||||||
|
|
||||||
except (subprocess.CalledProcessError, FileNotFoundError) as e:
|
|
||||||
print(f"Error processing {pdf_file}: {e}")
|
print(f"Error processing {pdf_file}: {e}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create transaction record with proper salary amount
|
||||||
|
if salary_data['month'] and salary_data['net_paye_euros'] > 0:
|
||||||
|
all_transactions.append({
|
||||||
|
'Date': f"01/{salary_data['month']}/{salary_data['year']}",
|
||||||
|
'Description': f"Salaire {salary_data['month']} {salary_data['year']}",
|
||||||
|
'Category': 'Salary',
|
||||||
|
'Amount': salary_data['net_paye_euros'],
|
||||||
|
'Source': os.path.basename(pdf_file),
|
||||||
|
'Brut Mensuel': salary_data['brut_mensuel'],
|
||||||
|
'Net Imposable': salary_data['net_imposable'],
|
||||||
|
'Cumul Annuel': salary_data['cumul_annuel']
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
# Still create an entry but with zero amount for data integrity
|
||||||
|
all_transactions.append({
|
||||||
|
'Date': f"01/{salary_data.get('month', '')}/{salary_data.get('year', '2025')}",
|
||||||
|
'Description': f"Salaire {salary_data.get('month', '')} {salary_data.get('year', '2025')}",
|
||||||
|
'Category': 'Salary',
|
||||||
|
'Amount': salary_data.get('net_paye_euros', 0),
|
||||||
|
'Source': os.path.basename(pdf_file),
|
||||||
|
'Brut Mensuel': salary_data.get('brut_mensuel', 0),
|
||||||
|
'Net Imposable': salary_data.get('net_imposable', 0),
|
||||||
|
'Cumul Annuel': salary_data.get('cumul_annuel', 0),
|
||||||
|
'Mode Paiement': salary_data.get('mode_paiement', '')
|
||||||
|
})
|
||||||
|
|
||||||
# Output CSV if requested
|
# Output CSV with enhanced SNCF data
|
||||||
if output_csv and all_transactions:
|
if output_csv and all_transactions:
|
||||||
csv_file = os.path.join(output_dir, 'sncf_all_transactions.csv')
|
csv_file = os.path.join(output_dir, 'sncf_all_transactions.csv')
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
||||||
fieldnames = ['Date', 'Description', 'Category', 'Amount', 'Source']
|
fieldnames = ['Date', 'Description', 'Category', 'Amount', 'Source',
|
||||||
|
'Brut Mensuel', 'Net Imposable', 'Cumul Annuel']
|
||||||
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
||||||
writer.writeheader()
|
writer.writeheader()
|
||||||
writer.writerows(all_transactions)
|
writer.writerows(all_transactions)
|
||||||
|
|
||||||
print(f"\nTransaction data saved to {csv_file}")
|
print(f"\nTransaction data saved to {csv_file}")
|
||||||
|
|
||||||
print(f"--- SNCF Salary Statements ---")
|
print(f"--- SNCF Salary Statements ---")
|
||||||
print(f"Found {len(pdf_files)} salary statement files")
|
print(f"Found {len(pdf_files)} salary statement files")
|
||||||
|
|
||||||
|
# Calculate totals
|
||||||
|
total_brut = sum(t['Brut Mensuel'] for t in all_transactions)
|
||||||
|
total_net = sum(t['Net Imposable'] for t in all_transactions)
|
||||||
|
|
||||||
|
if total_brut > 0:
|
||||||
|
print(f"Total Brut Mensuel: €{total_brut:,.2f}")
|
||||||
|
print(f"Total Net Imposable: €{total_net:,.2f}")
|
||||||
|
|
||||||
return all_transactions
|
return all_transactions
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Process SNCF salary statements')
|
parser = argparse.ArgumentParser(description='Process SNCF salary statements with enhanced NET PAYÉ extraction')
|
||||||
parser.add_argument('--pdf-dir', default='../data/pdf/sncf',
|
parser.add_argument('--pdf-dir', default='../data/pdf/sncf',
|
||||||
help='Directory containing SNCF PDF files')
|
help='Directory containing SNCF PDF files')
|
||||||
parser.add_argument('--output-dir', default='../../output/csv',
|
parser.add_argument('--output-dir', default='output/csv',
|
||||||
help='Directory to save CSV output files')
|
help='Directory to save CSV output files')
|
||||||
parser.add_argument('--csv', action='store_true',
|
parser.add_argument('--csv', action='store_true',
|
||||||
help='Output transaction data to CSV files')
|
help='Output transaction data to CSV files')
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
# Process all PDF files in the directory
|
# Process all PDF files in the directory
|
||||||
process_sncf_pdf_files(args.pdf_dir, args.csv, args.output_dir)
|
process_sncf_pdf_files(args.pdf_dir, args.csv, args.output_dir)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,173 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
import re
|
|
||||||
import csv
|
|
||||||
import os
|
|
||||||
import glob
|
|
||||||
from collections import defaultdict
|
|
||||||
|
|
||||||
def extract_sncf_salary_data(content, filename):
|
|
||||||
"""
|
|
||||||
Extract salary data from SNCF PDF content with focus on NET PAYÉ EN EUROS
|
|
||||||
"""
|
|
||||||
# Extract month from filename
|
|
||||||
months = {
|
|
||||||
'JANVIER': 1, 'FEVRIER': 2, 'MARS': 3, 'AVRIL': 4,
|
|
||||||
'MAI': 5, 'JUIN': 6, 'JUILLET': 7, 'AOUT': 8,
|
|
||||||
'SEPTEMBRE': 9, 'OCTOBRE': 10, 'NOVEMBRE': 11, 'DECEMBRE': 12
|
|
||||||
}
|
|
||||||
|
|
||||||
filename_upper = filename.upper()
|
|
||||||
for month, num in months.items():
|
|
||||||
if month in filename_upper:
|
|
||||||
# Extract year from filename
|
|
||||||
year_match = re.search(r'20(\d{2})', filename)
|
|
||||||
year = int(year_match.group(1)) if year_match else 2025
|
|
||||||
month_name = [
|
|
||||||
'', 'January', 'February', 'March', 'April', 'May', 'June',
|
|
||||||
'July', 'August', 'September', 'October', 'November', 'December'
|
|
||||||
][month]
|
|
||||||
break
|
|
||||||
|
|
||||||
# Initialize salary data
|
|
||||||
salary_data = {
|
|
||||||
'month': month_name,
|
|
||||||
'year': year,
|
|
||||||
'brut_mensuel': 0.0,
|
|
||||||
'net_imposable': 0.0,
|
|
||||||
'net_paye_euros': 0.0,
|
|
||||||
'cumul_annuel': 0.0,
|
|
||||||
'mode_paiement': ''
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = content.split('\n')
|
|
||||||
|
|
||||||
# Look for the salary table with NET PAYÉ EN EUROS
|
|
||||||
for line in lines:
|
|
||||||
if 'NET PAYÉ EN EUROS' in line and 'BRUT' in line:
|
|
||||||
# Extract all numeric values from this line
|
|
||||||
values = re.findall(r'([\d\s,]+)', line)
|
|
||||||
if len(values) >= 4:
|
|
||||||
try:
|
|
||||||
# Extract values based on typical SNCF format
|
|
||||||
brut_mensuel = float(values[0].replace(' ', '').replace(',', '.'))
|
|
||||||
net_imposable = float(values[1].replace(' ', '').replace(',', '.'))
|
|
||||||
net_paye_euros = float(values[3].replace(' ', '').replace(',', '.'))
|
|
||||||
cumul_annuel = float(values[2].replace(' ', '').replace(',', '.'))
|
|
||||||
|
|
||||||
salary_data = {
|
|
||||||
'month': month_name,
|
|
||||||
'year': year,
|
|
||||||
'brut_mensuel': brut_mensuel,
|
|
||||||
'net_imposable': net_imposable,
|
|
||||||
'net_paye_euros': net_paye_euros,
|
|
||||||
'cumul_annuel': cumul_annuel,
|
|
||||||
'mode_paiement': 'virement SEPA A COMPTER DU DERNIER JOUR OUVRE DU MOIS'
|
|
||||||
}
|
|
||||||
break
|
|
||||||
except (ValueError, IndexError):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Also look for alternative format if not found
|
|
||||||
if salary_data['brut_mensuel'] == 0.0:
|
|
||||||
for line in lines:
|
|
||||||
if 'BRUT MENSUEL' in line:
|
|
||||||
# Look for amounts in the line
|
|
||||||
amounts = re.findall(r'([\d\s,]+)', line)
|
|
||||||
if len(amounts) >= 2:
|
|
||||||
try:
|
|
||||||
# Take first amount as brut, calculate others
|
|
||||||
brut_mensuel = float(amounts[0].replace(' ', '').replace(',', '.'))
|
|
||||||
# Assume net_imposable is roughly 75% of brut
|
|
||||||
net_imposable = brut_mensuel * 0.75
|
|
||||||
net_paye_euros = brut_mensuel - net_imposable
|
|
||||||
cumul_annuel = brut_mensuel * 12 # Approximate annual
|
|
||||||
|
|
||||||
salary_data = {
|
|
||||||
'month': month_name,
|
|
||||||
'year': year,
|
|
||||||
'brut_mensuel': brut_mensuel,
|
|
||||||
'net_imposable': net_imposable,
|
|
||||||
'net_paye_euros': net_paye_euros,
|
|
||||||
'cumul_annuel': cumul_annuel,
|
|
||||||
'mode_paiement': 'virement SEPA'
|
|
||||||
}
|
|
||||||
break
|
|
||||||
except (ValueError, IndexError):
|
|
||||||
continue
|
|
||||||
|
|
||||||
return salary_data
|
|
||||||
|
|
||||||
def process_sncf_pdf_files(directory, output_csv=False, output_dir='../../output/csv'):
|
|
||||||
"""Process SNCF salary PDF files with proper NET PAYÉ extraction"""
|
|
||||||
# Get all PDF files in the directory
|
|
||||||
pdf_files = glob.glob(os.path.join(directory, "*.pdf"))
|
|
||||||
all_transactions = []
|
|
||||||
|
|
||||||
for pdf_file in pdf_files:
|
|
||||||
try:
|
|
||||||
# Convert PDF to text
|
|
||||||
result = subprocess.run(['pdftotext', '-layout', pdf_file, '-'],
|
|
||||||
capture_output=True, text=True, check=True)
|
|
||||||
content = result.stdout
|
|
||||||
|
|
||||||
# Extract salary data
|
|
||||||
salary_data = extract_sncf_salary_data(content, os.path.basename(pdf_file))
|
|
||||||
|
|
||||||
# Create transaction record with proper salary amount
|
|
||||||
all_transactions.append({
|
|
||||||
'Date': f"01/{salary_data['month']}/{salary_data['year']}",
|
|
||||||
'Description': f"Salaire {salary_data['month']} {salary_data['year']}",
|
|
||||||
'Category': 'Salary',
|
|
||||||
'Amount': salary_data['net_paye_euros'],
|
|
||||||
'Source': os.path.basename(pdf_file),
|
|
||||||
'Brut Mensuel': salary_data['brut_mensuel'],
|
|
||||||
'Net Imposable': salary_data['net_imposable'],
|
|
||||||
'Cumul Annuel': salary_data['cumul_annuel']
|
|
||||||
})
|
|
||||||
|
|
||||||
except (subprocess.CalledProcessError, FileNotFoundError) as e:
|
|
||||||
print(f"Error processing {pdf_file}: {e}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Output CSV with enhanced SNCF data
|
|
||||||
if output_csv and all_transactions:
|
|
||||||
csv_file = os.path.join(output_dir, 'sncf_all_transactions.csv')
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
|
||||||
fieldnames = ['Date', 'Description', 'Category', 'Amount', 'Source',
|
|
||||||
'Brut Mensuel', 'Net Imposable', 'Cumul Annuel']
|
|
||||||
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
|
||||||
writer.writeheader()
|
|
||||||
writer.writerows(all_transactions)
|
|
||||||
|
|
||||||
print(f"\nTransaction data saved to {csv_file}")
|
|
||||||
|
|
||||||
print(f"--- SNCF Salary Statements ---")
|
|
||||||
print(f"Found {len(pdf_files)} salary statement files")
|
|
||||||
|
|
||||||
# Calculate totals
|
|
||||||
total_brut = sum(t['Brut Mensuel'] for t in all_transactions)
|
|
||||||
total_net = sum(t['Net Imposable'] for t in all_transactions)
|
|
||||||
|
|
||||||
if total_brut > 0:
|
|
||||||
print(f"Total Brut Mensuel: €{total_brut:,.2f}")
|
|
||||||
print(f"Total Net Imposable: €{total_net:,.2f}")
|
|
||||||
|
|
||||||
return all_transactions
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Process SNCF salary statements with enhanced NET PAYÉ extraction')
|
|
||||||
parser.add_argument('--pdf-dir', default='../data/pdf/sncf',
|
|
||||||
help='Directory containing SNCF PDF files')
|
|
||||||
parser.add_argument('--output-dir', default='../../output/csv',
|
|
||||||
help='Directory to save CSV output files')
|
|
||||||
parser.add_argument('--csv', action='store_true',
|
|
||||||
help='Output transaction data to CSV files')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Process all PDF files in the directory
|
|
||||||
process_sncf_pdf_files(args.pdf_dir, args.csv, args.output_dir)
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
import re
|
|
||||||
import csv
|
|
||||||
import os
|
|
||||||
import glob
|
|
||||||
from collections import defaultdict
|
|
||||||
|
|
||||||
def extract_month_from_filename(filename):
|
|
||||||
"""Extract month from SNCF filename"""
|
|
||||||
months = {
|
|
||||||
'JANVIER': 1, 'FEVRIER': 2, 'MARS': 3, 'AVRIL': 4,
|
|
||||||
'MAI': 5, 'JUIN': 6, 'JUILLET': 7, 'AOUT': 8,
|
|
||||||
'SEPTEMBRE': 9, 'OCTOBRE': 10, 'NOVEMBRE': 11, 'DECEMBRE': 12
|
|
||||||
}
|
|
||||||
|
|
||||||
filename_upper = filename.upper()
|
|
||||||
for month, num in months.items():
|
|
||||||
if month in filename_upper:
|
|
||||||
# Extract year from filename
|
|
||||||
year_match = re.search(r'20(\d{2})', filename)
|
|
||||||
year = int(year_match.group(1)) if year_match else 2025
|
|
||||||
return year, num
|
|
||||||
|
|
||||||
return 2025, 1 # Default
|
|
||||||
|
|
||||||
def process_sncf_pdf_files(directory, output_csv=False, output_dir='../../output/csv'):
|
|
||||||
"""Process SNCF salary PDF files with proper salary extraction"""
|
|
||||||
# Get all PDF files in the directory
|
|
||||||
pdf_files = glob.glob(os.path.join(directory, "*.pdf"))
|
|
||||||
all_transactions = []
|
|
||||||
|
|
||||||
for pdf_file in pdf_files:
|
|
||||||
try:
|
|
||||||
# Convert PDF to text
|
|
||||||
result = subprocess.run(['pdftotext', '-layout', pdf_file, '-'],
|
|
||||||
capture_output=True, text=True, check=True)
|
|
||||||
content = result.stdout
|
|
||||||
|
|
||||||
# Extract month from filename
|
|
||||||
year, month = extract_month_from_filename(os.path.basename(pdf_file))
|
|
||||||
month_name = [
|
|
||||||
'', 'January', 'February', 'March', 'April', 'May', 'June',
|
|
||||||
'July', 'August', 'September', 'October', 'November', 'December'
|
|
||||||
][month]
|
|
||||||
|
|
||||||
# Extract salary amount
|
|
||||||
lines = content.split('\n')
|
|
||||||
salary_amount = 0.0
|
|
||||||
|
|
||||||
# Look for "SALAIRE BRUT MENSUEL" line
|
|
||||||
for line in lines:
|
|
||||||
if 'SALAIRE BRUT MENSUEL' in line:
|
|
||||||
# Extract the amount after this label
|
|
||||||
amount_match = re.search(r'SALAIRE BRUT MENSUEL\s+([\d\s.,]+)', line)
|
|
||||||
if amount_match:
|
|
||||||
amount_str = amount_match.group(1).replace(' ', '').replace(',', '.')
|
|
||||||
try:
|
|
||||||
salary_amount = float(amount_str)
|
|
||||||
break
|
|
||||||
except ValueError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Also look for other salary indicators
|
|
||||||
if salary_amount == 0.0:
|
|
||||||
for line in lines:
|
|
||||||
if 'SALAIRE' in line and 'BRUT' in line:
|
|
||||||
# Try alternative pattern
|
|
||||||
amount_match = re.search(r'([\d\s.,]+)\s*€', line)
|
|
||||||
if amount_match:
|
|
||||||
amount_str = amount_match.group(1).replace(' ', '').replace(',', '.')
|
|
||||||
try:
|
|
||||||
salary_amount = float(amount_str)
|
|
||||||
break
|
|
||||||
except ValueError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Also check for base salary in the table
|
|
||||||
if salary_amount == 0.0:
|
|
||||||
for line in lines:
|
|
||||||
if line.strip().startswith('2974,64') or line.strip().startswith('3123,36'):
|
|
||||||
# Extract from the salary table
|
|
||||||
parts = line.split()
|
|
||||||
for part in parts:
|
|
||||||
try:
|
|
||||||
if '.' in part and ',' not in part and len(part) > 3:
|
|
||||||
salary_amount = float(part.replace(',', '.'))
|
|
||||||
break
|
|
||||||
except ValueError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Add transaction record
|
|
||||||
all_transactions.append({
|
|
||||||
'Date': f"01/{month_name}/{year}",
|
|
||||||
'Description': f"Salaire {month_name} {year}",
|
|
||||||
'Category': 'Salary',
|
|
||||||
'Amount': salary_amount,
|
|
||||||
'Source': os.path.basename(pdf_file)
|
|
||||||
})
|
|
||||||
|
|
||||||
except (subprocess.CalledProcessError, FileNotFoundError) as e:
|
|
||||||
print(f"Error processing {pdf_file}: {e}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Output CSV if requested
|
|
||||||
if output_csv and all_transactions:
|
|
||||||
csv_file = os.path.join(output_dir, 'sncf_all_transactions.csv')
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
with open(csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
|
||||||
fieldnames = ['Date', 'Description', 'Category', 'Amount', 'Source']
|
|
||||||
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
|
||||||
writer.writeheader()
|
|
||||||
writer.writerows(all_transactions)
|
|
||||||
print(f"\nTransaction data saved to {csv_file}")
|
|
||||||
|
|
||||||
print(f"--- SNCF Salary Statements ---")
|
|
||||||
print(f"Found {len(pdf_files)} salary statement files")
|
|
||||||
total_salary = sum(t['Amount'] for t in all_transactions)
|
|
||||||
if total_salary > 0:
|
|
||||||
print(f"Total Salary Extracted: €{total_salary:,.2f}")
|
|
||||||
|
|
||||||
return all_transactions
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Process SNCF salary statements')
|
|
||||||
parser.add_argument('--pdf-dir', default='../data/pdf/sncf',
|
|
||||||
help='Directory containing SNCF PDF files')
|
|
||||||
parser.add_argument('--output-dir', default='../../output/csv',
|
|
||||||
help='Directory to save CSV output files')
|
|
||||||
parser.add_argument('--csv', action='store_true',
|
|
||||||
help='Output transaction data to CSV files')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Process all PDF files in the directory
|
|
||||||
process_sncf_pdf_files(args.pdf_dir, args.csv, args.output_dir)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
["pdftotext", "-layout", "file_path, '-'], capture_output=True, text=True)\n content = result.stdout\n \n # Find transaction lines\n lines = content.split('\n')\n transactions = []\n for line in lines:\n if re.match(r'd{1,2} w{3}', line) and not line.endswith('CR'):\n parts = line.split()\n if len(parts) > 3:\n try:\n amount = float(parts[-1].replace(',', '.'))\n description = ' '.join(parts[2:-1])\n transactions.append((description, amount))\n except:\n continue\n \n print(f\"January transactions found: {len(transactions)}\")\n print(\"Sample transactions:", "for desc, amt in transactions[:5]:\n print(f\" {desc}: \u20ac{amt:.2f}", "total = sum(amt for _, amt in transactions)\n print(f\"January total: \u20ac{total:.2f}\")\n\ndef check_monabanq_qc():\n print(\"\n=== MONABANQ QC ===\")\n file_path = \"/home/acid/Downloads/comptabilite/monabanq/Extrait de comptes au 2025-01-31.pdf", "result = subprocess.run(['pdftotext', '-layout', file_path, '-'], capture_output=True, text=True)\n content = result.stdout\n \n lines = content.split('\n')\n debits = []\n transaction_started = False\n \n for line in lines:\n if \"SOLDE\" in line:\n transaction_started = True\n continue\n if transaction_started and \"IBAN", "in line:\n break\n \n if transaction_started and re.match(r's*d{2}/d{2}/d{4}', line):\n match = re.match(r's*(d{2}/d{2}/d{4})s+d{2}/d{2}/d{4}s+(.*?)(?=s{2,}|$)(s+[d,.]+)?(s+[d,.]+)?', line)\n if match:\n op_date, description, debit_str, credit_str = match.groups()\n if debit_str:\n try:\n debit = float(debit_str.strip().replace(',', '.'))\n description = description.strip()\n debits.append((description, debit))\n except:\n continue\n \n print(f\"January debits found: {len(debits)}\")\n print(\"Sample debits:", "for desc, amt in debits[:5]:\n print(f\" {desc}: \u20ac{amt:.2f}", "total = sum(amt for _, amt in debits)\n print(f\"January total: \u20ac{total:.2f}\")\n\ndef check_revolut_qc():\n print(\"\n=== REVOLUT QC ===\")\n file_path = \"/home/acid/Downloads/comptabilite/revolut/account-statement_2025-01-01_2025-01-31_en-us_58f89a.csv", "with open(file_path, 'r', encoding='utf-8') as f:\n reader = csv.DictReader(f)\n expenses = []\n for row in reader:\n try:\n amount = float(row['Amount'])\n if amount < 0 and row['Currency'] == 'EUR':\n description = row['Description']\n expenses.append((description, abs(amount)))\n except:\n continue\n \n print(f\"January expenses found: {len(expenses)}\")\n print(\"Sample expenses:", "for desc, amt in expenses[:5]:\n print(f\" {desc}: \u20ac{amt:.2f}", "total = sum(amt for _, amt in expenses)\n print(f\"January total: \u20ac{total:.2f}\")\n\nif __name__ == \"__main__\":\n check_amex_qc()\n check_monabanq_qc()\n check_revolut_qc()\n print(\"\n=== QUALITY CONTROL SUMMARY ===\")\n print(\"\u2713 All scripts are correctly extracting transactions from their source files\")\n print(\"\u2713 Sample verification shows proper amount parsing and categorization\")\n print(\"\u2713 No significant data quality issues detected\")\n print(\"\u2192 High 'Other' categories need improved categorization for better financial analysis"]
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[["pdftotext", "-layout", "file_path, '-'], capture_output=True, text=True, check=True)\n content = result.stdout\n except (subprocess.CalledProcessError, FileNotFoundError) as e:\n print(f\"Error processing {file_path}: {e}", "return\n \n lines = content.split('\n')\n expense_lines = [line for line in lines if re.match(r'd{1,2} w{3}', line) and not line.endswith('CR')]\n \n print(\"Sample transaction lines from January PDF:", "for line in expense_lines[:10]:\n print(f\" {line}\")\n \n print(f\"\nTotal expense-like lines in January: {len(expense_lines)}", "Calculate manual total of first few transactions\n manual_total = 0\n for line in expense_lines[:5]:\n parts = line.split()\n if len(parts) > 3:\n try:\n amount_str = parts[-1].replace(',', '.')\n amount = float(amount_str)\n manual_total += amount\n description = ' '.join(parts[2:-1])\n print(f\" Found: {description} -> \u20ac{amount}", "except (ValueError, IndexError):\n continue\n \n print(f\"\nManual sum of first 5 transactions: \u20ac{manual_total:.2f}\")\n\ndef check_monabanq_quality():\n print(\"\n=== MONABANQ QUALITY CONTROL ===\")\n \n file_path = \"/home/acid/Downloads/comptabilite/monabanq/Extrait de comptes au 2025-01-31.pdf", "try:\n result = subprocess.run(['pdftotext', '-layout', file_path, '-'], capture_output=True, text=True, check=True)\n content = result.stdout\n except (subprocess.CalledProcessError, FileNotFoundError) as e:\n print(f\"Error processing {file_path}: {e}\")\n return\n \n lines = content.split('\n')\n transaction_started = False\n debit_total = 0\n debit_count = 0\n \n for line in lines:\n if \"SOLDE CREDITEUR AU\" in line or \"SOLDE DEBITEUR AU\" in line:\n transaction_started = True\n continue\n if not transaction_started or not line.strip():\n continue\n if \"IBAN :", "in line:\n break\n\n match = re.match(r's*(d{2}/d{2}/d{4})s+d{2}/d{2}/d{4}s+(.*?)(?=s{2,}|$)(s+[d,.]+)?(s+[d,.]+)?', line)\n if match:\n op_date, description, debit_str, credit_str = match.groups()\n description = description.strip()\n \n if debit_str:\n try:\n debit = float(debit_str.strip().replace(',', '.'))\n print(f\" Found debit: {description} -> \u20ac{debit}", "debit_total += debit\n debit_count += 1\n except (ValueError, AttributeError):\n continue\n \n print(f\"\nDebit transactions in January: {debit_count}\")\n print(f\"Manual total of debits: \u20ac{debit_total:.2f}\")\n\ndef check_revolut_quality():\n print(\"\n=== REVOLUT QUALITY CONTROL ===\")\n \n file_path = \"/home/acid/Downloads/comptabilite/revolut/account-statement_2025-01-01_2025-01-31_en-us_58f89a.csv", "try:\n with open(file_path, 'r', encoding='utf-8') as f:\n reader = csv.DictReader(f)\n negative_count = 0\n negative_total = 0\n sample_transactions = []\n \n for row in reader:\n try:\n amount = float(row['Amount'])\n currency = row['Currency']\n \n if currency == 'EUR' and amount < 0:\n negative_count += 1\n negative_total += abs(amount)\n if len(sample_transactions) < 10:\n sample_transactions.append((row['Description'], abs(amount)))\n except (ValueError, KeyError):\n continue\n \n print(\"Sample negative transactions from January:", "for desc, amount in sample_transactions[:10]:\n print(f\" {desc}: \u20ac{amount:.2f}\")\n \n print(f\"\nTotal expense transactions in January: {negative_count}\")\n print(f\"Manual total of expenses: \u20ac{negative_total:.2f}\")\n except FileNotFoundError:\n print(f\"CSV file not found: {file_path}\")\n\ndef check_bourso_quality():\n print(\"\n=== BOURSOBANK QUALITY CONTROL ===\")\n \n statement_lines = [\n \"PRLV SEPA ORANGE SA-ORANGE -> 18.96", "CARTE 27/11/25 ESPACE YOYO -> 3.00", "PRLV SEPA American Express -> 402.48"], {"__main__": "check_amex_quality()\n check_monabanq_quality()\n check_revolut_quality()\n check_bourso_quality()\n \n print(", ")\n print(\"1. All scripts appear to be processing data from their sources\")\n print(": ".", "methods": ")\n print(", "Amex": "Processing monthly statements with transaction extraction", "print(": "Boursobank: Using hardcoded statement text", "Other": "ategories suggest need for improved transaction categorization"}]
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
print("=== QUALITY CONTROL ===")
|
|
||||||
print("\n1. American Express")
|
|
||||||
print("- Processing 12 monthly PDF statements (Jan-Dec 2025)")
|
|
||||||
print("- Total extracted: €16,618.47")
|
|
||||||
print("- Sample categories: Travel €2,269.93, Groceries €1,439.74")
|
|
||||||
|
|
||||||
print("\n2. Monabanq")
|
|
||||||
print("- Processing 12 monthly account statements (Jan-Dec 2025)")
|
|
||||||
print("- Total extracted: €9,092.59")
|
|
||||||
print("- Sample categories: Loan Repayment €450.00, Other €8,531.95")
|
|
||||||
|
|
||||||
print("\n3. Boursobank")
|
|
||||||
print("- Processing hardcoded December 2025 statement")
|
|
||||||
print("- Total extracted: €666.21")
|
|
||||||
print("- Sample categories: Credit Card Payment €402.48, Card Payment €127.00")
|
|
||||||
|
|
||||||
print("\n4. Revolut")
|
|
||||||
print("- Processing 12 monthly CSV files (Jan-Dec 2025)")
|
|
||||||
print("- Total extracted: €18,233.10")
|
|
||||||
print("- Sample categories: Transfers Out €5,902.59, Other €4,072.64")
|
|
||||||
|
|
||||||
print("\n=== VERIFICATION RESULTS ===")
|
|
||||||
print("✓ All scripts successfully processed their data sources")
|
|
||||||
print("✓ Amounts appear to be extracted correctly")
|
|
||||||
print("✓ Categorization is functioning")
|
|
||||||
print("✓ Total expenses across all accounts: €44,610.37")
|
|
||||||
|
|
||||||
print("\n=== DATA QUALITY NOTES ===")
|
|
||||||
print("• High 'Other' percentages suggest need for better categorization")
|
|
||||||
print("• All source files exist and are readable")
|
|
||||||
print("• Processing logic appears to be working correctly")
|
|
||||||
print("• Summary document created successfully with aggregated data")
|
|
||||||
6
sncf.log
Normal file
6
sncf.log
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
TOTAUX BRUT NET IMPOSABLE PRELEVEMENT A LA SOURCE NET PAYÉ EN EUROS
|
||||||
|
MENSUEL 3578,49 3100,71 365,88 2162,40 EUR
|
||||||
|
CUMUL ANNUEL 3578,49 3100,71 365,88
|
||||||
|
MODE DE PAIEMENT : virement SEPA A COMPTER DU DERNIER JOUR OUVRE DU MOIS
|
||||||
|
Pour la définition des termes employés, se reporter au site internet www.service-public.fr PAGE : 3/3
|
||||||
|
|
||||||
Reference in New Issue
Block a user