Patch level : 12.0 796

Files correlati     : tf0200
Commento            :
- Aggiunta possibilità di registrare liquidazione IVA periodica utilizzando o no la data di competenza. CON SCELTA DIVERSA PER ATTIVE E PASSIVE [Fix #34]
This commit is contained in:
Simone Palacino 2019-05-23 12:32:06 +02:00
parent cba0a593eb
commit 9c263a4e72
3 changed files with 105 additions and 64 deletions

View File

@ -21,8 +21,10 @@
#define CAMPI_CON_BOOLEAN F_TOTOPATT
#define CONF_MODULO "tf"
#define LAST_DATACOMP "LASTCOMP"
#define FLAG_MOD "FLDATACOMPMOD"
#define LAST_DATACOMP_ATT "LASTCOMPATT"
#define LAST_DATACOMP_PAS "LASTCOMPPAS"
#define FLAG_ATT_MOD "ATTDATACOMPMOD"
#define FLAG_PAS_MOD "PASDATACOMPMOD"
#define STOP "$$"
// ComLiqPerIva: Comunicazione Liquidazioni Periodiche IVA
@ -213,7 +215,8 @@ void calcola_credito_prec(real& creprec, real& creaprec, bool mensile, int anno,
class TCom_liq_per_iva_msk : public TAutomask
{
bool _last_elab; // Flag per controllare se hanno cambiato il tipo di elaborazione (data competenza)
bool _last_elab_att; // Flags per controllare se hanno cambiato il tipo di elaborazione (data competenza)
bool _last_elab_pas;
protected:
bool _mensile;
// Aggiunta questa variabile per specificare se è stato impostato un tipo di liquidazione.
@ -221,32 +224,46 @@ protected:
bool _init_liq;
TRectype _true_data;
void write_datacomp_mod(bool enabled);
void write_datacomp_mod(bool enabled, bool attive);
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void extractinator();
void check_old_value(int field, const real& val);
public:
TCom_liq_per_iva_msk() : TAutomask("tf0200a"), _true_data(LF_IVALIQ), _init_liq(false)
{
_last_elab = ini_get_bool(CONFIG_DITTA, CONF_MODULO, LAST_DATACOMP, false);
_last_elab_att = ini_get_bool(CONFIG_DITTA, CONF_MODULO, LAST_DATACOMP_ATT, false);
_last_elab_pas = ini_get_bool(CONFIG_DITTA, CONF_MODULO, LAST_DATACOMP_PAS, false);
first_focus(F_ANNO);
}
void save_gen();
};
void TCom_liq_per_iva_msk::write_datacomp_mod(const bool enabled)
void TCom_liq_per_iva_msk::write_datacomp_mod(const bool enabled, bool attive)
{
int count = 0;
TString line = ini_get_string(CONFIG_DITTA, CONF_MODULO, FLAG_MOD, STOP, count);
for (; line != STOP; line = ini_get_string(CONFIG_DITTA, CONF_MODULO, FLAG_MOD, STOP, ++count)) { }
TString line;
const TDate today(TODAY);
TString mod; mod << user() << (enabled ? "|E|" : "|D|") << today.month() << "." << today.day();
ini_set_string(CONFIG_DITTA, CONF_MODULO, FLAG_MOD, mod, count);
if (attive)
{
line = ini_get_string(CONFIG_DITTA, CONF_MODULO, FLAG_ATT_MOD, STOP, count);
for (; line != STOP; line = ini_get_string(CONFIG_DITTA, CONF_MODULO, FLAG_ATT_MOD, STOP, ++count)) {}
ini_set_string(CONFIG_DITTA, CONF_MODULO, FLAG_ATT_MOD, mod, count);
ini_set_bool(CONFIG_DITTA, CONF_MODULO, LAST_DATACOMP, enabled);
_last_elab = enabled;
ini_set_bool(CONFIG_DITTA, CONF_MODULO, LAST_DATACOMP_ATT, enabled);
_last_elab_att = enabled;
}
else
{
line = ini_get_string(CONFIG_DITTA, CONF_MODULO, FLAG_PAS_MOD, STOP, count);
for (; line != STOP; line = ini_get_string(CONFIG_DITTA, CONF_MODULO, FLAG_PAS_MOD, STOP, ++count)) {}
ini_set_string(CONFIG_DITTA, CONF_MODULO, FLAG_PAS_MOD, mod, count);
ini_set_bool(CONFIG_DITTA, CONF_MODULO, LAST_DATACOMP_PAS, enabled);
_last_elab_pas = enabled;
}
}
bool TCom_liq_per_iva_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
@ -319,20 +336,28 @@ bool TCom_liq_per_iva_msk::on_field_event(TOperable_field& o, TField_event e, lo
}
}
break;
case F_DATA_COMP:
case F_ATT_COMP:
if(e == fe_init)
set(F_DATA_COMP, _last_elab ? "X" : " ");
set(F_ATT_COMP, _last_elab_att ? "X" : " ");
else if(e == fe_modify)
warning_box("Attenzione la modifica di questo valore comporta un diverso calcolo dei righi VP2 VP3. L'utente è pregato di controllarne la correttezza.\nSi consiglia di ricalcolare e rispedire tutti periodi dell'anno");
warning_box("Attenzione la modifica di questo valore comporta un diverso calcolo dei rigo VP2. L'utente è pregato di controllarne la correttezza.\nSi consiglia di ricalcolare e rispedire tutti periodi dell'anno");
break;
case F_PAS_COMP:
if (e == fe_init)
set(F_PAS_COMP, _last_elab_pas ? "X" : " ");
else if (e == fe_modify)
warning_box("Attenzione la modifica di questo valore comporta un diverso calcolo dei rigo VP3. L'utente è pregato di controllarne la correttezza.\nSi consiglia di ricalcolare e rispedire tutti periodi dell'anno");
break;
case DLG_SAVEREC:
if(e == fe_button)
{
bool data_comp = get_bool(F_DATA_COMP);
if (data_comp != _last_elab)
{
write_datacomp_mod(data_comp);
}
bool att_dt_comp = get_bool(F_ATT_COMP);
bool pas_dt_comp = get_bool(F_PAS_COMP);
if (att_dt_comp != _last_elab_att)
write_datacomp_mod(att_dt_comp, true);
if (pas_dt_comp != _last_elab_pas)
write_datacomp_mod(pas_dt_comp, false);
}
if(e != fe_init && !_true_data.empty())
_true_data.write_rewrite(TLocalisamfile(LF_IVALIQ));
@ -456,11 +481,12 @@ void TCom_liq_per_iva_msk::extractinator() // Per gli amici GTFO
real ivaver = ZERO;
real ivaverc = ZERO;
const bool elab_dt_comp = get_bool(F_DATA_COMP);
const bool att_dt_comp = get_bool(F_ATT_COMP);
const bool pas_dt_comp = get_bool(F_PAS_COMP);
for(; start <= end; start++)
{
TDate data_da(1, start, anno);
TDate data_a(1, start + (elab_dt_comp ? 1 : 0), anno); data_a.set_end_month();
TDate data_a(1, start + 1, anno); data_a.set_end_month();
bool has_ixc = gestione_IVAxCassa(data_da);
/****************************************************************************************************************
@ -488,59 +514,68 @@ void TCom_liq_per_iva_msk::extractinator() // Per gli amici GTFO
cur_iva.set_var("#DADATAREG", data_da);
cur_iva.set_var("#ADATAREG", data_a);
for(bool ok = cur_iva.move_first(); ok; ok = cur_iva.move_next())
for (bool ok = cur_iva.move_first(); ok; ok = cur_iva.move_next())
{
TString totat, totpas, i;
// Controllo che sia un movimento con codice non "non soggetto"
TCodiceIVA codiva(cur_iva.get(FIELD_NAME(LF_RMOVIVA, RMI_CODIVA)).as_string());
if(codiva.tipo() == "NS") continue;
if (codiva.tipo() == "NS") continue;
// Controllo che la registrazione sia di del mese che mi interessa o con flag "liquidazione periodo precedente"
const int month_reg = cur_iva.get("23." MOV_DATAREG).as_date().month();
const int month_liq = cur_iva.get("23." MOV_MESELIQ).as_int();
// month_liq viene valorizzato solo se è del mese precedente o sempre? Nei record vecchi ovviamente sarà a zero ma adesso che ci mette?
if (elab_dt_comp && ((month_reg == start && (month_liq == 0 || month_liq == month_reg)) || start == month_liq)
|| !elab_dt_comp)
// Prendo il tipo di registro
TRegistro reg(cur_iva.get(FIELD_NAME(LF_MOV, MOV_REG)).as_string(), anno);
int tiporeg = reg.tipo();
bool is_corrispettivo = reg.corrispettivi();
// Prendiamo l'imponibile
real imp = cur_iva.get("25.IMPONIBILE").as_real();
real imposta = cur_iva.get("25.IMPOSTA").as_real();
if (tiporeg == iva_acquisti)
{
// Prendo il tipo di registro
TRegistro reg(cur_iva.get(FIELD_NAME(LF_MOV, MOV_REG)).as_string(), anno);
int tiporeg = reg.tipo();
bool is_corrispettivo = reg.corrispettivi();
if ((!att_dt_comp || !((month_reg == start && (month_liq == 0 || month_liq == month_reg)) || start == month_liq))
&& (att_dt_comp || cur_iva.get(LF_MOV, MOV_DATAREG).as_date().month() == data_a.month()))
continue;
}
else
{
if ((!pas_dt_comp || !((month_reg == start && (month_liq == 0 || month_liq == month_reg)) || start == month_liq))
&& (pas_dt_comp || cur_iva.get(LF_MOV, MOV_DATAREG).as_date().month() == data_a.month()))
continue;
}
// Prendiamo l'imponibile
real imp = cur_iva.get("25.IMPONIBILE").as_real();
real imposta = cur_iva.get("25.IMPOSTA").as_real();
// Se è un movimento IvaXCassa o LiqDiff
if (has_ixc && (cur_iva.get("23.IVAXCASSA").as_bool() || cur_iva.get("23.LIQDIFF").as_bool()))
// Se è un movimento IvaXCassa o LiqDiff
if (has_ixc && (cur_iva.get("23.IVAXCASSA").as_bool() || cur_iva.get("23.LIQDIFF").as_bool()))
{
if (tiporeg == iva_vendite)
totopattxc += imp;
else
totoppasxc += imp;
}
else
{
if (tiporeg == iva_vendite)
{
if (tiporeg == iva_vendite)
totopattxc += imp;
else
totoppasxc += imp;
// Controllo il reverse charge, non va calcolato nel totale delle operazioni attive!
// Se non ha una riga di movimento non lo sommo
TString key_rc = cur_iva.get("23.NUMREG").as_string(); key_rc << "|1";
if (!cache().get(LF_RMOV, key_rc).empty())
{
// Controllo se è un corrispettivo non scorporato (imponibile e iva assieme)
if (is_corrispettivo && codiva.percentuale() > ZERO && imposta == ZERO)
{
// Nell'imponibile è presente il totale fattura, devo calcolare l'imposta e sottrarla
// Es iva 22% => imp : 122 = x : 100
codiva.scorpora(imp);
}
totopatt += imp;
}
}
else
{
if (tiporeg == iva_vendite)
{
// Controllo il reverse charge, non va calcolato nel totale delle operazioni attive!
// Se non ha una riga di movimento non lo sommo
TString key_rc = cur_iva.get("23.NUMREG").as_string(); key_rc << "|1";
if (!cache().get(LF_RMOV, key_rc).empty())
{
// Controllo se è un corrispettivo non scorporato (imponibile e iva assieme)
if (is_corrispettivo && codiva.percentuale() > ZERO && imposta == ZERO)
{
// Nell'imponibile è presente il totale fattura, devo calcolare l'imposta e sottrarla
// Es iva 22% => imp : 122 = x : 100
codiva.scorpora(imp);
}
totopatt += imp;
}
}
else
totoppas += imp;
}
totoppas += imp;
}
}

View File

@ -33,7 +33,8 @@
#define F_IMPNOVER 133
#define F_VEREFF 134
#define F_GENERATA 135
#define F_DATA_COMP 136
#define F_ATT_COMP 136
#define F_PAS_COMP 137
/* Booleani controllo modifiche (+50 rispetto al campo a cui si riferisce) */

View File

@ -24,9 +24,14 @@ ENDPAGE
PAGE "Impostazioni" 0 2 0 0
BOOLEAN F_DATA_COMP
BOOLEAN F_ATT_COMP
BEGIN
PROMPT 1 0 "@BElaborare per data competenza"
PROMPT 1 0 "@BAttive: Elaborare per data competenza"
END
BOOLEAN F_PAS_COMP
BEGIN
PROMPT 50 0 "@BPassive: Elaborare per data competenza"
END
NUMBER F_CODDITTA 5