netgescon-master/scripts/importa_movimenti_bancari_unicredit.py

74 lines
2.8 KiB
Python

import csv
import re
from datetime import datetime
import mysql.connector
DB = {
'host': 'localhost',
'user': 'laravel_user',
'password': 'P4ssw0rd.96!',
'database': 'laravel_db'
}
def estrai_trn(descrizione):
match = re.search(r'TRN\s+([0-9A-Za-z]+)', descrizione)
return match.group(1) if match else None
def estrai_commissione(descrizione):
match = re.search(r'COMM\s+([\d\.,]+)', descrizione)
return float(match.group(1).replace('.', '').replace(',', '.')) if match else 0.0
def estrai_spese(descrizione):
match = re.search(r'SPESE\s+([\d\.,]+)', descrizione)
return float(match.group(1).replace('.', '').replace(',', '.')) if match else 0.0
def parse_importo(valore):
return float(valore.replace('.', '').replace(',', '.'))
def importa_file(file_path, id_condominio):
conn = mysql.connector.connect(**DB)
cur = conn.cursor()
with open(file_path, encoding='utf-8') as f:
# Trova la riga di intestazione
header_row = None
for line in f:
line_strip = line.strip()
if line_strip.lower().startswith("data;valuta;descrizione;euro;caus."):
header_row = line_strip.split(";")
break
if not header_row:
print("Intestazione non trovata! Controlla il file.")
return
# Riposiziona il puntatore dopo l'intestazione
reader = csv.DictReader(f, fieldnames=header_row, delimiter=';')
for row in reader:
# Salta eventuali righe completamente vuote
if not row['Data'] or not row['Descrizione']:
continue
try:
data = datetime.strptime(row['Data'], '%d/%m/%Y').date()
except Exception:
continue # Skip righe con data non valida
descrizione = row['Descrizione']
try:
importo = parse_importo(row['Euro'])
except Exception:
importo = 0.0
causale = row.get('Caus.', '')
cbi = causale if causale else None
riferimento_originale = estrai_trn(descrizione)
commissione = estrai_commissione(descrizione)
spese = estrai_spese(descrizione)
trn = riferimento_originale
cur.execute("""
INSERT INTO movimenti_bancari
(id_condominio, data, importo, descrizione, causale, riferimento_originale, stato, commissione, spese, trn, cbi)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (id_condominio, data, importo, descrizione, causale, riferimento_originale, 'importato', commissione, spese, trn, cbi))
conn.commit()
cur.close()
conn.close()
print("[OK] Movimenti bancari importati.")
if __name__ == '__main__':
importa_file('estrattoconto.csv', 1)