Patch level : 12.0 594

Files correlati     : cg
Commento            : Patch di Alessandro, corretta generazione buoni automatici e ritenute sociali
This commit is contained in:
Mattia Tollari 2018-06-13 14:29:26 +02:00
parent d58c695098
commit 94a91ea0a3
7 changed files with 90 additions and 55 deletions

View File

@ -222,20 +222,17 @@ bool TCausale::link_industriale() const
bool TCausale::ok() const bool TCausale::ok() const
{ return iva() != iva_errata; } { return iva() != iva_errata; }
char TCausale::sezione(int riga) const char TCausale::sezione(int riga, bool low_level) const
{ {
const TRectype* rec = row(riga); const TRectype* rec = row(riga);
char sez = rec ? toupper(rec->get_char(RCA_SEZIONE)) : ' '; char sez = rec ? toupper(rec->get_char(RCA_SEZIONE)) : ' ';
if (sez <= ' ') // Guess section on tipocf if (sez <= ' ' && !low_level) // Guess section on tipocf
{ {
const TRectype* uno = row(1); const TRectype* uno = row(1);
char tipocf = uno ? toupper(uno->get_char(RCA_TIPOCF)) : ' '; char tipocf = uno ? toupper(uno->get_char(RCA_TIPOCF)) : ' ';
if (tipocf <= ' ') if (tipocf <= ' ')
tipocf = (iva() == iva_vendite) ? 'C' : 'F'; // Guess tipocf on IVA tipocf = (iva() == iva_vendite) ? 'C' : 'F'; // Guess tipocf on IVA
if (tipomov() <= tm_nota_credito)
sez = (tipocf == 'C') ? 'D' : 'A'; sez = (tipocf == 'C') ? 'D' : 'A';
else
sez = (tipocf == 'C') ? 'A' : 'D';
} }
return sez; return sez;
} }
@ -252,9 +249,9 @@ char TCausale::sezione_ritsoc() const
if (_sezione_ritsoc <= ' ') if (_sezione_ritsoc <= ' ')
{ {
const tipo_movimento tm = tipomov(); const tipo_movimento tm = tipomov();
(char&)_sezione_ritsoc = sezione(tm<=tm_nota_credito ? RIGA_RITENUTE_SOCIALI : RIGA_PAG_RITSOC); (char&)_sezione_ritsoc = sezione(tm<=tm_nota_credito ? RIGA_RITENUTE_SOCIALI : RIGA_PAG_RITSOC, true);
if (_sezione_ritsoc < 'A') if (_sezione_ritsoc < 'A')
(char&)_sezione_ritsoc = sezione_clifo(); (char&)_sezione_ritsoc = (tm <= tm_nota_credito ? sezione_clifo() : (sezione_clifo()=='D' ? 'A' :'D'));
} }
return _sezione_ritsoc; return _sezione_ritsoc;
} }
@ -264,9 +261,9 @@ char TCausale::sezione_ritfis() const
if (_sezione_ritfis == ' ') if (_sezione_ritfis == ' ')
{ {
const tipo_movimento tm = tipomov(); const tipo_movimento tm = tipomov();
(char&)_sezione_ritfis = sezione(tm<=tm_nota_credito ? RIGA_RITENUTE_FISCALI : RIGA_PAG_RITFIS); // Fatture o Pagamenti (char&)_sezione_ritfis = sezione(tm<=tm_nota_credito ? RIGA_RITENUTE_FISCALI : RIGA_PAG_RITFIS, true); // Fatture o Pagamenti
if (_sezione_ritfis < 'A') if (_sezione_ritfis < 'A')
(char&)_sezione_ritfis = sezione_clifo(); (char&)_sezione_ritfis = (tm <= tm_nota_credito ? sezione_clifo() : (sezione_clifo() == 'D' ? 'A' : 'D'));
} }
return _sezione_ritfis; return _sezione_ritfis;
} }

View File

@ -68,7 +68,7 @@ public:
const TString& compatible(const TCausale& c) const; const TString& compatible(const TCausale& c) const;
char sezione(int riga) const; char sezione(int riga, bool low_level = false) const;
char sezione_clifo() const; char sezione_clifo() const;
char sezione_ritsoc() const; char sezione_ritsoc() const;
char sezione_ritfis() const; char sezione_ritfis() const;

View File

