Correzione alla generazione delle fatture per il saldaconto

git-svn-id: svn://10.65.10.50/trunk@2372 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1996-01-03 09:50:01 +00:00
parent 1c16ccb9d1
commit 6ca5913d8e
3 changed files with 97 additions and 51 deletions

View File

@ -90,10 +90,14 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k)
if (doit)
{
const int prev = r - 1;
const int nrate = msk->get_int(FS_NRATE) + 1;
const int nrate = msk->get_int(FS_NRATE) + 1;
const int gio_scad = pag.scad_rata(prev);
TDate data_scad(pag.data_rata(prev));
msk->set(FS_NRATE, nrate);
pag.add_rata(ZERO, 0, pag.tipo_rata(prev), pag.ulc_rata(prev));
pag.add_rata(ZERO, gio_scad, pag.tipo_rata(prev), pag.ulc_rata(prev));
pag.next_scad(data_scad, gio_scad, pag.mese_commerciale(), r);
pag.set_datarata(r, data_scad);
pag.adjust_fixed_scad();
pag.set_sheet(ps);
rws = ps.rows_array();
@ -383,20 +387,20 @@ bool TPrimanota_application::recalc_handler(TMask_field& f, KEY key)
{
if (key == K_SPACE)
{
const bool on = f.get().not_empty();
const bool recalc_aut = f.get().not_empty();
const TMask& m = f.mask();
TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET);
ps.enable_column(3, on);
ps.sheet_mask().enable(DLG_DELREC, !on);
ps.enable_column(3, recalc_aut);
ps.sheet_mask().enable(DLG_DELREC, !recalc_aut);
TPagamento& pag = app().pagamento();
if (pag.tipo_prima_rata() >= 4)
{
ps.enable_cell(0, 1, !on);
ps.enable_cell(0, 2, !on);
if (on)
ps.enable_cell(0, 1, !recalc_aut);
ps.enable_cell(0, 2, !recalc_aut);
if (recalc_aut)
ps.disable_cell(0, 3);
ps.force_update(0);
}
ps.force_update();
}
return TRUE;
@ -443,7 +447,7 @@ bool TPrimanota_application::codcab_handler(TMask_field& f, KEY key)
bool TPrimanota_application::ratalit_handler(TMask_field& f, KEY key)
{
if (key == K_F8 || (key == K_TAB && f.focusdirty() && f.get().empty()))
if (key == K_F8 || (key == K_TAB && f.get().empty()))
{
TPagamento& pag = app().pagamento();
if (pag.in_valuta())
@ -459,7 +463,7 @@ bool TPrimanota_application::ratalit_handler(TMask_field& f, KEY key)
bool TPrimanota_application::rataval_handler(TMask_field& f, KEY key)
{
if (key == K_F8 || (key == K_TAB && f.focusdirty() && f.get().empty()))
if (key == K_F8 || (key == K_TAB && f.get().empty()))
{
TPagamento& pag = app().pagamento();
if (pag.in_valuta())

View File

@ -201,7 +201,9 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
div.round(_round);
real perc = (100.0 * div) / tot;
real rem(tot);
real p(perc);
p.round(2);
for (i = first; i < n; i++)
{
if (i > first)
@ -210,19 +212,30 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
{
set_imprata (i, div);
rem -= tpay_rata(i);
}
}
else
rem -= p;
set_percrata(i, perc);
}
if (_inited && _tpr > 0 && _tpr < 4)
set_imprata(0, tpay_rata(0) + _secndr);
if (_inited && rem != ZERO)
if (rem != ZERO)
{
real r(tpay_rata(first) + rem);
set_imprata(first, r);
if (_inited && _tpr > 0 && _tpr < 4)
r -= _secndr;
set_percrata(first, 100 * r / tot);
if (_inited)
{
real r(tpay_rata(first) + rem);
set_imprata(first, r);
if (_inited && _tpr > 0 && _tpr < 4)
r -= _secndr;
set_percrata(first, 100 * r / tot);
}
else
{
const real r(perc_rata(first) + rem);
set_percrata(first, r);
}
}
}
else if (nr > first + 1)
@ -241,7 +254,9 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
real perc = (100.0 * div)/tot;
real rem(rest);
real p(perc);
p.round(2);
for (i = 1; i < n; i++)
{
if (i >= nr)
@ -252,21 +267,32 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
set_imprata (i, div);
rem -= tpay_rata(i);
}
else
rem -= p;
set_percrata(i, perc);
}
if (_inited && rem != ZERO)
if (rem != ZERO)
{
real r(tpay_rata(first) + rem);
set_imprata(first, r);
if (_inited && _tpr > 0 && _tpr < 4)
r -= _secndr;
set_percrata(first, 100 * r / tot);
if (_inited)
{
real r(tpay_rata(first) + rem);
set_imprata(first, r);
if (_inited && _tpr > 0 && _tpr < 4)
r -= _secndr;
set_percrata(first, 100 * r / tot);
}
else
{
const real r(perc_rata(first) + rem);
set_percrata(first, r);
}
}
}
}
}
else
{
{
for (i = first; sum < real(100.0); i++)
{
if ((real(100.0) - sum) < p)
@ -472,6 +498,12 @@ void TPagamento::set_percrata(int i, real r)
tt.add(r.string(), 1);
}
void TPagamento::set_datarata(int i, const TDate & d)
{
TToken_string& tt = (TToken_string&)_rate[i];
tt.add((const char *) d, 3);
}
real TPagamento::recalc_percrata(int i)
{
real hm(_tpr < 4 ? _firstr : _secndr);
@ -676,26 +708,27 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if (_rate.items() == 0) return P_OK;
real rsum(0.0), newv(0.0), rmax(0.0);
int oldtype = tipo_rata(0);
TString oldulc = ulc_rata(0);
int oldscad = scad_rata(0);
const int last_rata = _rate.items() - 1;
int oldtype = tipo_rata(last_rata);
TString oldulc = ulc_rata(last_rata);
int oldscad = scad_rata(last_rata);
TDate lastdate = data_rata(0);
int first = _tpr < 4 ? 0 : 1;
TString_array srate(_rate); // rate come erano
if (srate.items() > 1)
{
// if (srate.items() > 1)
// {
// calcola defaults per tipo pagamento e scadenza
// nel caso di rate nuove
oldscad = scad_rata(srate.items() - 1);
if (_mcomm)
{
int mesi = oldscad / 30;
if (mesi == 0) mesi = 1;
oldscad = 30 * mesi;
}
// oldscad = scad_rata(srate.items() - 1);
// if (_mcomm)
// {
// int mesi = oldscad / 30;
// if (mesi == 0) mesi = 1;
// oldscad = 30 * mesi;
// }
}
// }
if (oldscad <= 0) oldscad = _int_rate;
if (oldtype <= 0) oldtype = _def_tpr;
@ -846,11 +879,15 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if (rdiff == 1)
{
// cancella tutte le rate successive, aggiungi un'unica rata
// con il resto dell'importo
// con il resto dell'importo
real imp(remainder);
if (_inited && _tpr >= 4 )
imp += _firstr;
if (row < (srate.items()-1))
{
TToken_string& trt = rata(row+1);
trt.add(remainder.string(), is_perc_modified ? 1 : 4);
trt.add(imp.string(), is_perc_modified ? 1 : 4);
for(int j = row+2; j < srate.items(); j++)
_rate.destroy(j);
}
@ -860,9 +897,9 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
for(int j = row+1; j < srate.items(); j++)
_rate.destroy(j);
TToken_string& trt = add_rata(is_perc_modified ? remainder : (real) 0.0,
oldscad, oldtype);
if (!is_perc_modified) trt.add(remainder.string(),4);
TToken_string& trt = add_rata(is_perc_modified ? imp : (real) 0.0,
oldscad, oldtype, oldulc);
if (!is_perc_modified) trt.add(imp.string(),4);
if (_inited)
{
TDate dd = data_rata(row);
@ -952,8 +989,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
for (int k = first; k < nr; k++)
{
nscd = oldscad;
type = _def_tpr;
TString16 ulc(_def_ulc);
type = oldtype;
TString16 ulc(oldulc);
if (srate.items() > k)
{
@ -982,12 +1019,14 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
{
// se c'e' la vecchia rata si tengono i parametri
// altrimenti si calcolano
TString16 ulc(oldulc);
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));
ulc = trt.get(5);
if (type == 0) type = 1;
if (j > 0 && nscd == 0) nscd = oldscad;
if (_inited && dd == lastdate && j > frs)
@ -1003,7 +1042,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real imp(newv);
TToken_string& ttr = set_rata(j, is_perc_modified ? imp : ZERO,
nscd, type);
nscd, type, ulc);
if (_inited)
ttr.add(dd.string(), 3);
if (!is_perc_modified)
@ -1044,13 +1083,15 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
basta = TRUE;
}
// se c'e' la vecchia rata si tengono i parametri
// altrimenti si calcolano
// altrimenti si calcolano
TString16 ulc(oldulc);
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));
ulc = trt.get(5);
if (type == 0) type = 1;
if (j > 0 && nscd == 0) nscd = oldscad;
if (_inited && dd == lastdate && j > 0)
@ -1060,7 +1101,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
next_scad(dd,nscd,mcomm,j);
TToken_string& ttr = set_rata(j, is_perc_modified ? newv : ZERO,
nscd, type);
nscd, type, ulc);
if (_inited)
ttr.add(dd.string(), 3);
if (!is_perc_modified)
@ -1166,8 +1207,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
rsum -= _secndr;
}
lastdate = data_rata(i);
oldtype = tipo_rata(i);
if (scad_rata(i) > 0) oldscad = scad_rata(i);
// oldtype = tipo_rata(i);
// if (scad_rata(i) > 0) oldscad = scad_rata(i);
if (_inited && i > 0)
{
if (data_rata(i) <= data_rata(i-1))

View File

@ -103,6 +103,7 @@ public:
void set_rate_differenziate(int v);
void set_tipo_prima_rata(int v, int sscad = -1);
void set_percrata(int n, real r);
void set_datarata(int n, const TDate & d);
real recalc_percrata(int i);
void set_numero_rate(int n, int sscad = -1, int rdiff = 1);