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 class TDoc_recordset : public TISAM_recordset
{ {
TDocumentoEsteso* _doc; TDocumentoEsteso* _doc;
TRecnotype _mypos; TRecnotype _mypos, _lastpos;
protected: protected:
virtual const TVariant& get_field(int logic, const char* field) const; virtual const TVariant& get_field(int logic, const char* field) const;
public: public:
virtual TRecnotype items() const; virtual TRecnotype items() const { return _lastpos; }
virtual TRecnotype current_row() const { return _mypos; } virtual TRecnotype current_row() const { return _mypos; }
virtual bool move_to(TRecnotype pos); virtual bool move_to(TRecnotype pos);
@ -46,11 +46,6 @@ public:
virtual ~TDoc_recordset(); virtual ~TDoc_recordset();
}; };
TRecnotype TDoc_recordset::items() const
{
return _doc->rows();
}
TRiga_documento& TDoc_recordset::riga_doc(int n) const TRiga_documento& TDoc_recordset::riga_doc(int n) const
{ {
if (n <= 0) 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 n = _doc->new_row("05").get_int(RDOC_NRIGA); // Crea ua riga descrizione fittizia
if (n <= 0) if (n <= 0)
n = 1; n = 1;
return (*_doc)[n]; return _doc->row(n);
} }
bool TDoc_recordset::move_to(TRecnotype pos) 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) 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); 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_conai();
_doc->set_riga_tic(); _doc->set_riga_tic();
_doc->set_riga_split();
_lastpos = _doc->rows();
// Posiziona correttamente anche il cursore principale // Posiziona correttamente anche il cursore principale
*cursor() = 0L; *cursor() = 0L;

View File

@ -636,11 +636,13 @@ public:
real calc_conai_qta(TCONAI_class type) const; real calc_conai_qta(TCONAI_class type) const;
real valore(bool totale, bool lordo = false, int ndec = AUTO_DECIMALS) const; real valore(bool totale, bool lordo = false, int ndec = AUTO_DECIMALS) const;
const TString & codice_costo() const; const TString& codice_costo() const;
const TString & codice_commessa() const; const TString& codice_commessa() const;
const TString & fase_commessa() const; const TString& fase_commessa() const;
TArticolo & articolo() const; TArticolo& articolo() const;
TArticolo_giacenza & articolo_giacenza() 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(TDocumento* doc, const char* tipo = NULL);
TRiga_documento(const TRiga_documento & row); TRiga_documento(const TRiga_documento & row);
@ -871,7 +873,7 @@ public:
real provvigione(bool first = true, int ndec = AUTO_DECIMALS) const; real provvigione(bool first = true, int ndec = AUTO_DECIMALS) const;
real valore(bool totale, bool lordo = false, 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); void update_spese_aut(TString_array & spese, bool preserve_old = FALSE, TSheet_field * sh = NULL);
real calc_conai_qta(TCONAI_class type); 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) void TRiga_documento::autosave(TSheet_field& f)
{ {
const int num = numero() - 1; const int num = numero() - 1;
@ -1117,26 +1141,7 @@ void TRiga_documento::autosave(TSheet_field& f)
for (int l = 0; l<4 ; l++) for (int l = 0; l<4 ; l++)
doc().livelli().pack_grpcode(liv,row.get(f.cid2index(FR_LIV1+l)),l+1); doc().livelli().pack_grpcode(liv,row.get(f.cid2index(FR_LIV1+l)),l+1);
put( RDOC_LIVELLO, liv); // da modificare put( RDOC_LIVELLO, liv); // da modificare
TString s = row.get(f.cid2index(FR_DESCR)); s.rtrim(); set_descr(row.get(f.cid2index(FR_DESCR)));
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);
}
const int prezzo_id = f.cid2index(FR_PREZZO); const int prezzo_id = f.cid2index(FR_PREZZO);
real prezzo(row.get(prezzo_id)); real prezzo(row.get(prezzo_id));

View File

