93 lines
3.9 KiB
Python
93 lines
3.9 KiB
Python
from datetime import datetime, timedelta
|
|
|
|
# --- COSTANTI E FUNZIONI DI FORMATTAZIONE (DALLE NOSTRE DISCUSSIONI) ---
|
|
|
|
def formatta_importo_per_tipo1(importo_float):
|
|
""" Formatta l'importo per il record Tipo 1 (10 byte, NNNNNNNNFF). """
|
|
importo_cents = int(round(importo_float * 100))
|
|
return f"{importo_cents:010d}"
|
|
|
|
def formatta_importo_per_tipo3(importo_float):
|
|
""" Formatta l'importo per il record Tipo 3 (12 byte, NNNNNNNNNNFF). """
|
|
importo_cents = int(round(importo_float * 100))
|
|
return f"{importo_cents:012d}"
|
|
|
|
def formatta_data_aammgg(data_obj):
|
|
""" Formatta un oggetto datetime in AAMMGG (es. 221123). """
|
|
return data_obj.strftime("%y%m%d")
|
|
|
|
def crea_record_tipo1(data_pagamento_obj, importo_rata_da_bollettino, numero_rata_pdf):
|
|
"""
|
|
Crea una stringa formattata per un record di Tipo 1 (100 byte).
|
|
L'importo qui è quello nominale della rata da bollettino.
|
|
"""
|
|
data_pag_aammgg = formatta_data_aammgg(data_pagamento_obj)
|
|
importo_formattato = formatta_importo_per_tipo1(importo_rata_da_bollettino)
|
|
|
|
# Campi fissi e derivati per il record Tipo 1
|
|
# Basati sulla struttura finale da 100 byte discussa:
|
|
# 1. Tipo Record: '1' (1 byte)
|
|
# 2. ID Fisso 1: '0001480' (7 byte)
|
|
# 3. Zero Inserito: '0' (1 byte)
|
|
# 4. ID Fisso 2: '0010165' (7 byte)
|
|
# 5. Numero CC: '000104951005' (12 byte)
|
|
# 6. Data Pagamento AAMMGG: (6 byte) - data_pag_aammgg
|
|
# 7. Zero dopo 674: '0' (1 byte)
|
|
# 8. Codice '<674>': '674' (3 byte)
|
|
# 9. Importo Transazione (da bollettino): (10 byte) - importo_formattato
|
|
# 10. Valore Fisso: '05564809' (8 byte)
|
|
# 11. Valuta: '2' (1 byte)
|
|
# 12. Data Accreditamento AAMMGG: (6 byte) - data_pag_aammgg (per semplicità)
|
|
# 13. Numero Rata: (18 byte) - numero_rata_pdf
|
|
# 14. Chiusura Riga: 'DIN' + AAMMGG (10 byte)
|
|
|
|
record_parts = [
|
|
"1",
|
|
"0001480",
|
|
"0",
|
|
"0010165", # Corretto a 7 byte
|
|
"000104951005",
|
|
data_pag_aammgg,
|
|
"674", # Campo 6 della specifica originale utente
|
|
"0", # Zero INSERITO DOPO il 674
|
|
importo_formattato, # Campo 7 della specifica originale utente
|
|
"05564809",
|
|
"2",
|
|
data_pag_aammgg, # Data Accreditamento
|
|
f"{numero_rata_pdf:<18s}", # Assicura 18 caratteri
|
|
f"DIN {data_pag_aammgg}"
|
|
]
|
|
return "".join(record_parts)
|
|
|
|
def crea_record_tipo3(data_riepilogo_obj, lista_record_tipo1_del_mese):
|
|
"""
|
|
Crea una stringa formattata per un record di Tipo 3 (Riepilogo - 96 byte).
|
|
Calcola i totali dalla lista dei record Tipo 1 forniti per quel mese.
|
|
"""
|
|
data_riep_aammgg = formatta_data_aammgg(data_riepilogo_obj)
|
|
|
|
num_documenti_mese = len(lista_record_tipo1_del_mese)
|
|
importo_totale_mese_float = 0.0
|
|
for rec_str in lista_record_tipo1_del_mese:
|
|
# L'importo nel record Tipo 1 (campo 9 della struttura a 14 campi)
|
|
# inizia dopo 1+7+1+7+12+6+3+1 = 38 caratteri (indice 38) ed è lungo 10 caratteri.
|
|
importo_rec_str = rec_str[38:48] # Indici 38-47
|
|
importo_totale_mese_float += int(importo_rec_str) / 100.0
|
|
|
|
num_doc_str = f"{num_documenti_mese:08d}"
|
|
importo_tot_str_tipo3 = formatta_importo_per_tipo3(importo_totale_mese_float)
|
|
|
|
record_parts = [
|
|
"3",
|
|
"000104951005", # Numero CC fisso
|
|
data_riep_aammgg, # Data Accreditamento Riepilogo
|
|
"00000000000000", # Campo 4: 14 zeri
|
|
"999", # Codice Importazione
|
|
num_doc_str, # Totale Documenti
|
|
importo_tot_str_tipo3, # Importo Totale Documenti (12 byte)
|
|
num_doc_str, # Numero Esatto Documenti
|
|
importo_tot_str_tipo3, # Importo Esatto Documenti (12 byte)
|
|
"00000000", # Numero Documenti Errati
|
|
"000000000000" # Importo Documenti Errati
|
|
]
|
|
return "".join(record_parts) |