Nuovi metodi calcolo pagamento
git-svn-id: svn://10.65.10.50/trunk@1700 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
2b25310552
commit
8444247f6a
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user