@ -993,7 +993,7 @@ void TDocumento::set_riga_esenzione()
{ {
_tipo_riga_es = "05"; _tipo_riga_es = "05";
conf.set("TRESENZ", _tipo_riga_es); 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"); _des_esenz = conf.get("DESESENZ", "ve");
if (_des_esenz.not_empty()) if (_des_esenz.not_empty())
@ -1005,12 +1005,9 @@ void TDocumento::set_riga_esenzione()
TString d(256); d = _des_esenz; TString d(256); d = _des_esenz;
d << format(" come da vostra dichiarazione n. %s del %s da noi annotata al n. %s il %s.", 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*)v_esenzione, (const char*)v_data_esenzione,
(const char *) n_registrazione, (const char *) n_data_registrazione); (const char*)n_registrazione, (const char*)n_data_registrazione);
_esenzione->set_descr(d);
_esenzione->put(RDOC_DESCR, d.left(50));
_esenzione->put(RDOC_DESCLUNGA, "X");
_esenzione->put(RDOC_DESCEST, d.mid(50));
} }
} }
@ -1018,17 +1015,17 @@ void TDocumento::dirty_fields()
{ {
if (!_dirty_deny) if (!_dirty_deny)
{ {
for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field(); for (TDocumento_variable_field* f = (TDocumento_variable_field*)first_variable_field();
f != NULL; f = (TDocumento_variable_field *) succ_variable_field()) f != NULL; f = (TDocumento_variable_field*)succ_variable_field())
f->set_dirty(); f->set_dirty();
dirty_tabella_iva(); 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); TRecord_array& righe = body(LF_RIGHEDOC);
for (int i = righe.last_row(); i > 0; i = righe.pred_row(i)) 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); r.dirty_fields(FALSE);
} }
} }
@ -2461,7 +2458,7 @@ real TDocumento::ritenute(const char tipo, bool lordo, int ndec) const
real val; real val;
for (int i = rows(); i > 0; i--) 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); val += r.ritenuta(tipo, lordo, ndec);
} }
return val; return val;
@ -2726,19 +2723,9 @@ void TDocumento::update_raee()
d << " - "; d << " - ";
d << r1.get(RDOC_DESCR); d << r1.get(RDOC_DESCR);
d << r1.get(RDOC_DESCEST); d << r1.get(RDOC_DESCEST);
r1.put(RDOC_DESCR, d.left(50)); r1.set_descr(d);
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();
const TString& um = sp.um();
if (um.full()) if (um.full())
r1.put(RDOC_UMQTA, um); r1.put(RDOC_UMQTA, um);
if (cod_iva_cli.blank()) 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) TTipo_documento::TTipo_documento(const TRectype& rec)
: TRectype(rec), _tipocf('\0') : TRectype(rec), _tipocf('\0')
{ { read_formule(); }
read_formule();
}
TTipo_documento::~TTipo_documento() TTipo_documento::~TTipo_documento()
{ { }
}
int TTipo_documento::read(const char* tipodoc) 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 << " - ";
memo << riferimento; memo << riferimento;
} }
rout.set_descr(memo);
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);
}
} }
else //else if(rif_packed)... else //else if(rif_packed)...
{ {

View File

@ -1,5 +1,11 @@
#include "velib05.h" #include "velib05.h"
#include <diction.h> #include <diction.h>
#include <utility.h>
#include "../cg/cglib03.h"
#include <causali.h>
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
//TDocumentoEsteso //TDocumentoEsteso
@ -244,7 +250,7 @@ int TDocumentoEsteso::readat(TBaseisamfile& file, TRecnotype nrec, word lockop)
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec) TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec)
: TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1), : 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 // Inizializza i parametri di default
@ -253,20 +259,21 @@ TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec)
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm) TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm)
: TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1), : TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
_conai(NULL), _tic(NULL) _conai(NULL), _tic(NULL), _split(NULL)
{ {
_parm = parm; _parm = parm;
} }
TDocumentoEsteso::TDocumentoEsteso() TDocumentoEsteso::TDocumentoEsteso()
: TDocumento(), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1), : TDocumento(), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
_conai(NULL), _tic(NULL) _conai(NULL), _tic(NULL), _split(NULL)
{ } { }
TDocumentoEsteso::~TDocumentoEsteso() TDocumentoEsteso::~TDocumentoEsteso()
{ {
if (_conai) delete _conai; if (_conai) delete _conai;
if (_tic) delete _tic; if (_tic) delete _tic;
if (_split) delete _split;
} }
void TDocumentoEsteso::set_riga_conai() void TDocumentoEsteso::set_riga_conai()
@ -276,7 +283,7 @@ void TDocumentoEsteso::set_riga_conai()
delete _conai; delete _conai;
_conai = NULL; _conai = NULL;
} }
if (rows() > 0) if (physical_rows() > 0)
{ {
const bool has_conai = (tipo().add_conai() && clifor().vendite().get_bool(CFV_CONAIASS)); const bool has_conai = (tipo().add_conai() && clifor().vendite().get_bool(CFV_CONAIASS));
if (has_conai) 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 TDocumentoEsteso::rows() const
{ {
int n = TDocumento::rows(); int n = TDocumento::rows();
if (_conai) n++; if (_conai) n++;
if (_tic) n++; if (_tic) n++;
if (_split) n++;
return n; return n;
} }
@ -331,10 +376,12 @@ TRiga_documento& TDocumentoEsteso::row(int index)
const int n = TDocumento::rows(); const int n = TDocumento::rows();
if (index > n) if (index > n)
{ {
if (_conai != NULL && _tic != NULL) TRiga_documento* extra[4] = { NULL };
return index == n+1 ? *_conai : *_tic; int ne = 0;
else if (_conai) extra[ne++] = _conai;
return _conai ? *_conai : *_tic; if (_tic ) extra[ne++] = _tic;
if (_split) extra[ne++] = _split;
return *extra[index-n-1];
} }
return TDocumento::row(index); return TDocumento::row(index);
} }