@ -1277,8 +1277,9 @@ bool TPrimanota_application::notify_edit_pagamento(TPartita& p, TRectype& new_pa
const real new_ritenute(new_pag.get(PAGSCA_RITENUTE)); const real new_ritenute(new_pag.get(PAGSCA_RITENUTE));
if (old_ritenute != new_ritenute) if (old_ritenute != new_ritenute)
{ {
const TImporto grow_ritenute(sez, new_ritenute-old_ritenute); const TImporto grow_ritenute(causale().sezione_ritfis(), new_ritenute - old_ritenute);
const int riga = type2pos('F'); const int riga = type2pos('F');
if (riga < 0) if (riga < 0)
{ {
TBill conto_rit; causale().bill(RIGA_PAG_RITFIS, conto_rit); TBill conto_rit; causale().bill(RIGA_PAG_RITFIS, conto_rit);

View File

@ -196,6 +196,7 @@ void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad,
const TRiga_partite& sum = p.riga(nrigp); const TRiga_partite& sum = p.riga(nrigp);
_assigned = oldpag.get_int(PAGSCA_NRIGA) != TPartita::UNASSIGNED; _assigned = oldpag.get_int(PAGSCA_NRIGA) != TPartita::UNASSIGNED;
_tipomov = sum.tipo(); _tipomov = sum.tipo();
_swap_ritfis = sum.sezione() != sum.sezione_ritfis();
_swap_ritsoc = sum.sezione() != sum.sezione_ritsoc(); _swap_ritsoc = sum.sezione() != sum.sezione_ritsoc();
const TRiga_partite& fatt = _assigned ? scad.riga() : sum; const TRiga_partite& fatt = _assigned ? scad.riga() : sum;
@ -283,12 +284,15 @@ void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad,
real oldimp = oldpag.get_real(in_valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO); real oldimp = oldpag.get_real(in_valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO);
if (!in_valuta) if (!in_valuta)
{ {
if (_swap_ritsoc)
oldimp += oldpag.get_real(PAGSCA_RITENUTE); oldimp += oldpag.get_real(PAGSCA_RITENUTE);
else
oldimp -= oldpag.get_real(PAGSCA_RITENUTE);
if (_swap_ritsoc) if (_swap_ritsoc)
oldimp -= oldpag.get_real(PAGSCA_RITSOC);
else
oldimp += oldpag.get_real(PAGSCA_RITSOC); oldimp += oldpag.get_real(PAGSCA_RITSOC);
else
oldimp -= oldpag.get_real(PAGSCA_RITSOC);
} }
// Ricorda l'importo da pagare // Ricorda l'importo da pagare
@ -415,7 +419,12 @@ bool TPay_mask::importo_handler(TMask_field& f, KEY k)
#endif #endif
if (m.field(S_RITENUTE).active()) if (m.field(S_RITENUTE).active())
{
if (m._swap_ritfis)
imp += m.get_real(S_RITENUTE);
else
imp -= m.get_real(S_RITENUTE); imp -= m.get_real(S_RITENUTE);
}
if (m.field(S_RITSOC).active()) if (m.field(S_RITSOC).active())
{ {
if (m._swap_ritsoc) if (m._swap_ritsoc)
@ -436,13 +445,18 @@ bool TPay_mask::importo_handler(TMask_field& f, KEY k)
real i(f.get()); real i(f.get());
if (m.field(S_RITENUTE).active()) if (m.field(S_RITENUTE).active())
{
if (m._swap_ritfis)
i += m.get_real(S_RITENUTE); i += m.get_real(S_RITENUTE);
else
i -= m.get_real(S_RITENUTE);
}
if (m.field(S_RITSOC).active()) if (m.field(S_RITSOC).active())
{ {
if (m._swap_ritsoc) if (m._swap_ritsoc)
i -= m.get_real(S_RITSOC);
else
i += m.get_real(S_RITSOC); i += m.get_real(S_RITSOC);
else
i -= m.get_real(S_RITSOC);
} }
TMask_field& sa = m.field(S_SALDOACC); TMask_field& sa = m.field(S_SALDOACC);
@ -949,6 +963,8 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
} }
const int lastp = scad.last(); const int lastp = scad.last();
TImporto ritenute;
for (int pa = scad.first(); pa <= lastp; pa = scad.succ(pa)) for (int pa = scad.first(); pa <= lastp; pa = scad.succ(pa))
{ {
const TRectype& pag = scad.row(pa); const TRectype& pag = scad.row(pa);
@ -967,7 +983,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
if (in_valuta) if (in_valuta)
{ {
gm.add_importo(row, imp); gm.add_importo(row, imp);
gm.add_importo(row, TImporto(sez, pag.get_real(PAGSCA_IMPORTOVAL)), prima_valuta.codice()); gm.add_importo(row, TImporto(sum.sezione_ritfis(), pag.get_real(PAGSCA_IMPORTOVAL)), prima_valuta.codice());
} }
else else
{ {
@ -984,22 +1000,27 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
// Le ritenute non possono esistere in valuta // Le ritenute non possono esistere in valuta
if (!in_valuta) if (!in_valuta)
{ {
const TImporto rit(sez, pag.get_real(PAGSCA_RITENUTE)); const TImporto rit(sum.sezione_ritfis() == 'A' ? 'D' : 'A', pag.get_real(PAGSCA_RITENUTE));
if (!rit.is_zero()) if (!rit.is_zero())
{ {
TToken_string& rrit = gm.add_colored_row(sheet, 'R'); TToken_string& rrit = gm.add_colored_row(sheet, 'R');
rrit.add(TR("Ritenute professionali"), 4); rrit.add(TR("Ritenute professionali"), 4);
gm.add_importo(rrit, rit, FALSE); gm.add_importo(rrit, rit, FALSE);
rrit.add((int)sum.tipo(), 11); rrit.add((int)sum.tipo(), 11);
ritenute += rit;
} }
const TImporto soc(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC)); const TImporto soc(sum.sezione_ritsoc() == 'A' ? 'D' : 'A', pag.get_real(PAGSCA_RITSOC));
if (!soc.is_zero()) if (!soc.is_zero())
{ {
TToken_string& rrit = gm.add_colored_row(sheet, 'R'); TToken_string& rrit = gm.add_colored_row(sheet, 'R');
rrit.add(TR("Ritenute sociali"), 4); rrit.add(TR("Ritenute sociali"), 4);
gm.add_importo(rrit, soc, FALSE); gm.add_importo(rrit, soc, FALSE);
rrit.add((int)sum.tipo(), 11); rrit.add((int)sum.tipo(), 11);
ritenute += soc;
} }
} }
@ -1047,7 +1068,10 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
rsal.add(TR("Saldo rata "), 4); rsal << ra; rsal.add(TR("Saldo rata "), 4); rsal << ra;
if (!scad.chiusa()) if (!scad.chiusa())
{ {
TImporto sl = scad.residuo(false); TImporto sl = scad.residuo(false, 0x7);
if (!in_valuta)
sl += ritenute;
gm.add_importo(rsal, sl); gm.add_importo(rsal, sl);
tot_lit += sl; tot_lit += sl;

View File

@ -39,6 +39,7 @@ class TPay_mask : public TMask
bool _assigned; bool _assigned;
bool _can_solder; bool _can_solder;
bool _swap_ritfis;
bool _swap_ritsoc; bool _swap_ritsoc;
protected: protected:

View File

@ -400,8 +400,8 @@ TImporto TRiga_scadenze::importo_pagato(bool val, int mode) const
totale += TImporto(sez, pag.get_real(imp_field)); totale += TImporto(sez, pag.get_real(imp_field));
if (!in_val && (mode & 0x8)) // Le ritenute non esistono nei pagamenti in valuta if (!in_val && (mode & 0x8)) // Le ritenute non esistono nei pagamenti in valuta
{ {
totale += TImporto(sez, pag.get_real(PAGSCA_RITENUTE)); totale -= TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITENUTE));
totale += TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC)); totale -= TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC));
} }
if (mode & 0x2) // Voglio anche gli abbuoni if (mode & 0x2) // Voglio anche gli abbuoni
@ -823,12 +823,20 @@ tipo_pagamento TRiga_partite::tipo_pag() const
} }
// Calcola il segno delle ritenute sociali in base alla causale // Calcola il segno delle ritenute sociali in base alla causale
char TRiga_partite::sezione_ritfis() const
{
const int anno = get_int(PART_ANNO);
const TCausale & caus = cached_causale(get(PART_CODCAUS), anno);
return caus.sezione_ritfis();
}
char TRiga_partite::sezione_ritsoc() const char TRiga_partite::sezione_ritsoc() const
{ {
TString16 key; key << get(PART_CODCAUS) << '|' << RIGA_PAG_RITSOC; // Riga ritenute sociali const int anno = get_int(PART_ANNO);
const char sez_cau = cache().get(LF_RCAUSALI, key, RCA_SEZIONE)[0]; const TCausale & caus = cached_causale(get(PART_CODCAUS), anno);
const char sez_rit = sez_cau > ' ' ? (sez_cau == 'D' ? 'A' : 'D') : sezione();
return sez_rit; return caus.sezione_ritsoc();
} }
// Legge le rate relative ad una riga di fattura // Legge le rate relative ad una riga di fattura
@ -979,12 +987,15 @@ TImporto TRiga_partite::importo(bool valuta, int mode) const
if (in_euro && (mode & 0x8)) // Ritenute Fiscali e/o sociali if (in_euro && (mode & 0x8)) // Ritenute Fiscali e/o sociali
{ {
// Ritenute Fiscali // Ritenute Fiscali
if (sezione() == sezione_ritsoc())
i.valore() -= get_real(PART_RITENUTE);
else
i.valore() += get_real(PART_RITENUTE); i.valore() += get_real(PART_RITENUTE);
// Ritenute Sociali // Ritenute Sociali
if (sezione() == sezione_ritsoc()) if (sezione() == sezione_ritsoc())
i.valore() += get_real(PART_RITSOC);
else
i.valore() -= get_real(PART_RITSOC); i.valore() -= get_real(PART_RITSOC);
else
i.valore() += get_real(PART_RITSOC);
} }
if (mode & 0x2) if (mode & 0x2)

View File

@ -191,6 +191,7 @@ public:
int ultima_rata_con_abbuoni_diffcam() const; int ultima_rata_con_abbuoni_diffcam() const;
char sezione() const { return get_char(PART_SEZ); } char sezione() const { return get_char(PART_SEZ); }
char sezione_ritfis() const;
char sezione_ritsoc() const; char sezione_ritsoc() const;
TImporto importo(bool valuta, int mode = 0xF) const; TImporto importo(bool valuta, int mode = 0xF) const;