Corretto caricamento campi di default

Corretto calcolo tabella IVA (1a fase le stampa non vanno)


git-svn-id: svn://10.65.10.50/trunk@5091 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1997-08-21 16:47:14 +00:00
parent 0a3e2c483d
commit ccc3eeabd5
6 changed files with 336 additions and 247 deletions

View File

@ -410,13 +410,45 @@ public:
enum TTipo_importo { _lordo, _netto, _imposta }; enum TTipo_importo { _lordo, _netto, _imposta };
class TRiepilogo_iva : public TObject
{
TIVA _codiva;
real _imp;
real _imp_spese;
real _iva;
real _iva_spese;
byte _tipo;
protected:
virtual TObject* dup() const { return new TRiepilogo_iva(*this); }
virtual TRiepilogo_iva & copy(const TRiepilogo_iva & a);
public:
real imponibile(bool spese = TRUE) const { return _imp + (spese ? _imp_spese : ZERO);} // Imponibile
real imposta(bool spese = TRUE) const { return _iva + (spese ? _iva_spese : ZERO);} // Iva
real & imp() { return _imp;};
real & imp_spese() { return _imp_spese;};
real & iva() { return _iva;};
real & iva_spese() { return _iva_spese;};
const TIVA & cod_iva() const { return _codiva;}
byte tipo(){ return _tipo;}// Tipo (Vedi opzioni per la selzione di filtro nella validate())
TRiepilogo_iva& operator = (const TRiepilogo_iva & a) {return copy(a);}
TRiepilogo_iva(const TIVA & codiva);
TRiepilogo_iva(const TRiepilogo_iva & a) {copy(a);}
TRiepilogo_iva() : _tipo(0) {}
~TRiepilogo_iva() {};
};
class TDocumento : public TMultiple_rectype // velib03 class TDocumento : public TMultiple_rectype // velib03
{ {
TRecfield *_tipocf; TRecfield *_tipocf;
TRecfield *_codcf; TRecfield *_codcf;
TRecfield *_cod_occas; TRecfield *_cod_occas;
static TAssoc_array _tipi; static TAssoc_array _tipi;
static TAssoc_array _numerazioni; static TAssoc_array _numerazioni;
static long _firm;
static TString16 _codiva_spese;
static TString16 _codiva_bolli;
int _liv_len[4]; int _liv_len[4];
@ -429,6 +461,7 @@ class TDocumento : public TMultiple_rectype // velib03
TPagamento _pag; TPagamento _pag;
TRiga_documento * _sconto; // Riga per lo sconto di testata TRiga_documento * _sconto; // Riga per lo sconto di testata
TRiga_documento * _esenzione; // Riga per l' esenzione iva TRiga_documento * _esenzione; // Riga per l' esenzione iva
TAssoc_array _tabella_iva; // tabella di imponibili ed imposte
protected: protected:
virtual TRectype * new_body_record(int logicnum = 0) { return new TRiga_documento(this); } virtual TRectype * new_body_record(int logicnum = 0) { return new TRiga_documento(this); }
@ -444,12 +477,16 @@ protected:
int write_rewrite(TBaseisamfile & f, bool re) const; int write_rewrite(TBaseisamfile & f, bool re) const;
virtual TDocumento & copy(const TDocumento & d); virtual TDocumento & copy(const TDocumento & d);
TObject* dup() const { return new TDocumento(*this); } TObject* dup() const { return new TDocumento(*this); }
void update_tabella_iva();
void dirty_tabella_iva() { _tabella_iva.destroy();}
static void test_firm();
const TString16 & codiva_spese() const { ((TDocumento *)this)->test_firm(); return _codiva_spese;}
const TString16 & codiva_bolli() const { ((TDocumento *)this)->test_firm(); return _codiva_bolli;}
public: public:
void dirty_fields(); void dirty_fields();
// const TAuto_variable_rectype& head() const { return *this; } // Ritorna la testata del documento
// TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento
TAssoc_array & tabella_iva() { update_tabella_iva(); return _tabella_iva; }
TCond_vendita & condv() const {CHECK(_condv, "Condizioni di vendita nulle"); return *_condv;} TCond_vendita & condv() const {CHECK(_condv, "Condizioni di vendita nulle"); return *_condv;}
TCli_for & clifor() const; TCli_for & clifor() const;
TOccasionale & occas() const; TOccasionale & occas() const;
@ -952,31 +989,6 @@ struct dec_parm {
// classe TDocumentoEsteso: oggetto che ha come finalita' il calcolo dei riepiloghi IVA // classe TDocumentoEsteso: oggetto che ha come finalita' il calcolo dei riepiloghi IVA
////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////
class TRiepilogo_Iva : public TObject
{
real _imp;
real _iva;
real _ali;
byte _tipo;
TString16 _cod;
TString _des;
protected:
public:
real& imp() { return _imp;} // Imponibile
real& iva() { return _iva;} // Iva
real& ali() { return _ali;} // Aliquota
TString& cod() { return _cod;} // Descrizione
TString& des() { return _des;} // Descrizione
byte& tipo(){ return _tipo;}// Tipo (Vedi opzioni per la selzione di filtro nella validate())
void zero(){ _imp = 0.0; _iva = 0.0; _ali = 0.0; _tipo = 0; _cod = ""; _des = ""; }
virtual TObject* dup() const { return new TRiepilogo_Iva(*this); }
TRiepilogo_Iva& operator = (TRiepilogo_Iva& a);
TRiepilogo_Iva() {_imp = 0.0; _iva = 0.0; _ali = 0.0; _tipo = 0;}
~TRiepilogo_Iva() {};
};
class TDocumentoEsteso : public TDocumento class TDocumentoEsteso : public TDocumento
{ {
// Parametri del documento // Parametri del documento
@ -984,15 +996,15 @@ class TDocumentoEsteso : public TDocumento
TTable * _iva; // Tabella codici IVA TTable * _iva; // Tabella codici IVA
// Totali del documento ricalcolati non appena la tabellina di riepilogo IVA e' completa // Totali del documento ricalcolati non appena la tabellina di riepilogo IVA e' completa
real _importi_netti, _imposte; // real _importi_netti, _imposte;
// membri per il calcolo del riepilogo IVA // membri per il calcolo del riepilogo IVA
bool _sum_selected; // TRUE se ha selezionato una riga del riepilogo, funge da semaforo per leggere la prossima bool _sum_selected; // TRUE se ha selezionato una riga del riepilogo, funge da semaforo per leggere la prossima
int _sum_filter; // Filtro corrente della riga TRiepilogo_Iva in corso di stampa (-1 se non ha ancora calcolato la tabella) int _sum_filter; // Filtro corrente della riga TRiepilogo_iva in corso di stampa (-1 se non ha ancora calcolato la tabella)
TString_array _order_array; // Array di TToken_string contenenti i codici IVA soddisfacenti ad ogni tipo di filtro TString_array _order_array; // Array di TToken_string contenenti i codici IVA soddisfacenti ad ogni tipo di filtro
TAssoc_array _summary_table; // Array dove vengono memorizzate le imposte per aliquota TAssoc_array _summary_table; // Array associativo contenete imonibili ed imposte pronte per la stampa;
TArray _summary_array; // Array dove vengono memorizzate le imposte/imponibili per riga TArray _summary_array; // Array dove vengono memorizzate le imposte/imponibili per riga
TRiepilogo_Iva _sum_current; // Riga corrente del riepilogo TRiepilogo_iva _sum_current; // Riga corrente del riepilogo
// membri per il calcolo del riepilogo scadenze // membri per il calcolo del riepilogo scadenze
TString_array _scadenze_array;// Array che contiene le scadenze ("<data>|<importo>") TString_array _scadenze_array;// Array che contiene le scadenze ("<data>|<importo>")
@ -1007,9 +1019,9 @@ public:
void summary_filter(byte selector); // filtra la tabellina secondo il filtro corrente se non e' gia' stato fatto void summary_filter(byte selector); // filtra la tabellina secondo il filtro corrente se non e' gia' stato fatto
void summary_reset(bool force=FALSE); // riposiziona l'array dei codici IVA (_order_array). Se il parametro e' TRUE forza il ricalcolo della tabella void summary_reset(bool force=FALSE); // riposiziona l'array dei codici IVA (_order_array). Se il parametro e' TRUE forza il ricalcolo della tabella
void summary_set_next(); // seleziona il prossimo elemento del filtro void summary_set_next(); // seleziona il prossimo elemento del filtro
const TRiepilogo_Iva& sum_current() { return _sum_current; } // ritorna la riga corrente del filtro corrente const TRiepilogo_iva& sum_current() { return _sum_current; } // ritorna la riga corrente del filtro corrente
const char * summary_get(const TString& w); // ritorna l'informazione richiesta estratta dall'elemento corrente const char * summary_get(const TString& w); // ritorna l'informazione richiesta estratta dall'elemento corrente
int summary_items() { return _summary_table.items();} // ritorna il numero di righe in totale della tabellina int summary_items() { return tabella_iva().items();} // ritorna il numero di righe in totale della tabellina
const TAssoc_array& summary() { return _summary_table; } const TAssoc_array& summary() { return _summary_table; }
const TArray& summary_array() { return _summary_array;} const TArray& summary_array() { return _summary_array;}
@ -1023,10 +1035,10 @@ public:
TString_array& scadenze() { return _scadenze_array; } TString_array& scadenze() { return _scadenze_array; }
// Funzioni di totalizzazione // Funzioni di totalizzazione
real& tot_importi_netti(); // real& tot_importi_netti();
real& tot_imposte(); // real& tot_imposte();
real tot_spese(); // real tot_spese();
real tot_documento(); // real tot_documento();
// restituisce tot_imponibili, tot_esenti, tot_nonsoggetti a seconda del selettore: // restituisce tot_imponibili, tot_esenti, tot_nonsoggetti a seconda del selettore:
// 1 = regime normale // 1 = regime normale
// 2 = da ventilare (non usato) // 2 = da ventilare (non usato)
@ -1038,7 +1050,7 @@ public:
real tot_imponibili(byte selector); real tot_imponibili(byte selector);
// Reperisce l'informazione <what> dal campo G1 della testata // Reperisce l'informazione <what> dal campo G1 della testata
const char* get_head_info(const TString& what); /* const char* get_head_info(const TString& what); */
// Funzioni per settare i parametri // Funzioni per settare i parametri
void set_decimals(dec_parm & parm) { _parm = parm ; } void set_decimals(dec_parm & parm) { _parm = parm ; }

View File

@ -681,22 +681,25 @@ int TExpr_documento::parse_user_func(const char * name, int nparms) const
if (strcmp(name, "SCONTO") == 0) if (strcmp(name, "SCONTO") == 0)
return nparms < 2 ? _sconto : -1; return nparms < 2 ? _sconto : -1;
else else
if (strcmp(name, "IVA") == 0) if (strcmp(name, "IMPONIBILE") == 0)
return nparms < 2 ? _iva : -1; return nparms == 0 ? _imponibile : -1;
else else
if (strcmp(name, "PROVV") == 0) if (strcmp(name, "IVA") == 0)
return nparms < 2 ? _provv : -1; return nparms == 0 ? _iva : -1;
else else
if (strcmp(name, "TIPO") == 0) if (strcmp(name, "PROVV") == 0)
return nparms == 0 ? _tipo : -1; return nparms < 2 ? _provv : -1;
else else
if (strcmp(name, "IMPONIBILI") == 0) if (strcmp(name, "TIPO") == 0)
return nparms < 3 ? _imponibili : -1; return nparms == 0 ? _tipo : -1;
else else
if (strcmp(name, "IMPOSTE") == 0) if (strcmp(name, "IMPONIBILI") == 0)
return nparms < 3 ? _imposte : -1; return nparms < 3 ? _imponibili : -1;
else else
return -1; if (strcmp(name, "IMPOSTE") == 0)
return nparms < 3 ? _imposte : -1;
else
return -1;
} }
void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & stack, TTypeexp type) const void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & stack, TTypeexp type) const
@ -706,20 +709,22 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
case _somma: case _somma:
{ {
const TString cond(nparms == 2 ? stack.pop_string() : "STR(1)"); const TString cond(nparms == 2 ? stack.pop_string() : "STR(1)");
const TString & fieldname = stack.pop_string(); const TString & field = stack.pop_string();
real somma; real somma;
if (_doc != NULL) if (_doc != NULL)
{ {
TExpr_documento cond_expr(cond, _strexpr, _doc); TExpr_documento cond_expr(cond, _strexpr, _doc);
const int cond_nvars = cond_expr.numvar();
TExpr_documento expr(field, _numexpr, _doc);
const int nvars = expr.numvar();
const int nrows = _doc->rows(); const int nrows = _doc->rows();
const int nvars = cond_expr.numvar();
for (int i = nrows; i > 0 ; i--) for (int i = nrows; i > 0 ; i--)
{ {
TRiga_documento & riga = (TRiga_documento &) (*_doc)[i]; TRiga_documento & riga = (TRiga_documento &) (*_doc)[i];
for (int j = nvars - 1; j >= 0; j--) for (int j = cond_nvars - 1; j >= 0; j--)
{ {
const char* s = cond_expr.varname(j); const char* s = cond_expr.varname(j);
TFieldref f(s,0); TFieldref f(s,0);
@ -727,7 +732,16 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
} }
cond_expr.set_row(&riga); cond_expr.set_row(&riga);
if ((bool)cond_expr) if ((bool)cond_expr)
somma += riga.get_real(fieldname); {
for (j = nvars - 1; j >= 0; j--)
{
const char* s = expr.varname(j);
TFieldref f(s,0);
expr.setvar(j, f.read(riga));
}
expr.set_row(&riga);
somma += (real)expr;
}
} }
} }
stack.push(somma); stack.push(somma);
@ -836,6 +850,15 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
val = ZERO; val = ZERO;
} }
break; break;
case _imponibile:
{
real r;
if (_row)
r = _row->imponibile();
stack.push(r);
}
break;
case _sconto: case _sconto:
{ {
int ndec = _doc && _doc->in_valuta() ? 3 : 0; int ndec = _doc && _doc->in_valuta() ? 3 : 0;
@ -859,19 +882,11 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
break; break;
case _iva: case _iva:
{ {
int ndec = _doc && _doc->in_valuta() ? 3 : 0; real r;
if (nparms > 0)
ndec = (int) stack.peek_real().integer();
else
stack.push(ZERO);
real & val = stack.peek_real();
if (_row) if (_row)
val = _row->imposta(); r = _row->imposta();
else stack.push(r);
val = ZERO;
} }
break; break;
case _provv: case _provv:

View File

@ -71,16 +71,15 @@ void TTipo_riga_documento::read_formule()
_formule.add(profile.get("CALCOLI", "MAIN")); _formule.add(profile.get("CALCOLI", "MAIN"));
_imponibile = profile.get("IMPONIBILE", "MAIN"); _imponibile = profile.get("IMPONIBILE", "MAIN");
if (_imponibile.empty()) if (_imponibile.empty())
{
_imponibile = "IMPONIBILE"; _imponibile = "IMPONIBILE";
if (_formule.find(_imponibile) < 0) TFormula_documento * o = (TFormula_documento*)_formule_riga.objptr(_imponibile);
_formule.add("IMPONIBILE=IMPORTO(1)"); if (o == NULL)
}
if (_imponibile.not_empty() && _formule.find(_imponibile) < 0)
{ {
error_box("Campo imponibile (%s) sconosciuto nel tipo riga %s", (const char *) _imponibile, (const char *) codice()); o = new TFormula_documento(_riga, _imponibile, "IMPORTO(1)");
_imponibile.cut(0); _formule_riga.add(_imponibile, o);
} }
if (_formule.find(_imponibile) < 0)
_formule.add(_imponibile);
} }
TFormula_documento * TTipo_riga_documento::succ_formula(bool restart) TFormula_documento * TTipo_riga_documento::succ_formula(bool restart)

View File

@ -6,6 +6,10 @@
#include <applicat.h> #include <applicat.h>
#endif #endif
#ifndef __PREFIX_H
#include <prefix.h>
#endif
#ifndef __VEUML_H #ifndef __VEUML_H
#include "veuml.h" #include "veuml.h"
#endif #endif
@ -115,42 +119,41 @@ void TTipo_documento::read_formule()
_formule.add(profile.get("CALCOLI", "MAIN")); _formule.add(profile.get("CALCOLI", "MAIN"));
_totale = profile.get("TOTALE", "MAIN"); _totale = profile.get("TOTALE", "MAIN");
if (_totale.empty()) if (_totale.empty())
{
_totale = "TOTDOC"; _totale = "TOTDOC";
if (_formule.find(_totale) < 0) TFormula_documento * o = (TFormula_documento*)_formule_documento.objptr(_totale);
_formule.add("TOTDOC=IMPONIBILI()+IMPOSTE()"); if (o == NULL)
{
o = new TFormula_documento(_documento, _totale, "IMPONIBILI()+IMPOSTE()");
_formule_documento.add(_totale, o);
} }
if (_formule.find(_totale) < 0)
_formule.add(_totale);
_totale_netto = "_"; _totale_netto = "_";
_totale_netto << _totale; _totale_netto << _totale;
if (_totale.not_empty() && _formule.find(_totale) < 0)
{
error_box("Campo totale documento (%s) sconosciuto nel tipo documento %s", (const char *) _totale, (const char *) codice());
_totale.cut(0);
}
_basesconto = profile.get("BASESCONTO", "MAIN"); _basesconto = profile.get("BASESCONTO", "MAIN");
if (_basesconto.empty()) if (_basesconto.empty())
{
_basesconto = "BASESCONTO"; _basesconto = "BASESCONTO";
if (_formule.find(_basesconto) < 0) o = (TFormula_documento*)_formule_documento.objptr(_basesconto);
_formule.add("BASESCONTO=SOMMA(\"IMPONIBILE()\", \"(TIPO() != 'S') && (TIPO() != 'C')\")"); if (o == NULL)
}
if (_basesconto.not_empty() && _formule.find(_basesconto) < 0)
{ {
error_box("Campo sconto documento (%s) sconosciuto nel tipo documento %s", (const char *) _basesconto, (const char *) codice()); o = new TFormula_documento(_documento, _basesconto, "SOMMA(\"IMPONIBILE()\", \"(TIPO() != 'S') && (TIPO() != 'C')\")");
_basesconto.cut(0); _formule_documento.add(_basesconto, o);
} }
if (_formule.find(_basesconto) < 0)
_formule.add(_basesconto);
_spese = profile.get("SPESE", "MAIN"); _spese = profile.get("SPESE", "MAIN");
if (_spese.empty()) if (_spese.empty())
{
_spese = "SPESE"; _spese = "SPESE";
if (_formule.find(_spese) < 0) o = (TFormula_documento*)_formule_documento.objptr(_spese);
_formule.add("SPESE=SOMMA(\"IMPONIBILE()\", \"TIPO() != 'S'\")"); if (o == NULL)
}
if (_spese.not_empty() && _formule.find(_spese) < 0)
{ {
error_box("Campo spese (%s) sconosciuto nel tipo documento %s", (const char *) _spese, (const char *) codice()); o = new TFormula_documento(_documento, _spese, "SOMMA(\"IMPONIBILE()\", \"TIPO() != 'S'\")");
_spese.cut(0); _formule_documento.add(_spese, o);
} }
if (_formule.find(_spese) < 0)
_formule.add(_spese);
} }
bool TTipo_documento::stato_with_mov_mag(const char stato) const bool TTipo_documento::stato_with_mov_mag(const char stato) const
@ -190,12 +193,47 @@ TFormula_documento * TTipo_documento::succ_formula(bool restart)
return NULL; return NULL;
} }
/////////////////////////////////////////////////////////////
// TRiepilogo IVA
/////////////////////////////////////////////////////////////
TRiepilogo_iva& TRiepilogo_iva::copy(const TRiepilogo_iva& a)
{
_codiva = a._codiva;
_imp = a._imp;
_imp_spese = a._imp_spese;
_iva = a._iva;
_iva_spese = a._iva_spese;
_tipo = a._tipo;
return *this;
}
TRiepilogo_iva::TRiepilogo_iva(const TIVA & codiva) : _codiva(codiva)
{
const TString & t =_codiva.tipo();
if (t == "VE")
_tipo = 2;
else
if (t == "ES")
_tipo = 4;
else
if (t == "NI")
_tipo = 8;
else
if (t == "NS")
_tipo = 16;
else
_tipo = 1;
}
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// Documento per vendite // Documento per vendite
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
TAssoc_array TDocumento::_tipi; TAssoc_array TDocumento::_tipi;
TAssoc_array TDocumento::_numerazioni; TAssoc_array TDocumento::_numerazioni;
long TDocumento::_firm = -1;
TString16 TDocumento::_codiva_spese;
TString16 TDocumento::_codiva_bolli;
TDocumento::TDocumento() TDocumento::TDocumento()
: TMultiple_rectype(LF_DOC), _condv(NULL), : TMultiple_rectype(LF_DOC), _condv(NULL),
@ -263,6 +301,19 @@ TDocumento::~TDocumento()
if (_esenzione != NULL) delete _esenzione; if (_esenzione != NULL) delete _esenzione;
} }
void TDocumento::test_firm()
{
const long new_firm = prefix().get_codditta();
if (_firm != new_firm)
{
TConfig conf(CONFIG_DITTA);
_codiva_spese = conf.get("SPINCODIVA", "ve");
_codiva_bolli = conf.get("SPBOCODIVA", "ve");
_firm = new_firm;
}
}
real TDocumento::spese_incasso(real & imp, int ndec, TTipo_importo t) const real TDocumento::spese_incasso(real & imp, int ndec, TTipo_importo t) const
{ {
real imp_spese; real imp_spese;
@ -295,18 +346,8 @@ real TDocumento::spese_incasso(real & imp, int ndec, TTipo_importo t) const
if (cambio == ZERO) if (cambio == ZERO)
cambio = 1.0; cambio = 1.0;
static TString16 codiva;
static long firm = -1;
long new_firm = main_app().get_firm();
if (firm != new_firm) real iva_spese(iva(imp_spese, TRiga_documento::iva(codiva_spese()), ndec));
{
TConfig conf(CONFIG_DITTA);
codiva = conf.get("SPINCODIVA", "ve");
firm = new_firm;
}
real iva_spese(iva(imp_spese, TRiga_documento::iva(codiva), ndec));
if (t == _lordo) if (t == _lordo)
imp_spese += iva_spese; imp_spese += iva_spese;
else else
@ -422,18 +463,7 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const
break; break;
} }
} }
static TString16 codiva; iva_bolli = iva(tot_bolli, TRiga_documento::iva(codiva_bolli()), ndec);
static long firm = -1;
long new_firm = main_app().get_firm();
if (firm != new_firm)
{
TConfig conf(CONFIG_DITTA);
codiva = conf.get("SPBOCODIVA", "ve");
firm = new_firm;
}
iva_bolli = iva(tot_bolli, TRiga_documento::iva(codiva), ndec);
importo += (tot_bolli + iva_bolli - old_bolli); importo += (tot_bolli + iva_bolli - old_bolli);
} }
if (t == _lordo) if (t == _lordo)
@ -666,7 +696,8 @@ void TDocumento::dirty_fields()
{ {
for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field(); for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field();
f != NULL; f = (TDocumento_variable_field *) succ_variable_field()) f != NULL; f = (TDocumento_variable_field *) succ_variable_field())
f->set_dirty(); f->set_dirty();
dirty_tabella_iva();
for (int i = loaded_rows(); i > 0; i--) for (int i = loaded_rows(); i > 0; i--)
{ {
TRiga_documento & r = (TRiga_documento &) row(i); TRiga_documento & r = (TRiga_documento &) row(i);
@ -971,7 +1002,6 @@ const TCodice_numerazione& TDocumento::codice_numerazione() const
return *o; return *o;
} }
bool TDocumento::raggruppabile(const TDocumento& doc, TToken_string& campi) const bool TDocumento::raggruppabile(const TDocumento& doc, TToken_string& campi) const
{ {
bool ok = raggruppabile() && doc.raggruppabile(); bool ok = raggruppabile() && doc.raggruppabile();
@ -1055,44 +1085,111 @@ real TDocumento::imponibile(bool spese, int ndec) const
return val; return val;
} }
void TDocumento::update_tabella_iva()
{
const int items = rows();
TAssoc_array & table = _tabella_iva;
if (table.items() > 0 || items == 0)
{
if (items == 0)
table.destroy();
return;
}
real tot_doc;
real tot_sconti;
for (int i = items; i > 0; i--)
{
const TRiga_documento& r = row(i);
const real imponibile = r.imponibile();
tot_doc += imponibile;
if (r.is_sconto())
tot_sconti += imponibile;
else
if (!r.is_descrizione())
{
const real imposta = r.imposta(FALSE);
// Aggiorna o aggiunge l'elemento se non esiste
const TIVA & iva = r.iva();
const TString16 cod(iva.codice());
TRiepilogo_iva * aliquota = (TRiepilogo_iva *) table.objptr(cod);
if (aliquota == NULL)
{
aliquota = new TRiepilogo_iva(iva);
table.add(cod, aliquota);
}
aliquota->imp() += imponibile;
aliquota->iva() += imposta;
tot_doc += imposta;
}
}
if (tot_sconti != ZERO)
{
TGeneric_distrib d(tot_sconti);
table.restart();
for (TRiepilogo_iva * ri = (TRiepilogo_iva *) table.get(); ri != NULL;
ri = (TRiepilogo_iva *) table.get())
d.add(ri->imp());
table.restart();
for (ri = (TRiepilogo_iva *) table.get(); ri != NULL;
ri = (TRiepilogo_iva *) table.get())
{
const char * codiva = ri->cod_iva().codice();
const real i(d.get());
real & iva = ri->iva();
const real imposta(::iva(i, TIVA(codiva), ALL_DECIMALS));
iva += imposta;
tot_doc += imposta;
}
}
TRiepilogo_iva * ri = (TRiepilogo_iva *) table.objptr(codiva_spese());
if (ri == NULL)
ri = new TRiepilogo_iva(TIVA(codiva_spese()));
real val = spese_incasso(tot_doc, ALL_DECIMALS, _netto);
ri->imp_spese() += val;
tot_doc += val;
val = spese_incasso(tot_doc, ALL_DECIMALS, _imposta);
ri->iva_spese() += val;
tot_doc += val;
ri = (TRiepilogo_iva *) table.objptr(codiva_bolli());
if (ri == NULL)
ri = new TRiepilogo_iva(TIVA(codiva_bolli()));
val = bolli(tot_doc, ALL_DECIMALS, _netto);
ri->imp_spese() += val;
tot_doc += val;
val = bolli(tot_doc, ALL_DECIMALS, _imposta);
ri->iva_spese() += val;
tot_doc += val;
}
real TDocumento::imposta(bool spese, int ndec) const real TDocumento::imposta(bool spese, int ndec) const
{ {
TAssoc_array ive; TAssoc_array table = ((TDocumento *)this)->tabella_iva();
real val;
if (ndec == AUTO_DECIMALS) if (ndec == AUTO_DECIMALS)
ndec = in_valuta() ? 3 : 0; ndec = in_valuta() ? 3 : 0;
for (int i = rows(); i > 0; i--) for (TRiepilogo_iva * ri = (TRiepilogo_iva *) table.get(); ri != NULL;
{ ri = (TRiepilogo_iva *) table.get())
TRiga_documento & r = ((TRiga_documento &) ((TDocumento *)this)->row(i)); {
real iva(r.imposta(FALSE)); real iva = ri->imposta(spese);
const TString & cod_iva = r.get("CODIVA"); if (iva < ZERO)
iva.floor(ndec);
real * tot = (real *) ive.objptr(cod_iva);
if (tot == NULL)
ive.add(cod_iva, iva);
else
*tot += iva;
}
real val;
ive.restart();
for (real * iva = (real *) ive.get(); iva != NULL; iva = (real *) ive.get())
{
if (*iva < ZERO)
iva->floor(ndec);
else else
iva->ceil(ndec); iva.ceil(ndec);
val += *iva; val += iva;
} }
if (spese)
{
real tot_doc = val + imponibile(FALSE, ndec);
val += spese_incasso(tot_doc, ndec, _imposta);
tot_doc += spese_incasso(tot_doc, ndec);
val += bolli(tot_doc, ndec, _imposta);
}
val.round(ndec);
return val; return val;
} }

