Stampa EC: corretta gestione riporti

git-svn-id: svn://10.65.10.50/trunk@2279 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-12-12 13:37:30 +00:00
parent fb74dc3723
commit 82fccf970c
4 changed files with 267 additions and 176 deletions

View File

@ -35,9 +35,12 @@ class TEC_form : public TForm
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
word _num_rip; // Numero di righe usate per i riporti
protected:
void stampa_testata(TPrinter& p);
void stampa_riporti(TPrinter& p);
static void ec_header_handler(TPrinter& p);
static void ec_footer_handler(TPrinter& p);
@ -54,9 +57,10 @@ public:
bool in_valuta() const { return _in_valuta; }
const TString& describe(short id, char sez = 'B') const;
void azzera_totali();
bool print_game(const TPartita& game);
TEC_form(const TEC_mask& m);
TEC_form(const TEC_mask& m, bool gesval);
virtual ~TEC_form();
};
@ -81,7 +85,7 @@ class TEC_row : public TSortable
TString _num_doc; // Numero documento
long _num_prot; // Protocollo IVA
TImporto _importo; // Importo in valuta
TImporto _importo_lire; // Importo in lire
real _importo_lire; // Importo in lire
real _scaduto; // Importo scaduto
real _esposto; // Importo esposto
bool _salvo_buon_fine; // Importo esposto salvo buon fine
@ -99,12 +103,14 @@ public:
void reset_causale() { _causale.cut(0); _descrizione.cut(0); }
void descrizione(const char* s) { _descrizione = s; }
void importo(const TImporto& i) { _importo = i; }
void importo_lire(const real& i) { _importo_lire = i; }
void scaduto(const real& s) { _scaduto = s; }
void esposto(const real& e) { _esposto = e; }
void salvo_buon_fine(bool sbf) { _salvo_buon_fine = sbf; }
const TDate& data() const { return _data; }
const TImporto& importo() const { return _importo; }
const real& importo_lire() const { return _importo_lire; }
real scaduto() const { return _scaduto; }
real esposto() const { return _esposto; }
const TValuta& valuta() const { return _valuta; }
@ -233,6 +239,9 @@ void TEC_row::print_on(TPrint_section& body)
TForm_item& esposto = body.find_field(PEC_ESPOSTO);
set_imp(esposto, _esposto, valuta);
TForm_item& lire = body.find_field(PEC_IMPLIRE);
lire.set(_importo_lire.string());
TForm_item& sbf = body.find_field(PEC_SBF);
sbf.set(_salvo_buon_fine ? "*" : " ");
@ -393,6 +402,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() && row.in_valuta();
const char sezione = row.get_char(PART_TIPOCF) == 'C' ? 'D' : 'A';
if (row.is_fattura())
{
@ -408,6 +418,12 @@ void TEC_array::add_row(const TRiga_partite& row)
const real s = calcola_scaduto(rata, in_valuta);
rec.scaduto(s);
}
if (in_valuta)
{
TImporto il = rata.importo(FALSE);
il.normalize(sezione);
rec.importo_lire(il.valore());
}
}
}
}
@ -416,7 +432,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)); // Importo pulito (senza abbuoni ecc.)
const TImporto imp(row.importo(in_valuta, 0x1)); // Importo pulito senza nient'altro
TEC_row& riga = new_row(row, data, imp, 1);
const int tipo_pag = row.get_int(PART_TIPOPAG);
@ -452,15 +468,34 @@ void TEC_array::add_row(const TRiga_partite& row)
const TImporto abbuoni(row.importo(in_valuta, 0x2));
if (!abbuoni.is_zero())
{
TEC_row& r = new_row(row, data, abbuoni, 2);
r.descrizione(form().describe(302));
TEC_row& rec = new_row(row, data, abbuoni, 2);
rec.descrizione(form().describe(302));
if (in_valuta)
{
TImporto il(row.importo(FALSE, 0x2));
il.normalize(sezione);
rec.importo_lire(il.valore());
}
}
const TImporto diffcam(row.importo(in_valuta, 0x4));
if (!diffcam.is_zero())
{
TEC_row& r = new_row(row, data, diffcam, 3);
r.descrizione(form().describe(303));
TEC_row& rec = new_row(row, data, diffcam, 3);
rec.descrizione(form().describe(303));
if (in_valuta)
{
TImporto il(row.importo(FALSE, 0x4));
il.normalize(sezione);
rec.importo_lire(il.valore());
}
}
const TImporto ritenute(row.importo(in_valuta, 0x8));
if (!ritenute.is_zero())
{
TEC_row& r = new_row(row, data, ritenute, 4);
r.descrizione(form().describe(304));
}
}
}
@ -495,14 +530,28 @@ TEC_array::TEC_array(const TPartita& game, const TEC_form* f)
// Form speciale per estratti conto
///////////////////////////////////////////////////////////
void TEC_form::ec_header_handler(TPrinter& pr)
void TEC_form::stampa_testata(TPrinter& pr)
{
TPrint_section& head = _form->section('H');
head.reset();
pr.resetheader();
TPrint_section& head = section('H');
TForm_item& pagina = head.find_field(PEC_PAGINA);
TString16 pg; pg << int(pr.getcurrentpage());
pagina.set(pg);
head.update();
for (word j = 0; j < head.height(); j++)
const word r = head.height()-1;
TPrintrow& head_row = head.row(r-1);
TPrint_section& body = section('B');
for (int f = body.fields()-1; f >= 0; f--)
{
// Leggi lo special e stampalo
TForm_item& fi = body.field(f);
head_row.put(fi.key(), offset_x() + fi.x());
}
for (word j = 0; j <= r; j++)
pr.setheaderline(j, head.row(j));
}
@ -517,37 +566,34 @@ static int tot_compare(const void* o1, const void* o2)
return stricmp(h1->key(), h2->key());
}
void TEC_form::ec_footer_handler(TPrinter& pr)
void TEC_form::stampa_riporti(TPrinter& pr)
{
TPrint_section& foot = _form->section('F');
pr.resetfooter();
const word MAXTOT = 16;
THash_object* tot[MAXTOT];
// I totali sono in un assoc array disordinato per cui li copio in un array e li ordino
// alfabeticamente in base al loro codice valuta
TTotalizer& totali = _form->totali();
totali.restart();
TTotalizer& arr = totali();
arr.restart();
word numtot = 0;
for (THash_object* obj = totali.get_hashobj();
numtot < MAXTOT && obj != NULL;
obj = totali.get_hashobj())
tot[numtot++] = obj;
qsort(tot, numtot, sizeof(THash_object*), tot_compare);
_num_rip = 0;
for (THash_object* obj = arr.get_hashobj();
_num_rip < MAXTOT && obj != NULL;
obj = arr.get_hashobj())
tot[_num_rip++] = obj;
qsort(tot, _num_rip, sizeof(THash_object*), tot_compare);
const word maxtot = foot.height() / _form->_footer_used;
if (numtot > maxtot)
numtot = maxtot;
const TString& riporto = _form->describe(301, 'F');
const word maxtot = section('F').height();
if (_num_rip > maxtot)
_num_rip = maxtot;
const TString& riporto = describe(301, 'F');
TString desc(80);
TPrint_section& body = _form->section('B');
for (word j = 0; j < numtot; j++)
TPrint_section& body = section('B');
for (word j = 0; j < _num_rip; j++)
{
const word line = j * _form->_footer_used;
const TString& key = tot[j]->key();
TTotal& t = (TTotal&)(tot[j]->obj());
@ -557,13 +603,30 @@ void TEC_form::ec_footer_handler(TPrinter& pr)
TEC_row rip(desc, t.importo().normalize());
rip.scaduto(t.scaduto());
rip.esposto(t.esposto());
rip.importo_lire(t.importo_lire());
rip.print_on(body);
for (int fl = 0; fl < _form->_footer_used; fl++)
pr.setfooterline(line, body.row(fl));
pr.setfooterline(j, body.row(0));
}
}
void TEC_form::ec_header_handler(TPrinter& pr)
{
pr.resetheader();
_form->stampa_testata(pr);
}
void TEC_form::ec_footer_handler(TPrinter& pr)
{
pr.resetfooter();
if (_form->page(pr) > 0) // Normal page
_form->stampa_riporti(pr);
}
void TEC_form::azzera_totali()
{
totali().destroy();
_num_rip = 0;
}
bool TEC_form::print_game(const TPartita& game)
{
@ -577,7 +640,7 @@ bool TEC_form::print_game(const TPartita& game)
TPrint_section& body = section('B');
TImporto saldo;
real scaduto, esposto;
real scaduto, esposto, implire;
// Stampa le righe di partita
@ -589,7 +652,15 @@ bool TEC_form::print_game(const TPartita& game)
TEC_row& riga = righe.row(r);
if (pr.rows_left() < body.height())
{
pr.formfeed();
for (word nr = 0; nr < _num_rip; nr++)
{
TPrintrow* fl = pr.getfooterline(nr);
CHECKD(fl, "Manca la riga di riporto ", nr);
pr.print(*fl);
}
}
const int ri = riga.riga();
const int ra = riga.rata();
@ -601,11 +672,13 @@ bool TEC_form::print_game(const TPartita& game)
riga.print_on(body);
pr.print(body.row(0));
totali().add(riga.importo(), riga.scaduto(), riga.esposto(), riga.valuta().codice());
totali().add(riga.importo(), riga.scaduto(), riga.esposto(),
riga.importo_lire(), riga.valuta().codice());
saldo += riga.importo();
scaduto += riga.scaduto();
esposto += riga.esposto();
implire += riga.importo_lire();
ok = TRUE;
}
@ -616,6 +689,7 @@ bool TEC_form::print_game(const TPartita& game)
TEC_row sld(describe(301), saldo);
sld.scaduto(scaduto);
sld.esposto(esposto);
sld.importo_lire(implire);
sld.print_on(body);
pr.print(body.row(0));
@ -632,15 +706,15 @@ const TString& TEC_form::describe(short id, char sez) const
return fi.prompt();
}
TEC_form::TEC_form(const TEC_mask& m)
TEC_form::TEC_form(const TEC_mask& m, bool gesval)
: TForm(BASE_EC_PROFILE, m.get_prof_code()),
_in_valuta(FALSE), _footer_used(1),
_in_valuta(FALSE), _num_rip(0),
_causali(LF_CAUSALI, CAU_CODCAUS, CAU_DESCR)
{
_form = this;
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
_in_valuta = gesval && imp_lire.shown(); // Il profilo e' in valuta se c'e' la colonna importo in lire
_lingua = m.get_prof_lang(); // Lingua profilo
@ -655,18 +729,21 @@ TEC_form::TEC_form(const TEC_mask& m)
TPrinter& pr = printer();
pr.setheaderhandler(ec_header_handler);
TPrint_section& head = section('H');
pr.headerlen(section('H').height());
TForm_item& luogo_invio = head.find_field(PEC_LUOGOIN);
luogo_invio.set(m.get(F_LUOGOSEND));
TForm_item& data_invio = head.find_field(PEC_DATAIN);
data_invio.set(m.get(F_DATASEND));
TForm_item& testo_memo = head.find_field(PEC_MEMO);
testo_memo.set("Per favore pagatemi che sono alla frutta!");
pr.setfooterhandler(ec_footer_handler);
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()
@ -767,7 +844,7 @@ bool TStampaEC_application::print_ec()
if (!ok) // Cliente analfabeta
return FALSE;
f.totali().destroy(); // Azzera totali di fine pagina
f.azzera_totali(); // Azzera totali di fine pagina
// Filtra solo le partite del cliente selezionato
TLocalisamfile& partite = _file[LF_PARTITE];
@ -818,6 +895,9 @@ bool TStampaEC_application::print_ec()
partite.put(PART_NRIGA, 9999);
}
if (one_printed)
form().set_last_page(TRUE);
return TRUE;
}
@ -859,7 +939,7 @@ bool TStampaEC_application::menu(MENU_TAG)
TEC_mask& m = mask();
while (m.run() != K_QUIT)
{
_form = new TEC_form(m);
_form = new TEC_form(m, _gesval);
print_selected();

View File

@ -5,12 +5,13 @@
// Totalizzatore
///////////////////////////////////////////////////////////
TTotal::TTotal(const TImporto& imp, const real& sca, const real& esp)
: _importo(imp), _scaduto(sca), _esposto(esp)
TTotal::TTotal(const TImporto& imp, const real& sca,
const real& esp, const real& lit)
: _importo(imp), _scaduto(sca), _esposto(esp), _importo_lire(lit)
{ }
void TTotalizer::add(const TImporto& imp, const real& sca,
const real& esp, const TString& val)
const real& esp, const real& lit, const TString& val)
{
TString16 codice(val);
if (codice == "LIT")
@ -23,10 +24,11 @@ void TTotalizer::add(const TImporto& imp, const real& sca,
tot.importo() += imp;
tot.scaduto() += sca;
tot.esposto() += esp;
tot.importo_lire() += lit;
}
else
{
obj = new TTotal(imp, sca, esp);
obj = new TTotal(imp, sca, esp, lit);
TAssoc_array::add(codice, obj);
}
}

