Patch level : 12.0 348

Files correlati     : cg4.exe

Modificato il calcolo del volume d'affari.
Tolte le regolarizzazioni, l'IVA differita e per cassa da incassare e aggiunta l'iva differita e per cassa incassata.


git-svn-id: svn://10.65.10.50/branches/R_10_00@23620 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
bonazzi 2017-02-15 23:27:15 +00:00
parent 96eebddba6
commit b1fcdec1a1

View File

@ -25,6 +25,7 @@
#include <clifo.h>
#include <occas.h>
#include <comuni.h>
#include "ivadiff.h"
// -------------------- QUI comincia l'avventura --------------------------
// Datemi un punto di appoggio ******************
@ -202,6 +203,20 @@ bool TLiquidazione_app::recalc_all()
return good;
}
void TLiquidazione_app::build_reg_caus_list(TAssoc_array & causali)
{
TCursor c(new TRelation(LF_CAUSALI));
int items = c.items();
causali.destroy();
for (c = 0L; c.pos() < items; ++c)
{
const TString8 cau = c.curr().get(CAU_CODCAUREG);
if (cau.full())
causali.add(cau, cau);
}
}
bool TLiquidazione_app::update_firm(int month, bool recalc)
{
// Se recalc e' true considera la necessita' di ricalcolare e le
@ -212,7 +227,9 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
// Gestione IVA differita, da non confondere con _isdifferita
_isdiff = ini_get_bool(CONFIG_DITTA, "cg", "GesLiqDiff");
TAssoc_array caus_reg;
build_reg_caus_list(caus_reg);
if (month == 13 && recalc)
{
TTable pem("PEM");
@ -259,6 +276,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
if (!calc && _recalc != never) calc = !ok;
bool gheravergot = false;
bool quater = false;
bool first_attiv = true; // prima attività vengono calcolati gli imponibili a liquidazione differita e per cassa non incassati
TToken_string atts;
TToken_string cattivs;
@ -275,6 +293,8 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
{
const TString8 codatt = ndt_att.get("CODATT");
const TString80 desatt = ndt_att.get("DESCR");
real tot_reg; // totale imponibile regolarizzazioni
quater = _nditte->curr().get_bool("FLIVA11Q");
// attività mista: ce ne sono in realtà due
@ -385,14 +405,14 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
stliq = riepliq = false;
if (calc || !recalc)
if (!update_att(month, cattiv) && stliq)
if (!update_att(month, cattiv, caus_reg, tot_reg) && stliq)
describe_error(TR("Attività non ricalcolate: possibili errori"),
codatt);
if (_recalc_regis)
continue;
if (month == 13)
recalc_annual(cattiv);
recalc_annual(cattiv, tot_reg, first_attiv);
// vediamo se c'e' qualcosa da raccontare
gheravergot = _isannual || _isriepilogo;
@ -423,7 +443,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
}
while (_nditte->next_match(LF_ATTIV));
// se quater stampa riepilogo
// se quater stampa riepilogo
if (quater && month == _month && riepliq)
describe_att(month,atts, true, 'Q');
@ -489,7 +509,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
return ok || calc;
}
bool TLiquidazione_app::update_att(int month, const char* codatt, bool recalc)
bool TLiquidazione_app::update_att(int month, const char* codatt, TAssoc_array & caus_reg, real & tot_reg, bool recalc)
// viene passato un codice attivita' con codatt+tipoatt
// vedi update_firm per il burdel dei calc e recalc
// occhecasino. Se _comp_acconto e' true, i movimenti considerati
@ -511,7 +531,7 @@ bool TLiquidazione_app::update_att(int month, const char* codatt, bool recalc)
if (calc || !recalc)
{
zero_att(month,codatt);
recalc_att(month,codatt);
recalc_att(month,codatt, caus_reg, tot_reg);
if (!_recalc_regis)
{
// Ricalcolo ventilazione e ag. viaggio:
@ -851,7 +871,7 @@ static bool is_autofattura_articolo_17(const TRectype& mov)
return af;
}
void TLiquidazione_app::recalc_att(int month, const char* codatt)
void TLiquidazione_app::recalc_att(int month, const char* codatt, TAssoc_array & caus_reg, real & tot_reg)
// il codatt passato e' codice att + tipo att ( IN {1|2} )
// occhecasino. Se _comp_acconto e' true, i movimenti considerati
// saranno solo quelli di dicembre per data <= 20/12;
@ -956,6 +976,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
_diff_acq_ap = ZERO;
_diff_acq_ap_iva = ZERO;
tot_reg = ZERO;
// PEM
real vt_imponibile[23];
real vt_imposta[23];
@ -1418,12 +1440,30 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
real impos_det; // Imposta detraibile
char sezfat;
TLocalisamfile id(LF_IVADIFF);
const tipo_sospensione sosp_imp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna;
const TString & codcaus = rcs.get(CAU_CODCAUS);
TToken_string key = _rmoviva->get(RMI_NUMREG); key.add(1);
const bool soloiva = cached_causale(codcaus, atoi(_year)).reg().iva() != nessuna_iva && cache().get(LF_RMOV, key).empty();
const TRectype& clifo = cache().get_rec(LF_CLIFO, _mov->get(MOV_TIPO), _mov->get(MOV_CODCF));
const int tp = clifo.get_int(CLI_ALLEG);
#ifdef DBG
const long nr = _mov->get_long(MOV_NUMREG);
if (nr == 115414 || nr == 155995)
int i = 1 ;
#endif
if ((soloiva &&
(caus_reg.objptr(codcaus) != NULL || tp < 1)) &&
sosp_imp != vol_affari)
tot_reg += imponibile_orig;
if (bIsMovDiff && tm == tm_fattura)
{
const TDate datareg = _mov->get(MOV_DATAREG);
sezfat = tipomov == vendita ? 'D' : 'A';
sezfat = tipomov == vendita ? 'D' : 'A';
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", 0);
@ -1462,7 +1502,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
real totfat = _mov->get(MOV_TOTDOC);
real tot = totfat;
FOR_EACH_ARRAY_ITEM(pagscatt, r, obj)
FOR_EACH_ARRAY_ITEM(pagscatt, r, obj)
{
const TRectype& pagsca = *(TRectype*)obj;
const int nrigp = pagsca.get_int(PAGSCA_NRIGP);
@ -1500,8 +1540,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
const TPartita& p = arrpart.partita(pagsca);
const TRiga_partite& rp = p.riga(nrigp);
nregpag = rp.get_long(PART_NREG);
nrigpag = rp.get_int(PART_NUMRIG);
nregpag = rp.get_long(PART_NREG);
nrigpag = rp.get_int(PART_NUMRIG);
tipomov_pag = rp.tipo();
id.put(PART_TIPOMOV, tipomov_pag);
id.put("NUMREGP", nregpag);
@ -1820,6 +1860,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
case normale:
assp_imp += asimp_imp;
assp_iva += asimp_iva;
// no regolarizzazioni e reverse charge
vssp_imp += vsimp_imp;
vssp_iva += vsimp_iva;
break;
@ -4278,7 +4320,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
_lam->rewrite();
}
void TLiquidazione_app::recalc_annual(const char* att)
void TLiquidazione_app::recalc_annual(const char* att, real tot_reg, bool & first)
{
// viene chiamata 2 volte per le att. miste; PLA e' stata
// azzerata dove serve da update_firm se siamo all'annuale
@ -4305,7 +4347,7 @@ void TLiquidazione_app::recalc_annual(const char* att)
CHECKD(tipoatt > 0, "Tipo att non valido ", tipoatt);
look_pla(aaa);
volaff1 = _pla->get_real("R14");
volaff1 = _pla->get_real("R14") - tot_reg;
volaff2 = (const char*)_pla->get("S1");
vendite = _pla->get_real("R0");
es_c1 = _pla->get_real("R1");
@ -4418,7 +4460,53 @@ void TLiquidazione_app::recalc_annual(const char* att)
//_plm->put("R1",iva_acq); // Si riscriva il tutto
//_plm->rewrite();
}
// nella prima attività sottrae le vendite per cassa e a liquidazione differita
if (first)
{
TString query;
query << "USE IVADIFF KEY 2 SELECT (BETWEEN(DATAREG,#DAL,#AL))&&(BETWEEN(DATAREGP,0,#AL))"
<< "\nFROM ANNOLIQ=" << _year;
TISAM_recordset id(query);
long cur_numreg = 0;
int cur_tipoiva = 0;
int cur_tipodiff = 0;
id.set_var("#DAL", TDate(1, 1, atoi(_year)));
id.set_var("#AL", TDate(31, 12, atoi(_year)));
for (bool ok = id.move_first(); ok; ok = id.move_next())
{
const long numreg = id.get(RMI_NUMREG).as_int();
if (numreg != cur_numreg)
{
cur_numreg = numreg;
cur_tipoiva = id.get(ID_TIPOIVA).as_int();
cur_tipodiff = id.get(ID_TIPODIFF).as_int();
}
const char sezione = id.get(ID_SEZIONE).as_string()[0];
const int tipomov = id.get(ID_TIPOMOV).as_int();
const real imp = id.get(RMI_IMPONIBILE).as_real();
if (!imp.is_zero() && cur_tipoiva == 1) // Vendite
{
switch (tipomov)
{
case 1:
volaff1 -= (sezione == 'D') ? imp : -imp;
break;
case 2:
volaff1 += (sezione == 'A') ? imp : -imp;
break;
case 3:
volaff1 += (sezione == 'A') ? imp : -imp;
break;
default:
break;
}
}
}
first = false;
}
_pla->put("R0", vendite);
_pla->put("R1", es_c1);
_pla->put("R2", es_c2);