Corretta gestione valuta e totali

git-svn-id: svn://10.65.10.50/trunk@2273 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-12-11 17:38:54 +00:00
parent 780df3a079
commit ba19f86e6e

View File

@ -29,12 +29,13 @@ class TEC_form : public TForm
TCursor* _cursore;
TTotalizer _totali;
TDecoder _causali;
TDecoder _causali; // Decodoficatore dei codici causale
TString _lingua;
TDate _dlo, _dls, _dir;
int _giorni_rischio;
bool _in_valuta;
TString _lingua; // Codice lingua del form
TDate _dlo, _dls, _dir; // Data limite operazione, scaduto e inizio rischio
int _giorni_rischio; // Numero giorni rischio nella maschera di selezione
bool _in_valuta; // Il form e' in valuta
int _footer_used; // Numero di righe per ogni valuta del footer
protected:
static void ec_header_handler(TPrinter& p);
@ -89,11 +90,13 @@ class TEC_row : public TSortable
protected: // TSortable
virtual int compare(const TSortable& s) const;
void set_imp(TForm_item& fi, const real& imp, bool valuta) const;
public:
int riga() const { return _riga; }
int rata() const { return _rata; }
void reset_causale() { _causale.cut(0); _descrizione.cut(0); }
void descrizione(const char* s) { _descrizione = s; }
void importo(const TImporto& i) { _importo = i; }
void scaduto(const real& s) { _scaduto = s; }
@ -105,6 +108,7 @@ public:
real scaduto() const { return _scaduto; }
real esposto() const { return _esposto; }
const TValuta& valuta() const { return _valuta; }
bool in_valuta() const { return _valuta.in_valuta(); }
void print_on(TPrint_section& body);
@ -153,9 +157,36 @@ int TEC_row::compare(const TSortable& s) const
return c;
}
void TEC_row::set_imp(TForm_item& fi, const real& imp, bool valuta) const
{
TString old_picture;
if (valuta)
{
old_picture = fi.picture();
TString new_picture(20);
new_picture = old_picture;
if (old_picture.find(',') > 0)
new_picture << ".###";
else
new_picture << ",###";
fi.set_picture(new_picture);
}
fi.set(imp.string());
if (valuta)
{
fi.set_picture(old_picture);
}
}
void TEC_row::print_on(TPrint_section& body)
{
TEC_form& form = (TEC_form&)body.form();
const bool valuta = form.in_valuta() && in_valuta();
TForm_item& causale = body.find_field(PEC_CODCAUS);
causale.set(_causale);
@ -187,20 +218,20 @@ void TEC_row::print_on(TPrint_section& body)
if (_importo.sezione() == 'D')
{
dare.set(imp.string());
set_imp(dare, imp, valuta);
avere.set("");
}
else
{
avere.set(imp.string());
set_imp(avere, imp, valuta);
dare.set("");
}
TForm_item& scaduto = body.find_field(PEC_SCADUTO);
scaduto.set(_scaduto.string());
set_imp(scaduto, _scaduto, valuta);
TForm_item& esposto = body.find_field(PEC_ESPOSTO);
esposto.set(_esposto.string());
set_imp(esposto, _esposto, valuta);
TForm_item& sbf = body.find_field(PEC_SBF);
sbf.set(_salvo_buon_fine ? "*" : " ");
@ -291,7 +322,8 @@ TImporto& TEC_array::importo_riga_scaduto(int n)
real TEC_array::calcola_scaduto(const TRiga_scadenze& rata, bool valuta)
{
const TPartita& game = rata.partita();
const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A';
TImporto scaduto_rata = rata.importo(TRUE);
int riga_corrente_scaduto = 0;
@ -302,8 +334,35 @@ real TEC_array::calcola_scaduto(const TRiga_scadenze& rata, bool valuta)
const TRectype& pag = rata.row(p);
const int nrigp = pag.get_int(PAGSCA_NRIGP);
const TRiga_partite& sum = game.riga(nrigp);
const tipo_movimento tm = sum.tipo();
const TImporto imp = importo(game, pag, valuta);
TImporto imp = importo(game, pag, valuta);
tipo_movimento tm = sum.tipo(); // Determina tipo riga
// Normalmente gli utenti non usano il tipo pagamento insoluto, per cui devo
// riconoscere i pagamenti che in realta' sono a fronte di insoluti:
// 1) hanno tipo movimento = tm_pagamento
// 2) ho gia' incontrato un insoluto
// 3) il saldo della rata e' a zero o sommando l'importo arriva sotto zero
if (tm == tm_pagamento && riga_corrente_scaduto != 0)
{
if (scaduto_rata.is_zero())
{
tm = tm_pagamento_insoluto;
}
else
{
TImporto p(scaduto_rata);
p += imp;
p.normalize(sezione);
if (p.valore() < ZERO)
{
scaduto_rata.set('D', ZERO);
imp += p;
tm = tm_pagamento_insoluto;
}
}
}
if (tm == tm_insoluto || tm == tm_pagamento_insoluto)
{
if (tm == tm_insoluto)
@ -318,7 +377,6 @@ real TEC_array::calcola_scaduto(const TRiga_scadenze& rata, bool valuta)
}
}
const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A';
scaduto_rata.normalize(sezione);
return scaduto_rata.valore();
}
@ -334,7 +392,7 @@ TEC_row& TEC_array::new_row(const TRiga_partite& row, const TDate& data,
void TEC_array::add_row(const TRiga_partite& row)
{
const bool in_valuta = form().in_valuta();
const bool in_valuta = form().in_valuta() && row.in_valuta();
if (row.is_fattura())
{
@ -358,7 +416,7 @@ void TEC_array::add_row(const TRiga_partite& row)
const TDate data(row.get(PART_DATAPAG));
if (data <= form().data_limite_operazione())
{
const TImporto imp(row.importo(in_valuta, 0x1));
const TImporto imp(row.importo(in_valuta, 0x1)); // Importo pulito (senza abbuoni ecc.)
TEC_row& riga = new_row(row, data, imp, 1);
const int tipo_pag = row.get_int(PART_TIPOPAG);
@ -372,7 +430,7 @@ void TEC_array::add_row(const TRiga_partite& row)
if (gr > 0)
{
const TDate& dir = form().data_inizio_rischio();
sbf = data_pag >= dir && data_pag <= dls;
sbf = data_pag > dir && data_pag <= dls;
riga.salvo_buon_fine(sbf); // Esposto salvo buon fine
}
@ -479,39 +537,30 @@ void TEC_form::ec_footer_handler(TPrinter& pr)
tot[numtot++] = obj;
qsort(tot, numtot, sizeof(THash_object*), tot_compare);
const word maxtot = foot.height() / 3;
const word maxtot = foot.height() / _form->_footer_used;
if (numtot > maxtot)
numtot = maxtot;
const TString& riporto = _form->describe(301, 'F');
TString desc(80);
TPrint_section& body = _form->section('B');
for (word j = 0; j < numtot; j++)
{
const word line = j*3;
const word line = j * _form->_footer_used;
const TString& key = tot[j]->key();
TTotal& t = (TTotal&)(tot[j]->obj());
desc = _form->describe(301, 'F');
desc = riporto;
if (key.not_empty())
desc << ' ' << key;
TEC_row rip(desc, t.importo().normalize());
rip.print_on(body);
pr.setfooterline(line, body.row(0));
desc = _form->describe(302, 'F');
desc << ' ' << _form->data_limite_scaduto();
rip.descrizione(desc);
rip.importo(TImporto('D', ZERO));
rip.scaduto(t.scaduto());
rip.print_on(body);
pr.setfooterline(line+1, body.row(0));
desc = _form->describe(303, 'F');
rip.descrizione(desc);
rip.scaduto(ZERO);
rip.esposto(t.esposto());
rip.print_on(body);
pr.setfooterline(line+2, body.row(0));
for (int fl = 0; fl < _form->_footer_used; fl++)
pr.setfooterline(line, body.row(fl));
}
}
@ -531,13 +580,24 @@ bool TEC_form::print_game(const TPartita& game)
real scaduto, esposto;
// Stampa le righe di partita
int ultima_riga = 0;
int ultima_rata = 0;
for (int r = 0; r < righe.items(); r++)
{
TEC_row& riga = righe.row(r);
if (pr.rows_left() < body.height())
pr.formfeed();
const int ri = riga.riga();
const int ra = riga.rata();
if (ri == ultima_riga && ra == ultima_rata+1)
riga.reset_causale();
ultima_riga = ri;
ultima_rata = ra;
riga.print_on(body);
pr.print(body.row(0));
@ -573,12 +633,16 @@ const TString& TEC_form::describe(short id, char sez) const
}
TEC_form::TEC_form(const TEC_mask& m)
: TForm(BASE_EC_PROFILE, m.get_prof_code()), _in_valuta(FALSE),
: TForm(BASE_EC_PROFILE, m.get_prof_code()),
_in_valuta(FALSE), _footer_used(1),
_causali(LF_CAUSALI, CAU_CODCAUS, CAU_DESCR)
{
_form = this;
_lingua = m.get_prof_lang();
TForm_item& imp_lire = find_field('B', odd_page, PEC_IMPLIRE);
_in_valuta = imp_lire.shown(); // Il profilo e' in valuta se c'e' la colonna importo in lire
_lingua = m.get_prof_lang(); // Lingua profilo
TCursor_sheet& cs = m.cur_sheet();
_cursore = cs.cursor();
@ -594,7 +658,15 @@ TEC_form::TEC_form(const TEC_mask& m)
pr.headerlen(section('H').height());
pr.setfooterhandler(ec_footer_handler);
pr.footerlen(section('F').height());
const TPrint_section& foot = section('F');
pr.footerlen(foot.height());
for (int i = foot.fields()-1; i >= 0; i--)
{
TForm_item& fi = foot.field(i);
if (fi.y() > _footer_used)
_footer_used = fi.y();
}
}
TEC_form::~TEC_form()