Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione 01.05 patch 648 git-svn-id: svn://10.65.10.50/trunk@8633 c028cbd2-c16b-5b4b-a496-9718f37d4682
599 lines
16 KiB
C++
Executable File
599 lines
16 KiB
C++
Executable File
// 772300.cpp - Lista movimenti percipienti
|
|
//
|
|
// 16. 1.96 Stampa solo le schede che hanno almeno un pagamento con data
|
|
// compresa negli estremi richiesti
|
|
//
|
|
#include <config.h>
|
|
#include <execp.h>
|
|
#include <mailbox.h>
|
|
#include <mask.h>
|
|
#include <printapp.h>
|
|
#include <relation.h>
|
|
#include <sort.h>
|
|
#include <tabutil.h>
|
|
#include <utility.h>
|
|
|
|
#include "scperc.h"
|
|
#include "rpag.h"
|
|
#include "rver.h"
|
|
|
|
#include <comuni.h>
|
|
#include <nditte.h>
|
|
#include <anagr.h>
|
|
#include <anafis.h>
|
|
#include "perc.h"
|
|
|
|
#include "772.h"
|
|
#include "772300.h"
|
|
#include "77lib.h"
|
|
|
|
HIDDEN TString256 __tmp;
|
|
HIDDEN bool filter_func (const TRelation *);
|
|
|
|
class TStampa_mov : public TPrintapp
|
|
{
|
|
char _liv; // Se stampa a livello di studio
|
|
int _anno_dic; // Anno dichiarazione nei paramentri utente o studio
|
|
int _row; // Riga corrente di stampa
|
|
TString16 _section;
|
|
TConfig* _cnf;
|
|
TVersamento_stampa _stvers;
|
|
TRelation* _rel;
|
|
TCursor* _cur;
|
|
TLocalisamfile* _nditte;
|
|
TLocalisamfile* _anag;
|
|
TLocalisamfile* _rpag;
|
|
TLocalisamfile* _rver;
|
|
TArray _pagver;
|
|
TPercipiente _curr_perc, _prec_perc;
|
|
TString _ragsocER,_ragsocPE,_datadoc,_numdoc,_datastampa;
|
|
int _anno, _codcaus, _codtrib, _ind, _nprog;
|
|
long _codditta,_codanagER,_codanagPE,_cod_da,_cod_a;
|
|
char _tipoa,_tipoa_da,_tipoa_a;
|
|
real _tot_imponpag,_tot_ritenpag,_tot_impvers;
|
|
real _g_tot_imp, _g_tot_ver, _g_tot_rit;
|
|
TDate _datada,_dataa;
|
|
protected:
|
|
friend bool filter_func (const TRelation *);
|
|
virtual void on_config_change();
|
|
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);
|
|
bool init_print();
|
|
void set_total_perc();
|
|
void set_global_total();
|
|
void add(TVersamento& vers);
|
|
bool find(TVersamento& vers);
|
|
public:
|
|
void dati_erogante();
|
|
// void intesta_fissa();
|
|
void stampa_dati_erog_perc();
|
|
void ragione_sociale();
|
|
int ricerca_causale();
|
|
void setta_righe_documento();
|
|
void setta_righe_pagamenti(const TString&,const real&,const TString&,const real&,int);
|
|
void setta_righe_versamenti(char,char,const TString&,const TString&,const TString&,const real&,int);
|
|
static bool codditta_hnd(TMask_field& f, KEY k);
|
|
// D = stampa ditta, S = stampa a livello di studio
|
|
TStampa_mov(char livello='D') : _liv(toupper(livello)) {}
|
|
virtual ~TStampa_mov() {}
|
|
};
|
|
|
|
HIDDEN TStampa_mov& app() { return (TStampa_mov&) main_app(); }
|
|
|
|
bool filter_func (const TRelation * rel)
|
|
{
|
|
const int anno_corr = app()._anno;
|
|
TRectype sch_curr(rel->lfile().curr());
|
|
TSchedaP scheda(sch_curr);
|
|
return esiste_pag_in_anno(scheda, anno_corr);
|
|
}
|
|
|
|
bool TStampa_mov::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;
|
|
}
|
|
|
|
void TStampa_mov::on_config_change()
|
|
{
|
|
TConfig conf(_liv == 'S' ? CONFIG_USER : CONFIG_STUDIO);
|
|
_anno_dic = (int)conf.get_long(ANNO_SEL, _section);
|
|
}
|
|
|
|
HIDDEN int compare_rows(const TObject** o1, const TObject** o2)
|
|
{
|
|
TToken_string* r1 = (TToken_string*)*o1;
|
|
TToken_string* r2 = (TToken_string*)*o2;
|
|
|
|
long np1 = atol(r1->get(0));
|
|
long nv1 = atol(r1->get(1));
|
|
long np2 = atol(r2->get(0));
|
|
long nv2 = atol(r2->get(1));
|
|
|
|
if (nv1 == nv2 && np1 == np2)
|
|
return 0;
|
|
|
|
if (nv1 > nv2)
|
|
return 1;
|
|
|
|
if (nv1 < nv2)
|
|
return -1;
|
|
|
|
if (nv1 == nv2)
|
|
if (np1 > np2)
|
|
return 1;
|
|
else
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int TStampa_mov::ricerca_causale()
|
|
{
|
|
TTable ca7 ("%CA7");
|
|
TString16 dep;
|
|
int cod = 0;
|
|
|
|
ca7.zero();
|
|
dep.format("%02d", _codcaus);
|
|
ca7.put("CODTAB", dep);
|
|
if (ca7.read() == NOERR)
|
|
cod = ca7.get_int("I0");
|
|
|
|
return cod;
|
|
}
|
|
|
|
bool TStampa_mov::preprocess_print(int file, int counter)
|
|
{
|
|
if (file == LF_SCPERC)
|
|
{
|
|
_tot_imponpag = ZERO;
|
|
_tot_ritenpag = ZERO;
|
|
_tot_impvers = ZERO;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void TStampa_mov::ragione_sociale()
|
|
{
|
|
_ragsocPE = "";
|
|
_anag->setkey(1);
|
|
_anag->zero();
|
|
_anag->put(ANA_TIPOA, _tipoa);
|
|
_anag->put(ANA_CODANAGR, _codanagPE);
|
|
if (_anag->read() == NOERR)
|
|
{
|
|
_ragsocPE = _anag->get(ANA_RAGSOC);
|
|
_ragsocPE.trim();
|
|
if (_tipoa == 'F')
|
|
{
|
|
TString80 nome = _ragsocPE.mid(30);
|
|
_ragsocPE.cut(30);
|
|
_ragsocPE.trim(); nome.trim();
|
|
_ragsocPE << ' ' << nome;
|
|
}
|
|
}
|
|
set_row (_row, "%c %5ld %-50s", _tipoa, _codanagPE, (const char*) _ragsocPE);
|
|
}
|
|
|
|
void TStampa_mov::setta_righe_documento()
|
|
{
|
|
set_row (_row, "%-4d", _nprog); /* Prima era 2 */
|
|
if (_codcaus != 0)
|
|
set_row (_row, "@5g%02d", _codcaus);
|
|
if (_codtrib != 0)
|
|
set_row (_row, "@8g%4d", _codtrib);
|
|
|
|
set_row (_row, "@13g%10s", (const char*) _datadoc);
|
|
set_row (_row, "@24g%-7s", (const char*) _numdoc);
|
|
}
|
|
|
|
void TStampa_mov::setta_righe_pagamenti(const TString& datapag,const real& imponpag,
|
|
const TString& percent,const real& ritenpag,int i)
|
|
{
|
|
set_row (i, "@32g%10s", (const char*) datapag);
|
|
set_row (i, "@43g%r", &imponpag);
|
|
set_row (i, "@59g%s", (const char*) percent);
|
|
set_row (i, "@65g%12r", &ritenpag);
|
|
}
|
|
|
|
void TStampa_mov::setta_righe_versamenti(char luovers,char tipovers,const TString& dataver,
|
|
const TString& serie,const TString& numero,const real& impvers,int j)
|
|
{
|
|
if (impvers != ZERO)
|
|
{
|
|
set_row (j, "@79g%c", luovers);
|
|
set_row (j, "@82g%c", tipovers);
|
|
set_row (j, "@84g%10s", (const char*) dataver);
|
|
set_row (j, "@97g%s", (const char*) serie);
|
|
set_row (j, "@103g%s", (const char*) numero);
|
|
set_row (j, "@116g%r", &impvers);
|
|
}
|
|
}
|
|
|
|
void TStampa_mov::set_total_perc()
|
|
{
|
|
set_row (_row, "@20gTOTALE PERCIPIENTE@43g%r", &_tot_imponpag);
|
|
set_row (_row, "@62g%r", &_tot_ritenpag);
|
|
set_row (_row, "@116g%r", &_tot_impvers);
|
|
set_row (_row+1, "");
|
|
|
|
_g_tot_imp += _tot_imponpag;
|
|
_g_tot_rit += _tot_ritenpag;
|
|
_g_tot_ver += _tot_impvers;
|
|
|
|
_tot_imponpag = _tot_ritenpag = _tot_impvers = ZERO;
|
|
}
|
|
|
|
void TStampa_mov::set_global_total()
|
|
{
|
|
set_row (_row, "@20gTOTALE GENERALE @43g%r", &_g_tot_imp);
|
|
set_row (_row, "@62g%r", &_g_tot_rit);
|
|
set_row (_row, "@116g%r", &_g_tot_ver);
|
|
set_row (_row+1, "");
|
|
}
|
|
|
|
void TStampa_mov::add(TVersamento& vers)
|
|
{
|
|
_stvers.add(vers);
|
|
}
|
|
|
|
bool TStampa_mov::find(TVersamento& vers)
|
|
{
|
|
return _stvers.find(vers);
|
|
}
|
|
|
|
bool TStampa_mov::preprocess_page(int file, int counter)
|
|
{
|
|
TString datapag,dataver,serie,numero;
|
|
TDate datadoc,datav;
|
|
real imponpag,ritenpag,impvers,dep,dep2;
|
|
char luovers,tipovers;
|
|
real percent;
|
|
int i,j, numvers;
|
|
|
|
i = j = _row = 1;
|
|
|
|
if (counter)
|
|
return TRUE;
|
|
|
|
if (file == LF_SCPERC)
|
|
{
|
|
reset_print();
|
|
TRectype sch_curr(current_cursor()->curr(LF_SCPERC));
|
|
_tipoa = current_cursor()->curr(LF_SCPERC).get (SPR_TIPOA)[0];
|
|
_codanagPE = current_cursor()->curr(LF_SCPERC).get_long(SPR_CODANAGR);
|
|
_nprog = current_cursor()->curr(LF_SCPERC).get_int(SPR_NPROG);
|
|
_codcaus = current_cursor()->curr(LF_SCPERC).get_int (SPR_CODCAUS);
|
|
_codtrib = ricerca_causale();
|
|
datadoc = current_cursor()->curr(LF_SCPERC).get_date(SPR_DATADOC);
|
|
_datadoc = datadoc.string();
|
|
_numdoc = current_cursor()->curr(LF_SCPERC).get (SPR_NUMDOC);
|
|
|
|
const int anno_doc = datadoc.year();
|
|
TSchedaP scheda(sch_curr);
|
|
bool esiste_pag_anno_in_periodo = esiste_pag_in_periodo(scheda, _datada, _dataa);
|
|
bool stampa_scheda = (anno_doc == _anno_dic) || esiste_pag_anno_in_periodo;
|
|
if (!stampa_scheda)
|
|
return TRUE;
|
|
|
|
_curr_perc.set(_tipoa, _codanagPE);
|
|
if (_curr_perc != _prec_perc)
|
|
{
|
|
if (_prec_perc.not_empty())
|
|
{
|
|
set_total_perc();
|
|
_row = 3;
|
|
}
|
|
_prec_perc = _curr_perc;
|
|
ragione_sociale();
|
|
_row++;
|
|
}
|
|
|
|
setta_righe_documento();
|
|
|
|
i = j = _row;
|
|
TVersamento_stampa ve;
|
|
int nriga = 0;
|
|
TRectype recpag(_rpag->curr());
|
|
recpag.zero();
|
|
recpag.put(SPR_CODDITTA, _codditta);
|
|
recpag.put(SPR_TIPOA, _tipoa);
|
|
recpag.put(SPR_CODANAGR, _codanagPE);
|
|
recpag.put(SPR_NPROG, _nprog);
|
|
_rpag->setkey(1);
|
|
_rpag->zero();
|
|
_rpag->curr() = recpag;
|
|
|
|
for (_rpag->read(_isgteq); _rpag->good(); _rpag->next())
|
|
{
|
|
if (_rpag->curr() > recpag) break;
|
|
TDate datap(_rpag->get_date(PAG_DATAPAG));
|
|
if (datap < _datada || datap > _dataa) continue;
|
|
|
|
datapag = datap.string();
|
|
imponpag = _rpag->get_real(PAG_IMPONIBILE);
|
|
percent = _rpag->get_real(PAG_PERC);
|
|
TString16 st_perc(percent.string("###,@@"));
|
|
ritenpag = _rpag->get_real(PAG_RITENUTA);
|
|
numvers = _rpag->get_int(PAG_NUMVERS);
|
|
nriga = _rpag->get_int(PAG_NRIGA);
|
|
_tot_imponpag += imponpag;
|
|
_tot_ritenpag += ritenpag;
|
|
|
|
setta_righe_pagamenti(datapag,imponpag,st_perc,ritenpag,i++);
|
|
|
|
if (numvers < 0) continue;
|
|
|
|
// Stampa estremi versamento
|
|
real vers_stampa = ZERO;
|
|
TLocalisamfile rver (LF_RVER);
|
|
rver.zero();
|
|
rver.put(VER_CODDITTA, _codditta);
|
|
rver.put(VER_TIPOA, _tipoa);
|
|
rver.put(VER_CODANAGR, _codanagPE);
|
|
rver.put(VER_NPROG, _nprog);
|
|
rver.put(VER_NRIGA, numvers);
|
|
|
|
if (rver.read() == NOERR)
|
|
{
|
|
luovers = rver.get(VER_LUOVERS)[0];
|
|
tipovers = rver.get(VER_TIPOVERS)[0];
|
|
datav = rver.get_date(VER_DATAVERS);
|
|
dataver = datav.string();
|
|
serie = rver.get(VER_SERIE);
|
|
numero = rver.get(VER_NUMERO);
|
|
impvers = rver.get_real(VER_IMPVERS);
|
|
ve.set(_codditta,_tipoa,_codanagPE,_nprog, numvers, impvers);
|
|
|
|
const bool gia_visto = find(ve);
|
|
|
|
if (gia_visto)
|
|
impvers = ve.importo_versato_residuo();
|
|
else
|
|
{
|
|
_tot_impvers += impvers;
|
|
add(ve);
|
|
}
|
|
|
|
// NB - in vers_stampa() viene fatta anche la add
|
|
vers_stampa = ve.vers_stampa(_rpag, numvers, impvers, ritenpag);
|
|
// if (vers_stampa != ZERO)
|
|
setta_righe_versamenti(luovers,tipovers,dataver,serie,numero,vers_stampa,j++);
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
print_action TStampa_mov::postprocess_page(int file, int counter)
|
|
{
|
|
if (counter)
|
|
{
|
|
//printer().formfeed();
|
|
reset_print(); // per evitare che stampi di nuovo il totale prec.
|
|
return NEXT_PAGE;
|
|
}
|
|
|
|
if (file == LF_SCPERC)
|
|
{
|
|
if (_cur->pos() >= _cur->items()-1) // Se son sull'ultimo
|
|
{
|
|
reset_print();
|
|
_row = 1;
|
|
set_total_perc();
|
|
_row++;
|
|
set_global_total();
|
|
return REPEAT_PAGE;
|
|
}
|
|
}
|
|
return NEXT_PAGE;
|
|
}
|
|
|
|
bool TStampa_mov::set_print(int)
|
|
{
|
|
long codditta_prec;
|
|
int i = 0;
|
|
|
|
if (_liv == 'S')
|
|
{
|
|
codditta_prec = get_firm_770();
|
|
while ((_codditta = _cnf->get_long(DITTE_SEL, _section, i++)) != 0L)
|
|
{
|
|
set_firm_770(_codditta);
|
|
|
|
// init_print ritorna TRUE solo se K_ENTER
|
|
if (init_print())
|
|
print();
|
|
else break;
|
|
}
|
|
set_firm_770(codditta_prec);
|
|
// Non richiamare di nuovo print()!
|
|
return FALSE;
|
|
}
|
|
else
|
|
return init_print();
|
|
}
|
|
|
|
bool TStampa_mov::init_print()
|
|
{
|
|
TMask msk ("772300a");
|
|
msk.set_handler (F_CODDITTA, codditta_hnd);
|
|
printer().footerlen(3);
|
|
|
|
set_real_picture("###.###.###.###");
|
|
set_magic_currency(TRUE);
|
|
|
|
_g_tot_imp = _g_tot_rit = _g_tot_ver = ZERO;
|
|
|
|
KEY tasto = msk.run();
|
|
if (tasto == K_ENTER)
|
|
{
|
|
_tipoa_da = msk.get (F_TIPODA)[0];
|
|
_cod_da = msk.get_long(F_CODDA);
|
|
_tipoa_a = msk.get (F_TIPOA)[0];
|
|
_cod_a = msk.get_long(F_CODA);
|
|
|
|
TDate datada (msk.get(F_DATADA));
|
|
TDate dataa (msk.get(F_DATAA));
|
|
|
|
TString data1 = datada.string();
|
|
TString data2 = dataa.string();
|
|
|
|
_datada = data1 == "" ? botime : datada;
|
|
_dataa = data2 == "" ? eotime : dataa;
|
|
|
|
TDate data (msk.get(F_DATASTAMPA));
|
|
_datastampa = data.string();
|
|
|
|
reset_files(); //resetta l'albero di stampa
|
|
add_file(LF_SCPERC);
|
|
|
|
TLocalisamfile* fl = &(current_cursor()->file(LF_SCPERC));
|
|
TRectype da (fl->curr());
|
|
TRectype a (fl->curr());
|
|
|
|
da.zero();
|
|
a.zero();
|
|
|
|
da.put(SPR_CODDITTA, _codditta);
|
|
da.put(SPR_TIPOA, _tipoa_da);
|
|
da.put(SPR_CODANAGR, _cod_da);
|
|
|
|
a.put(SPR_CODDITTA, _codditta);
|
|
a.put(SPR_TIPOA, _tipoa_a);
|
|
a.put(SPR_CODANAGR, _cod_a);
|
|
|
|
current_cursor()->setregion(da, a);
|
|
|
|
// viene ordinato per numero pagamento e numero versamento
|
|
// _pagver.sort(compare_rows);
|
|
dati_erogante();
|
|
stampa_dati_erog_perc();
|
|
//intesta_fissa();
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
void TStampa_mov::dati_erogante()
|
|
{
|
|
char tipoa;
|
|
bool ditta_ok = FALSE;
|
|
|
|
_ragsocER = "";
|
|
_codanagER = 0L;
|
|
|
|
_nditte->setkey(1);
|
|
_nditte->curr().zero();
|
|
_nditte->curr().put(NDT_CODDITTA, _codditta);
|
|
ditta_ok = _nditte->read() == NOERR;
|
|
if (ditta_ok)
|
|
{
|
|
tipoa = _nditte->get_char(NDT_TIPOA);
|
|
_codanagER = _nditte->get_long(NDT_CODANAGR);
|
|
}
|
|
|
|
if (ditta_ok)
|
|
{
|
|
_anag->setkey(1);
|
|
_anag->zero();
|
|
_anag->put(ANA_TIPOA, tipoa);
|
|
_anag->put(ANA_CODANAGR, _codanagER);
|
|
if (_anag->read() == NOERR)
|
|
{
|
|
_ragsocER = _anag->get(ANA_RAGSOC);
|
|
if (tipoa == 'F')
|
|
{
|
|
TString80 nome = _ragsocER.mid(30);
|
|
_ragsocER.cut(30);
|
|
_ragsocER.trim(); nome.trim();
|
|
_ragsocER << ' ' << nome;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void TStampa_mov::stampa_dati_erog_perc()
|
|
{
|
|
TString sep;
|
|
TString app(132);
|
|
reset_header();
|
|
|
|
// 7.12.95 Numero di pagina qui!
|
|
set_header (1, "ELENCO MOVIMENTI PER PERCIPIENTE @121gPag. @#");
|
|
set_header (3, "SOGGETTO EROGANTE");
|
|
set_header (3, "@19g%5d", _codditta); // 20.11.95 codditta e NON codanag
|
|
set_header (3, "@25g%s", (const char*) _ragsocER);
|
|
set_header (3, "@80gData@85g%10s", (const char*) _datastampa);
|
|
sep << "@#";
|
|
sep.right_just(125);
|
|
set_header(3,(const char*) sep);
|
|
app.fill('_');
|
|
set_header (5, (const char*) app);
|
|
set_header (6, "Num.@5gCod.@13gDocumento@32gData@78gEstremi versamento@97gSerie@103gNumero");
|
|
set_header (7, "Reg.@5gCaus.@13gData@24gNumero@48gImponibili@62g%%@69gRitenute@78gLV@81gTV@84gData@97gABI@103gCAB@116gImporto versato");
|
|
set_header (8, (const char*) app);
|
|
}
|
|
|
|
/*
|
|
// Crea l'intestazione per la stampa a 132 e a 198 caratteri
|
|
void TStampa_mov::intesta_fissa()
|
|
{
|
|
set_background();
|
|
set_background("W4l{1 5 198 5} W4l{1 8 198 8}");
|
|
}
|
|
*/
|
|
|
|
bool TStampa_mov::user_create()
|
|
{
|
|
// Parametri configurazione
|
|
_section = name();
|
|
_section.cut(2);
|
|
_cnf = new TConfig(CONFIG_USER, _section);
|
|
_rel = new TRelation (LF_SCPERC);
|
|
_cur = new TCursor(_rel,"",2);
|
|
// _cur->set_filterfunction (filter_func);
|
|
add_cursor(_cur);
|
|
|
|
_nditte = new TLocalisamfile (LF_NDITTE);
|
|
_anag = new TLocalisamfile (LF_ANAG);
|
|
_rpag = new TLocalisamfile (LF_RPAG);
|
|
_rver = new TLocalisamfile (LF_RVER);
|
|
_codditta = get_firm_770();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool TStampa_mov::user_destroy()
|
|
{
|
|
delete _rel;
|
|
delete _cur;
|
|
delete _nditte;
|
|
delete _anag;
|
|
delete _rpag;
|
|
delete _rver;
|
|
delete _cnf;
|
|
return TRUE;
|
|
}
|
|
|
|
int m72300(int argc, char* argv[])
|
|
{
|
|
TStampa_mov a(*argv[2]);
|
|
a.run(argc, argv, "Stampa movimenti per percipienti");
|
|
return 0;
|
|
}
|