Corretta gestione valuta in prima nota e gestione dare/avere nelle causali

git-svn-id: svn://10.65.10.50/trunk@546 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1994-11-07 13:50:09 +00:00
parent d87826888b
commit ab9480626f
7 changed files with 456 additions and 528 deletions

View File

@ -7,147 +7,19 @@
#include <config.h>
#include <utility.h>
#include <clifo.h>
#include <pconti.h>
#include <causali.h>
#include <rcausali.h>
#include <clifo.h>
#include <pconti.h>
#include "cglib.h"
#include "cg2103.h"
#include "cg0500.h"
////////////////////////////////////////////////////////////////////////////
// Funzioni legate ai parametri ditta
////////////////////////////////////////////////////////////////////////////
HIDDEN bool salda_conto()
{
static bool _saldaconto = 2;
if (_saldaconto == 2)
{
TConfig conf(CONFIG_DITTA);
_saldaconto = conf.get_bool("GesSal");
}
return _saldaconto;
}
HIDDEN bool gestione_valuta()
{
static bool _gest_val = 2;
if (_gest_val == 2)
{
TConfig conf(CONFIG_DITTA);
_gest_val = conf.get_bool("GesVal");
}
return _gest_val;
}
HIDDEN int anno_iva()
{
static int _anno_iva = 0;
if (_anno_iva == 0)
{
TConfig conf(CONFIG_DITTA);
_anno_iva = (int)conf.get_long("AnLiIv", "cg");
if (_anno_iva < 1900)
{
_anno_iva = TDate(TODAY).year();
error_box("Nei parametri ditta manca l'anno liquidazione IVA: assumo %d", _anno_iva);
}
}
return _anno_iva;
}
////////////////////////////////////////////////////////////////////////////
//
// Le righe di causale:
//
// Righe_rcaus e' un array di TRiga_caus.
//
// - NB - Contiene solo le descrizioni fisse!
//
// I dati letti dal file sono memorizzati direttamente nello spreadsheet
// Quando cambiano i campi tipodoc, codreg, tpm della testata le nuove
// descrizioni vengono caricate in questo array e poi ricopiate (solo le
// descrizioni) nello spreadsheet.
//
////////////////////////////////////////////////////////////////////////////
class TRiga_caus : public TToken_string
{
public:
const TString& operator = (const TString& s) {return TToken_string::operator=(s);}
const TString& operator = (const char* s) {return TToken_string::operator=(s);}
TRiga_caus (const char *df="", // descrizione fissa
char sezione=' ', // dare/avere
TConto* tc = NULL, // il conto
const char * coddes="", // codice descr. aggiuntiva
const char * descagg=""); // descrizione aggiuntiva
};
TRiga_caus::TRiga_caus (const char * df, char sez, TConto* tc,
const char * coddes, const char * descagg)
: TToken_string(128)
{
add(df);
add(sez);
if (tc != NULL) add(tc->string(0x3));
else add(" | | | | ");
add(coddes);
add(descagg);
}
class TRighe_rcaus : public TArray
{
public:
void set_descr (int numrig=-1, const char * descr="");
void clear(int riga); // pulisce una riga in seguito ad Azzera
void clear_descr(); // cancella solo le descrizioni fisse
void CaricaRigheLibere();
void CausaleIncassoPagamento();
void CausaleRitenutaOccas ();
void CausaleVendite ();
void CausaleAcquisti();
TRighe_rcaus() : TArray(20) {}
};
// Cancella tutte le descrizioni delle righe
void TRighe_rcaus::clear_descr()
{
for (int i=0; i < items(); i++)
{
TRiga_caus *r = (TRiga_caus*)objptr(i);
if (r) r->add("", 0);
}
}
// Cancella tutta la riga tranne la descrizione
void TRighe_rcaus::clear(int row)
{
TRiga_caus* r = (TRiga_caus*)objptr(row);
if (r != NULL) *r = (const char*)r->get(0);
}
// Setta la descrizione di una riga senza cmbiare il resto
void TRighe_rcaus::set_descr(int i, const char * dfi)
{
TRiga_caus *r = (TRiga_caus*)objptr(i);
if (r == NULL)
{
r = new TRiga_caus(dfi);
add(r,i);
}
else
r->add(dfi, 0);
}
bool filtra_reg(const TRelation * r);
typedef enum { acquisto, vendita, incasso_pagamento,
typedef enum { no_descr, acquisto, vendita, incasso_pagamento,
ritenuta_occas, incasso_pagamento_gesval } tipo_descr;
class TCaus_app : public TRelation_application
{
int _filtro; // tipo di filtro su tab. reg.
@ -156,23 +28,29 @@ typedef enum { acquisto, vendita, incasso_pagamento,
// 3 acquisti
// 4 sia acquisti che vendite
friend bool filtra_reg(const TRelation * r);
TSheet_field* _sheet;
// Parametri ditta
bool _valuta, _saldaconto;
int _anno_iva;
protected:
static bool filtra_reg(const TRelation * r);
static bool tipocf_hndl (TMask_field& f, KEY k);
static bool cod_reg_hndl (TMask_field& f, KEY k);
static bool tipodoc_hndl (TMask_field& f, KEY k);
static bool tipomov_hndl (TMask_field& f, KEY k);
static bool sezione_hndl (TMask_field& f, KEY k);
static bool conto_hndl (TMask_field& f, KEY k);
static bool sottoconto_hndl (TMask_field& f, KEY k);
static bool codcausim_hndl (TMask_field& f, KEY k);
static bool m770_hndl (TMask_field& f, KEY k);
static bool leggi_riga (int r, KEY k);
static bool ss_notify (int r, KEY k);
TRelation * _rel;
TMask * _msk;
TLocalisamfile * _conti;
int _mode; // Modo maschera corrente
int _items;
// Bitarray delle righe lette da file all'inizio.
// Quando leggo dal file la riga n setto il bit n.
@ -181,9 +59,17 @@ typedef enum { acquisto, vendita, incasso_pagamento,
void togli_dal_file(const TString&);
void read_rcaus(TMask&);
bool descr2array(TMask&, bool fromHandler);
bool fill_sheet(TMask&);
void set_descr (int numrig=-1, const char * descr="");
void clear(int riga); // pulisce una riga in seguito ad Azzera
void clear_descr(); // cancella solo le descrizioni fisse
void carica_righe_libere();
void causale_inc_pag();
void causale_ritenute ();
void causale_vendite ();
void causale_acquisti();
protected:
virtual bool user_create();
virtual bool user_destroy();
@ -193,6 +79,7 @@ protected:
virtual bool changing_mask(int mode) {return FALSE; }
virtual bool remove();
void read_firm_params();
void init_mask(TMask&);
virtual void init_query_mode(TMask&);
virtual void init_insert_mode(TMask&);
@ -205,49 +92,33 @@ protected:
public:
bool _forcedCopy;
TRighe_rcaus _righe_rcaus; // Array delle descrizioni delle righe
tipo_descr _tipo_des; // Il tipo di causale corrente
void compilaarray (const TString&, int, int, int);
void array2sheet(); // Copia le descrizioni dall'array allo sheet
void compila_array (const TString&, int, int, int);
TSheet_field& ss() const { return *_sheet; }
TMask& ss_mask() const { return _sheet->sheet_mask(); }
TMask* main_mask() const { return _msk; }
TMask& ss_mask() const { return ss().sheet_mask(); }
TSheet_field& ss() const { return (TSheet_field&)_msk->field(F_SHEET_GCS);}
void add_riga (int numrig, char sz, TConto& tc, const TString& d, const TString& da);
bool mostra_campi(TMask_field& f);
TLocalisamfile & conti() { return *_conti; }
bool valuta() const { return _valuta; }
bool saldaconto() const { return _saldaconto; }
int anno_iva() const { return _anno_iva; }
TCaus_app() {}
};
HIDDEN TCaus_app& app() { return (TCaus_app&) main_app(); }
// Per sapere su che riga sono dello spreadsheet. v. set_notify piu' sotto
// e per pulire la sezione Dare/avere in caso di riga azzerata
bool TCaus_app::leggi_riga(int r, KEY k)
{
if (k == K_ENTER)
{
TToken_string &riga = app().ss().row(r);
const int g = riga.get_int(3);
if (g == 0) // riga azzerata
{
app()._righe_rcaus.clear(r); // pulisco la riga anche nell'array
app().ss().force_update(r);
}
}
return TRUE;
}
bool filtra_reg(const TRelation * r)
bool TCaus_app::filtra_reg(const TRelation * r)
{
bool ok = FALSE;
const TRectype& rec = r->lfile().curr();
const int anno = atoi(rec.get("CODTAB").left(4));
if (anno == anno_iva())
if (anno == app().anno_iva())
{
const int tiporeg = rec.get_int("I0");
const bool corrisp = rec.get_bool("B0");
@ -261,7 +132,7 @@ bool filtra_reg(const TRelation * r)
case 3:
ok = tiporeg == 2; break;
case 4: // tiporeg 1 senza corrisp OPPURE 2 (NC ST ND AF)
ok = (tiporeg == 1 && !corrisp) || tiporeg == 2; break;
ok = tiporeg == 2 || (tiporeg == 1 && !corrisp) ; break;
default:
break;
}
@ -270,6 +141,129 @@ bool filtra_reg(const TRelation * r)
}
////////////////////////////////////////////////////////////////////////////
// Funzioni che caricano le varie descrizioni fisse nell'array
////////////////////////////////////////////////////////////////////////////
// Cancella tutta la riga tranne la descrizione
void TCaus_app::clear(int riga)
{
TToken_string& r = ss().row(riga);
r = r.get(0);
ss().force_update(riga);
}
// Setta la descrizione di una riga senza cmbiare il resto
void TCaus_app::set_descr(int i, const char * dfi)
{
TToken_string& r = ss().row(i);
r.add(dfi, 0);
}
void TCaus_app::carica_righe_libere()
{
for (int i = ss().items(); i < 20; i++)
set_descr(i);
ss().force_update();
}
// Cancella tutte le descrizioni delle righe
void TCaus_app::clear_descr()
{
TArray& a = ss().rows_array();
for (int i=0; i < a.items(); i++)
{
TToken_string& r = (TToken_string&)a[i];
r.add("", 0);
}
app()._tipo_des = no_descr;
}
void TCaus_app::causale_vendite()
{
if (_tipo_des == vendita)
return;
clear_descr();
_tipo_des = vendita;
int i=0;
set_descr(i++, "C Clienti");
set_descr(i++, "C Di ricavo");
set_descr(i++, "C Iva vendite");
set_descr(i++, "C Iva non detraibile");
set_descr(i++, "C Imp. esenti");
set_descr(i++, "C Imp. non imponibili");
set_descr(i++, "C Imp. non soggetti");
set_descr(i++, "C Ritenute fiscali");
set_descr(i++, "C Ritenute soc.");
carica_righe_libere();
}
void TCaus_app::causale_acquisti()
{
if (_tipo_des == acquisto)
return;
clear_descr();
_tipo_des = acquisto;
int i=0;
set_descr( i++, "C Fornitori");
set_descr(i++, "C Di costo");
set_descr(i++, "C Iva acquisti");
set_descr(i++, "C Iva non detraibile");
set_descr(i++, "C Imp. esenti");
set_descr(i++, "C Imp. non imponibili");
set_descr(i++, "C Imp. non soggetti");
set_descr(i++, "C Ritenute fiscali");
set_descr(i++, "C Ritenute soc.");
carica_righe_libere();
}
void TCaus_app::causale_ritenute()
{
if (_tipo_des == ritenuta_occas)
return;
clear_descr();
_tipo_des = ritenuta_occas;
int i=0;
set_descr (i++, "Costo");
set_descr (i++, "Cassa/banca");
set_descr (i++, "Erario");
carica_righe_libere();
}
void TCaus_app::causale_inc_pag()
{
const tipo_descr tipo_des = valuta() ? incasso_pagamento_gesval : incasso_pagamento;
if (_tipo_des == tipo_des)
return;
clear_descr();
_tipo_des = tipo_des;
int i=0;
set_descr ( i++, "C Clienti/Fornitori");
set_descr ( i++, "C Cassa o banca");
set_descr ( i++, "C Tratta");
set_descr ( i++, "C Ricevuta bancaria");
set_descr ( i++, "C Cessione");
set_descr ( i++, "C Paghero'");
set_descr ( i++, "C Lettera di credito");
set_descr ( i++, "C Abb. pass/sc.");
set_descr ( i++, "C Abb. att/sc.");
set_descr ( i++, "C Spese e rimborsi");
set_descr ( i++, "C Ritenute fiscali");
if (_tipo_des == incasso_pagamento_gesval)
set_descr (i++, "C Differenza cambio");
carica_righe_libere();
}
////////////////////////////////////////////////////////////////////////////
// Handler della maschera principale
////////////////////////////////////////////////////////////////////////////
@ -303,7 +297,7 @@ bool TCaus_app::tipodoc_hndl (TMask_field& f, KEY k)
if (val.not_empty() && val != "IN" && val != "PG" && val != "AN")
{
f.mask().hide(F_TIPO_MOV_2);
if (salda_conto()) f.mask().show(F_TIPO_MOV_1);
if (app().saldaconto()) f.mask().show(F_TIPO_MOV_1);
f.mask().enable(F_COD_REG);
field_reg.check_type(CHECK_REQUIRED);
@ -346,7 +340,7 @@ bool TCaus_app::tipodoc_hndl (TMask_field& f, KEY k)
f.mask().disable(F_COD_REG);
f.mask().hide(F_TIPO_MOV_1);
if (salda_conto())
if (app().saldaconto())
f.mask().show(F_TIPO_MOV_2);
}
@ -354,10 +348,10 @@ bool TCaus_app::tipodoc_hndl (TMask_field& f, KEY k)
const TString16 codreg(f.mask().get(F_COD_REG));
if (codreg.not_empty())
{
TRegistro registro(codreg, anno_iva());
TRegistro registro(codreg, app().anno_iva());
if (registro.name().empty())
return f.error_box("Non esiste il registro %s per l'anno %d",
(const char *)codreg, anno_iva());
(const char *)codreg, app().anno_iva());
}
app().mostra_campi(f);
@ -421,14 +415,14 @@ bool TCaus_app::mostra_campi(TMask_field& f)
m.show(F_OP_FINE_ANNO);
m.show(F_COLL_CESP);
m.show(F_M_770);
if (salda_conto()) m.hide(F_MOV_VALU);
if (saldaconto()) m.hide(F_MOV_VALU);
m.hide(F_MOV_SEZ);
break;
case 3:
case 5:
case 6:
if (gestione_valuta()) m.show(F_MOV_VALU);
if (salda_conto()) m.show(F_MOV_SEZ);
if (valuta()) m.show(F_MOV_VALU);
if (saldaconto()) m.show(F_MOV_SEZ);
m.show(F_M_770);
m.hide(F_OP_FINE_ANNO);
m.hide(F_COLL_CESP);
@ -441,8 +435,8 @@ bool TCaus_app::mostra_campi(TMask_field& f)
{ // codreg non vuoto
m.hide(F_OP_FINE_ANNO);
m.hide(F_MOV_SEZ);
if (gestione_valuta()) m.show(F_MOV_VALU);
if (!salda_conto())
if (valuta()) m.show(F_MOV_VALU);
if (!saldaconto())
m.show(F_COD_CAUS_IM);
m.show(F_AUTO_FAT);
m.show(F_ALLEGAT);
@ -473,7 +467,7 @@ bool TCaus_app::cod_reg_hndl (TMask_field& f, KEY k)
if (tpd.not_empty())
{
TipoIVA i = nessuna_iva;
TRegistro grog(codreg, anno_iva());
TRegistro grog(codreg, app().anno_iva());
TTable tabtpd("%TPD");
tabtpd.put("CODTAB", tpd);
if (tabtpd.read() == NOERR)
@ -496,6 +490,39 @@ bool TCaus_app::cod_reg_hndl (TMask_field& f, KEY k)
////////////////////////////////////////////////////////////////////////////
// Handler della maschera dello spreadsheet
////////////////////////////////////////////////////////////////////////////
bool TCaus_app::ss_notify(int r, KEY k)
{
if (k == K_ENTER)
{
TToken_string &riga = app().ss().row(r);
const int g = riga.get_int(3);
if (g == 0) // riga azzerata
app().clear(r); // pulisco la riga anche nell'array
}
return TRUE;
}
bool TCaus_app::sezione_hndl (TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
if (f.mask().get(SS_GRUPPO).not_empty())
{
if (f.get().empty())
{
const int riga = app().ss().selected();
if (riga == 0 || riga == 8)
return f.error_box("E' necessario specificare la sezione D/A");
}
}
else
f.reset();
}
return TRUE;
}
bool TCaus_app::conto_hndl (TMask_field& f, KEY k)
{
if (k == K_ENTER)
@ -503,7 +530,7 @@ bool TCaus_app::conto_hndl (TMask_field& f, KEY k)
char scarta = 'Z';
int ultima = 8;
const TipoIVA tpr = (TipoIVA)app().main_mask()->get_int(F_TIPO_REG);
const TipoIVA tpr = (TipoIVA)app().curr_mask().get_int(F_TIPO_REG);
switch (tpr)
{
@ -528,7 +555,8 @@ bool TCaus_app::conto_hndl (TMask_field& f, KEY k)
char sezione = toupper(sez.get()[0]);
if (sezione != 'A' && sezione != 'D') sezione = ' ';
char sezione_consigliata = ' ';
const bool full = f.get().not_empty();
const bool full = f.mask().get(SS_GRUPPO).not_empty();
const int riga = app().ss().selected();
if (tpr != nessuna_iva && riga <= ultima)
@ -560,22 +588,19 @@ bool TCaus_app::conto_hndl (TMask_field& f, KEY k)
"%s non valido con registro %s", cf == 'C' ? "Cliente" : "Fornitore", iva2name(tpr));
}
if (sezione == ' ')
if (sezione == ' ' && sezione_consigliata != ' ')
{
const char sc[2] = { sezione_consigliata, '\0' };
sez.set(sc);
if (full && sezione_consigliata == ' ')
return sez.error_box("E' necessario specificare la sezione D/A");
}
}
return TRUE;
}
// 1. Se specifico il sottoconto devono essere non vuoti gruppo e conto
// 2. g-c-s devono esistere
bool TCaus_app::sottoconto_hndl (TMask_field& f, KEY k)
bool TCaus_app::sottoconto_hndl(TMask_field& f, KEY k)
{
if (k == K_ENTER && f.get().not_empty())
{
@ -586,155 +611,80 @@ bool TCaus_app::sottoconto_hndl (TMask_field& f, KEY k)
return TRUE;
}
////////////////////////////////////////////////////////////////////////////
// Funzioni che caricano le varie descrizioni fisse nell'array
////////////////////////////////////////////////////////////////////////////
void TRighe_rcaus::CausaleVendite()
{
int i=0;
TConto tc();
app()._tipo_des = vendita;
// set_descr(i++, "C Clienti", 'C');
set_descr(i++, "C Clienti"); // Lascio scelta libera
set_descr(i++, "C Di ricavo");
set_descr(i++, "C Iva vendite");
set_descr(i++, "C Iva non detraibile");
set_descr(i++, "C Imp. esenti");
set_descr(i++, "C Imp. non imponibili");
set_descr(i++, "C Imp. non soggetti");
set_descr(i++, "C Ritenute fiscali");
set_descr(i++, "C Ritenute soc.");
CaricaRigheLibere();
}
void TRighe_rcaus::CausaleAcquisti()
{
int i=0;
app()._tipo_des = acquisto;
// set_descr( i++, "C Fornitori", 'F');
set_descr( i++, "C Fornitori");
set_descr(i++, "C Di costo");
set_descr(i++, "C Iva acquisti");
set_descr(i++, "C Iva non detraibile");
set_descr(i++, "C Imp. esenti");
set_descr(i++, "C Imp. non imponibili");
set_descr(i++, "C Imp. non soggetti");
set_descr(i++, "C Ritenute fiscali");
set_descr(i++, "C Ritenute soc.");
CaricaRigheLibere();
}
void TRighe_rcaus::CausaleRitenutaOccas()
{
int i=0;
app()._tipo_des = ritenuta_occas;
set_descr (i++, "Costo");
set_descr (i++, "Cassa/banca");
set_descr (i++, "Erario");
CaricaRigheLibere();
}
void TRighe_rcaus::CaricaRigheLibere()
{
for (int i = items(); i < 20; i++)
set_descr(i);
}
void TRighe_rcaus::CausaleIncassoPagamento()
{
int i=0;
app()._tipo_des = incasso_pagamento;
set_descr ( i++, "C Clienti/Fornitori");
set_descr ( i++, "C Cassa o banca");
set_descr ( i++, "C Tratta");
set_descr ( i++, "C Ricevuta bancaria");
set_descr ( i++, "C Cessione");
set_descr ( i++, "C Paghero'");
set_descr ( i++, "C Lettera di credito");
set_descr ( i++, "C Abb. pass/sc.");
set_descr ( i++, "C Abb. att/sc.");
set_descr ( i++, "C Spese e rimborsi");
set_descr ( i++, "C Ritenute fiscali");
if (gestione_valuta())
{
set_descr (i++, "C Differenza cambio");
app()._tipo_des = incasso_pagamento_gesval;
}
CaricaRigheLibere();
}
void TCaus_app::compilaarray(const TString& tpd, int tpm, int tpr, int m770)
void TCaus_app::compila_array(const TString& tpd, int tpm, int tpr, int m770)
{
_forcedCopy = FALSE;
if (tpd.empty() || tpd == "IN" || tpd == "AN" || tpd == "PG")
{
if (salda_conto())
if (saldaconto())
{
switch (tpm) {
case 3:
case 5:
case 6:
_righe_rcaus.CausaleIncassoPagamento();
causale_inc_pag();
break;
case 0:
if (m770 == 6)
_righe_rcaus.CausaleRitenutaOccas();
else {
{
causale_ritenute();
}
else
{
_forcedCopy = TRUE;
_righe_rcaus.clear_descr();
_righe_rcaus.CaricaRigheLibere();
clear_descr();
carica_righe_libere();
}
break;
default:
_forcedCopy = TRUE;
_righe_rcaus.clear_descr();
_righe_rcaus.CaricaRigheLibere();
clear_descr();
carica_righe_libere();
break;
}
}
else { // NO saldaconto
else
{ // NO saldaconto
_forcedCopy = TRUE;
_righe_rcaus.clear_descr();
_righe_rcaus.CaricaRigheLibere();
clear_descr();
carica_righe_libere();
}
}
else // C'e' il tipodoc.
{
if (tpr == 1)
_righe_rcaus.CausaleVendite();
causale_vendite();
else
if (tpr == 2)
_righe_rcaus.CausaleAcquisti();
causale_acquisti();
else
{
_forcedCopy = TRUE;
_righe_rcaus.clear_descr();
_righe_rcaus.CaricaRigheLibere();
clear_descr();
carica_righe_libere();
}
}
}
bool TCaus_app::fill_sheet(TMask& m)
{
descr2array(m, TRUE);
array2sheet();
return TRUE;
}
///////////////////////////////////////////////////////////
// Relapp functions
///////////////////////////////////////////////////////////
int TCaus_app::read(TMask& m)
{
m.autoload(_rel);
descr2array(m, FALSE);
array2sheet();
read_rcaus(m);
fill_sheet(m);
return NOERR;
}
void TCaus_app::add_riga(int numrig, char sz, TConto& tc, const TString& d, const TString& da)
{
TToken_string& riga = ss().row(numrig);
riga = " ";
riga = riga.get(0); // Lascia invariata la descrizione ...
if (riga.empty()) riga = " "; // ... se esiste gia'
riga.add(sz);
riga.add(tc.string(0x3));
riga.add(d);
@ -752,7 +702,6 @@ void TCaus_app::read_rcaus(TMask& m)
TString80 da;
_righe_gia_presenti.reset();
// _righe_rcaus.destroy();
rcaus.zero();
rcaus.put(RCA_CODCAUS, cod);
@ -784,63 +733,17 @@ void TCaus_app::read_rcaus(TMask& m)
}
}
// ricopio l'array Righe_rcaus nello sheet
void TCaus_app::array2sheet()
{
TString80 dfi;
_items = _righe_rcaus.items();
bool update = FALSE;
for (int i = 0; i < _items; i++)
{
TToken_string& riga = ss().row(i);
TToken_string* r = (TToken_string*)_righe_rcaus.objptr(i);
dfi = r->get(0);
// Ricopio la descrizione solo se non vuota
if (_forcedCopy)
{
update = TRUE;
riga.add(dfi,0);
}
else
if (dfi.not_empty())
{
update = TRUE;
riga.add(dfi,0);
}
}
if (update) ss().force_update();
}
bool TCaus_app::descr2array(TMask& m, bool fromHandler)
bool TCaus_app::fill_sheet(TMask& m)
{
TLocalisamfile& caus = _rel->lfile();
TString16 tpd, codreg;
int tpm, m770, tpr;
// if (m.mode() == MODE_MOD && !fromHandler)
if (fromHandler)
{
codreg = m.field(F_COD_REG).get();
tpd = m.field(F_TIPO_DOC).get();
tpm = m.get_int(F_TIPO_MOV);
m770 = m.get_int(F_M_770);
}
else if (m.mode() == MODE_MOD)
{
codreg = caus.get("REG");
tpd = caus.get("TIPODOC");
tpm = caus.get_int("TIPOMOV");
m770 = caus.get_int("M770");
}
else
{ // sono in inserimento e prima di entrare negli handler
codreg = m.field(F_COD_REG).get();
tpd = m.field(F_TIPO_DOC).get();
tpm = m.get_int(F_TIPO_MOV);
m770 = m.get_int(F_M_770);
}
TString16 chiave; chiave << anno_iva() << codreg;
TTable reg("REG");
@ -851,7 +754,7 @@ bool TCaus_app::descr2array(TMask& m, bool fromHandler)
tpr = 0;
// carico le descrizioni fisse nell'array Righe_rcaus
compilaarray(tpd,tpm,tpr,m770);
compila_array(tpd,tpm,tpr,m770);
return TRUE;
}
@ -870,7 +773,6 @@ void TCaus_app::togli_dal_file(const TString& cau)
rcaus.zero();
rcaus.put(RCA_CODCAUS,cau);
rcaus.put(RCA_NRIGA, i);
// if (rcaus.read() == NOERR)
rcaus.remove();
_righe_gia_presenti.reset(i);
}
@ -887,9 +789,9 @@ int TCaus_app::rewrite(const TMask& m)
return re_write(m, TRUE);
}
int TCaus_app::re_write(const TMask& m,bool rewrite)
int TCaus_app::re_write(const TMask& m, bool re)
{
const TString16 cau(m.get(F_COD_CAUS));
const TString16 codcau(m.get(F_COD_CAUS));
TString16 coddesc;
TLocalisamfile& caus = _rel->lfile(LF_CAUSALI);
@ -897,18 +799,15 @@ int TCaus_app::re_write(const TMask& m,bool rewrite)
m.autosave(_rel);
TSheet_field& cs = ss();
// _items = _righe_rcaus.items();
_items = cs.items();
for (int i = 0; i < _items; i++)
for (int i = 0; i < ss().items(); i++)
{
TToken_string &riga = cs.row(i);
if (riga.empty_items()) continue;
TToken_string &riga = ss().row(i);
char sezione = riga.get_char(1);
const char sezione = riga.get_char(1);
const char tipo_cf = riga.get_char();
const int g = riga.get_int();
if (g == 0) continue;
const int c = riga.get_int();
long s = riga.get_long();
riga.get(); // Salta descrizione conto
@ -917,16 +816,14 @@ int TCaus_app::re_write(const TMask& m,bool rewrite)
if (g > 0)
{
rcaus.zero();
rcaus.put (RCA_CODCAUS, cau);
rcaus.put (RCA_CODCAUS, codcau);
rcaus.put (RCA_NRIGA, i+1); // Numerare da uno!
rcaus.put (RCA_SEZIONE, sezione);
rcaus.put (RCA_TIPOCF, tipo_cf);
rcaus.put (RCA_GRUPPO , g);
rcaus.put (RCA_CONTO , c);
rcaus.put (RCA_SOTTOCONTO, s);
rcaus.put (RCA_CODDESC, (const char *)coddesc);
if (rewrite)
{
rcaus.put (RCA_CODDESC, coddesc);
if (_righe_gia_presenti[i+1])
{
rcaus.rewrite();
@ -935,14 +832,11 @@ int TCaus_app::re_write(const TMask& m,bool rewrite)
else
rcaus.write();
}
else
rcaus.write();
}
}
if (rewrite)
if (re)
{
togli_dal_file(cau); // Elimina dal file le righe rimaste nel bitarray
togli_dal_file(codcau); // Elimina dal file le righe rimaste nel bitarray
return caus.rewrite();
}
else
@ -971,17 +865,22 @@ bool TCaus_app::remove()
return ok;
}
void TCaus_app::init_mask(TMask& m)
{
m.set(F_ANNOES, _anno_iva);
}
void TCaus_app::init_query_mode(TMask& m)
{
_righe_rcaus.destroy();
read_firm_params();
ss().reset();
init_mask(m);
}
void TCaus_app::init_insert_mode(TMask& m)
{
ss().reset();
init_mask(m);
_righe_gia_presenti.reset();
}
void TCaus_app::init_modify_mode(TMask& m)
@ -989,44 +888,40 @@ void TCaus_app::init_modify_mode(TMask& m)
init_mask(m);
}
void TCaus_app::init_mask(TMask& m)
{
// 27/06/94 Setto il campo nascosto F_ANNOES all'anno di liq. Iva
// preso dai par.ditta
const int anno = anno_iva();
m.set(F_ANNOES, anno);
}
void TCaus_app::read_firm_params()
{
TConfig conf(CONFIG_DITTA);
_saldaconto = conf.get_bool("GesSal");
_valuta = conf.get_bool("GesVal");
_anno_iva = (int)conf.get_long("AnLiIv", "cg");
if (_anno_iva < 1900)
{
_anno_iva = TDate(TODAY).year();
error_box("Nei parametri ditta manca l'anno liquidazione IVA: assumo %d", _anno_iva);
conf.set("AnLiIv", _anno_iva);
}
}
bool TCaus_app::user_create()
{
_rel = new TRelation (LF_CAUSALI);
_rel->add(LF_RCAUSALI, "CODCAUS=CODCAUS");
_conti = new TLocalisamfile (LF_PCON);
_msk = new TMask("cg0500a");
_sheet = &(TSheet_field&)_msk->field(F_SHEET_GCS);
if (!salda_conto())
{
_msk->hide (F_MOV_SEZ);
_msk->hide (F_TIPO_MOV_1);
_msk->hide (F_TIPO_MOV_2);
_msk->show (F_COD_CAUS_IM);
}
else
{
_msk->show (F_MOV_SEZ);
_msk->hide (F_COD_CAUS_IM);
}
read_firm_params();
if (gestione_valuta())
_msk->show (F_MOV_VALU);
else
_msk->hide (F_MOV_VALU);
_msk->show(F_TIPO_MOV_1, saldaconto());
_msk->show(F_TIPO_MOV_2, saldaconto());
_msk->show (F_MOV_SEZ, saldaconto());
_msk->show (F_COD_CAUS_IM, !saldaconto());
_msk->show (F_MOV_VALU, valuta());
_msk->set_handler(F_TIPO_DOC, tipodoc_hndl);
if (salda_conto())
if (saldaconto())
{
_msk->set_handler(F_TIPO_MOV_1, tipomov_hndl);
_msk->set_handler(F_TIPO_MOV_2, tipomov_hndl);
@ -1036,8 +931,9 @@ bool TCaus_app::user_create()
_msk->set_handler(F_M_770, m770_hndl);
TSheet_field& cs = ss();
cs.set_notify(leggi_riga);
cs.set_notify(ss_notify);
cs.sheet_mask().set_handler(SS_SEZIONE, sezione_hndl);
cs.sheet_mask().set_handler(SS_CONTO, conto_hndl);
cs.sheet_mask().set_handler(SS_SOTTOCONTO, sottoconto_hndl);
cs.sheet_mask().set_handler(SS_SOTTOCONTO+100, sottoconto_hndl);
@ -1052,7 +948,6 @@ bool TCaus_app::user_destroy()
{
delete _msk;
delete _rel;
delete _conti;
return TRUE;
}
@ -1063,6 +958,3 @@ int cg0500(int argc, char* argv[])
return 0;
}

View File

@ -45,6 +45,7 @@ BEGIN
DISPLAY "Registro" REG
DISPLAY "Movimento" TIPOMOV
COPY OUTPUT F_COD_CAUS
CHECKTYPE REQUIRED
KEY 2
HELP "Descrizione della causale"
MESSAGE COPY, F_DESCR2
@ -127,12 +128,12 @@ BEGIN
FIELD LF_CAUSALI->M770
HELP "Inserire il tipo di collegamento Mod.770"
ITEM " |Nessuno"
ITEM "1|Ricevuta e/o pagamento fattura percipipiente"
ITEM "1|Ricevuta e/o pagamento fattura percipiente"
ITEM "2|Versamento ritenute percipiente"
ITEM "3|Versamento ritenute dipendente"
ITEM "4|Versamento contributi dipendente"
ITEM "5|Compensi non soggetti"
ITEM "6|Ritenute per operazioni occasionali"
ITEM "6|Ritenute per prestazioni occasionali"
END
NUMBER F_ANNOES 4

View File

@ -138,6 +138,7 @@ BEGIN
ITEM "A|Avere"
FIELD LF_RCAUSALI->SEZIONE
FLAGS "U"
GROUP 1
END
// Descrizione normale
@ -214,6 +215,7 @@ STRING 109 50
BEGIN
PROMPT 1 8 ""
FLAGS "D"
GROUP 1
END
BUTTON DLG_OK 9 2

View File

@ -78,6 +78,7 @@ TMask* TPrimanota_application::load_mask(int n)
ism.set_handler(209, sheet_clifo_handler);
ism.set_handler(309, sheet_clifo_handler);
}
_iva_showed = FALSE;
case 1:
{
m->set_handler(F_DATAREG, datareg_handler);
@ -85,6 +86,7 @@ TMask* TPrimanota_application::load_mask(int n)
m->set_handler(F_DESCR, descr_handler);
m->set_handler(F_CODCAUS, caus_modify_handler);
m->set_handler(F_SHEETCG, cg_handler);
m->set_handler(F_CAMBIO, cambio_handler);
m->set_handler(F_VISVAL, visval_handler);
TSheet_field& cg = (TSheet_field&)m->field(F_SHEETCG);
@ -225,13 +227,14 @@ bool TPrimanota_application::changing_mask(int mode)
{
const bool flag = _mode != MODE_QUERY;
if (flag && _iva != nessuna_iva)
if (flag && _iva != nessuna_iva && !_iva_showed)
{
WINDOW w = ivas().parent();
show_window(w, TRUE);
set_front_window(w);
process_events();
show_window(w, FALSE);
_iva_showed = TRUE;
}
return flag;
@ -290,6 +293,7 @@ void TPrimanota_application::init_mask(TMask& m)
const bool intra = _causale.intra();
const bool valintra = _causale.valintra();
const bool corrisp = _causale.corrispettivi();
if (_iva != nessuna_iva)
{
@ -302,24 +306,28 @@ void TPrimanota_application::init_mask(TMask& m)
else
{
forg = 'h';
clig = causale().corrispettivi() ? 'h' : 's';
clig = corrisp ? 'h' : 's';
}
m.send_key(K_SHIFT+K_CTRL+clig, -1); // group 1 (clienti)
m.send_key(K_SHIFT+K_CTRL+forg, -2); // group 2 (fornitori)
m.send_key(K_SHIFT+K_CTRL+clig, -1); // GROUP 1 (clienti)
m.send_key(K_SHIFT+K_CTRL+forg, -2); // GROUP 2 (fornitori)
if (corrisp) m.hide(F_STATOPAIV);
m.show(F_CORRLIRE, intra);
const bool corrval = intra && _causale.valintra();
const bool corrval = intra && valintra;
m.show(F_CORRVALUTA, corrval);
m.show(F_CODIVA, m.mode() == MODE_INS);
}
// Show/Hide campi valuta: F_VALUTA, F_CAMBIO, F_VISVAL (GROUP 3)
const bool valuta = _causale.valuta() || _causale.valintra();
const bool valuta = valintra || (_ges_val && _causale.valuta());
m.send_key(K_SHIFT+K_CTRL+(valuta ? 's' : 'h'), -3);
if (valuta)
m.set(F_VISVAL, "X");
{
const bool ok = m.get(F_VALUTA).not_empty();
m.field(F_VISVAL).set(ok ? "X" : " ");
}
}
void TPrimanota_application::init_query_mode(TMask& m)
@ -384,14 +392,6 @@ void TPrimanota_application::init_insert_mode(TMask& m)
{
const long protiva = causale().reg().protocol();
m.set(F_PROTIVA, protiva+1);
TMask_field& vv = m.field(F_VISVAL);
if (vv.active() && m.get(F_VALUTA).empty()) // Se e' un movimento in valuta
{
const bool ok = m.field(F_VALUTA).on_key(K_F9); // Richiedi valuta
vv.set(ok ? "X" : " ");
if (ok) vv.on_hit(); // Cambia decimali
}
}
if (m.get(F_CODCAUS).empty()) return;
@ -475,20 +475,26 @@ int TPrimanota_application::read(TMask& m)
{
m.autoload(_rel);
cgs().reset();
if (_iva != nessuna_iva)
{
ivas().reset();
const TString16 occode(_rel->lfile().get("OCFPI"));
occas_mask().set(O_CODICE, occode);
const char clifo = toupper(m.get(F_CLIFO)[0]);
real cambio(_rel->lfile().get("CAMBIO"));
if (cambio < 1.0) cambio = 1.0;
m.set_exchange(FALSE, cambio);
const char clifo = toupper(m.get(F_CLIFO)[0]);
if (_iva == iva_acquisti && clifo == 'C')
error_box("Registrazione di acquisto attribuita ad un cliente"); else
if (_iva == iva_vendite && clifo == 'F')
error_box("Registrazione di vendita attribuita ad un fornitore");
}
cgs().reset();
_saldi.reset(); // Azzera saldi
_saldi.set_movprovv(_rel->lfile().get_bool("PROVVIS"));
@ -543,8 +549,6 @@ int TPrimanota_application::read(TMask& m)
m.set(F_SOLAIVA, solaiva ? "X" : " ");
m.field(F_SOLAIVA).on_hit();
ivas().reset();
const bool to_swap = test_swap(FALSE);
if (to_swap)
{
@ -583,9 +587,6 @@ int TPrimanota_application::read(TMask& m)
ivas().row(i) = riga;
}
TMask_field& vv = m.field(F_VISVAL);
if (vv.active()) vv.on_hit();
return _rel->status();
}
@ -852,11 +853,13 @@ void TPrimanota_application::genera_incasso(const char* causimm)
inc.lfile().put("REG", caus.reg().name()); // Registro
const int annoes = m.get_int(F_ANNOES);
const TString16 datareg = m.get(F_DATAREG);
TRectype& r = inc.cg(0);
r.zero();
r.put("NUMREG", _lastreg);
r.put("NUMRIG", 1);
r.put("DATAREG", datareg);
r.put("ANNOES", annoes);
r.put("SEZIONE", m.get(I_SEZIONE1));
r.put("IMPORTO", m.get(F_TOTALE));
@ -891,6 +894,7 @@ void TPrimanota_application::genera_incasso(const char* causimm)
r.put("IMPORTO", imp);
r.put("NUMREG", _lastreg);
r.put("NUMRIG", i);
r.put("DATAREG", datareg);
r.put("ANNOES", annoes);
r.put("SEZIONE", m.get(sid));
r.put("TIPOC", ' ');

View File

@ -124,6 +124,7 @@ BEGIN
OUTPUT F_DESCAGG CODTAB
OUTPUT F_DESCR S0
CHECKTYPE NORMAL
WARNING "Descrizione assente"
END
STRING F_DESCR 50
@ -234,7 +235,6 @@ BEGIN
OUTPUT F_CONTORIC CONTORIC
OUTPUT F_SOTTOCONTORIC SOTTOCRIC
OUTPUT F_CODPAG CODPAG
OUTPUT F_VALUTA CODVAL
OUTPUT F_STATOPAIV STATOPAIV
OUTPUT F_PIVACLIENTE PAIV
OUTPUT F_OCCASIONALE OCCAS
@ -265,7 +265,6 @@ BEGIN
OUTPUT F_SOTTOCONTORIC SOTTOCRIC
OUTPUT F_OCCASIONALE OCCAS
OUTPUT F_CODPAG CODPAG
OUTPUT F_VALUTA CODVAL
OUTPUT F_STATOPAIV STATOPAIV
OUTPUT F_PIVAFORNITORE PAIV
MESSAGE COPY,F_CLIENTE
@ -381,86 +380,9 @@ BEGIN
WARNING "Codice pagamento assente"
END
NUMBER F_TOTALE 15
BEGIN
PROMPT 1 12 "Totale documento "
FIELD TOTDOC
FLAGS "RV"
PICTURE "."
END
NUMBER F_RITFIS 15
BEGIN
PROMPT 1 13 "Ritenute fiscali "
FIELD RITFIS
FLAGS "RV"
PICTURE "."
END
NUMBER F_RITSOC 15
BEGIN
PROMPT 1 14 "Ritenute sociali "
FIELD LF_MOV->RITSOC
FLAGS "RV"
PICTURE "."
END
STRING F_CODIVA 4
BEGIN
PROMPT 60 12 "Codice IVA "
FLAGS "U"
USE %IVA
INPUT CODTAB F_CODIVA
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
DISPLAY "%@6" R0
DISPLAY "Tipo" S1
OUTPUT F_CODIVA CODTAB
CHECKTYPE NORMAL
END
DATE F_DATA74TER
BEGIN
PROMPT 54 13 "Data 74/ter "
CHECKTYPE REQUIRED
FIELD DATA74TER
END
NUMBER F_ANNORIF 4
BEGIN
PROMPT 45 14 "Rif.partita "
FLAGS "A"
HELP "Anno di riferimento partita"
CHECKTYPE REQUIRED
END
STRING F_NUMRIF 7
BEGIN
PROMPT 68 14 "/ "
HELP "Numero documento (o protocollo IVA) di riferimento"
CHECKTYPE REQUIRED
END
NUMBER F_CORRLIRE 15
BEGIN
PROMPT 1 15 "Corrispettivo Lire "
FIELD LF_MOV->CORRLIRE
FLAGS "R"
PICTURE "."
END
NUMBER F_CORRVALUTA 15
BEGIN
PROMPT 45 15 "Corrisp. valuta "
FIELD LF_MOV->CORRVALUTA
FLAGS "R"
PICTURE "."
END
STRING F_VALUTA 3
BEGIN
PROMPT 1 16 "Valuta "
PROMPT 1 12 "Valuta "
FIELD LF_MOV->CODVAL
FLAGS "U"
GROUP 3
@ -473,11 +395,12 @@ BEGIN
OUTPUT F_VALUTA CODTAB
OUTPUT F_CAMBIO R10
CHECKTYPE NORMAL
WARNING "Codice valuta assente"
END
NUMBER F_CAMBIO 15 5
NUMBER F_CAMBIO 12 5
BEGIN
PROMPT 20 16 "Cambio "
PROMPT 20 12 "Cambio "
FIELD LF_MOV->CAMBIO
FLAGS "RU"
GROUP 3
@ -486,10 +409,87 @@ END
BOOLEAN F_VISVAL
BEGIN
PROMPT 47 16 "Visualizza importi in valuta"
PROMPT 47 12 "Visualizza importi in valuta"
GROUP 3
END
NUMBER F_TOTALE 15
BEGIN
PROMPT 1 13 "Totale documento "
FIELD TOTDOC
FLAGS "RV"
PICTURE "."
END
NUMBER F_RITFIS 15
BEGIN
PROMPT 1 14 "Ritenute fiscali "
FIELD RITFIS
FLAGS "RV"
PICTURE "."
END
NUMBER F_RITSOC 15
BEGIN
PROMPT 1 15 "Ritenute sociali "
FIELD LF_MOV->RITSOC
FLAGS "RV"
PICTURE "."
END
STRING F_CODIVA 4
BEGIN
PROMPT 60 13 "Codice IVA "
FLAGS "U"
USE %IVA
INPUT CODTAB F_CODIVA
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
DISPLAY "%@6" R0
DISPLAY "Tipo" S1
OUTPUT F_CODIVA CODTAB
CHECKTYPE NORMAL
WARNING "Codice IVA assente"
END
DATE F_DATA74TER
BEGIN
PROMPT 54 14 "Data 74/ter "
CHECKTYPE REQUIRED
FIELD DATA74TER
END
NUMBER F_ANNORIF 4
BEGIN
PROMPT 45 15 "Rif.partita "
FLAGS "A"
HELP "Anno di riferimento partita"
CHECKTYPE REQUIRED
END
STRING F_NUMRIF 7
BEGIN
PROMPT 68 15 "/ "
HELP "Numero documento (o protocollo IVA) di riferimento"
CHECKTYPE REQUIRED
END
NUMBER F_CORRLIRE 15
BEGIN
PROMPT 1 16 "Corrispettivo Lire "
FIELD LF_MOV->CORRLIRE
FLAGS "R"
PICTURE "."
END
NUMBER F_CORRVALUTA 15
BEGIN
PROMPT 45 16 "Corrisp. valuta "
FIELD LF_MOV->CORRVALUTA
FLAGS "R"
PICTURE "."
END
ENDPAGE
PAGE "IVA" -1 -1 77 20

View File

@ -653,7 +653,7 @@ bool TPrimanota_application::codiva_handler(TMask_field& f, KEY key)
bool TPrimanota_application::detrazione_handler(TMask_field& f, KEY key)
{
if (key == K_SPACE && app().iva() == iva_acquisti)
if (key == K_TAB && f.dirty() && app().iva() == iva_acquisti)
{
TMask_field& ci = f.mask().field(101);
ci.set_dirty();
@ -1299,12 +1299,29 @@ bool TPrimanota_application::clifo_handler(TMask_field& f, KEY key)
{
TMask& m = f.mask();
app().add_cgs_tot(m);
TLocalisamfile& clifo = ((TEdit_field&)f).browse()->cursor()->file();
const int alleg = clifo.get_int(CLI_ALLEG);
TEdit_field& upi = m.efield(F_RIEPILOGO);
upi.check_type(alleg == 3 ? CHECK_REQUIRED : CHECK_NORMAL);
if (clifo.get_bool(CLI_OCCAS))
m.send_key(K_SPACE, F_OCCASEDIT); // Lancia maschera occasionali
if (m.field(F_VISVAL).active())
{
const TString16 valuta(clifo.get("CODVAL"));
if (valuta.not_empty() && valuta != m.get(F_VALUTA))
{
TTable val("%val");
val.put("CODTAB", valuta);
if (val.read() == NOERR)
{
m.set(F_VALUTA, valuta);
m.set(F_CAMBIO, val.get("R0"), TRUE);
}
}
}
}
return TRUE;
}
@ -1342,19 +1359,22 @@ bool TPrimanota_application::main_codiva_handler(TMask_field& f, KEY key)
if (key == K_TAB && f.get().not_empty())
{
const real imp(app().ivas().row(1).get(0)); // Se il totale non e' stato spezzato
if (imp == ZERO)
if (imp.is_zero())
{
TToken_string& row = app().ivas().row(0);
TMask& m = f.mask();
iva_notify(0, K_SPACE);
const TCodiceIVA iva(f.get());
const bool corr = app().causale().corrispettivi();
real tot = app().totale_documento();
real imposta;
if (!corr)
const bool acq3 = (app().iva() == iva_acquisti) && (row.get_int(2) == 3);
real tot = app().totale_documento(); // Calcola totale documento
real imposta; // Calcola imposta
if (!corr && !acq3)
imposta = app().scorpora(tot, iva.percentuale());
TToken_string& row = app().ivas().row(0);
row.add(tot.string(), 0); // imponibile
row.add(imposta.string(), 3); // imposta
@ -1440,22 +1460,29 @@ bool TPrimanota_application::ritsoc_handler(TMask_field& f, KEY key)
return TRUE;
}
bool TPrimanota_application::cambio_handler(TMask_field& f, KEY key)
{
if (key == K_TAB && f.focusdirty())
{
if (f.get().empty())
f.set(f.mask().exchange().string());
else
f.mask().field(F_VISVAL).on_hit();
}
return TRUE;
}
// Handler of F_VISVAL
// Certified 90%
// Certified 99%
bool TPrimanota_application::visval_handler(TMask_field& f, KEY key)
{
if (key == K_SPACE)
{
TMask& m = f.mask();
const real e(f.get() == "X" ? m.get(F_CAMBIO) : "1");
if (e > ZERO)
m.set_exchange(e);
else
{
error_box("Impostare un valore maggiore di zero per il cambio");
f.reset();
}
const bool on = f.get().not_empty();
const real e(f.mask().get(F_CAMBIO));
m.set_exchange(on, e);
}
return TRUE;
}

View File

@ -42,6 +42,7 @@ class TPrimanota_application : public TRelation_application
bool _ges_val, _ges_sal; // Gestione valuta e saldaconto
bool _rif_par; // Riferimento parita (NUM_DOC | PROTIVA)
bool _savenew; // Registra e nuovo
bool _iva_showed; // Lo sheet IVA e' gia' stato visualizzato una volta?
TSaldo_agg _saldi; // Saldi da aggiornare
@ -65,6 +66,7 @@ class TPrimanota_application : public TRelation_application
static bool ritfis_handler(TMask_field& f, KEY key);
static bool ritsoc_handler(TMask_field& f, KEY key);
static bool main_codiva_handler(TMask_field& f, KEY key);
static bool cambio_handler(TMask_field& f, KEY key);
static bool visval_handler(TMask_field& f, KEY key);
static bool occas_code_handler(TMask_field& f, KEY key);
static bool occas_handler(TMask_field& f, KEY key);