Calcolo dei giorni di pagamento fatture

di il
12 risposte

Calcolo dei giorni di pagamento fatture

Buongiorno,
mi trovo con la seguente problematica: devo calcolare la data di pagamento delle fatture di clienti e fornitori, ho memorizzato in una tabella le svariate metodologie tra cui: 30 gg fine mese, 60 gg fine mese, 120 gg fine mese, 165 gg fine mese, 150 gg + 15 giorni, 120 gg fine mese + 10 giorni (chi piu' ne ha piu' ne metta...ndr).
Quindi ho creato una tabella con 6 campi: IDmetodopagamento (Contatore PK), NUMmesipagamento, NUMgiornipagamento, FLAGfinemese, NUMulteriorigiorni.
Nello specifico i pagamenti vengono memorizzati nel seguente modo:

30 gg FM - NUMmesipagamento 1 - NUMgiornipagamento 0 - FLAGfinemese vero - NUMulteriorigiorni 0
60 gg FM - NUMmesipagamento 2 - NUMgiornipagamento 0 - FLAGfinemese vero - NUMulteriorigiorni 0
120 gg FM - NUMmesipagamento 4 - NUMgiornipagamento 0 - FLAGfinemese vero - NUMulteriorigiorni 0
165 gg FM - NUMmesipagamento 5 - NUMgiornipagamento 15 - FLAGfinemese vero - NUMulteriorigiorni 0
150 gg +15 gg - NUMmesipagamento 5 - NUMgiornipagamento 0 - FLAGfinemese falso - NUMulteriorigiorni 15
120 gg FM + 10 gg - NUMmesipagamento 4 - NUMgiornipagamento 0 - FLAGfinemese vero - NUMulteriorigiorni 10
ecc.
Nella tabella di memorizzazione delle fatture ho un campo IDmetodopagamento dove memorizzo il valore ed un campo DATAdatafattura dove memorizzo la data di emissione della fattura. Nella rispettiva maschera di inserimento fatture, ho creato 4 caselle di testo dove copio via codice i dati del metodo di pagamento dopo aver inserito la tipologia, poi in un ulteriore casella ho scritto la seguente espressione:
=IIf([FLAGfinemese]="Vero";(DateSerial(Year(DateAdd("m";[NUMmesipagamento];[DATAdatafattura]+[NUMgiornipagamento]));Month(DateAdd("m";[NUMmesipagamento];[DATAdatafattura]+[NUMgiornipagamento]))+1;0))+[NUMulteriorigiorni];(DateSerial(Year(DateAdd("m";[NUMmesipagamento];[DATAdatafattura]+[NUMgiornipagamento]));Month(DateAdd("m";[NUMmesipagamento];[DATAdatafattura]+[NUMgiornipagamento]));Day(DateAdd("m";[NUMmesipagamento];[DATAdatafattura]+[NUMgiornipagamento])+[NUMulteriorigiorni]))))
Il problema e' che una espressione cosi' lunga a volte il generatore non riesce a caricarla tagliando parte della formula, ma di per se' la formula funziona. Mi chiedevo se c'e' un modo alternativo piu' semplice per trovare la data richiesta.
Da precisare che anche se il metodo di pagamento e' espresso in giorni, il valore viene sempre tramutato in numero di mesi ipotetici da 30gg cad.
Grazie in anticipo

