Correzioni varie al calcolo delle scadenze + correzione della cancellazione di un pagamento

git-svn-id: svn://10.65.10.50/trunk@2363 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1995-12-29 11:06:12 +00:00
parent 2fbf4c8ad8
commit 80ee4b54fd

View File

@ -210,7 +210,8 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
{ {
set_imprata (i, div); set_imprata (i, div);
rem -= tpay_rata(i); rem -= tpay_rata(i);
} }
set_percrata(i, perc); set_percrata(i, perc);
} }
if (_inited && _tpr > 0 && _tpr < 4) if (_inited && _tpr > 0 && _tpr < 4)
@ -466,7 +467,7 @@ void TPagamento::set_imprata(int i, const real& r)
} }
void TPagamento::set_percrata(int i, real r) void TPagamento::set_percrata(int i, real r)
{ {
TToken_string& tt = (TToken_string&)_rate[i]; TToken_string& tt = (TToken_string&)_rate[i];
tt.add(r.string(), 1); tt.add(r.string(), 1);
} }
@ -544,8 +545,11 @@ word TPagamento::validate() const
// check percentages & prepare slicer // check percentages & prepare slicer
for (int i = first; i < n_rate(); i++) for (int i = first; i < n_rate(); i++)
r += perc_rata(i); r += perc_rata(i);
r.round(1); r -= real(100.0);
if (r != real(100.0)) real delta(0.005);
delta = delta * real(n_rate());
r = abs(r);
if (r > delta)
res |= P_RSUM; res |= P_RSUM;
@ -700,7 +704,10 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
{ {
newv = new_value; newv = new_value;
rmax = is_perc_modified ? real(100.0) : (_tpr < 4 ? _firstr : _secndr); rmax = is_perc_modified ? real(100.0) : (_tpr < 4 ? _firstr : _secndr);
if (newv > rmax) return P_RSUM; real max_value(rmax);
if (_tpr > 0 && _tpr < 4 && row == 0)
max_value += _secndr;
if (newv > max_value) return P_RSUM;
} }
bool exhausted = FALSE; bool exhausted = FALSE;
@ -869,7 +876,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
// ripartisci l'importo nel numero necessario di rate per // ripartisci l'importo nel numero necessario di rate per
// mantenere costante il valore // mantenere costante il valore
real sum(0.0); real sum(0.0);
if (_inited) lastdate = data_rata(rdiff == 2 ? first : row); if (_inited)
lastdate = data_rata(rdiff == 2 ? first : row);
TDate dd(lastdate); TDate dd(lastdate);
int type = oldtype; int type = oldtype;
@ -877,14 +885,14 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
int nscd = oldscad; int nscd = oldscad;
int frstd = scad_rata(0); int frstd = scad_rata(0);
const int frs = (rdiff == 3 || rdiff == 4) ? row+1 : first; const int frs = (rdiff == 3 || rdiff == 4) ? row+1 : first ;
const real mx = (rdiff == 3 || rdiff == 4) ? remainder : rmax; const real mx = (rdiff == 3 || rdiff == 4) ? remainder : rmax;
// cancelliamo tutto, va' // cancelliamo tutto, va'
for (int j = srate.items()-1; j >= frs; j--) _rate.destroy(j); for (int j = srate.items()-1; j >= frs; j--) _rate.destroy(j);
const int n = srate.items(); // questo rimane per forza costante const int n = srate.items(); // questo rimane per forza costante
if (rdiff == 2 && n > 1+first) if (rdiff == 2 && n > 1 /*28/12/95 +first */)
{ {
// HERE // HERE
real tot = is_perc_modified ? real(100.0) : (_tpr < 4 ? _firstr : _secndr); real tot = is_perc_modified ? real(100.0) : (_tpr < 4 ? _firstr : _secndr);
@ -894,7 +902,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
// se ho modificato la prima, divido il resto nelle successive // se ho modificato la prima, divido il resto nelle successive
// lasciando costante il numero rate // lasciando costante il numero rate
if (row == first) if (row == 0 /* 28/12/95 first */)
{ {
if (!delta.is_zero()) nimp -= delta; if (!delta.is_zero()) nimp -= delta;
// inferiore al minimo // inferiore al minimo
@ -929,16 +937,18 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
// Dunque: prendo la prima, calcolo il resto, divido per quella nuova, // Dunque: prendo la prima, calcolo il resto, divido per quella nuova,
// se resto lo sommo alla prima, e faccio quante rate servono // se resto lo sommo alla prima, e faccio quante rate servono
TToken_string& trt = (TToken_string&)srate[first]; TToken_string& trt = (TToken_string&)srate[0 /* 28/12/95 first */];
real rfirst(is_perc_modified ? trt.get(1) : trt.get(4)); real rfirst(is_perc_modified ? trt.get(1) : trt.get(4));
if (!delta.is_zero()) rfirst -= delta; if (!delta.is_zero()) rfirst -= delta;
if (_tpr >= 4) rfirst = ZERO;
real rest = tot - rfirst; real rest = tot - rfirst;
real div = rest / nimp; real div = rest / nimp;
if (div < real(1.0)) { _rate = srate; return P_TROP; } if (div < real(1.0)) { _rate = srate; return P_TROP; }
int nr = (int)div.integer() + (_tpr > 3 ? 2 : 1); int nr = (int)div.integer() + 1 /* 28/12/95 (_tpr > 3 ? 2 : 1) */;
real reminder = rest - (nimp * real(nr - 1 - first)); real reminder = rest - (nimp * real(nr - 1 /*28/12/95 - first */));
rfirst += reminder; rfirst += reminder;
if (_tpr >= 4) rfirst += nimp;
for (int k = first; k < nr; k++) for (int k = first; k < nr; k++)
{ {
nscd = oldscad; nscd = oldscad;
@ -980,7 +990,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
nscd = atoi(trt.get(0)); nscd = atoi(trt.get(0));
if (type == 0) type = 1; if (type == 0) type = 1;
if (j > 0 && nscd == 0) nscd = oldscad; if (j > 0 && nscd == 0) nscd = oldscad;
if (_inited && dd == lastdate && j > frs) if (_inited && dd == lastdate && j > frs)
next_scad(dd,nscd,mcomm,j); next_scad(dd,nscd,mcomm,j);
} }
else if (_inited) else if (_inited)
@ -990,8 +1000,9 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
next_scad(dd,nscd,mcomm,j); next_scad(dd,nscd,mcomm,j);
} }
else nscd = _int_rate; else nscd = _int_rate;
TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO, real imp(newv);
TToken_string& ttr = set_rata(j, is_perc_modified ? imp : ZERO,
nscd, type); nscd, type);
if (_inited) if (_inited)
ttr.add(dd.string(), 3); ttr.add(dd.string(), 3);
@ -1002,17 +1013,19 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if ((mx - sum) < newv) if ((mx - sum) < newv)
{ {
// add remainder on first rate // add remainder on first rate
newv += (mx - sum); imp += (mx - sum);
if (rdiff == 3) if (rdiff == 3)
{ {
newv = is_perc_modified ? perc_rata(first) : tpay_rata(first); imp = is_perc_modified ? perc_rata(first) : tpay_rata(first);
newv += (mx - sum); imp += (mx - sum);
} }
if (_inited && _tpr >0 && _tpr < 4)
imp += _secndr;
if (!is_perc_modified) if (!is_perc_modified)
set_imprata(first, newv); set_imprata(first, imp);
else { else {
TToken_string& t = rata(first); TToken_string& t = rata(first);
t.add(newv.string(), 1); t.add(imp.string(), 1);
} }
remove_rata(j); remove_rata(j);
break; break;
@ -1296,7 +1309,7 @@ int TPagamento::remove(TTable& r)
TString16 s; int err = NOERR; TString16 s; int err = NOERR;
for (int i = 0 ; err == NOERR; i++) for (int i = 0 ; err == NOERR; i++)
{ {
r.zero(); s.format("%s%3d", _code, i); r.zero(); s.format("%s%3d", (const char*)_code, i);
r.put("CODTAB", s); r.put("CODTAB", s);
if (r.read() == NOERR) if (r.read() == NOERR)
err = r.remove(); err = r.remove();
@ -1555,4 +1568,4 @@ _def_tpr(1), _def_ulc(""), _round(0), _int_rate(30), _tpr(0), _rdiff(FALSE)
if (_code.blank() || !read()) if (_code.blank() || !read())
_new = TRUE; _new = TRUE;
} }