Csv, fatture

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()

You must be logged in to post a comment.