Nel corso di un test per un cliente ho creato questo piccolo codice per leggere da un file csv, contenente delle date di fatturazione con relative condizioni di pagamento, di cui calcolare le corrette scadenze per alcuni casi.
E’ una problematica molto frequente nelle applicazioni gestionali, quindi calcolare i 30/60 giorni e così via.Calcolando anche il fine mese per alcune condizioni specifiche.
Ho pensato di pubblicarlo perchè contiene in poco codice diversi esempi di utilizzo delle funzioni, dei loop e soprattutto dell’utilizzo basico della programmazione a oggetti in python.
Il file csv
Il file csv si ipotizza sia nella stessa cartella di esecuzione del codice e contenga i dati in questo formato:
NrFattura;DataFattura;ModalitaDiPagamento
12440;01/01/2019;DF
12441;10/07/2019;DFFM
12442;19/02/2019;DF60
12443;21/12/2019;DF
12444;01/04/2019;DFFM
12445;12/04/2019;DF60
12446;25/04/2019;DFFM
12447;01/05/2019;DFFM
12448;22/06/2019;DF60
Il codice
# -*- coding: utf-8 -*- from datetime import date, datetime, time, timedelta from dateutil.relativedelta import relativedelta #Definiamo la classe fatture class Invoice(): Number = 0 Date = date.today() Modpag = "" def __init__(self, var1, var2, var3): self.Number = var1 self.Date = var2 self.Modpag = var3 #Prepariamo qualche utilità class utils(): def last_day_of_month(any_day): next_month = any_day.replace(day=28) + timedelta(days=4) return next_month - timedelta(days=next_month.day) def strToDatetime(strdate): return datetime.strptime(strdate, "%d/%m/%Y") def set_due_date(mode, invoice_date): due_date = utils.strToDatetime(invoice_date) if mode.strip() == "DFFM": due_date = utils.strToDatetime(invoice_date) + timedelta(days=60) due_date = utils.last_day_of_month(due_date) elif mode.strip() == "DF60": due_date = utils.strToDatetime(invoice_date) + timedelta(days=60) return due_date.strftime("%d/%m/%Y") def sort_and_calc(invoices): for inv in sorted(invoices, key=lambda date: utils.strToDatetime(date.Date)): due_date = utils.set_due_date(inv.Modpag,inv.Date) print ("DATA:%s NUMERO:%s DATA CALCOLATA:%s PAGAMENTO:%s"%(str(inv.Date),str(inv.Number),due_date,str(inv.Modpag))) def main(): invoices = [] c = 0 """ Main """ invoices_file = open('test_invoices.csv', 'r') line = invoices_file.readline() while line: c = c+1 print(line) data = line.split(";") try: int(data[0]) #Verifichiamo sia una riga valida (Es.:Verificando il numero fattura sia valido) item = Invoice(data[0],data[1],data[2]) #Mettiamo i campi nella classe Invoice invoices.append(item) #Aggiungiamo alla lista di fatture except: print ("Riga non elaborata") line = invoices_file.readline() invoices_file.close() utils.sort_and_calc(invoices) #Eseguiamo l'ordinamento e il calcolo delle scadenze if __name__ == "__main__": main()