diff --git a/cg/cg2104.cpp b/cg/cg2104.cpp index 21ae916b2..221e71dae 100755 --- a/cg/cg2104.cpp +++ b/cg/cg2104.cpp @@ -73,11 +73,30 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k) if (newu != ts.get(5)) // modificata ulteriore classificazione mod = m_ulc = TRUE; break; - case K_DEL: + case K_DEL: + doit = !recalc; + if (doit) + { + pag.remove_rata(r); + const int nrate = msk->get_int(FS_NRATE) - 1; + msk->set(FS_NRATE, nrate); + } + break; case K_INS: // permette aggiunta e cancellazione solo se non c'e' // ricalcolo automatico doit = !recalc; + if (doit) + { + const int prev = r - 1; + const int nrate = msk->get_int(FS_NRATE) + 1; + + msk->set(FS_NRATE, nrate); + pag.add_rata(ZERO, 0, pag.tipo_rata(prev), pag.ulc_rata(prev)); + pag.adjust_fixed_scad(); + pag.set_sheet(ps); + rws = ps.rows_array(); + } break; default: break; diff --git a/cg/pagament.cpp b/cg/pagament.cpp index 8184511ba..c09aebe9f 100755 --- a/cg/pagament.cpp +++ b/cg/pagament.cpp @@ -174,7 +174,7 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff) // diciamo che gli diciamo il numero giusto if (first == 1 && n < 2) return; - const int nact = first == 1 ? n - 1 : n; + int nact = first == 1 ? n - 1 : n; real p = real(100) / real(nact); p.round(2); @@ -194,19 +194,35 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff) { if (nr == first + 1) - { + { // suddividi equamente e riaggiusta la percentuale di conseguenza - real div = tot / real(nact); - real perc = real(100.0)*(div/tot); + real div = tot / real(nact); + if (_inited) + div.round(_round); + real perc = (100.0 * div) / tot; + real rem(tot); + for (i = first; i < n; i++) { if (i > first) - add_rata(perc, (sscad == -1 ? scad_rata(0) : sscad), tipo_rata(0)); - if (_inited) set_imprata (i, div); + add_rata(perc, (sscad == -1 ? scad_rata(first) : sscad), tipo_rata(0)); + if (_inited) + { + set_imprata (i, div); + rem -= tpay_rata(i); + } set_percrata(i, perc); } if (_inited && _tpr > 0 && _tpr < 4) set_imprata(0, tpay_rata(0) + _secndr); + if (_inited && rem != ZERO) + { + real r(tpay_rata(first) + rem); + set_imprata(first, r); + if (_inited && _tpr > 0 && _tpr < 4) + r -= _secndr; + set_percrata(first, 100 * r / tot); + } } else if (nr > first + 1) { @@ -216,19 +232,35 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff) // suddividere il resto dell'importo tra le altre real rfirst = _inited ? tpay_rata(0) : perc_rata(0); if (_inited && _tpr > 0 && _tpr < 4) rfirst -= _secndr; - - real rest = tot - _tpr >= 4 ? ZERO : rfirst; - const real div = rest / real(nact); - real perc = real(100.0)*(div/tot); + + real rest = tot - (_tpr >= 4 ? ZERO : rfirst); + real div = rest / real(nact - (first > 0 ? 0 : 1)); + if (_inited) + div.round(_round); + + real perc = (100.0 * div)/tot; + real rem(rest); for (i = 1; i < n; i++) { if (i >= nr) - add_rata(perc, (sscad == -1 ? (i < nr ? scad_rata(i) : scad_rata(nr-1)) : sscad), + add_rata(perc, (sscad == -1 ? scad_rata(nr-1) : sscad), tipo_rata(nr-1), ulc_rata(nr-1)); - if (_inited) set_imprata (i, div); + if (_inited) + { + set_imprata (i, div); + rem -= tpay_rata(i); + } set_percrata(i, perc); } + if (_inited && rem != ZERO) + { + real r(tpay_rata(first) + rem); + set_imprata(first, r); + if (_inited && _tpr > 0 && _tpr < 4) + r -= _secndr; + set_percrata(first, 100 * r / tot); + } } } } @@ -261,6 +293,7 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff) for (; i < nr; i++) _rate.destroy(i); _rate.pack(); + adjust_fixed_scad(); _dirty = TRUE; } @@ -441,10 +474,11 @@ void TPagamento::set_percrata(int i, real r) real TPagamento::recalc_percrata(int i) { real hm(_tpr < 4 ? _firstr : _secndr); - if (i == 0 && _tpr > 0 && _tpr < 4) - hm -= _secndr; - real perc = tpay_rata(i) * 100.0 / hm; + real tpay(tpay_rata(i)); + if (i == 0 && _tpr > 0 && _tpr < 4) + tpay -= _secndr; + real perc = tpay * 100.0 / hm; perc.round(2); set_percrata(i, perc);