1857 lines
52 KiB
C++
Executable File
1857 lines
52 KiB
C++
Executable File
// cg3400 - Stampa libro giornale
|
|
|
|
#include "cglib01.h"
|
|
#include "cglib03.h"
|
|
#include "cg2103.h"
|
|
#include "cg3400a.h"
|
|
#include "cg3400b.h"
|
|
|
|
#include <config.h>
|
|
#include <currency.h>
|
|
#include <mask.h>
|
|
#include <tabutil.h>
|
|
#include <printapp.h>
|
|
#include <progind.h>
|
|
#include <recarray.h>
|
|
|
|
#include <mov.h>
|
|
#include <rmov.h>
|
|
#include <rmoviva.h>
|
|
#include <nditte.h>
|
|
#include <anagr.h>
|
|
#include <anafis.h>
|
|
#include <anagiu.h>
|
|
#include <causali.h>
|
|
#include <comuni.h>
|
|
#include <pconti.h>
|
|
#include <clifo.h>
|
|
#include <occas.h>
|
|
|
|
HIDDEN const char* REAL_PICTURE = "###.###.###.###.###";
|
|
|
|
HIDDEN const int RIGHE_FOOTER = 3;
|
|
|
|
HIDDEN const int WCAUS132 = 20;
|
|
HIDDEN const int WOPER132 = 28;
|
|
HIDDEN const int WCONTO132 = 35;
|
|
HIDDEN const int POSCONTO = 74;
|
|
|
|
HIDDEN const int DARE132 = 95;
|
|
HIDDEN const int AVERE132 = 112;
|
|
HIDDEN const int DARE198 = 152;
|
|
HIDDEN const int AVERE198 = 174;
|
|
|
|
HIDDEN const int SCRITTA = 26;
|
|
HIDDEN const int TOTDARE132 = 84;
|
|
HIDDEN const int SEZA132 = 108;
|
|
HIDDEN const int TOTAVERE132 = 110;
|
|
|
|
enum descr { causale, conto, operazione };
|
|
enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione };
|
|
|
|
|
|
class TContoOccas : public TBill
|
|
{
|
|
TString16 _occfpi;
|
|
TAssoc_array _desc;
|
|
|
|
public:
|
|
const TContoOccas& set(int g = 0, int c = 0, long s = 0L, char t = ' ',
|
|
const char* occfpi = NULL);
|
|
|
|
const TString& descrizione();
|
|
|
|
TContoOccas();
|
|
virtual ~TContoOccas() {}
|
|
};
|
|
|
|
TContoOccas::TContoOccas()
|
|
{ }
|
|
|
|
const TContoOccas& TContoOccas::set(int g, int c, long s, char t, const char* occfpi)
|
|
{
|
|
TBill::set(g,c,s,t);
|
|
_occfpi = t > ' ' ? occfpi : "";
|
|
return *this;
|
|
}
|
|
|
|
const TString& TContoOccas::descrizione()
|
|
{
|
|
if (tipo() > ' ' && _occfpi.not_empty())
|
|
{
|
|
TString16 code; code << tipo() << '|' << sottoconto();
|
|
const bool really_occas = cache().get(LF_CLIFO, code, CLI_OCCAS).not_empty();
|
|
if (really_occas)
|
|
return cache().get(LF_OCCAS, _occfpi, "RAGSOC");
|
|
}
|
|
|
|
TString16 code; code.format("%c%03d%03d%06ld",
|
|
tipo(), gruppo(), conto(), sottoconto());
|
|
TString* d = (TString*)_desc.objptr(code);
|
|
if (d == NULL)
|
|
{
|
|
d = new TString(TBill::descrizione());
|
|
_desc.add(code, d);
|
|
}
|
|
return *d;
|
|
}
|
|
|
|
class TStampa_giornale : public TPrintapp
|
|
{
|
|
static bool mask_a_cod_reg (TMask_field& f, KEY k);
|
|
static bool data_a_hndl (TMask_field& f, KEY k);
|
|
static bool data_da_hndl (TMask_field& f, KEY k);
|
|
static bool mask_b_ripristina(TMask_field& f, KEY k);
|
|
static bool mask_b_warning (TMask_field& f, KEY k);
|
|
|
|
static bool filter_func(const TRelation * r);
|
|
static bool filtra_reg (const TRelation * r);
|
|
int righe_rimaste() const;
|
|
|
|
private:
|
|
TRelation* _rel;
|
|
TCursor* _cur;
|
|
TRectype* _RecPartoDa, *_RecArrivoA;
|
|
int _ae; // anno esercizio di ALLA_DATA
|
|
int _ae_solare; // anno esercizio solare usato per la tabella registri
|
|
int _tipo; // tipo del registro
|
|
int _annoEsMov; // anno esercizio letto da mov
|
|
TString16 _reg;
|
|
int _anno_iva;
|
|
bool _stampa_definitiva;
|
|
bool _cont_sep;
|
|
bool _MovGiaStampato;
|
|
bool _totals_updated;
|
|
|
|
bool _gia_settato_ariportare;
|
|
bool _forza_ariportare;
|
|
int _devo_riportare; // Guy: Togliere 'sto casino se non funziona
|
|
|
|
bool _nuovo_mese; // Finito il mese ?
|
|
long _num_rig;
|
|
real _importo;
|
|
char _sezione;
|
|
int _pagine_contate; // cnt pag. stampate.
|
|
|
|
TContoOccas _tc;
|
|
|
|
public:
|
|
TRigaiva_array _iva_array;
|
|
|
|
TString16 _reg_cod;
|
|
TString80 _reg_descr;
|
|
TDate _data_da, _data_a, _last_data;
|
|
real _tot_dare, _tot_avere; // valori di partenza
|
|
real _tot_dare_progr, _tot_avere_progr; // progressivi anno in corso
|
|
real _tot_dare_progr_ap, _tot_avere_progr_ap; // progr. anno prec.
|
|
real _tot_dare_gg , _tot_avere_gg ; // giornalieri
|
|
real _tot_dare_gg_ap , _tot_avere_gg_ap ; // giornalieri anno precedente
|
|
real _tot_dare_generale, _tot_avere_generale; // tot. generali
|
|
long _nprog_da, _nprog_mov;
|
|
int _stampa_width, _stampa_len;
|
|
|
|
int _pagine_stampate, _pagine_numerate, _stampa_ok, _pagina_da;
|
|
TDate _data_corr, _data_succ, _ultima_data_mov;
|
|
int _mese_corr, _mese_succ;
|
|
int _last_header; // prima riga di intestazione "libera"
|
|
|
|
bool _stampa_stesso_registro;
|
|
bool _libro_giornale_iva_unico, _libro_cronologico, _stampa_intesta, _stampa_num_pag;
|
|
// bool _gia_settata_riga_mov; // per la stampa no iva
|
|
|
|
TString80 _ragsoc, _paiva, _comunefis, _viafis;
|
|
TString16 _provfis, _cap, _occfpi;
|
|
TString80 _cofi;
|
|
|
|
|
|
TTable *_tabreg;
|
|
|
|
|
|
public:
|
|
virtual void preprocess_header();
|
|
virtual void preprocess_footer();
|
|
virtual bool preprocess_page(int, int);
|
|
virtual print_action postprocess_page(int, int);
|
|
virtual print_action postprocess_print(int, int);
|
|
virtual bool preprocess_print(int, int);
|
|
virtual void postclose_print();
|
|
// virtual bool cancel_hook();
|
|
virtual bool set_print(int);
|
|
|
|
virtual void on_firm_change();
|
|
|
|
virtual bool user_create();
|
|
virtual bool user_destroy();
|
|
|
|
void set_rows (int file, int counter);
|
|
int setta_righe_indirizzo(char tipocf, long codcf, int rdesc);
|
|
int setta_righe_iva();
|
|
int setta_righe_valuta(int start_riga);
|
|
int setta_righe_descr(TParagraph_string&, enum descr);
|
|
|
|
void fill_page(int start_riga, int righe_iva);
|
|
void calcola_iva();
|
|
void init_print();
|
|
bool init_cursor();
|
|
|
|
void init_totals();
|
|
int stampa_intestazione_ditta();
|
|
int set_headers();
|
|
|
|
bool leggi_tabreg(const char * codreg, int annoes);
|
|
bool controlla_mov_aep();
|
|
|
|
bool competenza_ep() const { return _ae != _annoEsMov; }
|
|
bool competenza_ec() const { return !competenza_ep(); } // tertium non datur ?
|
|
|
|
void aggiorna_tabreg(int, int);
|
|
void aggiorna_mov();
|
|
int set_totali_giorno(const TDate& giorno, const int righeivasettate);
|
|
int set_totali_pagina(int r);
|
|
void get_dati_ditta ();
|
|
|
|
const TString& get_descr_caus (const char * codcaus);
|
|
const TRectype& look_com (const char* cod, const char* stato = "");
|
|
const TString& get_codiva_des(const char* codiva);
|
|
void update_totals (char sezione, real& importo);
|
|
void set_reg_filter(TMask& m);
|
|
|
|
TStampa_giornale() : _pagine_contate(0) {};
|
|
virtual ~TStampa_giornale() {};
|
|
};
|
|
|
|
HIDDEN TStampa_giornale& app() { return (TStampa_giornale&)main_app(); }
|
|
|
|
bool TStampa_giornale::filtra_reg(const TRelation * r)
|
|
{
|
|
bool ok = true;
|
|
if (app()._ae_solare)
|
|
{
|
|
const TRectype& rec = r->lfile().curr();
|
|
const int anno = atoi(rec.get("CODTAB").left(4));
|
|
ok = anno == app()._ae_solare;
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool TStampa_giornale::filter_func(const TRelation * r)
|
|
{
|
|
const TRectype& recmov = r->curr();
|
|
|
|
// Scarto SEMPRE i provvisori
|
|
const TString& provvis = recmov.get(MOV_PROVVIS);
|
|
if (!provvis.blank())
|
|
return false;
|
|
|
|
// Scarto i movimenti che hanno il registro ai soli fini della liquidazione
|
|
const TRectype& reg = r->lfile("REG").curr();
|
|
const tipo_sospensione ts = reg.get_bool("B1") ? (tipo_sospensione) reg.get_int("I9") : nessuna;
|
|
if (ts == liquidazione)
|
|
return false;
|
|
|
|
// In caso di NO libro con iva scarta quelli che non hanno righe contabili
|
|
if (!app()._libro_giornale_iva_unico)
|
|
{
|
|
const long numreg = recmov.get_long("NUMREG");
|
|
TRectype& recrmov = r->curr(LF_RMOV);
|
|
recrmov.zero();
|
|
recrmov.put("NUMREG", numreg);
|
|
recrmov.put("NUMRIG", 1);
|
|
|
|
if (r->lfile(LF_RMOV).read() != NOERR)
|
|
{
|
|
const long numreg2 = recrmov.get_long("NUMREG");
|
|
return numreg2 == numreg;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Funzioni legate ai parametri ditta
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
const TRectype& TStampa_giornale::look_com (const char* cod, const char* stato)
|
|
{
|
|
TString16 codice;
|
|
codice << stato << '|' << cod;
|
|
return cache().get(LF_COMUNI, codice);
|
|
}
|
|
|
|
const TString & TStampa_giornale::get_descr_caus (const char * codcaus)
|
|
{
|
|
return cache().get(LF_CAUSALI, codcaus).get("DESCR");
|
|
}
|
|
|
|
void TStampa_giornale::get_dati_ditta ()
|
|
{
|
|
TString16 codanagr;
|
|
char tipoa;
|
|
|
|
const TRectype & nditte = cache().get(LF_NDITTE, get_firm());
|
|
|
|
_ragsoc = nditte.get(NDT_RAGSOC);
|
|
codanagr = nditte.get(NDT_CODANAGR);
|
|
tipoa = nditte.get_char(NDT_TIPOA);
|
|
|
|
TToken_string key ;
|
|
|
|
key.add(tipoa);
|
|
key.add(codanagr);
|
|
const TRectype & anag = cache().get(LF_ANAG, key);
|
|
|
|
_cofi = anag.get(ANA_COFI);
|
|
_paiva = anag.get(ANA_PAIV);
|
|
_comunefis = anag.get(ANA_COMRF);
|
|
_cap = anag.get(ANA_CAPRF);
|
|
|
|
if (_comunefis.empty())
|
|
_comunefis = anag.get(ANF_COMRES);
|
|
|
|
const TRectype& dep = look_com(_comunefis);
|
|
_comunefis = dep.get(COM_DENCOM);
|
|
_provfis = dep.get(COM_PROVCOM);
|
|
if (_cap.empty())
|
|
_cap = dep.get(COM_CAPCOM);
|
|
|
|
if (_comunefis.empty())
|
|
{
|
|
_viafis = anag.get(ANA_INDRF);
|
|
_viafis.rtrim();
|
|
_viafis << " " << anag.get (ANA_CIVRF);
|
|
}
|
|
else
|
|
{
|
|
_viafis = anag.get(ANA_INDRES);
|
|
_viafis.rtrim();
|
|
_viafis << " " << anag.get (ANA_CIVRES);
|
|
}
|
|
}
|
|
|
|
void TStampa_giornale::on_firm_change()
|
|
{
|
|
TConfig conf(CONFIG_DITTA);
|
|
_libro_giornale_iva_unico = conf.get_bool("StLgiU");
|
|
_libro_cronologico = conf.get_bool("GsLbCn");
|
|
}
|
|
|
|
bool TStampa_giornale::user_create()
|
|
{
|
|
_ae = 0;
|
|
_ae_solare = 0;
|
|
open_files(LF_TABCOM, LF_TAB, LF_NDITTE, LF_ANAG, LF_COMUNI, LF_CLIFO, LF_PCON, LF_OCCAS, 0);
|
|
_tabreg = new TTable ("REG");
|
|
|
|
|
|
|
|
_rel = new TRelation (LF_MOV);
|
|
_rel->add (LF_RMOV, "NUMREG==NUMREG");
|
|
_rel->add (LF_RMOVIVA, "NUMREG==NUMREG");
|
|
_rel->add ("REG", "CODTAB[1,4]==ANNOIVA|CODTAB[5,7]==REG"); // CM500302 senza == si incasina con registri vuoti!
|
|
|
|
_cur = new TCursor (_rel, "", 2); // usa la chiave 2: DATAREG+NUMREG
|
|
|
|
_RecPartoDa = new TRectype(_cur->curr());
|
|
_RecArrivoA = new TRectype(_cur->curr());
|
|
|
|
add_cursor (_cur);
|
|
|
|
add_file (LF_MOV);
|
|
add_file (LF_RMOV);
|
|
add_file (LF_RMOVIVA);
|
|
return true;
|
|
}
|
|
|
|
bool TStampa_giornale::user_destroy()
|
|
{
|
|
delete _rel;
|
|
delete _RecPartoDa;
|
|
delete _RecArrivoA;
|
|
|
|
delete _tabreg;
|
|
return true;
|
|
}
|
|
|
|
void TStampa_giornale::aggiorna_mov()
|
|
{
|
|
TLocalisamfile& mov = _cur->file(LF_MOV);
|
|
long nprog = _nprog_da + 1;
|
|
|
|
_cur->setregion(*_RecPartoDa, *_RecArrivoA);
|
|
|
|
const long items = _cur->items();
|
|
TProgind prnd (items, TR("Aggiornamento movimenti ..."), false, true);
|
|
|
|
for ((*_cur) = 0L; _cur->pos() < items; ++(*_cur))
|
|
{
|
|
const bool gia_stampato = _cur->file(LF_MOV).get_bool(MOV_STAMPATO);
|
|
if (!gia_stampato)
|
|
{
|
|
_cur->file(LF_MOV).put (MOV_STAMPATO, true);
|
|
_cur->file(LF_MOV).put (MOV_NUMGIO, nprog);
|
|
mov.rewrite();
|
|
nprog++;
|
|
}
|
|
prnd.addstatus(1);
|
|
}
|
|
}
|
|
|
|
int TStampa_giornale::set_totali_giorno(const TDate& data, const int righeiva)
|
|
{
|
|
int r = righeiva + 1;
|
|
char dep[200];
|
|
const int SHIFT = 15;
|
|
const int STACC = 51 + SHIFT;
|
|
|
|
// Se e' l'unico totale lo stampo anche se e' zero
|
|
if (competenza_ec() || (_tot_avere_gg != ZERO || _tot_dare_gg != ZERO))
|
|
{
|
|
TString80 td; real2currency(td, _tot_dare_gg);
|
|
TString80 ta; real2currency(ta, _tot_avere_gg);
|
|
|
|
sprintf(dep, FR("@b@%dgTotale operazioni del %s @%dg%c %s @%dg%c @%dg%s"),
|
|
_stampa_width == 132 ? SCRITTA : DARE198-STACC,
|
|
data.string(),
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
'D',
|
|
(const char*)td,
|
|
_stampa_width == 132 ? SEZA132 : AVERE198-2,
|
|
'A',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char*)ta
|
|
);
|
|
|
|
set_row (r++, "%s", dep);
|
|
_tot_dare_gg = _tot_avere_gg = ZERO;
|
|
}
|
|
|
|
if (competenza_ep() || (_tot_avere_gg_ap != ZERO || _tot_dare_gg_ap != ZERO))
|
|
{
|
|
TString80 tdp; real2currency(tdp, _tot_dare_gg_ap);
|
|
TString80 tap; real2currency(tap, _tot_avere_gg_ap);
|
|
|
|
sprintf (dep, FR("@b@%dgTotale operazioni del %s Anno precedente @%dg%c %s @%dg%c @%dg%s"),
|
|
_stampa_width == 132 ? SCRITTA : DARE198-STACC,
|
|
data.string(),
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
'D',
|
|
(const char*)tdp,
|
|
_stampa_width == 132 ? SEZA132 : AVERE198-2,
|
|
'A',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char*)tap
|
|
);
|
|
|
|
set_row (r++, "%s", dep);
|
|
|
|
_tot_avere_gg_ap = _tot_dare_gg_ap = ZERO;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
|
|
void TStampa_giornale::postclose_print()
|
|
{
|
|
if (_stampa_definitiva && yesno_box(TR("La stampa e' corretta?")))
|
|
{
|
|
const int ultima_fatta = _pagine_contate;
|
|
aggiorna_mov();
|
|
aggiorna_tabreg (_pagina_da, ultima_fatta);
|
|
}
|
|
}
|
|
|
|
|
|
void TStampa_giornale::preprocess_footer()
|
|
{
|
|
TString progr_dare_ap(22), progr_avere_ap(22);
|
|
TString progr_dare(25), progr_avere(25), dts(25), ats(25);
|
|
TString256 riga;
|
|
bool ap = false;
|
|
int r=1; // was 2
|
|
const int STUMB = 42;
|
|
real dt, at;
|
|
|
|
reset_footer();
|
|
|
|
if (_tot_avere_progr_ap != ZERO || _tot_dare_progr_ap != ZERO)
|
|
{
|
|
real2currency(progr_dare_ap, _tot_dare_progr_ap);
|
|
real2currency(progr_avere_ap, _tot_avere_progr_ap);
|
|
ap = true;
|
|
}
|
|
|
|
//
|
|
// Non stampo "A riportare"
|
|
// SE :
|
|
// 1. E' gia' stato stampato
|
|
// OPPURE
|
|
// 2. Sono sull'ultima riga
|
|
//
|
|
|
|
const int riporta = _devo_riportare;
|
|
|
|
if (riporta)
|
|
{
|
|
dt = _tot_dare_progr + _tot_dare_progr_ap;
|
|
at = _tot_avere_progr + _tot_avere_progr_ap;
|
|
real2currency(dts, dt);
|
|
real2currency(ats, at);
|
|
|
|
riga.format ("@b@%dg%s@%dg%c %s @%dg%c @%dg%s",
|
|
_stampa_width == 132 ? SCRITTA : DARE198-STUMB,
|
|
TR("A riportare "),
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
'D',
|
|
(const char *) dts,
|
|
_stampa_width == 132 ? SEZA132 : AVERE198-2,
|
|
'A',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char *) ats);
|
|
set_footer (r++, (const char*) riga);
|
|
|
|
_forza_ariportare = false;
|
|
|
|
if (_devo_riportare > 1)
|
|
_devo_riportare = false;
|
|
}
|
|
}
|
|
|
|
|
|
int TStampa_giornale::set_totali_pagina(int righe)
|
|
{
|
|
TString progr_dare_ap(22), progr_avere_ap(22);
|
|
TString progr_dare(22), progr_avere(22), dts(22), ats(22);
|
|
TString256 riga;
|
|
bool ap = false;
|
|
const int SHIFT = 15;
|
|
const int STUMB = 51 + SHIFT;
|
|
real dt, at;
|
|
int r = righe == 0 ? 1 : righe;
|
|
|
|
if (_tot_avere_progr_ap != ZERO || _tot_dare_progr_ap != ZERO)
|
|
{
|
|
real2currency(progr_dare_ap, _tot_dare_progr_ap);
|
|
real2currency(progr_avere_ap, _tot_avere_progr_ap);
|
|
ap = true;
|
|
}
|
|
|
|
if (_cur->pos() == _cur->items()-1) // se sono sull'ultimo
|
|
{
|
|
// I totali distinti tra anno precedente e corrente SOLO SE STAMPA DI PROVA
|
|
if (!_stampa_definitiva)
|
|
{
|
|
real2currency(progr_dare, _tot_dare_progr);
|
|
real2currency(progr_avere, _tot_avere_progr);
|
|
riga = "";
|
|
riga.format(FR("@b@%dgTotale progressivi @%dg%c %s @%dg%c @%dg%s"),
|
|
_stampa_width == 132 ? SCRITTA : DARE198-STUMB,
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
'D',
|
|
(const char *) progr_dare,
|
|
_stampa_width == 132 ? SEZA132 : AVERE198-2,
|
|
'A',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char *) progr_avere
|
|
);
|
|
|
|
set_row (r++, (const char*) riga);
|
|
|
|
if (ap)
|
|
{
|
|
riga.format(FR("@b@%dgTotale progressivi anno precedente @%dg%c %s @%dg%c @%dg%s"),
|
|
_stampa_width == 132 ? SCRITTA : DARE198-STUMB,
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
'D',
|
|
(const char *) progr_dare_ap,
|
|
_stampa_width == 132 ? SEZA132 : AVERE198-2,
|
|
'A',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char *) progr_avere_ap
|
|
);
|
|
set_row (r++, (const char*) riga);
|
|
}
|
|
} // stampa_definitiva
|
|
|
|
_tot_dare_generale = _tot_dare_progr + _tot_dare_progr_ap;
|
|
_tot_avere_generale = _tot_avere_progr + _tot_avere_progr_ap;
|
|
real2currency(dts, _tot_dare_generale);
|
|
real2currency(ats, _tot_avere_generale);
|
|
|
|
riga.format(FR("@b@%dgTotale progressivi generali @%dg%c %s @%dg%c @%dg%s"),
|
|
_stampa_width == 132 ? SCRITTA : DARE198-STUMB,
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
'D',
|
|
(const char *) dts,
|
|
_stampa_width == 132 ? SEZA132 : AVERE198-2,
|
|
'A',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char *) ats
|
|
);
|
|
|
|
set_row (r++, (const char*) riga);
|
|
}
|
|
else // Non ancora totale generale
|
|
{
|
|
// Determina se le righe settate finora stanno in questa pagina oppure no
|
|
_gia_settato_ariportare = righe_rimaste() > righe;
|
|
|
|
// La fill_page mette forza_ariportare a true
|
|
// nel caso di pagine con solo i totali (v. fax VLADIMIRO) bisogna impedire
|
|
// che venga stampato di nuovo "Totale ..." nella preprocess_footer
|
|
_forza_ariportare = false;
|
|
|
|
dt = _tot_dare_progr + _tot_dare_progr_ap;
|
|
at = _tot_avere_progr + _tot_avere_progr_ap;
|
|
real2currency(dts, dt);
|
|
real2currency(ats, at);
|
|
|
|
// "Se il mese e' finito devo scrivere Totale progressivi generali
|
|
// invece che A riportare"
|
|
|
|
riga.format (FR("@b@%dgTotale progressivi generali @%dg%c %s @%dg%c @%dg%s"),
|
|
_stampa_width == 132 ? SCRITTA : DARE198-STUMB,
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
'D',
|
|
(const char *) dts,
|
|
_stampa_width == 132 ? SEZA132 : AVERE198-2,
|
|
'A',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char *) ats);
|
|
set_row (r++, (const char*) riga);
|
|
}
|
|
return r;
|
|
}
|
|
|
|
int TStampa_giornale::stampa_intestazione_ditta()
|
|
{
|
|
int r=1;
|
|
TString256 intes;
|
|
TString riga(_stampa_width);
|
|
|
|
get_dati_ditta();
|
|
|
|
riga.fill('-');
|
|
set_header(r, riga);
|
|
|
|
set_header (++r, FR("Ditta: %5ld %-.50s %.35s %.5s %.20s %.2s"),
|
|
get_firm(),
|
|
(const char *)_ragsoc,
|
|
(const char *)_viafis, (const char *)_cap,
|
|
(const char *)_comunefis, (const char *)_provfis);
|
|
|
|
if (_stampa_definitiva)
|
|
intes.format (FR("Partita iva %s @24gCodice fiscale %s"),
|
|
(const char*)_paiva, (const char*)_cofi,
|
|
_stampa_width == 132 ? 102 : 168
|
|
);
|
|
else
|
|
intes.format (FR("Partita iva %s @24gCodice fiscale %s @%dg%s @%dgData @>"),
|
|
(const char*)_paiva, (const char*)_cofi,
|
|
_stampa_width == 132 ? 102 : 168,
|
|
FR("LIBRO DI PROVA"),
|
|
_stampa_width == 132 ? 117 : 183
|
|
);
|
|
|
|
set_header (++r, "%s", (const char*)intes);
|
|
r++;
|
|
return r;
|
|
}
|
|
|
|
int TStampa_giornale::set_headers()
|
|
{
|
|
int r=1;
|
|
TString riga(_stampa_width);
|
|
|
|
if (_stampa_intesta || !_stampa_definitiva)
|
|
r = stampa_intestazione_ditta();
|
|
else
|
|
r += 2;
|
|
|
|
if (_stampa_definitiva)
|
|
set_header(r++, FR("Codice libro: %s %s "),(const char *) _reg_cod, (const char *) _reg_descr);
|
|
else
|
|
{
|
|
const TString16 data_da = _data_da.string();
|
|
const TString16 data_a = _data_a.string();
|
|
set_header(r++, FR("Codice libro: %s %s @%dgdalla data: %s alla data: %s @%dgEsercizio: %04d"),
|
|
(const char *) _reg_cod, (const char *) _reg_descr,
|
|
_stampa_width == 132 ? 69 : 135,
|
|
(const char *) data_da, (const char *) data_a,
|
|
_stampa_width == 132 ? 117 : 183,
|
|
_ae
|
|
);
|
|
}
|
|
|
|
riga.fill('-');
|
|
set_header(r++, riga);
|
|
|
|
if (_libro_cronologico)
|
|
set_header(r, FR("@59gCodice Conto"));
|
|
|
|
if (!_stampa_definitiva) {
|
|
if (_stampa_width == 132) {
|
|
set_header(r++, "@131gS");
|
|
set_header(r, FR("@1gN.riga"));
|
|
}
|
|
else {
|
|
set_header(r++, "@197gS");
|
|
set_header(r, FR("@1gN.riga"));
|
|
}
|
|
}
|
|
else
|
|
if (_libro_cronologico) r++; // NON LASCIARE RIGHE IN BIANCO!!
|
|
|
|
set_header(r, FR("@8gDescrizione operazione@36gCausale"));
|
|
if (_libro_cronologico)
|
|
// POSCONTO = 74;
|
|
set_header(r, FR("@74gGeneralita' cliente/fornitore"));
|
|
else
|
|
set_header(r, FR("@59gCodice Conto"));
|
|
|
|
if (_stampa_width == 132)
|
|
set_header(r, FR("@120gImporto"));
|
|
else
|
|
set_header(r, FR("@161gDare @184gAvere"));
|
|
|
|
if (!_stampa_definitiva)
|
|
set_header(r, _stampa_width == 132 ? "@131gB" : "@197gB");
|
|
|
|
r++;
|
|
|
|
riga.fill('-');
|
|
set_header(r, riga);
|
|
|
|
return r;
|
|
}
|
|
|
|
void TStampa_giornale::preprocess_header()
|
|
{
|
|
int r = _last_header + 1;
|
|
int pag = printer().getcurrentpage();
|
|
real riporto_dare, riporto_avere;
|
|
|
|
if (_stampa_num_pag) // Stampa numero di pagina in alto a destra
|
|
{
|
|
TEsercizi_contabili esc;
|
|
const int esercizio = esc.date2esc(_data_a); //codice esercizio correntemente selezionato
|
|
const int anno = esc[esercizio].inizio().year(); //anno finale dell'esercizio
|
|
TString16 numpag, riga;
|
|
numpag.format("%d/%d", anno, _pagina_da+pag);
|
|
//numpag.format("%d/%d", esercizio, _pagina_da+pag); // Mediapadania 2013
|
|
const int tab = _stampa_width - numpag.len();
|
|
riga.format("@%dg%s", tab, (const char*)numpag);
|
|
set_header(2, riga); // Sempre quasi sulla prima riga!
|
|
}
|
|
|
|
// _gia_settato_ariportare = false;
|
|
|
|
if (pag > 0) // Stampa riporti
|
|
{
|
|
riporto_dare = _tot_dare_progr + _tot_dare_progr_ap;
|
|
riporto_avere = _tot_avere_progr + _tot_avere_progr_ap;
|
|
|
|
// Non stampa nulla se ZERO SOLO SE DI PROVA <<<<<---------------------
|
|
// Lascio una riga senno' vado a finire sull'intestazione
|
|
if (!_stampa_definitiva)
|
|
if (riporto_dare == ZERO && riporto_avere == ZERO)
|
|
{
|
|
set_header (r, "");
|
|
return;
|
|
}
|
|
|
|
TString80 dare; real2currency(dare, riporto_dare);
|
|
TString80 avere; real2currency(avere, riporto_avere);
|
|
|
|
TString256 riporto;
|
|
riporto.format(FR("@b@%dgRiporto: @%dg%c %17s @%dg%c@%dg%17s"), // prima erano %15s
|
|
_stampa_width == 132 ? SCRITTA : DARE198-11,
|
|
_stampa_width == 132 ? TOTDARE132 : DARE198-2,
|
|
_stampa_width == 132 ? 'D' : ' ',
|
|
(const char *) dare,
|
|
_stampa_width == 132 ? SEZA132 : SEZA132,
|
|
_stampa_width == 132 ? 'A' : ' ',
|
|
_stampa_width == 132 ? TOTAVERE132 : AVERE198,
|
|
(const char *) avere
|
|
);
|
|
|
|
set_header (r++, "%s", (const char *) riporto);
|
|
}
|
|
}
|
|
|
|
//
|
|
// PREPROCESS_PRINT
|
|
//
|
|
// Se non ci sono items nel cursore (= se non ci sono movimenti)
|
|
// la stampa e' abortita.
|
|
//
|
|
// stampa_ok = -1 -> la stampa precedente era OK
|
|
// stampa_ok = x -> la stampa precedente non e' andata a buon fine
|
|
// ed era partita dalla pagina x.
|
|
//
|
|
// Se la stampa precedente e' andata male, setto la pagina corrente a
|
|
// quella salvata in stampa_ok, e la pagina da cui parte la stampa vera e
|
|
// propria a quella che mi dice l'utente:
|
|
//
|
|
// set_page_number (stampa_ok)
|
|
// setfrompage (pagina_da)
|
|
//
|
|
bool TStampa_giornale::preprocess_print(int file, int counter)
|
|
{
|
|
switch (file)
|
|
{
|
|
case LF_MOV:
|
|
_nuovo_mese = false;
|
|
_iva_array.destroy();
|
|
_nprog_mov = _nprog_da;
|
|
*_RecPartoDa = _cur->curr();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int TStampa_giornale::righe_rimaste() const
|
|
{
|
|
const TPrinter& p = printer();
|
|
int rows_left = p.rows_left();
|
|
if (rows_left <= 0)
|
|
rows_left = p.formlen() - (p.headersize()+1) - p.footersize();
|
|
return rows_left;
|
|
}
|
|
|
|
void TStampa_giornale::fill_page(int righe_da_stampare, int righe_iva_settate)
|
|
{
|
|
const TPrinter& p = printer();
|
|
|
|
TString256 rigas;
|
|
int r = righe_da_stampare + 1;
|
|
int r_l = p.rows_left() - righe_da_stampare;
|
|
|
|
if (r_l < 0)
|
|
r_l += p.formlen() - (p.headersize()/*+1*/) - p.footersize();
|
|
|
|
// Se sono rimaste righe da riempire
|
|
if (r_l > 0)
|
|
{
|
|
rigas.fill('=', _stampa_width);
|
|
set_row(r++, "%s", (const char*) rigas);
|
|
int j=0;
|
|
// Calcola una specie di coefficiente angolare
|
|
int alfa = (_stampa_width - 6) / r_l;
|
|
r_l--;
|
|
|
|
for ( ; r_l > 0; r_l--) // Non stampare sulla riga orizzontale!
|
|
{
|
|
rigas.format("@%dg======", j);
|
|
set_row(r++, rigas);
|
|
j += alfa;
|
|
}
|
|
}
|
|
}
|
|
|
|
print_action TStampa_giornale::postprocess_print(int file, int counter)
|
|
{
|
|
if (file == LF_MOV)
|
|
_pagine_contate = printer().getcurrentpage() - 1;
|
|
return NEXT_PAGE;
|
|
}
|
|
|
|
print_action TStampa_giornale::postprocess_page(int file, int counter)
|
|
{
|
|
int righe_iva_settate=0;
|
|
// bool FINITO = false;
|
|
|
|
if (counter)
|
|
{
|
|
if (_nuovo_mese)
|
|
{
|
|
printer().formfeed();
|
|
_nuovo_mese = false;
|
|
}
|
|
return NEXT_PAGE;
|
|
}
|
|
|
|
switch (file)
|
|
{
|
|
case LF_MOV:
|
|
{
|
|
reset_print();
|
|
righe_iva_settate = 0;
|
|
if (_libro_giornale_iva_unico)
|
|
{
|
|
righe_iva_settate = setta_righe_iva();
|
|
righe_iva_settate = setta_righe_valuta(righe_iva_settate);
|
|
}
|
|
|
|
_cur->save_status();
|
|
++(*_cur);
|
|
_data_succ = _cur->file(LF_MOV).get_date(MOV_DATAREG);
|
|
_mese_succ = _data_succ.month();
|
|
--(*_cur);
|
|
_cur->restore_status();
|
|
|
|
_devo_riportare = true;
|
|
|
|
const bool last_row = _cur->pos() == _cur->items()-1;
|
|
if (_data_corr != _data_succ || last_row)
|
|
{
|
|
_nuovo_mese = (_mese_succ != _mese_corr);
|
|
int righe = set_totali_giorno(_data_corr, righe_iva_settate);
|
|
if (_nuovo_mese || last_row)
|
|
{
|
|
righe = set_totali_pagina(righe);
|
|
|
|
if (righe - 1 > (int)printer().rows_left())
|
|
_devo_riportare = 3; // Very true!
|
|
else
|
|
_devo_riportare = false;
|
|
|
|
// Nella stampa su bollato metto un segno su tutte le righe
|
|
if (_stampa_definitiva)
|
|
fill_page(righe - 1, righe_iva_settate);
|
|
}
|
|
return REPEAT_PAGE;
|
|
}
|
|
|
|
if (righe_iva_settate > 0)
|
|
return REPEAT_PAGE;
|
|
}
|
|
break;
|
|
|
|
case LF_RMOV:
|
|
// Sposto qui per evitare di aggiornare i progressivi con una riga della
|
|
// pagina dopo
|
|
if (!_totals_updated)
|
|
update_totals(_sezione, _importo);
|
|
_gia_settato_ariportare = false;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return NEXT_PAGE;
|
|
}
|
|
|
|
void TStampa_giornale::update_totals (char sezione, real& importo)
|
|
{
|
|
#ifdef DBG
|
|
TString dgap(_tot_dare_gg_ap.string());
|
|
TString dgpp(_tot_dare_progr_ap.string());
|
|
TString dgac(_tot_dare_gg.string());
|
|
TString dgpc(_tot_dare_progr.string());
|
|
TString agap(_tot_avere_gg_ap.string());
|
|
TString agpp(_tot_avere_progr_ap.string());
|
|
TString agac(_tot_avere_gg.string());
|
|
TString agpc(_tot_avere_progr.string());
|
|
#endif
|
|
|
|
if (sezione == 'D')
|
|
{
|
|
if (_annoEsMov != _ae) {
|
|
_tot_dare_gg_ap += importo; // prog. anno precedente
|
|
_tot_dare_progr_ap += importo;
|
|
}
|
|
else {
|
|
_tot_dare_gg += importo; // prog. giornalieri
|
|
_tot_dare_progr += importo; // prog. generali
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (_annoEsMov != _ae) {
|
|
_tot_avere_gg_ap += importo;
|
|
_tot_avere_progr_ap += importo;
|
|
}
|
|
else {
|
|
_tot_avere_gg += importo;
|
|
_tot_avere_progr += importo;
|
|
}
|
|
}
|
|
#ifdef DBG
|
|
dgap = _tot_dare_gg_ap.string();
|
|
dgpp = _tot_dare_progr_ap.string();
|
|
dgac = _tot_dare_gg.string();
|
|
dgpc = _tot_dare_progr.string();
|
|
agap = _tot_avere_gg_ap.string();
|
|
agpp = _tot_avere_progr_ap.string();
|
|
agac = _tot_avere_gg.string();
|
|
agpc = _tot_avere_progr.string();
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
void TStampa_giornale::set_rows (int file, int counter)
|
|
{
|
|
TString16 datadoc_str, datareg_str, numdoc, frm, caus;
|
|
TDate datadoc, datareg;
|
|
TString80 mov_descr, rmv_descr, cont_sep;
|
|
long numreg, protiva;
|
|
int r = 1;
|
|
int g, c;
|
|
long s;
|
|
static char cf = ' ';
|
|
static int rdes = 1;
|
|
|
|
switch (file)
|
|
{
|
|
case LF_MOV:
|
|
{
|
|
const TRectype& mov = _cur->curr(LF_MOV);
|
|
reset_row(1);
|
|
reset_row(2);
|
|
|
|
datareg = mov.get_date("DATAREG");
|
|
datadoc = mov.get_date("DATADOC");
|
|
datareg_str = datareg.string();
|
|
// "Fai vedere lo stesso ..-..-.... anche se non c'e' la data..."
|
|
if (datareg_str.empty())
|
|
datareg_str = " - - ";
|
|
datadoc_str = datadoc.string();
|
|
if (datadoc_str.empty())
|
|
datadoc_str = " - - ";
|
|
numdoc = mov.get("NUMDOC");
|
|
numreg = mov.get_long("NUMREG");
|
|
mov_descr = mov.get("DESCR");
|
|
|
|
if (_cont_sep )
|
|
cont_sep = cache().get("&NPENT", mov.get(MOV_CONTSEP), "S0");
|
|
|
|
// Usati in setta_righe_iva per determinare tipo attivita'
|
|
_reg = mov.get(MOV_REG);
|
|
_anno_iva = mov.get_int(MOV_ANNOIVA);
|
|
|
|
protiva = mov.get_long(MOV_PROTIVA);
|
|
caus = mov.get(MOV_CODCAUS);
|
|
_occfpi = mov.get(MOV_OCFPI);
|
|
_annoEsMov = mov.get_int(MOV_ANNOES);
|
|
_MovGiaStampato = mov.get_bool(MOV_STAMPATO);
|
|
|
|
if (_stampa_definitiva)
|
|
{
|
|
set_row(r,FR("Operazione n. @b%-7ld@r"), _nprog_mov);
|
|
set_row(r,FR(" del @b%s@r"), (const char*)datareg_str); // XX/XX/XXXX
|
|
set_row(r,FR(" doc. n. @b%-7s@r"),(const char*)numdoc);
|
|
set_row(r,FR(" del @b%s@r %-50s"),(const char*)datadoc_str,
|
|
(const char*)mov_descr);
|
|
}
|
|
else
|
|
{
|
|
set_row(r,FR("Operazione n. @b%-7ld@r"), numreg);
|
|
set_row(r,FR(" del @b%s@r"), (const char*) datareg_str);
|
|
set_row(r,FR(" doc. n. @b%-7s@r"), (const char*) numdoc);
|
|
set_row(r,FR(" del @b%s@r %-80s"), (const char*)datadoc_str,(const char*)mov_descr);
|
|
}
|
|
|
|
if (_annoEsMov != _ae)
|
|
set_row(r,FR(" Comp. %04d"), _annoEsMov);
|
|
|
|
if (_MovGiaStampato && !_stampa_definitiva)
|
|
{
|
|
TString16 fmt;
|
|
fmt.format("@%dg*", _stampa_width == 132 ? 131 : 197);
|
|
set_row(r,fmt);
|
|
}
|
|
|
|
if (cont_sep.full())
|
|
set_row(++r,FR("%-50s"), (const char*)cont_sep);
|
|
if (caus.not_empty())
|
|
{
|
|
const char* desc_caus = get_descr_caus(caus);
|
|
set_row(r+1, FR("@36gCausale %3s %-50s"), (const char*) caus, desc_caus);
|
|
if (_reg.not_empty())
|
|
set_row(r+1, FR(" (R.IVA @b%3s@r Prot. @b%ld@r) "), (const char*)_reg,protiva);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case LF_RMOV:
|
|
{
|
|
const TRectype& rmov = _cur->curr(LF_RMOV);
|
|
_num_rig++;
|
|
reset_print();
|
|
|
|
g = rmov.get_int("GRUPPO");
|
|
c = rmov.get_int("CONTO");
|
|
s = rmov.get_long("SOTTOCONTO");
|
|
cf = rmov.get_char(RMV_TIPOC);
|
|
|
|
if (cf != 'C' && cf != 'F')
|
|
cf = ' ';
|
|
|
|
numreg = rmov.get_long("NUMREG");
|
|
datareg = rmov.get("DATAREG");
|
|
|
|
_sezione = rmov.get_char (RMV_SEZIONE);
|
|
_importo = rmov.get_real (RMV_IMPORTO);
|
|
|
|
rmv_descr = rmov.get(RMV_DESCR);
|
|
|
|
r=1;
|
|
|
|
// Num. progressivo di operazione. Azzerato in preprocess_page
|
|
if (!_stampa_definitiva) set_row (r, "%7ld", _num_rig);
|
|
|
|
set_row (r, "@8g%-50s", (const char*) rmv_descr);
|
|
|
|
set_row (r, "@59g%03d.", g);
|
|
if (c != 0)
|
|
set_row (r, "%03d.", c);
|
|
if (s != 0L)
|
|
set_row (r, "%06ld", s);
|
|
|
|
if (cf > ' ' && _occfpi.not_empty() && s == _cur->curr(LF_MOV).get_long(MOV_CODCF))
|
|
_tc.set(g,c,s,cf,_occfpi);
|
|
else
|
|
_tc.set(g,c,s,cf,"");
|
|
|
|
TParagraph_string descr_conto("", 198);
|
|
if (_stampa_width == 132)
|
|
descr_conto.set_width (WCONTO132);
|
|
else // se a 198 non spezzo le descrizioni
|
|
descr_conto.set_width(198);
|
|
|
|
descr_conto = _tc.descrizione();
|
|
|
|
if (_stampa_width == 132)
|
|
rdes = setta_righe_descr (descr_conto, conto);
|
|
else
|
|
{
|
|
rdes = 2;
|
|
frm.format("@%dg%%-%ds", POSCONTO,50);
|
|
set_row (r, frm, (const char*) descr_conto);
|
|
}
|
|
|
|
if (cf > ' ')
|
|
if (_libro_cronologico)
|
|
rdes = setta_righe_indirizzo(cf, s, rdes);
|
|
|
|
// NB Totali aggiornati in postprocess_page (update_totals())
|
|
|
|
if (_stampa_width == 132)
|
|
{
|
|
set_row (r, "@110g%r %c", &_importo, _sezione);
|
|
}
|
|
else // stampa_width == 198
|
|
set_row (r, _sezione == 'D' ? "@152g%r" : "@174g%r", &_importo);
|
|
|
|
if (_MovGiaStampato && !_stampa_definitiva)
|
|
{
|
|
TString16 fmt;
|
|
fmt.format("@%dg*", _stampa_width == 132 ? 131 : 197);
|
|
set_row(r,fmt);
|
|
}
|
|
|
|
{
|
|
const int rows = rdes - 1;
|
|
const int left = printer().rows_left();
|
|
if (left > 0 && left < rows)
|
|
{
|
|
_totals_updated = true;
|
|
update_totals(_sezione, _importo);
|
|
}
|
|
else
|
|
_totals_updated = false;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// PREPROCESS_PAGE
|
|
//
|
|
// Non scarto nulla qui, non si deve mai vedere una stampa vuota
|
|
//
|
|
bool TStampa_giornale::preprocess_page(int file, int counter)
|
|
{
|
|
if (counter) return true;
|
|
|
|
switch (file)
|
|
{
|
|
|
|
case LF_MOV:
|
|
{
|
|
_annoEsMov = _anno_iva = 0;
|
|
_iva_array.destroy();
|
|
*_RecArrivoA = _cur->file(LF_MOV).curr();
|
|
_nprog_mov++;
|
|
// Il numero di operazione deve ripartire da 0 per ogni movimento
|
|
_num_rig = 0;
|
|
_data_corr = _cur->file(LF_MOV).get_date(MOV_DATAREG);
|
|
// _ultima_data_mov finisce sul registro come ultima data di stampa
|
|
if (_data_corr > _ultima_data_mov)
|
|
_ultima_data_mov = _data_corr;
|
|
_mese_corr = _data_corr.month();
|
|
_devo_riportare = true;
|
|
}
|
|
break;
|
|
|
|
case LF_RMOV:
|
|
break;
|
|
|
|
case LF_RMOVIVA:
|
|
if (_libro_giornale_iva_unico) calcola_iva ();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
set_rows (file, counter);
|
|
return true;
|
|
}
|
|
|
|
void TStampa_giornale::calcola_iva()
|
|
{
|
|
const TRectype& iva = _cur->curr(LF_RMOVIVA);
|
|
if (!iva.empty())
|
|
_iva_array.add_riga(iva);
|
|
}
|
|
|
|
int TStampa_giornale::setta_righe_descr(TParagraph_string& str, enum descr des)
|
|
{
|
|
int i = 1;
|
|
TString16 frm;
|
|
const char* r;
|
|
// char descr[51];
|
|
TString80 descr;
|
|
|
|
switch (des)
|
|
{
|
|
case causale: // lunga 20
|
|
if (_libro_giornale_iva_unico)
|
|
frm.format("@10g\0x25%ds", _stampa_width == 132 ? WCAUS132 : 40);
|
|
else
|
|
frm.format("@48g%%d", WCAUS132);
|
|
break;
|
|
case conto: // lunga 21
|
|
// if (_libro_giornale_iva_unico)
|
|
frm.format("@%dg%%-%ds", POSCONTO,WCONTO132);
|
|
/*
|
|
else
|
|
frm.format("@26g%%d", POSCONTO,WCONTO132); */
|
|
break;
|
|
case operazione: // lunga 28
|
|
if (_libro_giornale_iva_unico)
|
|
frm.format("@31g%%d", WOPER132);
|
|
else
|
|
frm.format("@69g%%d", WOPER132);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
while ((r = str.get()) != NULL)
|
|
{
|
|
descr = r;
|
|
descr.ltrim();
|
|
set_row (i++, (const char*)frm, (const char*)descr);
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
const TString& TStampa_giornale::get_codiva_des(const char* codiva)
|
|
{
|
|
return cache().get("%IVA", codiva).get("S0");
|
|
}
|
|
|
|
// NB
|
|
// Questa funzione ritorna il numero di righe che ha settato.
|
|
// Se questo e' diverso da 0 viene fatta una REPEAT_PAGE
|
|
// Attenzione quindi se si modifica la variabile r
|
|
int TStampa_giornale::setta_righe_iva()
|
|
{
|
|
int r=0, j;
|
|
TString80 rig, impon_str, impos_str;
|
|
|
|
for (j = 0; j < _iva_array.items(); j++)
|
|
{
|
|
const TRigaiva& riga = _iva_array.riga(j);
|
|
r = j+1;
|
|
real2currency(impon_str, riga._imponibile);
|
|
real2currency(impos_str, riga._imposta);
|
|
set_row(r, FR(" Imponibile@15g%15s"), (const char*)impon_str);
|
|
set_row(r, FR("@35gImposta@43g%15s"), (const char*)impos_str);
|
|
set_row(r, FR("@64gCod.Iva %3s"), (const char*)riga._codiva);
|
|
const TString& codiva_des = get_codiva_des(riga._codiva);
|
|
const int tipoatt = riga._tipoatt;
|
|
if (_stampa_width == 132)
|
|
set_row(r, "@76g%-.17s", (const char*)codiva_des);
|
|
else
|
|
set_row(r, "@76g%-.50s", (const char*)codiva_des);
|
|
const int S132 = 97;
|
|
const int S198 = 127;
|
|
rig.format("@%dg", _stampa_width == 132 ? S132 : S198);
|
|
rig << riga.descr_det();
|
|
set_row(r, (const char*)rig);
|
|
|
|
const int meseliq = _cur->file(LF_MOV).get_int(MOV_MESELIQ);
|
|
if (meseliq > 0)
|
|
set_row(r, FR(" Mese liq. %2d"), meseliq);
|
|
|
|
if (tipoatt != 0)
|
|
{
|
|
TRegistro reg(_reg, _anno_iva);
|
|
const bool att_mista_ev = reg.attivita_mista();
|
|
if (att_mista_ev)
|
|
set_row(r, FR(" Tipo attivita' %d"), tipoatt);
|
|
}
|
|
}
|
|
_iva_array.destroy();
|
|
return r;
|
|
}
|
|
|
|
int TStampa_giornale::setta_righe_valuta(int r)
|
|
{
|
|
const real corrval = current_cursor()->file(LF_MOV).get_real(MOV_CORRVALUTA);
|
|
|
|
if (corrval != ZERO)
|
|
{
|
|
const TString16 codvali = current_cursor()->file(LF_MOV).get(MOV_CODVALI);
|
|
const TCurrency cur(corrval, codvali);
|
|
set_row(++r,FR("@56gValuta %3s"), (const char*)codvali);
|
|
if (_stampa_width == 132)
|
|
set_row(r,FR("@89gCorr.in valuta @109g%20v"), &cur);
|
|
else
|
|
set_row(r,FR("@119gCorr.in valuta @171g%20v"), &cur);
|
|
}
|
|
return r;
|
|
}
|
|
|
|
// Cerca l'indirizzo del C/F.
|
|
// Legge CLIFO o OCCAS a seconda di _occas
|
|
// Setta le righe 2 e 3 che vengono poi resettate al record successivo
|
|
int TStampa_giornale::setta_righe_indirizzo(char tipocf, long codcf,int rdes)
|
|
{
|
|
TString16 prov, comcf, capcf, civcf, statocf;
|
|
TString80 viacf, comune;
|
|
char tipoa;
|
|
long codanagr;
|
|
char riga[256];
|
|
int r = rdes;
|
|
|
|
TToken_string key;
|
|
key.add(tipocf);
|
|
key.add( codcf);
|
|
|
|
const TRectype & clifo = cache().get(LF_CLIFO, key);
|
|
|
|
if (_occfpi.not_empty() && clifo.get_bool(CLI_OCCAS)) // => e' un occasionale...
|
|
{
|
|
const TRectype & occ = cache().get(LF_OCCAS, _occfpi);
|
|
|
|
viacf = occ.get(OCC_INDIR);
|
|
civcf = occ.get(OCC_CIV);
|
|
capcf = occ.get(OCC_CAP);
|
|
comcf = occ.get(OCC_COM);
|
|
}
|
|
else
|
|
{
|
|
viacf = clifo.get(CLI_INDCF);
|
|
civcf = clifo.get(CLI_CIVCF);
|
|
comcf = clifo.get(CLI_COMCF);
|
|
capcf = clifo.get(CLI_CAPCF);
|
|
statocf = clifo.get(CLI_STATOCF);
|
|
tipoa = clifo.get_char(CLI_TIPOAPER);
|
|
codanagr = clifo.get_long(CLI_CODANAGPER);
|
|
}
|
|
|
|
const TRectype& rec = look_com (comcf, statocf);
|
|
comune = rec.get(COM_DENCOM);
|
|
prov = rec.get(COM_PROVCOM);
|
|
if (comcf.empty())
|
|
comune = clifo.get(CLI_LOCCF);
|
|
|
|
if (viacf.not_empty())
|
|
{
|
|
sprintf (riga, "@%dg%s %s",
|
|
POSCONTO,
|
|
(const char*) viacf,
|
|
(const char*) civcf
|
|
);
|
|
|
|
set_row (r++, riga);
|
|
}
|
|
|
|
if (comune.not_empty() || prov.not_empty() || capcf.not_empty())
|
|
{
|
|
sprintf (riga, "@%dg%s %s %s",
|
|
POSCONTO,
|
|
(const char*) capcf, (const char*) comune,
|
|
(const char*) prov
|
|
);
|
|
set_row (r++, riga);
|
|
}
|
|
|
|
// Se fisica prendo anche data nascita e luogo
|
|
if (tipoa == 'F')
|
|
{
|
|
TString80 comna;
|
|
TString16 datana, codcomna, provna, capna, statona;
|
|
|
|
datana = clifo.get("DATANASC");
|
|
|
|
if (datana.not_empty())
|
|
{
|
|
codcomna = clifo.get("COMNASC");
|
|
statona = clifo.get("STATONASC");
|
|
const TRectype& dep = look_com (codcomna, statona);
|
|
|
|
comna = dep.get(COM_DENCOM);
|
|
provna = dep.get(COM_PROVCOM);
|
|
capna = dep.get(COM_CAPCOM);
|
|
|
|
sprintf (riga, "@%dg%s %s %s %s", POSCONTO,
|
|
(const char*)datana,
|
|
(const char*)comna,
|
|
(const char*)provna, (const char*) capna);
|
|
|
|
set_row(r++, riga);
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
//
|
|
// Lettura/aggiornamento tabella registri
|
|
//
|
|
void TStampa_giornale::aggiorna_tabreg(int partito_da, int stampate)
|
|
{
|
|
TString16 codtab;
|
|
|
|
codtab.format ("%04d%-3s", _ae_solare, (const char*) _reg_cod);
|
|
|
|
_tabreg->zero();
|
|
_tabreg->put("CODTAB", codtab);
|
|
_tabreg->read(_isequal, _lock);
|
|
|
|
if (_tabreg->good())
|
|
{
|
|
_tabreg->put ("I1", (long)_pagina_da + stampate); // pagine stampate
|
|
_tabreg->put ("I6", _nprog_mov); // ultimo numero di riga
|
|
_tabreg->put ("R1", _tot_dare_generale);
|
|
_tabreg->put ("R2", _tot_avere_generale);
|
|
_tabreg->put ("D3", _ultima_data_mov); // Data piu' alta trovata
|
|
_tabreg->rewrite();
|
|
}
|
|
}
|
|
|
|
bool TStampa_giornale::controlla_mov_aep()
|
|
{
|
|
TWait_cursor hourglass;
|
|
|
|
TEsercizi_contabili esc;
|
|
const int aep = esc.pred(_ae);
|
|
TDate inizio_ep, fine_ep;
|
|
if (aep > 0)
|
|
{
|
|
inizio_ep = esc[aep].inizio();
|
|
fine_ep = esc[aep].fine();
|
|
}
|
|
else
|
|
return true; // = e' il primo esercizio
|
|
|
|
TRectype da(LF_MOV), a(LF_MOV);
|
|
da.put(MOV_DATAREG, inizio_ep);
|
|
a.put (MOV_DATAREG, fine_ep);
|
|
_cur->setregion(da, a);
|
|
_cur->setfilter("");
|
|
_cur->set_filterfunction(filter_func, true);
|
|
|
|
const TRecnotype items = _cur->items();
|
|
_cur->freeze();
|
|
TProgind pi(items, TR("Controllo movimenti esercizio precedente"), false, true);
|
|
|
|
bool gia_stampati = true;
|
|
for (*_cur = 0L ; _cur->pos() < items; ++(*_cur))
|
|
{
|
|
pi.addstatus(1);
|
|
gia_stampati = _cur->file().get_bool("STAMPATO");
|
|
if (!gia_stampati) break; // basta trovarne uno ancora da stampare
|
|
}
|
|
_cur->freeze(false);
|
|
if (!gia_stampati)
|
|
error_box(TR("Impossibile proseguire con la stampa:\n"
|
|
"Esistono movimenti nell'esercizio precedente\n"
|
|
"che non sono ancora stati stampati su bollato."));
|
|
return gia_stampati;
|
|
}
|
|
|
|
bool TStampa_giornale::leggi_tabreg(const char * reg_cod, int reg_anno)
|
|
{
|
|
TString16 codtab;
|
|
codtab.format ("%04d%-3s", reg_anno, reg_cod);
|
|
_tabreg->put("CODTAB", codtab);
|
|
const bool ok = _tabreg->read() == NOERR;
|
|
if (!ok)
|
|
_tabreg->zero();
|
|
|
|
_pagine_stampate = _tabreg->get_int("I1");
|
|
_pagine_numerate = _tabreg->get_int("I2");
|
|
_stampa_num_pag = _tabreg->get_bool("S11");
|
|
_nprog_da = _tabreg->get_long ("I6");
|
|
_tot_dare = _tabreg->get_real ("R1");
|
|
_tot_avere = _tabreg->get_real ("R2");
|
|
_last_data = _tabreg->get_date ("D3");
|
|
_stampa_intesta = _tabreg->get_bool ("B9");
|
|
_stampa_stesso_registro = _tabreg->get_bool ("B8");
|
|
_reg_descr = _tabreg->get ("S0");
|
|
_tipo = _tabreg->get_int("I0");
|
|
|
|
return ok;
|
|
}
|
|
|
|
void TStampa_giornale::set_reg_filter(TMask& m)
|
|
{
|
|
TEdit_field& reg = m.efield(CODREG);
|
|
reg.browse()->cursor()->set_filterfunction(filtra_reg);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
//
|
|
// MASCHERE
|
|
//
|
|
//-----------------------------------------------------------------------
|
|
|
|
// NB
|
|
// Qui viene compilato app()._ae
|
|
// L'anno di esercizio e' quello iniziale (in caso di esercizio a cavallo di 2 anni!)
|
|
//
|
|
bool TStampa_giornale::data_a_hndl (TMask_field& f, KEY k)
|
|
{
|
|
TMask& m = f.mask();
|
|
|
|
if (f.to_check(k))
|
|
{
|
|
const TDate data_a(f.get());
|
|
|
|
if (!data_a.ok())
|
|
return true;
|
|
|
|
TEsercizi_contabili esc;
|
|
const int esercizio = esc.date2esc(data_a);
|
|
if (esercizio <= 0)
|
|
return f.error_box(TR("La data non appartiene a nessun esercizio"));
|
|
|
|
app()._ae_solare = esc[esercizio].inizio().year(); //in caso di esercizio a cavallo di 2 anni va preso il primo anno
|
|
app()._ae = esercizio;
|
|
|
|
m.set(ANNO_ESER, app()._ae_solare);
|
|
m.send_key(K_TAB, CODREG);
|
|
}
|
|
|
|
if (k == K_ENTER)
|
|
{
|
|
const bool definitiva = m.get_bool(STAMPA_DEF);
|
|
const TDate data_da(m.get(DATA_DA));
|
|
const TDate data_a(f.get());
|
|
TString16 dtda(data_da.string());
|
|
|
|
if (definitiva)
|
|
{
|
|
if (dtda.not_empty())
|
|
{
|
|
if (data_da.year() != data_a.year())
|
|
return f.warning_box(TR("Le date specificate non appartengono allo stesso anno"));
|
|
if (data_da > data_a)
|
|
return f.warning_box(TR("La data di partenza non puo' essere maggiore della data finale"));
|
|
}
|
|
}
|
|
} // if K_ENTER
|
|
|
|
return true;
|
|
}
|
|
|
|
bool TStampa_giornale::data_da_hndl(TMask_field& f, KEY k)
|
|
{
|
|
TMask& m = f.mask();
|
|
// if (f.to_check(k))
|
|
if (k == K_TAB)
|
|
{
|
|
const TDate data_da (f.get());
|
|
const TDate data_a(m.get(DATA_A));
|
|
|
|
if (!data_da.ok() || !data_a.ok())
|
|
return true;
|
|
|
|
if (data_da.year() != data_a.year())
|
|
return f.error_box(TR("Le due date non appartengono allo stesso anno"));
|
|
}
|
|
|
|
if (k == K_ENTER)
|
|
{
|
|
const bool definitiva = m.get_bool(STAMPA_DEF);
|
|
const TDate data_a(m.get(DATA_A));
|
|
const TDate data_da(f.get());
|
|
|
|
// Controlli sulle date
|
|
|
|
// se la stampa e' di prova DALLA_DATA e' obbligatoria
|
|
if (!definitiva && !data_da.ok())
|
|
return f.warning_box(TR("Manca la data di partenza"));
|
|
|
|
if (data_da.ok() && data_da > data_a)
|
|
return f.warning_box(TR("La data di partenza non puo' essere maggiore della data finale"));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//
|
|
// MASK_A_COD_REG
|
|
//
|
|
// ----------->>>> SCRIVO ANCHE QUI _ae <<<<----------------
|
|
//
|
|
bool TStampa_giornale::mask_a_cod_reg (TMask_field& f, KEY k)
|
|
{
|
|
if (f.to_check(k))
|
|
{
|
|
TMask& m = f.mask();
|
|
TStampa_giornale& a = app();
|
|
// const bool definitiva = m.get_bool(STAMPA_DEF); //qui verificare
|
|
const TString16 data_astr(m.get(DATA_A));
|
|
const TDate data_a(m.get(DATA_A));
|
|
|
|
// 25/11 controlli sul registro solo DOPO aver messo la DATA_A
|
|
if (data_astr.empty())
|
|
return true;
|
|
else
|
|
{
|
|
TEsercizi_contabili esc;
|
|
const int esercizio = esc.date2esc(data_a);
|
|
if (esercizio > 0)
|
|
{
|
|
a._ae_solare = esc[esercizio].inizio().year(); // Anno solare usato per la tabella dei registriin caso di esercizio a cavallo di 2 anni va preso il primo anno
|
|
a._ae = esercizio; // Anno esercizio
|
|
}
|
|
}
|
|
|
|
const TString16 reg_cod(f.get());
|
|
a.leggi_tabreg(reg_cod, a._ae_solare);
|
|
|
|
// Output da qui della descrizione del registro e dell'anno
|
|
m.set(REG_DESC, a._reg_descr);
|
|
m.set(ANNO_ESER, a._ae_solare);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//
|
|
// mask_b_ripristina
|
|
//
|
|
// Se premo il bottone <Ripristina> rimetto i valori precedenti
|
|
// dentro ai campi (per ripetere la stampa)
|
|
//
|
|
bool TStampa_giornale::mask_b_ripristina (TMask_field& f, KEY k)
|
|
{
|
|
if (k == K_SPACE)
|
|
{
|
|
TMask& m = f.mask();
|
|
TStampa_giornale& a = (TStampa_giornale&)main_app();
|
|
m.set(PROGR_DARE, a._tot_dare.string());
|
|
m.set(ULTIMA_DATA, a._last_data.string());
|
|
m.set(N_RIGA_STAMPATO, a._nprog_da);
|
|
m.set(PAGINA_DA, a._pagine_stampate);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool TStampa_giornale::mask_b_warning (TMask_field& f, KEY k)
|
|
{
|
|
static bool gia_detto = false;
|
|
|
|
if (k == K_TAB && !f.mask().is_running())
|
|
gia_detto = false;
|
|
|
|
if (!gia_detto)
|
|
{
|
|
if (k == K_SPACE)
|
|
{
|
|
f.warning_box(TR("Le modifiche a questi progressivi saranno scritte nel registro"));
|
|
gia_detto = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void TStampa_giornale::init_print()
|
|
{
|
|
// 17.5.95 Leggo parametri di stampa del registro
|
|
TString16 config;
|
|
config.format("REG%05ld%03s", get_firm(), (const char*)_reg_cod);
|
|
printer().read_configuration(config);
|
|
|
|
if (_stampa_len != 0)
|
|
printer().formlen(_stampa_len);
|
|
|
|
printer().footerlen(RIGHE_FOOTER);
|
|
|
|
reset_print();
|
|
reset_header();
|
|
reset_footer();
|
|
set_background();
|
|
|
|
for (int i=1; i<RIGHE_FOOTER; i++) set_footer(i, "%s", " ");
|
|
|
|
set_real_picture (REAL_PICTURE);
|
|
set_print_zero(true);
|
|
|
|
if (_stampa_width == 1)
|
|
_stampa_width = 132;
|
|
else
|
|
_stampa_width = 198;
|
|
|
|
/* Guy: sarebbe interessante ma non funziona mai!
|
|
// Solo se _pagina_da diversa da 0
|
|
if (_pagina_da)
|
|
printer().set_from_page(_pagina_da - _pagine_stampate);
|
|
*/
|
|
|
|
// la stampa precedente era andata male
|
|
// if (_stampa_ok != -1) set_page_number (_stampa_ok);
|
|
|
|
_last_header = set_headers();
|
|
}
|
|
|
|
void TStampa_giornale::init_totals()
|
|
{
|
|
_tot_dare_gg_ap = ZERO;
|
|
_tot_avere_gg_ap = ZERO;
|
|
_tot_dare_progr_ap = ZERO;
|
|
_tot_avere_progr_ap = ZERO;
|
|
_tot_dare_gg = ZERO;
|
|
_tot_avere_gg = ZERO;
|
|
_tot_dare_generale = ZERO;
|
|
_tot_avere_generale = ZERO;
|
|
if (_stampa_definitiva)
|
|
{
|
|
_tot_dare_progr = _tot_dare;
|
|
_tot_avere_progr = _tot_avere;
|
|
}
|
|
else
|
|
{
|
|
_tot_dare_progr = ZERO;
|
|
_tot_avere_progr = ZERO;
|
|
}
|
|
}
|
|
|
|
bool TStampa_giornale::init_cursor()
|
|
{
|
|
// bool gia_stampati = false;
|
|
|
|
TRectype da (LF_MOV);
|
|
TRectype a (LF_MOV);
|
|
|
|
da.put(MOV_DATAREG, _data_da);
|
|
a.put (MOV_DATAREG, _data_a);
|
|
|
|
_cur->setregion(da, a);
|
|
_cur->set_filterfunction(filter_func, true);
|
|
_cur->setfilter(_stampa_definitiva ? "STAMPATO!=\"X\"" : "");
|
|
|
|
(*_cur) = 0L;
|
|
|
|
if (_cur->items() == 0L)
|
|
{
|
|
_cur->setfilter("");
|
|
return warning_box(TR("Non ci sono movimenti da stampare nel periodo selezionato.\nLa stampa e' annullata"));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool TStampa_giornale::set_print(int)
|
|
{
|
|
TMask ma ("cg3400a");
|
|
|
|
ma.set_handler (CODREG, mask_a_cod_reg);
|
|
ma.set_handler (DATA_A, data_a_hndl);
|
|
ma.set_handler (DATA_DA,data_da_hndl);
|
|
// set_reg_filter(ma);
|
|
|
|
_pagina_da = 0; // Parto dall'inizio
|
|
_forza_ariportare = false;
|
|
|
|
KEY tasto;
|
|
while ((tasto = ma.run()) != K_QUIT)
|
|
{
|
|
_reg_cod = ma.get(CODREG);
|
|
_stampa_definitiva = ma.get_bool(STAMPA_DEF);
|
|
_data_da = ma.get(DATA_DA);
|
|
_data_a = ma.get(DATA_A);
|
|
_cont_sep = ma.get_bool(F_ST_CONTSEP);
|
|
|
|
|
|
_stampa_width = ma.get_int(STAMPA_WIDTH);
|
|
_stampa_len = ma.get_int(STAMPA_LEN);
|
|
|
|
set_magic_currency(true);
|
|
// set_curr_codval(ma.get(F_CODVAL));
|
|
|
|
// Se stampa definitiva DALLA_DATA e' la data di inizio esercizio
|
|
// e si scartano i movimenti gia' stampati su bollato
|
|
if (_stampa_definitiva)
|
|
{
|
|
TEsercizi_contabili esc;
|
|
_ae = esc.date2esc(_data_a);
|
|
_data_da = esc[_ae].inizio();
|
|
_ae_solare = _data_da.year(); // qui modificato
|
|
|
|
// Controlla che non siano rimasti movimenti ancora da stampare dell'es.prec.
|
|
if (_stampa_stesso_registro)
|
|
if (!controlla_mov_aep())
|
|
continue;
|
|
}
|
|
|
|
if (!init_cursor()) continue;
|
|
|
|
if (_stampa_definitiva)
|
|
{
|
|
TMask mb("cg3400b");
|
|
mb.set_handler (DLG_RIPRISTINA, mask_b_ripristina);
|
|
mb.set_handler (PROGR_DARE, mask_b_warning);
|
|
mb.set_handler (N_RIGA_STAMPATO,mask_b_warning);
|
|
mb.set_handler (ULTIMA_DATA, mask_b_warning);
|
|
mb.set (PROGR_DARE, _tot_dare.string());
|
|
mb.set (N_RIGA_STAMPATO, _nprog_da);
|
|
mb.set (ULTIMA_DATA, _last_data.string());
|
|
mb.set (PAGINA_DA, _pagine_stampate);
|
|
|
|
tasto = mb.run();
|
|
if (tasto == K_ENTER)
|
|
{
|
|
_nprog_da = mb.get_long(N_RIGA_STAMPATO);
|
|
_last_data = mb.get(ULTIMA_DATA);
|
|
real dare2(mb.get(PROGR_DARE));
|
|
_pagina_da = mb.get_int(PAGINA_DA);
|
|
// "Se l'utente cambia il progressivo dare, esso viene uguagliato all'avere"
|
|
if (dare2 != _tot_dare)
|
|
{
|
|
_tot_dare = dare2;
|
|
_tot_avere = dare2;
|
|
}
|
|
}
|
|
else
|
|
continue;
|
|
}
|
|
|
|
init_print();
|
|
init_totals();
|
|
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int cg3400(int argc, char * argv[])
|
|
{
|
|
TStampa_giornale app;
|
|
app.run(argc, argv, TR("Stampa libro giornale"));
|
|
return true;
|
|
}
|