Patch level : 12.0 1230

Files correlati     : ve0.exe ve1.exe ve5.exe ve6.exe lv2.exe lv3.exe

Commento :
Nuova gestione dei bolli esenti
This commit is contained in:
Alessandro Bonazzi 2023-01-01 12:24:31 +01:00
parent a4d69d7754
commit b6a2fa1021
7 changed files with 227 additions and 32 deletions

View File

@ -70,14 +70,14 @@ END
CURRENCY F_SPADD 11 CURRENCY F_SPADD 11
BEGIN BEGIN
PROMPT 2 12 "Spese forfettarie da addebitare " PROMPT 2 12 "Spese forfettarie da addebitare "
FIELD SPADD FIELD SPADD
PICTURE "." PICTURE "."
END END
CURRENCY F_MAXADD 15 CURRENCY F_MAXADD 15
BEGIN BEGIN
PROMPT 2 14 "Importo massimo per addebito " PROMPT 2 14 "Importo massimo per addebito "
FIELD MAXADD FIELD MAXADD
PICTURE "." PICTURE "."
END END
@ -199,6 +199,13 @@ FIELD IMPMINBOLLI
PICTURE "." PICTURE "."
END END
DATE F_DATANEWBOLLI
BEGIN
PROMPT 2 14 "Data inizio nuovi bolli esenti "
FIELD DATANEWBOLLI
PICTURE "."
END
ENDPAGE ENDPAGE
PAGE "Automatismi" 1 1 60 14 PAGE "Automatismi" 1 1 60 14

View File

@ -172,6 +172,7 @@
#define F_MAXADD 145 #define F_MAXADD 145
#define F_IMPMINEFF 146 #define F_IMPMINEFF 146
#define F_SEPARA_ESENZ 147 #define F_SEPARA_ESENZ 147
#define F_DATANEWBOLLI 148
// Campi per ve0200g.uml // Campi per ve0200g.uml
#define F_EXPLODEDB 101 #define F_EXPLODEDB 101

View File

@ -874,7 +874,7 @@ public:
long renum_ndoc(long numdoc = 0); long renum_ndoc(long numdoc = 0);
virtual bool renum() { return renum_ndoc() > 0;} virtual bool renum() { return renum_ndoc() > 0;}
const TString& codiva_spese() const ; const TString& codiva_spese() const ;
const TString& codiva_bolli() const ; const TString& codiva_bolli();
TCodgiac_livelli& livelli() const ; TCodgiac_livelli& livelli() const ;
void dirty_fields(); void dirty_fields();
@ -982,8 +982,12 @@ public:
real spese_incasso(real &imp, int ndec, TTipo_importo netto = _lordo) const ; real spese_incasso(real &imp, int ndec, TTipo_importo netto = _lordo) const ;
real imponibile_bolli_esenti() const; real imponibile_bolli_esenti() const;
bool bolli_esenti_dovuti() const; bool bolli_esenti_dovuti() const;
real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ; const TDate data_nuovo_calcolo_esenti() const;
bool nuovo_calcolo_esenti() const;
const char * codiva_bolli_esenti();
real bolli_esenti(int ndec, TTipo_importo netto = _lordo);
real bolli_incasso(real & imp, int ndec, TTipo_importo netto = _lordo);
real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) { return bolli_esenti(ndec, netto) + bolli_incasso(imp, ndec, netto); }
real imponibile(bool spese = false, int ndec = AUTO_DECIMALS) const; real imponibile(bool spese = false, int ndec = AUTO_DECIMALS) const;
real imposta(bool spese = false, int ndec = AUTO_DECIMALS) const; real imposta(bool spese = false, int ndec = AUTO_DECIMALS) const;
real totale_doc() const; real totale_doc() const;

View File

