Nuovi metodi calcolo pagamento

git-svn-id: svn://10.65.10.50/trunk@1700 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
villa 1995-08-11 09:02:40 +00:00
parent 2b25310552
commit 8444247f6a
2 changed files with 1517 additions and 1465 deletions

View File

@ -5,6 +5,7 @@
#include <mov.h> #include <mov.h>
#include <scadenze.h> #include <scadenze.h>
int TPagamento::_rata_ifield(int n, int f) const int TPagamento::_rata_ifield(int n, int f) const
{ {
TToken_string& t = (TToken_string&)_rate[n]; TToken_string& t = (TToken_string&)_rate[n];
@ -43,6 +44,7 @@ bool TPagamento::ratapagata(int n)
void TPagamento::set_intervallo_rate(int in) void TPagamento::set_intervallo_rate(int in)
{ {
_dirty = TRUE; _dirty = TRUE;
_int_rate = in;
if (_mcomm && (in % 30) != 0) if (_mcomm && (in % 30) != 0)
_mcomm = FALSE; _mcomm = FALSE;
for (int i = 0; i < n_rate(); i++) for (int i = 0; i < n_rate(); i++)
@ -436,6 +438,7 @@ const char* TPagamento::desc_tpr() const
case 4: o = "Spese + merce su 1a"; break; case 4: o = "Spese + merce su 1a"; break;
case 5: o = "Merce + imposte su 1a"; break; case 5: o = "Merce + imposte su 1a"; break;
case 6: o = "Tutta la merce su 1a"; break; case 6: o = "Tutta la merce su 1a"; break;
default: o = ""; break;
} }
return o; return o;
} }
@ -577,12 +580,16 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real remainder(0.0); remainder = rmax - rsum; real remainder(0.0); remainder = rmax - rsum;
if (!(exhausted = (remainder == real(0.0)))) if (!(exhausted = (remainder == real(0.0))))
{ {
// se inited e scelto UGUALI (2) occorre dividere in N e
// aggiungere il resto sulla 1a rata
// controlla se rdiff e' compatibile con // controlla se rdiff e' compatibile con
// i dati e se e' il caso riaggiusta // i dati e se e' il caso riaggiusta
if (rdiff == 3 && !((remainder % newv.integer()) == ZERO)) if (rdiff == 3 && !((remainder % newv.integer()) == ZERO))
rdiff = 2; rdiff = 2;
if (rdiff == 2 && !((rmax % newv.integer()) == ZERO)) // *** 10/8/95: se uguali e non e' multiplo intero lo teniamo cosi' e poi
rdiff = 1; // *** aggiungiamo alla prima rata utile
// if (rdiff == 2 && !((rmax % newv.integer()) == ZERO))
// rdiff = 1;
_rdiff = (rdiff == 1 || rdiff == 3 || rdiff == 4); _rdiff = (rdiff == 1 || rdiff == 3 || rdiff == 4);
// procedi // procedi
@ -635,6 +642,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if (rdiff != 4) if (rdiff != 4)
for (j = frs; sum < mx; j++) for (j = frs; sum < mx; j++)
{ {
// TBI: qui mod se rdiff == 2
// se c'e' la vecchia rata si tengono i parametri // se c'e' la vecchia rata si tengono i parametri
// altrimenti si calcolano // altrimenti si calcolano
if (j < srate.items()) if (j < srate.items())
@ -653,13 +661,30 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if (dd <= botime) dd = lastdate; if (dd <= botime) dd = lastdate;
next_scad(dd,nscd,mcomm,j); next_scad(dd,nscd,mcomm,j);
} }
else nscd = _int_rate;
TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO, TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO,
nscd, type); nscd, type);
if (_inited) if (_inited)
ttr.add(dd.string(), 3); ttr.add(dd.string(), 3);
if (!is_perc_modified) if (!is_perc_modified)
{
ttr.add(newv.string(),4); 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; sum += newv;
} }
else // rdiff == 4; uguali finche' possibile else // rdiff == 4; uguali finche' possibile
@ -714,7 +739,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real toshare(100.0); real toshare(100.0);
if (is_perc_modified) if (is_perc_modified)
toshare = (_tpr < 4 ? _firstr : _secndr); toshare = (_tpr < 4 ? _firstr : _secndr);
TDistrib dt(toshare,0); TDistrib dt(toshare, is_perc_modified ? _round : 3);
for (int j = first; j < _rate.items(); j++) for (int j = first; j < _rate.items(); j++)
{ {
@ -728,6 +753,15 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real rvl = dt.get(); real rvl = dt.get();
tr.add(rvl.string(), is_perc_modified ? 4 : 1); tr.add(rvl.string(), is_perc_modified ? 4 : 1);
} }
// se e' il caso aggiungi l'importo fisso sulla prima rata
if (_inited && _tpr > 0 && _tpr < 4)
{
TToken_string& tr = rata(0);
real tot = tpay_rata(0) + _firstr;
tr.add(tot.string(), 4);
}
} }
need_recalc = TRUE; need_recalc = TRUE;
@ -778,7 +812,7 @@ bool TPagamento::read(TTable* t, TTable* r)
// set everything // set everything
_rdiff = t->get_bool("B1"); _rdiff = t->get_bool("B1");
_mcomm = t->get_bool("B0"); _mcomm = t->get_bool("B0");
_tpr = *((const char*)(t->get("S3"))); _tpr = atoi(t->get("S3"));
_inscad = *((const char*)(t->get("S1"))); _inscad = *((const char*)(t->get("S1")));
_code = t->get("CODTAB"); _code = t->get("CODTAB");
_name = t->get("S0"); _name = t->get("S0");
@ -899,7 +933,7 @@ void TPagamento::set_rate_auto()
real toslice = _firstr; real toslice = _firstr;
if (n_rate() == 0 || !_inited || (_tpr > 3 && n_rate() == 1)) return; if (n_rate() == 0 || !_inited || (_tpr > 3 && n_rate() == 1)) return;
if (_tpr > 1) // ripartisci _firstr su tutte le rate if (_tpr > 3) // ripartisci _firstr su tutte le rate
{ {
first = 1; first = 1;
toslice = _secndr; toslice = _secndr;
@ -911,9 +945,23 @@ void TPagamento::set_rate_auto()
// prima rata obbligatoria // prima rata obbligatoria
set_imprata(0, _firstr); set_imprata(0, _firstr);
// se rate uguali dividi l'importo totale per il numero di rate
real r1(0.0), ro(0.0);
if (!_rdiff)
{
int rut = _tpr > 3 ? n_rate() - 1 : n_rate();
ro = toslice/real(rut); ro.trunc(_round);
r1 = ro + (toslice - (ro*real(rut)));
}
for (int i = first; i < n_rate(); i++) for (int i = first; i < n_rate(); i++)
// setta le fette e le date di scadenza // setta le fette e le date di scadenza
set_imprata(i, _slicer.get()); set_imprata(i, _rdiff ? _slicer.get() : (i == first ? r1 : ro));
// se e' nei primi tre casi, si somma l'importo da non dividere alla
// prima rata
if (_tpr > 0 && _tpr < 4)
set_imprata(0, tpay_rata(0) + _firstr);
} }
@ -1044,7 +1092,7 @@ void TPagamento::set_sheet(TSheet_field& sf, int sscad)
TPagamento::TPagamento(const char* codtab, const char* data) : TPagamento::TPagamento(const char* codtab, const char* data) :
_slicer(0.0,0), _new(FALSE), _imponibile(0.0), _imposta(0.0), _slicer(0.0,0), _new(FALSE), _imponibile(0.0), _imposta(0.0),
_spese(0.0), _code(codtab), _dirty(FALSE), _inited(FALSE), _spese(0.0), _code(codtab), _dirty(FALSE), _inited(FALSE),
_def_tpr(1), _def_ulc("") _def_tpr(1), _def_ulc(""), _round(0), _int_rate(30)
{ {
_fixd[0] = _fixd[1] = _fixd[2] = 0; _fixd[0] = _fixd[1] = _fixd[2] = 0;
if (data != NULL) if (data != NULL)
@ -1459,4 +1507,3 @@ void TPartite_array::update_reg_num(long nreg, const TRectype& mov)
game->update_reg_num(nreg, mov); game->update_reg_num(nreg, mov);
} }

