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)