campo-sirio/sc/sc2600.cpp
luca c97e8f48a3 Patch level :10.0 994
Files correlati     :sc2.exe
Ricompilazione Demo : [ ]
Commento            :
0001682: Stampa previsione incassi e pagamenti - in chiusura va in crash
Descrizione Stampa previsione incassi e pagamenti - Premendo il tasto fine dopo aver elaborato la stampa il pgm sc2.exe va in errore


git-svn-id: svn://10.65.10.50/branches/R_10_00@22069 c028cbd2-c16b-5b4b-a496-9718f37d4682
2011-05-04 10:37:25 +00:00

1088 lines
29 KiB
C++
Executable File

#include <printapp.h>
#include <utility.h>
#include <tabutil.h>
#include "../cg/cgsaldac.h"
#include "../cg/cglib02.h"
#include "sc2.h"
#include "sc2201.h"
#include "sc2600.h"
#include <clifo.h>
#include <nditte.h>
#include <pconti.h>
#include <textset.h>
class TPRSC_recordset : public TAS400_recordset
{
public:
TPRSC_recordset(const TString_array & colnames);
};
TPRSC_recordset::TPRSC_recordset(const TString_array & colnames) : TAS400_recordset("AS400(256,0,0)")
{
create_field("Cliente", 0, 6, _longfld);
create_field("RagioneSociale", -1, 50);
create_field("Valuta", -1, 3);
for (int i = 0; i < colnames.items(); i++)
create_field(colnames.row(i), -1, 15, _realfld);
create_field("Totale", -1, 15, _realfld);
create_field("Esposto", -1, 15, _realfld);
create_field("Saldo", -1, 15, _realfld);
create_field("Differenza", -1, 15, _realfld);
}
///////////////////////////////////////////////////////////
// Stampa prospetto scadenze
///////////////////////////////////////////////////////////
#define NUMERO_FASCE 9
// #define LIMITI {0, 30, 60, 90, 120, 150, 180, 210, 240, 270}
enum tipo_st {clienti=0, fornitori=1};
class TLineTotal : public TObject //Oggetto di base per i TAssoc_array dei totali
{
public:
real _s[NUMERO_FASCE];// Scaglioni scaduto
real _ns[NUMERO_FASCE];// Scaglioni a scadere
real _es; // esposto
real _sl; // saldo
virtual TObject* dup() const { return new TLineTotal(*this); }
virtual TLineTotal & copy(const TLineTotal & l);
virtual void zero();
TLineTotal(const TLineTotal* l) { copy(*l); }
TLineTotal() { zero();}
};
TLineTotal & TLineTotal::copy(const TLineTotal & l)
{
for (int i = 0; i < NUMERO_FASCE; i++)
{
_s[i] = l._s[i];
_ns[i] = l._ns[i];
}
_es=l._es;
_sl=l._sl;
return *this;
}
void TLineTotal::zero()
{
for (int i = 0; i < NUMERO_FASCE; i++)
{
_s[i] = ZERO;
_ns[i] = ZERO;
}
_es=ZERO;
_sl=ZERO;
}
class TProspettoScadenze : public TPrintapp
{
TRelation *_rel1, *_rel2; // Relazioni di lavoro...
int _cur1, _cur2, // Identificatori dei cursori di lavoro...
_cur3, _cur4;
TSelection_ext_mask *_m;
TLocalisamfile *_scad,*_pagsca;
TTable *_val;
tipo_st _tipost; // Tipo di stampa impostato
bool _end_printed,
_start,
_stvaluta,
_ordcod, // VERO=ordine per codice, FALSO=ordine per ragione sociale
_sinfasce,
_nsinfasce;
TString _anno,_numdoc,_protiva,_datadoc,_codval, _codvalsel,
_cod, _cod_pre, _des, _des_pre;
TDate _limop, _limscad, _datas, _limbf; // Data limite operazione, data limite scaduto e data di stampa
int _gcr, // Giorni per Calcolo Rischio (valido solo per stampa clienti)
_sfasce,
_nsfasce;
real _unsnc,_uns, _unsesp; // Unassigned per partita.
TArray _conti_cf, // array per conti mastro
_t, // Array per i totali
_ns_date, // Date per non scaduto
_s_date; // Date per lo scaduto
bool _excel;
TPRSC_recordset * _recset;
//static TString80 _last_game;
//static bool fil_function(const TRelation *);
TString_array _colnames;
int _limiti[NUMERO_FASCE];
public:
virtual bool preprocess_page(int file, int counter);
virtual bool open_print();
virtual void postclose_print();
virtual print_action postprocess_print(int file, int counter);
virtual print_action postprocess_page(int file, int counter);
virtual void close_print();
virtual void preprocess_header() {};
virtual void preprocess_footer() ;
virtual bool user_create();
virtual bool user_destroy();
virtual bool set_print(int);
virtual void set_page (int file, int counter);
void print_totali_rows(int nriga, bool what);
void export_totali_rows();
void print_totali(int nriga);
void print_header();
int calc_last_column();
void update_totals(bool what, real& esp, real s[NUMERO_FASCE], real ns[NUMERO_FASCE]);
void compute_unassigned(TPartita& p, const TDate & datalim);
void compute_all(TPartita& p);
void print_real(TString& dest, const real& num);
void riempi_conti_mastro(const char cf);
void calcola_saldo();
TProspettoScadenze();
};
static TString80 _last_game;
inline TProspettoScadenze& app() {return (TProspettoScadenze&)main_app();}
void TProspettoScadenze::print_real(TString& dest, const real& num)
{
const bool stampa_in_valuta = _stvaluta && !_codval.blank();
const TString& val = stampa_in_valuta ? _codval : EMPTY_STRING;
const TCurrency cur(num, val);
dest = cur.string(true);
dest.right_just(10);
}
bool fil_function(const TRelation *r)
{
TRectype& part = r->curr(LF_PARTITE);
TString80 key;
key.format("%03d%03d%06ld%4d",
part.get_int(PART_GRUPPO), part.get_int(PART_CONTO),
part.get_long(PART_SOTTOCONTO), part.get_int(PART_ANNO));
key << part.get(PART_NUMPART);
const bool rt = key != _last_game;
if (rt)
_last_game = key;
return rt;
}
void TProspettoScadenze::update_totals(bool what, real& esp,
real s[NUMERO_FASCE], real ns[NUMERO_FASCE])
{
TAssoc_array& a = (TAssoc_array&) _t[what];
TLineTotal *ll = (TLineTotal *) a.objptr(_codval);
if (ll == NULL)
{
ll = new TLineTotal;
a.add(_codval, ll);
}
for (int i = 0; i < NUMERO_FASCE; i++)
{
ll->_s[i] += s[i];
ll->_ns[i] += ns[i];
}
ll->_es += esp;
}
void TProspettoScadenze::compute_unassigned(TPartita& p, const TDate & datalim)
{
TRecord_array& ra = p.unassigned();
_uns = _unsnc = _unsesp = ZERO;
for (int r = ra.last_row(); r > 0; r = ra.pred_row(r))
{
const TRectype& rec = ra.row(r);
const TRiga_partite& sum = p.riga(rec.get_int(PAGSCA_NRIGP));
const char * field = (_stvaluta && sum.in_valuta() ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO);
const TDate & datascad = sum.get_date(PART_DATAPAG);
if ((datascad <= datalim))
{
if (sum.get_int(PART_TIPOMOV) == 2) // Is it a credit note ?
_unsnc += rec.get_real(field);
else
_uns += rec.get_real(field);
}
else
{
if (sum.get_int(PART_TIPOMOV) == 2) // Is it a credit note ?
_unsesp -= rec.get_real(field);
else
_unsesp += rec.get_real(field);
}
}
}
void TProspettoScadenze::compute_all(TPartita& p)
{
real residuo;
real s[NUMERO_FASCE];
real ns[NUMERO_FASCE];
real res_pagati;
real esposto;
compute_unassigned(p, _limbf);
esposto = _unsesp;
for (int r = p.last(); r > 0; r = p.pred(r)) // Browse all rows (partite)
{
const TRiga_partite& rp = p.riga(r);
// se la data di registrazione della partita ' > di _limop (data lim operazione)
// non deve scorrere le scadenze
const TDate data_reg(rp.get_date(PART_DATAREG));
if (data_reg > _limop) continue;
for (int n = rp.rate(); n > 0; n--) // Browse all rows (scadenze)
{
const TRiga_scadenze& rs = rp.rata(n);
const TDate d(rs.get_date(SCAD_DATASCAD));
const char* field = (_stvaluta && rs.in_valuta()) ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO;
const char* sfield = (_stvaluta && rs.in_valuta()) ? SCAD_IMPORTOVAL : SCAD_IMPORTO;
const char ssez = rp.sezione();
TImporto scd(ssez,rs.get_real(sfield)); // Importo in scadenza...
TImporto pag(rs.importo_pagato(_stvaluta)); // Quanto e' stato pagato per questa scadenza?
TImporto bf;
TImporto work_imp;
// Scorre le righe di pagamento per trovare la riga corripondente alla prima data pagamento
// di questa rata. Motivo: il primo pagamento delle rata corrente, effettuato tramite effetto
// (ai fini del calcolo B.F.) deve essere considerato con la data scadenza
const int lst = rs.last();
int prima_riga_pagamento = -1;
TDate first_date;// data relativa alla prima riga di pagamento
int pp;
for (pp = rs.first(); pp <= lst; pp = rs.succ(pp))
{
const TRiga_partite& sum = p.riga(pp);
TDate current_date(sum.get_date(PART_DATAPAG));
int tipo_pag = rs.get_int(SCAD_TIPOPAG);
const tipo_movimento tipomov = (tipo_movimento) sum.get_int(PART_TIPOMOV);
if (tipomov != tm_insoluto && tipo_pag >= 2 && tipo_pag <= 7) //Incasso tramite effetto
if (prima_riga_pagamento==-1 || first_date > current_date)
{
first_date = current_date;
prima_riga_pagamento = pp;
}
}
for (pp = rs.first(); pp <= lst; pp = rs.succ(pp)) // Browse all rows (pagamenti)
{
const TRectype pg = rs.row(pp);
const TRiga_partite& sum = p.riga(pp);
const char sez = sum.sezione();
const int tipomov = sum.get_int(PART_TIPOMOV);
// se tipomov e' 2 (Nota di credito assegnata)
// storna da scdz. In entrambi i casi si ha l'operatore +=, perche' nel TImporto e' gia'
// compresa la sezione opposta
if (tipomov == tm_nota_credito)
{
work_imp = TImporto(sez,pg.get_real(field));
scd += work_imp;
pag -= work_imp;
}
if ((tipomov == tm_pagamento || tipomov == tm_pagamento_insoluto) && _tipost == clienti)
{
TDate data_pag(sum.get_date(PART_DATAPAG));
int tipo_pag = sum.get_int(PART_TIPOPAG);
if (tipo_pag>=2 && tipo_pag<=7 && data_pag.ok()) //Incasso tramite effetto
{
if (prima_riga_pagamento > -1 && prima_riga_pagamento == pp)
data_pag = d; // Se e' il primo pagamento(in ordine di data) di questa rata
// prende la data di scadenza relativa.
if (data_pag > _limbf) // && data_pag <= _limscad)
bf += TImporto(sez,pg.get_real(field));
}
}
}
const char scd_sez = (_tipost == fornitori ? 'A' : 'D');
const char pag_sez = (_tipost == fornitori ? 'D' : 'A');
scd.normalize(scd_sez);
real rscd = scd.valore();
pag -= bf;
pag.normalize(pag_sez);
real rpag = pag.valore();
real res = rscd - rpag; // Scadenze - pagati = scaduto per questo gruppo di rate
if (_uns > ZERO) // Rettifica i pagamenti con i non assegnati (calcolo sul residuo: scadenza-pagamento)
{
real gap = (_uns > res ? res : _uns); // questo e' quanto manca per completare questa scadenza
res -= gap;
_uns -= gap; // aggiorna la cache..
}
if (_unsnc > ZERO) // Rettifica le scadenze con le N.C non assegnate.
{
real gap = (_unsnc > rscd ? rscd : _unsnc);
rscd -= gap;
_unsnc -= gap;
}
if (rscd == ZERO) // Se le scadenze sono a zero, vuol dire che sono state stornate
res = ZERO; // da qualche nota di credito o non assegnato percio' non si ha residuo
if (d > _limscad)
{
if (_nsinfasce)
{
for (int i = _nsfasce - 1; i >= 0; i--)
{
const TDate & limdate = (TDate&)_ns_date[i];
if (limdate.ok() && d > limdate)
{
ns[i] += res;
break;
}
}
}
else
ns[0] += res;
}
else
{
if (_sinfasce)
{
for (int i = _sfasce - 1; i >= 0; i--)
{
const TDate & limdate = (TDate&)_s_date[i];
if (limdate.ok() && d <= limdate)
{
s[i] += res;
break;
}
}
}
else
s[0] += res;
}
residuo += res;
bool sbf;
TImporto esp = rs.esposto(_stvaluta, _limscad, _limbf, sbf);
esposto += esp.valore();
}
}
// Aggiorna i totali...
update_totals(0, esposto, s, ns); // Singolo...
update_totals(1, esposto, s, ns); // ...Generale
}
void TProspettoScadenze::calcola_saldo()
{
TAssoc_array& a = (TAssoc_array&) _t[0];
TLineTotal *ll = (TLineTotal *) a.objptr(_codval);
TEsercizi_contabili e;
TSaldo saldo;
int g,c;
const long s = atol(_cod_pre);
for (int i = 0; i < _conti_cf.items(); i++)
{
TToken_string& cf = (TToken_string&)_conti_cf[i];
g = cf.get_int(0);
c = cf.get_int(1);
TToken_string key;
key.add(g); key.add(c); key.add("");
const TRectype& pc = cache().get(LF_PCON, key);
int indbil_conto = pc.get_int (PCN_INDBIL);
const int codes = e.date2esc(_limop);
saldo.set_annoes(codes);
TDate dataini(e.esercizio(codes).inizio());
saldo.data_limite_bilancio( 1, g, c, s, dataini, _limop, indbil_conto, false);
if (_tipost == fornitori)
ll->_sl -= saldo.saldo();
else
ll->_sl += saldo.saldo();
}
// aggiorno il totale generale
TAssoc_array& at = (TAssoc_array&) _t[1];
TLineTotal *lt = (TLineTotal *) at.objptr(_codval);
if (lt == NULL)
{
lt = new TLineTotal;
at.add(_codval, lt);
}
lt->_sl += ll->_sl;
}
bool TProspettoScadenze::preprocess_page(int file, int counter)
{
if (file == LF_PARTITE)
{
const TRectype& curr = current_cursor()->curr(file);
const TBill bill(curr);
const bool checked = _m->selected(bill);
if (!checked && !_end_printed) // Se non e' stato selezionato salta al prossimo record
return false;
// int nriga = 1;
if (_tipost == clienti || _tipost == fornitori)
{
const TRectype& clifo = current_cursor()->curr(LF_CLIFO);
_des = clifo.get(CLI_RAGSOC);
_cod = clifo.get(CLI_CODCF);
}
else
{
const TRectype& pcon = current_cursor()->curr(LF_PCON);
_des = pcon.get(PCN_DESCR);
_cod = pcon.get(PCN_GRUPPO);
_cod << " " << pcon.get(PCN_CONTO);
_cod << " " << pcon.get(PCN_SOTTOCONTO);
}
if (_cod != _cod_pre || _end_printed) // Controlla se e' cambiato il codice cli/fo/conto
{
reset_print();
if (((TAssoc_array&) _t[0]).items() > 0)
print_totali(1);
_des.trim();
_cod_pre = _cod;
_des_pre = _des;
}
if (!curr.empty())
{
TPartita p(curr);
//Pesca gli estremi dalla prima riga di fattura, che non e' necessariamente la riga #1
const int r = p.prima_fattura();
if (r > 0) //Skip next partita if no fatture!
{
TRiga_partite& rp = p.riga(r);
_anno = rp.get(PART_ANNO);
_anno.ltrim(2);
_numdoc = rp.get(PART_NUMDOC);
_protiva = rp.get(PART_PROTIVA);
_datadoc = (const char*) rp.get_date(PART_DATADOC);
_codval = (_stvaluta ? rp.get(PART_CODVAL): "");
if (_codval.empty()) _codval = " ";
// Now performing fulkrum...
compute_all(p);
}
current_cursor()->repos(); // Very, very necessary...
}
}
return true;
}
bool TProspettoScadenze::open_print()
{
if (_stvaluta)
{
const int err = _start ? _val->first() : _val->next();
if (err != NOERR)
return false;
}
_codvalsel = _val->get("CODTAB");
reset_files();
reset_print();
printer().footerlen(5);
if (_m->get_who() == 'C')
_tipost = clienti;
else
_tipost = fornitori;
riempi_conti_mastro(_m->get_who());
if (_m->get_key() == 1)
_ordcod = true;
else
_ordcod = false;
_end_printed = false;
_gcr = _m->get_int(F_GIORNI);
_datas = (const char *)(_m->get(F_DATASTAMPA));
_limop = (const char *)(_m->get(F_DATAOPERAZIONE));
_limscad = (const char *)(_m->get(F_DATASCADUTO));
_limbf = _limscad - (long)_gcr; // Limite inferiore per le scadenze a Buon Fine.
_sinfasce = _m->get_bool(F_SCADINFASCE);
_sfasce = _m->get_int(F_SCADFASCE);
_nsinfasce = _m->get_bool(F_ASCADINFASCE);
_nsfasce = _m->get_int(F_ASCADFASCE);
_s_date.destroy();
_ns_date.destroy();
for (int i = 0; i <= NUMERO_FASCE; i++)
{
_s_date.add(new TDate);
_ns_date.add(new TDate);
}
for (int j = 0; j <= _sfasce; j++)
{
TDate & d = (TDate &)_s_date[j];
d = _limscad;
d.addmonth(-_limiti[j]);
}
for (int k = 0; k <= _nsfasce; k++)
{
TDate & d = (TDate &)_ns_date[k];
d = _limscad;
d.addmonth(_limiti[k]);
}
_anno.cut(0);_numdoc.cut(0);_protiva.cut(0);_datadoc.cut(0);
_codval.cut(0);_cod.cut(0); _des.cut(0); _cod_pre.cut(0);
for (int it=0; it < _t.items(); it++)
{
TAssoc_array& aa = (TAssoc_array&)_t[it];
aa.destroy(); // Totali lineari (singolo e generale)
}
get_cursor(_cur1)->set_filterfunction(fil_function,true);
get_cursor(_cur2)->set_filterfunction(fil_function,true);
get_cursor(_cur3)->set_filterfunction(fil_function,true);
get_cursor(_cur4)->set_filterfunction(fil_function,true);
_last_game.cut(0);
TRectype filter_from(LF_PARTITE), filter_to(LF_PARTITE);
switch (_tipost)
{
case clienti:
case fornitori:
{
filter_from.put(PART_TIPOCF, _tipost == clienti ? 'C' : 'F');
filter_to = filter_from;
if (_ordcod)
{
long cli_first = 0, cli_last = 0;
_m->get_clifo_range(cli_first, cli_last);
if (cli_first > 0)
filter_from.put(PART_SOTTOCONTO, cli_first);
if (cli_last >= cli_first)
filter_to.put(PART_SOTTOCONTO, cli_last);
}
TString filter;
if (_stvaluta)
{
if (is_firm_value(_codvalsel))
filter << "(CODVAL==\"\")||";
filter << "(CODVAL==\"" << _codvalsel << "\")";
}
if (_ordcod) // Per codice...
{
select_cursor(_cur1);
get_cursor(_cur1)->setregion(filter_from, filter_to);
get_cursor(_cur1)->setfilter(filter);
}
else // ... e ragione sociale
{
select_cursor(_cur2);
get_cursor(_cur2)->setregion(filter_from, filter_to);
get_cursor(_cur2)->setfilter(filter);
}
add_file(LF_PARTITE);
add_file(LF_CLIFO,LF_PARTITE);
}
break;
default: break;
} // End of inner switch
if (_excel)
{
_colnames.destroy();
if (_sinfasce)
{
_colnames.add(format("Scaduto > %3d gg", _limiti[_sfasce] * 30));
for (int i = _sfasce; i > 0; i--)
_colnames.add(format("Scaduto <= %3d gg", _limiti[i] * 30));
}
else
_colnames.add("Scaduto");
if (_nsinfasce)
{
for (int i = 1; i <= _nsfasce; i++)
_colnames.add(format("A Scadere <= %3d gg", _limiti[i] * 30));
_colnames.add(format("A Scadere > %3d gg", _limiti[_nsfasce] * 30));
}
else
_colnames.add("A Scadere");
_recset = new TPRSC_recordset(_colnames);
}
_start = false ;
return true;
}
print_action TProspettoScadenze::postprocess_print(int file, int counter)
{
print_action rt = NEXT_PAGE;
if (!_end_printed)
{
if ((file == LF_PARTITE))
{
rt = REPEAT_PAGE;
_end_printed = true;
}
}
else
{
if (((TAssoc_array&) _t[0]).items() > 0)
{
print_totali(1);
print_one(0);
}
if (((TAssoc_array&) _t[1]).items() > 0)
{
print_totali_rows(1,1);
print_one(0);
}
}
return rt;
}
void TProspettoScadenze::postclose_print()
{
if (_excel)
{
TFilename xls; xls.tempdir(); xls.add("prosscad.xls");
_recset->save_as(xls, fmt_html);
xvt_sys_goto_url(xls, "open");
delete _recset;
_recset = NULL;
}
}
void TProspettoScadenze::close_print()
{
if (_stvaluta)
repeat_print();
}
print_action TProspettoScadenze::postprocess_page(int file, int counter)
{
return NEXT_PAGE;
}
bool TProspettoScadenze::user_create()
{
_rel1 = new TRelation(LF_PARTITE);
_rel1->add(LF_CLIFO,"TIPOCF=TIPOC|CODCF=SOTTOCONTO",1);
_cur1 = add_cursor(new TCursor(_rel1));
_cur2 = add_cursor(new TSorted_cursor(_rel1,"UPPER(20->RAGSOC)||NUMPART","",1));
_rel2 = new TRelation(LF_PARTITE);
_rel2->add(LF_PCON,"GRUPPO=GRUPPO|CONTO=CONTO|SOTTOCONTO=SOTTOCONTO",1);
_cur3 = add_cursor(new TCursor(_rel2));
_cur4 = add_cursor(new TSorted_cursor(_rel2,"UPPER(19->DESCR)|ANNO|NUMPART","",1));
_scad = new TLocalisamfile(LF_SCADENZE);
_pagsca = new TLocalisamfile(LF_PAGSCA);
_val = new TTable("%VAL");
_t.add(new TAssoc_array);_t.add(new TAssoc_array);
TConfig conf (CONFIG_DITTA,"cg");
_m = new TSelection_ext_mask("sc2600a");
_m->enable(F_VALUTA,conf.get_bool("GesVal"));
_stvaluta = false;
_start = true;
enable_print_menu();
return true;
}
bool TProspettoScadenze::user_destroy()
{
if (_rel1) delete _rel1;
if (_rel2) delete _rel2;
if (_scad) delete _scad;
if (_pagsca) delete _pagsca;
if (_val) delete _val;
if (_m) delete _m;
_t.destroy();
return true;
}
void TProspettoScadenze::riempi_conti_mastro(const char cf)
{
_conti_cf.destroy();
TRelation rel = TRelation(LF_PCON);
TString80 filtro;
filtro.format("TMCF==\'%c\'", cf);
TCursor cur(&rel, filtro);
TToken_string gc(10);
for (cur=0; cur.pos() < cur.items(); ++cur)
{
const int g = cur.curr().get_int(PCN_GRUPPO);
const int c = cur.curr().get_int(PCN_CONTO);
gc.add(g,0);
gc.add(c,1);
_conti_cf.add(gc);
}
}
bool TProspettoScadenze::set_print(int)
{
const bool repeat = _stvaluta && need_to_repeat_print();
bool print = repeat;
if (!repeat)
{
KEY k = _m->run();
_excel = k != K_ENTER;
print = k != K_QUIT;
int nmesi = _m->get_int(F_NMESI);
if (nmesi == 0)
nmesi = 1;
for (int i = 0; i <= NUMERO_FASCE; i++)
_limiti[i] = i * nmesi;
_start = true;
}
_stvaluta = _m->get_bool(F_VALUTA);
return print;
}
void TProspettoScadenze::print_totali_rows(int nriga, bool what)
// If what is 0 prints single total... else prints also general total
{
reset_print();
TAssoc_array& xassoc = (TAssoc_array&) _t[what];
if (_cod_pre.blank())
{
xassoc.destroy();
return;
}
TString_array as;
const int items = xassoc.items();
xassoc.get_keys(as);
as.sort();
for (int i=0; i < items; i++)
{
if (!what && !_excel)
calcola_saldo();
TString k(as.row(i)); // Chiave di ordinamento(valuta)
TString value;
TLineTotal& v = (TLineTotal&)xassoc[k];
real tot = ZERO;
int pos = 49;
TString rw(255);
rw = "";
if (_sinfasce)
{
for (int i = _sfasce; i >= 0; i--)
{
if (v._s[i] != ZERO)
{
print_real(value, v._s[i]);
rw << format("@%dg%12s", pos, (const char*) value);
tot += v._s[i];
}
pos += 12;
}
}
else
{
if (v._s[0] != ZERO)
{
print_real(value, v._s[0]);
rw << format("@%dg%12s", pos, (const char*) value);
tot += v._s[0];
}
pos += 12;
}
if (_nsinfasce)
{
for (int i = 0; i <= _nsfasce; i++)
{
if (v._ns[i] != ZERO)
{
print_real(value, v._ns[i]);
rw << format("@%dg%12s", pos, (const char*) value);
tot += v._ns[i];
}
pos += 12;
}
}
else
{
if (v._ns[0] != ZERO)
{
print_real(value, v._ns[0]);
rw << format("@%dg%12s", pos, (const char*) value);
tot += v._ns[0];
}
pos += 12;
}
if (tot != ZERO)
{
print_real(value, tot);
rw << format("@%dg%12s", pos, (const char*) value);
}
pos += 12;
if (v._es != ZERO)
{
print_real(value, v._es);
rw << format("@%dg%12s", pos, (const char*) value);
}
pos += 12;
if (v._sl != ZERO)
{
print_real(value, v._sl);
rw << format("@%dg%12s", pos, (const char*) value);
}
pos += 12;
const real diff = v._sl - (tot - v._es);
if (!diff.is_zero())
{
print_real(value, diff);
rw << format("@%dg%12s", pos, (const char*) value);
}
if (rw.not_empty())
{
TString80 s;
if (!what)
{
// Raddoppia le @ in RAGSOC: morte alle TPrintapp
s = _des_pre.left(25);
for (int at = s.find('@'); at >= 0; at = s.find('@', at+2))
s.insert("@", at);
rw.insert(format("%6s", (const char*)_cod_pre));
}
else
{
const int last_column = calc_last_column();
const TString meno(last_column, '-');
set_row(nriga++, meno);
s = TR("TOTALE GENERALE");
}
rw << "@8g%-25s";
set_row(nriga, rw, (const char*)s);
}
}
xassoc.destroy(); // Distrugge il totale appena stampato
}
void TProspettoScadenze::export_totali_rows()
// If what is 0 prints single total... else prints also general total
{
if (_cod_pre.blank())
return;
TAssoc_array& xassoc = (TAssoc_array&) _t[0];
TString_array as;
const int items = xassoc.items();
xassoc.get_keys(as);
as.sort();
for (int i=0; i < items; i++)
{
TVariant var(_cod_pre);
TString k(as.row(i)); // Chiave di ordinamento(valuta)
TLineTotal& v = (TLineTotal&)xassoc[k];
real t1;
real t2;
calcola_saldo();
for (int j = NUMERO_FASCE; j >= 0; j--)
t1 += v._s[j];
for (int jj = 0; jj <= NUMERO_FASCE; jj++)
t2 += v._ns[jj];
if (t1 == ZERO && t2 == ZERO && v._es == ZERO && v._sl == ZERO)
continue;
_recset->new_rec();
_recset->set("Cliente", var);
var = _des_pre;
_recset->set("RagioneSociale", var);
var = k;
_recset->set("Valuta", var);
int col = 0;
real tot = ZERO;
if (_sinfasce)
{
for (int i = _sfasce - 1; i >= 0; i--)
{
_recset->set(_colnames.row(col++), v._s[i]);
tot += v._s[i];
}
}
else
{
_recset->set(_colnames.row(col++), v._s[0]);
tot += v._s[0];
}
if (_nsinfasce)
{
for (int i = 0; i < _nsfasce; i++)
{
_recset->set(_colnames.row(col++), v._ns[i]);
tot += v._ns[i];
}
}
else
{
_recset->set(_colnames.row(col++), v._ns[0]);
tot += v._ns[0];
col++;
}
const real diff = v._sl - (tot - v._es);
_recset->set("Totale", tot);
_recset->set("Esposto", v._es);
_recset->set("Saldo", v._sl);
_recset->set("Differenza", diff);
}
}
void TProspettoScadenze::print_totali(int nriga)
{
reset_row(nriga);
if (_excel)
export_totali_rows();
print_totali_rows(nriga,0);
}
void TProspettoScadenze::print_header()
// Setta le righe dell'intestazione
{
int soh = 1;
const int last_column = calc_last_column();
const long firm = get_firm();
TString rw(last_column);
TString meno(last_column);
reset_header ();
TLocalisamfile ditte(LF_NDITTE);
ditte.put(NDT_CODDITTA, firm);
if (ditte.read() != NOERR)
ditte.zero();
TString s = ditte.get(NDT_RAGSOC);
TString datas = _datas.string();
TString limop = _limop.string();
TString limscad = _limscad.string();
TString s1;
if (_stvaluta)
s1 << "Valuta : " << _codvalsel << " " << _val->get("S0");
set_header (soh++, "Ditta : %ld %s@%ldg%s@%ldgData %s @%ldgPag. @#",
firm, (const char *)s, (last_column - s1.len()) / 2, (const char *)s1,last_column - 30, (const char *)datas, last_column - 10);
switch (_tipost)
{
case fornitori:
case clienti:
{
TString s1,s2, s3, lim;
int o = 0; // Offset per scaglioni.
if (_tipost==fornitori)
set_header(soh++,"@%ldg** PREVISIONE PAGAMENTI FORNITORI **", (last_column - 37) / 2);
else
set_header(soh++,"@%ldg** PREVISIONE INCASSI CLIENTI **", (last_column - 34) / 2);
set_header (soh++,"@%ldgAl %s - Operazioni al %s", (last_column - 40) / 2, (const char*)limscad, (const char*)limop);
meno.fill('-', last_column);
set_header(soh++,(const char *)meno);
set_header(soh,"CODICE@8gC O G N O M E E N O M E ");
int pos = 49;
rw.cut(0);
if (_sinfasce)
{
rw << format("@%dg >%3d gg", pos, _limiti[_sfasce] * 30);
pos += 12;
for (int i = _sfasce; i > 0; i--)
{
rw << format("@%dg <= %3d gg", pos, _limiti[i] * 30);
pos += 12;
}
set_header(soh, format("@%dg%s", 49+((pos-49)/2), "SCADUTO"));
}
else
{
set_header(soh, format("@%dg%12s", pos, "SCADUTO"));
pos += 12;
}
const int pos_ascad = pos;
if (_nsinfasce)
{
for (int i = 1; i <= _nsfasce; i++)
{
rw << format("@%dg <= %3d gg", pos, _limiti[i] * 30);
pos = pos + 12;
}
rw << format("@%dg >%3d gg", pos, _limiti[_nsfasce] * 30);
pos = pos + 12;
set_header(soh, format("@%dg%s", pos_ascad+((pos-pos_ascad)/2)-5, "A SCADERE"));
}
else
{
set_header(soh, format("@%dg%12s", pos, "A SCADERE"));
pos += 12;
}
set_header(soh, format("@%dg%12s", pos, "TOTALE"));
pos += 12;
set_header(soh, format("@%dg%12s", pos, "ESPOSTO"));
pos += 12;
set_header(soh, format("@%dg%12s", pos, "SALDO"));
pos += 12;
set_header(soh, format("@%dg%12s", pos, " DIFFERENZA"));
set_header(++soh,(const char *)rw);
break;
}
default:
break;
}
set_header(++soh, (const char *) meno);
}
void TProspettoScadenze::preprocess_footer()
{
}
int TProspettoScadenze::calc_last_column()
// Setta le righe dell'intestazione
{
int pos = 112;
if (_sinfasce)
pos += _sfasce * 12;
else
pos += 12;
if (_nsinfasce)
pos = pos + _nsfasce * 12;
else
pos += 12;
return pos;
}
void TProspettoScadenze::set_page(int file, int counter)
{
print_header();
}
TProspettoScadenze::TProspettoScadenze()
{
_rel1 = _rel2 = NULL;
}
int sc2600(int argc, char** argv)
{
TProspettoScadenze* app = new TProspettoScadenze;
app->run(argc, argv, TR("Previsione Incassi/Pagamenti"));
return 0;
}