diff --git a/cg/cg2104.cpp b/cg/cg2104.cpp index 3aeb549f7..16d219d35 100755 --- a/cg/cg2104.cpp +++ b/cg/cg2104.cpp @@ -74,8 +74,10 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k) mod = m_ulc = TRUE; break; case K_DEL: - case K_INS: - doit = FALSE; + case K_INS: + // permette aggiunta e cancellazione solo se non c'e' + // ricalcolo automatico + doit = !recalc; break; default: break; @@ -123,8 +125,9 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k) if (ahiahi) // any error? Rimetti le righe com'erano prima { if (recalc) - { - beep(); + { + TString err(80); pag.strerr(ahiahi,err); + warning_box(err); ps.row(r) = rws.row(r); ps.force_update(r); } diff --git a/cg/pagament.cpp b/cg/pagament.cpp index 16ec30015..1d86320d5 100755 --- a/cg/pagament.cpp +++ b/cg/pagament.cpp @@ -307,38 +307,10 @@ void TPagamento::next_scad(TDate& d, int scad, bool mcomm, int rata) if (!last && dy < d.day()) d.set_day(dy); } - else - { - d += scad; - } + else d += scad; - // riaggiusta se ci sono scadenze fissate - if (_fixd[0] != 0 || _fixd[1] != 0 || _fixd[2] != 0) - { - for (int i = 0; i < 3; i++) - { - if (_fixd[i] > d.day()) - { - if (d.last_day(d.month(), d.year()) >= _fixd[i]) - d.set_day(_fixd[i]); - else d.set_end_month(); - break; - } - } - - if (i == 3) - { - if (_fixd[0] > 0 && _fixd[0] < d.day()) - { - d.set_day(_fixd[0]); - d.set_month(d.month() == 12 ? 1 : d.month() + 1); - } - } - - } } - void TPagamento::set_default_type(int type, bool change_existing) { _def_tpr = type; @@ -544,7 +516,8 @@ word TPagamento::validate() const // check errori date scadenze (se istanziate) TDate d(data_rata(0)); if (d < _inizio) - res |= P_INIZIO; + res |= P_INIZIO; + for (i = 1; i < n_rate(); i++) { if (data_rata(i) <= d) @@ -681,7 +654,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, bool exhausted = FALSE; - for (int i = first; i < srate.items(); i++) + for (int i = 0 /* first */; i < srate.items(); i++) { if (i == row) { @@ -693,71 +666,71 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, // soltanto per row diversamente if ((rdiff == 2 && row > 0 && k > 0) || k == row) { - TToken_string& tt = rata(k); - TToken_string& ss = (TToken_string&)srate[k]; - tt.add(typ,2); - ss.add(typ,2); - tt.add(ulc,5); - ss.add(ulc,5); - need_recalc = TRUE; - // no error is possible - } - } - } + TToken_string& tt = rata(k); + TToken_string& ss = (TToken_string&)srate[k]; + tt.add(typ,2); + ss.add(typ,2); + tt.add(ulc,5); + ss.add(ulc,5); + need_recalc = TRUE; + // no error is possible + } + } + } - if (ulc != NULL) - { - rata(row).add(ulc, 5); - srate.row(row).add(ulc, 5); - need_recalc = TRUE; - } - - if (scad != NULL) - { - // if !_inited scad e' il n. giorni, se no e' la rata - if (_inited) + if (ulc != NULL) { - TToken_string& tt = rata(row); - TToken_string& ss = (TToken_string&)srate[row]; - lastdate = scad; - // controlla errore sulla data scadenza - if (i > 0) - { - oldscad = (int)(lastdate - data_rata(i-1)); - if (oldscad <= 0l) return P_SCAD; - } - else if (lastdate < _inizio) return P_INIZIO; - tt.add(scad,3); - ss.add(scad,3); - // ricalcola rate successive: se si vuole modificarne solo una - // ci si fotte e si disabilita il ricalcolo - TDate ddd (lastdate); - for (int j = row+1; j < srate.items(); j++) - { - TToken_string& tt = rata(j); - TToken_string& ss = (TToken_string&)srate[j]; - next_scad(ddd,scad_rata(j),mcomm,j); - tt.add(ddd.string(),3); - ss.add(ddd.string(),3); - need_recalc = TRUE; - } + rata(row).add(ulc, 5); + srate.row(row).add(ulc, 5); + need_recalc = TRUE; } - else - { - // nulla di speciale visto che si memorizza la derivata - int sc = atoi(scad); - 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) - return P_MCOMM; - TToken_string& tt = rata(row); - TToken_string& ss = (TToken_string&)srate[row]; - tt.add(sc,0); - ss.add(sc,0); - need_recalc = TRUE; - } - } + + if (scad != NULL) + { + // if !_inited scad e' il n. giorni, se no e' la rata + if (_inited) + { + TToken_string& tt = rata(row); + TToken_string& ss = (TToken_string&)srate[row]; + lastdate = scad; + // controlla errore sulla data scadenza + if (i > 0) + { + oldscad = (int)(lastdate - data_rata(i-1)); + if (oldscad <= 0l) return P_SCAD; + } + else if (lastdate < _inizio) return P_INIZIO; + tt.add(scad,3); + ss.add(scad,3); + // ricalcola rate successive: se si vuole modificarne solo una + // ci si fotte e si disabilita il ricalcolo + TDate ddd (lastdate); + for (int j = row+1; j < srate.items(); j++) + { + TToken_string& tt = rata(j); + TToken_string& ss = (TToken_string&)srate[j]; + next_scad(ddd,scad_rata(j),mcomm,j); + tt.add(ddd.string(),3); + ss.add(ddd.string(),3); + need_recalc = TRUE; + } + } + else + { + // nulla di speciale visto che si memorizza la derivata + int sc = atoi(scad); + 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) + return P_MCOMM; + TToken_string& tt = rata(row); + TToken_string& ss = (TToken_string&)srate[row]; + tt.add(sc,0); + ss.add(sc,0); + need_recalc = TRUE; + } + } // here's the bell if (new_value != NULL) @@ -1077,7 +1050,10 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, // real tot = tpay_rata(0) + _secndr; // tr.add(tot.string(), 4); // } - } + } + + // sistema scadenze fisse + adjust_fixed_scad(); need_recalc = TRUE; return P_OK; @@ -1111,7 +1087,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified, return P_INIZIO; } } - + + adjust_fixed_scad(); return P_OK; } @@ -1301,6 +1278,9 @@ void TPagamento::set_rate_auto() // prima rata if (_tpr > 0 && _tpr < 4) set_imprata(0, tpay_rata(0) + _secndr); + + // risistema rate per scadenze fisse + adjust_fixed_scad(); main_app().end_wait(); } @@ -1334,16 +1314,16 @@ void TPagamento::set_total(const real& imponibile, const real& imposta, const re _firstr = _imponibile; break; case 4: - _firstr = _spese + _imponibile; - _secndr = _imposta; + _secndr = _spese + _imponibile; + _firstr = _imposta; break; case 5: - _firstr = _imponibile + _imposta; - _secndr = _spese; + _secndr = _imponibile + _imposta; + _firstr = _spese; break; case 6: - _firstr = _imponibile; - _secndr = _imposta + _spese; + _secndr = _imponibile; + _firstr = _imposta + _spese; break; } @@ -1459,7 +1439,44 @@ void TPagamento::set_sheet(TSheet_field& sf, int sscad) sf.force_update(); main_app().end_wait(); } - + +void TPagamento::adjust_fixed_scad() +{ + if (!_inited) return; + + for (int i = 0; i < n_rate(); i++) + { + TDate d = data_rata(i); + + // riaggiusta se ci sono scadenze fissate + if (_fixd[0] != 0 || _fixd[1] != 0 || _fixd[2] != 0) + { + for (int i = 0; i < 3; i++) + { + if (_fixd[i] > d.day()) + { + if (d.last_day(d.month(), d.year()) >= _fixd[i]) + d.set_day(_fixd[i]); + else d.set_end_month(); + break; + } + } + + if (i == 3) + { + if (_fixd[0] > 0 && _fixd[0] < d.day()) + { + d.set_day(_fixd[0]); + d.set_month(d.month() == 12 ? 1 : d.month() + 1); + } + } + } + + TToken_string& tt = rata(i); + tt.add(d.string(), 3); + } +} + TPagamento::TPagamento(const char* codtab, const char* data) : _slicer(0.0,0), _new(FALSE), _imponibile(0.0), _imposta(0.0), _spese(0.0), _cambio(1.0), _code(codtab), _dirty(FALSE), _inited(FALSE), diff --git a/cg/pagament.h b/cg/pagament.h index ece1ca520..eb231596a 100755 --- a/cg/pagament.h +++ b/cg/pagament.h @@ -92,6 +92,8 @@ public: // giorni scadenza fissi, aggiunti poi void set_fixed_scad(int a, int ind) { _fixd[ind] = a; } + // aggiusta scadenze fisse (tutte in un colpo) + void adjust_fixed_scad(); // queste vengono usate solo per movimenti editabili nella struttura // (da tabella pagamenti) e riaggiustano tutte le rate in accordo