netgescon-master/scripts/Script fatti per prova e per ora sospesi/costantiefunzioni.py

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)