View File

@ -22,6 +22,7 @@ class TDocumentoEsteso : public TDocumento
dec_parm _parm; // Parametri per gli arrotondamenti dec_parm _parm; // Parametri per gli arrotondamenti
TRiga_documento* _conai; TRiga_documento* _conai;
TRiga_documento* _tic; TRiga_documento* _tic;
TRiga_documento* _split;
// membri per il calcolo del riepilogo IVA // 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 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 TAssoc_array& summary() const { return _summary_table; }
const TArray& summary_array() const { return _summary_array;} const TArray& summary_array() const { return _summary_array;}
bool is_split_payment() const;
// Funzioni per il ricalcolo delle scadenze // Funzioni per il ricalcolo delle scadenze
void scadenze_reset(); // riposiziona sulla prima scadenza void scadenze_reset(); // riposiziona sulla prima scadenza
void scadenze_recalc(); // resetta e ricalcola le scadenze void scadenze_recalc(); // resetta e ricalcola le scadenze
void scadenze_set_next(); // seleziona il prossimo elemento dell'array delle 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 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; } TString_array& scadenze() { return _scadenze_array; }
// restituisce tot_imponibili, tot_esenti, tot_nonsoggetti a seconda del selettore: // restituisce tot_imponibili, tot_esenti, tot_nonsoggetti a seconda del selettore:
@ -72,8 +74,9 @@ public:
virtual int rows() const; virtual int rows() const;
virtual TRiga_documento& row(int index); virtual TRiga_documento& row(int index);
void set_riga_conai(); void set_riga_conai();
void set_riga_tic(); void set_riga_tic();
void set_riga_split();
// Funzioni per settare i parametri // Funzioni per settare i parametri
void set_decimals(const dec_parm & parm) { _parm = parm ; } void set_decimals(const dec_parm & parm) { _parm = parm ; }
@ -85,3 +88,4 @@ public:
}; };
#endif #endif

View File

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