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

@ -91,9 +91,13 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k)
{ {
const int prev = r - 1; 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); 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.adjust_fixed_scad();
pag.set_sheet(ps); pag.set_sheet(ps);
rws = ps.rows_array(); rws = ps.rows_array();
@ -383,20 +387,20 @@ bool TPrimanota_application::recalc_handler(TMask_field& f, KEY key)
{ {
if (key == K_SPACE) if (key == K_SPACE)
{ {
const bool on = f.get().not_empty(); const bool recalc_aut = f.get().not_empty();
const TMask& m = f.mask(); const TMask& m = f.mask();
TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET); TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET);
ps.enable_column(3, on); ps.enable_column(3, recalc_aut);
ps.sheet_mask().enable(DLG_DELREC, !on); ps.sheet_mask().enable(DLG_DELREC, !recalc_aut);
TPagamento& pag = app().pagamento(); TPagamento& pag = app().pagamento();
if (pag.tipo_prima_rata() >= 4) if (pag.tipo_prima_rata() >= 4)
{ {
ps.enable_cell(0, 1, !on); ps.enable_cell(0, 1, !recalc_aut);
ps.enable_cell(0, 2, !on); ps.enable_cell(0, 2, !recalc_aut);
if (on) if (recalc_aut)
ps.disable_cell(0, 3); ps.disable_cell(0, 3);
ps.force_update(0);
} }
ps.force_update();
} }
return TRUE; 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) 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(); TPagamento& pag = app().pagamento();
if (pag.in_valuta()) 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) 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(); TPagamento& pag = app().pagamento();
if (pag.in_valuta()) if (pag.in_valuta())

View File

