From 1868cc986d058f58fb2ef87d07bc47c4860dfc16 Mon Sep 17 00:00:00 2001 From: Simone Palacino Date: Thu, 20 Jun 2019 10:41:56 +0200 Subject: [PATCH] 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 --- src/cg/cg2102.cpp | 155 ++++++++++++++++++++++++++++++++++++++++++---- src/cg/cg2102.h | 35 ++++++++++- 2 files changed, 177 insertions(+), 13 deletions(-) diff --git a/src/cg/cg2102.cpp b/src/cg/cg2102.cpp index cdf61e698..51e9b72c0 100755 --- a/src/cg/cg2102.cpp +++ b/src/cg/cg2102.cpp @@ -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& msk) +{ + TSheet_field& sf = cg_msk.sfield(F_SHEETIVA); + const vector& 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& msk) +{ + TSheet_field& sf = cg_msk.sfield(FS_RATESHEET); + const vector& 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& 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& msk) +{ + real totale = msk->get_totdoc(); + if(totale == 0) + { + const vector& 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& 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(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(); } diff --git a/src/cg/cg2102.h b/src/cg/cg2102.h index 3c093028b..9bfc9ecf6 100755 --- a/src/cg/cg2102.h +++ b/src/cg/cg2102.h @@ -35,6 +35,7 @@ #include #include "../f1/f1lib.h" +#include #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& msk); + static bool set_scadenze_f1(const TMask& cg_msk, const shared_ptr& msk); + static void set_clifo(TMask& cg_msk, const shared_ptr& msk); + static void set_totale(TMask& cg_msk, const shared_ptr& msk); + static void riporta_dati_f1(TMask& cg_msk, const shared_ptr& 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 _righe_iva; + vector _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& get_righeiva() { return _righe_iva; } + vector& 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);