@ -234,6 +234,7 @@ TString4 TDocumento::_codiva_spese;
TString4 TDocumento::_codiva_bolli; TString4 TDocumento::_codiva_bolli;
short TDocumento::_has_mag = 3; short TDocumento::_has_mag = 3;
short TDocumento::_has_provv = 3; short TDocumento::_has_provv = 3;
#ifdef LIVE_STATISTICS #ifdef LIVE_STATISTICS
short TDocumento::_has_stat_ven = 3; short TDocumento::_has_stat_ven = 3;
#endif #endif
@ -316,8 +317,11 @@ TDocumento::~TDocumento()
const TString& TDocumento::codiva_spese() const const TString& TDocumento::codiva_spese() const
{ ((TDocumento *)this)->test_firm(); return _codiva_spese;} { ((TDocumento *)this)->test_firm(); return _codiva_spese;}
const TString& TDocumento::codiva_bolli() const const TString& TDocumento::codiva_bolli()
{ ((TDocumento *)this)->test_firm(); return _codiva_bolli;} {
test_firm();
return _codiva_bolli;
}
void TDocumento::check_modules() void TDocumento::check_modules()
{ {
@ -484,13 +488,78 @@ bool TDocumento::bolli_esenti_dovuti() const
return imponibile_esente > ZERO && impmin_bolli > ZERO && imponibile_esente >= impmin_bolli; return imponibile_esente > ZERO && impmin_bolli > ZERO && imponibile_esente >= impmin_bolli;
} }
real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const const TDate TDocumento::data_nuovo_calcolo_esenti() const
{
TDate d = ini_get_date(CONFIG_STUDIO, "ve", "DATANEWBOLLI");
if (!d.ok())
d = eotime;
return d;
}
bool TDocumento::nuovo_calcolo_esenti() const
{
const TDate data_nuovo_calcolo = data_nuovo_calcolo_esenti();
return data_nuovo_calcolo && data_nuovo_calcolo <= get_date(DOC_DATADOC);
}
const char * TDocumento::codiva_bolli_esenti()
{
TString & cod = get_tmp_string();
if (nuovo_calcolo_esenti())
{
TAssoc_array& table = ((TDocumento*)this)->tabella_iva();
real imponibile_max = ZERO;
table.restart();
for (TRiepilogo_iva* riga = (TRiepilogo_iva*)table.get(); riga != NULL; riga = (TRiepilogo_iva*)table.get())
{
const TCodiceIVA & codiva = riga->cod_iva();
if (codiva.tipo().not_empty() && codiva.tipo() != REVERSE_CHARGE && !codiva.escluso_esenti())
{
if (riga->imponibile() > imponibile_max)
{
cod = codiva.codice();
imponibile_max = riga->imponibile();
}
}
}
}
else
cod = ini_get_string(CONFIG_DITTA, "ve", "SPBOCODIVA");
return cod;
}
real TDocumento::bolli_esenti(int ndec, TTipo_importo t)
{
real tot_bolli;
if (get_bool(DOC_ADDBOLLI) && bolli_esenti_dovuti())
{
const real bolli_es = ini_get_real(CONFIG_STUDIO, "ve", "BOLLIES");
tot_bolli = bolli_es;
real iva_bolli = TRiga_documento::iva(codiva_bolli_esenti()).imposta(tot_bolli, ndec);
if (t == _lordo)
tot_bolli += iva_bolli;
else
if (t == _imposta)
tot_bolli = iva_bolli;
}
return tot_bolli;
}
real TDocumento::bolli_incasso(real & imp, int ndec, TTipo_importo t)
{ {
real tot_bolli; real tot_bolli;
if (get_bool(DOC_ADDBOLLI)) if (get_bool(DOC_ADDBOLLI))
{ {
const real bolli_es = ini_get_real(CONFIG_STUDIO, "ve", "BOLLIES");
TArray sca_bolli; TArray sca_bolli;
TArray imp_bolli; TArray imp_bolli;
int nscagl; int nscagl;
@ -528,15 +597,12 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const
for (int j = 0; j < 5 && tot_bolli+iva_bolli != old_bolli; j++) for (int j = 0; j < 5 && tot_bolli+iva_bolli != old_bolli; j++)
{ {
old_bolli = tot_bolli + iva_bolli; old_bolli = tot_bolli + iva_bolli;
const real imposte = imp_orig + iva_bolli; const real imposte = imp_orig + iva_bolli;
const real imp_spese = sp_orig + tot_bolli - iva_bolli; const real imp_spese = sp_orig + tot_bolli - iva_bolli;
const real imponibile = importo - imposte - imp_spese; const real imponibile = importo - imposte - imp_spese;
if (bolli_esenti_dovuti())
tot_bolli = bolli_es;
else
tot_bolli = ZERO;
pag.set_total(imponibile, imposte, imp_spese); pag.set_total(imponibile, imposte, imp_spese);
pag.set_rate_auto(); pag.set_rate_auto();
@ -596,7 +662,7 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const
break; break;
} }
} }
iva_bolli = TRiga_documento::iva(codiva_bolli()).imposta(tot_bolli, ndec); iva_bolli = TRiga_documento::iva(codiva_bolli()).imposta(tot_bolli, ndec);
importo += (tot_bolli + iva_bolli - old_bolli); importo += (tot_bolli + iva_bolli - old_bolli);
} }
if (t == _lordo) if (t == _lordo)
@ -2500,13 +2566,15 @@ void TDocumento::update_tabella_iva(bool solo_imponibili)
} }
} }
val = bolli(real(tot_doc - rit), ALL_DECIMALS, doc_al_lordo ? _lordo : _netto); val = bolli_incasso(real(tot_doc - rit), ALL_DECIMALS, doc_al_lordo ? _lordo : _netto);
if (val != ZERO) if (val != ZERO)
{ {
const TString& codiva = codiva_bolli(); const TString& codiva = codiva_bolli();
if (codiva.full()) if (codiva.full())
{ {
TRiepilogo_iva* ri = (TRiepilogo_iva*)table.objptr(codiva); TRiepilogo_iva* ri = (TRiepilogo_iva*)table.objptr(codiva);
if (ri == NULL) if (ri == NULL)
{ {
ri = new TRiepilogo_iva(TCodiceIVA(codiva)); ri = new TRiepilogo_iva(TCodiceIVA(codiva));
@ -2514,14 +2582,37 @@ void TDocumento::update_tabella_iva(bool solo_imponibili)
} }
if (!doc_al_lordo) if (!doc_al_lordo)
{ {
real valiva = bolli(real(tot_doc - rit), ALL_DECIMALS, _imposta); real valiva = bolli_incasso(real(tot_doc - rit), ALL_DECIMALS, _imposta);
ri->iva_spese() += valiva; ri->iva_spese() += valiva;
tot_doc += valiva; tot_doc += valiva;
} }
ri->imp_spese() += val; ri->imp_spese() += val;
} }
tot_doc += val;
val = bolli_esenti(ALL_DECIMALS, doc_al_lordo ? _lordo : _netto);
if (val != ZERO)
{
const TString& codiva = codiva_bolli_esenti();
tot_doc += val; if (codiva.full())
{
TRiepilogo_iva* ri = (TRiepilogo_iva*)table.objptr(codiva);
if (ri == NULL)
{
ri = new TRiepilogo_iva(TCodiceIVA(codiva));
table.add(codiva, ri);
}
if (!doc_al_lordo)
{
real valiva = bolli_esenti(ALL_DECIMALS, _imposta);
ri->iva_spese() += valiva;
tot_doc += valiva;
}
ri->imp_spese() += val;
}
}
tot_doc += val;
} }
// SCORPORO // SCORPORO
@ -2586,7 +2677,7 @@ real TDocumento::totale_doc() const
if (!lordo) if (!lordo)
r += imposta(); r += imposta();
r += spese_incasso(real(r - ritenute()), ndec); r += spese_incasso(real(r - ritenute()), ndec);
r += bolli(real(r - ritenute()), ndec); r += ((TDocumento *) this)->bolli(real(r - ritenute()), ndec);
} }
else else
r = get_real(field); r = get_real(field);

