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

View File

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

View File

@ -874,7 +874,7 @@ public:
long renum_ndoc(long numdoc = 0);
virtual bool renum() { return renum_ndoc() > 0;}
const TString& codiva_spese() const ;
const TString& codiva_bolli() const ;
const TString& codiva_bolli();
TCodgiac_livelli& livelli() const ;
void dirty_fields();
@ -982,8 +982,12 @@ public:
real spese_incasso(real &imp, int ndec, TTipo_importo netto = _lordo) const ;
real imponibile_bolli_esenti() 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 imposta(bool spese = false, int ndec = AUTO_DECIMALS) const;
real totale_doc() const;

View File

@ -234,6 +234,7 @@ TString4 TDocumento::_codiva_spese;
TString4 TDocumento::_codiva_bolli;
short TDocumento::_has_mag = 3;
short TDocumento::_has_provv = 3;
#ifdef LIVE_STATISTICS
short TDocumento::_has_stat_ven = 3;
#endif
@ -316,8 +317,11 @@ TDocumento::~TDocumento()
const TString& TDocumento::codiva_spese() const
{ ((TDocumento *)this)->test_firm(); return _codiva_spese;}
const TString& TDocumento::codiva_bolli() const
{ ((TDocumento *)this)->test_firm(); return _codiva_bolli;}
const TString& TDocumento::codiva_bolli()
{
test_firm();
return _codiva_bolli;
}
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;
}
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;
if (get_bool(DOC_ADDBOLLI))
{
const real bolli_es = ini_get_real(CONFIG_STUDIO, "ve", "BOLLIES");
TArray sca_bolli;
TArray imp_bolli;
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++)
{
old_bolli = tot_bolli + iva_bolli;
old_bolli = tot_bolli + iva_bolli;
const real imposte = imp_orig + iva_bolli;
const real imp_spese = sp_orig + tot_bolli - iva_bolli;
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_rate_auto();
@ -596,7 +662,7 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const
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);
}
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)
{
const TString& codiva = codiva_bolli();
if (codiva.full())
{
TRiepilogo_iva* ri = (TRiepilogo_iva*)table.objptr(codiva);
if (ri == NULL)
{
ri = new TRiepilogo_iva(TCodiceIVA(codiva));
@ -2514,14 +2582,37 @@ void TDocumento::update_tabella_iva(bool solo_imponibili)
}
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;
tot_doc += valiva;
}
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
@ -2586,7 +2677,7 @@ real TDocumento::totale_doc() const
if (!lordo)
r += imposta();
r += spese_incasso(real(r - ritenute()), ndec);
r += bolli(real(r - ritenute()), ndec);
r += ((TDocumento *) this)->bolli(real(r - ritenute()), ndec);
}
else
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)
{
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
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);
r += r1;
r1 += _doc->bolli(real(r - _doc->ritenute()), ndec);
r1 += ((TDocumento *)_doc)->bolli(real(r - _doc->ritenute()), ndec);
r = r1;
}
else

View File

@ -455,12 +455,16 @@ protected:
void split_sp_amount(const real & amount, int decimals) const;
// 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);
// 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
error_type search_costo_ricavo_mat(TBill&, const TRiga_documento&);
// 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);
// 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())
error_type add_spese_inbo(TDocumento&, const int);
// 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;
}
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)
{
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)
{
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 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())
{
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);
@ -1995,20 +2079,24 @@ error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec)
if (!sp_incasso.is_zero())
{
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();
tot_netto += sp_incasso + iva_sp_incasso - rit;
// Aggiunge le spese bolli
real sp_bolli = doc.bolli(tot_netto, ndec, _netto);
if (!sp_bolli.is_zero())
{
real iva_sp_bolli;
calculate_spese(sp_bolli, iva_sp_bolli, ndec, false, doc.codiva_bolli(), doc);
}
// Aggiunge le spese bolli incasso
real sp_bolli_incasso = doc.bolli_incasso(tot_netto, ndec, _netto);
real iva_sp_bolli;
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;
}