Riportate modifiche dalla R_97_03_01M

git-svn-id: svn://10.65.10.50/trunk@5787 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1997-12-24 09:40:34 +00:00
parent 2ecd366aa3
commit 5dba0c34a0
18 changed files with 1145 additions and 194 deletions

View File

@ -1,5 +1,19 @@
#include "cg1500.h"
TOOLBAR "" 0 20 0 2
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
PAGE "Stampa bilancio" -1 -1 76 16
NUMBER F_CODDITTA 5
@ -173,16 +187,6 @@ BEGIN
PROMPT 2 13 "Quadratura con Libro Giornale"
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
PAGE "Parametri bilancio di verifica" -1 -1 74 20
@ -239,16 +243,6 @@ BEGIN
ITEM "2|Alfabetico"
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -343,7 +343,7 @@ bool TConti_array::remove_iva(bool det)
}
HIDDEN bool detraibile(const TRectype& row, const TCausale& cau)
bool TMovimentoPN::detraibile(const TRectype& row, const TCausale& cau) const
{
if (cau.iva() == iva_vendite) // Vendite sempre detraibili
return TRUE;
@ -351,9 +351,10 @@ HIDDEN bool detraibile(const TRectype& row, const TCausale& cau)
const int tipo_det = row.get_int(RMI_TIPODET); // Leggi tipo detraibilita
if (tipo_det != 0)
return FALSE;
const real& prorata = cau.reg().prorata();
return prorata < 100.0; // Se prorata = 100% e' indetraibile
const int annodoc = curr().get_date(MOV_DATADOC).year();
const bool prorata100 = cau.reg().prorata100(annodoc);
return !prorata100; // Se prorata = 100% e' indetraibile
}
// Aggiusta i row types se sono andati persi o non sono stati convertiti

View File

