campo-sirio/cg/cg4301.cpp
angelo 20d4a00876 Posto sotto condizione annuale il ricalcolo degli acquisti.
Oddio, che disastro, la ventilazione non funzionava piu'...
Se solo stessero piu' attenti ed accorti quando fanno le prove...
ma soprattutto se si facessero prendere meno dal panico...
se fossero un poco piu' razionali...
se fossero...


git-svn-id: svn://10.65.10.50/trunk@5534 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-11-04 16:53:18 +00:00

2768 lines
90 KiB
C++
Executable File

// ------------------------------------------------------------
// Calcolo liquidazioni
// Part 2: calcolo
// fv 21-1-94
// ------------------------------------------------------------
#include <progind.h>
#include <sheet.h>
#include <config.h>
#include <utility.h>
#include <nditte.h>
#include <attiv.h>
#include <tab1100.h>
#include <mov.h>
#include <pconti.h>
#include "cg4300.h"
#ifdef DBG
#if XVT_OS == XVT_OS_WIN
#define STRICT
#include <windows.h>
#endif
#endif
// -------------------- QUI comincia l'avventura --------------------------
// Datemi un punto di appoggio ******************
// e mi ci appoggero' ******************
// ----------------------------------------------------- ******************
bool TLiquidazione_app::recalc_all()
{
_prind = new TProgind(_selected.ones()*2, _printonly ?
" Stampa liquidazione... \n"
" Preparazione archivi \n"
" " :
" Calcolo liquidazione... \n"
" Preparazione archivi \n"
" ",
TRUE,TRUE,45);
for (int l = 0; l < _ditte->items(); l++)
{
if (_prind->iscancelled())
break;
if (_selected[(long)l])
{
TToken_string& nomeditta = _ditte->row(l);
int save_month = _month;
/* -------------------------------------------------------------
* leggi parametri ditta necessari; stabilisci se annuale,
* se si' metti _month a 13
* istanzia _freqviva, _isbenzinaro, _isannual, _isriepilogo
* --------------------------------------------------------------
*/
_reg_arr.destroy(); // Azzera la cache dei registri per ogni ditta.
_nditte->zero();
_nditte->curr().put("CODDITTA",nomeditta.get_long(1));
_nditte->read();
_freqviva = nomeditta.get(3);
bool mens = _freqviva == "M";
// determina attivita' prevalente e istanzia cazzuole
// per vedere che Kazzo di liquidazione calcolare
TString attprev = _nditte->curr().get("CODATTPREV");
TLocalisamfile& atts = _nditte->lfile(LF_ATTIV);
atts.zero();
atts.put("CODDITTA",nomeditta.get_long(1));
atts.put("CODATT", attprev);
if (atts.read() != NOERR) atts.zero();
// istanzia benzinaro
_isbenzinaro = atts.get_bool("ART74_4");
// riaggiusta relazione
_nditte->read();
// strasemplificato: per l'annuale si sceglie annuale, altrimenti
// e' la 12ma anche per le trimestrali.
_isannual = _isriepilogo = _month == 13;
TApplication::set_firm(nomeditta.get_long(1));
_prind->addstatus(1);
/*
* trimestrali impropriamente selezionate per mesi intermedi
* provocano il ricalcolo dei progressivi mensili ma non la stampa
*/
_canprint = is_month_ok_strict(_month) || _month == 13;
/* --------------------------------------------------------------
* Ricalcola i mesi necessari: annuale e' un mese unico da 1/1 al 31/12
* --------------------------------------------------------------
*/
int need_refresh = FALSE;
if (_recalc != ever)
{
int m = _month == 13 ? _month : 1;
for (; m < _month; m++)
if (is_month_ok_strict(m) && (!look_lim(m) || !_lim->get_bool("B0")))
{
need_refresh = TRUE;
break;
}
if (need_refresh && yesno_box("Alcuni mesi precedenti non "
"risultano ricalcolati. E' consigliabile il ricalcolo. "
"Si desidera eseguirlo?"))
_recalc = ever;
}
for (int m = 1; m <= _month; m++) // fino a 13 compreso
if (is_month_plain(m) || _recalc == ever)
{
if (_prind->iscancelled()) break;
update_firm(m);
}
// se ci sono altri mesi dopo l'ultimo calcolato, invalida il
// flag 'calcolato' del primo, per causare il ricalcolo dei
// successivi (evitando problemi per credito precedente)
for (m = _month+1; m <= 13; m++)
if (look_lim(m))
{
_lim->put("B0","");
_lim->rewrite();
break;
}
_month = save_month;
}
}
bool canc = _prind->iscancelled();
if (!canc) _prind->addstatus(1);
TApplication::set_firm(__firm);
delete _prind; _prind = NULL;
return !canc;
}
bool TLiquidazione_app::update_firm(int month, bool recalc)
{
// Se recalc e' TRUE considera la necessita' di ricalcolare e le
// opzioni utente. Se FALSE se ne impipa dell'utente e ricalcola
// se necessario (serve nelle chiamate ricorsive)
// Ritorna FALSE soltanto se il ricalcolo era necessario e non e'
// stato effettuato per scelta dello stronzo commercialista.
look_lim(liq_month(month), TRUE);
{
TConfig cnf(CONFIG_DITTA, "cg");
_isdiffacc = is_differita();
_isdifferita = _isdiffacc;
_isintr = !cnf.get_bool("InTrTr") && _freqviva != "M";
if (_isbenzinaro)
_gest4 = cnf.get_bool("GesT74");
// controlla che il periodo corrente non sia l'inizio dell'attivita'
// nel caso, differita va a FALSE
_monthinatt = 1;
}
TDate inatt(_nditte->lfile().get("DINIZIOATT"));
{
if (is_in_liq_period(inatt)) _isdifferita = FALSE;
if (inatt.year() == atoi(_year)) _monthinatt = inatt.month();
TConfig cnf1(CONFIG_STUDIO, "cg");
_isricacq = cnf1.get_bool("RicAcq") && month == 13;
}
// ricalcolo normale
// lim c'e' solo per i trimestri
bool ok = _lim->get_bool("B0");
if (ok && !recalc) return TRUE;
bool calc = (_recalc == ever || (_recalc == one && is_month_ok(month,_month)));
if (!calc && _recalc != never) calc = !ok;
bool gheravergot = FALSE;
bool quater = FALSE;
TToken_string atts;
TToken_string cattivs;
// azzera rimborsi
zero_firm(month);
// casini per stampa minchie in coda ai registri
bool riepliq = _isregis ? _riepilogo : FALSE;
bool stliq = TRUE;
_nditte->save_status();
if (_nditte->is_first_match(LF_ATTIV))
{
TString buf(256);
do
{
TString16 codatt = _nditte->curr(LF_ATTIV).get("CODATT");
TString80 desatt = _nditte->curr(LF_ATTIV).get("DESCR");
quater = _nditte->curr().get_bool("FLIVA11Q");
// attivita' mista: ce ne sono in realta' due
// viene calcolato nel ciclo su tipoatt (che viene ripetuto solo
// se diventa TRUE);
_mixed = FALSE;
buf.format( _printonly ? "Stampa liquidazione (%d)...\n%s: %s\n" :
"Calcolo liquidazione (%d)...\n%s: %s\n",
month,
(const char*)_nditte_r->get("RAGSOC"),
(const char*)desatt);
if (_prind) _prind->set_text(buf);
// se ricalcola l'annuale si tiene tutte le vendite e corrispettivi di
// tutti i lerci mesi. Analogamente se sta calcolando una trimestrale.
// Nel caso di trimestrale con ricalcolo trimestri precedenti azzera
// ad ogni inizio di trimestre.
if (!(_freqviva == "T" && (month != 4 && month != 7 && month != 10 && month != 13)))
{
_vend_arr.destroy();
_corr_arr.destroy();
}
cattivs = "";
for (int tipoatt = 1; tipoatt <= (_mixed ? 2 : 1); tipoatt++)
{
TString cattiv(codatt); bool waspla;
cattiv << tipoatt;
if (tipoatt == 1 && (waspla = look_pla(cattiv, FALSE)))
{
_p8 = _pla->get_real("R5");
_p8b = _pla->get_real("R6");
_p9 = _pla->get_real("R7");
_prorata = _pla->get_real("R8");
_isplafond = !(_p8.is_zero() && _p8b.is_zero() &&
_p9.is_zero());
_isservizio = _pla->get("S7") == "S";
_mixed = _pla->get("S7") == "M" || _pla->get("S7") == "E";
}
else
_isservizio = _nditte->curr(LF_ATTIV).get("TIPOATT") == "S";
_isviaggio = _nditte->curr(LF_ATTIV).get_bool("REG74TER");
_isagricolo = _nditte->curr(LF_ATTIV).get_bool("REGAGR");
_isagr98 = _isagricolo && atoi(_year) > 1997;
_isvent = FALSE;
if (tipoatt == 1 && waspla && month == 13)
{
// azzera pla dove serve
_pla->put("R0","");
_pla->put("R1","");
_pla->put("R2","");
_pla->put("R3","");
_pla->put("R4","");
_pla->put("R13","");
_pla->put("R9","");
_pla->put("R10","");
_pla->put("R11","");
_pla->put("R12","");
_pla->put("R14","");
_pla->put("S1","0");
_pla->put("S2","0");
_pla->put("S3","0");
_pla->rewrite();
}
for (_reg->first(); _reg->good(); _reg->next())
{
if (codatt == _reg->get("S8"))
{
if (_reg->get_int("I0") == 2)
if (!_isvent) _isvent = _reg->get_bool("B3");
}
}
if (!_isregis)
stliq = riepliq = TRUE;
if (_comp_acconto)
stliq = riepliq = FALSE;
if (calc || !recalc)
if (!update_att(month, cattiv) && stliq)
describe_error("Attivita' non ricalcolate: possibili errori",
codatt);
if (month == 13)
recalc_annual(cattiv);
// vediamo se c'e' qualcosa da raccontare
gheravergot = _isannual || _isriepilogo;
if (!gheravergot)
{
look_plm(month,cattiv);
gheravergot = !_plm->get_real("R0").is_zero() ||
!_plm->get_real("R1").is_zero();
}
if (month == _month && riepliq)
describe_att(month, cattiv, gheravergot,
'0' + (_mixed ? tipoatt : 0));
atts.add(cattiv);
cattivs.add(cattiv);
} // for tipoatt
// se attivita' mista stampa riepilogo
if (_mixed && month == _month && riepliq)
describe_att(month,cattivs, TRUE, 'M');
// se sta calcolando l'annuale, scrive tutti i dati calcolati per il trasferimento
// sui files adibiti a mantenere le informazioni per IVA 11: tab1100a e tab1100b
if (_is_interactive && month == 13)
iva11_set_arr_pim(codatt); // scorre tutti i maledetti PIM di questa ditta/attivita' per completare _iva11_arr
}
while (_nditte->next_match(LF_ATTIV));
// se quater stampa riepilogo
if (quater && month == _month && riepliq)
describe_att(month,atts, TRUE, 'Q');
// occorre poterla chiamare altre volte con mesi diversi
_nditte->restore_status();
// aggiorna le liquidazioni
//13/12/1995.
//Concordato con Ferdinando che, visto che qualche
//calcoluccio viene fatto anche in write_liq, essa
//verra' sempre richiamata.
//if (calc || !recalc)
//fine
// Se siamo in annuale e se non e' stato indicato di ricalcolare (stampa liquidazione chiamata
// dalla stampa registri) non riscrivere i risultati delle liquidazioni,
if ((is_month_ok_strict(month) && _month != 13 && _recalc != never) || _is_interactive /*month == 13*/ )
write_liq(month, atts);
// rimborso infraannuale
_DescrItem* rimb_d = NULL;
if (month == _month)
{
// unica nel suo genere, recalc_rimborso ritorna
// un bel descritem (NULL se non si rimborsa un cas)
// da passare a describe_liq
rimb_d = recalc_rimborso(month,atts, stliq);
if (stliq)
{
describe_firm(month);
//describe_liq(_month, atts, _isregis ? NULL : rimb_d);
describe_liq(_month, atts, rimb_d);
}
if (_month == 13 && look_lim(_month)) // scrive i risultati solo in annuale
{
real r0 = _lim->get_real("R0");
iva11_write(rimb_d == NULL || r0.sign() >= 0); // scrive su tab1100 at last.
}
}
//in caso di stampa registri e in caso sia
//stato calcolato l'acconto (metodo analitico)
//deve essere stampato il prospetto di liquidazione
//dell'acconto in coda al resto
if (_isregis && stliq)
if ((month == 12 && _freqviva == "M") ||
(month == 12 && _isbenzinaro && _gest4) ||
(month == 13 && _freqviva == "T" && !_isbenzinaro) ||
(month == 13 && _isbenzinaro && !_gest4))
describe_liqacc();
}
return ok || calc;
}
bool TLiquidazione_app::update_att(int month, const char* codatt,
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
// saranno solo quelli di dicembre per data <= 20/12;
// il ricalcolo e' FORZATO da _recalc messo a one
{
look_plm(month, codatt, TRUE);
bool ok = _plm->get_bool("B0");
if (ok && !recalc) return TRUE;
bool calc = _recalc == ever || (_recalc == one && is_month_ok(month,_month));
if (!calc && _recalc != never) calc = !ok;
if (calc || !recalc)
{
zero_att(month,codatt);
recalc_att(month,codatt);
// Ricalcolo ventilazione:
// - tutti i mesi se e' mensile
// - nei mesi 3,6,9,12 se trimestrale
if (_freqviva == "M" || (_freqviva == "T" && is_trim(month)))
recalc_ventilation(month, codatt);
recalc_corrispettivi(month, codatt);
}
return ok || calc;
}
void TLiquidazione_app::zero_firm(int month)
{
// nothing more, left for sicurezz
}
void TLiquidazione_app::zero_att(int month, const char* codatt)
{
for (_pim->first(); !_pim->eof(); _pim->next())
{
int m = atoi(*_pim_mese);
TString att = (const char*)*_pim_codatt;
if (m == month && att == codatt && (_year == *_pim_anno))
{
_pim->put("R0","");
_pim->put("R1","");
_pim->put("R2","");
_pim->put("R3","");
_pim->put("R4","");
_pim->put("R5","");
_pim->put("R6","");
_pim->put("R7","");
_pim->put("R8","");
_pim->put("R9","");
_pim->put("R10","");
_pim->put("R11","");
_pim->put("R12","");
_pim->put("R13","");
_pim->put("R14","");
_pim->put("S0","");
_pim->put("S1","");
_pim->put("S2","");
_pim->rewrite();
}
}
if (look_plm(month, codatt))
{
// zero PLM, POM, PAM, PUM
TString codtab(_plm->get("CODTAB"));
_plm->zero();
_pom->zero();
_pam->zero();
_pum->zero();
_plm->put("CODTAB", codtab);
_pom->put("CODTAB", codtab);
_pam->put("CODTAB", codtab);
_pum->put("CODTAB", codtab);
_plm->rewrite();
_pam->rewrite();
_pom->rewrite();
_pum->rewrite();
}
// Azzera i progressivi per il prospetto agricolo dal 1998
for (_pia->first(); !_pia->eof(); _pia->next())
{
int m = atoi(*_pia_mese);
TString att = (const char*)*_pia_codatt;
if (m == month && att == codatt && (_year == *_pia_anno))
{
_pia->put("R0",""); // Imponibile
_pia->put("R1",""); // Imposta
_pia->rewrite();
}
}
if (_isplafond && month != 13)
zero_plafond(month,codatt);
}
void TLiquidazione_app::recalc_att(int month, const char* codatt)
// 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;
{
real totintra = 0.0;
real nond19_imp = 0.0;
real nond19_iva = 0.0;
real ammort_det = 0.0;
real ammort_det_iva = 0.0;
real ammort_indet = 0.0;
real ammort_indet_iva = 0.0;
real ammort_6 = 0.0;
real ammort_6_iva = 0.0;
real acq_riv = 0.0;
real acq_riv_iva = 0.0;
real leasing = 0.0;
real leasing_iva = 0.0;
real cess_amm = 0.0;
real cess_amm_iva = 0.0;
real acquisti = 0.0;
real acquisti_iva = 0.0;
real vendite = 0.0;
real vendite_iva = 0.0;
real esenti_b1 = 0.0;
real esenti_b2 = 0.0;
real esenti_b3 = 0.0;
real esenti_b14 = 0.0;
real esni_rimb = 0.0; // ci sommo tutti esenti e ni validi per rimborso
real corr_CEE = 0.0;
real corr_noCEE = 0.0;
real acq_CEE = 0.0;
real acq_noCEE = 0.0;
real corr_misCEE = 0.0;
real acq_misCEE = 0.0;
real acq_misnoCEE = 0.0;
real agr_detIA = 0.0;
real agr_1i = 0.0;
real agr_2i = 0.0;
real agr_1 = 0.0;
real agr_2 = 0.0;
real agr_3 = 0.0;
real agr_4 = 0.0;
real agr_5 = 0.0;
real agr_6 = 0.0;
real agr_7 = 0.0;
real acq_ies = 0.0;
real acq_ies_iva = 0.0;
real ult_detr = 0.0;
real acq_pint = 0.0;
real acq_pint_iva = 0.0;
real spgen = 0.0;
real spgen_iva = 0.0;
real assp_imp = 0.0;
real assp_iva = 0.0;
real vssp_imp = 0.0;
real vssp_iva = 0.0;
real bdog_imp = 0.0;
real bdog_iva = 0.0;
real agr_imp = 0.0;
real agr_iva = 0.0;
// Spiegazione dell'arcano segreto sulle agenzie viaggio:
// non viene applicata la setregion() al cursore perche' e' necessario
// tenere conto della DATA74TER se presente.
if (!_isviaggio)
{
TRectype from(_cur->curr()); from.zero();
TRectype to(from);
TDate f(1, month == 13 ? 1 : month, atoi(_year));
TDate t(1, month == 13 ? 12 : month, atoi(_year));
t.set_end_month();
from.put(MOV_DATAREG, f);
to.put(MOV_DATAREG, t);
_cur->setregion(from, to);
}
*_cur = 0;
long items = _cur->items();
TString trueatt(codatt);
int tipatt = atoi(trueatt.sub(5));
//trueatt = trueatt.left(5);
trueatt.cut(5);
#ifdef DBG
TString msgdbg;
long freespace;
#endif
for (; _cur->pos() < items; ++(*_cur))
{
if ((_cur->pos() & 0x7F) == 0)
{
#ifdef DBG
msgdbg.format("Ricalcolo attivita': P=%ld/%ld",_cur->pos(),items);
freespace = GetFreeSpace(0);
msgdbg << " Memoria libera(1): " << freespace/1024 << " Kbytes.";
xvt_statbar_set(msgdbg);
#endif
do_events();
}
TDate date(_mov->get("DATAREG"));
TString16 reg = _mov->get("REG");
bool isreg = look_reg(_mov->get("REG"));
TString16 tipodoc = _mov->get("TIPODOC");
bool corrisp = _reg->get_bool("B0");
tiporeg tipomov = (tiporeg)_reg->get_long("I0");
if (_isviaggio && tipomov == vendita && !(_mov->get("DATA74TER").empty()))
date = _mov->get_date("DATA74TER");
/*
* check register present, rmoviva present and date OK
*/
const bool dok = !is_date_ok(date, month);
const bool sreg = !isreg;
const bool rs8 = _reg->get("S8") != trueatt;
const bool cmt = !_cur->is_first_match(LF_RMOVIVA);
const bool sosp_imp = _reg->get_bool("B1");
const TRectype& rcs = _cur->curr(LF_CAUSALI);
const bool fattrit = rcs.get_bool("RITFATT");
if (dok || sreg || rs8 || cmt) continue;
/*
* Tipo documento da eliminare (Scudler 1994)
* Trattasi per lo piu' di non incassati
* Da oggi vengono sommati nei real di S2 in pim
* assieme alle FS per stampa registri
*/
bool noninc = (tipodoc == "SN" || tipodoc == "CN" || tipodoc == "RN" ||
tipodoc == "IN" || tipodoc == "PG");
/*
* check date: se si calcola l'acconto, solo da 1/12 a 20/12
*/
int accmonth = _isdifferita ? 11 : 12;
/*
* Patrizia: se e' differita i mov. vanno da 1/11 a 30/11
* potrei allora andarmi a leggere i risultati della liq di 11
* ma il cliente potrebbe voler calcolare l'acconto prima
* di aver calcolato la liquidazione (perche' cosi' complicato?)
*/
//if (_comp_acconto && date.month() == accmonth && date.day() > 20)
if (_comp_acconto && date.month() == accmonth)
if (!_isdifferita && date.day() > 20)
continue;
do
{
look_iva(_rmoviva->get("CODIVA"));
// totali parziali registrati nei pim per motivi ignoti
real bolld_imp = 0.0; // imponibile bolle doganali
real bolld_iva = 0.0; // imposta bolle doganali
real asimp_imp = 0.0; // imponibile acquisti sosp. imposta
real asimp_iva = 0.0; // imposta acquisti sosp. imposta
real vsimp_imp = 0.0; // imponibile vendite sosp. imposta
real vsimp_iva = 0.0; // imposta vendite sosp. imposta
real rit_imp = 0.0; // imponibile fatture in ritardo
real rit_iva = 0.0; // imposta fatture in ritardo
real nin_imp = 0.0; // imponibile non incassati
real nin_iva = 0.0; // imposta non incassati
TString codiva = _iva->get("CODTAB");
TString tipoiva = _iva->get("S1");
TString tipoes_v = _iva->get("S2");
TString tipoes_a = _iva->get("S9");
int tipoagr = atoi(_iva->get("S4"));
int tipoag = atoi(_iva->get("S5"));
int tipopla = atoi(_iva->get("S3"));
int tipodet = atoi(_rmoviva->get("TIPODET"));
int isrimbinfr = _iva->get_bool("B3"); // vale per calcolo rimborso se ES o NI
int ivarimb = !_iva->get_bool("B4"); // non escluso calcolo rimb. per al. media
TString tipocr_s = _rmoviva->get("TIPOCR");
int tipocr = atoi(tipocr_s);
real imponibile = _rmoviva->get_real("IMPONIBILE");
real imposta = _rmoviva->get_real("IMPOSTA");
bool intra = _rmoviva->get_bool("INTRA");
int tipoatt = _rmoviva->get_int("TIPOATT");
// autofatture art. 17 per non residenti, con trattamento
// speciale in liquidazione annuale
bool autodafe = tipodoc == "AF"; //Adesso il tipocr==4 non c'entra piu' un tubo
// vendite art. 40 c. 5/6/8 acq.intra., con trattamento
// speciale in liquidazione annuale (A13 in stampa)
bool art40 = (tipodoc != "AF" && tipoiva != "NS" && !rcs.get_bool("AUTOFATT") && rcs.get_bool("VALINTRA") && !intra);
// indica acquisti per rivendita; viene messo in B4 di PIM per
// indicare che e' soggetto al ricalcolo IVA (se voluto) in modo
// da evitare di dover controllare mese e anno sul PIM
bool was_riv = FALSE;
/*
* puo' capitare per motivi brutalmente prassici
* SENSU Sergio 1995, Guido
*/
if (tipoatt == 0) tipoatt = 1;
if(tipoatt != tipatt) continue;
/*
* Riga imponibile > 9 = ritenute; non si
* considerano (Scudler 1994)
*/
// Filling dell'array per IVA11
if (_is_interactive && month == 13)
iva11_set_arr(trueatt);
if (noninc) // non incassati: non devono entrare in nessun altro calcolo
{
nin_imp = imponibile;
nin_iva = imposta;
}
else if (sosp_imp) // sospensione di imposta
{
if (tipomov == vendita)
{
vsimp_imp = imponibile;
vsimp_iva = imposta;
}
else
{
asimp_imp = imponibile;
asimp_iva = imposta;
}
assp_imp += asimp_imp;
assp_iva += asimp_iva;
vssp_imp += vsimp_imp;
vssp_iva += vsimp_iva;
}
else if (fattrit)
{
rit_imp = imponibile;
rit_iva = imposta;
}
else if (!fattrit || (fattrit && _isagricolo && _month == 13)) // normale
{
// *****************************************
// casi particolari
// *****************************************
// imposta acquisti intracomunitari
if (tipomov == acquisto && intra)
totintra += imposta;
// Altre cose di cui tener conto
// Separo pazientemente per movimenti d'acquisto e movimenti di vendita
// onde evitare rompicapi, rompicazzi ecc...
switch (tipomov)
{
case acquisto: // ACQUISTO (per chi non l'avesse capito)
// Per le anguille delle antille e le saracche delle molucche...
// Gli acquisti con tipocr 1,2,3,5,8 vanno totalizzati se e solo se
// il tipo iva e' diverso da NON SOGGETTO
if (tipoiva != "NS")
{
if (tipocr == 1 || tipocr ==5)
// Acquisto beni per rivendita
{
acq_riv += imponibile;
acq_riv_iva += imposta;
was_riv = TRUE;
}
else if (tipocr == 2 && tipodet == 0)
// Acquisto beni ammortizzabili detraibili
{
ammort_det += imponibile;
ammort_det_iva += imposta;
}
else if (tipocr == 2 && tipodet != 0)
// Acquisto beni ammortizzabili indetraibili
{
ammort_indet += imponibile;
ammort_indet_iva += imposta;
}
else if (tipocr == 3)
// Acquisto beni ammortizzabili detr. 6%
{
ammort_6 += imponibile;
ammort_6_iva += imposta;
ult_detr += imponibile * real(DETRAZIONE_6PERCENTO);
}
else if (tipocr == 8)
// Acquisto beni strum. acquisiti in leasing
{
leasing += imponibile;
leasing_iva += imposta;
}
} // fine if per tipo iva != da NON SOGGETTO
// Mi chiedo se effettivamente il tipo 9 sia esente da qualsiasi criterio...
if (tipocr == 9)
// Spese generali
{
spgen += imponibile;
spgen_iva += imposta;
}
// else fuck it up, dirty dick head.
break;
case vendita: // VENDITA
if (tipocr == 4)
/*
* Vendite strum. art 17 (cess. amm.)
* Comprende anche autofatture, anche nell'annuale
* (Sergio 1995)
*/
{
/* NO!
* Invece non le deve comprendere nell'annuale
* (Vladimiro 1995, piu' tardi)
*/
if (!(_month == 13 && autodafe))
{
cess_amm += imponibile;
cess_amm_iva += imposta;
}
}
break;
default: // Chissa' cosa cazzo puo' esserci oltre ad acquisto/vendita ?
break;
} // Fine del malefico switch
// operazioni per calcolo rimborso infraanale
// Scudler 1995 e molti dopo di lei
// La breve estate vissuta dal metodo del 51% rende
// oramai superflua la tabella rimborsi, eliminata
// senza entusiasmo ed interrogandomi sul senso della vita
if (ivarimb)
{
bool ok = _isagricolo ? tipoagr == 2 : FALSE;
if (tipomov == acquisto && !ok)
ok = (tipocr == 0 || tipocr == 1 || tipocr == 5 || tipocr == 9);
if (tipomov == vendita && !ok)
ok = tipoiva != "NS" && tipocr != 4;
ivarimb = ok;
}
// operazioni esenti
if (tipoiva == "ES")
{
if (tipomov == vendita)
{
if (tipoes_v == "B1")
esenti_b1 += imponibile;
else if (tipoes_v == "B2")
esenti_b2 += imponibile;
else if (tipoes_v == "B3")
esenti_b3 += imponibile;
// se e' il caso sommare esenti per rimborso
if (isrimbinfr)
esni_rimb += imponibile;
}
else if (tipoes_a == "12")
esenti_b14 += imponibile;
}
// non imponibili per rimborso
if (tipoiva == "NI" && tipomov == vendita && isrimbinfr)
esni_rimb += imponibile;
// bolle doganali
if (tipodoc == "BD")
{
bolld_imp = imponibile;
bolld_iva = imposta;
bdog_imp += bolld_imp;
bdog_iva += bolld_iva;
}
// plafond
if (_isplafond && tipomov == acquisto && month != 13 &&
tipoiva == "NI" && tipopla != 0)
{
add_plafond(month, codatt, tipopla, imponibile, tipodoc == "BD");
}
// agenzie viaggio (CHECK imponibili etc.)
if (_isviaggio)
switch (tipoag)
{
case 1:
if (tipomov == acquisto) acq_CEE += imponibile + imposta;
else corr_CEE += imponibile + imposta;
break;
case 2:
if (tipomov == acquisto) acq_noCEE += imponibile + imposta;
else corr_noCEE += imponibile + imposta;
break;
case 3: if (tipomov == vendita)
corr_misCEE += imponibile + imposta;
break;
case 4: if (tipomov == acquisto)
acq_misCEE += imponibile + imposta;
break;
case 5: if (tipomov == acquisto)
acq_misnoCEE += imponibile + imposta;
break;
}
if (_isagricolo)
{
/*
* rifatto sensu Scudler 1995 con invidiabile sicurezza
* senza porsi domande e mettendo NUMERI uguali
* al TIPO RECORD del frigorifero
*/
if (tipomov == vendita)
{
agr_imp = imponibile;
agr_iva = imposta;
const real p = _iva->get_real("R0") / CENTO;
if (corrisp)
lordo2netto(agr_imp,agr_iva,p);
if (tipoagr == 1) // Ora si utilizza solo il segnalino 1
{
agr_1 += agr_iva;
agr_1i += agr_imp;
// Nuovo regime agricolo dal 1998: si sommino per codice iva di compensazione (da reperire su PCON)
if (_isagr98)
{
TString ivacomp("00"); // Se non esiste o non si trova il conto questo e' il default (fa un poco schifo ma e' cosi')
if (_cur->is_first_match(-AGR_PCON1)) // Esiste il conto ?
// Bien, allora controlliamo se e' un ricavo...
if (_pcon_1_r->get_int(PCN_INDBIL) == 4)
if (_cur->is_first_match(-AGR_PCON2)) // Esiste il sottoconto ?
{
if (look_iva(_pcon_2_r->get(PCN_IVACOMP)))
ivacomp = _iva->get("CODTAB"); // Ecco il codice IVA di compensazione
}
look_pia(month, codatt, codiva, ivacomp, TRUE); // Crea il record in tabella se non esiste
real pia_imp = _pia->get_real("R0") + agr_1i; // Aggiorna...
_pia->put("R0", pia_imp);
_pia->put("B0", TRUE); // Seguo l'esempio dei PIM per il ricalcolo acquisti alla fine del ciclo
_pia->rewrite(); // Semplice, no?
}
}
else if (tipoagr == 2)
{
agr_2 += agr_iva;
agr_2i += agr_imp;
}
}
else if (tipodet == 0)
{
if (tipoagr == 2)
{
if (tipocr != 2 && tipocr != 3 && tipocr != 8)
agr_3 += imposta;
else
agr_4 += imposta;
}
else if (tipoagr == 3)
{
if (tipocr != 2 && tipocr != 3 && tipocr != 8)
agr_7 += imposta;
}
else // ne' 2 ne' 3
{
if (tipocr != 2 && tipocr != 3 && tipocr != 8)
agr_5 += imposta;
else
agr_6 += imposta;
}
}
} // __end of _agricolo
if (tipodet == 1) // acquisti indeducibili su ricavi esenti art. 10
{
acq_ies += imponibile;
acq_ies_iva += imposta;
}
if (tipodet == 3) // passaggi interni (solo per ventilaz)
{
acq_pint += imponibile;
acq_pint_iva += imposta;
}
// acquisti non detraibili art. 19
// possono valere per la ventilazione
if (tipodet == 9)
{
nond19_imp += imponibile;
nond19_iva += imposta;
}
// *****************************************
// Fine casi particolari
// Non che i casi normali siano tanto meglio
// *****************************************
} // non sosp_imp ne' altre casistiche che escludono la liq.
/*
* Calcolo e aggiornamento
* cerca o crea progressivo IVA
*/
look_pim(month, codatt, reg, tipocr_s, codiva, tipodet, TRUE);
/*
* se ign == TRUE non bisogna neppure PROGRESSIVARLI
*/
bool ign = sosp_imp || (fattrit && month != 13) || noninc;
/*
* se liq == FALSE gli importi non contano ai fini
* del calcolo liquidazione
*/
bool liq = !(tipodet == 1 || tipodet == 3 || tipodet == 9 || ign);
real imp = _pim->get_real("R0"); // imponibile
real ivp = _pim->get_real("R1"); // IVA su imp.
real lor = _pim->get_real("R2"); // lordo
real lorcor = _pim->get_real("R3"); // lordo corrispettivi (da non ventilare)
/*
* le maledette fatture con scontrino sono sul registro dei
* corrispettivi, ma vanno riportate nelle vendite in stampa;
* dunque, le sommiamo in R5 e R6 di PIM anche se continuiamo
* a sommarle anche in R0 e R1. La stampa (describe_pim)
* dovra' scorporarle.
*
* 5.7.1996. Mi permetto di aggiungere una cosa: le bastardissime fatture con scontrino
* possono anche essere sul registro vendite. Indi le schiaffo dentro
* a R5 e R6 anche nel caso vi sia un documento FS registrato sul registro
* delle vendite. Nel caso in futuro si accorgessero finalmente della puttanata
* galattica che mi hanno fatto fare basta eliminare il controllo su FS
* nel caso si tratti di non corrispettivi (vedi sotto).
* Da togliere anche nella :describe_pim() in cg4304.cpp.
*
*/
real ifs = _pim->get_real("R5"); // imponibile fatture con scontrino
real vfs = _pim->get_real("R6"); // IVA fatt. con scontrino
/*
* le maledette autofatture non residenti art. 17
* vedi al calcolo if (autodafe) si tengono da parte
* La stampa le scorpora solo IN SEDE di dichiarazione annuale
*/
real adf = _pim->get_real("R7");
real adi = _pim->get_real("R8");
/* le fottute fatture in sospensione di imposta */
real fsi = _pim->get_real("R11");
real fsv = _pim->get_real("R12");
/* le putride bolle doganali */
real bdi = _pim->get_real("R9");
real bdv = _pim->get_real("R10");
/* i luridi falsi corrispettivi */
real fci = _pim->get_real("R13");
real fcv = _pim->get_real("R14");
/* i conturbanti art. 40 c. 5/6/8 a.i. */
TToken_string kr(_pim->get("S0"),'!');
real a13i(kr.get(0));
real a13v(kr.get(1));
/* le porche fatture in ritardo */
TToken_string fr(_pim->get("S1"),'!');
real rti(fr.get(0));
real rtv(fr.get(1));
/*
* la stramadonna dei corrispettivi gia' scorporati
* Gli si aggiungono i non incassati, sperando in bene
*/
TToken_string cs(_pim->get("S2"),'!');
real csi(cs.get(0));
real csv(cs.get(1));
/* incrociamm'e dituozz' */
csi += nin_imp;
csv += nin_iva;
rti += rit_imp;
rtv += rit_iva;
if (tipomov == vendita)
{
fsi += vsimp_imp;
fsv += vsimp_iva;
}
else
{
fsi += asimp_imp;
fsv += asimp_iva;
bdi += bolld_imp;
bdv += bolld_iva;
}
if (liq && tipomov == vendita && !corrisp)
// i corrispettivi sono gestiti a parte
{
// totale vendite
vendite += imponibile;
vendite_iva += imposta;
}
else if ((liq || fattrit && month == 13) && tipomov == acquisto)
{
// totale acquisti
acquisti += imponibile;
acquisti_iva += imposta;
}
// corrispettivi
bool true_corrisp = FALSE;
if (corrisp)
{
/*
* ennesimo casino: non tutti i corrispettivi sono
* corrispettivi; in effetti, alcuni corrispettivi
* non sono corrispettivi. Ci si potrebbe domandare
* se gli altri corrispettivi sono corrispettivi o
* no; ebbene, gli altri corrispettivi risultano
* fortunatamente essere corrispettivi, a meno di
* indicazioni contrarie.
*/
if (tipodoc == "CR" || tipodoc == "RF" || tipodoc == "SC")
{
true_corrisp = TRUE;
_pim->put("I0",LORDO);
// questi sono corrispettivi davvero; comportamento normale
if (tipoiva == "VE") // da ventilare
{
lor += imponibile;
add_vendite(month, reg, tipodet, imponibile);
}
else // non da ventilare, con imposta gia' conteggiata
{
real perc = _iva->get_real("R0")/CENTO;
lor += imponibile + imposta;
lorcor += imponibile+imposta;
real tot = imponibile+imposta;
if (liq) add_corrisp(month, reg, tot, perc, tipodet, codiva, codatt);
}
}
else if (tipodoc == "FS")
{
// queste sono fatture che seguono scontrino, il lordo va detratto
// perche' si e' gia' registrato lo scontrino medesimo
true_corrisp = TRUE; // non e' vero ma non devono essere sommate ai falsi
// corrispettivi
if (tipoiva == "VE")
{
real rr = imponibile + imposta;
imp += rr;
if (liq)
vendite += rr;
add_vendite(month, reg, tipodet, rr);
}
if (liq)
{
csi += imponibile;
csv += imposta;
}
imp -= imponibile;
ivp -= imposta;
lor -= imponibile + imposta;
ifs += imponibile;
vfs += imposta;
}
else // vendite normali a tutti gli effetti
{
if (liq)
{
vendite += imponibile;
vendite_iva += imposta;
csi += imponibile;
csv += imposta;
}
imp += imponibile;
ivp += imposta;
_pim->put("I0",NETTO);
}
} // if corrisp
else // non corrisp
{ // imponibile e imposta separata
imp += imponibile;
ivp += imposta;
if (tipodoc == "FS") // Questo e' per l'errore MI3404
{
ifs += imponibile;
vfs += imposta;
}
_pim->put("I0",NETTO);
}
if (autodafe) // autofatture non residenti art, 17
{
/*
* Si devono riportare a parte in annuale
* e non comparire nel riepilogo del codice IVA
* corrispondente, solo se la liq. e' annuale
* Li metto in R7/R8 di pim e li sommo anche nelle
* vendite; la describe_pim() dovra' sommarli su tutti i
* pim, scorporarli dalle rispettive vendite
* e assegnarli al codice IVA AF in caso di liq. annuale
*/
adf += imponibile;
adi += imposta;
}
if (art40) // ammontare acq. intr. art40 c. 5/6/8
{ // Analogamente alle autofatture, si devono riportare a parte in annuale
// Vengono piazzati in una TToken_string con separatore = a '!'.
// La TToken_string viene registrata in S0.
// La describe_pim() sommera' tutte le storie, scorporandoli
// dalle vendite e assegnandoli al codice A13 in caso di liq annuale.
a13i += imponibile;
a13v += imposta;
}
if (corrisp && !true_corrisp)
{
fci += imponibile;
fcv += imposta;
}
if (!ign)
{
_pim->put("R0",imp);
_pim->put("R1",ivp);
_pim->put("R2",lor);
_pim->put("R3",lorcor); // Corrispettivi, non inclusi quelli da ventilare
_pim->put("R5",ifs);
_pim->put("R6",vfs);
_pim->put("R7",adf);
_pim->put("R8",adi);
_pim->put("R9",bdi);
_pim->put("R10",bdv);
_pim->put("R13",fci);
_pim->put("R14",fcv);
}
// questi servono per i ricalcoli altrui (classify_pim) o
// per trucchetti di ricalcolo successivi
_pim->put("R11",fsi);
_pim->put("R12",fsv);
_pim->put("I1", (long)tipomov);
_pim->put("B3", ivarimb ? "X" : "");
_pim->put("B4", (_isricacq && was_riv) ? "X" : "");
_pim->put("S5", tipoiva);
// art 40 c. 5/6/8 per A13.
kr.add(a13i.string(), 0);
kr.add(a13v.string(), 1);
_pim->put("S0",kr);
// fatture in ritardo
fr.add(rti.string(), 0);
fr.add(rtv.string(), 1);
_pim->put("S1",fr);
// corrispettivi gia' scorporati; anche questi servono per
// non cannare la stampa dei registri; contengono anche
// tutti i non incassati (vedi definizione di bool nonimp)
cs.add(csi.string(), 0);
cs.add(csv.string(), 1);
_pim->put("S2",cs);
_pim->rewrite();
}
while (_cur->next_match(LF_RMOVIVA));
} // fine calcolo progressivi IVA
/*
* calcolati tutti i movimenti e aggiornati i pim
* se necessario risistema le imposte acquisti beni
* per rivendita
*/
if (_isricacq) // flag settato parametri studio
{
for (_pim->first(); !_pim->eof(); _pim->next())
{
// this is much furber than doing all of the checks
if (_pim->get_bool("B4"))
{
// ricalcola l'imposta a partire dal codice IVA
look_iva(*_pim_codiva);
real old_iva = _pim->get_real("R1");
real perc = _iva->get_real("R0");
real new_iva = (_pim->get_real("R0") * perc)/CENTO;
new_iva.ceil(ROUND_LIRA); // TBC check ceil
if (new_iva != old_iva)
{
// ricalcola: acquisti_iva, acq_riv_iva
acquisti_iva -= old_iva;
acquisti_iva += new_iva;
acq_riv_iva -= old_iva;
acq_riv_iva += new_iva;
_pim->put("R1", new_iva);
// resetta in modo da non vederlo il mese dopo
_pim->put("B4", "");
_pim->rewrite();
}
}
}
}
// Ricalcola le imposte per regime agricolo dal 1998 (PIA)
if (_isagr98)
{
for (_pia->first(); !_pia->eof(); _pia->next())
{
// this is much furber than doing all of the checks (one more time)
if (_pia->get_bool("B0"))
{
// calcola l'imposta a partire dal codice IVA di compensazione
look_iva(*_pia_codcom);
real perc = _iva->get_real("R0");
real iva = (_pia->get_real("R0") * perc)/CENTO;
iva.ceil(ROUND_LIRA); // TBC check ceil
agr_detIA += iva;
_pia->put("R1",iva);
// resetta in modo da non vederlo il mese dopo
_pia->put("B0", "");
_pia->rewrite();
}
}
}
/*
* calcola il lercio prorata
* solo se liq. periodica
*/
real prorata;
if (!_prorata.is_zero() && month != 13)
{
prorata = acquisti_iva * (_prorata / CENTO);
acquisti_iva -= prorata;
}
look_plm(month, codatt, TRUE);
/*
* ACHTUNG: l'iva sulle vendite e' calcolata sommando anche i
* corrispettivi che sono corrispettivi, a differenza dei corrispettivi
* che non sono corrispettivi, ma tanto quelli (come si sa) non sono
* corrispettivi. Dunque, non si tiene conto delle imposte calcolate
* con la ventilazione (che vanno sottratte) ne' di quelle
* calcolate per le agenzie di viaggio (che sembra non vadano
* comunque sottratte nel calcolo del volume di affari)
*/
_plm->put("R2", prorata);
if (_isviaggio)
{
real deb_mens = 0.0;
_plm->put("R5", corr_CEE);
_plm->put("R6", corr_noCEE);
_plm->put("R7", acq_CEE);
_plm->put("R8", acq_noCEE);
_plm->put("R9", corr_misCEE);
_plm->put("R10",acq_misCEE);
_plm->put("R11",acq_misnoCEE);
// ---- NOTA BENE ------------------------
// l'iva vendite nei plm non comprende
// l'iva agenzie di viaggio, calcolata
// in liquidazione (mensile o trimestrale)
// ---------------------------------------
// Mod 7/7/95: calcolo effettuato anche qui, in modo da
// avere l'IVA dovuta per riportarla nei progressivi
// Dato che il resto funziona non tocco nulla, ovvero
// duplico il calcolo di write_liq, nella remota ipotesi
// che ci siano due o piu' attivita' e siano tutte
// agenzie di viaggio
real perc_r = (acq_misCEE * CENTO)/(acq_misCEE + acq_misnoCEE); perc_r.round(2);
real ivm = (corr_misCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA);
real tc = (corr_CEE + ivm);
real ta = (acq_CEE + acq_misCEE);
real bi = tc - ta - credito_costo_prec(month);
if (bi.sign() > 0)
{
deb_mens = (bi /((CENTO + aliquota_agvia())/CENTO)) *
(aliquota_agvia()/CENTO);
deb_mens.ceil(ROUND_LIRA); // ceil voluto MI3074
}
_pom->put("R13", deb_mens);
}
else if (_isagricolo)
{
_plm->put("R5", agr_1);
_plm->put("R6", agr_2);
_plm->put("R7", agr_3);
_plm->put("R8", agr_4);
_plm->put("R9", agr_5);
_plm->put("R10", agr_6);
_plm->put("R11", agr_7);
_pum->put("R10", agr_1i);
_pum->put("R11", agr_2i);
// Il porco agricoltore spende poco e paga meno
vendite_iva = agr_2;
acquisti_iva = agr_1 + agr_3;
// nuovo calcolo IVA detraibile
if (!agr_7.is_zero())
{
real pdetr = (agr_2i / (agr_1i + agr_2i));
pdetr.round(2);
acquisti_iva += agr_7 * pdetr;
acquisti_iva.round(ROUND_LIRA);
}
if (_isagr98)
{
_plm->put("R13", agr_detIA);
acquisti_iva += agr_detIA;
}
}
_plm->put("R0", vendite_iva);
_plm->put("R1", acquisti_iva);
_plm->put("R3", ult_detr);
// probabilmente R4 serviva per il decalage e non si usera'
_plm->put("R12", _prorata); // per comodita' in stampa
_plm->put("B0", "X"); // calcolato (invalidato dalla primanota)
_pom->put("R9", acq_ies);
_pom->put("R10", acq_ies_iva);
_pum->put("R8", acq_pint);
_pum->put("R9", acq_pint_iva);
_pam->put("R10", spgen);
_pam->put("R11", spgen_iva);
_pom->put("R0", totintra);
_pom->put("R1", nond19_imp);
_pom->put("R2", nond19_iva);
_pom->put("R3", ammort_det);
_pom->put("R4", ammort_det_iva);
_pom->put("R5", acq_riv);
_pom->put("R6", acq_riv_iva);
_pom->put("R7", leasing);
_pom->put("R8", leasing_iva);
_pom->put("R11", ammort_indet);
_pom->put("R12", ammort_indet_iva);
_pum->put("R0", cess_amm);
_pum->put("R1", cess_amm_iva);
_pum->put("R2", ammort_6);
_pum->put("R3", ammort_6_iva);
_pum->put("R4", esenti_b1);
_pum->put("R5", esenti_b2);
_pum->put("R6", esenti_b3);
_pum->put("R7", esenti_b14);
_pum->put("R12", esni_rimb);
_pam->put("R0", acquisti);
_pam->put("R1", vendite);
_pam->put("R6", assp_imp);
_pam->put("R7", assp_iva);
_pam->put("R8", vssp_imp);
_pam->put("R9", vssp_iva);
_pam->put("R4", bdog_imp);
_pam->put("R5", bdog_iva);
_plm->rewrite();
_pam->rewrite();
_pum->rewrite();
_pom->rewrite();
}
void TLiquidazione_app::iva11_set_arr(const TString& codatt)
// viene chiamata quando vengono scorsi i movimenti del mese, settando gran parte degli elementi di _iva11_arr.
{
// My God! Che 2 palle riestrarre tutte le informazioni
const TString16 tipodoc = _mov->get("TIPODOC");
const bool intra = _rmoviva->get_bool("INTRA");
const int tipocr = _rmoviva->get_int("TIPOCR");
const int tipodet = _rmoviva->get_int("TIPODET");
real imponibile = _rmoviva->get_real("IMPONIBILE");
real imposta = _rmoviva->get_real("IMPOSTA");
const TString16 codiva = _iva->get("CODTAB");
const TString tipoiva = _iva->get("S1");
const real ali = _iva->get_real("R0");
const TString16 tipoes_v = _iva->get("S2");
const TString16 tipoes_a = _iva->get("S9");
const int tipoagr = atoi(_iva->get("S4"));
const TRectype& rcs = _cur->curr(LF_CAUSALI);
const bool autofattura = rcs.get_bool("AUTOFATT");
const bool valintra = rcs.get_bool("VALINTRA");
const bool sosp_imp = _reg->get_bool("B1");
const bool corrisp = _reg->get_bool("B0");
tiporeg tipomov = (tiporeg)_reg->get_long("I0");
const bool is_vendita = tipomov == vendita;
const bool is_acquisto = tipomov == acquisto;
_Iva11Array b_arr;
const bool is_key = _iva11_arr.is_key(codatt);
_Iva11Array& array = is_key ? (_Iva11Array&)_iva11_arr.find(codatt) : b_arr;
// TAB11_RQA34 ovvero "RQA34" non viene trasferito!
// Sebbene per motivi di pieta' viene comunque lasciato nel tracciato record (esigenze PRASSI)
if (codiva.empty()) return;
if (is_acquisto)
{
if (_isagricolo && tipodet == 0)
{
if (tipoagr == 2)
{
if (tipocr == 2 || tipocr == 3 || tipocr == 8)
{
array.sub(imponibile,TAB11_G30I,LF_TAB1100B);
array.sub(imposta,TAB11_G30V,LF_TAB1100B);
}
else
{
array.add(imponibile,TAB11_G30I,LF_TAB1100B);
array.add(imposta,TAB11_G30V,LF_TAB1100B);
}
}
else if (tipoagr == 3 && tipocr !=2 && tipocr != 3 && tipocr != 8)
{
array.add(imponibile,TAB11_G31I,LF_TAB1100B);
array.add(imposta,TAB11_G31V,LF_TAB1100B);
}
}
if (!sosp_imp && tipodet == 0 && (tipocr == 2 || tipocr == 8))
{
array.add(imposta,TAB11_R6,LF_TAB1100B);
}
if (!sosp_imp)
{
if (tipodoc == "BD" && tipodet == 9)
{
array.add(imponibile,TAB11_F76);
if (_sind11)
array.add(imposta,TAB11_F76);
}
if (tipodoc != "BD")
{ // Compila prima i campi FC1nn ed FC2nn, poi i campi SBFnn ed SBInn
if (tipodet != 9)
{
if (ali == 2.00)
{
array.add(imponibile,TAB11_FC101);
array.add(imposta,TAB11_FC201);
}
else if (ali == 4.00)
{
array.add(imponibile,TAB11_FC102);
array.add(imposta,TAB11_FC202);
}
else if (ali == 8.50)
{
array.add(imponibile,TAB11_FC103);
array.add(imposta,TAB11_FC203);
}
else if (ali == 9.00)
{
array.add(imponibile,TAB11_FC104);
array.add(imposta,TAB11_FC204);
}
else if (ali == 10.00)
{
array.add(imponibile,TAB11_FC105);
array.add(imposta,TAB11_FC205);
}
else if (ali == 13.00)
{
array.add(imponibile,TAB11_FC106);
array.add(imposta,TAB11_FC206);
}
else if (ali == 16.00)
{
array.add(imponibile,TAB11_FC107);
array.add(imposta,TAB11_FC207);
}
else if (ali == 19.00)
{
array.add(imponibile,TAB11_FC108);
array.add(imposta,TAB11_FC208);
}
if (tipoes_a == "13")
array.add(imponibile,TAB11_FC109);
else if (tipoes_a == "10")
array.add(imponibile,TAB11_FC110);
else if (tipoes_a == "11")
array.add(imponibile,TAB11_FC111);
else if (tipoes_a == "12")
array.add(imponibile,TAB11_FC112);
else if (tipoes_a == "14")
array.add(imponibile,TAB11_FC113);
}
else
{
array.add(imponibile,TAB11_FC114);
if (_sind11)
array.add(imposta,TAB11_FC114);
}
if (intra) // Compila i campi SBFnn
{
if (tipodet != 9)
{
if (ali == 4.00)
{
array.add(imponibile,TAB11_SBF01);
array.add(imposta,TAB11_SBI01);
}
else if (ali == 9.00)
{
array.add(imponibile,TAB11_SBF02);
array.add(imposta,TAB11_SBI02);
}
else if (ali == 10.00)
{
array.add(imponibile,TAB11_SBF03);
array.add(imposta,TAB11_SBI03);
}
else if (ali == 13.00)
{
array.add(imponibile,TAB11_SBF04);
array.add(imposta,TAB11_SBI04);
}
else if (ali == 16.00)
{
array.add(imponibile,TAB11_SBF05);
array.add(imposta,TAB11_SBI05);
}
else if (ali == 19.00)
{
array.add(imponibile,TAB11_SBF06);
array.add(imposta,TAB11_SBI06);
}
if (tipoes_a == "13")
array.add(imponibile,TAB11_SBF07);
else if (tipoes_a == "10")
array.add(imponibile,TAB11_SBF08);
else if (tipoes_a == "11")
array.add(imponibile,TAB11_SBF09);
else if (tipoes_a == "12")
array.add(imponibile,TAB11_SBF10);
}
else
{
array.add(imponibile,TAB11_SBF11);
if (_sind11)
array.add(imposta,TAB11_SBF11);
}
}
}
}
}
if (is_vendita)
{
if (corrisp && tipoiva != "VE" && (tipodoc == "CR" || tipodoc == "RF" || tipodoc == "SC") )
return;
if (tipodoc == "CN" || tipodoc == "SN" || tipodoc == "RN") // salta i non incassati
return;
if (!valintra)
{
if (tipoes_v == "24")
array.add(imponibile,TAB11_EC107);
if (tipoes_v == "21")
array.add(imponibile,TAB11_EC108);
else if (tipoes_v == "B1")
array.add(imponibile,TAB11_EC109);
else if (tipoes_v == "B2")
array.add(imponibile,TAB11_EC110);
else if (tipoes_v == "B3")
array.add(imponibile,TAB11_EC111);
else if (tipoes_v == "25")
array.add(imponibile,TAB11_EC112);
else if (tipoes_v == "22")
array.add(imponibile,TAB11_EC114);
else if (tipoes_v == "20")
array.add(imponibile,TAB11_EC115);
if (tipocr == 4 && tipodoc != "AF")
array.add(imponibile,TAB11_EC113);
}
if (!autofattura && tipoiva != "NS")
if (tipodoc == "AF")
{
array.add(imponibile,TAB11_A35);
array.add(imposta,TAB11_L2);
}
else if (valintra && !intra)
{
array.add(imponibile,TAB11_A35BIS);
array.add(imposta,TAB11_L2BIS);
}
if (!autofattura && !sosp_imp && intra && tipoes_v == "22")
array.add(imponibile,TAB11_E52);
if (_isagricolo && (tipodoc != "CR" && tipodoc != "SC" && tipodoc != "RF" && tipodoc != "FS"))
{
const bool t1 = tipoagr == 1;
const bool t1_3 = tipoagr == 1 || tipoagr == 3;
if (ali == 2.00)
{
if (t1)
{
array.add(imponibile,TAB11_AGME01,LF_TAB1100B);
array.add(imposta,TAB11_AGVE01,LF_TAB1100B);
}
if (intra && t1_3)
{
array.add(imponibile,TAB11_ABME01);
array.add(imposta,TAB11_ABVE01);
}
}
else if (ali == 4.00)
{
if (t1)
{
array.add(imponibile,TAB11_AGME02,LF_TAB1100B);
array.add(imposta,TAB11_AGVE02,LF_TAB1100B);
}
if (intra && t1_3)
{
array.add(imponibile,TAB11_ABME02);
array.add(imposta,TAB11_ABVE02);
}
}
else if (ali == 8.50)
{
if (t1)
{
array.add(imponibile,TAB11_AGME03,LF_TAB1100B);
array.add(imposta,TAB11_AGVE03,LF_TAB1100B);
}
if (intra && t1_3)
{
array.add(imponibile,TAB11_ABME03);
array.add(imposta,TAB11_ABVE03);
}
}
else if (ali == 9.00)
{
if (t1)
{
array.add(imponibile,TAB11_AGME04,LF_TAB1100B);
array.add(imposta,TAB11_AGVE04,LF_TAB1100B);
}
if (intra && t1_3)
{
array.add(imponibile,TAB11_ABME04);
array.add(imposta,TAB11_ABVE04);
}
}
}
}
if (is_acquisto || is_vendita)
if (autofattura)
array.add(imponibile,TAB11_A35TER);
_iva11_arr.add(codatt,array,is_key);
}
void TLiquidazione_app::iva11_set_arr_pim(const TString& codatt)
// scorre (guarda un poco) tutti i PIM della ditta per COMPLETARE _iva11_arr
{
// Ribadisco: questa funzione COMPLETA solamente l'array scorrendo i PIM e memorizzando 51
// campi. Gli altri 74 sono compilati scorrendo i movimenti! (fatto prima della chiamata a questa funzione)
TString16 codiva, reg, tiva;
TString16 tpla, tvia;
TString16 v11, a11;
TToken_string tt("",'!');
tiporeg treg;
int tipocr,tipodet,tagr;
real aliq, imp, iva, vtot, atot, ivav, ivaa, adf, adi, a13i, a13v;
TString16 cur_att;
_Iva11Array b_arr;
const bool is_key = _iva11_arr.is_key(codatt);
_Iva11Array& array = is_key ? (_Iva11Array&)_iva11_arr.find(codatt) : b_arr;
// Scorporo corretto dei corrispettivi in R3
TAssoc_array corr_ann;
_CorrItem cx,*cc;
bool is_present;
for (_pim->first(); !_pim->eof(); _pim->next())
{
if (_year != *_pim_anno) continue;
if (atoi(*_pim_mese) != 13) continue;
cur_att = *_pim_codatt;
cur_att.rtrim(1);
if (codatt != cur_att) continue; // considera solo quelli dell'anno, obviously.
// Must consider current activity too...
codiva = *_pim_codiva;
reg = *_pim_codreg;
look_iva(codiva); look_reg(reg); // posiziona la tabella registri e quella IVA
tiva = _iva->get("S1"); // tipo IVA
tpla = _iva->get("S3"); // tipo gestione plafond
tagr = _iva->get_int("S4"); // tipo gestione regime agricolo
tvia = _iva->get("S5"); // tipo gestione ag. viaggio
v11 = _iva->get("S2"); // n.ro riga vendite per mod. IVA11
a11 = _iva->get("S9"); // n.ro riga acquisti per mod. IVA11
aliq = _iva->get_real("R0"); // aliquota
treg = (tiporeg)_reg->get_long("I0");
const bool is_vendita = treg == vendita;
const bool is_acquisto = treg == acquisto;
tipocr = atoi(*_pim_tipocr);
tipodet = atoi(*_pim_tipodet);
imp = _pim->get_real("R0");
iva = _pim->get_real("R1");
if (is_acquisto)
{
switch (tipocr)
{
case 2:
array.add(imp,TAB11_IMA01);
break;
case 8:
array.add(imp,TAB11_IMA02);
break;
case 1:
case 5:
array.add(imp,TAB11_IMA03);
break;
default:
break;
}
if (tipodet == 1)
array.add(iva,TAB11_B14);
// FBC???: tipo detr != 9
if (tipodet != 9)
{
if (aliq == 4.00)
{
array.add(_pim->get_real("R9"),TAB11_FBC101);
array.add(_pim->get_real("R10"),TAB11_FBC201);
}
else
if (aliq == 9.00)
{
array.add(_pim->get_real("R9"),TAB11_FBC102);
array.add(_pim->get_real("R10"),TAB11_FBC202);
}
else
if (aliq == 10.00)
{
array.add(_pim->get_real("R9"),TAB11_FBC103);
array.add(_pim->get_real("R10"),TAB11_FBC203);
}
else
if (aliq == 13.00)
{
array.add(_pim->get_real("R9"),TAB11_FBC104);
array.add(_pim->get_real("R10"),TAB11_FBC204);
}
else
if (aliq == 16.00)
{
array.add(_pim->get_real("R9"),TAB11_FBC105);
array.add(_pim->get_real("R10"),TAB11_FBC205);
}
else
if (aliq == 19.00)
{
array.add(_pim->get_real("R9"),TAB11_FBC106);
array.add(_pim->get_real("R10"),TAB11_FBC206);
}
if (a11 == "10")
array.add(_pim->get_real("R9"),TAB11_FBC107);
if (a11 == "11" || a11 == "12")
array.add(_pim->get_real("R9"),TAB11_FBC108);
if (a11 == "14")
array.add(_pim->get_real("R9"),TAB11_FBC109);
}
} // is_acquisto
if (is_vendita)
{
if (v11 == "G7A")
array.add(imp,TAB11_EC116);
else if (v11 == "G7B")
array.add(imp,TAB11_EC117);
else if (v11 == "R9") // Divenuto obsoleto prima ancora di utilizzarlo...
array.add(imp,TAB11_R9,LF_TAB1100B);
if ((_isagricolo && tagr==2) || !_isagricolo)
{
// Accumula i corrispettivi da scorporare per codice iva
is_present = corr_ann.is_key(codiva);
cx._totale = 0;
_CorrItem& ca = is_present ? (_CorrItem&) corr_ann[codiva] : cx;
ca._totale += _pim->get_real("R3");
if (!is_present) // se non c'e' lo aggiunge
{
ca._aliquota = _iva->get_real("R0"); // Se e' nuovo setta l'aliquota
corr_ann.add(codiva,ca);
}
tt = _pim->get("S0");
a13i = tt.get(0);
a13v = tt.get(1);
adf = imp - _pim->get_real("R7") - a13i;
adi = iva - _pim->get_real("R8") - a13v;
if (aliq == 4.00)
{
array.add(adf,TAB11_EC101);
array.add(adi,TAB11_EC201);
}
else if (aliq == 9.00)
{
array.add(adf,TAB11_EC102);
array.add(adi,TAB11_EC202);
}
else if (aliq == 10.00)
{
array.add(adf,TAB11_EC103);
array.add(adi,TAB11_EC203);
}
else if (aliq == 13.00)
{
array.add(adf,TAB11_EC104);
array.add(adi,TAB11_EC204);
}
else if (aliq == 16.00)
{
array.add(adf,TAB11_EC105);
array.add(adi,TAB11_EC205);
}
else if (aliq == 19.00)
{
array.add(adf,TAB11_EC106);
array.add(adi,TAB11_EC206);
}
}
if (_isagricolo && (tagr == 1 || tagr == 3))
{
if (aliq == 2.00)
{
array.add(imp,TAB11_AGME01,LF_TAB1100B);
array.add(iva,TAB11_AGVE01,LF_TAB1100B);
}
else if (aliq == 4.00)
{
array.add(imp,TAB11_AGME02,LF_TAB1100B);
array.add(iva,TAB11_AGVE02,LF_TAB1100B);
}
else if (aliq == 8.50)
{
array.add(imp,TAB11_AGME03,LF_TAB1100B);
array.add(iva,TAB11_AGVE03,LF_TAB1100B);
}
else if (aliq == 9.00)
{
array.add(imp,TAB11_AGME04,LF_TAB1100B);
array.add(iva,TAB11_AGVE04,LF_TAB1100B);
}
}
} // is_vendita
// Boia chi linka!
// Sommatoria per il calcolo aliquote medie vendite/acquisti...
if (_pim->get_bool("B3")) // E' un record valido per fare questa cosa?
{
if ((tiporeg)_pim->get_long("I1") == vendita)
{ //vendite
vtot += imp; ivav+=iva;
}
else
//acquisti
if (tipodet != 9) // Evita di sommare quelli con tipo detraibilita' 9 (MI2209)
{
atot += imp; ivaa+=iva;
}
}
}
// Scorre i corrispettivi lordi accumulati, li scorpora ed aggiorna i righi relativi
for (cc = (_CorrItem *)corr_ann.first_item(); cc != NULL; cc = (_CorrItem *)corr_ann.succ_item())
{
lordo2netto(cc->_totale,imp,iva,cc->_aliquota/CENTO);
vtot += imp; ivav += iva;
if (cc->_aliquota == 4.00)
{
array.add(imp,TAB11_EC101);
array.add(iva,TAB11_EC201);
}
else if (cc->_aliquota == 9.00)
{
array.add(imp,TAB11_EC102);
array.add(iva,TAB11_EC202);
}
else if (cc->_aliquota == 10.00)
{
array.add(imp,TAB11_EC103);
array.add(iva,TAB11_EC203);
}
else if (cc->_aliquota == 13.00)
{
array.add(imp,TAB11_EC104);
array.add(iva,TAB11_EC204);
}
else if (cc->_aliquota == 16.00)
{
array.add(imp,TAB11_EC105);
array.add(iva,TAB11_EC205);
}
else if (cc->_aliquota == 19.00)
{
array.add(imp,TAB11_EC106);
array.add(iva,TAB11_EC206);
}
}
// Mmmhh.. Rettifica l'importo di EC115: EC115 = EC116 + EC117 + EC115
real r16, r17;
if (array.is_key(TAB11_EC116))
r16 = ((_Iva11Item&)array[TAB11_EC116]).value();
if (array.is_key(TAB11_EC117))
r17 = ((_Iva11Item&)array[TAB11_EC117]).value();
r17+=r16;
array.add(r17,TAB11_EC115);
// Calcola le maledette aliquote medie...
real alv,ala;
if (vtot != 0.0) { alv = ivav/vtot; alv *= CENTO; alv.round(2); }
if (atot != 0.0) { ala = ivaa/atot; ala *= CENTO; ala.round(2); }
array.add(ala,TAB11_R1,LF_TAB1100B);
array.add(alv,TAB11_R2,LF_TAB1100B);
// Mo' si pappa i PLM per compilare T1, T1C, T2, T2C, T3, T5 e T6
// ATTENZIONE: solo per i regimi 74ter (ag. viaggio)
for (_plm->first();!_plm->eof();_plm->next())
{
if (_year != *_plm_anno || atoi(*_plm_mese) != 13) continue;
cur_att = *_plm_codatt;
cur_att.rtrim(1);
if (codatt != cur_att) continue;
if (_isviaggio)
{
array.add(_plm->get_real("R5"),TAB11_T1,LF_TAB1100B);
array.add(_plm->get_real("R7"),TAB11_T1C,LF_TAB1100B);
array.add(_plm->get_real("R6"),TAB11_T2,LF_TAB1100B);
array.add(_plm->get_real("R8"),TAB11_T2C,LF_TAB1100B);
array.add(_plm->get_real("R9"),TAB11_T3,LF_TAB1100B);
array.add(_plm->get_real("R10"),TAB11_T5,LF_TAB1100B);
array.add(_plm->get_real("R11"),TAB11_T6,LF_TAB1100B);
}
array.add(_plm->get_real("R0"),TAB11_IVVENR);
}
_iva11_arr.add(codatt,array,is_key);
}
void TLiquidazione_app::iva11_write(bool reset_r1r2)
// Trasferisce i dati IVA11 annuali dall'assoc_array al file tab1100
{
const int items = _iva11_arr.items();
if (items == 0) return;
TString ditta,attiv,fld_name;
_Iva11Array * iva11_arr;
_Iva11Item * iva11;
int i=0,err;
// Ciclo sulle attivita'
for (iva11_arr = (_Iva11Array *) _iva11_arr.first_item(); iva11_arr != NULL && i < items; i++,iva11_arr = (_Iva11Array*)_iva11_arr.succ_item())
{
// Setta i campi chiave per entrambi i files della relazione
ditta.format("%05ld",_nditte->curr().get_long(NDT_CODDITTA));
attiv = _iva11_arr.get_hashobj()->key();
TLocalisamfile& tab1100a = _tab11->lfile();
TLocalisamfile& tab1100b = _tab11->lfile(LF_TAB1100B);
tab1100a.zero();
tab1100a.put(TAB11_TADITT,ditta);
tab1100a.put(TAB11_TACATT,attiv);
tab1100b.zero();
tab1100b.put(TAB11_TADITT,ditta);
tab1100b.put(TAB11_TACATT,attiv);
const int iva11_items = iva11_arr->items();
int j=0;
// Ciclo sugli elementi per compilare i campi della relazione
for (iva11 = (_Iva11Item *)iva11_arr->first_item(); iva11 != NULL && j<iva11_items;j++,iva11 = (_Iva11Item *)iva11_arr->succ_item())
{
fld_name = iva11_arr->get_hashobj()->key();
if (reset_r1r2 && (fld_name == TAB11_R1 || fld_name == TAB11_R2)) continue; // salta R1/R2 se devono rimanere a zero
_tab11->lfile(iva11->file()).put(fld_name,iva11->value());
}
if (_tab11->write() != NOERR)
if ((err=_tab11->rewrite()) != NOERR)
error_box("Errore %d tentando di scrivere sul file tab1100.",err);
}
_iva11_arr.destroy(); // resetta l'array.
}
void TLiquidazione_app::write_liq(int month, const char* codatts)
// Calcolo liq. mensili e liq. annuali. Scrive le lim
{
TToken_string atts(codatts);
const char* tmpatt;
if (_ver->read(atoi(_year),_month)!=NOERR)
warning_box("Errore %d in lettura tabella versamenti ed interessi.",_ver->status());
// evita casino se differita ma si sta ricalcolando il primo
// mese con ricalcolo di piu' mesi
bool wasdifferita = (_isdifferita && month <= _monthinatt &&
_month > _monthinatt);
if (wasdifferita) _isdifferita = FALSE;
// liq. differita: considera mese precedente (solo per i risultati)
int deltam = month;
if (_isdifferita && !is_first_month(month) && month != 13)
month -= (_freqviva == "T" ? 3 : 1);
deltam -= month;
real risultato = 0.0;
real detrazioni = 0.0;
real versamenti = 0.0;
real vers_int = 0.0;
real rimborsi = 0.0;
real rettifiche = 0.0;
real res_debt = 0.0;
real res_cred = 0.0;
real cred_prec = 0.0;
real debt_precd = 0.0;
real acc_dec = 0.0;
real iva_vend = 0.0;
real iva_acq = 0.0;
real conguaglio = 0.0;
// totali per regimi agricoli
real acq_noCEE = 0.0;
real iva_detIA = 0.0;
real imp_agr1 = 0.0;
real imp_agr2 = 0.0;
// totali per agenzie viaggio
real c_iCEE = 0.0;
real c_eCEE = 0.0;
real a_iCEE = 0.0;
real a_eCEE = 0.0;
real c_mCEE = 0.0;
real a_mCEE = 0.0;
real a_meCEE = 0.0;
real cred_cost = 0.0;
real deb_mens = 0.0;
real perc_r = 0.0;
// totali per annuali
real vol_aff_1 = 0.0;
real vol_aff_2 = 0.0;
real vol_aff_t = 0.0;
real vol_aff_l = 0.0;
real tot_cong = 0.0;
bool differita = FALSE;
bool almeno_una_agricola = FALSE;
bool almeno_una_normale = FALSE;
int attc = 0; // counter attivita'
TLocalisamfile& attiv = _nditte->lfile(LF_ATTIV);
while ((tmpatt = atts.get()) != NULL)
{
TString att(tmpatt);
// Reperisce il flag di regime agricolo per ogni attivita'...
attiv.put(ATT_CODATT,att);
attiv.read();
const bool attivita_agricola = attiv.get_bool(ATT_REGAGR);
almeno_una_agricola |= attivita_agricola;
almeno_una_normale |= !attivita_agricola;
if (_isdifferita && is_first_month(month+deltam))
{
// usa i totali del mese di dicembre dell'anno
// precedente
differita = TRUE;
TString yr(_year);
_year = format("%d", atoi(_year)-1);
if (!look_lim(12)) //controlla solamente, il vero posizionamento lo fa dopo
{
_year = yr;
differita = FALSE;
}
}
for (int m = 1; m <= 13; m++)
{
// ciclo su tutti i mesi del caso (1 o 3;
// tutti se annuale)
if (!is_month_ok(m, month))
continue;
look_plm(differita ? 12 : m, att);
bool is_lim = look_lim(_isdifferita ? m+deltam : m);
// Se trattasi di annuale considera solo PLM/PUM del mese 13
if ((month == 13 && m == 13) || month != 13)
{
// gia' conteggiato: prorata
// da conteggiare: IVA vendite ag. viaggio
// a debito: IVA vendite, debito precedente
// a credito: IVA acquisti, ulteriori detrazioni 1 e 2
if (!attivita_agricola)
{
iva_vend += _plm->get_real("R0");
iva_acq += _plm->get_real("R1");
risultato += (_plm->get_real("R0") - _plm->get_real("R1"));
res_debt += _plm->get_real("R0");
res_cred += _plm->get_real("R1");
}
else
{
// Tiene aggiornata l'iva vendite
iva_vend += _plm->get_real("R6") + _plm->get_real("R5");
// Tiene aggiornata l'iva acquisti, che andra' rettificata all'uscita del mese
// secondo la formula:
// iva_acq = iva_acq + iva detraibile calcolata + iva compensazione
// L'iva di compensazione e' tratta dall'iva vendite agricole con segnalino 1 (vedi tabella PIA)
// il cui totale e' memorizzato in plm->R13
// l'iva detraibile calcolata e' a sua volta fatta cosi'
// sum(plm->R11) * { sum(pum->R11) / [sum(pum->R11) + sum(pum->R10)]}
// dove plm->R11 = acquisti misti fuori CEE
// pum->R10 = tot. imponibile reg agr. 1
// pum->R11 = tot. imponibile reg agr. 2
iva_acq += _plm->get_real("R7") + _plm->get_real("R5");
acq_noCEE += _plm->get_real("R11");
iva_detIA += _plm->get_real("R13");
imp_agr1 += _pum->get_real("R10");
imp_agr2 += _pum->get_real("R11");
}
detrazioni+= (_plm->get_real("R3") + _plm->get_real("R4"));
// detrazioni solo non in regime agricolo
if (!attivita_agricola)
{
risultato -= (_plm->get_real("R3") + _plm->get_real("R4"));
res_cred += (_plm->get_real("R3") + _plm->get_real("R4"));
}
/* totalizza importi 74 ter */
if (_isviaggio)
{
// somma totali per calcolo successivo
c_iCEE += _plm->get_real("R5");
c_eCEE += _plm->get_real("R6");
a_iCEE += _plm->get_real("R7");
a_eCEE += _plm->get_real("R8");
c_mCEE += _plm->get_real("R9");
a_mCEE += _plm->get_real("R10");
a_meCEE += _plm->get_real("R11");
}
} // endif per considerare solo PLM del mese 13
// Le seguenti cose (versamenti, rettifiche e rimborsi)
// vanno considerate per tutti i mesi (tabella lim)
/* se annuale, somma versamenti mesi 1-12
* solo una volta (non per tutte le attivita')
*/
if (attc == 0 && month == 13)
{
// l'acconto a dicembre si conteggia a parte solo
// nei casi previsti e non in annuale (vedi sotto)
real vs(versamenti_IVA(m , m == 12 ? "1" : "1|7"));
real vi(versamenti_IVA(m,"5"));
versamenti += vs;
vers_int += vi;
res_cred += vs + vi;
}
/*
* rimborso se chiesto e previsto
* in annuale non si chiede e non va sommato se no lo cumula
*/
if (attc == 0 && is_lim && m < 13)
{
risultato += _lim->get_real("R1");
rimborsi += _lim->get_real("R1");
res_debt += _lim->get_real("R1");
}
/*
* rettifiche gia' col loro bravo segno
*/
if (attc == 0 && is_lim)
{
// se sono per benzinaro le conta solo in annuale,
// se no vanno solo in periodica
// almeno cosi' dicevano fino ad agosto
// poi, sara' il caldo, mi hanno detto che e' sbagliato
TString descrett(_lim->get("S0"));
bool isforbenzinaro = descrett[0] == '$' ||
(descrett[0] == '>' && descrett[1] == '>');
if (/*(isforbenzinaro && _isannual) || ...alla cincia quest'idea non piaceva piu'
(!isforbenzinaro && !_isannual) adesso la storia e' cosi':
in ANNUALE solo se benzinaro, altrimenti niente; diversamente tutto*/
!(month == 13 && !isforbenzinaro) && m < 13)
{
risultato += _lim->get_real("R5");
rettifiche += _lim->get_real("R5");
if (_lim->get_real("R5").sign() < 0)
res_cred += abs(_lim->get_real("R5"));
else
res_debt += abs(_lim->get_real("R5"));
}
}
} // fine ciclo sul mese
// counter attivita' per evitare troppi versamenti
attc++;
if (differita)
_year = format("%d", atoi(_year)+1);
if (!(_isdifferita && is_first_month(month+deltam)))
{
if (_isviaggio)
{
// calcolo credito costo, debito mensile, perc. ripart.
perc_r = (a_mCEE * CENTO)/(a_mCEE + a_meCEE); perc_r.round(2);
real ivm = (c_mCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA);
real tc = (c_iCEE + ivm);
real ta = (a_iCEE + a_mCEE);
real bi = tc - ta - credito_costo_prec(month);
if (bi.sign() < 0)
// credito di costo
{
cred_cost = abs(bi);
cred_cost.round(ROUND_LIRA);
}
else
{
deb_mens = (bi /((CENTO + aliquota_agvia())/CENTO)) *
(aliquota_agvia()/CENTO);
deb_mens.ceil(ROUND_LIRA); // ceil voluto MI3074
risultato += deb_mens;
res_debt += deb_mens;
iva_vend += deb_mens;
}
}
}
if (attivita_agricola)
{
real perc; // percentuale di deducibilita'
real iva_ded; // iva deducibile
perc = imp_agr2 /(imp_agr1 + imp_agr2);
perc.round(2);
iva_ded = acq_noCEE * perc;
iva_ded.round(ROUND_LIRA);
iva_acq += iva_ded + iva_detIA;
res_debt += iva_vend;
res_cred += iva_acq;
risultato += (iva_vend - iva_acq);
} // __ end of agricolo
} // end ciclo su attivita'
if (month < 13) // va bene anche se differita sommando deltam (che e' 0 normalmente)
{
// toglie credito precedente
cred_prec = credito_prec(month+deltam);
risultato -= cred_prec;
res_cred += cred_prec;
// vedi se c'era un debito precedente per debiti < 50.000
debt_precd = debt_prec(month+deltam);
risultato += debt_precd;
res_debt += debt_precd;
}
else
{
// per l'annuale considera solo il credito a inizio anno
cred_prec = credito_prec(_freqviva == "M" ? 1 : 3);
risultato -= cred_prec;
res_cred += cred_prec;
}
if (month == 13)
{
// totalizza volumi affari e calcola nuovo prorata
// per tutte le attivita'
atts.restart();
while ((tmpatt = atts.get()) != NULL)
{
TString att(tmpatt);
int tipoatt = att[att.len() -1] - '0';
if (tipoatt == 1) // su PLA l'attivita' e' sempre 1
{
if (!look_pla(att)) continue;
real vf1 = _pla->get_real("R14");
real vf2(_pla->get("S1"));
real iaq = _pla->get_real("R11"); // IVA acquisti
real ppg = _pla->get_real("R12"); // pro-rata pagato
vol_aff_1 += vf1;
vol_aff_2 += vf2;
vol_aff_t = vf1 + vf2;
vol_aff_l += _pla->get_real("R0"); // volume affari lordo
real es_b1 = _pla->get_real("R1");
real es_b2 = _pla->get_real("R2");
real es_b3 = _pla->get_real("R3");
real csamm = _pla->get_real("R4");
// calcola nuovo prorata per ogni attivita' (miste: 1+2)
real ris = vol_aff_t; // gia' esclusi: NS, B3, cess. amm
real prorata(0.0);
if (!ris.is_zero())
prorata = (es_b1/ris) * CENTO;
real conguaglio = 0.0;
prorata.round(ROUND_LIRA);
if (prorata != _prorata)
{
// calcolo conguaglio -- se positivo e' a debito
real topay;
if (prorata > 0.0)
{
topay = (iaq + ppg) * (prorata / CENTO);
//topay.round(ROUND_MILLELIRE);
round_mille_lire(topay);
}
conguaglio = topay - ppg;
//conguaglio.round(ROUND_MILLELIRE);
round_mille_lire(conguaglio);
}
if (prorata < 0.0) prorata = 0.0;
_pla->put("R9", conguaglio);
_pla->put("R10",prorata);
tot_cong += conguaglio;
_pla->rewrite();
// scrivi nuovo prorata in tabella anno successivo
TString yr = _year;
_year = format("%d", atoi(_year) + 1);
look_pla(att, TRUE);
_pla->put("R8", prorata);
_pla->rewrite();
if (look_lia(0l, TRUE))
{
_lia->put("R5", cred_cost);
_lia->rewrite();
}
_year = yr;
}
}
look_lia();
_lia->put("R1", vol_aff_l);
_lia->put("R2", vol_aff_1);
_lia->put("R3", vol_aff_2);
_lia->rewrite();
}
// comprende anche il conguaglio prorata
risultato += tot_cong;
if (tot_cong.sign() > 0) res_debt += tot_cong;
if (tot_cong.sign() < 0) res_cred += abs(tot_cong);
look_lim(month+deltam,TRUE);
// azzeriamo tutto (tranne r1, r5, s1, s0, s7)
TString codtab = _lim->get("CODTAB");
real r5 = _lim->get("R5");
real r1 = _lim->get("R1");
TString s7 = _lim->get("S7");
TString s0 = _lim->get("S0");
TString s1 = _lim->get("S1");
bool wasb0 = _lim->get_bool("B0");
bool wasb1 = _lim->get_bool("B1");
_lim->zero();
_lim->put("CODTAB", codtab);
_lim->put("R1", r1);
_lim->put("R5", r5);
_lim->put("S0", s0);
_lim->put("S1", s1);
_lim->put("S7", s7);
_lim->put("B0", wasb0 ? "X" : "");
_lim->put("B1", wasb1 ? "X" : "");
/*
* versamenti effettuati: si conteggiano in R0,
* sono > 0 solo se andavano calcolati (vedi sopra)
*/
risultato -= versamenti + vers_int;
/*
* acconto dicembre se previsto
*/
if (((month+deltam) >= 12 && _freqviva == "M") || //solo freq. M puo'
(month == 12 && _isbenzinaro && _gest4) || //essere differita
(month == 13 && _freqviva == "T"))
{
acc_dec = versamenti_IVA(12,"7");
risultato -= acc_dec;
res_cred += acc_dec;
}
// in annuale si arrotondera' a 1000 in stampa
// se no il conguaglio prorata fa casino
risultato.round(ROUND_LIRA);
_lim->put("R0",risultato);
_lim->put("R2",cred_cost);
_lim->put("R3",deb_mens);
_lim->put("R4",perc_r);
if (almeno_una_normale)
_lim->put("R6",detrazioni);
else // per evitare sbagli nei ricalcoli esterni
_lim->put("R6","");
if (month == 13 || differita)
{
// scrivi totali rettifiche e rimborsi
// nella finale oppure se copiati da
// anno precedente
_lim->put("R1",rimborsi);
_lim->put("R5",rettifiche);
}
/*
* Interessi dovuti solo da trimestrali in periodica,
* Era anche non benzinari, smentito da Cinzia (MI0853);
* Ora gestito esplicitamente nei parametri ditta, forzato
* FALSE per ditte mensili e liq. annuale
* Ulteriormente smentito e rettificato
*/
bool true_trim = (month == 3 || month == 6 || month == 9);
if (_isintr && ( true_trim || (month == 12 && _isbenzinaro && _gest4)
|| (month == 13 && !(_isbenzinaro && _gest4)) ))
{
real interesse = interesse_trimestrale(_month);
real ivi = risultato * (interesse / CENTO);
ivi.ceil(ROUND_LIRA);
_lim->put("R14", ivi);
}
//questo serve anche per la visualizzazione e per l'estrazione deleghe
if (_isintr && ( true_trim || (month == 12 && _isbenzinaro && _gest4)
|| (month == 13 && !(_isbenzinaro && _gest4)) ))
_lim->put("R10",interesse_trimestrale(_month));
// totale conguaglio su tutte le attivita'
_lim->put("R7", tot_cong);
_lim->put("R8", versamenti);
_lim->put("R9", vers_int);
_lam->put("R0", iva_vend);
_lam->put("R1", iva_acq);
_lam->put("R2", cred_prec);
_lam->put("R3", debt_precd);
_lim->put("R11", acc_dec);
_lim->put("R12", res_cred);
_lim->put("R13", res_debt);
if (!_recalc_only && _recalc != never)
{
_lim->put("B0","X");
_lim->put("B1","X");
}
if (_recalc_only) _lim->put("B1", "X");
if (wasdifferita) _isdifferita = TRUE;
// AWFUL! se siamo in annuale, occorre arrotondare alle 1000 lire
// TUTTI gli ADDENDI e non il risultato. Cio' e' disonesto e mostruoso;
// siccome sa di ricorso al TAR nonche' di errore della Prassi
// schiaffo tutto il codice nell'IF che segue, e se lo si vuole togliere
// non si fara' che scancellare tutto il blocco
if (month == 13)
{
// molto codice duplicato, ma ne val la pena (vedi sopra)
round_mille_lire(iva_vend);
round_mille_lire(iva_acq);
round_mille_lire(detrazioni);
round_mille_lire(versamenti);
round_mille_lire(vers_int);
round_mille_lire(rimborsi);
round_mille_lire(rettifiche);
round_mille_lire(deb_mens);
round_mille_lire(cred_prec);
round_mille_lire(tot_cong);
round_mille_lire(acc_dec);
round_mille_lire(debt_precd);
res_cred = iva_acq + versamenti + vers_int + cred_prec + acc_dec;
res_debt = iva_vend + rimborsi + debt_precd; // Tolto la somma di deb_mens, perche' gia' presente in iva_vend
if (tot_cong.sign() > 0) res_debt += tot_cong;
else res_cred -= tot_cong;
if (rettifiche.sign() > 0) res_debt += rettifiche;
else res_cred -= rettifiche;
if (almeno_una_normale)
res_cred += detrazioni;
risultato = res_debt - res_cred;
// tut ricalcule', riscrivem
_lim->put("R0", risultato);
_lim->put("R2", cred_cost);
_lim->put("R3", deb_mens);
_lim->put("R1", rimborsi);
_lim->put("R5", rettifiche);
_lim->put("R7", tot_cong);
_lim->put("R8", versamenti);
_lim->put("R9", vers_int);
_lam->put("R0", iva_vend);
_lam->put("R1", iva_acq);
_lam->put("R2", cred_prec);
_lam->put("R3", debt_precd);
_lim->put("R11", acc_dec);
_lim->put("R12", res_cred);
_lim->put("R13", res_debt);
// ciapa
}
_lim->rewrite();
_lam->rewrite();
}
void TLiquidazione_app::recalc_annual(const char* att)
{
// viene chiamata 2 volte per le att. miste; PLA e' stata
// azzerata dove serve da update_firm se siamo all'annuale
real es_b1 = 0.0;
real es_b2 = 0.0;
real es_b3 = 0.0;
real cess_amm = 0.0;
real vendite = 0.0;
real pro_pag = 0.0;
real iva_acq = 0.0;
real ven_lrd = 0.0;
real volaff1 = 0.0;
real volaff2 = 0.0;
real imp_ifs = 0.0;
real imp_af = 0.0;
real imp_a13 = 0.0;
TString16 codiva,reg,tiva;
TToken_string a13("",'!');
int tipoatt = att[strlen(att) -1] - '0';
TString aaa(att);
look_pla(aaa);
volaff1 = _pla->get_real("R14");
volaff2 = (const char*)_pla->get("S1");
vendite = _pla->get_real("R0");
es_b1 = _pla->get_real("R1");
es_b2 = _pla->get_real("R2");
es_b3 = _pla->get_real("R3");
cess_amm = _pla->get_real("R4");
pro_pag = _pla->get_real("R12");
iva_acq = _pla->get_real("R11");
// Per avere un risultato corretto, si deve totalizzare PIM->R3 per codice iva
// e quindi effettuare lo scorporo dell'imponibile e aggiungere al relativo volume d'affari
TAssoc_array corr_ann;
_CorrItem cx,*cc;
bool is_key;
for (_pim->first(); !_pim->eof(); _pim->next())
{
if (_year != *_pim_anno || _month != atoi(*_pim_mese)) // In questo caso _month vale sempre 13
continue;
int tipocr = atoi(*_pim_tipocr);
codiva = *_pim_codiva;
reg = *_pim_codreg;
look_iva(codiva); look_reg(reg);
tiva = _iva->get("S1");
int biva = (int)_iva->get_long("I3");
tiporeg treg = (tiporeg)_reg->get_long("I0");
const bool corrisp = _reg->get_bool("B0");
const bool simp = _reg->get_bool("B1");
imp_ifs = _pim->get_real("R0");
imp_af = _pim->get_real("R7");
a13 = _pim->get("S0");
imp_a13 = a13.get(0);
imp_ifs -= imp_af + imp_a13; // Toglie le autofatture e le op. A13
if (corrisp)
{
imp_ifs += _pim->get_real("R5"); // Se corrisp. aggiunge le FS
is_key = corr_ann.is_key(codiva);
cx._totale = 0;
_CorrItem& ca = is_key ? (_CorrItem&) corr_ann[codiva] : cx;
ca._totale += _pim->get_real("R3");
if (!is_key) // se non c'e' lo aggiunge
{
ca._aliquota = _iva->get_real("R0")/CENTO; // Se e' nuovo setta l'aliquota
corr_ann.add(codiva,ca);
}
}
if ( // ESCLUSI:
strcmp(att,*_pim_codatt) != 0 ||
treg != vendita || // non vendite
tipocr == 4 || // cessioni beni ammortizzabili
tiva == "NS" || // non soggetti
biva == 3 || // bi tre
simp) // sospensione di imposta
continue;
if (tipoatt == 1)
volaff1 += imp_ifs;
else
volaff2 += imp_ifs;
}
// Ora si scorporano i corrispettivi raggruppati per codice IVA e si totalizzano gli imponibili
// calcolati, da aggiungere poi a volaff1 o volaff2
real imp,iva;
for (cc = (_CorrItem *)corr_ann.first_item(); cc != NULL; cc = (_CorrItem *)corr_ann.succ_item())
{
lordo2netto(cc->_totale,imp,iva,cc->_aliquota);
if (tipoatt == 1)
volaff1 += imp;
else
volaff2 += imp;
}
// calcola esenti, cessioni, lordo vendite, prorata pagato
// e IVA acquisti dai plm/ptm/pum/pam/pom
for (int i = 1; i <= 12; i++)
{
if (!look_plm(i,aaa))
continue;
vendite += _pam->get_real("R1");
iva_acq += _plm->get_real("R1");
es_b1 += _pum->get_real("R4");
es_b2 += _pum->get_real("R5");
es_b3 += _pum->get_real("R6");
cess_amm += _pum->get_real("R0");
pro_pag += _plm->get_real("R2");
}
// Modifiche per PIM13
if (look_plm(13,aaa))
{
// Nota:
// l'iva acquisti del mese 13 memorizzata in PLM->R1, e' si' la sommatoria
// di tutte le imposte relative agli acquisti di tutti i mesi, ma andrebbe sottratto il
// totale prorata pagato (pro_pag), reperibile dai mesi precedenti (PLM->R2)
real iv = _plm->get_real("R1"); // Iva acquisti annuale
iv -= pro_pag; // Si sottraggano i prorata pagati
_plm->put("R1",iv); // Si riscriva il tutto
_plm->rewrite();
}
_pla->put("R0", vendite);
_pla->put("R1", es_b1);
_pla->put("R2", es_b2);
_pla->put("R3", es_b3);
_pla->put("R4", cess_amm);
_pla->put("R11", iva_acq);
_pla->put("R12", pro_pag);
_pla->put("R14", volaff1);
_pla->put("S1", volaff2.string());
_pla->rewrite();
}