Supporto per split payment

git-svn-id: svn://10.65.10.50/branches/R_10_00@23049 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2015-02-24 08:54:55 +00:00
parent e1b494f330
commit 240f2e8cf5
9 changed files with 121 additions and 89 deletions

View File

@ -29,13 +29,13 @@
class TDoc_recordset : public TISAM_recordset
{
TDocumentoEsteso* _doc;
TRecnotype _mypos;
TRecnotype _mypos, _lastpos;
protected:
virtual const TVariant& get_field(int logic, const char* field) const;
public:
virtual TRecnotype items() const;
virtual TRecnotype items() const { return _lastpos; }
virtual TRecnotype current_row() const { return _mypos; }
virtual bool move_to(TRecnotype pos);
@ -46,11 +46,6 @@ public:
virtual ~TDoc_recordset();
};
TRecnotype TDoc_recordset::items() const
{
return _doc->rows();
}
TRiga_documento& TDoc_recordset::riga_doc(int n) const
{
if (n <= 0)
@ -59,7 +54,7 @@ TRiga_documento& TDoc_recordset::riga_doc(int n) const
n = _doc->new_row("05").get_int(RDOC_NRIGA); // Crea ua riga descrizione fittizia
if (n <= 0)
n = 1;
return (*_doc)[n];
return _doc->row(n);
}
bool TDoc_recordset::move_to(TRecnotype pos)
@ -130,7 +125,7 @@ static int compare_rdocs(const TObject** p1, const TObject** p2)
}
TDoc_recordset::TDoc_recordset(const TRecordset& doc, const TString& old_query)
: TISAM_recordset(old_query), _doc(NULL), _mypos(-1)
: TISAM_recordset(old_query), _doc(NULL), _mypos(-1), _lastpos(-1)
{
TRectype curr(LF_DOC);
@ -201,6 +196,8 @@ TDoc_recordset::TDoc_recordset(const TRecordset& doc, const TString& old_query)
}
_doc->set_riga_conai();
_doc->set_riga_tic();
_doc->set_riga_split();
_lastpos = _doc->rows();
// Posiziona correttamente anche il cursore principale
*cursor() = 0L;

View File

@ -636,11 +636,13 @@ public:
real calc_conai_qta(TCONAI_class type) const;
real valore(bool totale, bool lordo = false, int ndec = AUTO_DECIMALS) const;
const TString & codice_costo() const;
const TString & codice_commessa() const;
const TString & fase_commessa() const;
TArticolo & articolo() const;
TArticolo_giacenza & articolo_giacenza() const;
const TString& codice_costo() const;
const TString& codice_commessa() const;
const TString& fase_commessa() const;
TArticolo& articolo() const;
TArticolo_giacenza& articolo_giacenza() const;
void set_descr(const char* descr); // Setta DESCR ed eventualmente DESCLUNGA+DESCEST
TRiga_documento(TDocumento* doc, const char* tipo = NULL);
TRiga_documento(const TRiga_documento & row);
@ -871,7 +873,7 @@ public:
real provvigione(bool first = true, int ndec = AUTO_DECIMALS) const;
real valore(bool totale, bool lordo = false, int ndec = AUTO_DECIMALS) const;
TPagamento & pagamento();
TPagamento& pagamento();
void update_spese_aut(TString_array & spese, bool preserve_old = FALSE, TSheet_field * sh = NULL);
real calc_conai_qta(TCONAI_class type);

View File

