Modifiche per gestione IVA x cassa registrata in ritardo

git-svn-id: svn://10.65.10.50/branches/R_10_00@23002 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2014-10-27 08:19:49 +00:00
parent 537c54ac01
commit dc46bc0acc
10 changed files with 93 additions and 25 deletions

View File

@ -2396,8 +2396,11 @@ bool TPrimanota_application::link_anal(const TMask& msk, const char* action)
{
TConfig config(ini, "Transaction");
config.set("Action", action);
/* Attualmente genera solo problemi al Cigno che ha CI e CM ma non ha CA
if (has_module(CIAUT) && !has_module(CAAUT))
config.set("Mode", "A"); // Salva automaticamente i movimenti di sola industriale
*/
TString4 para; para << LF_MOVANA;
config.set_paragraph(para);

View File

@ -640,9 +640,14 @@ bool TLiquidazione_app::sarebbe_da_pagare(const TRectype& mov, const TDate& fine
if (mov.get_int(MOV_TIPOMOV) != tm_fattura)
return false;
const TDate datareg = mov.get(MOV_DATAREG);
const long giorni = fine - datareg;
if (giorni < 0)
// La data di riferimento sarebbe quella di consegna della merce, ma non avendola usiamo la data documento.
// In assenza della data documento siamo costretti ad usare la data di registrazione
const TDate data_reg = mov.get(MOV_DATAREG);
const TDate data_doc = mov.get(MOV_DATADOC);
const TDate data_rif = data_doc.ok() && data_doc < data_reg ? data_doc : data_reg;
const long giorni = fine - data_rif;
if (giorni < 0 || fine < data_reg) // Diana 2000 registra a Settebre 2014 fatture con data ducumento nel 2013!
return false;
if (mov.get_bool(MOV_LIQDIFF))
@ -1075,7 +1080,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
}
#ifndef NDEBUG
if (_mov->get_long(MOV_NUMREG) == 14281)
if (_mov->get_long(MOV_NUMREG) == 15985)
int cazzone = 1;
#endif
@ -1142,7 +1147,48 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
}
if (sarebbe_da_pagare(_mov->curr(), fine))
{
rp.calcola_pagato_periodo(TDate(0L), fine, pg, nc, NULL);
TPointer_array pagscaold;
rp.calcola_pagato_periodo(TDate(0L), fine, pg, nc, &pagscaold);
// Controllo se ci siam persi delle note di credito negli anni scorsi
if (!nc.is_zero() && pagscaold.items() > pagscatt.items())
{
FOR_EACH_ARRAY_ITEM(pagscaold, i, obj)
{
const TRectype& pagsca = *(const TRectype*)obj;
const int anno = pagsca.get_int(PAGSCA_ANNO);
const int nrigp = pagsca.get_int(PAGSCA_NRIGP);
// Appartiene all'anno scorso?
if (anno < year_int && nrigp < 999) // 9999 on pagsca -> 999 on ivadiff
{
const TPartita& p = arrpart.partita(pagsca);
const TRiga_partite& rp = p.riga(nrigp);
// E' veramente una nota di credito?
if (rp.tipo() == tm_nota_credito)
{
bool found = false;
FOR_EACH_ARRAY_ITEM(pagscatt, j, ps)
{
if (ps == obj)
{
found = true;
break;
}
}
if (!found)
{
TLocalisamfile id(LF_IVADIFF);
id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
id.put("NUMPRO", nrigp);
if (id.read(_isequal) != NOERR || id.get_int("ANNOLIQ") == 0)
pagscatt.add(obj);
}
}
}
}
}
TImporto saldo = rp.importo(false);
saldo += pg; saldo += nc;
saldo.normalize(sezfat);
@ -1394,6 +1440,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
if (!d.ok())
d = rp.get(PART_DATAREG);
idcurr.put("DATAREGP", d);
idcurr.put("ANNOLIQ", d.year());
pagtmp = p.importo_pagsca(pagsca);
pagtmp.normalize(sezpag);
ultimo = (r == pagscatt.last()) && partita_chiusa_al(p, fine);
@ -1405,11 +1452,11 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
idcurr.put("NUMREGP", _mov->get(MOV_NUMREG));
idcurr.put("NUMRIGP", nrigp);
idcurr.put("DATAREGP", _mov->get(MOV_DATAINC));
idcurr.put("ANNOLIQ", year_int);
pagtmp.set(sezpag, pagsca.get_real(PAGSCA_IMPORTO));
ultimo = true;
}
idcurr.put("ANNOLIQ", year_int);
int meseliq = id.get_date("DATAREGP").month();
if (_freqviva[0] == 'T')
{

View File

@ -1228,11 +1228,11 @@ messaggio TStampa_registri_app::controlla_liquidazione()
}
if (need_refresh)
{
continua = yesno_box(FR("Ditta %s: la liquidazione di alcuni mesi precedenti deve "
"essere ricalcolata.\n"
"Si desidera ugualmente proseguire?"),(const char*)ditta);
continua = yesno_box(FR("Ditta %s: la liquidazione di alcuni mesi precedenti deve essere ricalcolata.\n"
"Si desidera ugualmente proseguire?"), (const char*)ditta);
if (!continua) return non_proseguire;
continua = yesno_box(TR("Si desidera proseguire con il calcolo e la stampa di liquidazione? \n (altrimenti si prosegue con la sola stampa liquidazione)"));
continua = yesno_box(TR("Si desidera proseguire con il calcolo e la stampa di liquidazione?\n"
"(altrimenti si prosegue con la sola stampa liquidazione)"));
if (!continua) return prosegui_stampa;
return prosegui_cal_stampa;
}