View File

@ -49,6 +49,8 @@ class TPagamento : public TObject
real _secndr; // importo da distribuire real _secndr; // importo da distribuire
int _fixd[3]; // giorni scadenza fissa, se desiderati int _fixd[3]; // giorni scadenza fissa, se desiderati
int _round; // decimali arrotondamento importo
int _int_rate;
int _rata_ifield(int n, int f) const; int _rata_ifield(int n, int f) const;
real _rata_rfield(int n, int f) const; real _rata_rfield(int n, int f) const;
@ -79,6 +81,7 @@ public:
bool mese_commerciale() const { return _mcomm; } bool mese_commerciale() const { return _mcomm; }
bool rate_differenziate() const { return _rdiff; } bool rate_differenziate() const { return _rdiff; }
int tipo_prima_rata() const { return _tpr; } int tipo_prima_rata() const { return _tpr; }
int decs() const { return _round; }
// mi scuso per la mancanza di underscore, ma mi piaceva cosi' // mi scuso per la mancanza di underscore, ma mi piaceva cosi'
bool ratapagata(int n); bool ratapagata(int n);
@ -102,6 +105,7 @@ public:
void set_inizio_scadenza(char v) { _inscad = v; } void set_inizio_scadenza(char v) { _inscad = v; }
void set_code(const char* c) { _code = c; } void set_code(const char* c) { _code = c; }
void set_round(int n) { _round = n; }
// check consistency: returns word with errors flagged, 0 if ok // check consistency: returns word with errors flagged, 0 if ok
word validate() const; word validate() const;
@ -161,6 +165,7 @@ public:
virtual ~TPagamento() {} virtual ~TPagamento() {}
}; };
#ifndef __PARTITE_H #ifndef __PARTITE_H
#include <partite.h> #include <partite.h>
#endif #endif