Patch level : 12.0 1038

Files correlati     : cg2.exe
Commento :

Corretta registrazione saldaconto note di accredito in split payment
This commit is contained in:
Alessandro Bonazzi 2021-03-06 02:36:41 +01:00
parent a4a750edf3
commit e85b8880ad
6 changed files with 132 additions and 92 deletions

View File

@ -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");

View File

@ -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)
{

View File

@ -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();

View File

@ -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);

View File

@ -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

View File

@ -1789,6 +1789,7 @@ void TMovimentoPN::update_rev_charge()
}
}
}
int TMovimentoPN::read_mov_rows()
{
const TRectype& mov = curr();