View File

@ -367,7 +367,7 @@ END
VALUTA FFR_REGIMP(11) 18
BEGIN
PROMPT 1 36 ""
PROMPT 29 36 ""
END
VALUTA FFR_REGIVA(11) 18

View File

@ -64,7 +64,7 @@ public:
virtual ~TEsercizi_contabili() {}
};
TEsercizi_contabili & esercizi();
TEsercizi_contabili& esercizi();
enum TipoIVA
{

View File

@ -33,7 +33,7 @@ static int codind2tipodet(const TString & codind, real& perc)
return tipodet;
}
real indetraibile_al(const TString& codind, const TCausale& caus, int annodoc, int & tipodet,const bool is_liq)
real indetraibile_al(const TString& codind, const TCausale& caus, int /*annodoc*/, int & tipodet,const bool is_liq)
{
real perc;

View File

@ -1119,6 +1119,11 @@ int TRiga_partite::calcola_pagato_periodo(const TDate& dal, const TDate& al, TIm
if (!is_fattura())
return flag;
#ifdef DBG
if (get_long(PART_NREG) == 15985)
int cazzone = 2;
#endif
TPointer_array pags;
const int lastr = rate();
@ -1139,17 +1144,20 @@ int TRiga_partite::calcola_pagato_periodo(const TDate& dal, const TDate& al, TIm
}
}
// Cerco di gestire anche i non assegnati sulla unica fattura di una partita
const TRecord_array& unas = partita().unassigned();
if (unas.rows() > 0)
// Conto le fatture presenti in partita
int fatture = 0;
for (int r = partita().last(); r > 0 && fatture < 2; r = partita().pred(r))
{
int fatture = 0;
for (int r = partita().last(); r > 0 && fatture < 2; r = partita().pred(r))
{
if (partita().riga(r).tipo() == tm_fattura)
fatture++;
}
if (fatture == 1)
const TRiga_partite& rp = partita().riga(r);
fatture += rp.tipo() == tm_fattura ? 1 : 0;
}
// Se c'è una sola fattura posso fare dei ragionamenti
if (fatture == 1)
{
// Cerco di gestire anche i non assegnati
const TRecord_array& unas = partita().unassigned();
if (unas.rows() > 0)
{
for(int r = unas.last_row(); r > 0; r = unas.pred_row(r))
{

View File

@ -184,8 +184,9 @@ public:
tipo_movimento tipo() const;
tipo_pagamento tipo_pag() const;
bool is_fattura() const { return tipo() == tm_fattura; }
bool is_fattura() const { return tipo() == tm_fattura; }
bool is_nota_credito() const { return tipo() == tm_nota_credito; }
bool is_insoluto() const { return tipo() == tm_insoluto; }
int ultima_ratapagata() const;
int ultimo_pagamento(int rata) const;
int ultima_rata_con_abbuoni_diffcam() const;

View File

@ -48,6 +48,7 @@
#define F_IBAN_INC 152
#define F_PROG 153
#define F_CREDITOR_ID 154
#endif//__CGTBBNP_H

View File

@ -405,7 +405,7 @@ ENDPAGE
PAGE "Parametri Distinte" 0 -1 77 20
GROUPBOX DLG_NULL 78 5
GROUPBOX DLG_NULL 78 6
BEGIN
PROMPT 1 1 "@bParametri emissione distinte su file"
END
@ -426,6 +426,14 @@ BOOLEAN F_IBAN_INC
BEGIN
PROMPT 2 4 "Genera IBAN su distinte di incasso"
FIELD B2
MESSAGE FALSE DISABLE,F_CREDITOR_ID
MESSAGE TRUE ENABLE, F_CREDITOR_ID
END
STRING F_CREDITOR_ID 25
BEGIN
PROMPT 2 5 "Creditor ID per R.I.D. "
FIELD S4
END
ENDPAGE