@ -201,7 +201,9 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
div.round(_round); div.round(_round);
real perc = (100.0 * div) / tot; real perc = (100.0 * div) / tot;
real rem(tot); real rem(tot);
real p(perc);
p.round(2);
for (i = first; i < n; i++) for (i = first; i < n; i++)
{ {
if (i > first) if (i > first)
@ -211,12 +213,16 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
set_imprata (i, div); set_imprata (i, div);
rem -= tpay_rata(i); rem -= tpay_rata(i);
} }
else
rem -= p;
set_percrata(i, perc); set_percrata(i, perc);
} }
if (_inited && _tpr > 0 && _tpr < 4) if (_inited && _tpr > 0 && _tpr < 4)
set_imprata(0, tpay_rata(0) + _secndr); set_imprata(0, tpay_rata(0) + _secndr);
if (_inited && rem != ZERO) if (rem != ZERO)
{
if (_inited)
{ {
real r(tpay_rata(first) + rem); real r(tpay_rata(first) + rem);
set_imprata(first, r); set_imprata(first, r);
@ -224,6 +230,13 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
r -= _secndr; r -= _secndr;
set_percrata(first, 100 * r / tot); set_percrata(first, 100 * r / tot);
} }
else
{
const real r(perc_rata(first) + rem);
set_percrata(first, r);
}
}
} }
else if (nr > first + 1) 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 perc = (100.0 * div)/tot;
real rem(rest); real rem(rest);
real p(perc);
p.round(2);
for (i = 1; i < n; i++) for (i = 1; i < n; i++)
{ {
if (i >= nr) if (i >= nr)
@ -252,9 +267,13 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
set_imprata (i, div); set_imprata (i, div);
rem -= tpay_rata(i); rem -= tpay_rata(i);
} }
else
rem -= p;
set_percrata(i, perc); set_percrata(i, perc);
} }
if (_inited && rem != ZERO) if (rem != ZERO)
{
if (_inited)
{ {
real r(tpay_rata(first) + rem); real r(tpay_rata(first) + rem);
set_imprata(first, r); set_imprata(first, r);
@ -262,6 +281,13 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
r -= _secndr; r -= _secndr;
set_percrata(first, 100 * r / tot); set_percrata(first, 100 * r / tot);
} }
else
{
const real r(perc_rata(first) + rem);
set_percrata(first, r);
}
}
} }
} }
} }
@ -472,6 +498,12 @@ void TPagamento::set_percrata(int i, real r)
tt.add(r.string(), 1); 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 TPagamento::recalc_percrata(int i)
{ {
real hm(_tpr < 4 ? _firstr : _secndr); 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; if (_rate.items() == 0) return P_OK;
real rsum(0.0), newv(0.0), rmax(0.0); real rsum(0.0), newv(0.0), rmax(0.0);
int oldtype = tipo_rata(0); const int last_rata = _rate.items() - 1;
TString oldulc = ulc_rata(0); int oldtype = tipo_rata(last_rata);
int oldscad = scad_rata(0); TString oldulc = ulc_rata(last_rata);
int oldscad = scad_rata(last_rata);
TDate lastdate = data_rata(0); TDate lastdate = data_rata(0);
int first = _tpr < 4 ? 0 : 1; int first = _tpr < 4 ? 0 : 1;
TString_array srate(_rate); // rate come erano TString_array srate(_rate); // rate come erano
if (srate.items() > 1) // if (srate.items() > 1)
{ // {
// calcola defaults per tipo pagamento e scadenza // calcola defaults per tipo pagamento e scadenza
// nel caso di rate nuove // nel caso di rate nuove
oldscad = scad_rata(srate.items() - 1); // oldscad = scad_rata(srate.items() - 1);
if (_mcomm) // if (_mcomm)
{ // {
int mesi = oldscad / 30; // int mesi = oldscad / 30;
if (mesi == 0) mesi = 1; // if (mesi == 0) mesi = 1;
oldscad = 30 * mesi; // oldscad = 30 * mesi;
} // }
} // }
if (oldscad <= 0) oldscad = _int_rate; if (oldscad <= 0) oldscad = _int_rate;
if (oldtype <= 0) oldtype = _def_tpr; if (oldtype <= 0) oldtype = _def_tpr;
@ -847,10 +880,14 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
{ {
// cancella tutte le rate successive, aggiungi un'unica rata // 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)) if (row < (srate.items()-1))
{ {
TToken_string& trt = rata(row+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++) for(int j = row+2; j < srate.items(); j++)
_rate.destroy(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++) for(int j = row+1; j < srate.items(); j++)
_rate.destroy(j); _rate.destroy(j);
TToken_string& trt = add_rata(is_perc_modified ? remainder : (real) 0.0, TToken_string& trt = add_rata(is_perc_modified ? imp : (real) 0.0,
oldscad, oldtype); oldscad, oldtype, oldulc);
if (!is_perc_modified) trt.add(remainder.string(),4); if (!is_perc_modified) trt.add(imp.string(),4);
if (_inited) if (_inited)
{ {
TDate dd = data_rata(row); 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++) for (int k = first; k < nr; k++)
{ {
nscd = oldscad; nscd = oldscad;
type = _def_tpr; type = oldtype;
TString16 ulc(_def_ulc); TString16 ulc(oldulc);
if (srate.items() > k) 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 // se c'e' la vecchia rata si tengono i parametri
// altrimenti si calcolano // altrimenti si calcolano
TString16 ulc(oldulc);
if (j < srate.items()) if (j < srate.items())
{ {
TToken_string& trt = (TToken_string&)srate[j]; TToken_string& trt = (TToken_string&)srate[j];
if (_inited) dd = trt.get(3); if (_inited) dd = trt.get(3);
type = atoi(trt.get(2)); type = atoi(trt.get(2));
nscd = atoi(trt.get(0)); nscd = atoi(trt.get(0));
ulc = trt.get(5);
if (type == 0) type = 1; if (type == 0) type = 1;
if (j > 0 && nscd == 0) nscd = oldscad; if (j > 0 && nscd == 0) nscd = oldscad;
if (_inited && dd == lastdate && j > frs) if (_inited && dd == lastdate && j > frs)
@ -1003,7 +1042,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
real imp(newv); real imp(newv);
TToken_string& ttr = set_rata(j, is_perc_modified ? imp : ZERO, TToken_string& ttr = set_rata(j, is_perc_modified ? imp : ZERO,
nscd, type); nscd, type, ulc);
if (_inited) if (_inited)
ttr.add(dd.string(), 3); ttr.add(dd.string(), 3);
if (!is_perc_modified) if (!is_perc_modified)
@ -1045,12 +1084,14 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
} }
// 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
TString16 ulc(oldulc);
if (j < srate.items()) if (j < srate.items())
{ {
TToken_string& trt = (TToken_string&)srate[j]; TToken_string& trt = (TToken_string&)srate[j];
if (_inited) dd = trt.get(3); if (_inited) dd = trt.get(3);
type = atoi(trt.get(2)); type = atoi(trt.get(2));
nscd = atoi(trt.get(0)); nscd = atoi(trt.get(0));
ulc = trt.get(5);
if (type == 0) type = 1; if (type == 0) type = 1;
if (j > 0 && nscd == 0) nscd = oldscad; if (j > 0 && nscd == 0) nscd = oldscad;
if (_inited && dd == lastdate && j > 0) 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); next_scad(dd,nscd,mcomm,j);
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, ulc);
if (_inited) if (_inited)
ttr.add(dd.string(), 3); ttr.add(dd.string(), 3);
if (!is_perc_modified) if (!is_perc_modified)
@ -1166,8 +1207,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
rsum -= _secndr; rsum -= _secndr;
} }
lastdate = data_rata(i); lastdate = data_rata(i);
oldtype = tipo_rata(i); // oldtype = tipo_rata(i);
if (scad_rata(i) > 0) oldscad = scad_rata(i); // if (scad_rata(i) > 0) oldscad = scad_rata(i);
if (_inited && i > 0) if (_inited && i > 0)
{ {
if (data_rata(i) <= data_rata(i-1)) if (data_rata(i) <= data_rata(i-1))

View File

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