campo-sirio/cg/cg4400.cpp
nik c4c3f7bae3 Correzioni al programma causali (cg05*) stampa registri (cg44*) e chiusura
conti (cg46*).


git-svn-id: svn://10.65.10.50/trunk@185 c028cbd2-c16b-5b4b-a496-9718f37d4682
1994-09-08 10:11:19 +00:00

1566 lines
42 KiB
C++
Executable File

// cg4400.cpp
// Stampa tabella registri
#include "cg4.h"
#include "cg4400.h"
#include "cg4400a.h"
static TString256 TMP;
HIDDEN CG4400_application * app() { return (CG4400_application*) MainApp(); }
bool filter_func (const TRelation * r)
{
TLocalisamfile * mov = r->lfile(LF_MOV);
TString codreg = mov->get(MOV_REG);
TDate datareg = mov->get_date(MOV_DATAREG);
int annoiva = mov->get_int(MOV_ANNOIVA);
if (codreg != (app()->_codreg) || annoiva != (app()->_annoes))
return FALSE;
if (app()->_data_da.string() != "" && app()->_data_a.string() != "")
if ( (datareg < app()->_data_da || datareg > app()->_data_a ) || (!datareg.ok()) )
return FALSE;
return TRUE;
}
HIDDEN int compare_rows(const TObject** o1, const TObject** o2)
{
TRiga* r1 = (TRiga*)*o1;
TRiga* r2 = (TRiga*)*o2;
return (strcmp((const char*)r1->_codiva, (const char*)r2->_codiva));
}
HIDDEN int compare(const TObject** o1, const TObject** o2)
{
TRigaiva* r1 = (TRigaiva*)*o1;
TRigaiva* r2 = (TRigaiva*)*o2;
TString campo1;
TString campo2;
campo1.format("%d%4s", r1->_tipodet, (const char*)r1->_codiva);
campo2.format("%d%4s", r2->_tipodet, (const char*)r2->_codiva);
return (strcmp((const char*)campo1, (const char*)campo2));
}
/*
bool CG4400_application::libro_giornale_iva_unico()
{
TConfig conf(CONFIG_DITTA);
return conf.get("StLgiU") == "X";
}
*/
bool mask_select (TMask_field& f, KEY k)
{
long j, cnt, chk; int i;
TString from = f.mask().get(DA_CODICE);
TString to = f.mask().get(A_CODICE);
TBit_array selected = app()->_selected;
// build sheet
if (k == K_SPACE)
{
f.mask().field(DA_CODICE).set("");
f.mask().field(A_CODICE).set("");
app()->_ditte->destroy(); chk = 0l;
for (i = 0; i < app()->_nomiditte.items(); i++)
{
if (app()->_selected[i]) continue;
TToken_string d = (const char*)((TToken_string&)app()->_nomiditte[i]);
TString cod = d.get(0);
app()->_ditte->add(d);
if (!from.empty() || !to.empty())
{
if (from.empty()) from = "0";
if (to.empty()) to = "999999999";
if (atol(cod) >= atol(from) && atol(cod) <= atol(to))
app()->_ditte->check(chk++);
}
}
// seleziona e aggiungi alle gia' selezionate
if (app()->_ditte->run() == K_ENTER)
{
cnt = 0;
for (j = 0l; j < app()->_n_ditte; j++)
{
if (app()->_selected[j]) continue;
if (app()->_ditte->checked(cnt++))
selected.set(j);
}
app()->_selected |= selected;
selected.reset();
}
long numd = app()->_selected.ones();
f.mask().set(F_SELECT,numd);
}
return TRUE;
}
bool mask_verifica (TMask_field& f, KEY k)
{
int i;
if (k == K_SPACE)
{
app()->_ditte->destroy();
for (i = 0; i < app()->_nomiditte.items(); i++)
{
TToken_string d = (const char*)((TToken_string&)app()->_nomiditte[i]);
app()->_ditte->add(d);
if (app()->_selected[i]) app()->_ditte->check(i);
}
app()->_ditte->disable_check();
app()->_ditte->run();
app()->_ditte->enable_check();
}
return TRUE;
}
bool mask_annulla (TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
app()->_selected.reset();
f.mask().set(F_SELECT, "0");
}
return TRUE;
}
bool mask_mese (TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
int mese = f.mask().get_int(MESE);
int umese = f.mask().get_int(ULTIMO_MESE);
if (mese != umese+1)
{
f.warning_box ("Le stampe devono essere richieste mese per mese! I mesi successivi a %s non sono ancora stati stampati.", itom(umese));
return FALSE;
}
}
return TRUE;
}
bool mask_cod (TMask_field& f, KEY k)
{
TTable TabLbu ("%LBU");
TString codtab;
int anno;
//if ( (k == K_TAB) && f.mask().is_running() )
if ( (k == K_SPACE)||(k == K_TAB) )
{
TString codlib = f.mask().get(CODICE_LIB_UN);
anno = f.mask().get_int(ANNO);
TabLbu.zero();
codtab.format ("%04d%-3s", anno, (const char*)codlib);
TabLbu.put ("CODTAB", codtab);
TabLbu.read();
if ( TabLbu.good() )
{
// f.mask().set(MESE,TabLbu.get_long("I0")+1);
f.mask().set(ULTIMO_MESE,TabLbu.get_long("I0"));
f.mask().set(ULTIMA_PAGINA,TabLbu.get_long("I1"));
}
}
return TRUE;
}
bool mask_data (TMask_field& f, KEY k)
{
const short id = f.dlg();
if (k == K_ENTER)
{
int anno = f.mask().get_int(ANNO);
TDate data = f.mask().get(id);
if (data.ok())
if (data.year() != anno)
{
f.warning_box("L'anno delle date limite deve essere uguale all'anno iva specificato");
return FALSE;
}
}
return TRUE;
}
/*
bool mask_fino_a_mese (TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
TTable TabReg ("REG");
TString16 codtab;
int giorni_del_mese;
TString codreg = f.mask().get(CODICE_LIBRO);
int tipo = f.mask().get_int(TIPO_STAMPA);
int anno = f.mask().get_int(ANNO);
if ( (tipo == 1) || (tipo == 4) )
{
int fino_a_mese = f.mask().get_int(FINO_A_MESE);
if (fino_a_mese == 12)
giorni_del_mese = 31;
else
{
TDate primo = format("01/%02d/%4d", fino_a_mese+1, anno);
--primo;
giorni_del_mese = primo.day();
}
TDate datasup = format("%02d/%02d/%4d",giorni_del_mese,fino_a_mese,anno);
if (codreg != "")
{
TabReg.zero();
codtab << anno << codreg;
TabReg.put ("CODTAB", codtab);
TabReg.read();
if ( TabReg.good() )
{
TDate data = TabReg.get_date("D3");
if (datasup < data)
{
TString16 datas = format("%02d/%4d", data.month(), data.year());
f.warning_box ("La data specificata non deve essere inferiore al %s (ultima data di stampa specificata sul registro)", (const char*)datas);
return FALSE;
}
}
}
if (tipo == 4)
{
TabReg.zero();
TabReg.put ("CODTAB", anno);
TRectype r (TabReg.curr());
TabReg.read(_isgteq);
for (; !TabReg.eof(); TabReg.next())
{
if (TabReg.curr() != r) break;
int tiporeg = TabReg.get_int("I0");
if (tiporeg == 5) //libro giornale
{
TDate data = TabReg.get_date("D3");
if (datasup > data)
{
TString16 datas = format("%02d/%4d", data.month(), data.year());
f.warning_box ("La data specificata non deve essere superiore al %s (ultima data di stampa del libro giornale)", (const char*)datas);
return FALSE;
}
}
}
}
}
}
return TRUE;
}
*/
//da una SHEET non e' possibile mandare messaggi nella maschera!!!
HIDDEN bool my_handler (TMask_field& f, KEY k)
{
if (k == K_TAB)
{
TMask& m = f.mask();
int stampa_su = m.get_int(TIPO_STAMPA);
if ( (stampa_su == 1) || (stampa_su == 4) )
{
m.hide (CODICE_LIB_UN);
m.hide (CODICE_LIBRO_PROVA);
m.hide (MESE);
m.hide (ULTIMO_MESE);
m.hide (ULTIMA_PAGINA);
m.hide (CODICE_LIBRO_IVA);
m.hide (DATA_STAMPA);
m.hide (DA_DATA);
m.hide (A_DATA);
m.show (CODICE_LIBRO);
m.show (TIPO_RIEPILOGATIVO);
m.show (FINO_A_MESE);
}
if (stampa_su == 2)
{
m.show (CODICE_LIB_UN);
m.hide (CODICE_LIBRO_PROVA);
m.show (MESE);
m.show (ULTIMO_MESE);
m.show (ULTIMA_PAGINA);
m.show (CODICE_LIBRO_IVA);
m.hide (DATA_STAMPA);
m.hide (DA_DATA);
m.hide (A_DATA);
m.hide (CODICE_LIBRO);
m.hide (TIPO_RIEPILOGATIVO);
m.hide (FINO_A_MESE);
}
if (stampa_su == 3)
{
m.hide (CODICE_LIB_UN);
m.hide (MESE);
m.hide (ULTIMO_MESE);
m.hide (ULTIMA_PAGINA);
m.hide (CODICE_LIBRO_IVA);
m.hide (CODICE_LIBRO);
m.show (CODICE_LIBRO_PROVA);
m.show (DATA_STAMPA);
m.show (DA_DATA);
m.show (A_DATA);
m.hide (TIPO_RIEPILOGATIVO);
m.hide (FINO_A_MESE);
}
}
return TRUE;
}
const char * CG4400_application::descr_doc(const char * tipo)
{
TTable tab_tpd("%TPD");
TString codtab = format ("%-2s", tipo);
tab_tpd.zero();
tab_tpd.put("CODTAB", codtab);
if (tab_tpd.read()==NOERR)
TMP = tab_tpd.get("S0");
else
TMP = "";
return TMP;
}
const char * CG4400_application::descr_iva(const char * cod)
{
TTable tab_iva("%IVA");
TString codtab = format ("%-4s", cod);
tab_iva.zero();
tab_iva.put("CODTAB", codtab);
if (tab_iva.read()==NOERR)
TMP = tab_iva.get("S0");
else
TMP = "";
return TMP;
}
const char * CG4400_application::desc_attivita(const char * codatt)
{
TTable attiv ("%AIS");
attiv.zero();
attiv.put("CODTAB", codatt);
if (attiv.read()==NOERR)
TMP = attiv.get("S0");
else
TMP = "";
return TMP;
}
const char * CG4400_application::ricerca_cf(char tipocf, long codcf)
{
_clifo->zero();
_clifo->put(CLI_TIPOCF, tipocf);
_clifo->put(CLI_CODCF, codcf);
if (_clifo->read() == NOERR)
TMP = _clifo->get(CLI_RAGSOC);
else
TMP = "";
return TMP;
}
const char * CG4400_application::ricerca_occ(const char * occ)
{
TLocalisamfile occas (LF_OCCAS);
occas.zero();
occas.put(OCC_CFPI, occ);
if (occas.read() == NOERR)
TMP = occas.get(OCC_RAGSOC);
else
TMP = "";
return TMP;
}
void CG4400_application::user_create()
{
_nditte = new TLocalisamfile(LF_NDITTE);
_ditte = new TArray_sheet(-1, -1, 0, 0, "Selezione Ditte",
"@1|Cod.@5|Ragione Sociale@50");
_n_ditte = 0l;
for (_nditte->first(); !_nditte->eof(); _nditte->next())
{
TString cod = _nditte->get("CODDITTA");
_n_ditte++;
TToken_string* d = new TToken_string(" ");
d->add(cod);
d->add(_nditte->get("RAGSOC"));
_nomiditte.add(d);
}
_tab = new TLocalisamfile(LF_TAB);
_tabcom = new TLocalisamfile(LF_TABCOM);
_tabreg = new TTable("REG");
_tablbu = new TTable("%LBU");
_tabinl = new TTable("%INL");
_tablim = new TTable("LIM");
_tabpim = new TTable("PIM");
_clifo = new TLocalisamfile(LF_CLIFO);
_occas = new TLocalisamfile(LF_OCCAS);
_rel = new TRelation (LF_MOV);
_rel->add(LF_CAUSALI,"CODCAUS=CODCAUS",1,LF_MOV);
_rel->add(LF_RMOVIVA,"NUMREG=NUMREG",1,LF_MOV);
_cur = new TCursor(_rel, "", 1);
//_cur->set_filterfunction(filter_func);
add_cursor(_cur);
add_file(LF_MOV);
add_file(LF_RMOVIVA);
}
void CG4400_application::user_destroy()
{
delete _ditte;
delete _nditte;
delete _tab;
delete _tabcom;
delete _cur;
delete _rel;
delete _clifo;
}
void CG4400_application::calcola_progressivi(real& r0, real& r1, const char* codiva, const int tipocr)
{
TTable pim ("PIM");
TString chiave;
int i, num=0;
if (_tipo_stampa == 1)
num = _datareg.month();
if ( (_tipo_stampa == 2) || (_tipo_stampa == 4) )
num = _fino_a_mese;
if (_frequiva == 'T')
for (i=3; i<num+3; i+=3)
{
chiave = "";
chiave << _annoes << _codatt << _codreg << i << tipocr << codiva;
pim.put("CODTAB", chiave);
if (pim.read()==NOERR)
{
r0 += pim.get_real("R0");
r1 += pim.get_real("R1");
}
}
else //frequenza mensile
for (i=1; i<=num; i++)
{
chiave = "";
chiave << _annoes << _codatt << _codreg << i << tipocr <<codiva;
pim.put("CODTAB", chiave);
if (pim.read()==NOERR)
{
r0 += pim.get_real("R0");
r1 += pim.get_real("R1");
}
}
}
int CG4400_application::riga_rmoviva()
{
TString codiva;
real impo, impos, impop, imposp;
int tipodet, tipocr;
_cur->save_status();
bool ok = _cur->is_first_match(LF_RMOVIVA);
int nrec = 0;
while (ok)
{
nrec++;
TRectype iva (_cur->file(LF_RMOVIVA)->curr());
tipodet = iva.get_int (RMI_TIPODET);
tipocr = iva.get_int (RMI_TIPOCR);
impo = iva.get_real(RMI_IMPONIBILE);
impos = iva.get_real(RMI_IMPOSTA);
codiva = iva.get(RMI_CODIVA);
impop = imposp = 0.00;
_riga_rmi.add_riga(impo,impos,codiva,tipodet,impop,imposp);
if (_tipo_reg == 2) //registro acquisti
{
if (_tipo_stampa != 3) //stampa definitiva
calcola_progressivi(impop,imposp,codiva,tipocr);
_iva_array.add_riga(impo,impos,codiva,tipodet,impop,imposp);
}
impop = imposp = 0.00;
if (_tipo_stampa != 3)
calcola_progressivi(impop,imposp,codiva,tipocr);
_tot_iva_array.add_riga(impo,impos,codiva,impop,imposp);
ok = _cur->next_match(LF_RMOVIVA);
}
_cur->restore_status();
return nrec;
}
int CG4400_application::setta_riga(int r, const TRigaiva& riga, real& tot1,
real& tot2, real& tot3, real& tot4)
{
set_row(r, "%3s", (const char*)riga._codiva);
TString descr = descr_iva(riga._codiva);
set_row(r, "@5g%s",(const char*)descr);
set_row(r, "@25g%r", &riga._imponibile);
set_row(r, "@41g%r", &riga._imposta);
if (_tipo_stampa != 3)
{
set_row(r, "@81g%r", &riga._imponibilep);
set_row(r++, "@98g%r", &riga._impostap);
}
else r++;
tot1 += riga._imponibile;
tot2 += riga._imposta;
tot3 += riga._imponibilep;
tot4 += riga._impostap;
return r;
}
bool CG4400_application::controlla_liquidazione()
{
TTable lim ("LIM");
TTable pim ("PIM");
TString16 mesi_ric = "";
TString16 mesi_cal = "";
TString16 chiave = "";
int i;
if (lim.empty())
return yesno_box("Non esiste la tabella liquidazione iva mensile! Vuoi ugualmente continuare la stampa?");
if (pim.empty())
return yesno_box("Non esiste la tabella progressivi iva mensile! Vuoi ugualmente continuare la stampa?");
if (_frequiva == 'T') //nella tabella LIM ho solo i mesi 3, 6, 9, 12
{
for (i=3; i<=_fino_a_mese+3; i+=3)
{
chiave = "";
chiave << _annoes << i;
lim.put("CODTAB", chiave);
if (lim.read() == NOERR)
{
bool calcolato = lim.get_bool("B0");
if (!calcolato)
// return yesno_box("La liquidazione relativa al mese di %s deve essere ricalcolata. Vuoi ugualmente continuare la stampa?", itom(i) );
mesi_ric << itom(i) << "\n\r";
}
else
// return yesno_box("La liquidazione relativa al mese di %s non e' stata calcolata. Vuoi ugualmente continuare la stampa?", itom(i) );
mesi_cal << itom(i) << "\n\r";
}
}
if (_frequiva == 'M')
{
for (i=1; i<=_fino_a_mese; i++);
{
chiave = "";
chiave << _annoes << i;
lim.put("CODTAB", chiave);
if (lim.read() == NOERR)
{
bool calcolato = lim.get_bool("B0");
if (!calcolato)
// return yesno_box("La liquidazione relativa al mese di %s deve essere ricalcolata. Vuoi ugualmente continuare la stampa?", itom(i) );
mesi_ric << itom(i) << "\n\r";
}
else
// return yesno_box("La liquidazione relativa al mese di %s non e' stata calcolata. Vuoi ugualmente continuare la stampa?", itom(i) );
mesi_cal << itom(i) << "\n\r";
}
}
if (mesi_ric.not_empty())
{
warning_box ("Deve essere ricalcolata la liquidazione relativa ai mesi di:\n %s ", (const char *)mesi_ric);
return yesno_box("Vuoi ugualmente continuare la stampa?");
}
if (mesi_cal.not_empty())
{
warning_box ("La liquidazione relativa al mese di %s non e' stata calcolata", (const char *)mesi_cal);
return yesno_box("Vuoi ugualmente continuare la stampa?");
}
return TRUE;
}
//controlla che i movimenti con data di registrazione compresa tra l'anno precedente e l'ultima data stampata siano tutti gia' stati stampati in forma definitiva*/
bool CG4400_application::controlla_mov()
{
TLocalisamfile mov (LF_MOV);
bool ok = TRUE;
byte tipo;
TDate udata;
TDate data = format("01/01/%4d", _annoes - 1);
TRecnotype rec = _tabreg->recno();
for (mov.first(); !mov.eof(); mov.next())
{
TString16 reg = mov.get(MOV_REG);
TDate datareg = mov.get_date(MOV_DATAREG);
if (_stampa_tutti_i_registri)
cerca_reg (reg, tipo, udata);
else udata = _data_da;
if ( (_stampa_tutti_i_registri && ((tipo == 1)||(tipo == 2)))
|| ((!_stampa_tutti_i_registri)&&(reg == _codreg)) )
if ( (datareg >= data) && (datareg <= udata) )
{
bool stampato = mov.get_bool(MOV_STAMPATO);
long numreg = mov.get_long(MOV_NUMREG);
if (!stampato)
{
warning_box("Il movimento con numero di registrazione %ld non e' ancora stato stampato in forma definitiva!", numreg);
ok = FALSE;
}
}
}
_tabreg->readat(rec);
return ok;
}
void CG4400_application::cerca_reg(const TString& c, byte& t, TDate& d)
{
TString16 cod = "";
cod << _annoes << c;
_tabreg->zero();
_tabreg->put("CODTAB", cod);
if (_tabreg->read() == NOERR)
{
t = _tabreg->get_int ("I0");
d = _tabreg->get_date("D3");
}
}
/*
bool CG4400_application::controlla_mov()
{
bool ok = TRUE;
if (_stampa_tutti_i_registri)
{
TRecnotype rec = _tabreg->recno();//la first l'ho gia' fatta
for (; !_tabreg->eof(); _tabreg->next())
{
TString codtab = _tabreg->get("CODTAB");
int anno = atoi(codtab.mid(0,4));
if (anno != _annoes) break;
TDate data_da = _tabreg->get_date("D3");
TString16 codreg = codtab.mid(4,3);
leggi_movimenti(data_da, codreg, ok);
}
_tabreg->readat(rec);
}
else
leggi_movimenti(_data_da, _codreg, ok);
return ok;
}
void CG4400_application::leggi_movimenti(const TDate& d, const TString& cod, bool& ok)
{
TLocalisamfile mov (LF_MOV);
bool stampato;
long numreg;
TString codreg;
TDate data = format("01/01/%4d", _annoes - 1);
mov.zero();
TRectype a (mov.curr());
mov.put(MOV_DATAREG, data);
a.put (MOV_DATAREG, d);
mov.read(_isgteq);
while (mov.curr() < a && !mov.eof())
{
stampato = mov.get_bool(MOV_STAMPATO);
numreg = mov.get_long(MOV_NUMREG);
codreg = mov.get(MOV_REG);
if (codreg == cod)
if (!stampato)
{
warning_box("Il movimento con numero di registrazione %ld non e' ancora stato stampato in forma definitiva!", numreg);
ok = FALSE;
}
mov.next();
}
}
*/
void CG4400_application::set_page_tot_reg()
{
TString riga(_stampa_width);
int r=1, rr=0, row=0;
real tot_imponib, tot_imposta, tot_imponibp, tot_impostap;
riga.fill('-');
set_row(r, "%s", (const char *) riga);
r++;
set_row(r, "Legenda Tipo Operazione: 1=operazione intracomunitaria 2=AF art.34 comma 3");
set_row(r, "@78g3=operazione intracomunitaria e AF art.34 comma 3");
r++;
set_row(++r, "Tipo documento@30gTotale documento");
r+=2;
for (int j = 0; j < _doc_array.items(); j++)
{
TTipodoc& doc = (TTipodoc&)_doc_array[j];
rr = r+j;
set_row(rr, "%2s", (const char*) doc._tipodoc);
set_row(rr, "@3g%.25s", (const char*) doc._descrdoc);
set_row(rr, "@29g%r", &doc._totdoc);
}
_doc_array.destroy();
rr++;
set_row(++rr, "@26g---------- P E R I O D O ----------");
if (_tipo_stampa != 3)
set_row(rr,"@82g------ P R O G R E S S I V I ------");
rr++;
set_row(rr, "Cod.");
if (_tipo_reg == 2)
{
set_row(rr, "@36gA C Q U I S T I");
if (_tipo_stampa != 3)
set_row(rr, "@92gA C Q U I S T I");
}
if (_tipo_reg == 1)
{
set_row(rr, "@37gV E N D I T E");
if (_tipo_stampa != 3)
set_row(rr, "@93gV E N D I T E");
}
rr++;
set_row(rr, "iva Descrizione@30gImponibile@49gImposta");
if (_tipo_stampa != 3)
set_row(rr++, "@86gImponibile@106gImposta");
else rr++;
rr++;
tot_imponib = tot_imposta = tot_imponibp = tot_impostap = 0.00;
_tot_iva_array.sort(compare_rows);
for (int k = 0; k < _tot_iva_array.items(); k++)
{
TRiga& riga = (TRiga&)_tot_iva_array[k];
row = rr+k;
set_row(row, "%3s", (const char*)riga._codiva);
TString descr = descr_iva(riga._codiva);
set_row(row, "@5g%s", (const char*)descr);
set_row(row, "@25g%r", &riga._imponibile);
set_row(row, "@41g%r", &riga._imposta);
if (_tipo_stampa != 3)
{
set_row(row, "@81g%r", &riga._imponibilep);
set_row(row, "@98g%r", &riga._impostap);
}
tot_imponib += riga._imponibile;
tot_imposta += riga._imposta;
tot_imponibp += riga._imponibilep;
tot_impostap += riga._impostap;
}
_tot_iva_array.destroy();
row++;
set_row(++row, "TOTALE@25g%r@41g%r", &tot_imponib, &tot_imposta);
if (_tipo_stampa != 3)
set_row(row, "@81g%r@98g%r", &tot_imponibp, &tot_impostap);
//la stampa "tipi di indetraibilita'" viene fatta solo per gli acquisti
if (_tipo_reg == 2)
{
row+=2;
int tdetprec = -1;
int rw = row;
tot_imponib = tot_imposta = tot_imponibp = tot_impostap = 0.00;
_iva_array.sort(compare);
for (int s = 0; s < _iva_array.items(); s++)
{
TRigaiva& riga = (TRigaiva&)_iva_array[s];
switch (riga._tipodet)
{
case 1: if (riga._tipodet != tdetprec)
{
set_row(rw++, "----- Indetraibile su op.es. -----");
set_row(rw, "Cod.");
rw++;
set_row(rw, "iva Descrizione@30gImponibile@49gImposta");
if (_tipo_stampa != 3)
set_row(rw++, "@86gImponibile@106gImposta");
else rw++;
rw++;
}
rw = setta_riga(rw, riga, tot_imponib, tot_imposta, tot_imponibp, tot_impostap);
tdetprec = riga._tipodet;
break;
case 3: if (tdetprec == 1)
{
set_row(++rw, "TOTALE@25g%r@41g%r", &tot_imponib, &tot_imposta);
if (_tipo_stampa != 3)
set_row(rw, "@81g%r@98g%r", &tot_imponibp, &tot_impostap);
tot_imponib = tot_imposta = tot_imponibp = tot_impostap = 0.00;
rw+=2;
}
if (riga._tipodet != tdetprec)
{
set_row(rw++, "----- Passaggi interni -----");
set_row(rw, "Cod.");
rw++;
set_row(rw, "iva Descrizione@30gImponibile@49gImposta");
if (_tipo_stampa != 3)
set_row(rw++, "@86gImponibile@106gImposta");
else rw++;
rw++;
}
rw = setta_riga(rw, riga, tot_imponib, tot_imposta, tot_imponibp, tot_impostap);
tdetprec = riga._tipodet;
break;
case 9: if ( (tdetprec == 1) || (tdetprec == 3) )
{
set_row(++rw, "TOTALE@25g%r@41g%r", &tot_imponib, &tot_imposta);
if (_tipo_stampa != 3)
set_row(rw, "@81g%r@98g%r", &tot_imponibp, &tot_impostap);
tot_imponib = tot_imposta = tot_imponibp = tot_impostap = 0.00;
rw+=2;
}
if (riga._tipodet != tdetprec)
{
set_row(rw++, "----- N.D. 9 - acquisti indeducibili per ART.19 -----");
set_row(rw, "Cod.");
rw++;
set_row(rw, "iva Descrizione@30gImponibile@49gImposta");
if (_tipo_stampa != 3)
set_row(rw++, "@86gImponibile@106gImposta");
else rw++;
rw++;
}
rw = setta_riga(rw, riga, tot_imponib, tot_imposta, tot_imponibp, tot_impostap);
tdetprec = riga._tipodet;
break;
default: break;
}
}
if (tdetprec == 9)
{
set_row(++rw, "TOTALE@25g%r@41g%r", &tot_imponib, &tot_imposta);
if (_tipo_stampa != 3)
set_row(rw, "@81g%r@98g%r", &tot_imponibp, &tot_impostap);
}
_iva_array.destroy();
}
}
bool CG4400_application::compila_reg(const TMask& m)
{
int anno;
long codditta = _nditte->get_long("CODDITTA");
TString16 codtab = "";
_tipo_stampa = m.get_int(TIPO_STAMPA);
if (_tipo_stampa == 2) //stampa su libro unico di studio
_codreg = m.get(CODICE_LIBRO_IVA);
else if (_tipo_stampa == 3) //stampa di prova
_codreg = m.get(CODICE_LIBRO_PROVA);
else _codreg = m.get(CODICE_LIBRO);
if (_codreg.trim().empty())
{
_stampa_tutti_i_registri = TRUE;
_tabreg->first();
if (!_tabreg->eof())
{
codtab = _tabreg->get("CODTAB");
anno = atoi(codtab.mid(0,4));
if (anno > _annoes)
{
warning_box("Non esistono registri IVA della Ditta %ld per l'anno %d",
codditta, _annoes);
return FALSE;
}
}
}
else // stampa un solo registro
{
_stampa_tutti_i_registri = FALSE;
codtab << _annoes << _codreg;
_tabreg->zero();
_tabreg->put("CODTAB", codtab);
if (_tabreg->read() == NOERR)
{
_tipo_reg = _tabreg->get_int("I0");
_pagine_stampate = _tabreg->get_int("I1");
//_pagine_numerate = tab_reg.get_int("I2");
//_stampa_ok = tab_reg.get_int("I7");
//_nprog_da = tab_reg.get_long ("I6");
//_tot_dare = tab_reg.get_real ("R1")
//_tot_avere = tab_reg.get_real ("R2");
if (_tipo_stampa != 3)
_data_da = _tabreg->get_date ("D3");
if ( _tipo_stampa == 1 || _tipo_stampa == 4 )
if ( _data_a < _data_da)
{
TString16 datas = format("%02d/%4d", _data_da.month(), _data_da.year());
warning_box ("La data specificata non deve essere inferiore al %s (ultima data di stampa specificata sul registro)", (const char*)datas);
return FALSE;
}
//_stampa_intesta = _tabreg->get_bool ("B9");
_codatt = _tabreg->get("S8");
_attivita = desc_attivita(_codatt);
_desc_lib = _tabreg->get ("S0");
}
else
{
warning_box("Il registro IVA specificato non esiste nella \n Ditta %ld", codditta);
return FALSE;
}
}
if (_tipo_stampa == 4)
{
TString app(4);
_tabreg->zero();
app = format("%04d", _annoes);
_tabreg->put ("CODTAB", app);
TRectype r (_tabreg->curr());
_tabreg->read(_isgteq);
for (; !_tabreg->eof(); _tabreg->next())
{
if (_tabreg->curr() != r) break;
int tiporeg = _tabreg->get_int("I0");
if (tiporeg == 5) //libro giornale
{
TDate data = _tabreg->get_date("D3");
if (_data_a > data)
{
TString16 datas = format("%02d/%4d", data.month(), data.year());
warning_box ("La data specificata non deve essere superiore al %s (ultima data di stampa del libro giornale)", (const char*)datas);
return FALSE;
}
}
}
}
return TRUE;
}
bool CG4400_application::compila_lib()
{
TTable tab_lib ("%LBU");
TString16 cod;
cod << _annoes << _codlib;
tab_lib.zero();
tab_lib.put("CODTAB", cod);
if (tab_lib.read() == NOERR)
{
_stampa_ind_ditta = tab_lib.get_bool("B1");
return TRUE;
}
return FALSE;
}
bool CG4400_application::preprocess_print(int file, int counter)
{
if (file == LF_MOV)
{
_iva_array.destroy();
_riga_rmi.destroy();
_tot_iva_array.destroy();
_doc_array.destroy();
_dataregp = "";
_mov_empty = TRUE;
//_primast = get_page_number();
set_print_zero();
}
return TRUE;
}
bool CG4400_application::preprocess_page(int file, int counter)
{
if (file == LF_MOV)
{
if (counter) return TRUE;
int rr = 0;
TString ragsoc;
TString tipo_op = "";
TLocalisamfile* mov = _cur->file(LF_MOV);
TLocalisamfile* caus = _cur->file(LF_CAUSALI);
//long annoes = mov->get_long(MOV_ANNOES);
//TString16 codreg = mov->get(MOV_REG);
_datareg = mov->get_date(MOV_DATAREG);
//if (codreg != _codreg || annoes != _annoes)
// return FALSE;
//if (_data_da.string() != "" && _data_a.string() != "")
// if ( (_datareg < _data_da || _datareg > _data_a) || (!_datareg.ok()) )
// return FALSE;
_mov_empty = FALSE;
//if ( (_tipo_stampa == 1) || (_tipo_stampa == 4) )
if ( (_datareg.month() != _dataregp.month()) && (_dataregp.ok()) )
{
if (_tipo_stampa == 2)
++ _u_stampata;
printer().formfeed();
}
_dataregp = _datareg;
TDate datadoc = mov->get_date(MOV_DATADOC);
long numreg = mov->get_long(MOV_NUMREG);
long protiva = mov->get_long(MOV_PROTIVA);
real totdoc = mov->get_real(MOV_TOTDOC);
TString numdoc = mov->get(MOV_NUMDOC);
char tipocf = mov->get(MOV_TIPO)[0];
TString ocfpi = mov->get(MOV_OCFPI);
long codcf = mov->get_long(MOV_CODCF);
long numgio = mov->get_long(MOV_NUMGIO);
bool stampato = mov->get_bool(MOV_STAMPATO);
bool intra = caus->get_bool(CAU_INTRACOM);
bool autof = caus->get_bool(CAU_AUTOFATT);
TString descrcau = caus->get(CAU_DESCR);
//aggiornamento di mov
if (_tipo_stampa != 3)
if (!stampato)
{
mov->put(MOV_STAMPATO,TRUE);
mov->rewrite();
}
if ( intra && autof)
tipo_op = "3";
else if (intra)
tipo_op = "1";
else if (autof)
tipo_op = "2";
if ( (tipocf == 'C') || (tipocf == 'F') )
{
if (ocfpi.trim().empty())
ragsoc = ricerca_cf(tipocf, codcf);
else
ragsoc = ricerca_occ(ocfpi);
}
else ragsoc = descrcau;
_tipodoc = mov->get(MOV_TIPODOC);
_descr_doc = descr_doc(_tipodoc);
TString app = datadoc.string(2, '/');
_doc_array.add_riga(_tipodoc,_descr_doc,totdoc);
//setto le righe di stampa
_r = 1;
set_row(_r, "%s", (const char*) _datareg.string(2, '/'));
set_row(_r, "@9g%5d", protiva);
set_row(_r, "@15g%s", (const char*) app);
set_row(_r, "@24g%s", (const char*) numdoc);
set_row(_r, "@32g%6d", codcf);
set_row(_r, "@39g%.28s",(const char*) ragsoc);
set_row(_r, "@68g%s", (const char*) tipo_op);
set_row(_r, "@70g%2s", (const char*) _tipodoc);
set_row(_r, "@72g%r", &totdoc);
int nrec = riga_rmoviva();
if (nrec > 0)
{
for (int j = 0; j < _riga_rmi.items(); j++)
{
TRigaiva& riga = (TRigaiva&)_riga_rmi[j];
rr = _r+j;
set_row(rr, "@87g%r", &riga._imponibile);
set_row(rr, "@102g%4s",(const char*)riga._codiva);
if (_tipo_reg == 2)
set_row(rr, "@107g%d", riga._tipodet);
set_row(rr, "@108g%r", &riga._imposta);
}
_riga_rmi.destroy();
}
int tipocr = _cur->file(LF_RMOVIVA)->get_int(RMI_TIPOCR);
set_row(_r, "@124g%d", tipocr);
if (_tipo_stampa == 3) //stampa di prova
{
set_row(_r, "@125g%6d", numreg);
if (stampato)
set_row(_r, "@131g*");
}
if (_tipo_stampa == 4) //stampa con riferimento al libro giornale
set_row(_r, "@125g%ld", numgio);
}
return TRUE;
}
void CG4400_application::aggiorna_reg()
{
TString16 codtab;
TTable Tabreg ("REG");
TTable TabInl ("%INL");
long pag;
//long stampate;
const word ultimast = get_page_number();
codtab << _annoes << _codreg;
Tabreg.zero();
Tabreg.put("CODTAB", codtab);
if (Tabreg.read() == NOERR)
{
//stampate = ultimast + 1;
if (!_mov_empty) //cioe' se e' stata stampata almeno una pagina
{
pag = _pagine_stampate + ultimast;
Tabreg.put("I1", pag);
}
Tabreg.put("D3", _data_a);
Tabreg.rewrite();
}
if (_tipo_stampa == 2) //stampa su libro unico
//sulla tabella %inl (indice libro unico) devo generare una riga per ogni registro stampato
{
bool trovato = FALSE;
codtab = "";
codtab << _annoes << _codlib;
TabInl.zero();
TRectype nuovo (TabInl.curr());
TRectype recprec (TabInl.curr());
TabInl.put("CODTAB", codtab);
TRectype rec (TabInl.curr());
TabInl.read (_isgteq);
for (; !TabInl.eof(); TabInl.next())
{
if (TabInl.curr() != rec) break;
trovato = TRUE;
recprec = TabInl.curr();
}
TString cod = "";
if (trovato)
{
TString16 cod_inl = recprec.get("CODTAB");
long numero_riga = atol(cod_inl.mid(7,6)) + 1;
TString16 num_riga (format("%6d", numero_riga));
cod_inl = cod_inl.mid(0,7);
nuovo = recprec;
cod << cod_inl << num_riga;
}
else
{
TString16 num_riga ( format("%6d", 1L) );
cod << codtab << num_riga;
}
long numini = _pagine_stampate + 1;
nuovo.put("CODTAB", cod);
nuovo.put("I0", (long)_annoes);
nuovo.put("I1", (long)_fino_a_mese);
nuovo.put("I2", (long)_u_stampata + 1);
nuovo.put("I3", (long)(_u_stampata + ultimast));
nuovo.put("I4", get_firm());
nuovo.put("S0", _codreg);
nuovo.put("I5", (long)numini);
nuovo.put("I6", (long)(numini + ultimast));
if (trovato)
TabInl.rewrite(nuovo);
else
TabInl.write(nuovo);
_u_stampata += ultimast;
}
}
void CG4400_application::aggiorna_lib()
{
TString16 cod = "";
TTable lbu ("%LBU");
cod << _annoes << _codlib;
lbu.zero();
lbu.put("CODTAB", cod);
if (lbu.read() == NOERR)
{
lbu.put("I0", (long) _fino_a_mese);
lbu.put("I1", (long) _u_stampata - 1);
lbu.rewrite();
}
}
print_action CG4400_application::postprocess_page (int file, int counter)
{
if (file == LF_MOV)
if (!counter)
{
bool FINITO = FALSE;
TRecnotype pos = _cur->pos();
long items = _cur->items();
FINITO = (pos == items-1);
if ( FINITO )
{
set_page_tot_reg();
return REPEAT_PAGE;
}
else //if ( (_tipo_stampa == 1) || (_tipo_stampa == 4) )
{
TLocalisamfile* mov = _cur->file(LF_MOV);
_cur->save_status();
++(*_cur);
_dataregs = mov->get_date(MOV_DATAREG);
--(*_cur);
_cur->restore_status();
if (_dataregs.month() != _dataregp.month())
{
set_page_tot_reg();
return REPEAT_PAGE;
}
}
}
return NEXT_PAGE;
}
print_action CG4400_application::postprocess_print(int file, int counter)
{
if (file == LF_MOV)
{
//aggiorna registri solo se non e' stampa di prova
if ( (_tipo_stampa != 3) && (!_stampa_tutti_i_registri) )
aggiorna_reg();
if (_stampa_tutti_i_registri)
if (!_mov_empty )
{
if (_tipo_stampa == 2)
++ _u_stampata;
printer().formfeed();
}
/*
if (_stampa_tutti_i_registri)
{
TString16 codtab;
int anno, tipo;
//vado avanti dal punto in cui sono
_tabreg->next();
for (; !_tabreg->eof(); _tabreg->next())
{
tipo = _tabreg->get_int("I0");
if ( (tipo == 1) || (tipo == 2) ) //registro iva
{
codtab = _tabreg->get("CODTAB");
anno = atoi(codtab.mid(0,4));
break;
}
}
if ( (_tabreg->eof()) || (anno != _annoes) )
{
if (_tipo_stampa == 2) //stampa su libro unico
aggiorna_lib();
return NEXT_PAGE;
}
else
{
_tipo_reg = _tabreg->get_int("I0");
_desc_lib = _tabreg->get("S0");
_data_da = _tabreg->get_date("D3");
_pagine_stampate = _tabreg->get_int("I1");
_codreg = codtab.mid(4,3);
_primast = get_page_number();
if (!_mov_empty )
printer().formfeed();
_cur->set_filterfunction(NULL);
_cur->set_filterfunction(filter_func);
_mov_empty = TRUE;
return REPEAT_PAGE;
}
}
*/
}
return NEXT_PAGE;
}
bool CG4400_application::set_print(int n)
{
TMask m("cg4400a");
int giorni_del_mese;
if (set_ditte(m))
if (_selected.ones() > 0l)
{
_annoes = m.get_int(ANNO);
_tipo_stampa = m.get_int(TIPO_STAMPA);
//Se stampa di prova l'utente indica data_da e data_a
if (_tipo_stampa == 3)
{
_data_stampa = m.get(DATA_STAMPA);
_data_da = m.get(DA_DATA);
_data_a = m.get(A_DATA);
if (!_data_da.ok())
_data_da = format("01/01/%4d", _annoes);
if (!_data_a.ok())
_data_a = format("31/12/%4d", _annoes);
printer().setdate(_data_stampa);
}
// senno' data_da e' letta dal registro
else //stampe definitive
{
if ( (_tipo_stampa == 1) || (_tipo_stampa == 4) )
_fino_a_mese = m.get_int(FINO_A_MESE);
else //stampa su libro unico
{
_codlib = m.get(CODICE_LIB_UN);
_fino_a_mese = m.get_int(MESE);
_u_stampata = m.get_int(ULTIMA_PAGINA);
//set_page_number(_u_stampata + 1);
}
if (_fino_a_mese == 12)
giorni_del_mese = 31;
else
{
TDate primo = format("01/%02d/%4d", _fino_a_mese+1, _annoes);
--primo;
giorni_del_mese = primo.day();
}
_data_a=format("%02d/%02d/%4d",giorni_del_mese,_fino_a_mese,_annoes);
// NB data_da viene letta nella preprocess_page
}
if (_tipo_stampa == 2)
compila_lib();
stampa_registri_IVA(m);
}
else warning_box("Nessuna ditta selezionata!");
return FALSE;
}
void CG4400_application::stampa_registri_IVA(const TMask& m)
{
long l;
long firm = TApplication::get_firm();
bool ok = FALSE;
for (l = 0l, _nditte->first(); !_nditte->eof(); l++, _nditte->next())
{
if (_selected[l])
{
TApplication::set_firm(_nditte->get_long("CODDITTA"));
ok = compila_reg(m); // cerca il primo registro valido (nel caso di stampa tutti i registri), senno' legge i dati del registro specificato
if (!ok) continue;
if (!_stampa_tutti_i_registri)
_cur->set_filterfunction(filter_func);
_frequiva = _nditte->get("FREQVIVA")[0];
if (_tipo_stampa != 3) //stampa definitiva
ok = controlla_liquidazione() && controlla_mov();
if (!ok) continue;
if (!_stampa_tutti_i_registri)
print();
else
{
TString16 codtab;
int anno, tipo;
for (_tabreg->first(); !_tabreg->eof(); _tabreg->next())
{
tipo = _tabreg->get_int("I0");
codtab = _tabreg->get("CODTAB");
anno = atoi(codtab.mid(0,4));
if (anno > _annoes)
break;
if ( (tipo == 1) || (tipo == 2) ) //registro iva
{
_tipo_reg = _tabreg->get_int("I0");
_desc_lib = _tabreg->get("S0");
if (_tipo_stampa != 3)
_data_da = _tabreg->get_date("D3");
_pagine_stampate = _tabreg->get_int("I1");
_codreg = codtab.mid(4,3);
_codatt = _tabreg->get("S8");
_attivita = desc_attivita(_codatt);
_desc_lib = _tabreg->get ("S0");
//_primast = get_page_number();
//if (!_mov_empty )
// printer().formfeed();
_cur->set_filterfunction(NULL);
_cur->set_filterfunction(filter_func);
//set_page_number(_u_stampata + 1);
print();
if (_tipo_stampa != 3) aggiorna_reg();
}
}
}
if (_tipo_stampa == 2)
aggiorna_lib();
}
}
TApplication::set_firm(firm);
}
bool CG4400_application::set_ditte(TMask& m)
{
_selected.reset();
m.field(F_SELECT).set("0");
m.field(DA_CODICE).set("");
m.field(A_CODICE).set("");
m.field(TIPO_STAMPA).set("1");
m.set_handler (TIPO_STAMPA, my_handler);
m.set_handler (DA_DATA, mask_data);
m.set_handler (A_DATA, mask_data);
m.set_handler (MESE, mask_mese);
//m.set_handler (FINO_A_MESE, mask_fino_a_mese);
m.set_handler (CODICE_LIB_UN, mask_cod);
m.set_handler (DLG_SELECT, mask_select);
m.set_handler (F_ANNULLA, mask_annulla);
m.set_handler (F_VERIFICA, mask_verifica);
KEY tasto;
_stampa_width = 132;
set_real_picture("###.###.###.###");
tasto = m.run();
// m.first_focus(tasto);
return tasto == K_ENTER;
}
int CG4400_application::stampa_intestazione_ditta()
{
TDati_ditta tditta(get_firm(), _stampa_width);
TString riga (tditta.prima_riga());
int r=1;
set_header (r, "%s", (const char *) riga);
r++;
riga = tditta.seconda_riga();
set_header (r, "%s", (const char*) riga);
r++;
return r;
}
void CG4400_application::preprocess_header()
{
int r=1;
TString cor, nd1, nd2;
TString riga(_stampa_width);
TString data;
if (_tipo_stampa != 3) //cioe' si tratta di una stampa definitiva
{
if ( (_tipo_stampa == 1) || (_tipo_stampa == 4) )
data.format("%s %s %d", (const char*)"mese di", itom(_datareg.month()),
_datareg.year());
else data.format("%s %s %d", (const char*)"mese di", itom(_fino_a_mese), _annoes);
}
else
data = _data_da.string();
reset_header();
if (_tipo_stampa == 2)
{
if (_stampa_ind_ditta)
r = stampa_intestazione_ditta();
long num = _u_stampata + 1;
set_header(r++, "@94gProgr.Studio %ld@114gProgr.Utente @#", num);
}
else
r = stampa_intestazione_ditta();
set_header(r, "Registro IVA: %s %s %s Attivita\' %s %s",
(const char *) _codreg, (const char *) _desc_lib,
(const char *) data, (const char *) _codatt,
(const char *) _attivita);
r++;
riga.fill('-');
set_header(r, riga);
r++;
if (_tipo_reg == 1) //registro vendite
{
cor = "R";
nd1 = "";
nd2 = "";
}
if (_tipo_reg == 2)
{
cor = "C";
nd1 = "N";
nd2 = "D";
}
if (_tipo_stampa == 3) //stampa di prova
{
set_header(r,"@10gNum.@19gDocumento@68gT Tipo@103gCod %s@121g@124gT@128gNum", (const char*) nd1);
r++;
set_header(r, "Data reg. prot.@17gData@25gNumero Codice Ragione sociale/descrizione@68gO Doc.@76gTotale doc.@91gImponibile Iva %s@112gImposta@124g%s@128gReg", (const char*) nd2, (const char*) cor);
r++;
}
else
{
set_header(r,"@10gNum.@19gDocumento@68gT Tipo@103gCod %s@121g@124gT", (const char*) nd1);
if (_tipo_stampa == 4) //stampa definitiva con rif. al libro giornale
set_header(r, "@128gNum.");
r++;
set_header(r, "Data reg. prot.@17gData@25gNumero Codice Ragione sociale/descrizione@68gO Doc.@76gTotale doc.@91gImponibile Iva %s@112gImposta@124g%s",
(const char*) nd2, (const char*) cor);
if (_tipo_stampa == 4)
set_header(r, "@128gop.");
r++;
}
riga.fill('-');
set_header(r, riga);
}
int cg4400 (int argc, char * argv[])
{
CG4400_application a;
a.run(argc, argv, "Stampa registri IVA");
return 0;
}