View File

@ -704,7 +704,7 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
if (_doc) if (_doc)
{ {
r += _doc->spese_incasso(real(r - _doc->ritenute()), ndec); r += _doc->spese_incasso(real(r - _doc->ritenute()), ndec);
r = _doc->bolli(real(r - _doc->ritenute()), ndec, netto ? _netto : _lordo); r = ((TDocumento *)_doc)->bolli(real(r - _doc->ritenute()), ndec, netto ? _netto : _lordo);
} }
else else
r = ZERO; r = ZERO;
@ -723,7 +723,7 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
{ {
real r1 = _doc->spese_incasso(real(r - _doc->ritenute()), ndec); real r1 = _doc->spese_incasso(real(r - _doc->ritenute()), ndec);
r += r1; r += r1;
r1 += _doc->bolli(real(r - _doc->ritenute()), ndec); r1 += ((TDocumento *)_doc)->bolli(real(r - _doc->ritenute()), ndec);
r = r1; r = r1;
} }
else else

View File

@ -455,12 +455,16 @@ protected:
void split_sp_amount(const real & amount, int decimals) const; void split_sp_amount(const real & amount, int decimals) const;
// Funzione per ricercare il conto di costo/ricavo // Funzione per ricercare il conto di costo/ricavo
error_type search_costo_ricavo(TBill& conto, const TRiga_documento& r, real & amount_to_split, const real & valore); error_type search_costo_ricavo(TBill& conto, const TRiga_documento& r, real & amount_to_split, const real & valore);
// Funzione per ricercare il conto dei bolli_esenti
void conto_bolli_esenti(TBill & bill, TDocumento& d);
// Funzione per ricercare il conto di costo/ricavo materiali // Funzione per ricercare il conto di costo/ricavo materiali
error_type search_costo_ricavo_mat(TBill&, const TRiga_documento&); error_type search_costo_ricavo_mat(TBill&, const TRiga_documento&);
// Funzione per aggiungere la riga iva al TAssoc_array _righe_iva // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva
// error_type add_iva_row(const TBill&, const TRiga_documento&, const int ndec, const real p = 1.0); // error_type add_iva_row(const TBill&, const TRiga_documento&, const int ndec, const real p = 1.0);
// Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva // Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva
void calculate_spese(const real&, real&, int, bool, const TString &, const TDocumento & ); void calculate_spese(const real& spese, real& sp_iva, int ndec, bool is_incasso, const TString& codiva_es, const TDocumento & doc);
// Funzione atomica per aggiungere le righe di bolli esenti al TAssoc_array _righe_iva
void calculate_spese_esenti(const real& spese, real& sp_iva, int ndec, const TDocumento & doc);
// Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese()) // Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese())
error_type add_spese_inbo(TDocumento&, const int); error_type add_spese_inbo(TDocumento&, const int);
// Aggiorna le righe di sconto importo o percentuale // Aggiorna le righe di sconto importo o percentuale