12 Risposte

  • Re: Calcolo dei giorni di pagamento fatture

    Scrivi una Funzione VBA e la chiami... il vantaggio è anche riuscire a fare DEBUG in caso di malfunzionamenti o stranezze, cosa che con quanto messo con il Generatore è ovviamente IMPOSSIBILE.
    
    Function CalcoloDataPagamento(pDataFattura as Date, pMesi as Integer, pGiorni as integer, pUltGiorni as Integer, pFineMese as Boolean) As Date
        dim dt As Date
        If pFineMese Then
           ' Calcolo il F.M. dalla Data Fattura
           dt = Fix(DateSerial(Year(pDataFattura ), Month(pDataFattura ) + 1, 0))
        Else
           dt = pDataFattura 
        End If
       
       dt = DateAdd("m",pMesi,dt)  ' Aggiungo i Mesi
       dt = DateAdd("d",pGiorni + pUltGiorni, dt)
       CalcoloDataPagamento=dt
    End Function     
    
  • Re: Calcolo dei giorni di pagamento fatture

    Prima domanda da "gnubbo": perche' la funzione Fix davanti alla funzione DateSerial?
    Seconda domanda: alla condizione If pFineMese non devo aggiungere =vero?
    La prima parte della formula e' da adattare perche' cosi' non funzionerebbe nel caso del pagamento a 165 gg fine mese: infatti devo prima aggiungere i 5 mesi + 15 giorni alla data fattura e poi calcolare il fine mese, invece cosi' aggiungerei i 5 mesi al fine mese della data fattura e poi ulteriori 15 giorni per cui verrebbe una data non corretta; esempio:
    se la data fattura e' 12/07/2022 a 165 gg FM il pagamento andra' al 31/12/2022
    con il calcolo indicato sopra avrei fine mese 31/07/2022 + 5 mesi +15 gg pagamento al 15/01/2023.
    Ad ogni modo ho capito il concetto ed adatto la formula.
    grazie 1000
  • Re: Calcolo dei giorni di pagamento fatture

    Mailman ha scritto:


    Prima domanda da "gnubbo": perche' la funzione Fix davanti alla funzione DateSerial?
    In questo caso non serve a nulla, è un refuso in quanto ho riciclato in modo maldestro un mio codice più complesso...

    Mailman ha scritto:


    Seconda domanda: alla condizione If pFineMese non devo aggiungere =vero?
    No è implicito... queste 2 istruzioni sono equivalenti se il confronto è su Booleano:
    
    If Espressione=True Then
    If Espressione Then
    

    Mailman ha scritto:


    La prima parte della formula e' da adattare perche' cosi' non funzionerebbe nel caso del pagamento a 165 gg fine mese: infatti devo prima aggiungere i 5 mesi + 15 giorni alla data fattura e poi calcolare il fine mese, invece cosi' aggiungerei i 5 mesi al fine mese della data fattura e poi ulteriori 15 giorni per cui verrebbe una data non corretta; esempio:
    se la data fattura e' 12/07/2022 a 165 gg FM il pagamento andra' al 31/12/2022
    con il calcolo indicato sopra avrei fine mese 31/07/2022 + 5 mesi +15 gg pagamento al 15/01/2023.
    Ad ogni modo ho capito il concetto ed adatto la formula.
    grazie 1000
    Non sono stato li ad adattare il codice e provarlo, ci tenevo solo a darti una possibile alternativa funzionale.
    Magari per chi legge invece se pubblichi la funzione corretta può essere utile la chiusura tecnica.

    Grazie
  • Re: Calcolo dei giorni di pagamento fatture

    Arrivo un pò lungo su questa discussione ma se può essere utile anche solo per un confronto...
    in un mio gestionale per la fatturazione la funzione che uso è
    
    if Me.cod_mod_pagamento.Column(5) then
    	dtScad=DateSerial(Year(Me.data_scheda), Month(Me.data_scheda) + 1+ (Me.cod_mod_pagamento.Column(3) / 30), 0)+Me.cod_mod_pagamento.Column(4)
    Else
    	...
    End If
    
    dove Me.data_scheda è la data della scheda/fattura e Me.cod_mod_pagamento contiene il metodo di pagamento di cui column(5) è il flag di fine mese, column(3) sono i giorni (es: 30, 60, 90, ...) e column(4) sono gli aggiuntivi (es: +15)

    il "/30" è perchè si segnano sempre sui multipli per indicare i mesi e il committente era + comodo così ma avrei potuto memorizzare anche semplicemente i mesi, la questione non cambia
  • Re: Calcolo dei giorni di pagamento fatture

    Io arei preferito gestire una Tabella pagamenti con un Campo descrittivo e 3 campi Funzionali.

    Es:
    
    TipoPagamento	Formato		Quantita	FineMese
    Pagamento 1	m		2		0
    Pagamento 2	d		165		-1
    Pagamento 3	m		3		-1
    Nel caso si può aggiungere un Campo di Descrizione esplicita del tipo:
    
    TipoPagamento	DescrizionePagamento	Formato		Quantita	FineMese
    Pagamento 1	2 Mesi da Fattua	m		2		0
    Pagamento 2	165gg Fine Mese Fattua	d		165		-1
    Pagamento 3	90gg Fine Mese Fattura	m		3		-1
    
    Ovviamente ho OMESSO la PKTipo Pagamento... ma è solo per far capire il senso.

    Il DateAdd lo si fa sulla Data di Fine Mese o sulla Data Fattura a seconda del Flag [FineMese] e tutto mi pare molto semplice...
    
    Dim dt As Date
    dt=DataFattura
    If FineMese Then dt=CalcoloFineMese(... DataFattura)
    dt=DateAdd(Formato,Quantita,dt)
    Nel complesso è esattamente come avete fatto, penso tuttavia possa essere più semplice questo metodo.
  • Re: Calcolo dei giorni di pagamento fatture

    @Alex ha scritto:


    Io arei preferito gestire una Tabella pagamenti con un Campo descrittivo e 3 campi Funzionali.
    si infatti ho fatto così nella anagrafica delle mod.di pagamento, senza però utilizzare la doppia possibilità dei giorni/mesi in quanto secondo le esigenze del mio cliente non c'è mai il quantitativo in giorni veri, è sempre un "fine mese" oppure "fine mese + 10/15/20 gg quindi nel mio caso bastavano 2 campi, quello relativo ai mesi (anche se ho messo 30/60/...) e quello dei gg aggiuntivi, + ovviamente il flag_finemense che, come detto, è sempre true se non per i "Bonifico Bancario vista fattura" e le rimesse dirette (pos, assegno, contanti, carta)
  • Re: Calcolo dei giorni di pagamento fatture

    Buongiorno,
    di seguito la funzione suggerita da Alex adattata alle mie esigenze:
    
    Function CalcoloDataPagamento(pdatafattura As Date, pMesi As Integer, pGiorni As Integer, pUltGiorni As Integer, pFineMese As Boolean) As Date
    
        Dim dt As Date
        If pFineMese = True Then
            dt = DateAdd("d", pGiorni, pdatafattura)    'Aggiungo i giorni
            dt = DateAdd("m", pMesi, dt)                'Aggiungo i mesi
           dt = DateSerial(Year(dt), Month(dt) + 1, 0)  'Calcolo il fine mese
           dt = DateAdd("d", pUltGiorni, dt)            'Agggiungo gli ulteriori giorni al fine mese
        Else
            dt = DateAdd("d", pGiorni, pdatafattura)    'Aggiungo i giorni
            dt = DateAdd("m", pMesi, dt)                'Aggiungo i mesi
           dt = DateAdd("d", pUltGiorni, dt)            'Agggiungo gli ulteriori giorni
        End If
    
       CalcoloDataPagamento = dt                        'Valorizzo la funzione
    End Function
    
    Poi sull'uscita dalla casella di selezione del metodo pagamento ho richiamato la funzione per valorizzare la casella della scadenza:
    dataformffdatasuggerita = CalcoloDataPagamento(DATAffdatafattura, numformffmesipagamento, numformffgiornipagamento, numformffulteriorigiorni, flagformfffinemese)

    Grazie mille per l'aiuto
  • Re: Calcolo dei giorni di pagamento fatture

    muttley005 ha scritto:


    @Alex ha scritto:


    Io arei preferito gestire una Tabella pagamenti con un Campo descrittivo e 3 campi Funzionali.
    si infatti ho fatto così nella anagrafica delle mod.di pagamento, senza però utilizzare la doppia possibilità dei giorni/mesi in quanto secondo le esigenze del mio cliente non c'è mai il quantitativo in giorni veri, è sempre un "fine mese" oppure "fine mese + 10/15/20 gg quindi nel mio caso bastavano 2 campi, quello relativo ai mesi (anche se ho messo 30/60/...) e quello dei gg aggiuntivi, + ovviamente il flag_finemense che, come detto, è sempre true se non per i "Bonifico Bancario vista fattura" e le rimesse dirette (pos, assegno, contanti, carta)
    Anche io avevo clienti che pagavano a multipli di mesi (30/60/90/120 gg), poi uno si e' "inventato" il 165 giorni fine mese + 10 giorni, per cui ho dovuto inserire i giorni oltre ai mesi e gli ulteriori giorni da fine mese per cui 5 mesi + 15 giorni + fine mese + 10 giorni...
  • Re: Calcolo dei giorni di pagamento fatture

    La funzione ha cose inutili e doppie...!!!

    Come avevo scritto... basta questa:
    
    Function CalcoloDataPagamento(pdatafattura As Date, pMesi As Integer, pGiorni As Integer, pUltGiorni As Integer, pFineMese As Boolean) As Date
    
        Dim dt As Date
        If pFineMese = True Then  dt = DateSerial(Year(dt), Month(dt) + 1, 0)  'Calcolo il fine mese
        
        dt = DateAdd("d", pGiorni, pdatafattura)    'Aggiungo i giorni
        dt = DateAdd("m", pMesi, dt)                'Aggiungo i mesi
        dt = DateAdd("d", pUltGiorni, dt)            'Agggiungo gli ulteriori giorni
        CalcoloDataPagamento = dt                        'Valorizzo la funzione
    End Function
    
  • Re: Calcolo dei giorni di pagamento fatture

    Mi permetto di contraddirti Alex,
    la formula cosi' come da te scritta non va bene nel caso specifico del pagamento 165 gg FM, infatti con il tuo metodo se la fattura fosse datata per esempio 15/07/2022 la data pagamento verrebbe 15/01/2023 in realta' invece verra' pagata il 31/12/2022 (quindi un mese prima). Il fine mese (se previsto) si applica alla scadenza del pagamento non alla data della fattura.
    Stimolato, ho comunque semplificato cosi':
        Dim dt As Date
            dt = DateAdd("d", pGiorni, pdatafattura)    'Aggiungo i giorni
            dt = DateAdd("m", pMesi, dt)                'Aggiungo i mesi
        
        If pFineMese Then
           dt = DateSerial(Year(dt), Month(dt) + 1, 0)  'Calcolo il fine mese
        
        End If
           dt = DateAdd("d", pUltGiorni, dt)            'Aggiungo gli ulteriori giorni
    
       CalcoloDataPagamento = dt                        'Valorizzo la funzione
    
  • Re: Calcolo dei giorni di pagamento fatture

    Bene così concordo ovviamente.
  • Re: Calcolo dei giorni di pagamento fatture

    [quote=Mailman post_id=8694080
    Anche io avevo clienti che pagavano a multipli di mesi (30/60/90/120 gg), poi uno si e' "inventato" il 165 giorni fine mese + 10 giorni, per cui ho dovuto inserire i giorni oltre ai mesi e gli ulteriori giorni da fine mese per cui 5 mesi + 15 giorni + fine mese + 10 giorni...
    [/quote]

    Il tuo clinte non fa dilazioni di pagamento, ma finanziamenti a tasso 0
Devi accedere o registrarti per scrivere nel forum
12 risposte