Patch level : 12.0 830

Files correlati     : cg2.exe
Commento            :
- [Prima nota] Filtro data documento passato in automatico se valorizzato
- Esportazione da 'Fatture SDI' delle righe IVA e scadenze
- Controllo Totale documento se zero sommo da righe IVA
This commit is contained in:
Simone Palacino 2019-06-20 10:41:56 +02:00
parent 6c85a4d22f
commit 1868cc986d
2 changed files with 177 additions and 13 deletions

View File

@ -3847,6 +3847,86 @@ bool TPrimanota_application::quadratura_handler(TMask_field& f, KEY key)
return true;
}
void TPrimanota_application::set_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
TSheet_field& sf = cg_msk.sfield(F_SHEETIVA);
const vector<TPro_msk::riga_iva_s>& righe = msk->get_righeiva();
int i = 0;
for (auto it = righe.begin(); it != righe.end(); ++it)
{
if(it->imponibile != 0 || it->imposta != 0)
{
TToken_string& row = sf.row(i);
row.add(it->imponibile, cid2index(IVA_IMPONIBILE));
row.add(it->imposta, cid2index(IVA_IMPOSTA));
i++;
}
}
}
bool TPrimanota_application::set_scadenze_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
TSheet_field& sf = cg_msk.sfield(FS_RATESHEET);
const vector<TPro_msk::scadenza_s>& righe = msk->get_scadenze();
int i = 0;
for (auto it = righe.begin(); it != righe.end(); ++it, ++i)
{
TToken_string& row = sf.row(i);
row.add(it->data, cid2index(101));
row.add(it->importo, cid2index(102));
}
return !righe.empty();
}
void TPrimanota_application::set_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
TLocalisamfile clifo(LF_CLIFO);
clifo.setkey(5);
clifo.put(CLI_TIPOCF, "F");
clifo.put(CLI_PAIV, msk->get_piva());
clifo.read();
if (clifo.get(CLI_PAIV) == msk->get_piva())
{
cg_msk.set(F_CODCLIFOR, clifo.get(CLI_CODCF));
cg_msk.set(F_RAGSOCCF, clifo.get(CLI_RAGSOC));
cg_msk.set(F_STATOPAIV, clifo.get(CLI_STATOPAIV));
cg_msk.set(F_PIVA, clifo.get(CLI_PAIV));
cg_msk.set(F_COFI, clifo.get(CLI_COFI));
cg_msk.set(F_CODPAG, clifo.get(CLI_CODPAG));
TTable tab("%CPG"); tab.put("CODTAB", clifo.get(CLI_CODPAG));
tab.read();
cg_msk.set(F_DESPAG, tab.get("S0"));
}
}
void TPrimanota_application::set_totale(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
real totale = msk->get_totdoc();
if(totale == 0)
{
const vector<TPro_msk::riga_iva_s>& righe = msk->get_righeiva();
for(auto it = righe.begin(); it != righe.end(); ++it)
{
totale += it->imponibile;
totale += it->imposta;
}
}
cg_msk.set(F_TOTALE, abs(totale));
}
void TPrimanota_application::riporta_dati_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
cg_msk.set(F_NUMDOCEXT, msk->get_numdoc());
cg_msk.set(F_NUMDOC, msk->get_numdoc().right(7));
cg_msk.set(F_DATADOC, msk->get_datadoc());
if (!cg_msk.get(F_CODCLIFOR).full())
set_clifo(cg_msk, msk);
set_righe_iva_f1(cg_msk, msk);
set_totale(cg_msk, msk);
if (set_scadenze_f1(cg_msk, msk))
cg_msk.set(FS_RECALC, "");
}
bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key)
{
TMask& cg_msk = f.mask();
@ -3854,22 +3934,22 @@ bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key)
return true;
auto msk = std::make_shared<TPro_msk>(cg_msk);
app()._pro_mask = msk;
const TString datadoc = cg_msk.get(F_DATADOC);
if(datadoc.full())
{
msk->set(F_ENABDATE, "X");
msk->field(F_DATESEARCH).show();
msk->set(F_DATESEARCH, datadoc);
}
if (msk->load_fppro_mask(msk.get()))
{
msk->run();
// Riporto dati FPPRO su maschera Prima Nota (solo se hai F1)
// Se non hai F1 collego senza riportarti i dati (solo le chiavi db)
if(app().has_f1_db(&cg_msk))
{
cg_msk.set(F_NUMDOCEXT, msk->get_numdoc());
cg_msk.set(F_NUMDOC, msk->get_numdoc().right(7));
cg_msk.set(F_DATADOC, msk->get_datadoc());
cg_msk.set(F_TOTALE, msk->get_totdoc());
}
riporta_dati_f1(cg_msk, msk);
cg_msk.set(F_PROKEY, msk->get_fpprokeys());
is_collegato(cg_msk.field(F_COLFPPRO));
cg_msk.set(F_ANNORIF, cg_msk.get(F_ANNOIVA));
}
@ -3972,7 +4052,9 @@ bool TPro_msk::fppro_ok_handler(TMask_field& f, KEY k)
if(!loaded && *row->get(0) == 'X')
{
//TProtocollo protocollo(TDate(row->get(2)).year(), row->get(9), row->get(10));
app()._pro_mask->set_doc(row->get(5), row->get(3), row->get(4), "", row->get(11));
app()._pro_mask->set_doc(row->get(cid2index(F_NUMEROS)), row->get(cid2index(F_DATAS)),
row->get(cid2index(F_IMPTOTDOCS)), "", row->get(cid2index(F_KEYFPPROS)),
row->get(cid2index(F_FISCIVACODS)));
loaded = true;
ok = true;
break;
@ -4056,13 +4138,54 @@ bool TPro_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
return true;
}
void TPro_msk::set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* protfppro, const char* fpprokeys)
void TPro_msk::set_righeiva(const char* fpprokeys)
{
TToken_string keys(fpprokeys, ';');
TString query;
query << "SELECT PL_ALIQUOTAIVA AS ALIQUOTA, PL_NATURA AS NATURA, PL_IMPONIBILE AS IMPONIBILE, PL_IMPOSTA AS IMPOSTA \nFROM PAA2200F\n" <<
"WHERE PL_KEYPRGINVIO = '" << keys.get(0) << "' AND PL_KEYHEADERFATT = '" << keys.get(1) << "' AND PL_KEYBODYFATT = '" << keys.get(2) << "';";
fp_db().sq_set_exec(query, false);
for(bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next())
{
add_rigaiva(real(fp_db().sq_get("IMPONIBILE")),
real(fp_db().sq_get("IMPOSTA")),
real(fp_db().sq_get("ALIQUOTA")),
fp_db().sq_get("NATURA"));
}
}
void TPro_msk::set_scadenze(const char* fpprokeys)
{
TToken_string keys(fpprokeys, ';');
TString query; query << "SELECT PO_RIGA AS RIGA, PO_DATASCADENZA AS DATA, PO_IMPORTO AS IMPORTO \nFROM PAA2500F \n" <<
"WHERE PO_KEYPRGINVIO = '" << keys.get(0) << "' AND PO_KEYHEADERFATT = '" << keys.get(1) << "' AND PO_KEYBODYFATT = '" << keys.get(2) << "';";
fp_db().sq_set_exec(query, false);
for(bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next())
{
add_scad(fp_db().sq_get_date("DATA"), real(fp_db().sq_get("IMPORTO")));
}
}
void TPro_msk::set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* protfppro, const char* fpprokeys, const char* piva)
{
_numero = numero;
_datadoc = datadoc;
_totdoc = totdoc;
_protfppro.sset(protfppro);
_fpprokeys = fpprokeys;
_piva = piva;
set_righeiva(fpprokeys);
set_scadenze(fpprokeys);
}
void TPro_msk::add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura)
{
_righe_iva.insert(_righe_iva.end(), { imponibile, imposta, aliquota, natura });
}
void TPro_msk::add_scad(const TDate& date, const real& importo)
{
_scadenze.insert(_scadenze.end(), { date, importo });
}
TString& TPro_msk::query_fppro(const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt,
@ -4121,15 +4244,22 @@ TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva
query << "\nORDER BY P1_DATAORARIC ASC";
query << ";";
}
else if(!keys.empty())
else if (!keys.empty())
{
query << keys;
if (!where_str.empty())
query << " AND " << where_str;
query << ";";
}
else if (!date.empty())
{
query << " PZ_DATA = '" << TDate(date).date2ansi() << "' ";
if (order)
query << "\nORDER BY P1_DATAORARIC ASC";
query << ";";
}
else
query.cut(0);
query.cut(0) << query.left(query.len()-6);
return query;
}
@ -4160,4 +4290,5 @@ TPro_msk::TPro_msk(TMask& cg_msk) : TAutomask("cg2fppro")
TMask::set(F_PIVAS, cg_msk.get(F_PIVA));
TMask::set(F_RAGSOCS, cg_msk.get(F_RAGSOCCF));
set(F_DATESEARCH, TDate(TODAY));
_righe_iva.clear();
}

