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 <scadenze.h>
int TPagamento::_rata_ifield(int n, int f) const
{
TToken_string& t = (TToken_string&)_rate[n];
@ -43,6 +44,7 @@ bool TPagamento::ratapagata(int n)
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++)
@ -436,6 +438,7 @@ const char* TPagamento::desc_tpr() const
case 4: o = "Spese + merce su 1a"; break;
case 5: o = "Merce + imposte su 1a"; break;
case 6: o = "Tutta la merce su 1a"; break;
default: o = ""; break;
}
return o;
}
@ -577,12 +580,16 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real remainder(0.0); remainder = rmax - rsum;
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
// i dati e se e' il caso riaggiusta
if (rdiff == 3 && !((remainder % newv.integer()) == ZERO))
rdiff = 2;
if (rdiff == 2 && !((rmax % newv.integer()) == ZERO))
rdiff = 1;
// *** 10/8/95: se uguali e non e' multiplo intero lo teniamo cosi' e poi
// *** aggiungiamo alla prima rata utile
// if (rdiff == 2 && !((rmax % newv.integer()) == ZERO))
// rdiff = 1;
_rdiff = (rdiff == 1 || rdiff == 3 || rdiff == 4);
// procedi
@ -635,6 +642,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if (rdiff != 4)
for (j = frs; sum < mx; j++)
{
// TBI: qui mod se rdiff == 2
// se c'e' la vecchia rata si tengono i parametri
// altrimenti si calcolano
if (j < srate.items())
@ -653,13 +661,30 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
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);
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;
}
else // rdiff == 4; uguali finche' possibile
@ -714,7 +739,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real toshare(100.0);
if (is_perc_modified)
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++)
{
@ -728,6 +753,15 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real rvl = dt.get();
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;
@ -778,7 +812,7 @@ bool TPagamento::read(TTable* t, TTable* r)
// set everything
_rdiff = t->get_bool("B1");
_mcomm = t->get_bool("B0");
_tpr = *((const char*)(t->get("S3")));
_tpr = atoi(t->get("S3"));
_inscad = *((const char*)(t->get("S1")));
_code = t->get("CODTAB");
_name = t->get("S0");
@ -899,7 +933,7 @@ void TPagamento::set_rate_auto()
real toslice = _firstr;
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;
toslice = _secndr;
@ -911,9 +945,23 @@ void TPagamento::set_rate_auto()
// prima rata obbligatoria
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++)
// 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) :
_slicer(0.0,0), _new(FALSE), _imponibile(0.0), _imposta(0.0),
_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;
if (data != NULL)
@ -1459,4 +1507,3 @@ void TPartite_array::update_reg_num(long nreg, const TRectype& mov)
game->update_reg_num(nreg, mov);
}

View File

@ -49,6 +49,8 @@ class TPagamento : public TObject
real _secndr; // importo da distribuire
int _fixd[3]; // giorni scadenza fissa, se desiderati
int _round; // decimali arrotondamento importo
int _int_rate;
int _rata_ifield(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 rate_differenziate() const { return _rdiff; }
int tipo_prima_rata() const { return _tpr; }
int decs() const { return _round; }
// mi scuso per la mancanza di underscore, ma mi piaceva cosi'
bool ratapagata(int n);
@ -102,6 +105,7 @@ public:
void set_inizio_scadenza(char v) { _inscad = v; }
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
word validate() const;
@ -161,6 +165,7 @@ public:
virtual ~TPagamento() {}
};
#ifndef __PARTITE_H
#include <partite.h>
#endif