@ -1096,6 +1096,30 @@ void TRiga_documento::cms2tipodet()
}
}
void TRiga_documento::set_descr(const char* descr)
{
const int descr_len = length(RDOC_DESCR);
TString s = descr; s.rtrim();
int split_pos = s.find('\n');
if (split_pos < 0 && s.len() > descr_len)
split_pos = descr_len;
if (split_pos > descr_len)
split_pos = descr_len;
if (split_pos > 0)
{
put(RDOC_DESCR, s.left(split_pos));
const TString& dest = s.mid(split_pos);
put(RDOC_DESCLUNGA, "X");
put(RDOC_DESCEST, dest);
}
else
{
put(RDOC_DESCR, s);
zero(RDOC_DESCLUNGA);
zero(RDOC_DESCEST);
}
}
void TRiga_documento::autosave(TSheet_field& f)
{
const int num = numero() - 1;
@ -1117,26 +1141,7 @@ void TRiga_documento::autosave(TSheet_field& f)
for (int l = 0; l<4 ; l++)
doc().livelli().pack_grpcode(liv,row.get(f.cid2index(FR_LIV1+l)),l+1);
put( RDOC_LIVELLO, liv); // da modificare
TString s = row.get(f.cid2index(FR_DESCR)); s.rtrim();
int split_pos = s.find('\n');
const int descr_len = length(RDOC_DESCR);
if (split_pos < 0 && s.len() > descr_len)
split_pos = descr_len;
if (split_pos > descr_len)
split_pos = descr_len;
if (split_pos > 0)
{
put(RDOC_DESCR, s.left(split_pos));
const TString& dest = s.mid(split_pos);
put(RDOC_DESCLUNGA, "X");
put(RDOC_DESCEST, dest);
}
else
{
put(RDOC_DESCR, s);
zero(RDOC_DESCLUNGA);
zero(RDOC_DESCEST);
}
set_descr(row.get(f.cid2index(FR_DESCR)));
const int prezzo_id = f.cid2index(FR_PREZZO);
real prezzo(row.get(prezzo_id));

View File

@ -993,7 +993,7 @@ void TDocumento::set_riga_esenzione()
{
_tipo_riga_es = "05";
conf.set("TRESENZ", _tipo_riga_es);
warning_box("Il tipo riga esenzione non risultava impostato.\n L'applicazione usera' automaticamente il tipo %s", (const char*) _tipo_riga_es);
warning_box("Il tipo riga esenzione non risultava impostato.\n L'applicazione userà automaticamente il tipo %s", (const char*) _tipo_riga_es);
}
_des_esenz = conf.get("DESESENZ", "ve");
if (_des_esenz.not_empty())
@ -1005,12 +1005,9 @@ void TDocumento::set_riga_esenzione()
TString d(256); d = _des_esenz;
d << format(" come da vostra dichiarazione n. %s del %s da noi annotata al n. %s il %s.",
(const char *) v_esenzione, (const char *) v_data_esenzione,
(const char *) n_registrazione, (const char *) n_data_registrazione);
_esenzione->put(RDOC_DESCR, d.left(50));
_esenzione->put(RDOC_DESCLUNGA, "X");
_esenzione->put(RDOC_DESCEST, d.mid(50));
(const char*)v_esenzione, (const char*)v_data_esenzione,
(const char*)n_registrazione, (const char*)n_data_registrazione);
_esenzione->set_descr(d);
}
}
@ -1018,17 +1015,17 @@ void TDocumento::dirty_fields()
{
if (!_dirty_deny)
{
for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field();
f != NULL; f = (TDocumento_variable_field *) succ_variable_field())
for (TDocumento_variable_field* f = (TDocumento_variable_field*)first_variable_field();
f != NULL; f = (TDocumento_variable_field*)succ_variable_field())
f->set_dirty();
dirty_tabella_iva();
if (loaded_rows(LF_RIGHEDOC)) // Se ho gia' caricato delle righe in memoria
if (loaded_rows(LF_RIGHEDOC)) // Se ho già caricato delle righe in memoria
{
TRecord_array& righe = body(LF_RIGHEDOC);
for (int i = righe.last_row(); i > 0; i = righe.pred_row(i))
{
TRiga_documento & r = (TRiga_documento &) righe[i];
TRiga_documento& r = (TRiga_documento&)righe[i];
r.dirty_fields(FALSE);
}
}
@ -2461,7 +2458,7 @@ real TDocumento::ritenute(const char tipo, bool lordo, int ndec) const
real val;
for (int i = rows(); i > 0; i--)
{
const TRiga_documento& r = operator[](i);
const TRiga_documento& r = ((TDocumento*)this)->row(i);
val += r.ritenuta(tipo, lordo, ndec);
}
return val;
@ -2726,19 +2723,9 @@ void TDocumento::update_raee()
d << " - ";
d << r1.get(RDOC_DESCR);
d << r1.get(RDOC_DESCEST);
r1.put(RDOC_DESCR, d.left(50));
if (d.len() > 50)
{
r1.put(RDOC_DESCLUNGA, "X");
r1.put(RDOC_DESCEST, d.mid(50));
}
else
{
r1.zero(RDOC_DESCLUNGA);
r1.zero(RDOC_DESCEST);
}
const TString & um = sp.um();
r1.set_descr(d);
const TString& um = sp.um();
if (um.full())
r1.put(RDOC_UMQTA, um);
if (cod_iva_cli.blank())

View File

@ -24,13 +24,10 @@ TTipo_documento::TTipo_documento(const char* tipodoc)
TTipo_documento::TTipo_documento(const TRectype& rec)
: TRectype(rec), _tipocf('\0')
{
read_formule();
}
{ read_formule(); }
TTipo_documento::~TTipo_documento()
{
}
{ }
int TTipo_documento::read(const char* tipodoc)
{

View File

@ -274,16 +274,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out)
memo << " - ";
memo << riferimento;
}
const int maxlen = rout.length(RDOC_DESCR);
if (memo.len() < maxlen)
rout.put(RDOC_DESCR, memo);
else
{
rout.put(RDOC_DESCR, memo.left(maxlen));
rout.put(RDOC_DESCEST, memo.mid(maxlen));
rout.put(RDOC_DESCLUNGA, true);
}
rout.set_descr(memo);
}
else //else if(rif_packed)...
{

View File

@ -1,5 +1,11 @@
#include "velib05.h"
#include <diction.h>
#include <utility.h>
#include "../cg/cglib03.h"
#include <causali.h>
/////////////////////////////////////////////////////////////
//TDocumentoEsteso
@ -244,7 +250,7 @@ int TDocumentoEsteso::readat(TBaseisamfile& file, TRecnotype nrec, word lockop)
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec)
: TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
_conai(NULL), _tic(NULL)
_conai(NULL), _tic(NULL), _split(NULL)
{
// Inizializza i parametri di default
@ -253,20 +259,21 @@ TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec)
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm)
: TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
_conai(NULL), _tic(NULL)
_conai(NULL), _tic(NULL), _split(NULL)
{
_parm = parm;
}
TDocumentoEsteso::TDocumentoEsteso()
: TDocumento(), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
_conai(NULL), _tic(NULL)
_conai(NULL), _tic(NULL), _split(NULL)
{ }
TDocumentoEsteso::~TDocumentoEsteso()
{
if (_conai) delete _conai;
if (_tic) delete _tic;
if (_split) delete _split;
}
void TDocumentoEsteso::set_riga_conai()
@ -276,7 +283,7 @@ void TDocumentoEsteso::set_riga_conai()
delete _conai;
_conai = NULL;
}
if (rows() > 0)
if (physical_rows() > 0)
{
const bool has_conai = (tipo().add_conai() && clifor().vendite().get_bool(CFV_CONAIASS));
if (has_conai)
@ -318,11 +325,49 @@ void TDocumentoEsteso::set_riga_tic()
}
}
bool TDocumentoEsteso::is_split_payment() const
{
const long numregcg = get_long(DOC_NUMREG);
if (numregcg > 0)
{
const TRectype& mov = cache().get(LF_MOV, numregcg);
if (!mov.empty())
return ::is_split_payment(mov);
}
bool yes = get_int(DOC_ANNO) >= 2015 && clifor().get_bool(CLI_SPLITPAY) &&
(is_fattura() || is_nota_credito()) && !imposta().is_zero() && ritenute().is_zero();
if (yes)
{
const TRectype& causale = cache().get(LF_CAUSALI, tipo().causale());
const int rsi = causale.get_int(CAU_REGSPIVA);
yes = rsi != 13 && rsi != 50 && rsi != 51; // No reverse charge
}
return yes;
}
void TDocumentoEsteso::set_riga_split()
{
if (_split != NULL)
{
delete _split;
_split = NULL;
}
if (is_split_payment())
{
_split = new TRiga_documento(this, "05");
TString split = esc(ini_get_string(CONFIG_DITTA, "ve", "DESCSPLIT", TR("SCISSIONE DEI PAGAMENTI Art.17-ter D.P.R. 633/72")));
if (split[0] > ' ') split.insert("\n");
_split->set_descr(split);
}
}
int TDocumentoEsteso::rows() const
{
int n = TDocumento::rows();
if (_conai) n++;
if (_tic) n++;
if (_tic) n++;
if (_split) n++;
return n;
}
@ -331,10 +376,12 @@ TRiga_documento& TDocumentoEsteso::row(int index)
const int n = TDocumento::rows();
if (index > n)
{
if (_conai != NULL && _tic != NULL)
return index == n+1 ? *_conai : *_tic;
else
return _conai ? *_conai : *_tic;
TRiga_documento* extra[4] = { NULL };
int ne = 0;
if (_conai) extra[ne++] = _conai;
if (_tic ) extra[ne++] = _tic;
if (_split) extra[ne++] = _split;
return *extra[index-n-1];
}
return TDocumento::row(index);
}