@ -21,11 +21,14 @@
#include <rmoviva.h>
#endif
#ifndef __CGLIB01_H
class TRegistro;
#endif
#ifndef __CG2103_H
class TCausale;
#endif
class TMovimentoPN : public TRelation
{
// class TMovimentoPN : public TRelation
@ -41,6 +44,9 @@ protected:
int registra(bool re, bool force);
int read_mov_rows();
bool detraibile(const TRectype& row, const TCausale& cau) const;
// @END
public:

View File

@ -110,16 +110,18 @@ bool TPrimanota_application::suspended_handler(TMask_field& f, KEY k)
// Determina se un codice detrazione e' di tipo detraibile o no
// Certified 70%
bool TPrimanota_application::detraibile(TToken_string& row)
{
if (app().iva() == iva_vendite) // Vendite sempre detraibili
{
const TPrimanota_application& a = app();
if (a.iva() == iva_vendite) // Vendite sempre detraibili
return TRUE;
const int tipo_det = row.get_int(2); // Leggi tipo detraibilita
if (tipo_det != 0)
return FALSE;
const real& prorata = app().causale().reg().prorata();
return prorata < 100.0; // Se prorata = 100% e' indetraibile
const int annodoc = a._msk[2]->get_date(F_DATADOC).year();
const bool prorata100 = a.causale().reg().prorata100(annodoc);
return !prorata100; // Se prorata = 100% e' indetraibile
}
///////////////////////////////////////////////////////////

View File

@ -321,8 +321,9 @@ bool TPrimanota_application::test_prorata()
bool ok = TRUE;
if (esistono_righe_senza_tipo_detrazione)
{
const bool prorata100 = causale().reg().prorata() >= 100.0;
{
const int annodoc = _msk[2]->get_date(F_DATADOC).year();
const bool prorata100 = causale().reg().prorata100(annodoc);
const bool esiste_riga_iva_detraibile = type2pos('D') >= 0;
if (prorata100)
ok = !esiste_riga_iva_detraibile;
@ -341,7 +342,8 @@ bool TPrimanota_application::aggiusta_prorata()
return FALSE;
TRegistro& reg = causale().reg();
const real prorata_attuale = reg.prorata();
const int annodoc = _msk[2]->get_date(F_DATADOC).year();
const real prorata_attuale = reg.prorata(annodoc);
const real vecchio_prorata = prorata_attuale < 100.0 ? 100.0 : 0.0;
TSheet_field& iva_sheet = ivas();
@ -354,12 +356,12 @@ bool TPrimanota_application::aggiusta_prorata()
if (!r.empty_items())
{
oldrow = r; // Memorizza riga iva
reg.set_prorata(vecchio_prorata);
reg.set_prorata(annodoc, vecchio_prorata);
iva_notify(iva_sheet, i, K_SPACE);
r.add("", 0); r.add("", 3); // Simula l'azzeramento degli importi
iva_notify(iva_sheet, i, K_ENTER); // Simula uscita dalla riga
reg.set_prorata(prorata_attuale);
reg.set_prorata(annodoc, prorata_attuale);
iva_notify(iva_sheet, i, K_SPACE);
r = oldrow; // Simula riscrittura importi
iva_notify(iva_sheet, i, K_ENTER); // Simula uscita dalla riga
@ -393,17 +395,14 @@ bool TPrimanota_application::easydoc_installed()
return FALSE;
// where is EasyDoc installed?
TFilename szBuf;
int entrylen = GetPrivateProfileString("Easydoc", "Path", "\\EASYDOC",
szBuf.get_buffer(), szBuf.size(),
"EasyDoc.ini");
GetPrivateProfileString("Easydoc", "Path", "\\EASYDOC",
_EasyDocPath.get_buffer(), _EasyDocPath.size(),
"EasyDoc.ini");
// EasyDoc there isn't
if (!entrylen)
if (_EasyDocPath.empty())
return FALSE;
// paste EasyDoc path
szBuf[entrylen] = '\0';
_EasyDocPath = szBuf;
_EasyDocPath.add("EASYDOC.EXE");
// is EasyDoc present?
@ -438,11 +437,12 @@ bool TPrimanota_application::run_easydoc(const char* azione) const
TFilename dati_dir = get_firm_dir();
// completa path relativo,
// ma che male c'era a registrarlo sempre assoluto??
if (dati_dir[0] == '\\' || dati_dir[0] == '/' || dati_dir[1] != ':')
if (dati_dir.is_relative_path())
{
TFilename modulename(argv(0));
dati_dir = modulename.path();
dati_dir.add(get_firm_dir());
modulename = modulename.path();
modulename.add(dati_dir);
dati_dir = modulename;
}
// rimuove barre e controbarre per dargli un aspetto decente

View File

@ -44,6 +44,27 @@ void _Iva11Array::zero(const char* fld_name)
bi.value() = 0.0;
}
// Methods of _ProrataItem
void _ProrataItem::set(const int a, const real& c, const real& p, const bool fl)
{
_current_perc = c;
_previous_ok = a < 1998 ? TRUE : fl;
if (a > 1997 ) // Se siamo prima del 1997 la percentuale prec vale 0
if (!_previous_ok) // Se non ha trovato la percentuale anno precedente
_previous_perc = c; // usa quella attuale ricordandosi la segnalazione
else
_previous_perc = p;
}
// Calcola prorata con percentuale attuale o corrente
real _ProrataItem::calc_prorata(const real& acq, const bool current)
{
real prorata = acq * ((current ? _current_perc : _previous_perc) / 100.0);
prorata.round(ROUND_LIRA);
return prorata;
}
// Methods of application!
real TLiquidazione_app::CENTO(100.0);
@ -682,7 +703,7 @@ bool TLiquidazione_app::lst_tm_handler(TMask_field& f, KEY key)
if (change)
{
app().begin_wait();
//app().reset_choices(f.mask());
app().reset_choices(f.mask());
app().set_month(m);
app().build_ditte_sheet(f.mask().source_file() == "cg4300a.msk" ?
(wht)atoi(f.mask().get(CG43_RDB_VERS)) :

View File

@ -157,7 +157,7 @@ public:
word _f0, _f1, _f2, _f3;
TString _s0, _s1, _s2, _s3, _s4, _s5;
real _r0, _r1, _r2, _r3, _r4, _r5,
_r6, _r7, _r8, _r9, _r10,_r11;
_r6, _r7, _r8, _r9, _r10,_r11, _r12, _r13, _r14;
TArray _arr;
TDate _d0;
@ -206,6 +206,22 @@ public:
virtual ~_Iva11Array() {}
};
// _ProrataItem serve per calcolare prorata dal 1998
class _ProrataItem : public TObject
{
real _current_perc; // Percentuale prorata anno in corso
real _previous_perc; // Percentuale prorata anno precedente
bool _previous_ok; // Flag per indicare se presente tabella anno precedente
public:
void set(const int a, const real& c, const real& p, const bool fl = TRUE);
real calc_prorata(const real& acq, const bool current = TRUE);
const real& current() { return _current_perc; }
const real& previous() { return _previous_perc; }
const bool flag() { return _previous_ok; }
_ProrataItem() {}
virtual ~_ProrataItem() {}
};
// ------------------------------------------------------------------------
// Application
// ------------------------------------------------------------------------
@ -274,7 +290,8 @@ class TLiquidazione_app : public TPrint_application
// totali vari per attivita'
real _p8, _p8b, _p9; // totali plafond
real _prorata; // percentuale indetraibilita' (prorata)
_ProrataItem
_prorata; // Mini cazzetto per calcoli prorata
long __firm; // ditta selezionata all'inizio
bool _is_interactive; // lanciata da menu o da altro prog
bool _is_visliq; // lanciata da visualizzazione liquidazione

View File

@ -1,5 +1,5 @@
#include "cg4300a.h"
PAGE "Calcolo Liquidazioni" -1 -1 68 15
PAGE "Calcolo Liquidazioni" -1 -1 68 16
RADIOBUTTON CG43_RDB_VERS 16
BEGIN
@ -9,48 +9,21 @@ BEGIN
ITEM "3|Trimestrali" MESSAGE SHOW,CG43_LST_TRIM|HIDE,CG43_LST_MESE
END
GROUPBOX DLG_NULL 40 5
GROUPBOX DLG_NULL 38 5
BEGIN
PROMPT 23 1 "Scelta ditte"
PROMPT 26 1 "Anno/Periodo"
END
NUMBER CG43_FLD_DFR 5
NUMBER CG43_FLD_ANNO 4
BEGIN
PROMPT 24 2 "Da codice "
HELP "Codice ditta di partenza per la selezione"
FLAGS "B"
END
NUMBER CG43_FLD_DTO 5
BEGIN
PROMPT 24 3 "A codice "
HELP "Codice ditta di fine selezione"
FLAGS "B"
END
STRING CG43_FLD_SELECTED 5
BEGIN
PROMPT 24 4 "Scelte n. "
FLAGS "DR"
END
BUTTON CG43_BUT_SEL 10 2
BEGIN
PROMPT 48 2 "~Selezione"
PICTURE BMP_SELECT
HELP "Selezione ditte di cui fare la liquidazione"
END
BUTTON CG43_BUT_ANN 10
BEGIN
PROMPT 48 4 "A~zzera"
HELP "Azzerare la selezione delle ditte da fare la liquidazione"
PROMPT 28 2 "Anno "
HELP "Anno per cui effettuare il calcolo"
CHECKTYPE REQUIRED
END
LIST CG43_LST_MESE 15
BEGIN
PROMPT 4 7 "Periodo "
PROMPT 28 3 "Periodo "
HELP "Mese per cui effettuare il calcolo liquidazione"
ITEM "13|13a liquid."
FLAGS "AM"
@ -58,7 +31,7 @@ END
LIST CG43_LST_TRIM 15
BEGIN
PROMPT 4 7 "Periodo "
PROMPT 28 3 "Periodo "
HELP "Trimestre di cui effettuare il calcolo liquidazione"
ITEM "3|1 Trimestre "
ITEM "6|2 Trimestre "
@ -67,16 +40,9 @@ BEGIN
ITEM "13|13a liquid."
END
NUMBER CG43_FLD_ANNO 4
BEGIN
PROMPT 32 7 "Anno "
HELP "Anno per cui effettuare il calcolo"
CHECKTYPE REQUIRED
END
LIST CG43_LST_CALC 15
BEGIN
PROMPT 4 8 "Ricalcola "
PROMPT 28 4 "Ricalcola "
HELP "Indicare se rifare il calcolo durante la stampa"
ITEM "2|Mese/trimestre"
ITEM "3|Da inizio anno"
@ -84,21 +50,59 @@ END
LIST CG43_LST_CALC_13A 15
BEGIN
PROMPT 4 8 "Ricalcola "
PROMPT 28 4 "Ricalcola "
HELP "Indicare se rifare il calcolo durante la stampa"
ITEM "3|Da inizio anno"
FLAGS "HD"
END
GROUPBOX DLG_NULL 40 5
BEGIN
PROMPT 4 6 "Scelta ditte"
END
NUMBER CG43_FLD_DFR 5
BEGIN
PROMPT 5 7 "Da codice "
HELP "Codice ditta di partenza per la selezione"
FLAGS "B"
END
NUMBER CG43_FLD_DTO 5
BEGIN
PROMPT 5 8 "A codice "
HELP "Codice ditta di fine selezione"
FLAGS "B"
END
STRING CG43_FLD_SELECTED 5
BEGIN
PROMPT 5 9 "Scelte n. "
FLAGS "DR"
END
BUTTON CG43_BUT_SEL 10 2
BEGIN
PROMPT 28 7 "~Selezione"
PICTURE BMP_SELECT
HELP "Selezione ditte di cui fare la liquidazione"
END
BUTTON CG43_BUT_ANN 10
BEGIN
PROMPT 28 9 "A~zzera"
HELP "Azzerare la selezione delle ditte da fare la liquidazione"
END
GROUPBOX DLG_NULL 60 3
BEGIN
PROMPT 4 10 "Stampa"
PROMPT 4 11 "Stampa"
END
BOOLEAN CG43_CHK_STAMPA
BEGIN
PROMPT 5 11 "Esegui "
PROMPT 5 12 "Esegui "
MESSAGE TRUE ENABLE,CG43_FLD_DATA
MESSAGE FALSE DISABLE,CG43_FLD_DATA
END
@ -106,14 +110,14 @@ END
DATE CG43_FLD_DATA
BEGIN
PROMPT 18 11 "con data "
PROMPT 18 12 "con data "
FLAGS "A"
END
BOOLEAN CG43_CHK_FINAL
BEGIN
PROMPT 45 11 "Solo stampa"
PROMPT 45 12 "Solo stampa"
// MESSAGE TRUE DISABLE,CG43_LST_CALC
// MESSAGE FALSE ENABLE,CG43_LST_CALC
END

View File

@ -235,11 +235,20 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
_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";
_mixed = _pla->get("S7") == "M" || _pla->get("S7") == "E";
TString yr(_year);
real pr1 = _pla->get_real("R8"); // Percentuale prorata anno attuale
const int anno = atoi(_year);
_year = format("%d", anno - 1);
const bool flag = look_pla(cattiv, FALSE); // Reperisce percentuale prorata anno precedente
real pr2 = _pla->get_real("R8");
_year = yr; // Risetta l'anno corretto e riposiziona la tabella...
look_pla(cattiv, FALSE);
_prorata.set(anno, pr1, pr2, flag);
}
else
_isservizio = _nditte->curr(LF_ATTIV).get("TIPOATT") == "S";
@ -339,6 +348,9 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
if ((is_month_ok_strict(month) && _month != 13 && _recalc != never) || _is_interactive /*month == 13*/ )
write_liq(month, atts);
// occorre poterla chiamare altre volte con mesi diversi
_nditte->restore_status();
// rimborso infraannuale
_DescrItem* rimb_d = NULL;
if (month == _month)
@ -501,6 +513,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
real cess_amm_iva = 0.0;
real acquisti = 0.0;
real acquisti_iva = 0.0;
real acquisti_iva_annoprec
= 0.0;
real vendite = 0.0;
real vendite_iva = 0.0;
real esenti_b1 = 0.0;
@ -541,6 +555,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
real agr_imp = 0.0;
real agr_iva = 0.0;
const int year_int = atoi(_year); // Mi sono rotto di fare sempre delle atoi()...
// Spiegazione dell'arcano segreto sulle agenzie viaggio:
// non viene applicata la setregion() al cursore perche' e' necessario
// tenere conto della DATA74TER se presente.
@ -548,8 +564,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
{
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));
TDate f(1, month == 13 ? 1 : month, year_int);
TDate t(1, month == 13 ? 12 : month, year_int);
t.set_end_month();
from.put(MOV_DATAREG, f);
to.put(MOV_DATAREG, t);
@ -585,6 +601,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
TString16 tipodoc = _mov->get("TIPODOC");
bool corrisp = _reg->get_bool("B0");
tiporeg tipomov = (tiporeg)_reg->get_long("I0");
// Controlla se la data del documento si riferisce all'anno precedente (PRORATA 1998)
TDate datedoc(_mov->get("DATADOC"));
const bool anno_doc_prec = ((year_int > 1997) && (!datedoc.ok() || datedoc.year() == year_int - 1));
if (_isviaggio && tipomov == vendita && !(_mov->get("DATA74TER").empty()))
date = _mov->get_date("DATA74TER");
@ -904,16 +923,14 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
const bool is_not_fs = tipodoc != "FS";
// Se si tratta di Fattura Fiscale o Fattura Scontrino, non scorpora
// In particolare le FS non vengono incluse ne' nello specchietto ne' nel totale
if (corrisp && tipodoc != "FF" && is_not_fs)
lordo2netto(agr_imp,agr_iva,p);
if (tipoagr == 1) // Ora si utilizza solo il segnalino 1
if (tipoagr == 1 && is_not_fs) // Ora si utilizza solo il segnalino 1
{
if (is_not_fs) // Se e' FS non aggiunge al totale vend. Ia parte tab A
{
agr_1 += agr_iva;
agr_1i += agr_imp;
}
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)
@ -1102,6 +1119,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
// totale acquisti
acquisti += imponibile;
acquisti_iva += imposta;
if (anno_doc_prec) // Se abilitato, somma l'iva acquisti relativi a documenti anno precedente
acquisti_iva_annoprec += imposta;
}
// corrispettivi
@ -1329,12 +1348,21 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
* calcola il lercio prorata
* solo se liq. periodica
*/
real prorata;
if (!_prorata.is_zero() && month != 13)
real prorata, prorata_precedente;
if (month != 13)
{
prorata = acquisti_iva * (_prorata / CENTO);
prorata.round(ROUND_LIRA);
acquisti_iva -= prorata;
const real& current = _prorata.current();
const real& previous = _prorata.previous();
if (previous == current && _prorata.flag()) // Se le percentuali sono uguali considera tutto sull'anno corrente
acquisti_iva_annoprec = ZERO; // Tranne nel caso in cui non esista la tabella prec.
if (!current.is_zero())
prorata = _prorata.calc_prorata(acquisti_iva - acquisti_iva_annoprec);
if (!previous.is_zero() && acquisti_iva_annoprec != ZERO)
{
prorata_precedente = _prorata.calc_prorata(acquisti_iva_annoprec, FALSE);
prorata += prorata_precedente;
}
acquisti_iva -= prorata; // Rettifica acquisti_iva
}
look_plm(month, codatt, TRUE);
@ -1352,7 +1380,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
* Il prorata pagato in annuale viene scritto a 0, perche' in realta' sarebbe
* la somma di quelli pagati nei mesi precedenti.
*/
_plm->put("R2", prorata);
_plm->put("R2", prorata); // Prorata complessivo (acq. rif. anno attuale + acq. rif. anno precedente)
_plm->put("R14", prorata_precedente); // Prorata acq. rif. anno precedente (in stampa prorata attuale sara' totale - precedente)
if (_isviaggio)
{
@ -1404,9 +1433,11 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
_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("R4", _prorata.previous()); // per comodita' in stampa
_plm->put("R12", _prorata.current()); // per comodita' in stampa
_plm->put("B0", "X"); // calcolato (invalidato dalla primanota)
// Setta il flag di stampa errore: se siamo oltre 1997 e non esiste tabella anno prec e vi sono docs con tale riferimento
_plm->put("B1", !_prorata.flag() && acquisti_iva_annoprec != ZERO && year_int > 1997);
_pom->put("R9", acq_ies);
_pom->put("R10", acq_ies_iva);
_pum->put("R8", acq_pint);
@ -2120,6 +2151,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
{
TToken_string atts(codatts);
const char* tmpatt;
const int year_int = atoi(_year);
if (_ver->read(atoi(_year),_month)!=NOERR)
warning_box("Errore %d in lettura tabella versamenti ed interessi.",_ver->status());
@ -2199,7 +2231,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
// precedente
differita = TRUE;
TString yr(_year);
_year = format("%d", atoi(_year)-1);
_year = format("%d", year_int-1);
if (!look_lim(12)) //controlla solamente, il vero posizionamento lo fa dopo
{
_year = yr;
@ -2249,18 +2281,18 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
// pum->R11 = tot. imponibile reg agr. 2
// L'iva acquisti viene calcolata in modo diverso se siamo dal 1998 in poi:
// somma l'iva ammessa in detr. I parte tab. A (R13) anziche' iva vendite (R5)
iva_acq += _plm->get_real("R7") + _plm->get_real(_isagr98 ? "R13" : "R5");
iva_acq += _plm->get_real("R7") + _plm->get_real(year_int > 1997 ? "R13" : "R5");
acq_noCEE += _plm->get_real("R11");
imp_agr1 += _pum->get_real("R10");
imp_agr2 += _pum->get_real("R11");
}
detrazioni+= (_plm->get_real("R3") + _plm->get_real("R4"));
detrazioni+= (_plm->get_real("R3"));
// 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"));
risultato -= (_plm->get_real("R3"));
res_cred += (_plm->get_real("R3"));
}
/* totalizza importi 74 ter */
@ -2436,11 +2468,11 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
if (!ris.is_zero())
prorata = (es_b1/ris) * CENTO;
real conguaglio = 0.0;
real topay = 0.0;
prorata.round(ROUND_LIRA);
if (prorata != _prorata)
if (prorata != _prorata.current())
{
// calcolo conguaglio -- se positivo e' a debito
real topay;
if (prorata > 0.0)
{
topay = (iaq + ppg) * (prorata / CENTO);
@ -2454,7 +2486,13 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
if (prorata < 0.0) prorata = 0.0;
_pla->put("R9", conguaglio);
_pla->put("R10",prorata);
tot_cong += conguaglio;
// Prorata delle mie brame...
// Chi e' il piu' sfatto del reame?
// Non va considerata la differenza tra topay e pro-rata pagato
// ma semplicemente topay. (Vedi cg4304.cpp in set_annual())
//tot_cong += conguaglio;
tot_cong += topay;
_pla->rewrite();
// scrivi nuovo prorata in tabella anno successivo
@ -2632,6 +2670,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
_lim->put("R3", deb_mens);
_lim->put("R1", rimborsi);
_lim->put("R5", rettifiche);
_lim->put("R6", detrazioni);
_lim->put("R7", tot_cong);
_lim->put("R8", versamenti);
_lim->put("R9", vers_int);

View File

@ -345,7 +345,7 @@ void TLiquidazione_app::describe_agricolo(int month, const char* codatt)
for (_pia->first(); !_pia->eof(); _pia->next()) // Scorre i progressivi agricoli
{
if (strcmp((const char*)*_pia_codatt, codatt) == 0 &&
(atoi(*_pia_mese) == month) && _year == *_pia_anno) // E sono gia' in ordine di codice...
is_month_plain(atoi(*_pia_mese)) && _year == *_pia_anno) // E sono gia' in ordine di codice...
{
_DescrItem* p = new _DescrItem(PROGAGR);
p->_r0 = _pia->get_real("R0"); // Imponibile
@ -791,18 +791,24 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
t->_r8 += _pum->get_real("R0"); // cessioni beni ammort.
t->_r9 += _pum->get_real("R1"); // IVA su cessioni ammort.
t->_r10 += _pum->get_real("R4"); // tot. esenti IVA
t->_r11 += _plm->get_real("R2"); // pro-rata indetraibile
if (!annual) // Se non siamo in annuale prende il prorata su doc. acq. anno precedente
{
t->_r12 += _plm->get_real("R14");
t->_r13 = _plm->get_real("R4"); // percentuale prorata anno precedente
}
t->_r11 += _plm->get_real("R2") - _plm->get_real("R14"); // pro-rata indetraibile sui doc. acq. anno attuale
// in caso di liq. annuale prende il totale (tutto R2)
ad1 = real(ttm.get(1));
ad2 = real(ttm.get(2));
ad1 += _pom->get_real("R11");
ad2 += _pom->get_real("R12");
ttm.add(_plm->get("R12"), 0); // % pro-rata
ttm.add(_plm->get("R12"), 0); // % pro-rata anno corrente
ttm.add(ad1.string(),1); // imp. acq. amm. indetr.
ttm.add(ad2.string(),2); // IVA acq. amm. indetr
t->_s0 = ttm;
t->_f0 = !_prorata.is_zero() && (month != 13); // flag per segnalare l'esistenza
t->_f0 = !_prorata.current().is_zero() && (month != 13); // flag per segnalare l'esistenza
t->_f1 = _plm->get_bool("B1"); // flag per segnalare errore tabella prorata precedente mancante
d->_r9 += _pom->get_real("R9"); // acq. inded. su ricavi esenti
d->_r10 += _pom->get_real("R10"); // IVA acq. inded. su ricavi esenti
@ -869,7 +875,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt)
real co = 0.0;
real topay = 0.0;
pr.round(ROUND_LIRA);
if (pr != _prorata)
if (pr != _prorata.current())
{
// calcolo conguaglio -- se positivo e' a debito
if (pr > 0.0)
@ -1510,12 +1516,24 @@ void TLiquidazione_app::set_pumpam(_DescrItem& d)
&spgn_iva);
}
if (d._f0)
{
{
// Anno in corso...
printed = TRUE;
real prc(dp.get(0));
set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r",
(const char*)prc.string(), &(d._r11));
if (atoi(_year) > 1997 && d._r12 != ZERO) // prorata 1998
{ // Anno precedente
set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r",
(const char*)d._r13.string(), &(d._r12));
if (d._f1) // Segnala errore per tabella anno precedente non esistente
{
row++;
set_row(row++, "Impossibile reperire la %% PRO-RATA relativa all'anno precedente.");
}
}
}
// items vari per dichiarazione annuale
@ -1879,12 +1897,20 @@ bool TLiquidazione_app::set_annual(_DescrItem& d)
set_row(row++,"B3 - Operazioni esenti da nr. 1 a 9 art. 10 @69g%r", &(d._r5));
set_row(row++,"Volume d'affari - B3 @69g%r", &(d._r0));
set_row(row++,"Indetraibilita'@69g%r%%", &(d._r2));
if (!(d._r3.is_zero()))
{
const char* sss = d._r3.sign() < 0 ? "credito" : "debito";
real ccc = abs(d._r3);
set_row(row++,"Conguaglio a %s@69g%r", sss, &ccc);
}
/* Prorata delle mie brame...
* chi e' il piu' sfatto del reame ?
* La seguente cosa e' ritenuta sbagliata da PRASSI
* Viene lasciato (anch'esso) per memoria futura (vedi cg4301.cpp in write_liq())
*
* if (!(d._r3.is_zero()))
* {
* const char* sss = d._r3.sign() < 0 ? "credito" : "debito";
* real ccc = abs(d._r3);
* set_row(row++,"Conguaglio a %s@69g%r", sss, &ccc);
* }
*/
set_print_zero(FALSE);
}
return ret;
@ -1937,7 +1963,9 @@ void TLiquidazione_app::set_ventila(_DescrItem& d)
void TLiquidazione_app::set_regagr(_DescrItem& d)
{
set_print_zero(TRUE);
const bool is1998 = atoi(_year) == 1998;
real& agr_1 = d._r0;
real& agr_2 = d._r1;
real& agr_3 = d._r2;
@ -1954,7 +1982,7 @@ void TLiquidazione_app::set_regagr(_DescrItem& d)
real ara = agr_5 + agr_6;
real arn = agr_3 + agr_4;
real agr_ven = agr_1 + agr_2;
real ivadt_amm = agr_3 + ivadt + ( _isagr98 ? iva_detIA : agr_1);
real ivadt_amm = agr_3 + ivadt + (is1998 ? iva_detIA : agr_1);
set_bookmark("Prospetto regime agricolo", _att_bookmark);
int r = 1;
@ -2018,7 +2046,7 @@ void TLiquidazione_app::set_regagr(_DescrItem& d)
riga.format("@%dg%%s",xl - corr - dn.len()/2);
set_row(r++, riga, (const char*)dn);
set_row(r++, "");
if (_isagr98)
if (is1998)
{
set_row(r++, "Iva ammessa in detrazione I parte tabella A@56g%r",&iva_detIA);
set_row(r++, "");

View File

@ -1,7 +1,20 @@
// cg4400a.uml
// Stampa tabella registri
#include "cg4400a.h"
TOOLBAR "" 0 20 0 2
BUTTON DLG_PRINT 10 2
BEGIN
PROMPT -12 -11 "~Stampa"
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -11 ""
END
ENDPAGE
#include "cg4400a.h"
PAGE "Stampa registri" -1 -1 60 18
@ -192,17 +205,6 @@ BEGIN
HELP "Numero di righe per pagina del modulo di stampa. Se non specificato assume 66 righe"
END
BUTTON DLG_PRINT 10 2
BEGIN
PROMPT -12 -1 "~Stampa"
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
PAGE "Parametri addizionali" -1 -1 56 18
@ -246,17 +248,6 @@ BEGIN
PROMPT 2 5 "Stampa riferimenti vidimazione"
END
BUTTON DLG_PRINT 10 2
BEGIN
PROMPT -12 -1 "~Stampa"
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -158,7 +158,6 @@ TRegistro::TRegistro(const char* cod, int year) : _rec(LF_TAB), _att(LF_ATTIV)
read(cod, year);
}
bool TRegistro::read(const char* cod, int year)
{
if (year <= 0)
@ -273,17 +272,17 @@ bool TRegistro::read_att()
chiave.format("%05ld", prefix().get_codditta());
chiave << year(); // non fare << year() << attivita()
chiave << attivita() << "1";
_prorata.destroy();
TTable pla("%PLA");
attiv.setkey(1);
pla.put("CODTAB", chiave);
if (pla.read() == NOERR)
{
_prorata = pla.get_real("R8");
chiave.format("%d", year());
_prorata.add(chiave, pla.get_real("R8"));
_att.put("TIPOATT", pla.get("S7")); // Aggiorna tipo attivita'
}
else
_prorata = 0.0;
return err == NOERR;
}
@ -301,14 +300,49 @@ const TString& TRegistro::tipo_attivita()
return _att.get("TIPOATT");
}
const real& TRegistro::prorata()
{
return _prorata;
real* TRegistro::read_prorata(int anno) const
{
TString16 chiave; // Ditta - Anno - Attivita' - Tipo Attivita' (fissata a 1)
chiave.format("%05ld", prefix().get_codditta());
chiave << anno << attivita() << "1";
TTable pla("%PLA");
pla.put("CODTAB", chiave);
real* prorata = NULL;
const int err = pla.read();
if (err == NOERR)
prorata = new real(pla.get("R8"));
return prorata;
}
void TRegistro::set_prorata(const real& pro)
{
_prorata = pro;
real TRegistro::prorata(int annodoc)
{
const int annoiva = year();
const int annopro = annoiva < 1998 ? annoiva : annodoc;
TString16 chiave; chiave << annopro;
real* pr = (real*)_prorata.objptr(chiave);
if (pr == NULL)
{
pr = read_prorata(annopro);
if (pr == NULL && annopro != annoiva)
pr = read_prorata(annoiva);
if (pr == NULL)
pr = new real;
_prorata.add(chiave, pr, TRUE);
}
return *pr;
}
void TRegistro::set_prorata(int annodoc, const real& pro)
{
int annoiva = year();
int annopro = annoiva < 1998 ? annoiva : annodoc;
TString16 chiave; chiave << annopro;
_prorata.add(chiave, pro, TRUE);
}
// Certified 99%
@ -352,7 +386,6 @@ bool TLibro_giornale::read(int y)
TString16 anno; anno.format("%04d", y);
TTable reg("REG");
reg.setkey(1);
reg.put("CODTAB", anno); // Cerca il primo registro dell'anno
for (int err = reg.read(_isgteq); err == NOERR; err = reg.next())

View File

@ -1,6 +1,10 @@
#ifndef __CGLIB01_H
#define __CGLIB01_H
#ifndef __ASSOC_H
#include <assoc.h>
#endif
#ifndef __ISAM_H
#include <isam.h>
#endif
@ -77,7 +81,9 @@ class TRegistro : public TObject
protected:
TRectype _rec, _att;
real _prorata;
TAssoc_array _prorata;
real* read_prorata(int anno) const;
public:
bool read(const char* code, int year);
@ -101,8 +107,11 @@ public:
bool agenzia_viaggi();
const TString& tipo_attivita();
bool attivita_mista() { const char a = tipo_attivita()[0]; return a == 'E'; }
const real& prorata();
void set_prorata(const real& pro);
void set_prorata(int annodoc, const real& pro);
real prorata(int annodoc);
bool prorata100(int annodoc) { return prorata(annodoc) >= 100.0; }
bool update(long uprotiva, const TDate& lastreg);
TRegistro(const char* code = "", int year = 0);

View File

@ -9,6 +9,10 @@
#ifndef __CGLIB01_H
#include "cglib01.h"
#endif
#ifndef __CG2103_H
class TCausale;
#endif
class TConto : public TBill

View File

@ -72,7 +72,6 @@ int TTree_rectype::fill_array()
return err;
}
int TTree_rectype::read(TBaseisamfile& f, word op, word lockop)
{
int err = TRectype::read(f, op, lockop);
@ -83,16 +82,6 @@ int TTree_rectype::read(TBaseisamfile& f, word op, word lockop)
return err;
}
int TTree_rectype::next(TBaseisamfile& f, word lockop)
{
int err = TRectype::next(f, lockop);
if (err == NOERR)
fill_array();
else
_recarr.destroy_rows();
return err;
}
int TTree_rectype::write(TBaseisamfile& f) const
{
int err = TRectype::write(f);

View File

@ -32,7 +32,6 @@ protected: // TRectype
virtual TObject* dup() const;
virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock);
virtual int next(TBaseisamfile& f, word lockop = _nolock);
virtual int write(TBaseisamfile& f) const;
virtual int rewrite(TBaseisamfile& f) const;
virtual int remove(TBaseisamfile& f) const;
@ -302,7 +301,7 @@ public:
class TPartite_array : private TAssoc_array
{
TString80 _key; // Work string
TString _key; // Work string
long _numreg; // Last registration loaded
protected:

813
cg/iva.txt Executable file
View File

@ -0,0 +1,813 @@
IVA.TXT
=======
AZIONE DATA CHI COMMENTO
=======================================================================================================
creato 1996/07/19 angelo descrizione dei file usati nei programmi di liquidazione
aggiornato 1996/10/22 angelo descrizione generica del funzionamento del programma di liquidazione
aggiornato 1996/11/13 angelo modifiche per trasferimento ad IVA 11'96
aggiornato 1996/11/20 angelo modifiche per aggiungere codice A36 in stampa riepilogo progressivi
aggiornato 1996/12/01 angelo modifiche per trasferimento IVA11. Corretto il trasferimento di piu' attivita'
aggiornato 1997/10/20 angelo modifiche per implementazione progressivi (PIM) sulla 13a liquidazione
aggiornato 1997/10/31 angelo modifiche per nuovo prospetto agricolo
aggiornato 1997/12/01 angelo modifiche per IVA11'97
aggiornato 1997/12/05 angelo modifiche per PRORATA dal 1998
PROPOSITO
=========
Il seguente file non e' niente di ufficiale e pertanto da ritenersi valido cosi com'e'.
La documentazione che segue sono varie note sul funzionamento dei programmi IVA, descrizione
delle tabelle utilizzate ecc. di modo che' chicchessia possa subentrare senza troppi
problemi in questo sconfinato mondo di imposte sul valore aggiunto.
Sarebbe cosa buona e giusta che eventuali importanti modifiche ai programmi siano qui
dettagliatamente spiegate, onde evitare avere sempre un documento a portata di mano che
tutti possano consultare, senza dover scorrere disperatamente 10000 linee di C++
19 Luglio 1996
TABELLE PROGRESSIVI
-------------------
Ecco qui, tanto per cominciare un elenco riassuntivo delle tabelle utilizzate dai programmi
di calcolo liquidazione, visualizzazione e stampe varie.
%DEL: tabella comune per memorizzare i versamenti effettuati (deleghe IVA)
CODTAB = CODDITTA(Z)[0-4]+ANNO[5-8]+MESE(Z)[9-10]+TIPO[11,11]
S6 = Codice tributo
S7 = Codice ABI banca
S8 = Codice CAB banca
S9 = Codice concessione
D0 = Data delega
R0 = Importo versamento (esclusi interessi)
R1 = Interessi da pagare
R2 = Importo del versamento inclusi interessi
B0 = Stampato
Nota: l'ultimo carattere di CODTAB (TIPO) si riferisce al tipo di versamento:
1 = normale
2 = annuale
3 = art.74
4 = cessazione attivita'
5 = integrativa
7 = acconti IVA
Il campo R2 in realta' non e' la somma di R0 + R1, poiche' R0 = ROUND(R2 - R1).
Pertanto e' utile tenere l'importo lordo non arrotondato in un campo separato
visto che in alcuni casi la liquidazione richiede di stampare proprio questo valore.
%LIA: tabella comune per memorizzare i risultati della Liquidazione IVA Annuale
CODTAB = DITTA[0-4](Z)+ANNO[5-8]
S1 = Credito precedente e acquisti intracomunitari separati da !
S7 = Frequenza versamenti per anno liquidazione (M,T)
S8 = Tipo acconto ("S"aldo oppure "A"cconto)
R0 = Credito anno precedente
R1 = Volume di affari lordo
R2 = Volume di affari attivita' 1
R3 = Volume di affari attivita' 2
R4 = Acconto dicembre
R5 = Credito di costo agenzie di viaggio
R6 = Credito utilizzato
R7 = Iva sulle vendite annotate fino al 20/12
R8 = Iva sugli acquisti annotati fino al 20/12
R9 = Rettifica
R10 = Iva chiesta a rimborso
R11 = Ulteriori detrazioni
R12 = Pro-rata indetraibile
R13 = Iva su operaz. fino al 20 dic., ma non fatturate
R14 = Iva su operaz. fino al 20 dic., ma non annotate
B1 = Liquidazione differita
B2 = Regime agricoltore minimo
LAM: tabella di ditta per memorizzare i risultati Liquidazione Attivita' Mensile
CODTAB = ANNO[0-3]+MESE(Z)[4-5]
R0 = Totale IVA vendite in regime IVA su tutte le attivita'
R1 = Totale IVA acquisti in regime IVA su tutte le attivita'
R2 = Credito precedente o inizio anno
R3 = Debito precedente da liquidazione a debito < 50.000
LIM: tabella di ditta per memorizzare i risultati della Liquidazione Iva Mensile
CODTAB = ANNO[0-3]+MESE(Z)[4-5]
S0 = Descrizione rettifica (1)
S1 = Descrizione rettifica (2)
S4 = Codice ABI presso cui e' effettuato il versamento
S5 = Codice CAB presso cui e' effettuato il versamento
S6 = Codice concessione a cui e' intestato il versamento
S7 = D = rettifica a debito; C = rettifica a credito
R0 = Risultato mese ( < 0 = credito): comprende tutto
R1 = Rimborso richiesto (immesso da visualizzazione)
R2 = Credito di costo agenzie di viaggio
R3 = Debito mensile agenzie di viaggio
R4 = Percentuale di ripartizione agenzie di viaggio
R5 = Importo rettifica ( < 0 = a credito)
R6 = Totale ulteriori detrazioni
R7 = Totale conguaglio prorata (solo in annuale)
R8 = Totale versamenti effettuati
R9 = Totale versamenti integrativi effettuati
R10 = Tasso di interesse applicato
R11 = Acconto versato a dicembre (solo per dicembre!)
R12 = Risultato totale a credito (segno +)
R13 = Risultato totale a debito
R14 = Interesse versato
D0 = Data versamento
B0 = Mese calcolato (invalidato da primanota)
B1 = Stampato su registro bollato
B2 = Diritto al rimborso infraannuale per il mese
PIM: Tabella di ditta per memorizzare i progressivi IVA
CODTAB = ANNO[0-3]+ATT(Z)[4-8]+TIPATT[9,9]+REG[10,12]+MESE(Z)[13,14]+
TIPOCR[15,15]+CODIVA[16,19]+TIPODET[20,20]
S0 = Imponibile/IVA importi relativi art40 c.5/6/8 a.i.(separati da "!")
S1 = Imponibile/IVA fatture in ritardo (separati da "!")
S2 = Imponibile/IVA corrispettivi registrati al netto dell'IVA (separati da "!")
S4 = Codice IVA a cui ventilare (corrispettivi)
S5 = Tipo IVA (da tabella IVA)
I0 = Tipo importi (1 = netto, 2 = lordo)
I1 = Tipo movimento (1 = vendita, 2 = acquisto)
R0 = Imponibile totale
R1 = IVA totale
R2 = Lordo corrispettivi
R5 = Imponibile fatture con scontrino (<= R0)
R6 = IVA fatture con scontrino (<= R1)
R7 = Imponibile autofatture non resid. art. 17 (<= R0)
R8 = IVA autofatture non resid. art. 17 (<= R1)
R9 = Imponibile bolle doganali relative (compreso in R0)
R10 = IVA bolle doganali relative (compreso in R1)
R11 = Totale imponibile fatture sospensione imposta (indipendente da R0)
R12 = Totale IVA fatture sospensione imposta (indipendente da R1)
R13 = Totale imponibili falsi corrispettivi (reg corr ma doc come FS)
R14 = Totale IVA falsi corrispettivi (reg corr ma doc come FS)
B1 = Codice IVA corrispettivi da ventilare
B2 = Valido per calcolo volume di affari
B3 = Validi per calcolo rimb. infraanuuale
B4 = Riporta il flag RicAcq dei parametri ditta
Dove: ANNO e' l'anno di riferimento
ATT e' il codice attivita'(zerofilled)
TIPOATT e' il tipo di attivita' (1 default, 2 se ci sono anche altre attivita')
REG e' il registro (ACQ, VEN, COR)
MESE e' il mese di riferimento
TIPOCR e' il tipo di costo/ricavo (0,1,2,3,4,5,6,7,8,9: vedi piano dei conti)
CODIVA e' il codice IVA relativo
TIPODET e' il tipo di detrazione (" " = regime normale, "1" = IVA ind. su acquisti riferiti
a ricavi esenti, "3" = IVA indicata per passaggi interni al solo fine di calcolo
ventilazione, "9" IVA non detrabile per articolo 19)
PUM: Tabella di ditta per memorizzare i progressivi IVA
CODTAB = ANNO[0-3]+CODATT[4,8]+TIPOATT[9,9]+MESE[10,11]
R0 = Totale cessioni beni ammortizzabili
R1 = Totale IVA su cessioni ammortizzabili
R2 = Tot. acquisti ammortizzabili detraz. 6%
R3 = IVA su beni ammortizz. detr. 6%
R4 = Totale vendite esenti IVA riga B1
R5 = Totale vendite esenti IVA riga B2
R6 = Totale vendite esenti IVA riga B3
R7 = Totale acquisti esenti IVA riga B14
R8 = Totale imponibile passaggi interni
R9 = Totale IVA passaggi interni
R10 = Totale imponibile reg. agricolo tipo 1
R11 = Totale imponibile reg. agricolo tipo 2
R12 = Totale imponibile vendite esenti IVA
PAM: Tabella di ditta per memorizzare i progressivi IVA
CODTAB = ANNO[0-3]+CODATT[4,8]+TIPOATT[9,9]+MESE(Z)[10,11]
R0 = Totale acquisti in regime IVA
R1 = Totale vendite in regime IVA
R2 = Totale lordo acquisti beni per rivendita da inizio anno
R3 = Totale corrispettivi da ventilare
R4 = Totale imponibile bolle doganali (acquisti)
R5 = Totale IVA bolle doganali (acquisti)
R6 = Totale imponibile acquisti in sosp. imposta
R7 = Totale IVA acquisti in sosp. imposta
R8 = Totale imponibile vendite in sosp. imposta
R9 = Totale IVA vendite in sosp. imposta
R10 = Totale imponibile spese generali
R11 = Totale IVA spese generali
POM: Tabella di ditta per memorizzare i progressivi IVA
CODTAB = ANNO[0-3]+CODATT[4,8]+TIPOATT[9,9]+MESE[10,11]
R0 = Totale IVA acquisti intracomunitari (flag INTRA su rmoviva)
R1 = Totale imponibile acquisti non detraibili art. 19
R2 = Totale IVA acquisti non detraibili art. 19
R3 = Totale imponibile acquisti beni ammortizzabili detraibili
R4 = Totale IVA acquisti beni ammortizzabili detraibili
R5 = Totale imponibile acquisti beni per rivendita (non sono tutti base per ventilazione)
R6 = Totale IVA acquisti beni per rivendita
R7 = Totale imponibile beni acquisiti in leasing
R8 = Totale IVA beni acquisiti in leasing
R9 = Totale imponibile acquisti indetraibili su ricavi esenti
R10 = Totale IVA acquisti indetraibili su ricavi esenti
R11 = Totale imponibile acq. beni ammortizz. non detraibili
R12 = Totale IVA acq. beni ammortizz. non detraibili
R13 = IVA a debito agenzie viaggio
PLM: Tabella di ditta per memorizzare i Progressivi Liquidazione Mensili
CODTAB = ANNO[0-3]+CODATT[4,8]+TIPOATT[9,9]+MESE[10,11]
R0 = IVA vendite
R1 = IVA acquisti
R2 = Pro-rata indetraibile totale (acq. rif. anno attuale + acq. rif. anno precedente)
R3 = Ulteriori detrazioni (6%)
R4 = % pro-rata precedente
R5 = se AG.VIAGGIO: Corrispettivi CEE; se AGRICOLO: tipo agr. == 1
R6 = se AG.VIAGGIO: Corrispettivi extra CEE; se AGRICOLO: tipo agr. == 2
R7 = se AG.VIAGGIO: Acquisti CEE; se AGRICOLO: tipo agr. == 3
R8 = se AG.VIAGGIO: Acquisti fuori CEE; se AGRICOLO: tipo agr. == 4
R9 = se AG.VIAGGIO: Corrispettivi misti CEE; se AGRICOLO: tipo agr. == 5
R10 = se AG.VIAGGIO: Acquisti misti CEE; se AGRICOLO: tipo agr. == 6
R11 = se AG.VIAGGIO: Acquisti misti fuori CEE;
R12 = % pro-rata corrente
R13 = se AGRICOLO: totale iva in detrazione Ia parte tabella A
R14 = Pro-rata indetraibile acq. rif. anno precedente
B0 = Attivita' calcolata
B1 = TRUE se vi sono documenti con riferimento anno prec. ma manca la tabella (solo dal 1998)
PPA: Tabella di ditta per memorizzare i Progressivi Plafond Attivita mensili
CODTAB = ANNO[0-3]+CODATT(Z)[4-8]+TIPOATT[9,9](sempre = 1)+MESE(Z)[10,11]TIPOESENZIONE[12,12]
R0 = Totale acquisti Italia
R1 = Totale acquisti estero (bolle doganali)
R2 = Rimanenza plafond mese precedente (non conteggia il mese in corso)
%PLA: Tabella comune per memorizzare i dati annuali per i PLAfond
CODTAB = DITTA[0-4]+ANNO[5-8]+CODATT(Z)[9-13]+TIPOATT(sempre = 1)[14,14]
S1 = (real)Volume di affari attivita' 2
S2 = (Non utilizzati)
S3 = (Non utilizzati)
S3 = (Non utilizzati)
S7 = Tipo attivita' ("S"ervizio, "M", "E")
R0 = Totale vendite in regime IVA (valido per calcolo prorata)
R1 = Totale acquisti esenti riga B1
R2 = Totale acquisti esenti riga B2
R3 = Totale acquisti esenti riga B3
R4 = Totale cessioni beni ammortizzabili
R5 = Ammontare iniziale plafond art. 8
R6 = Ammontare iniziale plafond art. bis
R7 = Ammontare iniziale plafond art. 9
R8 = % pro-rata
R9 = conguaglio pro-rata
R10 = % pro-rata ricalcolato (vale per l'anno successivo)
R11 = Totale IVA acquisti attivita' (senza pro-rata pagato nell'anno)
R12 = Totale pro-rata pagato nell'anno
R13 = Totale lordo vendite attivita'
R14 = Volume affari attivita' 1
%IVA: Tabella comune per memorizzare i dati relativi ai codici iva
CODTAB = Codice
S0 = Descrizione
S1 = Tipo codice ("" = Regime normale, "VE" = ricavi da ventilare, "ES" = operazioni esenti"
"NI" = operazioni non imponibili, "NS" = Non soggetti
S3 = Tipo di gestione plafond ("" = gestione normale, "1" Op. art. 8, "2" op. art. 8bis,
"3" op. art. 9)
S4 = Tipo di gestione regime agricolo ("" = regime normale, "1" vendite regime agr.,
"2" = vendite accessorie/acquisti non agr., "3" = acquisti ad uso promiscuo)
S5 = Tipo di gestione per ag. viaggio ("" = regime normale, "1" = op. interno CEE,
"2" = op. fuori CEE, "3" = vendite miste CEE, "4" = acquisti misti parte CEE,
"5" acquisti misti parte fuori CEE)
S6 = Codice IVA a cui ventilare
S7 = Numero della colonna allegato clienti ("" = non in allegato, "1" = imponibili,
"3" = non imponibili)
S8 = Numero della colonna allegato fornitori ("" = non in allegato "1" = imponibili,
"3" = senza app. imp., "4" = Non imponibili)
R0 = Aliquota
I0 = Percentuale IVA teorica
S2 = N.ro di riga vendite IVA11 per op. esenti e non imponibili
"" Nessuno
"20" Operazioni non imponibili (comma 1, artt.8, 8bis e 9)
"21" Operazioni non imponibili a seguito di dich. d'intento
"22" Altre operazioni non imponibili
"24" Operazioni non soggette (art. 74 comma 7)
"25" Op. non sogg. effettuate nei confronti di terremotati
"B1" Ammontare op. es. escluse da nr. 1 a 9 e 11 art. 10
"B2" Ammontare op. es. di cui al nr. 11 art. 10
"B3" Ammontare op. es. di cui ai nr. 1 a 9 art. 10
"G7A" Cessioni intracomunitarie non imponibili
"G7B" Prestazioni di servizi non soggette all'imposta
S9 = N.ro di riga acquisti IVA11 per op. esenti e non imponibili
"" Nessuno
"10" Acquisti non imponibili (comma 2, artt8, 8bis e 9)
"11" Altri acquisti non imponibili
"12" Acquisti esenti
"13" Acquisti non soggetti (art. 74 comma 7)
"14" Acquisti non soggetti all'imposta effettuati dai terremotati
B0 = TRUE se il codice deve comparire nel modello 101
B1 = TRUE se il codice deve comparire nel modello 102
B2 = Codice IVA sospeso (TRUE se vero)
B3 = Codice escluso dal calcolo rimborso infrannuale (TRUE se vero)
B4 = Codice escluso dal calcolo rimborso per aliquota media (TRUE se escluso)
ESC: tabella di ditta per memorizzare gli esercizi contabili
CODTAB = Codice esercizio
D0 = Data inizio esercizio
D1 = Data fine esercizio
D2 = Data di scarico
RMB: tabella di ditta per memorizzare i rimborsi (obsolete?)
CODTAB = ANNO[0-3]+MESE(Z)[4-5]+CODIVA(Z)[6-9]+TIPOREG[10,10]
R0 = Imponibile per rimborso
R1 = IVA per rimborso
R2 = Percentuale IVA relativa
%VER: tabella comune per memorizzare i parametri relativi agli interessi ed ai versamenti.
CODTAB = ANNO[0,3]+MESE[4,5]
R0 = Percentuale interesse primo trimestre
R1 = Percentuale interesse secondo trimestre
R2 = Percentuale interesse terzo trimestre
R3 = Percentuale interesse quarto trimestre
R4 = Percentuale interesse annuale
R5 = Importo minimo versamento periodico
R6 = Importo minimo versamento annuale
R7 = Importo minimo versamento acconto
R8 = Importo minimo versamento integrativo
R9 = Importo minimo versamento cessazione
R10 = Importo minimo versamento Art. 74
R11 = Percentuale per calcolo acconti su liquidazione normale
R12 = Percentuale per calcolo acconti su liquidazione differita
PIA: Tabella di ditta per memorizzare i Progressivi IVA compensazione Agricoli
CODTAB = ANNO[0-3]+CODATT[4,8]+TIPOATT[9,9]+MESE[10,11]+IVAORD[12,15]+IVACOM[16,19]
R0 = Totale imponibile
R1 = Totale IVA secondo codice IVA di compensazione
22 Ottobre 1996
SEQUENZA DELLE CHIAMATE A FUNZIONE (FLUSSO GENERICO DEL PROGRAMMA)
==================================================================
Parte I: elaborazioni e calcoli:
-------------------------------
schema generico di flusso:
- set_print() :
* selezione input/ditte
- recalc_all()
* ciclo per ditte selezionate
* setta ditta corrente
* reperisce dati dalla ditta
* controlla sulle lim(B0) dei mesi preceddenti se devono essere ricalcolate
* ciclo da 1 al mese selezionato in input (_month)
- update_firm() per ogni mese del ciclo
* carica alcuni dati della ditta
* ciclo per ogni attivita' della ditta
* ciclo per tipo di attivita' (1 o 2)
* reperisce dati per l'attivita' corrente,
inizializzando tabelle per memorizzare progressivi e calcoli
* scorre i registri per settare flag per ventilazione (_isvent)
* se e' necessario il calcolo chiama:
- update_att()
* se sta calcolando la 13a chiama:
- recalc_annual()
* se e' richiesto il riepilogo liq ed e' l'ultimo mese
in elaborazione chiama:
- describe_att()
** fine ciclo
* se attivita' mista stampa il riepilogo:
- describe_att()
** fine ciclo
* se quater stampa il riepilogo:
- describe_att()
* se mese compatibile con il regime frequenza IVA:
- write_liq()
* se e' l'ultimo mese in elaborazione del ciclo:
- recalc_rimborso()
* se e' l'ultimo mese in elaborazione del ciclo e deve stampare la liquidazione:
- describe_firm()
- describe_liq()
* se e' stampa registri ed e' stato calcolato l'acconto
- describe_liq_acc();
* fine ciclo per mese
* fine ciclo per ditte
dettagli di funzioni:
- update_att() // aggiorna i progressivi per la ditta/mese/attivita' corrente
- zero_att() // scorre i pim/pum/pam/plm... e azzera quelli del mese/attivita' corrente
- recalc_att()
- recalc_ventilation()
- recalc_corripettivi()
- recalc_annual() // ricalcola progressivi annuali liq.
* legge dalla PLA alcuni dati
* scorre i PIM dell'anno corrente
* esegue la sommatoria di PIM->R0 per calcolare i volumi d'affari
* scorre i PLM della corrente attivita'
* esegue la sommatoria di alcuni campi di PLM/PUM/PAM
* scrive in PLA i dati calcolati
- describe_att()
// setta i vari DescrItem, che aggiunge a _descr_arr per la stampa successiva
- describe_name()
- describe_plafond()
- describe_ventilation()
- describe_agricolo()
- describe_viaggio()
- describe_pims()
- describe_consistence()
- write_liq() // Calcolo liq. mensili e liq. annuali. Scrive le lim
* posiziona tabella %VER
* calcola mese di rif. per liq. differita
* azzera variabili per totali vari
* ciclo sulle attivita' passate come parametro
* se differita e primo mese setta l'anno precedente
* ciclo su tutti i mesi (1..13)
* posiziona PLM
* totalizza vari importi
* fine ciclo sui mesi
* se agenzia di viaggio e non liq. diff.
* calcola credito costo, debito mensile, perc. ripart.
* fine ciclo su attivita'
* rettifica il risultato con credito prec. in base al mese corrente.
* se e' 13a liq.
* ciclo sulle attivita'
* totalizza volumi d'affari e calcola nuovo prorata, riscrivi PLA e LIA
solo se tipo di attivita' e' 1
* fine ciclo
* riscrive i volumi d'affari in LIA (R1,R2,R3)
* azzera record corrente di LIM, tranne R1, R5, S1, S0, S7
* rettifica il risultato con versamenti, acconto di dicembre...
* schiaffa dentro LIM/LAM vari risultati di calcoli
* mette il flag di ricalcolato sul record LIM del mese corrente(B1)
* se 13a liq. arrotonda alle 1000 lire sup. diversi importi e li rischiaffa in LIM/LAM
* riscrive LIM/LAM
- recalc_rimborso() // calcola condizioni per il diritto al rimborso infrannuale
// chiamata soltanto per i trimestri anche se annuale
// aggiornata a normative per anno liq. > 1994
* ciclo sulle attivita'
* totalizza volume d'affari ed es. non impon. (varia se usare 3 mesi oppure no)
// Prima condizione per il rimborso
* se rapporto tra esenti e vol. d'affari e > minima parte esente (0.25)
crea il _DescrItem del RIMBORSO
// Seconda condizione per il rimborso
* scorre i PIM per totalizzare imponibile/imposta acquisti/vendite
* se (iva acquisti/totale acquisti) > (iva vendite/ totale vendite),
ovvero se l'aliquota medit adegli acquisti e' > dell'aliquota media
delle vendite, allora...
* se l'aliquota acquisti eccede la soglia minima (10%) allora si ha diritto al rimborso.
* genera un _DescrItem con totale acquisti/vendite, rispettivi totali
imposte ed aliquota media.
* se sono state riscontrate le condizioni per il rimborso riscrive LIM.
* ritorna il _DescrItem generato.
- describe_firm()
* genera un _DescrItem con i dati della ditta:
rag. soc., freq. iva, mese corrente.
* aggiunge il _DescrItem generato all'array _descr_arr
- describe_liq()
* genera un _DescrItem con i dati finali della liquidazione
con eventuale satellite per il rimborso e prospettino
per i versamenti
* aggiunge il _DescrItem all'array _descr_arr
- describe_liq_acc()
* genera un _DescrItem con i dati per la liquidazione dell'acconto
* aggiunge il _DescrItem a _descr_arr
dettagli di update_att()
************************
// funzioni chiave per il calcolo
- recalc_att()
* azzera variabili contenenti i progressivi
* ciclo per gli elementi del cursore impostato.
Il cursore e' cosi' fatto:
LF_MOV
|------->LF_RMOVIVA
|------->LF_CAUSALI
Quindi il ciclo sara' sui movimenti,
controlla se il registro e' presente, la relativa
riga di rmoviva e' presente e se la data deve essere considerata.
* ciclo per ogni riga IVA del movimento corrente
* qui totalizza nei vari casi, sottocasi, casi particolari,
tutte le imposte/imponibili, memorizzandoli nei progressivi IVA.
* fine ciclo per righe IVA
* fine ciclo per movimenti
* calcolati tutti i movimenti e aggiornati i pim
se necessario risistema le imposte acquisti beni
per rivendita (scorre i PIM dal primo all'ultimo ricalcolando l'iva e riscrivendoli)
* calcola il prorata solo se liq. periodica, e lo memorizza in PLM->R2
* se e' agenzia di viaggio memorizza i relativi progressivi
* se e' agricolo memorizza i relativi progressivi
* memorizza sempre e comunque altri progressivi comuni
* riscrive i record delle tabelle mensili(PLM,PAM,PUM,POM)
- recalc_ventilation() // ricalcolo della ventilazione
* ricalcola i pim dei mesi dal primo al corrente se necessario:
esegue un ciclo da 1 al mese corrente e chiama ogni volta update_att()
(sembra una storia ricorsiva, in realta' lo e' poco)
* ciclo da 1 al mese corrente
// aggiunge gli acquisti del mese m operando sui pim
* ciclo per tutti i PIM relativi. Per i codici != da NS, NI ed ES
aggiunge all'array _vent_arr i progressivi.
* calcola totale acquisti su tutte le aliquote (scorre tutti gli elementi di _vent_arr,
sommando l'elemento _totale.
* calcola totale vendite (solo se mese 13 e si sta calcolando la 13a)
* ricalcola (solo per il mese in corso!) operando sull'array _vend_arr, ove sono
memorizzate le vendite.
* scorre gli elementi di _vend_arr
* calcola la percentuale di ripartizione:
se siamo in annuale si deve ripartire il totale vendite annuale tra i vari mesi,
altrimenti il totale del mese.
L'importo cosi' preparato viene affettato a seconda degli elementi di
_vent_arr, le percentuali di ripartizione sono ottenute dal rapporto
tra il totale acquisti del mese e il totale acquisti
* scorre ancora gli elementi di _vent_arr e calcola l'imposta/imponibile
da ventilar. Corregge l'iva vendite nei PLM->R0 ed il volume
d'affari nei PAM->R1 ed aggiorna i PIM->(R0,R1)
* se siamo in annuale, dopo aver ripartito una prima volta, esce dal ciclo
(in pratica viene eseguito una sola volta)
* fine ciclo
* memorizza i totali per il prospettino di ventilazione
* riscrive il tot. acq e vendite in PAM
- recalc_corrispettivi() // ricalcolo dei corrispettivi
* viene eseguita solo se ci sono elementi in _corr_arr (modificato
tramite add_corrisp() in recalc_att())
* scorre tutti gli elementi di _corr_arr
* per ogni _CorrItem estrae imponibile, imposta
* aggiusta l'IVA vendite in PLM->R0
* aggiusta il volume d'affari in PAM->R1
* aggiorna i PIM->(R0,R1)
* riscrive i records modificati
Parte II: stampa:
-------------------------------
schema generico di flusso.
* La stampa, avviene dopo aver creato tutti gli opportuni
_DescrItem e memorizzati in _descr_arr.
Per far cio' si utilizza il meccanismo della TPrint_application
pur non utilizzando nessun cursore o relazione di stampa,
basta ridefinire preprocess_page(), postprocess_page() e la
set_page(). Si utilizza quest'ultima come fulcro centrale della stampa
sfruttando il parametro cnt che viene passato alla stessa, visto
che in casi come questi esso e' sempre incrementale.
Per farla in breve, sappiamo tutti che una TPrint_applicatione e' cosi'
fatta:
* ciclo fintantoche' set_print() [vedi sopra] ritorna TRUE
* ciclo fintantoche' si vuol ripetere la stampa.
* ciclo per il numero di copie della stampa
* ciclo (almeno una volta) fino a quando postprocess_print() ritorna la ripetizione
* se preprocess_print() ritorna TRUE allora
* ciclo (almeno una volta) fino a quando postprocess_page() ritorna la ripetizione
* se preprocess_page() ritorna TRUE allora
* set_page()
* print_one()
* fine ciclo
* fine ciclo
* fine ciclo
* fine ciclo
* fine ciclo
Nel nostro caso la preprocess_page() ritorna TRUE se il numero di elementi di
_descr_arr e' != da 0.
La postprocess_page() ritorna NEXT_PAGE solo se non ci sono elementi in
_descr_arr o se l'elemento che tiene il conteggio (cnt) e' arrivato alla fine (_descr_arr.items()-1)
Ecco quindi che la set_page() assume una importanza fondamentale per settare le righe di
stampa:
- set_page()
* reperisce il _DescrItem corrente grazie a cnt da _descr_arr.
* resetta tutte le righe di stampa
* setta il salto foglio automatico a FALSE
* esegue una selezione multipla in base al membro _flags di
_DescrItem:
CHG_PARMS
SET_FIRM
PIM_ROW
PIM_HEAD
MISC_LIQ
TOT_ROW
PLAFOND
VENTILA
REGAGR
REGVIA
THE_END
LIQACC
ACCONTO
ACCHEAD
DELDEB
DELCRED
in base ad ognuno di questi flags viene chiamata una diversa funzione di
set delle righe di stampa.
13 Novembre 1996
TRASFERIMENTO IVA11
===================
Nuova feature aggiunta in occasione delle modifiche per il trasferimento IVA11:
- cache di lettura per i codici IVA e tabella registri.
Vengono semplicemente mantenuti 2 assoc array (1 per i codici iva ed uno
per i registri) dove ogni volta che viene letto un record nuovo (quindi
non presente nell'array) viene memorizzato. Quando viene richiesta la lettura
di un record viene prima controllato che esso non sia gia' presente in cache.
Le modifiche sono state effettuate nelle funzioni look_iva() e look_reg().
Per il trasferimento IVA 11 sono state implementate 3 nuove funzioni:
iva11_set_arr(), iva11_set_arr_pim(), iva11_write() ed aggiunto un assoc array: _iva11_arr.
Il procedimento e relativamente semplice:
viene utilizzato un assoc array dove memorizzare i valori da trasferire sui
files tab1100a e tab1100b. La chiave per memorizzare i valori viene posta uguale
al nome campo relativo, facilitando cosi' l'accesso e senza troppi sprechi di memoria
essendo al massimo 125 campi.
Il filling dei campi viene effettuato in 2 procedure (iva11_set_arr e iva11_set_arr_pim).
La prima viene chiamata quando vengono scorse le righe di movimento IVA (recalc_att());
la seconda viene chiamata alla fine del calcolo dell'attivita', prima dello spostamento della
relazione sulla prossima (update_firm()).
La scrittura dei campi avviene in iva11_write(), chiamata subito dopo la iva11_set_arr_pim().
Particolarita':
iva11_set_arr_pim():
esegue un ciclo per tutti i PIM della ditta, scartando quelli che non servono
e raggruppando quelli che rispondono alle condizioni di trasferimento.
iva11_write():
esegue un ciclo per tutti i campi settati in _iva11_arr, facendo la put() per ognuno
sul rispettivo campo nel file opportuno (LF_TAB1100A o LF_TAB1100B).
Siccome i campi da trasferire sono piu' di 100 e per ora tale limite non puo' essere
superato il trasferimento viene effettuato su 2 files, collegati tramite relazione.
In realta' _iva11_arr e' un _BolgArray, derivato da TAssoc_array,
dove sono definiti i metodi add() e sub(), per aggiungere o sottrarre
importi all'elemento indicato. Gli elementi stessi di _iva11_arr in realta'
non sono solamente real, ma classi derivate da TObject, che contengono un real ed un
int identificante il numero logico del file al quale appartiene il campo.
20 Novembre 1996
AGGIUNTA STAMPA A36 NEI PROGRESSIVI
===================================
Per stampare cio' si e' seguito l'esempio della stampa di AF (ex A35).
Da rilevare, percio', la condizione di raggruppamento di tali progressivi
e la memorizzazione in PIM, nel campo S0. Naturalmente, siccome S0 e' una stringa e
siccome vanno memorizzati sia imponibile che imposta, il campo sara' una TToken_string
i cui elementi (2 real) sono separati da un "!", e non da un "|" per non creare
situazione spiacevoli in caso di scarico/carico da un file testo.
01 Dicembre 1996
CORRETTO TRASFERIMENTO DI PIU' ATTIVITA' SUL FILE TAB1100
=========================================================
La correzione riguarda lo spostamento della funzione iva11_write():
- iva11_write() viene ora chiamata dalla describe_liq(), per aver maggior
controllo sull'azzeramento dei campi R1 ed R2
Ma la modifica principale riguarda la struttura dati utilizzata per memorizzare i dati
trasferire.
Ora si utilizza un assoc_array principale (_iva11_arr) la cui chiave e'
il codice attivita' della ditta. Ogni elemento di _iva11_arr e' a sua
volta un assoc_array, la cui chiave e' come nella versione precedente e' il
nome del campo da trasferire. Per cui le modifiche fatte in iva11_set_arr(),
iva11_set_arr_pim() e iva11_write() riguardano la diversa gestione per
memorizzare e scorrere gli elementi dell'assoc_array _iva11_arr.
20 Ottobre 1997
IMPLEMENTAZIONE PIM13
=========================================================
Implementato il PIM 13, in modo tale da poter eliminare i precedenti
errori relativi al calcolo ventilazione annuale/corrispettivi.
Prima andava a sommare i risultati dei singoli mesi/trimestri: in
realta' per la liquidazione annuale, i mesi vanno considerati
come un tutt'uno. Le modifiche operate sono quindi relative al
ciclo di scansione ed elaborazione del cursore sui movimenti IVA.
Ora non scorre piu' un cursore prima sul mese 1 poi 2, 3, ecc.
ma uno unico da 1 a 13, schiaffando i risultati nel relativo PIM del
mese 13. Nella fase dei calcoli per ventilazione/scorporo scorrispettivi,
non si dovranno piu' fare ripartizioni di importo sui vari mesi precedenti.
Inoltre da ora in avanti per calcolare la liquidazione annuale non sara'
piu' necessario ricalcolare anche i periodi precedenti.
Tutto cio' velocizza un poco il calcolo liquidazione ed il trasferimento ad IVA11.
31 Ottobre 1997
NUOVO PROSPETTO REGIME AGRICOLO
===============================
Queste modifiche valgono dal 1998 in poi.
Aggiunto nuovo FLAG sulla tabella LIA (campo B2), per indicare se
trattasi di agricoltore con volume d'affari minimo: sono stati
quindi modificati programmi di impostazione parametri liquidazione,
apertura anno IVA, oltre a calcolo/stampa.
Il nuovo flag di agricoltore minimo serve per selezionare le ditte
in calcolo liquidazione: se l'anno e' 1998 o successivi E la liquidazione
da calcolare non e' annuale E tale flag e' settato, una determinata ditta
non puo' essere inclusa nella lista dei calcoli da effettuare.
Viene aggiunta una nuova tabella di progressivi (tabella PIA: Progressivi Iva compensazione
Agricoli), il cui tracciato e' il seguente (riportato anche all'inizio)
PIA: Tabella di ditta per memorizzare i Progressivi IVA compensazione Agricoli
CODTAB = ANNO[0-3]+CODATT[4,8]+TIPOATT[9,9]+MESE[10,11]+IVAORD[12,15]+IVACOM[16,19]
R0 = Totale imponibile
R1 = Totale IVA secondo codice IVA di compensazione
Memorizzazione dei progressivi:
tutte le vendite in regime agricolo con "segnalino" a 1 (che termine di merda che usano su
sistema..), vanno sommate distintamente per codice IVA principale + codice IVA compensato.
L'imposta (PIA->R1) va calcolata sul totale imponibile (PIA->R0) per ogni record della tabella,
una volta finita la sommatoria.
Il codice IVA di compensazione, (udite udite!), viene memorizzato sul
PIANO DEI CONTI (nel campo IVACOMP) per ogni SOTTOCONTO di RICAVO(campo INDBIL).
Attenzione: per effettiva congruenza il campo INDBIL e' significativo solo sul
relativo CONTO, indi si procedera' ad una ulteriore rottura/mazzata sui coglioni, in quanto
per ogni movimento IVA si dovranno fare 2 accessi al file del PIANO DEI CONTI:
uno per leggere il codice IVA di compensazione (campo IVACOMP)
uno per leggere se il conto e' di ricavo (campo INDBIL).
Una volta completata la tabella (fatta in recalc_att()), si procedera'
alla descrizione di tali progressivi (describe_agricolo()). Il nuovo prospetto
viene messo poco prima del prospetto agricolo, ma comunque nella stessa pagina.
Nel prospetto agricolo viene aggiunta una riga in piu':
IVA ammessa in detrazione I parte tabella A, il cui importo riguarda il totale
dell'iva vendite compensata. Tale importo (PLM->R13) viene sommato al vecchio totale IVA ammessa
in detrazione, per avere l'importo corretto.
Attenzione, il nuovo calcolo viene applicato solo dal 1998 in poi!!
01 Dicembre 1997
IVA11 '97
=========
- cambiato A13 in VA7
- aggiunte aliquote 7,5% e 20%
Variazioni ai campi di trasferimento
rimossi : EC206, FBC* e FC117
aggiunti FC115 FC116 FC209 FC210
SBI07 SBI08 SBF12 SBF13
XC101...XC111 XC201...XC208 (al posto di FBC*)
AGVE05 AGVE06 ABVE05 ABVE06
AGME05 AGME06 ABME05 ABME06
AGME*, AGVE*, ABME* ABVE* sono stati spostati su TAB1100B
L2, L2BIS sono stati spostati su TAB1100B
05 Dicembre 1997
PRORATA dal 1998
================
Dal 1998 sara' possibile registrare fatture in ritardo con anno data documento
precedente all'anno di registrazione stesso.
In questo caso ll'importo PRORATA del PERIODO (non annuale) deve essere calcolato
applicando la percentuale corrispondente all'anno del documento.
Tutti gli acquisti soggetti a pro-rata devono essere distinti in base all'anno della
data documento e di conseguenza la detraibilita' deve essere evidenziata e
calcolata con due possibili percentuali: una dell'anno attuale e una dell'anno
precedente. Se in fase di liquidazione la tabella dell'anno precedente non esiste
ma esistono acquisti con anno documento relativo all'anno precedente si calcola il
pro-rata con la percentuale corrente, segnalando tuttavia la mancata presenza
di tale tabella per l'anno precedente.
Per far questo e' stato implementato un oggettino: _ProrataItem, cui vengono
settate la percentuale attuale e la percentuale precedente. E' stato implementato
anche un metodo calc_prorata() cui si passa il valore degli acquisti ed un flag
per calcolare con percentuale attuale o precedente. Nella tabella PLM
e' stato recuperato R4 per memorizzare la percentuale pro-rata precedente, inoltre
viene memorizzato in R14 il prorata relativo agli acquisti con riferimento anno
precedente. In B1, infine, viene settato il flag a TRUE se in stampa
esistono documenti dell'anno precedente man non esiste la percentuale
pro-rata ad essa relativi.
Casistiche: (vedi _ProrataItem::set())
- il calcolo vale solo a partire dal 1998
- se le % sono uguali oppure non siamo ancora nel 1998 considera
tutto sull'anno corrente
- se non ha trovato la percentuale anno prec usa quella corrente,
segnalando pero' l'errore.
Ecco quindi svelati i piu' reconditi misteri del programma di liquidazione.
Auguro a chiunque buon divertimento.

View File

@ -93,8 +93,9 @@ bool TMovimentoPN_VE::detraibile(TRectype& rec) const
if (rec.get_int(RMI_TIPODET) != 0)
return FALSE;
const real & p = _caus->reg().prorata();
return p < 100.0;
const int annodoc = curr().get_date(MOV_DATADOC).year();
const bool prorata100 = _caus->reg().prorata100(annodoc);
return !prorata100; // Se prorata = 100% e' indetraibile
}
int TMovimentoPN_VE::bill2pos(const TBill& conto, char tipo)