diff --git a/src/f1/f1lib.cpp b/src/f1/f1lib.cpp index 1c198b0d9..0525543a0 100644 --- a/src/f1/f1lib.cpp +++ b/src/f1/f1lib.cpp @@ -8,6 +8,7 @@ #include "../fp/fp0400a.h" #include "reputils.h" #include "../fp/fplib.h" +#include "causali.h" ////////////////////////////////////////////////////////// // TFppro @@ -107,6 +108,17 @@ TDate TFppro::get_datareg(TToken_string& keys) return TDate(); } +real TFppro::get_ritenute() const +{ + TString query; + query << "SELECT P7_IMPORTORIT AS IMPORTO FROM PAA0700F\n" << + "WHERE P7_KEYPRGINVIO = '" << _keys.prginvio << "' AND P7_KEYHEADERFATT = '" << _keys.headerfatt << "' AND P7_KEYBODYFATT = '" << _keys.bodyfatt << "'"; + fp_db().sq_set_exec(query); + if(fp_db().sq_items() >= 1) + return fp_db().sq_get_real("IMPORTO"); + return ZERO; +} + bool TFppro::set_keys(TToken_string& keys) { if(keys.items() == 3) @@ -306,6 +318,14 @@ bool check_causale(const TString& cod_caus, const TString& tipo_doc, bool acq) return false; } +bool check_caus_has_rit(const TString& cod_caus, bool rit) +{ + TLocalisamfile causali(LF_CAUSALI); + causali.put(CAU_CODCAUS, cod_caus); + causali.read(); + return *causali.get(CAU_M770) != '\0'; +} + void run_cont_ini(bool liq) { static TString run_string; diff --git a/src/f1/f1lib.h b/src/f1/f1lib.h index ee4243678..aaab461d1 100644 --- a/src/f1/f1lib.h +++ b/src/f1/f1lib.h @@ -49,6 +49,7 @@ public: int get_numreg(TToken_string& keys); TDate get_datareg(); TDate get_datareg(TToken_string& keys); + real get_ritenute() const; bool set_query(); bool set_keys(TToken_string& keys); bool set_keys(keys_s keys); @@ -56,7 +57,7 @@ public: static TDate get_data_first_doc(); TFppro() : _keys({"\0", "\0", "\0" }), _guess(false), _keys_setted(false), _is_set(false) { } - + TFppro::TFppro(TToken_string& keys) : TFppro() { set_keys(keys); } }; class TProtocollo : TObject @@ -110,5 +111,6 @@ void set_periodprec(bool flag); bool check_causale(const TString& cod_caus, bool acq = true); // Controlla se il "cod_caus" ha come "tipo_doc" FA o NC (di acquisto) bool check_causale(const TString& cod_caus, const TString& tipo_doc, bool acq = true); +bool check_caus_has_rit(const TString& cod_caus, bool rit); void run_cont_ini(bool liq); #endif \ No newline at end of file diff --git a/src/fp/fp0400.cpp b/src/fp/fp0400.cpp index 18935353a..6c7738f0c 100644 --- a/src/fp/fp0400.cpp +++ b/src/fp/fp0400.cpp @@ -35,6 +35,12 @@ enum { filtri = 0, elenco_fe = 1, elenco_err = 2 }; // Enum per bottoni toolbar class TPassive_mask : public TAutomask { + struct iva + { + real imponibile; + real imposta; + }; + TLog_report* _log; bool _f1; @@ -61,6 +67,8 @@ protected: void run_cg0(const TString& filename) const; void elenco_prots_sel(TString& string) const; + vector& get_righe_iva(TToken_string& keys) const; + real calcola_importo(vector riva) const; // Gestione F1 int prepara_contab() const; void log_contab(); @@ -195,6 +203,36 @@ void TPassive_mask::elenco_prots_sel(TString& string) const string = ""; } +vector& TPassive_mask::get_righe_iva(TToken_string& keys) const +{ + static vector riva; + riva.clear(); + TString where_q; where_q << "WHERE PL_KEYPRGINVIO = '" << keys.get(0); + where_q << "' AND PL_KEYHEADERFATT = '" << keys.get(); + where_q << "' AND PL_KEYBODYFATT = '" << keys.get() << "'"; + TString query; query << "SELECT PL_IMPONIBILE AS IMPONIBILE, PL_IMPOSTA AS IMPOSTA \nFROM PAA2200F \n" << where_q; + fp_db().sq_set_exec(query, false); + for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) + { + TString imponibile = fp_db().sq_get("IMPONIBILE"); + TString imposta = fp_db().sq_get("IMPOSTA"); + if (imponibile.full() || imposta.full()) + riva.insert(riva.end(), { real(imponibile), real(imposta) }); + } + return riva; +} + +real TPassive_mask::calcola_importo(vector riva) const +{ + real tot = ZERO; + for(auto it = riva.begin(); it != riva.end(); ++it) + { + tot += it->imponibile; + tot += it->imposta; + } + return tot; +} + void TPassive_mask::aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TSheet_field& sf_err) { TString denom = fp_db().sq_get("RAG_SOC"); @@ -515,11 +553,15 @@ int TPassive_mask::prepara_contab() const FOR_EACH_SHEET_ROW(sf, n, row) { if (row->starts_with("X")) { + TString prokeys = row->get(sf.cid2index(S_PROKEY)); + TToken_string keys(prokeys, ';'); + TString codcaus(get_codcaus(row->get(2), row->get(10))); + if(!TString(row->get(sf.cid2index(S_NUMREGCONT))).empty()) return n+1000; - TString codcaus(get_codcaus(row->get(2), row->get(10))); if (codcaus.empty()) return no_codcaus; + TString tipodoc(row->get(sf.cid2index(S_TIPODOCSDI))); if(tipodoc == "TD01" && !check_causale(codcaus, "FA")) if(!yesno_box("Attenzione, per un documento di tipo TD01 e' stata selezionata \nuna causale diversa da Fattura d'Acquisto.\nContinuare?")) @@ -528,6 +570,8 @@ int TPassive_mask::prepara_contab() const if(!yesno_box("Attenzione, per un documento di tipo TD04 e' stata selezionata \nuna causale diversa da Nota Credito di Acquisto.\nContinuare?")) return cancel; n_sel++; + + vector& riva = get_righe_iva(keys); TString num; num.format("%04d", n); TFilename newf_ini; #ifndef DBG @@ -536,10 +580,9 @@ int TPassive_mask::prepara_contab() const newf_ini << F1_INIREGCONT << num << ".ini"; #endif TConfig contab_ini(newf_ini, "Transaction"); - TString prokeys = row->get(sf.cid2index(S_PROKEY)); - contab_ini.set("Action", "INSERT"); + // Esporto dati di testata contab_ini.set_paragraph(LF_MOV); // [23] contab_ini.set("CODCAUS", codcaus); contab_ini.set("CODCF", row->get(sf.cid2index(S_FORNITORE))); @@ -547,16 +590,38 @@ int TPassive_mask::prepara_contab() const contab_ini.set("DATADOC", row->get(sf.cid2index(S_DATADOC))); contab_ini.set("NUMDOCEXT", row->get(sf.cid2index(S_NDOC))); contab_ini.set("NUMDOC", TString(row->get(sf.cid2index(S_NDOC))).right(7)); - contab_ini.set("TOTDOC", abs(real(row->get(sf.cid2index(S_TOTDOC)))).string()); + TString totdoc = row->get(sf.cid2index(S_TOTDOC)); + if(totdoc.empty()) + { + real imp = calcola_importo(riva); + totdoc.cut(0) << imp; + } + real rit = TFppro(keys).get_ritenute(); + if(rit != ZERO) + { + contab_ini.set("TOTDOC", (abs(real(totdoc)) - rit).string()); + contab_ini.set("RITFIS", rit.string()); + } + else + contab_ini.set("TOTDOC", abs(real(totdoc)).string()); contab_ini.set("KEYFPPRO", prokeys); + // Esporto righe iva + int i = 1; + for (auto it = riva.begin(); it != riva.end(); ++it) + { + contab_ini.set_paragraph(LF_RMOVIVA, i); + contab_ini.set("IMPONIBILE", it->imponibile.string()); + contab_ini.set("IMPOSTA", it->imposta.string()); + contab_ini.set("NRIGA", i); + i++; + } + // Se ci sono le scadenze esporto anche quelle - TToken_string keys(prokeys, ';'); TString where_q; - where_q << "WHERE PO_KEYPRGINVIO = '" << keys.get() << "'"; + where_q << "WHERE PO_KEYPRGINVIO = '" << keys.get(0) << "'"; where_q << " AND PO_KEYHEADERFATT = '" << keys.get() << "'"; where_q << " AND PO_KEYBODYFATT = '" << keys.get() << "'"; - TString query; query << "SELECT PO_RIGA AS RIGA, PO_DATASCADENZA AS DATA, PO_IMPORTO AS IMPORTO \nFROM PAA2500F \n" << where_q; fp_db().sq_set_exec(query,false); @@ -569,26 +634,7 @@ int TPassive_mask::prepara_contab() const contab_ini.set("NRATA", riga); contab_ini.set("NRIGA", "1"); } - - where_q.cut(0) << "WHERE PL_KEYPRGINVIO = '" << keys.get(0); - where_q << "' AND PL_KEYHEADERFATT = '" << keys.get(); - where_q << "' AND PL_KEYBODYFATT = '" << keys.get() << "'"; - query.cut(0) << "SELECT PL_IMPONIBILE AS IMPONIBILE, PL_IMPOSTA AS IMPOSTA \nFROM PAA2200F \n" << where_q; - fp_db().sq_set_exec(query, false); - int i = 1; - for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) - { - TString imponibile = fp_db().sq_get("IMPONIBILE"); - TString imposta = fp_db().sq_get("IMPOSTA"); - if(imponibile.full() || imposta.full()) - { - contab_ini.set_paragraph(LF_RMOVIVA, i); - contab_ini.set("IMPONIBILE", imponibile); - contab_ini.set("IMPOSTA", imposta); - contab_ini.set("NRIGA", i); - i++; - } - } + row->add("", 0); } } @@ -687,7 +733,7 @@ void TPassive_mask::contabilizza() break; case no_codcaus: message_box("Attenzione, il fornitore non ha associato nessun codice causale predefinito.\nPrego selezionare un codice causale per la contabilizzazione."); - next_page(1000); + fill(); break; case no_selected: message_box("Selezionare almeno un documento."); @@ -743,7 +789,7 @@ void TPassive_mask::new_forn() { TString query; query << "SELECT PU_PEC AS PEC\n" << "FROM PAA3200F\n" << - "WHERE PU_KEYPRGINVIO = '" << keys.get(); + "WHERE PU_KEYPRGINVIO = '" << keys.get(0); query << "' AND PU_KEYHEADERFATT = '" << keys.get(); query << "' AND PU_KEYBODYFATT = '" << keys.get() << "'"; fp_db().sq_set_exec(query);