View File

@ -22,6 +22,7 @@ class TDocumentoEsteso : public TDocumento
dec_parm _parm; // Parametri per gli arrotondamenti
TRiga_documento* _conai;
TRiga_documento* _tic;
TRiga_documento* _split;
// membri per il calcolo del riepilogo IVA
@ -51,13 +52,14 @@ public:
int summary_items() { return tabella_iva().items();} // ritorna il numero di righe in totale della tabellina
const TAssoc_array& summary() const { return _summary_table; }
const TArray& summary_array() const { return _summary_array;}
bool is_split_payment() const;
// Funzioni per il ricalcolo delle scadenze
void scadenze_reset(); // riposiziona sulla prima scadenza
void scadenze_recalc(); // resetta e ricalcola le scadenze
void scadenze_set_next(); // seleziona il prossimo elemento dell'array delle scadenze
const char * scadenze_get(const TString& w); // reperisce l'informazione richiesta dall'elemento corrente
int scadenze_items() { return _scadenze_array.items(); } // restituisce il numero di scadenze
int scadenze_items() const { return _scadenze_array.items(); } // restituisce il numero di scadenze
TString_array& scadenze() { return _scadenze_array; }
// restituisce tot_imponibili, tot_esenti, tot_nonsoggetti a seconda del selettore:
@ -72,8 +74,9 @@ public:
virtual int rows() const;
virtual TRiga_documento& row(int index);
void set_riga_conai();
void set_riga_conai();
void set_riga_tic();
void set_riga_split();
// Funzioni per settare i parametri
void set_decimals(const dec_parm & parm) { _parm = parm ; }
@ -85,3 +88,4 @@ public:
};
#endif

View File

@ -1195,11 +1195,13 @@ void TDocumento_mask::cli2mask(bool force_load)
set_or_def(F_CATVEN, ven_rec.get(CFV_CATVEN));
const int alleg = c.get_int(CLI_ALLEG);
const bool ivadiff = (alleg == 7) && ven_rec.get_bool(CFV_FATTSOSP);
const TDate datadoc = doc().get(DOC_DATADOC);
const bool split_payment = datadoc.year() >= 2015 && c.get_bool(CLI_SPLITPAY);
const bool ivadiff = !split_payment && alleg == 7 && ven_rec.get_bool(CFV_FATTSOSP);
set(F_LIQDIFF, ivadiff ? "X" : "");
const TDate datadoc = doc().get(DOC_DATADOC);
const bool IVAxCassa = !ivadiff && (alleg < 5 || alleg == 7) && gestione_IVAxCassa(datadoc);
const bool IVAxCassa = !split_payment && !ivadiff && alleg < 5 && gestione_IVAxCassa(datadoc);
set(F_IVAXCASSA, IVAxCassa ? "X" : "");
pos = id2pos(F_CODLIST);