View File

@ -35,6 +35,7 @@
#include <automask.h>
#include "../f1/f1lib.h"
#include <vector>
#define K_ELIMMAS 0 // Key per eliminazione massima
@ -184,6 +185,11 @@ class TPrimanota_application : public TRelation_application
static bool quadratura_handler(TMask_field& f, KEY k); // Bottone quadratura per ATS
static void set_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static bool set_scadenze_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void set_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void set_totale(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void riporta_dati_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
// Handlers per aggancio FPPRO
// Bottone per maschera FPPRO
static bool fppro_mask(TMask_field& f, KEY key);
@ -394,11 +400,17 @@ public:
class TPro_msk : public TAutomask
{
struct riga_iva_s;
struct scadenza_s;
TString _numero;
TDate _datadoc;
real _totdoc;
TProtocollo _protfppro;
TString _fpprokeys;
TString _piva;
vector<riga_iva_s> _righe_iva;
vector<scadenza_s> _scadenze;
// Handlers per aggancio FPPRO
// Bottone carica documenti in maschera FPPRO
@ -411,14 +423,35 @@ class TPro_msk : public TAutomask
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;
};
struct scadenza_s
{
TDate data;
real importo;
};
void set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* protfppro, const char* fpprokeys);
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* protfppro, const char* fpprokeys, const char* piva);
TString get_numdoc() const { return _numero; }
TDate get_datadoc() const { return _datadoc; }
real get_totdoc() const { return _totdoc; }
TProtocollo& get_protocollo() { return _protfppro; }
TString get_fpprokeys() const { return _fpprokeys; }
TString get_piva() const { return _piva; }
const vector<riga_iva_s>& get_righeiva() { return _righe_iva; }
vector<scadenza_s>& get_scadenze() { return _scadenze; }
void add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura);
void add_scad(const TDate& date, const real& importo);
static TString& query_fppro(const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, const TString& where_str);
static TString& query_fppro(const TString& codforn, const TString& date);