Patch level : 12.0 1038
Files correlati : cg2.exe Commento : Corretta registrazione saldaconto note di accredito in split payment
This commit is contained in:
parent
a4a750edf3
commit
e85b8880ad
@ -999,7 +999,7 @@ void TPrimanota_application::init_insert_mode(TMask& m)
|
||||
|
||||
void TPrimanota_application::f1_init_modify(TMask& m, const TRectype& mov)
|
||||
{
|
||||
const bool after_data_inizio_fe = mov.get_date(MOV_DATADOC) >= fp_settings().get_data_start_fatt();
|
||||
const bool after_data_inizio_fe = mov.get_date(MOV_DATADOC) >= get_data_start_fatt();
|
||||
|
||||
if (m.find_by_id(F_COLFPPRO) != nullptr && after_data_inizio_fe)
|
||||
m.set(F_COLFPPRO, mov.get(MOV_KEYFPPRO).empty() ? " " : "X");
|
||||
|
@ -500,6 +500,27 @@ bool TPrimanota_application::ci_sono_importi(const TSheet_field& s) const
|
||||
return false;
|
||||
}
|
||||
|
||||
TImporto TPrimanota_application::imposte_split_pay() const
|
||||
{
|
||||
TImporto imposte;
|
||||
TSheet_field& cg = app().cgs();
|
||||
|
||||
for (int i = 0; i < cg.items(); i++)
|
||||
{
|
||||
TToken_string& r = cg.row(i);
|
||||
const char tipo = app().row_type(r);
|
||||
|
||||
if (tipo == cgrowtype_IVAsplit)
|
||||
{
|
||||
TImporto imposta; imposta = r;
|
||||
|
||||
if (!imposta.is_zero())
|
||||
imposte += imposta;
|
||||
}
|
||||
}
|
||||
return imposte;
|
||||
}
|
||||
|
||||
real TPrimanota_application::calcola_saldo() const
|
||||
{
|
||||
const bool pag = is_pagamento() && !_as400;
|
||||
@ -621,9 +642,10 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
|
||||
|
||||
const bool in_valuta = is_true_value(m.get(SK_VALUTA));
|
||||
TImporto saldaconto, saldaconto_val;
|
||||
|
||||
TImporto imposte;
|
||||
TSheet_field& cg = a.cgs();
|
||||
bool empty = true;
|
||||
|
||||
for (int i = 0; i < cg.items(); i++)
|
||||
{
|
||||
TToken_string& r = cg.row(i);
|
||||
@ -653,8 +675,7 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
|
||||
if (!co.empty() && !co.find())
|
||||
return f.error_box("Il conto di contropartita della riga %d non esiste", i+1);
|
||||
}
|
||||
|
||||
empty = false;
|
||||
empty = false;
|
||||
if (paga || nota)
|
||||
{
|
||||
if (tipo == cgrowtype_cliforsc || tipo == cgrowtype_totale || a._as400)
|
||||
@ -662,6 +683,11 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
|
||||
const int currig = i+1;
|
||||
const TImporto speso = a.partite().importo_speso(numreg, currig);
|
||||
|
||||
if (nota && m.get_bool(F_SPLITPAY))
|
||||
{
|
||||
imposte = a.imposte_split_pay();
|
||||
importo -= imposte;
|
||||
}
|
||||
bool errato = importo != speso;
|
||||
if (errato && a._as400 && speso.is_zero())
|
||||
errato = false;
|
||||
@ -743,10 +769,10 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
|
||||
if ((paga || nota) && !a._as400)
|
||||
{
|
||||
const char sez(a.causale().sezione(2));
|
||||
const TImporto totdoc(sez, m.get_real(F_TOTALE));
|
||||
TImporto totdoc(sez, m.get_real(F_TOTALE)); totdoc += imposte;
|
||||
bool ok = imptot_error(totdoc, saldaconto, false);
|
||||
|
||||
if (ok && in_valuta && !saldaconto.is_zero())
|
||||
if (ok && in_valuta && !saldaconto.is_zero()) // non tolgo le imposte perchè penso che lo split payment in valuta non esista
|
||||
{
|
||||
const TImporto totdoc_val(sez, m.get_real(SK_TOTDOCVAL));
|
||||
ok = imptot_error(totdoc_val, saldaconto_val, true);
|
||||
@ -2226,7 +2252,7 @@ bool TPrimanota_application::caus_query_handler(TMask_field& f, KEY key)
|
||||
|
||||
void TPrimanota_application::check_fppro_fields(TMask& m)
|
||||
{
|
||||
const bool after_data = m.get_date(F_DATAREG) >= fp_settings().get_data_start_fatt();
|
||||
const bool after_data = m.get_date(F_DATAREG) >= get_data_start_fatt();
|
||||
|
||||
if (!check_causale(m.get(F_CODCAUS)) || !app().has_module(FPAUT) || !after_data)
|
||||
{
|
||||
|
163
src/cg/cg2102.h
163
src/cg/cg2102.h
@ -31,11 +31,88 @@
|
||||
|
||||
#define K_ELIMMAS 0 // Key per eliminazione massima
|
||||
|
||||
class TPro_msk;
|
||||
class TDati_mov_auto;
|
||||
|
||||
enum CGMaskType { _query = 0, _no_iva = 1, _iva = 2, _occas = 3};
|
||||
|
||||
class TPro_msk : public TAutomask
|
||||
{
|
||||
public:
|
||||
struct riga_iva_s;
|
||||
struct scadenza_s;
|
||||
private:
|
||||
TString _numero;
|
||||
TDate _datadoc;
|
||||
real _totdoc;
|
||||
real _ritenute;
|
||||
TProtocollo _protfppro;
|
||||
TString _fpprokeys;
|
||||
TString _piva;
|
||||
TString _codforn;
|
||||
vector<riga_iva_s> _righe_iva;
|
||||
vector<scadenza_s> _scadenze;
|
||||
bool _riporta;
|
||||
|
||||
// Handlers per aggancio FPPRO
|
||||
// Bottone riporta doc FPPRO in testata Prima Nota
|
||||
// static bool riporta_handler(TMask_field& f, KEY k);
|
||||
// static bool collega_handler(TMask_field& f, KEY k);
|
||||
// static bool piva_handler(TMask_field& f, KEY k);
|
||||
// static bool date_handler(TMask_field& f, KEY k);
|
||||
// Non permette la selezione multipla
|
||||
void fppro_selfatt() const;
|
||||
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
|
||||
public:
|
||||
struct riga_iva_s
|
||||
{
|
||||
real imponibile;
|
||||
real imposta;
|
||||
real aliquota;
|
||||
TString4 natura;
|
||||
char esigibilita;
|
||||
};
|
||||
struct scadenza_s
|
||||
{
|
||||
TDate data;
|
||||
real importo;
|
||||
};
|
||||
|
||||
bool should_bring_back() const { return _riporta; }
|
||||
bool is_doc_split() ;
|
||||
|
||||
void set_righeiva(const char* fpprokeys);
|
||||
void set_scadenze(const char* fpprokeys);
|
||||
void set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* ritenute, const char* protfppro, const char* fpprokeys, const char* codforn, const char* piva);
|
||||
|
||||
TString get_numdoc() const { return _numero; }
|
||||
TDate get_datadoc() const { return _datadoc; }
|
||||
real get_totdoc() const { return _totdoc; }
|
||||
real get_ritenute() const { return _ritenute; }
|
||||
TString get_fpprokeys() const { return _fpprokeys; }
|
||||
TString get_codforn() const { return _codforn; }
|
||||
TString get_piva() const { return _piva; }
|
||||
const vector<riga_iva_s>& get_righeiva() const { return _righe_iva; }
|
||||
const TProtocollo& get_protocollo() const { return _protfppro; }
|
||||
const vector<scadenza_s>& get_scadenze() const { return _scadenze; }
|
||||
real get_tot_imp_riva() ;
|
||||
|
||||
void add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura, char esigib);
|
||||
void add_scad(const TDate& date, const real& importo);
|
||||
|
||||
static TString& query_fppro(const TString& codforn, const TString& date);
|
||||
static TString& query_fppro(const TString& stato_piva, const TString& piva, const TString& date);
|
||||
static TString& query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TString& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order = true, bool piva_research = false);
|
||||
static TString& query_string();
|
||||
|
||||
void abilita_piva();
|
||||
|
||||
// Carica documenti FPPRO sulla maschera
|
||||
bool riporta(TMask_field& f);
|
||||
bool load_fppro_mask(TMask & msk);
|
||||
|
||||
TPro_msk(TMask& cg_msk);
|
||||
};
|
||||
|
||||
class TPrimanota_application : public TRelation_application
|
||||
{
|
||||
TMovimentoPN* _rel; // Relazione principale
|
||||
@ -400,92 +477,12 @@ public:
|
||||
TImporto get_cgs_imp(int n) const;
|
||||
|
||||
|
||||
TImporto imposte_split_pay() const;
|
||||
|
||||
TPrimanota_application();
|
||||
virtual ~TPrimanota_application() { }
|
||||
};
|
||||
|
||||
class TPro_msk : public TAutomask
|
||||
{
|
||||
public:
|
||||
struct riga_iva_s;
|
||||
struct scadenza_s;
|
||||
private:
|
||||
TString _numero;
|
||||
TDate _datadoc;
|
||||
real _totdoc;
|
||||
real _ritenute;
|
||||
TProtocollo _protfppro;
|
||||
TString _fpprokeys;
|
||||
TString _piva;
|
||||
TString _codforn;
|
||||
vector<riga_iva_s> _righe_iva;
|
||||
vector<scadenza_s> _scadenze;
|
||||
bool _riporta;
|
||||
|
||||
// Handlers per aggancio FPPRO
|
||||
// Bottone carica documenti in maschera FPPRO
|
||||
static bool fppro_handler(TMask_field& f, KEY k);
|
||||
// Bottone riporta doc FPPRO in testata Prima Nota
|
||||
static bool riporta_handler(TMask_field& f, KEY k);
|
||||
static bool collega_handler(TMask_field& f, KEY k);
|
||||
static bool piva_handler(TMask_field& f, KEY k);
|
||||
static bool date_handler(TMask_field& f, KEY k);
|
||||
// Non permette la selezione multipla
|
||||
void fppro_selfatt() const;
|
||||
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
|
||||
public:
|
||||
struct riga_iva_s
|
||||
{
|
||||
real imponibile;
|
||||
real imposta;
|
||||
real aliquota;
|
||||
TString4 natura;
|
||||
char esigibilita;
|
||||
};
|
||||
struct scadenza_s
|
||||
{
|
||||
TDate data;
|
||||
real importo;
|
||||
};
|
||||
|
||||
bool should_bring_back() const { return _riporta; }
|
||||
bool is_doc_split();
|
||||
|
||||
void set_righeiva(const char* fpprokeys);
|
||||
void set_scadenze(const char* fpprokeys);
|
||||
void set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* ritenute, const char* protfppro, const char* fpprokeys, const char* codforn, const char* piva);
|
||||
|
||||
TString get_numdoc() const { return _numero; }
|
||||
TDate get_datadoc() const { return _datadoc; }
|
||||
real get_totdoc() const { return _totdoc; }
|
||||
real get_ritenute() const { return _ritenute; }
|
||||
TString get_fpprokeys() const { return _fpprokeys; }
|
||||
TString get_codforn() const { return _codforn; }
|
||||
TString get_piva() const { return _piva; }
|
||||
const vector<riga_iva_s>& get_righeiva() const { return _righe_iva; }
|
||||
TProtocollo& get_protocollo() { return _protfppro; }
|
||||
vector<scadenza_s>& get_scadenze() { return _scadenze; }
|
||||
real get_tot_imp_riva();
|
||||
|
||||
|
||||
void add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura, char esigib);
|
||||
void add_scad(const TDate& date, const real& importo);
|
||||
|
||||
|
||||
static TString& query_fppro(const TString& codforn, const TString& date);
|
||||
static TString& query_fppro(const TString& stato_piva, const TString& piva, const TString& date);
|
||||
static TString& query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TString& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order = true, bool piva_research = false);
|
||||
static TString& query_string();
|
||||
|
||||
static void abilita_piva(TMask* msk);
|
||||
|
||||
// Carica documenti FPPRO sulla maschera
|
||||
static bool load_fppro_mask(TMask* msk, KEY k = 32);
|
||||
|
||||
TPro_msk() = delete;
|
||||
TPro_msk(TMask& cg_msk);
|
||||
};
|
||||
|
||||
bool& is_f1();
|
||||
TString& num_doc_rif();
|
||||
|
||||
|
@ -1154,7 +1154,7 @@ bool TPrimanota_application::showpartite_handler(TMask_field& f, KEY k)
|
||||
if (k == K_ENTER)
|
||||
{
|
||||
const long curreg = cm.insert_mode() ? NUMREG_PROVVISORIO : cm.get_long(F_NUMREG);
|
||||
const TImporto importo(a.get_cgs_imp(riga));
|
||||
TImporto importo(a.get_cgs_imp(riga));
|
||||
const TImporto speso(a.partite().importo_speso(curreg, riga+1));
|
||||
|
||||
if (tipo == cgrowtype_cliforsc && !speso.is_zero())
|
||||
@ -1162,7 +1162,12 @@ bool TPrimanota_application::showpartite_handler(TMask_field& f, KEY k)
|
||||
a.disable_cgs_cells(riga, cgrowtype_cliforsc);
|
||||
a.cgs().force_update(riga);
|
||||
}
|
||||
if ((tipo == cgrowtype_totale) && is_nota && cm.get_bool(F_SPLITPAY))
|
||||
{
|
||||
const TImporto imposte = a.imposte_split_pay();
|
||||
|
||||
importo -= imposte;
|
||||
}
|
||||
if (importo != speso)
|
||||
{
|
||||
TString msg(128);
|
||||
|
@ -788,10 +788,21 @@ void TGame_mask::aggiorna_residuo()
|
||||
{
|
||||
#ifndef __EXTRA__
|
||||
_importo = app().get_cgs_imp(_numrig-1); // Importo sulla riga contabile
|
||||
const TMask & cm = app().curr_mask();
|
||||
|
||||
const bool is_nota = app().causale().tipomov() == 2 && cm.field(F_NUMRIF).active();
|
||||
|
||||
if (is_nota && cm.get_bool(F_SPLITPAY))
|
||||
{
|
||||
const TImporto imposte = app().imposte_split_pay();
|
||||
|
||||
_importo -= imposte;
|
||||
}
|
||||
_residuo = _importo;
|
||||
|
||||
TPartite_array& giochi = app().partite();
|
||||
const TImporto speso = giochi.importo_speso(_numreg, _numrig);
|
||||
const TImporto speso = giochi.importo_speso(_numreg, _numrig);
|
||||
|
||||
_residuo -= speso; // Residuo della riga
|
||||
|
||||
const char sez = calcola_sezione(); // Sezione di riferimento
|
||||
|
@ -1789,6 +1789,7 @@ void TMovimentoPN::update_rev_charge()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int TMovimentoPN::read_mov_rows()
|
||||
{
|
||||
const TRectype& mov = curr();
|
||||
|
Loading…
x
Reference in New Issue
Block a user