661f6ce254
in tal modo non faceva piu' un tubo. git-svn-id: svn://10.65.10.50/trunk@5532 c028cbd2-c16b-5b4b-a496-9718f37d4682
2768 lines
90 KiB
C++
Executable File
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");
|
|
}
|
|
// 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();
|
|
}
|
|
|