8d83ee89d5
Files correlati : Ricompilazione Demo : [ ] Commento :sistemata stampa ritenute; riporto dalla 5.0 git-svn-id: svn://10.65.10.50/trunk@18254 c028cbd2-c16b-5b4b-a496-9718f37d4682
510 lines
13 KiB
C++
Executable File
510 lines
13 KiB
C++
Executable File
// 772400.cpp - Calcolo e Stampa versamenti ritenute
|
||
#include <printapp.h>
|
||
#include <progind.h>
|
||
#include <sort.h>
|
||
#include <tabutil.h>
|
||
#include <utility.h>
|
||
|
||
#include <anagr.h>
|
||
#include <nditte.h>
|
||
|
||
#include "772.h"
|
||
#include "772400.h"
|
||
#include "77lib.h"
|
||
|
||
#include "scperc.h"
|
||
#include "rpag.h"
|
||
#include "rver.h"
|
||
#include "perc.h"
|
||
|
||
|
||
static bool filter_func (const TRelation*);
|
||
|
||
class TSt_vers : public TPrintapp
|
||
{
|
||
friend bool filter_func (const TRelation *);
|
||
|
||
struct righe_vers
|
||
{
|
||
char anno[5];
|
||
char mese[3];
|
||
char codtrib[5];
|
||
char tipoa;
|
||
char codan[6];
|
||
char descr[51];
|
||
int nprog;
|
||
TDate datadoc;
|
||
char numdoc[8];
|
||
real rite;
|
||
};
|
||
righe_vers* _rig;
|
||
TRelation* _rel;
|
||
TCursor* _cur;
|
||
TProgind* _prog;
|
||
TSort* _sort;
|
||
const char* _buf;
|
||
TLocalisamfile* _nditte;
|
||
TLocalisamfile* _anag;
|
||
TLocalisamfile* _rpag;
|
||
TLocalisamfile* _rver;
|
||
TLocalisamfile* _scperc;
|
||
TTable* _ca7;
|
||
int _annop, _mesep, _codtribp;
|
||
TDate _dataini, _datafine;
|
||
char _tipoap;
|
||
long _codditta, _codanagp;
|
||
real _tot_cod, _tot_mese;
|
||
bool _primo;
|
||
TString _tmp;
|
||
|
||
protected:
|
||
virtual bool user_create() ;
|
||
virtual bool user_destroy();
|
||
virtual bool set_print(int m);
|
||
virtual bool preprocess_page (int,int);
|
||
virtual bool preprocess_print(int,int);
|
||
virtual print_action postprocess_page (int,int);
|
||
virtual void postclose_print();
|
||
|
||
public:
|
||
const TRectype& look_causali(int);
|
||
const TRectype& look_schperc(long,char,long,int);
|
||
TDate look_vers(const TSchedaP& sch, long numvers);
|
||
void crea_sort();
|
||
void init_sort();
|
||
void leggi_sort();
|
||
void setta_intestazione();
|
||
const char* desc_percipiente(char,long);
|
||
void riempi_record(int,int,int,char,long,const char*,int,const TDate&, const char*,const real&);
|
||
|
||
static bool codditta_hnd(TMask_field& f, KEY k);
|
||
|
||
TSt_vers() {}
|
||
virtual ~TSt_vers() {}
|
||
};
|
||
|
||
HIDDEN inline TSt_vers& app() { return (TSt_vers&)main_app(); }
|
||
|
||
const real& round_mille_lire(real& n)
|
||
{
|
||
// Arrotonda alle mille lire se siamo in lire, altrimenti non arrotondare!
|
||
const int dec = TCurrency::get_firm_dec();
|
||
if (dec == 0)
|
||
n.round(-3); // 1000 Lire
|
||
|
||
return n;
|
||
}
|
||
|
||
bool TSt_vers::codditta_hnd(TMask_field& f, KEY k)
|
||
{
|
||
if (k == K_TAB && !(f.mask().is_running()) )
|
||
{
|
||
TString16 codditta; codditta << app()._codditta;
|
||
if (codditta != "0")
|
||
{
|
||
f.set(codditta);
|
||
f.check();
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
bool filter_func (const TRelation* rel)
|
||
{
|
||
const TRectype& rpag = rel->curr(LF_RPAG);
|
||
const long codditta = rpag.get_long(PAG_CODDITTA);
|
||
if (codditta != app()._codditta)
|
||
return FALSE;
|
||
|
||
const TDate datapag = rpag.get(PAG_DATAPAG);
|
||
|
||
if (datapag.ok() && datapag >= app()._dataini && datapag <= app()._datafine)
|
||
{
|
||
const long numvers = rpag.get_long(PAG_NUMVERS);
|
||
if (numvers <= 0)
|
||
return TRUE;
|
||
const long codanagr = rpag.get_long(PAG_CODANAGR);
|
||
const char tipoa = rpag.get_char(PAG_TIPOA);
|
||
const int nprog = rpag.get_int(PAG_NPROG);
|
||
TSchedaP sch(codditta, tipoa, codanagr, nprog);
|
||
TDate datavers = app().look_vers(sch, numvers);
|
||
if (!datavers.ok())
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
TDate TSt_vers::look_vers(const TSchedaP& scheda, long num)
|
||
{
|
||
TLocalisamfile vers(LF_RVER);
|
||
vers.zero();
|
||
vers.put(VER_CODDITTA, scheda.codditta());
|
||
vers.put(VER_TIPOA, scheda.tipoa());
|
||
vers.put(VER_CODANAGR, scheda.codanagr());
|
||
vers.put(VER_NPROG, scheda.nprog());
|
||
vers.put(VER_NRIGA, num);
|
||
vers.read();
|
||
if (vers.bad())
|
||
vers.zero();
|
||
|
||
return vers.get_date(VER_DATAVERS);
|
||
}
|
||
|
||
const TRectype& TSt_vers::look_schperc (long cod, char t, long codan, int np)
|
||
{
|
||
TLocalisamfile& schede = *_scperc;
|
||
schede.zero();
|
||
schede.put(SPR_CODDITTA, cod);
|
||
schede.put(SPR_TIPOA, t);
|
||
schede.put(SPR_CODANAGR, codan);
|
||
schede.put(SPR_NPROG, np);
|
||
schede.read();
|
||
if (schede.bad())
|
||
schede.zero();
|
||
|
||
return schede.curr();
|
||
}
|
||
|
||
const TRectype& TSt_vers::look_causali(int cod)
|
||
{
|
||
TString16 dep;
|
||
|
||
_ca7->zero();
|
||
dep.format("%02d", cod);
|
||
_ca7->put("CODTAB", dep);
|
||
_ca7->read();
|
||
if (_ca7->bad())
|
||
_ca7->zero();
|
||
|
||
return _ca7->curr();
|
||
}
|
||
|
||
void TSt_vers::init_sort()
|
||
{
|
||
_rig = new righe_vers;
|
||
_sort = new TSort(sizeof(righe_vers));
|
||
|
||
_sort -> addsortkey((char*)&(_rig->anno) - (char*)&(_rig->anno),4);
|
||
_sort -> addsortkey((char*)&(_rig->mese) - (char*)&(_rig->anno),2);
|
||
_sort -> addsortkey((char*)&(_rig->codtrib) - (char*)&(_rig->anno),4);
|
||
_sort->addsortkey ((char*)&(_rig->tipoa) - (char*)&(_rig->anno),1);
|
||
_sort->addsortkey ((char*)&(_rig->codan) - (char*)&(_rig->anno),5);
|
||
_sort->init();
|
||
}
|
||
|
||
void TSt_vers::crea_sort()
|
||
{
|
||
long codan;
|
||
char tipoa;
|
||
int nprog, codc, mese, anno;
|
||
real rite;
|
||
TDate datapag, datadoc;
|
||
TString16 numdoc;
|
||
|
||
init_sort();
|
||
*_cur = 0l; //il cursore e' stato filtrato (filter_function)
|
||
|
||
for (int i = 0; i < _cur->items(); i++, ++(*_cur))
|
||
{
|
||
_prog->addstatus(1);
|
||
tipoa = _cur->curr().get(PAG_TIPOA)[0];
|
||
codan = _cur->curr().get_long(PAG_CODANAGR);
|
||
nprog = _cur->curr().get_int(PAG_NPROG);
|
||
datapag = _cur->curr().get(PAG_DATAPAG);
|
||
mese = datapag.month();
|
||
anno = datapag.year();
|
||
|
||
const TRectype dep = look_schperc(_codditta, tipoa, codan, nprog);
|
||
codc = dep.get_int(SPR_CODCAUS);
|
||
datadoc = dep.get_date(SPR_DATADOC);
|
||
numdoc = dep.get(SPR_NUMDOC);
|
||
|
||
const TRectype& cau = look_causali(codc);
|
||
TString descr = cau.get("S0");
|
||
int codtrib = cau.get_int("I0");
|
||
|
||
// rite = _rpag->get_real(PAG_RITENUTA); Non va!
|
||
rite = _cur->curr().get_real(PAG_RITENUTA);
|
||
riempi_record(anno,mese,codtrib,tipoa,codan,descr,nprog,datadoc,numdoc,rite);
|
||
}
|
||
}
|
||
|
||
void TSt_vers::riempi_record(int a,int m,int ct,char t,long ca,const char* d,
|
||
int np,const TDate& dd,const char* nd,const real& ri)
|
||
{
|
||
sprintf (_rig->anno, "%4d", a);
|
||
sprintf (_rig->mese, "%2d", m);
|
||
sprintf (_rig->codtrib, "%4d", ct);
|
||
_rig->tipoa = t;
|
||
sprintf(_rig->codan, "%5ld", ca);
|
||
_rig->rite = ri;
|
||
sprintf(_rig->descr, "%s", d);
|
||
_rig->nprog = np;
|
||
_rig->datadoc = dd;
|
||
sprintf(_rig->numdoc, "%s", nd);
|
||
|
||
_sort->sort((const char*)_rig);
|
||
}
|
||
|
||
void TSt_vers::leggi_sort()
|
||
{
|
||
reset_print();
|
||
|
||
if ((_buf = _sort->retrieve()) != NULL)
|
||
{
|
||
struct righe_vers* rp;
|
||
|
||
rp = (struct righe_vers*)_buf;
|
||
int anno = atoi(rp->anno);
|
||
int mese = atoi(rp->mese);
|
||
int codtrib = atoi(rp->codtrib);
|
||
TString80 descr(rp->descr); //descrizione della causale
|
||
char tipoa = rp->tipoa;
|
||
long codanag = atol(rp->codan);
|
||
int nprog = rp->nprog;
|
||
TString16 data((rp->datadoc).string(brief, '.'));
|
||
TString16 numdoc(rp->numdoc);
|
||
real rite = rp->rite;
|
||
|
||
TString80 dp;
|
||
TString16 ff;
|
||
int i = 1;
|
||
TString dep(94);
|
||
dep.fill('-');
|
||
|
||
if ((mese != _mesep && _mesep != 0) || (anno != _annop && _annop != 0)) //e' cambiato il mese oppure l'anno
|
||
{
|
||
set_row(i++, "@b@87gTOTALI CODICE ESATTORIA@115g%r", &_tot_cod);
|
||
TDate d = format("%02d/%04d", mese, anno);
|
||
TString16 s(d.string(brief,'/'));
|
||
real arr = round_mille_lire(_tot_mese);
|
||
set_row(i++, "@b@87gTOTALI MESE PAGAMENTO %s@115g%r", (const char*)s, &arr);
|
||
set_row(i++, "");
|
||
set_row(i++, "");
|
||
dp = desc_percipiente(tipoa,codanag);
|
||
ff = format("%5ld/%c", codanag,tipoa);
|
||
set_row(i++,"@1g%2d %4d@11g%4d@17g%-.30s@49g%s@61g%-.30s@91g%4d@98g%s@107g%s@115g%r",
|
||
mese,anno,codtrib,(const char*)descr,(const char*)ff,
|
||
(const char*)dp,nprog,(const char*)data,(const char*)numdoc,&rite);
|
||
|
||
_tot_cod = _tot_mese = ZERO;
|
||
}
|
||
else if (codtrib != _codtribp && _codtribp != -1)
|
||
{
|
||
set_row(i++, "@b@87gTOTALI CODICE ESATTORIA@115g%r", &_tot_cod);
|
||
set_row(i++, "");
|
||
dp = desc_percipiente(tipoa, codanag);
|
||
ff = format("%5ld/%c", codanag,tipoa);
|
||
set_row(i++,"@11g%4d@17g%-.30s@49g%s@61g%-.30s@91g%4d@98g%s@107g%s@115g%r",
|
||
codtrib,(const char*)descr,(const char*)ff,
|
||
(const char*)dp,nprog,(const char*)data,(const char*)numdoc,&rite);
|
||
|
||
_tot_cod = ZERO;
|
||
}
|
||
else if ((codanag != _codanagp && _codanagp != 0) || (tipoa != _tipoap && _tipoap != ' '))
|
||
{
|
||
dp = desc_percipiente(tipoa,codanag);
|
||
ff = format("%5ld/%c", codanag,tipoa);
|
||
set_row(i++,"@49g%s@61g%-.30s@91g%4d@98g%s@107g%s@115g%r",
|
||
(const char*)ff,(const char*)dp,nprog,(const char*)data,(const char*)numdoc,&rite);
|
||
}
|
||
else //non e' cambiato nulla
|
||
{
|
||
if (_primo)
|
||
{
|
||
dp = desc_percipiente(tipoa,codanag);
|
||
ff = format("%5ld/%c", codanag,tipoa);
|
||
set_row(i++,"@1g%2d %4d@11g%4d@17g%-.30s@49g%s@61g%-.30s@91g%4d@98g%s@107g%s@115g%r",
|
||
mese,anno,codtrib,(const char*)descr,(const char*)ff,
|
||
(const char*)dp,nprog,(const char*)data,(const char*)numdoc,&rite);
|
||
|
||
_primo = FALSE;
|
||
}
|
||
else
|
||
set_row(i++, "@91g%4d@98g%s@107g%s@115g%r", nprog,(const char*)data,(const char*)numdoc,&rite);
|
||
}
|
||
_mesep = mese;
|
||
_annop = anno;
|
||
_codtribp = codtrib;
|
||
_codanagp = codanag;
|
||
_tipoap = tipoa;
|
||
|
||
_tot_cod += rite;
|
||
_tot_mese += rite;
|
||
}
|
||
else
|
||
{
|
||
set_row(1, "@b@87gTOTALI CODICE ESATTORIA@115g%r", &_tot_cod);
|
||
TDate d = format("%02d/%04d", _mesep, _annop);
|
||
TString16 s(d.string(brief,'/'));
|
||
real arr = round_mille_lire(_tot_mese);
|
||
set_row(2, "@b@87gTOTALI MESE PAGAMENTO %s@115g%r", (const char*)s, &arr);
|
||
}
|
||
}
|
||
|
||
bool TSt_vers::preprocess_print(int file, int counter)
|
||
{
|
||
_annop = _mesep = 0;
|
||
_codanagp = 0l;
|
||
_codtribp = -1;
|
||
_tipoap = ' ';
|
||
_primo = TRUE;
|
||
_tot_mese = _tot_cod = ZERO;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
bool TSt_vers::preprocess_page(int file, int counter)
|
||
{
|
||
leggi_sort();
|
||
return TRUE;
|
||
}
|
||
|
||
print_action TSt_vers::postprocess_page(int file, int counter)
|
||
{
|
||
if (_buf == NULL)
|
||
return NEXT_PAGE;
|
||
|
||
return REPEAT_PAGE;
|
||
}
|
||
|
||
void TSt_vers::postclose_print()
|
||
{
|
||
delete _sort;
|
||
}
|
||
|
||
bool TSt_vers::set_print(int)
|
||
{
|
||
TMask msk ("772400a");
|
||
KEY tasto;
|
||
TLocalisamfile& fl = _cur->file(LF_RPAG);
|
||
|
||
msk.set_handler (F_CODDITTA, codditta_hnd);
|
||
|
||
tasto = msk.run();
|
||
|
||
if (tasto == K_ENTER)
|
||
{
|
||
const int anno = msk.get_int(F_ANNO);
|
||
const int damese = msk.get_int(F_DAMESE);
|
||
const int amese = msk.get_int(F_AMESE);
|
||
|
||
_dataini = TDate(1, damese, anno);
|
||
_datafine = TDate(1, amese, anno);
|
||
_datafine.set_end_month();
|
||
|
||
_cur->set_filterfunction(filter_func);
|
||
|
||
set_real_picture ("###.###.###.###");
|
||
set_print_zero();
|
||
set_magic_currency(true);
|
||
|
||
printer().footerlen(5);
|
||
|
||
setta_intestazione();
|
||
|
||
_prog = new TProgind(_cur->items(), "Elaborazione in corso...", false);
|
||
|
||
crea_sort();
|
||
_sort->endsort();
|
||
|
||
delete _rig;
|
||
delete _prog;
|
||
|
||
return true;
|
||
}
|
||
else
|
||
return false;
|
||
}
|
||
|
||
void TSt_vers::setta_intestazione()
|
||
{
|
||
int soh = 1;
|
||
TString sep(132);
|
||
TString ragsoc(50);
|
||
|
||
TLocalisamfile nditte(LF_NDITTE);
|
||
nditte.zero();
|
||
nditte.put(NDT_CODDITTA, get_firm_770());
|
||
if (nditte.read() == NOERR)
|
||
ragsoc = nditte.get(NDT_RAGSOC);
|
||
|
||
reset_header();
|
||
|
||
set_header (soh++, "STAMPA VERSAMENTI RITENUTE@54gDITTA@61g%-.45s@107gDATA @< PAG. @#", (const char*) ragsoc);
|
||
sep.fill('-');
|
||
set_header (soh++, (const char *) sep);
|
||
set_header (soh++, "PAGAMENTO CODICE ESATTORIA@48gPERCIPIENTE@91gN<67>@101gDOCUMENTO@122gRITENUTA");
|
||
set_header (soh++, "MESE ANNO@48gCODICE/TIPO@61gDESCRIZIONE@91gPROG.@99gDATA@108gNUMERO");
|
||
set_header (soh, (const char *) sep);
|
||
}
|
||
|
||
const char* TSt_vers::desc_percipiente(char t, long c)
|
||
{
|
||
TString80 ragsoc;
|
||
_anag->setkey(1);
|
||
_anag->zero();
|
||
_anag->put(ANA_TIPOA, t);
|
||
_anag->put(ANA_CODANAGR, c);
|
||
if (_anag->read() == NOERR)
|
||
{
|
||
ragsoc = _anag->get(ANA_RAGSOC);
|
||
if (t == 'F')
|
||
{
|
||
TString80 nome = ragsoc.mid(30);
|
||
ragsoc.cut(30);
|
||
ragsoc.trim(); nome.trim();
|
||
ragsoc << ' ' << nome;
|
||
}
|
||
_tmp = ragsoc;
|
||
}
|
||
else
|
||
_tmp.cut(0);
|
||
return _tmp;
|
||
}
|
||
|
||
bool TSt_vers::user_create()
|
||
{
|
||
//TToken_string exp;
|
||
|
||
//exp.add("CODDITTA=CODDITTA");
|
||
//exp.add("NUMVERS=NUMVERS");
|
||
|
||
_rel = new TRelation (LF_RPAG);
|
||
|
||
//_rel->add(LF_RVER, exp, 2, LF_RPAG);
|
||
|
||
_cur = new TCursor(_rel,"",1);
|
||
|
||
_nditte = new TLocalisamfile (LF_NDITTE);
|
||
_anag = new TLocalisamfile (LF_ANAG);
|
||
_rpag = new TLocalisamfile (LF_RPAG);
|
||
_rver = new TLocalisamfile (LF_RVER);
|
||
_scperc = new TLocalisamfile (LF_SCPERC);
|
||
_ca7 = new TTable ("%CA7");
|
||
_rig = new righe_vers;
|
||
_codditta = get_firm_770();
|
||
return TRUE;
|
||
}
|
||
|
||
bool TSt_vers::user_destroy()
|
||
{
|
||
delete _rel;
|
||
delete _nditte;
|
||
delete _anag;
|
||
delete _rpag;
|
||
delete _rver;
|
||
delete _scperc;
|
||
delete _ca7;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
int m72400(int argc, char* argv[])
|
||
{
|
||
TSt_vers a;
|
||
a.run(argc, argv, "Calcolo e stampa versamenti ritenute");
|
||
return 0;
|
||
}
|