From e5e953f263be54b2a4d6654a57009b97b4a3ee79 Mon Sep 17 00:00:00 2001 From: villa Date: Tue, 7 Nov 1995 11:37:38 +0000 Subject: [PATCH] Corrette alcune rimanenti caciarole git-svn-id: svn://10.65.10.50/trunk@2102 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- cg/pagament.cpp | 311 +++++++++++++++++++++++++----------------------- cg/pagament.h | 2 + 2 files changed, 164 insertions(+), 149 deletions(-) diff --git a/cg/pagament.cpp b/cg/pagament.cpp index 37259ca70..1bd5d51c5 100755 --- a/cg/pagament.cpp +++ b/cg/pagament.cpp @@ -7,6 +7,8 @@ #include #include +inline void swap(int& x, int& y) {int tmp = x; x = y; y = tmp; } + int TPagamento::_rata_ifield(int n, int f) const { TToken_string& t = (TToken_string&)_rate[n]; @@ -52,15 +54,20 @@ void TPagamento::set_inizio(const TDate& d) void TPagamento::set_intervallo_rate(int in) { - _dirty = TRUE; - _int_rate = in; if (_mcomm && (in % 30) != 0) - _mcomm = FALSE; - for (int i = 0; i < n_rate(); i++) + { + if (yesno_box("E' specificato \"mese commerciale\". Si desidera annullarlo?")) + _mcomm = FALSE; + else + return; + } + for (int i = 1; i < n_rate(); i++) { TToken_string& ts = rata(i); - ts.add(i == 0 ? (scad_rata(0) == 0 ? 0 : in) : in, 0); - } + ts.add(in, 0); + } + _int_rate = in; + _dirty = TRUE; } void TPagamento::set_mese_commerciale(bool v, int& sscad) @@ -498,8 +505,6 @@ TToken_string& TPagamento::set_rata(int index, const real& howmuch, const real& } return *tt; } - - word TPagamento::validate() const { @@ -559,6 +564,8 @@ void TPagamento::strerr(word err, TString& s) s << "\n L'importo dato e' superiore al massimo possibile"; if (err & P_TOTNC) s << "\n La somma degli importi e' diversa dal totale del pagamento"; + if (err & P_MCOMM) + s << "\n Scadenze incompatibili con il mese commerciale"; } const char* TPagamento::desc_tpr() const @@ -690,7 +697,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, if (ulc != NULL) { rata(row).add(ulc, 5); - srate.row(row).add(ulc, 5); + srate.row(row).add(ulc, 5); + need_recalc = TRUE; } if (scad != NULL) @@ -730,7 +738,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, for (int i = 0; i < row; i ++) sc -= scad_rata(i); if (sc < 0 || (row > 0 && sc == 0)) return P_SCAD; - if (_mcomm && (sc % 30) != 0) _mcomm = FALSE; + if (_mcomm && (sc % 30) != 0) + return P_MCOMM; TToken_string& tt = rata(row); TToken_string& ss = (TToken_string&)srate[row]; tt.add(sc,0); @@ -814,6 +823,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, int type = oldtype; TString nulc = oldulc; int nscd = oldscad; + int frstd = scad_rata(0); const int frs = (rdiff == 3 || rdiff == 4) ? row+1 : first; const real mx = (rdiff == 3 || rdiff == 4) ? remainder : rmax; @@ -847,7 +857,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, TToken_string& trt = (TToken_string&)srate[k]; if (_inited) dd = trt.get(3); type = atoi(trt.get(2)); - nscd = k == 0 ? 0 : atoi(trt.get(0)); + nscd = k == 0 ? frstd : atoi(trt.get(0)); if (type == 0) type = 1; if (k > 0 && nscd == 0) nscd = oldscad; if (_inited && dd == lastdate && k > 0) @@ -861,13 +871,13 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, } else { - // se ho modificato la seconda o oltre, faccio tutte uguali dalla - // seconda in poi; la prima resta com'e' se possibile, mentre se - // c'e' un resto glielo sommo. - // Dunque: prendo la prima, calcolo il resto, divido per quella nuova, - // se resto lo sommo alla prima, e faccio quante rate servono + // se ho modificato la seconda o oltre, faccio tutte uguali dalla + // seconda in poi; la prima resta com'e' se possibile, mentre se + // c'e' un resto glielo sommo. + // Dunque: prendo la prima, calcolo il resto, divido per quella nuova, + // se resto lo sommo alla prima, e faccio quante rate servono - TToken_string& trt = (TToken_string&)srate[first]; + TToken_string& trt = (TToken_string&)srate[first]; real rfirst(is_perc_modified ? trt.get(1) : trt.get(4)); if (!delta.is_zero()) rfirst -= delta; real rest = tot - rfirst; @@ -877,136 +887,135 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, int nr = (int)div.integer() + (_tpr > 4 ? 2 : 1); real reminder = rest - (nimp * real(nr -1)); rfirst += reminder; - for (int k = first; k < nr; k++) - { - nscd = oldscad; - type = _def_tpr; - TString16 ulc(_def_ulc); + for (int k = first; k < nr; k++) + { + nscd = oldscad; + type = _def_tpr; + TString16 ulc(_def_ulc); - if (srate.items() > k) - { - TToken_string& trt = (TToken_string&)srate[k]; - if (_inited) dd = trt.get(3); - type = atoi(trt.get(2)); - nscd = atoi(trt.get(0)); - ulc = trt.get(5); - } + if (srate.items() > k) + { + TToken_string& trt = (TToken_string&)srate[k]; + if (_inited) dd = trt.get(3); + type = atoi(trt.get(2)); + nscd = atoi(trt.get(0)); + ulc = trt.get(5); + } - if (type == 0) type = 1; + if (type == 0) type = 1; - if (_inited && dd == lastdate && k > 0) - next_scad(dd,nscd,mcomm,k); + if (_inited && dd == lastdate && k > 0) + next_scad(dd,nscd,mcomm,k); - set_rata(k, is_perc_modified ? (k == first ? rfirst : nimp) : ZERO, - nscd, type, ulc, NULL, dd.string()); - if (!is_perc_modified) - set_imprata (k, k == first ? (rfirst + delta) : nimp); - } + set_rata(k, is_perc_modified ? (k == first ? rfirst : nimp) : ZERO, + nscd, type, ulc, NULL, dd.string()); + if (!is_perc_modified) + set_imprata (k, k == first ? (rfirst + delta) : nimp); + } } } else if (rdiff != 4) - for (j = frs; sum < mx; j++) - { - // se c'e' la vecchia rata si tengono i parametri - // altrimenti si calcolano - if (j < srate.items()) + for (j = frs; sum < mx; j++) + { + // se c'e' la vecchia rata si tengono i parametri + // altrimenti si calcolano + if (j < srate.items()) { - TToken_string& trt = (TToken_string&)srate[j]; - if (_inited) dd = trt.get(3); - type = atoi(trt.get(2)); - nscd = j == 0 ? 0 : atoi(trt.get(0)); - if (type == 0) type = 1; - if (j > 0 && nscd == 0) nscd = oldscad; - if (_inited && dd == lastdate && j > 0) - next_scad(dd,nscd,mcomm,j); + TToken_string& trt = (TToken_string&)srate[j]; + if (_inited) dd = trt.get(3); + type = atoi(trt.get(2)); + nscd = atoi(trt.get(0)); + if (type == 0) type = 1; + if (j > 0 && nscd == 0) nscd = oldscad; + if (_inited && dd == lastdate && j > 0) + next_scad(dd,nscd,mcomm,j); } else if (_inited) { - if (dd <= botime) dd = lastdate; - next_scad(dd,nscd,mcomm,j); + if (dd <= botime) dd = lastdate; + next_scad(dd,nscd,mcomm,j); } else nscd = _int_rate; - TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO, - nscd, type); + TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO, + nscd, type); if (_inited) ttr.add(dd.string(), 3); if (!is_perc_modified) { ttr.add(newv.string(),4); - } - if ((mx - sum) < newv) - { - // add remainder on first rate - newv += (mx - sum); - if (!is_perc_modified) - set_imprata(frs, newv); - else { - TToken_string& t = rata(frs); - t.add(newv.string(), 1); - } - remove_rata(j); - break; - } -// } - sum += newv; - } + } + if ((mx - sum) < newv) + { + // add remainder on first rate + newv += (mx - sum); + if (!is_perc_modified) + set_imprata(frs, newv); + else { + TToken_string& t = rata(frs); + t.add(newv.string(), 1); + } + remove_rata(j); + break; + } + sum += newv; + } else // rdiff == 4; uguali finche' possibile - { - bool basta = FALSE; - for (j = frs; ; j++) - { - // ultima rata puo' differire dalle precedenti - if (mx - sum <= newv) - { - newv = mx - sum; - basta = TRUE; - } - // se c'e' la vecchia rata si tengono i parametri - // altrimenti si calcolano - if (j < srate.items()) - { - TToken_string& trt = (TToken_string&)srate[j]; - if (_inited) dd = trt.get(3); - type = atoi(trt.get(2)); - nscd = j == 0 ? 0 : atoi(trt.get(0)); - if (type == 0) type = 1; - if (j > 0 && nscd == 0) nscd = oldscad; - if (_inited && dd == lastdate && j > 0) - next_scad(dd,nscd,mcomm,j); - } - else if (_inited) next_scad(dd,nscd,mcomm,j); + { + bool basta = FALSE; + for (j = frs; ; j++) + { + // ultima rata puo' differire dalle precedenti + if (mx - sum <= newv) + { + newv = mx - sum; + basta = TRUE; + } + // se c'e' la vecchia rata si tengono i parametri + // altrimenti si calcolano + if (j < srate.items()) + { + TToken_string& trt = (TToken_string&)srate[j]; + if (_inited) dd = trt.get(3); + type = atoi(trt.get(2)); + nscd = atoi(trt.get(0)); + if (type == 0) type = 1; + if (j > 0 && nscd == 0) nscd = oldscad; + if (_inited && dd == lastdate && j > 0) + next_scad(dd,nscd,mcomm,j); + } + else if (_inited) + next_scad(dd,nscd,mcomm,j); - TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO, - nscd, type); - if (_inited) - ttr.add(dd.string(), 3); - if (!is_perc_modified) - ttr.add(newv.string(),4); - if (basta) break; - sum += newv; - } - } + TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO, + nscd, type); + if (_inited) + ttr.add(dd.string(), 3); + if (!is_perc_modified) + ttr.add(newv.string(),4); + if (basta) break; + sum += newv; + } + } } - - } - else // exhausted + } + else // exhausted { for(int j = row+1; j < srate.items(); j++) _rate.destroy(j); } - if (_inited) - { - // ricalcola il valore secondario (non modificato) - real toshare(100.0); - if (is_perc_modified) - toshare = (_tpr < 4 ? _firstr : _secndr); - TDistrib dt(toshare, is_perc_modified ? _round : 3); + if (_inited) + { + // ricalcola il valore secondario (non modificato) + real toshare(100.0); + if (is_perc_modified) + toshare = (_tpr < 4 ? _firstr : _secndr); + TDistrib dt(toshare, is_perc_modified ? _round : 3); - for (int j = first; j < _rate.items(); j++) + for (int j = first; j < _rate.items(); j++) { real rvl = is_perc_modified ? perc_rata(j) : tpay_rata(j); // togli pezxo di troppo @@ -1015,7 +1024,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, real zpx = rvl/rmax; // percentuale dt.add(zpx); } - for (j = first; j < _rate.items(); j++) + for (j = first; j < _rate.items(); j++) { real rfirst(0.0); TToken_string& tr = rata(j); @@ -1057,40 +1066,39 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, // real tot = tpay_rata(0) + _secndr; // tr.add(tot.string(), 4); // } + } - } - - need_recalc = TRUE; - return P_OK; - } // new_value != NULL + need_recalc = TRUE; + return P_OK; + } // new_value != NULL } else // i != row modified - { - if (rdiff == 2) - continue; + { + if (rdiff == 2) + continue; - if (i > 0 && !((perc_rata(i-1) == perc_rata(i)))) - { - if (rdiff == 2) - rdiff = 1; - _rdiff = FALSE; - } - if (is_perc_modified) - rsum += perc_rata(i); - else - rsum += tpay_rata(i); + if (i > 0 && !((perc_rata(i-1) == perc_rata(i)))) + { + if (rdiff == 2) + rdiff = 1; + _rdiff = FALSE; + } + if (is_perc_modified) + rsum += perc_rata(i); + else + rsum += tpay_rata(i); - lastdate = data_rata(i); - oldtype = tipo_rata(i); - oldscad = scad_rata(i); - if (_inited && i > 0) - { - if (data_rata(i) <= data_rata(i-1)) - return P_SCAD; - } - else if (lastdate < _inizio) - return P_INIZIO; - } + lastdate = data_rata(i); + oldtype = tipo_rata(i); + oldscad = scad_rata(i); + if (_inited && i > 0) + { + if (data_rata(i) <= data_rata(i-1)) + return P_SCAD; + } + else if (_inited && lastdate < _inizio) + return P_INIZIO; + } } return P_OK; @@ -1122,8 +1130,8 @@ bool TPagamento::read(TTable* t, TTable* r) _fixd[0] = t->get_int("I0"); _fixd[1] = t->get_int("I1"); _fixd[2] = t->get_int("I2"); - - // TBI aggiusta _inizio secondo INSCAD; vedi mese commerciale etc. + + // aggiusta _inizio secondo INSCAD; vedi mese commerciale etc. if (_inscad == 'M') { if (_mcomm) _inizio.set_day(_inizio.month() == 2 ? 28 : 30); @@ -1385,10 +1393,15 @@ void TPagamento::set_sheet(TSheet_field& sf, int sscad) } else if (_rate.items() > 0) // not inited: set edit sheet +<<<<<<< pagament.cpp + { + if (sf.items() > 0) sf.destroy(); +======= { TString_array& arr = sf.rows_array(); arr.destroy(); // Avoid screen update by now +>>>>>>> 1.44 for (int i = 0, scr = 0; i < n_rate(); i++) { TToken_string& s = sf.row(-1); diff --git a/cg/pagament.h b/cg/pagament.h index 1e480b64b..732906bfd 100755 --- a/cg/pagament.h +++ b/cg/pagament.h @@ -22,6 +22,7 @@ const word P_INIZIO = 0x0008; // data 1a rata < data inizio pagamenti const word P_NEG = 0x0010; // importo specificato < minimo possibile const word P_TROP = 0x0020; // importo specificato > massimo possibile const word P_TOTNC = 0x0040; // totale importi != totale pagamento +const word P_MCOMM = 0x0080; // inconsistenza mese commerciale/scadenze class TPagamento : public TObject { @@ -81,6 +82,7 @@ public: bool mese_commerciale() const { return _mcomm; } bool rate_differenziate() const { return _rdiff; } int tipo_prima_rata() const { return _tpr; } + int intervallo_rate() const { return _int_rate; } int decs() const { return _round; } const TString& name() const { return _name; }