diff --git a/sc/sc2300.cpp b/sc/sc2300.cpp index 4980f4133..0d613d5bd 100755 --- a/sc/sc2300.cpp +++ b/sc/sc2300.cpp @@ -184,7 +184,26 @@ void TStampaScaduto::compute_all(TPartita& p) TImporto scd,pag,bf,work_imp; scd += TImporto(ssez,rs.get_real(sfield)); // Importo in scadenza... pag += rs.importo_pagato(_stvaluta,7); // Quanto e' stato pagato per questa scadenza? - for (int pp = rs.last(); pp > 0; pp = rs.pred(pp)) // Browse all rows (pagamenti) + + // Scorre le righe di pagamento per trovare la riga corripondente alla prima data pagamento + // di questa rata. Motivo: il primo pagamento delle rata corrente, effettuato tramite effetto + // (ai fini del calcolo B.F.) deve essere considerato con la data scadenza + const int lst = rs.last(); + int prima_riga_pagamento = -1; + TDate first_date;// data relativa alla prima riga di pagamento + for (int pp = rs.first(); pp <= lst; pp = rs.succ(pp)) + { + const TRiga_partite& sum = p.riga(pp); + TDate current_date(sum.get_date(PART_DATAPAG)); + int tipo_pag = rs.get_int(SCAD_TIPOPAG); + if (tipo_pag>=2 && tipo_pag<=7) //Incasso tramite effetto + if (prima_riga_pagamento==-1 || first_date > current_date) + { + first_date = current_date; + prima_riga_pagamento = pp; + } + } + for (pp = rs.first(); pp <= lst; pp = rs.succ(pp)) // Browse all rows (pagamenti) { const TRectype pg = rs.row(pp); const TRiga_partite& sum = p.riga(pp); @@ -203,9 +222,14 @@ void TStampaScaduto::compute_all(TPartita& p) { TDate data_pag(sum.get_date(PART_DATAPAG)); int tipo_pag = rs.get_int(SCAD_TIPOPAG); - if (tipo_pag!=1 && tipo_pag!=8 && tipo_pag!= 9 && data_pag.ok()) //Incasso tramite effetto + if (tipo_pag>=2 && tipo_pag<=7 && data_pag.ok()) //Incasso tramite effetto + { + if (prima_riga_pagamento > -1 && prima_riga_pagamento == pp) + data_pag = d; // Se e' il primo pagamento(in ordine di data) di questa rata + // prende la data di scadenza relativa. if (data_pag >= _limbf && data_pag <= _limscad) bf += TImporto(sez,pg.get_real(field)); + } } } char norm='D';