View File

@ -42,84 +42,35 @@ int TCodice_numerazione::read(const char* codnum)
return err; return err;
} }
/////////////////////////////////////////////////////////////
// TRiepilogo IVA
/////////////////////////////////////////////////////////////
TRiepilogo_Iva& TRiepilogo_Iva::operator=(TRiepilogo_Iva& a)
{
_imp = a.imp(); _iva = a.iva(); _ali = a.ali();
_cod = a.cod(); _tipo = a.tipo(); _des = a.des();
return *this;
}
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
//TDocumentoEsteso //TDocumentoEsteso
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
void TDocumentoEsteso::compile_summary() void TDocumentoEsteso::compile_summary()
{ {
_sum_filter = 0; _sum_filter = 0;
const int items = rows();
_summary_table.destroy();
_summary_array.destroy(); _summary_array.destroy();
_imposte = 0.0; // _imposte = ZERO;
_importi_netti = 0.0; // _importi_netti = ZERO;
const bool val = in_valuta(); const int ndec = in_valuta() ? 3 : 0;
// Scorre tutte le righe e compila la tabellina _summary_table, per codice iva, update_tabella_iva();
// nonche' il galactic_array _summary_array dove le informazioni sono registrate per singola riga _summary_table = tabella_iva();
// cio' ad usi generici: porco diavolo! for (TRiepilogo_iva * ri = (TRiepilogo_iva *) _summary_table.get(); ri != NULL;
for (int i = 1; i <= items; i++) ri = (TRiepilogo_iva *) _summary_table.get());
{ {
TRiga_documento& r = row(i); real imponibile(ri->imponibile());
int nriga = r.get_int("NRIGA"); real imposta(ri->imposta());
real price = r.get_real("PREZZO"); imponibile.round(ndec);
real qta = r.get_real("QTA"); if (imposta < ZERO)
real aliquota, sc, imponibile, iva; imposta.floor(ndec);
TString sconto(r.get("SCONTO")); else
TString codiva(r.get("CODIVA")); imposta.ceil(ndec);
_iva->put("CODTAB", codiva); ri->imp() = imponibile;
if (_iva->read() != NOERR) continue; // Se non trova il codice salta questa riga ri->imp_spese() = ZERO;
ri->iva() = imposta;
aliquota = _iva->get_real("R0"); ri->iva_spese() = ZERO;
price = prezzo_scontato(price, sconto);
price.round(val ? _parm.pri_val : _parm.pri_lit); // prezzo scontato
qta.round(val ? _parm.qta_val : _parm.qta_lit);
imponibile = price * qta;
imponibile.round (val? _parm.imp_val : _parm.imp_lit); // imponibile di riga
iva = r.iva(val ? _parm.imp_val : _parm.imp_lit);
//iva = (imponibile * aliquota) / 100.0;
//iva.ceil(val ? _parm.imp_val : _parm.imp_lit); // imposta calcolata
// Aggiorna o aggiunge l'elemento se non esiste
TRiepilogo_Iva riepilogo_tmp,row_riep;
const bool exists = _summary_table.is_key(codiva);
TRiepilogo_Iva& riepilogo = (exists ? (TRiepilogo_Iva&)_summary_table[codiva] : riepilogo_tmp);
// Aggiorna anche il totale importi netti ed il totale imposte
_importi_netti += imponibile;
_imposte += iva;
riepilogo.imp() += imponibile; riepilogo.iva() += iva;
row_riep.imp() = imponibile; row_riep.iva() = iva;
riepilogo.ali() = aliquota; riepilogo.cod() = codiva;
row_riep.ali() = aliquota; row_riep.cod() = codiva;
TString16 tipo(_iva->get("S1"));
int tipo_i = 1;// Regime IVA normale
if (tipo == "VE") tipo = 2;
else if (tipo == "ES") tipo = 4;
else if (tipo == "NI") tipo = 8;
else if (tipo == "NS") tipo= 16;
riepilogo.tipo() = tipo_i;
row_riep.tipo() = tipo_i;
if (riepilogo.tipo() != 1) // Se non e' regime normale salva anche la descrizione
{
TString s(_iva->get("S0"));
riepilogo.des() = s;
row_riep.des() = s;
}
_summary_table.add(codiva,riepilogo,exists);
_summary_array.add(row_riep,nriga);
} }
// Inizializza l'array di ordine // Inizializza l'array di ordine
for (i = 0; i<32;i++) for (int i = 0; i<32;i++) // ??
{ {
TToken_string s; TToken_string s;
_order_array.add(s); _order_array.add(s);
@ -136,7 +87,7 @@ void TDocumentoEsteso::summary_filter(byte selector)
// Procedimento: // Procedimento:
// Memorizza in un TString_array tante TToken_string quanti sono i filtri possibili // Memorizza in un TString_array tante TToken_string quanti sono i filtri possibili
// (al massimo 31 [1+2+4+8+16]). Ogni TToken_string contiene i codici IVA // (al massimo 31 [1+2+4+8+16]). Ogni TToken_string contiene i codici IVA
// delle righe di TRiepilogo_Iva che soddisfano la condizione di filtro // delle righe di TRiepilogo_iva che soddisfano la condizione di filtro
_sum_selected = TRUE; _sum_selected = TRUE;
_sum_filter = selector; _sum_filter = selector;
TToken_string& codici = _order_array.row(_sum_filter-1); TToken_string& codici = _order_array.row(_sum_filter-1);
@ -145,13 +96,13 @@ void TDocumentoEsteso::summary_filter(byte selector)
// sara' poi la summary_set_next() a selezionare sequenzialmente il giusto codice a seconda del filtro corrente // sara' poi la summary_set_next() a selezionare sequenzialmente il giusto codice a seconda del filtro corrente
// Scorre sequenzialmente la tabella _summary_table e compone la TToken_string con i codici IVA // Scorre sequenzialmente la tabella _summary_table e compone la TToken_string con i codici IVA
const int items = _summary_table.items(); const int items = summary_items();
TRiepilogo_Iva* curr = (TRiepilogo_Iva *) _summary_table.first_item(); TRiepilogo_iva* curr = (TRiepilogo_iva *) _summary_table.first_item();
for (int i = 0; i < items && curr != NULL; i++) for (int i = 0; i < items && curr != NULL; i++)
{ {
if (curr->tipo() & _sum_filter) // se fa parte del filtro selezionato schiaffa il codice nella TToken_string if (curr->tipo() & _sum_filter) // se fa parte del filtro selezionato schiaffa il codice nella TToken_string
codici.add(curr->cod()); codici.add(curr->cod_iva().codice());
curr = (TRiepilogo_Iva*) _summary_table.succ_item(); curr = (TRiepilogo_iva*) _summary_table.succ_item();
} }
codici.restart(); codici.restart();
summary_set_next(); // setta l'elemento corrente summary_set_next(); // setta l'elemento corrente
@ -178,22 +129,33 @@ void TDocumentoEsteso::summary_set_next()
if (codiva.not_empty() && _summary_table.is_key(codiva)) if (codiva.not_empty() && _summary_table.is_key(codiva))
{ {
// Estrae da _summary_table i dati relativio al codice corrispondente. // Estrae da _summary_table i dati relativio al codice corrispondente.
TRiepilogo_Iva& riep= (TRiepilogo_Iva&) _summary_table[codiva]; TRiepilogo_iva& riep= (TRiepilogo_iva&) _summary_table[codiva];
_sum_current = riep; _sum_current = riep;
} }
else else
_sum_current.zero(); // se non esiste il codice azzera l'elemento corrente (non stampera' nulla) {
TRiepilogo_iva i;
_sum_current = i; // se non esiste il codice azzera l'elemento corrente (non stampera' nulla)
}
} }
const char * TDocumentoEsteso::summary_get(const TString& w) const char * TDocumentoEsteso::summary_get(const TString& w)
{ {
TString ret; if (w == "COD")
if (w == "COD") ret = _sum_current.cod(); // Ritorna il codice IVA return _sum_current.cod_iva().codice(); // Ritorna il codice IVA
if (w == "IMP" && _sum_current.imp() != 0.0) ret = _sum_current.imp().string(); // Ritorna l'imponibile else
if (w == "IVA" && _sum_current.iva() != 0.0) ret = _sum_current.iva().string(); // Ritorna l'imposta if (w == "IMP")
if (w == "ALI" && _sum_current.ali() != 0.0) ret = _sum_current.ali().string(); // Ritorna l'aliquota % return _sum_current.imp().string(); // Ritorna l'imponibile
if (w == "DES") ret = _sum_current.des(); // Ritorna la descrizione ( se il codice e' regime normale la descr. e' vuota) else
return (const char *)ret; if (w == "IVA")
return _sum_current.iva().string(); // Ritorna l'imposta
else
if (w == "ALI")
return _sum_current.cod_iva().aliquota().string(); // Ritorna l'aliquota %
else
if (w == "DES")
return _sum_current.cod_iva().descrizione(); // Ritorna la descrizione ( se il codice e' regime normale la descr. e' vuota)
return "";
} }
void TDocumentoEsteso::scadenze_recalc() void TDocumentoEsteso::scadenze_recalc()
@ -256,7 +218,8 @@ void TDocumentoEsteso::scadenze_reset()
if (_scadenze_current > 0) if (_scadenze_current > 0)
_scadenze_current = 0; _scadenze_current = 0;
} }
/*
real& TDocumentoEsteso::tot_importi_netti() real& TDocumentoEsteso::tot_importi_netti()
{ {
if (!summary_compiled()) compile_summary(); if (!summary_compiled()) compile_summary();
@ -271,10 +234,11 @@ real& TDocumentoEsteso::tot_imposte()
real TDocumentoEsteso::tot_spese() real TDocumentoEsteso::tot_spese()
{ {
TString16 t("TOTSP"); // TString16 t("TOTSP");
real number(get_head_info(t)); // real number(get_head_info(t));
return number; // return number;
} return spese();
}
real TDocumentoEsteso::tot_documento() real TDocumentoEsteso::tot_documento()
{ {
@ -282,24 +246,26 @@ real TDocumentoEsteso::tot_documento()
real number = _imposte + _importi_netti; real number = _imposte + _importi_netti;
return number; return number;
} }
*/
real TDocumentoEsteso::tot_imponibili(byte selector) real TDocumentoEsteso::tot_imponibili(byte selector)
{ {
if (!summary_compiled()) compile_summary(); if (!summary_compiled()) compile_summary();
real number = 0.0; real number = 0.0;
const int items = _summary_table.items(); const int items = summary_items();
TRiepilogo_Iva* curr = (TRiepilogo_Iva *) _summary_table.first_item(); TRiepilogo_iva* curr = (TRiepilogo_iva *) _summary_table.first_item();
for (int i = 0; i < items && curr != NULL; i++) for (int i = 0; i < items && curr != NULL; i++)
{ {
if (curr->tipo() & selector) // se fa parte del filtro selezionato schiaffa il codice nella TToken_string if (curr->tipo() & selector) // se fa parte del filtro selezionato schiaffa il codice nella TToken_string
number += curr->imp(); number += curr->imp();
curr = (TRiepilogo_Iva*) _summary_table.succ_item(); curr = (TRiepilogo_iva *) _summary_table.succ_item();
} }
return number; return number;
} }
/*
const char* TDocumentoEsteso::get_head_info(const TString & what) const char* TDocumentoEsteso::get_head_info(const TString & what)
{ {
TToken_string memo(head().get("G1"),'\n'); // prende il campo memo con i totalizzatori. Un totalizzatore per riga nella forma <MACRO>=<VALORE> TToken_string memo(head().get("G1"),'\n'); // prende il campo memo con i totalizzatori. Un totalizzatore per riga nella forma <MACRO>=<VALORE>
@ -315,7 +281,7 @@ const char* TDocumentoEsteso::get_head_info(const TString & what)
} }
} }
return (const char*) rt; return (const char*) rt;
} } */
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, TCond_vendita * condv) TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, TCond_vendita * condv)
: TDocumento(rec, condv), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1) : TDocumento(rec, condv), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1)

View File

@ -1,5 +1,5 @@
enum _formule {_somma, _bolli, _bolli_int, _spinc, _prezzo, _importo, _sconto, _iva, _provv, _tipo, _imponibili, _imposte}; enum _formule {_somma, _bolli, _bolli_int, _spinc, _prezzo, _importo, _imponibile, _sconto, _iva, _provv, _tipo, _imponibili, _imposte};
enum TTipo_calcolo { _nessun_calcolo, _qtaprezzo, _valore, _percentuale, _scontoimp, _scontoperc}; enum TTipo_calcolo { _nessun_calcolo, _qtaprezzo, _valore, _percentuale, _scontoimp, _scontoperc};
void row_set_handler( TMask& m, const int field, const int index ); void row_set_handler( TMask& m, const int field, const int index );