View File

@ -20,16 +20,20 @@ class TTotal : public TObject
TImporto _importo;
real _scaduto;
real _esposto;
real _importo_lire;
public:
const TImporto& importo() const { return _importo; }
const real& importo_lire() const { return _importo_lire; }
const real& scaduto() const { return _scaduto; }
const real& esposto() const { return _esposto; }
TImporto& importo() { return _importo; }
real& importo_lire() { return _importo_lire; }
real& scaduto() { return _scaduto; }
real& esposto() { return _esposto; }
TTotal(const TImporto& imp, const real& scaduto, const real& esposto);
TTotal(const TImporto& imp, const real& scaduto,
const real& esposto, const real& implire);
virtual ~TTotal() {}
};
@ -37,7 +41,7 @@ class TTotalizer : public TAssoc_array
{
public:
void add(const TImporto& imp, const real& scaduto,
const real& esposto, const TString& val);
const real& esposto, const real& implire, const TString& val);
TTotalizer() { }
virtual ~TTotalizer() { }

View File

@ -1,6 +1,10 @@
#ifndef __SC21PEC_H
#define __SC21PEC_H
#define PEC_LUOGOIN 101
#define PEC_DATAIN 102
#define PEC_MEMO 103
#define PEC_CODCAUS 201
#define PEC_DESCR1 202
#define PEC_DESCR2 203
@ -18,5 +22,6 @@
#define PEC_IMPLIRE 215
#define PEC_CAMBIO 216
#define PEC_DATACAM 217
#define PEC_PAGINA 218
#endif