View File

@ -1920,6 +1920,58 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc
return _error; return _error;
} }
void TContabilizzazione::conto_bolli_esenti(TBill & bill, TDocumento& d)
{
int gr;
int co;
long so;
int nrow = 0;
bill.set();
if (d.nuovo_calcolo_esenti())
{
const TString & cod = d.codiva_bolli_esenti();
real imponibile_max = ZERO;
FOR_EACH_RDOC(d, i, pr)
{
TRiga_documento & r = *pr;
if (cod == r.iva().codice())
{
if (r.imponibile() >= imponibile_max)
{
imponibile_max = r.imponibile();
nrow = i;
}
}
}
if (nrow > 0)
{
TRiga_documento & r = d[nrow];
real dummy, dummy1;
search_costo_ricavo(bill, r, dummy, dummy1);
}
}
if (!bill.ok())
{
if (_caus->reg().tipo_registro() == acquisto)
{
gr = ini_get_int(CONFIG_DITTA, "ve", "SPBOCODCONA", 0, 1);
co = ini_get_int(CONFIG_DITTA, "ve", "SPBOCODCONA", 0, 2);
so = ini_get_long(CONFIG_DITTA, "ve", "SPBOCODCONA", 0L, 3);
}
else
{
gr = ini_get_int(CONFIG_DITTA, "ve", "SPBOCODCONV", 0, 1);
co = ini_get_int(CONFIG_DITTA, "ve", "SPBOCODCONV", 0, 2);
so = ini_get_long(CONFIG_DITTA, "ve", "SPBOCODCONV", 0L, 3);
}
bill.set(gr, co, so);
}
}
error_type TContabilizzazione::search_costo_ricavo_mat(TBill& conto, const TRiga_documento& r) error_type TContabilizzazione::search_costo_ricavo_mat(TBill& conto, const TRiga_documento& r)
{ {
const char t = r.tipo().tipo(); const char t = r.tipo().tipo();
@ -1957,13 +2009,45 @@ error_type TContabilizzazione::search_costo_ricavo_mat(TBill& conto, const TRiga
} }
void TContabilizzazione::calculate_spese(const real& spese, real& sp_iva, int ndec, bool is_incasso, const TString& codiva_es, const TDocumento & doc) void TContabilizzazione::calculate_spese(const real& spese, real& sp_iva, int ndec, bool is_incasso, const TString& codiva_es, const TDocumento & doc)
{
const bool is_cli = doc.get_char(DOC_TIPOCF) != 'F';
const TBill& zio = is_incasso ? (is_cli ? _spin_billv : _spin_billa) : (is_cli ? _spbo_billv : _spbo_billa);
if (zio.ok())
{
TRiga_documento r((TDocumento *)&doc, "02"); // il tipo riga 02 spese a valore
r.put(RDOC_QTA, UNO);
r.put(RDOC_PREZZO, spese);
r.put(RDOC_CODIVA, codiva_es);
_righe_iva->add(r, zio, ndec);
sp_iva = r.imposta(false);
sp_iva.round(ndec);
if (doc.tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale sono esclusivi.
{
// Totalizza per ogni codice iva il lordo
if (!_totali_lordi.is_key(codiva_es))
_totali_lordi.add(codiva_es, new real);
real& rl = (real&)_totali_lordi[codiva_es];
rl += spese + sp_iva;
}
}
else
_error = spinbo_error;
}
void TContabilizzazione::calculate_spese_esenti(const real& spese, real& sp_iva, int ndec, const TDocumento & doc)
{ {
const bool is_cli = doc.get_char(DOC_TIPOCF) != 'F'; const bool is_cli = doc.get_char(DOC_TIPOCF) != 'F';
const TBill& zio = is_incasso ? (is_cli ? _spin_billv : _spin_billa) : (is_cli ? _spbo_billv : _spbo_billa); TBill zio;
const TString8 codiva_es = ((TDocumento &)doc).codiva_bolli_esenti();
conto_bolli_esenti(zio, ((TDocumento &)doc));
if (zio.ok()) if (zio.ok())
{ {
TRiga_documento r((TDocumento *) &doc, "02"); // il tipo riga 02 spese a valore TRiga_documento r((TDocumento *) &doc, "02"); // il tipo riga 02 spese a valore
r.put(RDOC_QTA, UNO); r.put(RDOC_QTA, UNO);
r.put(RDOC_PREZZO, spese); r.put(RDOC_PREZZO, spese);
r.put(RDOC_CODIVA, codiva_es); r.put(RDOC_CODIVA, codiva_es);
@ -1995,20 +2079,24 @@ error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec)
if (!sp_incasso.is_zero()) if (!sp_incasso.is_zero())
{ {
TString4 codiva_es; doc.iva_esente(codiva_es); TString4 codiva_es; doc.iva_esente(codiva_es);
calculate_spese(sp_incasso,iva_sp_incasso,ndec,true,codiva_es.full() ? codiva_es : doc.codiva_spese(), doc); calculate_spese(sp_incasso, iva_sp_incasso, ndec, true, codiva_es.full() ? codiva_es : doc.codiva_spese(), doc);
} }
const real rit = doc.ritenute(); const real rit = doc.ritenute();
tot_netto += sp_incasso + iva_sp_incasso - rit; tot_netto += sp_incasso + iva_sp_incasso - rit;
// Aggiunge le spese bolli // Aggiunge le spese bolli incasso
real sp_bolli = doc.bolli(tot_netto, ndec, _netto); real sp_bolli_incasso = doc.bolli_incasso(tot_netto, ndec, _netto);
if (!sp_bolli.is_zero()) real iva_sp_bolli;
{
real iva_sp_bolli;
calculate_spese(sp_bolli, iva_sp_bolli, ndec, false, doc.codiva_bolli(), doc);
}
if (!sp_bolli_incasso.is_zero())
calculate_spese(sp_bolli_incasso, iva_sp_bolli, ndec, false, doc.codiva_bolli(), doc);
// Aggiunge le spese bolli
real sp_bolli_esenti = doc.bolli_esenti(ndec, _netto);
if (!sp_bolli_esenti.is_zero())
calculate_spese_esenti(sp_bolli_esenti, iva_sp_bolli, ndec, doc);
return _error; return _error;
} }