From 8e27155893dba1fdf35996fee5ee40664505e3a9 Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Fri, 4 Nov 2022 16:05:52 +0100 Subject: [PATCH 1/4] Patch level : 12.0 1214 Files correlati : fp0.exe Archiviazione cartacei --- src/f9/f90100.cpp | 44 ++-- src/f9/f90100.h | 9 - src/f9/f90200.cpp | 8 +- src/f9/f90300.cpp | 46 ++++- src/f9/f90400.cpp | 22 +- src/f9/f90500.cpp | 30 ++- src/f9/f9lib.h | 100 +++++----- src/f9/f9lib01.cpp | 487 ++++++++++++++++++++++++--------------------- src/f9/f9lib02.cpp | 110 +++++----- 9 files changed, 447 insertions(+), 409 deletions(-) diff --git a/src/f9/f90100.cpp b/src/f9/f90100.cpp index 97cc6027a..84ffdb4af 100644 --- a/src/f9/f90100.cpp +++ b/src/f9/f90100.cpp @@ -38,6 +38,7 @@ int TEstrai_mask::estrai() const char tipodoc = get_tipodoc(); const bool flagpro = is_provviso(); TFilename path; + TLog_report log("Log estrazione"); f9_app().get_spotlite_path(path); @@ -50,6 +51,7 @@ int TEstrai_mask::estrai() F9CONF.get_addr_doc(), // Cartella documenti false, // Estrazione di un escluso path, // Spotlight path + &log, // Log &dataini, // Data estr. mov dal &dataend, // Data estr. mov al F9CONF.get_has_cartexp() // Flag per estrarre anche i doc. cartacei @@ -121,6 +123,8 @@ int TEstrai_mask::estrai() #endif // Ricalcolo sheet estrazioni f9_app().notify_estraction(); + if (log.rows() > 0) + log.preview(); return result; } @@ -154,7 +158,6 @@ bool TEstrai_mask::estrai_handler(TMask_field& f, KEY key) if (stato == 0) // Errore scrittura F9IVA, non segno in errore in testata... msk.segna_in_errore(); // ... se l'errore e' dovuto alla scrittura sul db. } - app.print_log(); msk.field(ES_DESCR).set(""); msk.stop_run(K_FORCE_CLOSE); return true; @@ -609,7 +612,7 @@ void TControllo_mask::associa() // todo: levare gli ultimi residui del vecchio FOR_EACH_ARRAY_ROW(_controllo_mov, r, row) if (count < _selected_mov && row->get_bool(0)) // Devo saltare tutti quelli che non hanno il flag e contare solo quelli che ce l'hanno count++; - TF9_dberr::del_err(_cod_soc, _id_estr, mov_sel->get_int(cid2index(F_CNUMREG))); + dberr_del_err(_cod_soc, _id_estr, mov_sel->get_int(cid2index(F_CNUMREG))); } } @@ -663,9 +666,7 @@ void TControllo_mask::conferma_esclusi() const TArray& TControllo_mask::import_error_list() { - _controllo_mov.destroy(); - TF9_dberr dberr; - _tipo_doc_err = TF9_dberr::get_errori(_cod_soc, _id_estr, _controllo_mov); + _tipo_doc_err = dberr_get_err(_cod_soc, _id_estr, _controllo_mov); return _controllo_mov; } @@ -1334,20 +1335,6 @@ bool TF9_app::year_handler(TMask_field& field, KEY key) return true; } -void TF9_app::add_msg_log(const char* msg) -{ - _log << msg << "\n\n"; -} - -void TF9_app::add_sqlerror_msg_log(const char* query) -{ - TString msg; - msg << query << "\n" << - fp_db().sq_get_string_error() << "\n" << - fp_db().sq_get_text_error(); - add_msg_log(msg); -} - void TF9_app::open_esclusi() { /* Prima chiedo quale mese e anno visualizzare @@ -1449,6 +1436,7 @@ void TF9_app::fill_esclusi() bool TF9_app::estrai_escl_handler(TMask_field&, KEY key) { TMask descr_mask("Estrazione", 1, 60, 5); + TLog_report log("Log estrazione esclusi"); descr_mask.add_button_tool(DLG_OK, "Conferma", TOOL_OK); descr_mask.add_button_tool(DLG_CANCEL, "Annulla", TOOL_CANCEL); @@ -1465,7 +1453,7 @@ bool TF9_app::estrai_escl_handler(TMask_field&, KEY key) f9_app().get_spotlite_path(path); f9_app()._estr_escluso =new TEstrazione(F9CONF.get_ambiente(), f9_app()._flagprov_escl, f9_app()._tipodoc_escl, descr, - F9CONF.get_addr_doc(), true, path); + F9CONF.get_addr_doc(), true, path, &log); // Prendo la riga selezionata (e controllo che sia selezionato qualcosa) bool flag = false; @@ -1488,9 +1476,9 @@ bool TF9_app::estrai_escl_handler(TMask_field&, KEY key) } if (!flag) message_box("Selezionare il movimento da estrarre"); - else - f9_app().print_log(); f9_app().fill_esclusi(); + if (log.rows() > 0) + log.preview(); } return true; } @@ -1517,14 +1505,6 @@ void TF9_app::edit_wa(TString& old_codsoc) const fp_db().sq_set_exec(query) && fp_db().sq_commit(); } -void TF9_app::print_log() -{ - ofstream fout; - fout.open("f9exp_err.txt"); - fout << _log; - _log.cut(0); -} - bool TF9_app::is_autofattura(const TLocalisamfile& mov) { return cached_causale(mov.get(MOV_CODCAUS), mov.get_date(MOV_DATAREG).year()).tipo_doc() == "AF"; @@ -1607,7 +1587,8 @@ bool TF9_app::aggiorna_tab_f9(int version) const const int end = sql.find(';'); // Se trovo un comma lancio la query if (end != int(std::string::npos)) { - TString query; query << sql.c_str(); + TString query(sql.c_str()); + ok &= fp_db().sq_set_exec(query, false); ok &= fp_db().sq_commit(); sql.erase(); @@ -1667,6 +1648,7 @@ bool TF9_app::check_table() const if (!check_tab_version()) { TString msg; + std::ofstream fout; fout.open("f9checktaberr.txt"); fout << fp_db().sq_get_text_error(false) << std::endl; diff --git a/src/f9/f90100.h b/src/f9/f90100.h index 8eae4a96d..9ef7cc1e9 100644 --- a/src/f9/f90100.h +++ b/src/f9/f90100.h @@ -162,10 +162,7 @@ public: class TF9_app : public TSkeleton_application { -// friend class TMonitor_mask; friend class TEstrai_mask; -// friend class TControllo_mask; -// friend class TApri_estr_msk; friend class TEstrazione; TMask * _esclusi_mask; @@ -177,7 +174,6 @@ class TF9_app : public TSkeleton_application TToken_string _mov_escl; char _tipodoc_escl; char _flagprov_escl; - TString _log; TEstrazione* _estr_escluso; @@ -212,11 +208,6 @@ public: void edit_wa(TString& old_codsoc) const; // logs - - void print_log(); - void add_msg_log(const char* msg); - void add_sqlerror_msg_log(const char* query); - static bool is_autofattura(const TLocalisamfile& mov); /** Segna su mov che il movimento e' stato estratto. */ diff --git a/src/f9/f90200.cpp b/src/f9/f90200.cpp index 326f5df0f..045c79815 100644 --- a/src/f9/f90200.cpp +++ b/src/f9/f90200.cpp @@ -117,11 +117,9 @@ bool TF9_categorie_doc_msk::on_key(KEY key) if (key == K_DEL) { TSheet_field& sf = sfield(S_CLASSDOC); - sf.hide(); - TString_array& arr = sf.rows_array(); - arr.destroy(sf.selected(), true); - sf.force_update(); - sf.show(); + + sf.destroy(sf.selected(), true); + } return TAutomask::on_key(key); } diff --git a/src/f9/f90300.cpp b/src/f9/f90300.cpp index 2422f7006..18b00cb36 100644 --- a/src/f9/f90300.cpp +++ b/src/f9/f90300.cpp @@ -350,7 +350,7 @@ void TGestione_doc_cartacei_f9_msk::edit_ann() f9ann.put(F9A_NUMREG, numreg); f9ann.put(F9A_FILENAME, filename); f9ann.read(); - win.set_fields(TF9_doccart::get_full_path_file_cartaceo(filename), numreg, true, f9ann.get(F9A_CATDOCPAD), f9ann.get(F9A_CATDOCANN)); + win.set_fields(get_full_path_file_cartaceo(filename), numreg, true, f9ann.get(F9A_CATDOCPAD), f9ann.get(F9A_CATDOCANN)); win.disable(F_IMPADDRESS); win.disable(F_ISANNESSO); @@ -390,7 +390,7 @@ void TGestione_doc_cartacei_f9_msk::edit_file() f9docs.put(F9C_NUMREG, numreg); f9docs.put(F9C_NUMREG, nrig); f9docs.read(); - win.set_fields(TF9_doccart::get_full_path_file_cartaceo(filename), numreg); + win.set_fields(get_full_path_file_cartaceo(filename), numreg); win.disable(F_IMPADDRESS); win.disable(F_ISANNESSO); @@ -486,11 +486,14 @@ void TGestione_doc_cartacei_f9_msk::fill_docs() sf.reset(); for (int err = files.first(); err == NOERR; err = files.next()) { - const TString& namefile = files.get(F9C_FILENAME); + const TFilename namefile = files.get(F9C_FILENAME); + TFilename source_file(F9CONF.get_addr_cart()); const long numreg = files.get_long(F9C_NUMREG); const TRectype & mov = cache().get(LF_MOV, numreg); - const bool not_exist = !check_file_exist(namefile); + const bool exist = check_file_exist(namefile); + source_file = source_file.make_absolute_path(); + source_file.add(namefile); if (files.get_int(F9C_NRIG) == 0) { TRectype rec(files.curr()); @@ -502,7 +505,7 @@ void TGestione_doc_cartacei_f9_msk::fill_docs() } } - if (not_exist) + if (!exist) file_err.add(namefile, numreg); const int row = sf.set_row_cell(F_FILENAME, namefile); @@ -524,7 +527,38 @@ void TGestione_doc_cartacei_f9_msk::fill_docs() sf.set_row_cell(F_NPROTOCOL, nprot, row); sf.set_row_cell(F_DESCRMOV, mov.get(MOV_DESCR), row); sf.set_row_cell(F_DATACARIC, files.get(F9C_LOADDATE), row); - sf.set_row_cell(F_INFO, not_exist ? "IL FILE NON E' PRESENTE IN ARCHIVIO." : "", row); + sf.set_row_cell(F_INFO, !exist ? "IL FILE NON E' PRESENTE IN ARCHIVIO." : "", row); + + if (exist) + { + TRectype mov = (TRectype &)cache().get(LF_MOV, numreg); + + if (mov.full()) + { + TToken_string cartacei(mov.get(MOV_CARTACEI), '\n'); + + if (cartacei.find(namefile) < 0) + { + TFilename dest_file; + + dest_file = firm2dir(prefix().get_codditta()); + dest_file.add("golem"); + if (!dexist(dest_file)) + make_dir(dest_file); + dest_file.add(namefile); + + if (fcopy(source_file, dest_file)) + { + TToken_string row(dest_file); + + row.add(namefile); + cartacei.add(row); + mov.put(MOV_CARTACEI, cartacei); + mov.rewrite(); + } + } + } + } } sf.force_update(); diff --git a/src/f9/f90400.cpp b/src/f9/f90400.cpp index f55f92dae..db1ad226b 100644 --- a/src/f9/f90400.cpp +++ b/src/f9/f90400.cpp @@ -149,30 +149,10 @@ void TF9_test_app::main_loop() } } - if (false) - { - TF9_doccart doccart; - long old_numreg = 95752; - TFilename doc; - TString_array list_annessi; - TArray vect_annessi; // TAnnesso_mov - - bool movdoc = doccart.mov2doc(old_numreg, doc); - TString msg("Error retriving filename from reg n. "); msg << old_numreg; - CHECK(movdoc && TString(doc.name()) == "ve1300_F01_0000000011_0002237.pdf", (const char*)msg); - - old_numreg = 95222; // Doppio annesso - bool movann = doccart.mov2listann(old_numreg, list_annessi); - //CHECK(movann && list_annessi.items() == 2, "Error retriving list annessi from numreg %s", (const char*)old_numreg); - bool movannvect = doccart.mov2listann_vect(old_numreg, vect_annessi); - //CHECK(movannvect && vect_annessi.size() == 2, "Error retriving vector annessi from numreg %s", (const char*)old_numreg); - - } - if(false) { TF9Prospetto_integr prosp; - if (prosp("96951", "96952")) + if (prosp(96951, 96952)) { TFilename tmp; tmp.tempdir(); tmp.add(prosp.filename().name()); diff --git a/src/f9/f90500.cpp b/src/f9/f90500.cpp index ad4023d3b..fc59d3175 100644 --- a/src/f9/f90500.cpp +++ b/src/f9/f90500.cpp @@ -8,7 +8,10 @@ #include "f90.h" #include "f90500.h" +#include "f9lib.h" #include "../cg/cglib.h" +#include "annessif9.h" +#include "docf9.h" class TRipristina_estrazione : public TSkeleton_application { @@ -42,6 +45,8 @@ bool TRipristina_estrazione::restore(const TString & tipomov, filter << "(" << MOV_ELABF9 << "!=\"\")"; TCursor c(&rel, filter, 2, &from, &to); + TLocalisamfile f9ann(LF_F9ANNESSI); + TLocalisamfile f9docs(LF_F9DOCS); TRectype & mov = c.curr(); long last_num = 0L; const long items = c.items(); @@ -58,13 +63,36 @@ bool TRipristina_estrazione::restore(const TString & tipomov, if (reg.tipo() == tipo) { + const long numreg = mov.get_long(MOV_NUMREG); mov.zero(MOV_ELABF9); const int err = mov.rewrite(rel.lfile()); if (err != NOERR) return error_box(FR("Errore nell'aggiornamento del movimento %ld.\n Errore n. %d"), - mov.get_long(MOV_NUMREG), err); + numreg, err); + f9ann.put(F9A_NUMREG, numreg); + if (f9ann.read() == NOERR) + { + TFilename file(F9CONF.get_addr_cart()); + + file.make_absolute_path(); + file.add(f9ann.get(F9A_FILENAME)); + if (file.exist()) + file.fremove(); + f9ann.remove(); + } + f9docs.put(F9A_NUMREG, numreg); + for (int err = f9docs.read(_isgteq); err == NOERR && numreg == f9docs.get_long(F9C_NUMREG); err = f9docs.next()) + { + TFilename file(F9CONF.get_addr_cart()); + + file.make_absolute_path(); + file.add(f9docs.get(F9C_FILENAME)); + if (file.exist()) + file.fremove(); + f9docs.remove(); + } } } } diff --git a/src/f9/f9lib.h b/src/f9/f9lib.h index b9b80a6e8..e47d1f749 100644 --- a/src/f9/f9lib.h +++ b/src/f9/f9lib.h @@ -12,6 +12,7 @@ #include "sheet.h" #include "sqlset.h" #include "reprint.h" +#include "reputils.h" #define INI_PAR_MOD "F9" #define INI_CATDOC "CATDOC" @@ -327,9 +328,11 @@ class TMovimento_estr : public TObject // aggiungere metodi per TArray bool _estratto; err_mov _descr_estr; // Messaggio di informazioni visibile dal 'Apri Estr.' bool _cartaceo; - TFilename _nomefilecart; - TArray _annessi; // TAnnesso_mov - + TString_array _documenti_allegati; + TString _cat_doc_padre; + TDate _data_estr; + TString _user; + TFilename _nomefiledoc; TMovimento_estr & copy(const TMovimento_estr & m); public: @@ -355,20 +358,29 @@ public: bool estratto() const { return _estratto; } err_mov descr_estr() const { return _descr_estr; } TClasse_doc* catdoc(TCategorie_doc& catdoc) const { return catdoc.mov2cat(numreg()); } - TArray & annessi() { return _annessi; } - bool cartaceo() const { return _cartaceo; } // todo - const TFilename & nomefilecart() const { return _nomefilecart; } + bool cartaceo() const { return _cartaceo || allegati(); } + const TFilename & nomefiledoc() const { return _nomefiledoc; } + bool allegati() const { return _documenti_allegati.items() > 0; } + TString_array & documenti_allegati() { return _documenti_allegati; } + const TString & cat_doc_padre() const { return _cat_doc_padre; } + TDate data_estr() const { return _data_estr; } + const TString& user() const { return _user; }; -// void set_err(bool err) { _err = err; } void set_err(const char * descr = "", err_mov descr_estr = mov_no_error); void reset_err() { set_err(); } - void set_cartaceo(bool cartaceo) { _cartaceo = cartaceo; } void set_state(state_fppro state) { _state = state; } void set_descr_estr(err_mov descr_estr) { _descr_estr = descr_estr; } void set_numdoc(const char * numdoc) { _numdoc = numdoc; } void set_estratto(bool estratto) { _estratto = estratto; } - void set_nomefilecart(const char * nomefilecart) { _nomefilecart = nomefilecart; } - + void set_nomefiledoc(const char * nomefiledoc) { _nomefiledoc = nomefiledoc; } + void set_cartaceo(bool cartaceo) { _cartaceo = cartaceo; } + void set_cat_doc_padre(const char *cat) { _cat_doc_padre = cat; } + void set_data_estr(TDate data) { _data_estr = data; } + void set_user(const char *user) { _user = user; }; + + bool load_docs(); + bool fill_doc_list(TString_array& list_docs); + TMovimento_estr(TSheet_field& sf, int row); TMovimento_estr(const long numreg); TMovimento_estr (const TMovimento_estr & m) { copy(m); } @@ -377,11 +389,13 @@ public: ~TMovimento_estr() {} }; +long find_movcoll(long numreg); // ma serve ?? + class TEstrazione : public TObject { drd _head; TArray _movs; // TMovimento_estr - ofstream * _error_sql; + TLog_report * _log; bool _escluso; const TString _descr; bool _has_cartacei; @@ -390,12 +404,12 @@ class TEstrazione : public TObject /** Aggiorna stato estrazione. Utilizzato ad esempio dopo la diagnostica per riportare * il nuovo stato sul db. */ - bool update_drd_stato_estr() const; - static const char* caus_sos(const TLocalisamfile& mov, TipoIVA iva); - static void check_annessi(TMovimento_estr& mov_i, int numreg); // Controllo se ci sono tutti gli annessi obbligatori. + bool update_drd_stato_estr(); + const char* caus_sos(const TLocalisamfile& mov, TipoIVA iva); + void check_annessi(TMovimento_estr& mov); // Controllo se ci sono tutti gli annessi obbligatori. // Controllo se esistono tutti gli annessi cartacei obbligatori e se ci sono annessi reverse charge li genero. - static bool check_annessi_oblig(const TString& catdoc, int numreg, TToken_string& ann_nexist); - static bool check_cartaceo_acq(const TMovimento_estr& movimento); + bool check_annessi_oblig(TMovimento_estr& mov, TToken_string& ann_nexist); + bool check_cartaceo_acq(TMovimento_estr& movimento); static bool check_documento_vendita(const TLocalisamfile& mov, bool& exist_doc); /** CHECK RIFERIMENTO FPPRO * Per le fatture di acquisto controllo se ho il riferimento nell'FPPRO. @@ -410,13 +424,12 @@ class TEstrazione : public TObject static state_fppro check_fppro(int numreg); bool check_periodo_def() const; void copy_file_to_webapp_fld(TMovimento_estr& movimento) const; - static void fill_id(const TRectype& clifo, TString& statopaiv, TString& idfisc, TString& paiv, TString& codfis); + void fill_id(const TRectype& clifo, TString& statopaiv, TString& idfisc, TString& paiv, TString& codfis); TipoIVA get_tipoiva() const { return _head.tipo_doc == 'A' ? iva_acquisti : iva_vendite; } - static bool is_doc_xml(const TRectype& mov); - static bool find_movcoll(int numreg, TString& numreg_rev_vend); - static bool load_annessi(TMovimento_estr& movimento); + bool is_doc_xml(const TRectype& mov); + bool load_docs(TMovimento_estr& movimento) { return movimento.load_docs(); } // Se il movimento e' di vendita e ha i riferimenti al documento generatore provo a stamparlo con ve, e lo inserisco tra i cartacei F9. - static bool stampa_documento(const TMovimento_estr& movimento, TFilename& file); + // bool stampa_documento(const TMovimento_estr& movimento, TFilename& file); bool grab_pdf_from_spotlite(const TMovimento_estr& movimento, TFilename& file) const; public: @@ -426,16 +439,16 @@ private: static TString& drd_attr(); TString& drd_tovalues() const; - bool insert_into_drd() const; /**< Scrittura testata estrazione. Tabella F9DRD. */ - bool insert_into_f9movestr() const; /**< Scrittura su db dell'elenco di movimenti presi. */ - bool export_error_list() const; /**< Esporta sheet controllo fatture sul db. */ + bool insert_into_drd(); /**< Scrittura testata estrazione. Tabella F9DRD. */ + bool insert_into_f9movestr(); /**< Scrittura su db dell'elenco di movimenti presi. */ + bool export_error_list(); /**< Esporta sheet controllo fatture sul db. */ /** Controlla ultimo id estrazione della giornata e in base al tipo di estrazione, * genera il progressivo seguente. Chiamata da \a estrai() e \a estrai_single(). * \return Nuovo id estrazione. */ TString next_estr_today(char tipo) const; static bool pura_iva(const TRectype& mov); - void write_errorsql_log(const TString& query) const; + void write_errorsql_log(const TString& query); public: @@ -484,8 +497,8 @@ public: void set_addrcart(const TString& addrcart) { _head.addr_cart = addrcart; } TEstrazione(const TString& ambiente, bool flag_prov, char tipodoc, const TString& descr, const TString& addrcart, - bool escluso, TFilename& spotlite_path, const TDate* dal = nullptr, const TDate* al = nullptr, bool has_cartacei = false); - ~TEstrazione() { safe_delete(_error_sql); } + bool escluso, TFilename& spotlite_path, TLog_report * log, const TDate* dal = nullptr, const TDate* al = nullptr, bool has_cartacei = false); + ~TEstrazione() {} }; @@ -493,7 +506,7 @@ class TF9_dberr { TString _str; TString _insert; - ofstream* _fout; + TLog_report * _log; protected: void add_str(const TString& string); @@ -506,11 +519,12 @@ public: void add(long num); void add() { add_str("NULL"); } bool send(); - static bool del_err(const TString& codsoc, const TString& id_estr, int numreg); - static char get_errori(const TString& codsoc, const TString& id_estr, TArray& controllo_mov); - TF9_dberr(); + TF9_dberr(TLog_report * log); }; +bool dberr_del_err(const TString& codsoc, const TString& id_estr, int numreg); +char dberr_get_err(const TString& codsoc, const TString& id_estr, TArray& controllo_mov); + class TIva_insert_prepared_stat { TAssoc_array _fields; // TString @@ -533,26 +547,22 @@ public: void reset(); }; +bool doc_already_exists(const TFilename& file, long& numreg); +const TString & get_full_path_file_cartaceo(const TString& filename); + class TF9_doccart { - TLocalisamfile _tannessi; - public: static bool add_cart(const TFilename& file, long numreg, bool is_annesso = false, const TString& catannpadre = "", const TString& catdocann = "", bool suppress_errors = true); bool doc_already_exists(const TFilename& file, long & numreg, bool& TAnnesso); bool mov2doc(long numreg, TFilename& doc); - bool mov2listann(const TString& numreg, TString_array & list_annessi); - bool mov2listann_vect(const long numreg, TArray & list_annessi); + bool mov2listann(long numreg, TMovimento_estr& movimento, TString_array & list_annessi); + bool mov2listann_vect(const long numreg, TArray & list_annessi); + bool load_docs(long numreg, TMovimento_estr& movimento); - static TString & get_full_path_file_cartaceo(const TString& filename) - { - TString & s = get_tmp_string(); - s << TFilename(F9CONF.get_addr_cart()).slash_terminate() << filename; - return s; - } - TF9_doccart() : _tannessi(LF_F9ANNESSI) { } + TF9_doccart() { } }; @@ -600,9 +610,9 @@ class TProspetto_recset final : public TSQL_recordset public: const TString& get_query() const { return _query; } - static void get_sum_imponibile_imposta(const char* numreg_ven, real& s_imponibili, real& s_imposte); + static void get_sum_imponibile_imposta(long numreg_ven, real& s_imponibili, real& s_imposte); - TProspetto_recset(const char* numreg_acq, const char* numreg_ven); + TProspetto_recset(long numreg_acq, long numreg_ven); ~TProspetto_recset(); }; @@ -623,7 +633,7 @@ public: bool preview(); const TFilename& filename() const { return _rep.filename(); } - bool operator()(const char* numreg_acq, const char* numreg_ven); + bool operator()(long numreg_acq, long numreg_ven); TF9Prospetto_integr(); }; diff --git a/src/f9/f9lib01.cpp b/src/f9/f9lib01.cpp index 5e8d7d4ea..4eab69e8f 100644 --- a/src/f9/f9lib01.cpp +++ b/src/f9/f9lib01.cpp @@ -71,8 +71,7 @@ TMovimento_estr & TMovimento_estr::copy(const TMovimento_estr & m) _state = m._state; _estratto = m._estratto; _descr_estr = m._descr_estr; -// _catdoc = m._catdoc == nullptr ? nullptr : new TClasse_doc(*m._catdoc); - _cartaceo = m._cartaceo; + _documenti_allegati = m._documenti_allegati; _numreg = m._numreg; _datareg = m._datareg; _datadoc = m._datadoc; @@ -84,11 +83,14 @@ TMovimento_estr & TMovimento_estr::copy(const TMovimento_estr & m) _ragsoc = m._ragsoc; _reg_protiva = m._reg_protiva; _descr = m._descr; + _cat_doc_padre = m._cat_doc_padre; + _data_estr = m._data_estr; + _user = m._user; return *this; } TMovimento_estr::TMovimento_estr(TSheet_field& sf, int row) : _err(false), _state(null_state), _estratto(true), - _descr_estr(mov_no_error), /*_catdoc(nullptr),*/ _cartaceo(false) + _descr_estr(mov_no_error), _data_estr(today), _user(user()) { _numreg = sf.get_long_row_cell(row, FE_NUMREG); _datareg = sf.get_date_row_cell(row, FE_DATAREG); @@ -101,6 +103,12 @@ TMovimento_estr::TMovimento_estr(TSheet_field& sf, int row) : _err(false), _stat _ragsoc = sf.get_long_row_cell(row, FE_RAGSOC); _reg_protiva = sf.get_str_row_cell(row, FE_PROTIVA); _descr = sf.get_long_row_cell(row, FE_DESCR); + TClasse_doc * classe = catdoc(categorie_doc()); + + if (classe != nullptr) + { + _cat_doc_padre = classe->catdoc(); + } } void TMovimento_estr::set_err(const char * descr, err_mov descr_estr) @@ -116,8 +124,77 @@ void TMovimento_estr::set_err(const char * descr, err_mov descr_estr) _descr_estr = error ? mov_annesso_nexist : mov_no_error; } +bool TMovimento_estr::load_docs() +{ + TLocalisamfile annessi(LF_F9ANNESSI); + bool found = false; + + documenti_allegati().destroy(); + const TRectype & mov = cache().get(LF_MOV, numreg()); + TToken_string cartacei(mov.get(MOV_CARTACEI), '\n'); + + FOR_EACH_STR_TOKEN(cartacei, str) + { + TToken_string orig(str); + TToken_string row(orig.get()); + + row.add(cat_doc_padre()); + row.add(orig.get(4)); + row.add(data_estr()); + row.add(user()); + documenti_allegati().add(row); + found = true; + } + annessi.put(F9A_NUMREG, numreg()); + // Si posiziona nl primo record giusto. Poi per sapere quando terminare guardo se la chiave e' ancora quella giusta. + for (int err = annessi.read(_isgteq) == NOERR; err == NOERR && annessi.get_long(F9A_NUMREG) == numreg(); err = annessi.next()) + { + if (!found) + { + set_cat_doc_padre(annessi.get(F9A_CATDOCPAD)); + set_data_estr(annessi.get_date(F9A_LOADDATE)); + set_user(annessi.get(F9A_USER)); + } + + TToken_string row(annessi.get(F9A_FILENAME)); + + row.add(cat_doc_padre()); + row.add(annessi.get(F9A_CATDOCANN)); + row.add(data_estr()); + row.add(user()); + documenti_allegati().add(row); + found = true; + } + + return found; +} + +bool TMovimento_estr::fill_doc_list(TString_array& list_docs) +{ + bool ok = load_docs(); + + list_docs.destroy(); + if (ok) + { + // Si posiziona nl primo record giusto. Poi per sapere quando terminare guardo se la chiave e' ancora quella giusta. + FOR_EACH_ARRAY_ROW(_documenti_allegati, r, str) + { + TToken_string t; + + t.add(numreg()); + t.add(str->get()); + t.add(str->get()); + t.add(str->get()); + t.add(str->get()); + t.add(str->get()); + list_docs.add(t); + } + } + return ok; +} + TMovimento_estr::TMovimento_estr(const long numreg) : _err(false), _state(null_state), _estratto(true), _descr_estr(mov_no_error), - /* _catdoc(nullptr),*/ _cartaceo(false) + _data_estr(today), _user(user()) { const TRectype & mov = cache().get(LF_MOV, numreg); TToken_string key(mov.get(MOV_TIPO)); @@ -140,9 +217,8 @@ TMovimento_estr::TMovimento_estr(const long numreg) : _err(false), _state(null_s _descr = mov.get(MOV_DESCR); } -TMovimento_estr::TMovimento_estr(TISAM_recordset & mov, TipoIVA tipo, bool escl) : _err(false), _state(null_state), - _estratto(true), _descr_estr(mov_no_error), - /* _catdoc(nullptr), */ _cartaceo(false) +TMovimento_estr::TMovimento_estr(TISAM_recordset & mov, TipoIVA tipo, bool escl) : _err(false), _state(null_state), _estratto(true), + _descr_estr(mov_no_error), _data_estr(today), _user(user()) { _numreg = mov.get_long(MOV_NUMREG); _datareg = mov.get_date(MOV_DATAREG); @@ -223,32 +299,37 @@ const char* TEstrazione::caus_sos(const TLocalisamfile& mov, const TipoIVA iva) return ""; } -void TEstrazione::check_annessi(TMovimento_estr& mov_i, const int numreg) +void TEstrazione::check_annessi(TMovimento_estr& mov) { TToken_string ann_nexist; - if (!check_annessi_oblig(mov_i.catdoc(categorie_doc())->catdoc(), numreg, ann_nexist)) + if (!check_annessi_oblig(mov, ann_nexist)) { TString msg_annessi_mancanti("Annessi obligatori mancanti: "); + for (int i = 0; i < ann_nexist.items(); ++i) msg_annessi_mancanti << ann_nexist.get() << " "; - mov_i.set_err(msg_annessi_mancanti); + mov.set_err(msg_annessi_mancanti); } else - { - load_annessi(mov_i); - } + load_docs(mov); } -bool TEstrazione::check_annessi_oblig(const TString& catdoc, const int numreg,TToken_string& ann_nexist) +bool TEstrazione::check_annessi_oblig(TMovimento_estr& mov, TToken_string& ann_nexist) { - ann_nexist.destroy(-1); - const TString_array lista_cat_annessi = categorie_doc().get_array_ann(catdoc); // Lista cat annessi TF9_doccart file_cart; - TArray list_file_ann; // Lista file annessi + TString_array list_file_ann; // Lista file annessi + TClasse_doc * classe = mov.catdoc(categorie_doc()); + TString catdoc; - file_cart.mov2listann_vect(numreg, list_file_ann); + if (classe != nullptr) + catdoc = classe->catdoc(); + + const TString_array lista_cat_annessi = categorie_doc().get_array_ann(catdoc); // Lista cat annessi + + ann_nexist.cut(0); + mov.fill_doc_list(list_file_ann); bool ok_ann = true; @@ -264,11 +345,11 @@ bool TEstrazione::check_annessi_oblig(const TString& catdoc, const int numreg,TT // Controllo che esista l'annesso per questo mov. bool exist = false; - FOR_EACH_ARRAY_ITEM(list_file_ann, r, obj) + FOR_EACH_ARRAY_ROW(list_file_ann, r, row) { - TAnnesso_mov * f_ann = (TAnnesso_mov *)obj; + TString catdocann = row->get(3); - if (f_ann->catdocann() == ann_name) + if (catdocann == ann_name) { exist = true; break; @@ -278,25 +359,41 @@ bool TEstrazione::check_annessi_oblig(const TString& catdoc, const int numreg,TT if (!exist) ann_nexist.add(ann_name); } - else if(ok_cat && ann->opcee() == "RC") + else + if(ok_cat && ann->opcee() == "RC") { // Generazione prospetto integrativo. - const bool ok = make_prosp_int_revc(numreg, ann); + const bool ok = make_prosp_int_revc(mov.numreg(), ann); if (!ok) - ann_nexist.add(TString() << "Prospetto integrativo (" << ann->catdoc() << ")"); + { + TString msg(TR("Prospetto integrativo")); + + msg << "(" << ann->catdoc() << ")"; + ann_nexist.add(msg); + } ok_ann &= ok; } } return ok_ann; } -bool TEstrazione::check_cartaceo_acq(const TMovimento_estr& movimento) +bool TEstrazione::check_cartaceo_acq(TMovimento_estr& movimento) { - TF9_doccart filecart; - TFilename file; + bool ok = movimento.load_docs(); - return filecart.mov2doc(movimento.numreg(), file) && file.exist(); + if (ok) + { + FOR_EACH_ARRAY_ROW(movimento.documenti_allegati(), r, str) + { + TFilename file = str->get(); + + ok &= file.exist(); + if (!ok) + break; + } + } + return ok; } bool TEstrazione::check_documento_vendita(const TLocalisamfile& mov, _Out_ bool& exist_doc) @@ -368,42 +465,31 @@ void TEstrazione::copy_file_to_webapp_fld(TMovimento_estr& movimento) const // f9pwa + ambiente + idlancio(ID drd) + categoria_documento(drt) + nome_documento TFilename base(F9CONF.get_addr_doc_loc()); base.add(_head.cod_soc).add(_head.id_estr).slash_terminate(); - TToken_string categorie; - TToken_string files; TClasse_doc * cd = movimento.catdoc(categorie_doc()); - TFilename file = movimento.nomefilecart(); - - file.trim(); - if (movimento.cartaceo() && cd != nullptr && file.full()) - { - categorie.add(cd->catdoc(), 0); - files.add(file, 0); - } - if(!movimento.annessi().empty()) //qui - { - FOR_EACH_ARRAY_ITEM(movimento.annessi(), r, obj) - { - TAnnesso_mov & ann = (TAnnesso_mov &) *obj; + const bool has_allegati = movimento.allegati(); - categorie.add(ann.catdocann()); - files.add(TF9_doccart::get_full_path_file_cartaceo(ann.filename())); + if (has_allegati) + { + TString_array & docs = movimento.documenti_allegati(); + + FOR_EACH_ARRAY_ROW(docs, r, str) + { + TFilename file = str->get(0); + + if (file.full()) + { + TFilename dest(base); + + if (cd != nullptr && file.full()) + dest.add(cd->catdoc()); + else + dest.add("cartaceo"); + dest.add(file.name()); + make_dir(dest.path()); + if (!fcopy(file, dest)) + error_box(FR("Errore nel copiare il %s in %s"), (const char*)file, (const char*)dest); } } -#ifdef DBG - CHECK(files.items() == categorie.items(), "copy_file_to_webapp_fld: Numero di file diverso dal numero di categorie"); -#endif - - for(int i = 0; i < files.items(); ++i) - { - TFilename file = files.get(i); - TFilename dest(base); - dest.add(categorie.get(i)).add(file.name()); - make_dir(dest.path()); - - const bool f = fcopy(file, dest); - - if (!f) - error_box("Errore nel copiare il file nella cartella di destinazione: %s", (const char*)dest); } } @@ -464,45 +550,7 @@ bool TEstrazione::is_doc_xml(const TRectype& mov) return (IS_ITALIANO(statopaiv)) && clifo.get(CLI_COMCF) != "B513"; // Campione d'Italia } -bool TEstrazione::find_movcoll(const int numreg, _Out_ TString& numreg_rev_vend) -{ - TLocalisamfile mov(LF_MOV); - mov.put(MOV_NUMREG, numreg); - mov.read(); - - const TCausale& cau = cached_causale(mov.get(MOV_CODCAUS), mov.get_int(MOV_ANNOES)); - const TString4 cau_reg = cau.causale_reg_iva(); - const TString numdoc = mov.get(MOV_NUMDOC); - TString query("USE "); - - query << LF_MOV << " KEY 1 SELECT " << MOV_CODCAUS << "==\"" << cau_reg << "\"\nFROM " << MOV_NUMREG << "==" << numreg; - TISAM_recordset mov_rs(query); - long movcoll = 0L; - - for (bool ok = mov_rs.move_first(); ok; ok = mov_rs.move_next()) - { - TRectype& curr = (TRectype&)mov_rs.cursor()->curr(); - const long movcoll_found = curr.get_long(MOV_MOVCOLL); - - if (curr.get(MOV_NUMDOC) == numdoc && (movcoll_found == 0L || movcoll_found == numreg)) - { - movcoll = mov_rs.get(MOV_NUMREG).as_int(); - curr.put(MOV_MOVCOLL, numreg); - break; - } - } - numreg_rev_vend.cut(0) << movcoll; - return numreg_rev_vend.full(); -} - -bool TEstrazione::load_annessi(TMovimento_estr& movimento) -{ - TF9_doccart doccart; - - return doccart.mov2listann_vect(movimento.numreg(), movimento.annessi()); -} - -bool TEstrazione::stampa_documento(const TMovimento_estr& movimento, TFilename& file) +/* bool TEstrazione::stampa_documento(const TMovimento_estr& movimento, TFilename& file) { bool ok = false; // Se il movimento e' di vendita e ha i riferimenti al documento generatore provo a stamparlo con ve, e lo inserisco tra i cartacei F9. @@ -529,10 +577,9 @@ bool TEstrazione::stampa_documento(const TMovimento_estr& movimento, TFilename& // Controllo anche se false perche' potrebbe esistere gia'. if(!TF9_doccart::add_cart(file, movimento.numreg())) { - TF9_doccart filecart; TFilename fdoc; - ok = filecart.mov2doc(movimento.numreg(), fdoc) && fdoc.name() == file.name(); + ok = movimento.load_docs() && fdoc.name() == file.name(); } else ok = true; @@ -541,7 +588,7 @@ bool TEstrazione::stampa_documento(const TMovimento_estr& movimento, TFilename& } } return ok; -} +} */ bool TEstrazione::grab_pdf_from_spotlite(const TMovimento_estr& movimento, TFilename& file) const { @@ -580,33 +627,38 @@ bool TEstrazione::make_prosp_int_revc(const int numreg, TAnnesso * annesso) TLocalisamfile mov(LF_MOV); mov.put(MOV_NUMREG, numreg); mov.read(); - TString rev_vend = mov.get(MOV_MOVCOLL); - if((rev_vend.full() || find_movcoll(numreg, rev_vend)) && rev_vend != "0") + + long rev_vend = mov.get_long(MOV_MOVCOLL); + + if (rev_vend == 0) + rev_vend = find_movcoll(numreg); + if (rev_vend > 0) { TF9Prospetto_integr prosp; - TString acq; acq << numreg; + const long acq = numreg; + if (prosp(acq, rev_vend)) { // [ NUMREG][ CAT.ANN.].pdf // [0000000][AAAAAAAAAA].pdf TFilename tmp_file; tmp_file.tempdir(); TString name; name << format("%07d%10s", numreg, (const char*)annesso->catdoc()); + name.replace(' ', '_'); tmp_file.add(name); tmp_file.ext("pdf"); - if(prosp.export_pdf(tmp_file)) + if (prosp.export_pdf(tmp_file)) { // Sposto il file nella cartella dei documenti cartacei. - const TFilename newfile(TF9_doccart::get_full_path_file_cartaceo(tmp_file.name())); + const TFilename newfile(get_full_path_file_cartaceo(tmp_file.name())); // if (newfile.exist()) // DeleteFile(newfile); fcopy(tmp_file, newfile); // Controllo che non esista gia' altrimenti elimino il record TF9_doccart doccart; - bool a; long numreg_old; - if (doccart.doc_already_exists(newfile, numreg_old, a)) + if (doc_already_exists(newfile, numreg_old)) { TLocalisamfile lf_ann(LF_F9ANNESSI); lf_ann.setkey(2); @@ -652,7 +704,7 @@ TString& TEstrazione::drd_tovalues() const _head.stato_estr << "', '" << _head.addr_cart << "'"; } -bool TEstrazione::insert_into_drd() const +bool TEstrazione::insert_into_drd() { TString query; query << "INSERT INTO " F9_DRD " ( " << drd_attr() << " ) \nVALUES ( " << drd_tovalues() << " );"; @@ -663,7 +715,7 @@ bool TEstrazione::insert_into_drd() const return ok; } -bool TEstrazione::insert_into_f9movestr() const +bool TEstrazione::insert_into_f9movestr() { TString query; bool ok = true; @@ -692,9 +744,9 @@ bool TEstrazione::insert_into_f9movestr() const return ok; } -bool TEstrazione::export_error_list() const +bool TEstrazione::export_error_list() { - TF9_dberr dberr; + TF9_dberr dberr(_log); const TArray & movs = _movs; // bool ok = true; int count = 0; @@ -769,23 +821,17 @@ bool TEstrazione::pura_iva(const TRectype& mov) return rel->cg_rows() == 0; } -void TEstrazione::write_errorsql_log(const TString& query) const +void TEstrazione::write_errorsql_log(const TString& query) { - TString msg; - msg << query << "\n" << - fp_db().sq_get_string_error() << "\n" << - fp_db().sq_get_text_error(); - if (_error_sql->is_open()) - *_error_sql << msg << "\n\n"; -#ifdef DBG - else - warning_box("Impossibile aprire il file f9_TEstrazione_error_sql.txt\nper scrivere errori scrittura db."); -#endif + _log->log(2, query); + _log->log(2, fp_db().sq_get_string_error()); + _log->log(2, fp_db().sq_get_text_error()); + _log->line(); } // Public methods ///////////////////////////////////////////////////////////////////////////////////////////// -bool TEstrazione::update_drd_stato_estr() const +bool TEstrazione::update_drd_stato_estr() { bool ok; do @@ -901,30 +947,12 @@ const char* TEstrazione::diagnostica_mov() mov_i.set_descr_estr(cd ? mov_no_error : mov_no_catdoc); if (found) - check_annessi(mov_i, numreg); + check_annessi(mov_i); } // Se cartaceo preparo il file. if (F9CONF.get_has_cartexp()) // Se e' abilitata l'esportazione dei cartacei, altrimenti skip... - { - if (mov_i.cartaceo()) - { - TF9_doccart filecart; - TFilename file; - - if (filecart.mov2doc(mov_i.numreg(), file) && file.exist()) - mov_i.set_nomefilecart(file); - else - mov_i.set_err("Non e' stato possibile reperire il file del documento cartaceo per questo movimento.", mov_no_filecart); - } - else - { - ok &= true; - mov_i.set_err("", mov_no_cartaceo); - mov_i.set_estratto(false); - ++_stats.fa_skip; - } - } + mov_i.load_docs(); copy_file_to_webapp_fld(mov_i); } } @@ -954,7 +982,7 @@ const char* TEstrazione::diagnostica_mov() */ if (!mov_i.err() && mov_i.estratto()) { - mov_i.set_cartaceo(!is_doc_xml(mov)); + // mov_i.set_cartaceo(!is_doc_xml(mov)); ci deve essere ? unsigned short skip = 0; @@ -995,7 +1023,7 @@ const char* TEstrazione::diagnostica_mov() else mov_i.set_err("Categoria assente", mov_no_catdoc); if (cd != nullptr) - check_annessi(mov_i, mov_i.numreg()); + check_annessi(mov_i); if (!mov_i.catdoc(categorie_doc())) ++_stats.fv_nocatdoc; @@ -1009,16 +1037,29 @@ const char* TEstrazione::diagnostica_mov() { if (mov_i.cartaceo()) { - TF9_doccart filecart; TFilename file; - if (filecart.mov2doc(mov_i.numreg(), file) && file.exist() || grab_pdf_from_spotlite(mov_i, file) && file.exist()) - mov_i.set_nomefilecart(file); +// if (filecart.mov2doc(mov_i.numreg(), file) && file.exist() || grab_pdf_from_spotlite(mov_i, file) && file.exist()) + if (grab_pdf_from_spotlite(mov_i, file) && file.exist()) + mov_i.set_nomefiledoc(file); else mov_i.set_err("Non e' stato possibile reperire il file del documento cartaceo per questo movimento.", mov_no_filecart); } + + TToken_string cartacei(mov.get(MOV_CARTACEI), '\n'); + + FOR_EACH_STR_TOKEN(cartacei, s) + { + TFilename file(s); + + if (file.exist()) + mov_i.documenti_allegati().add(file); + else + mov_i.set_err(format(FR("Non e' stato possibile reperire il file cartaceo %s per questo movimento."), (const char *) file), mov_no_filecart); + } copy_file_to_webapp_fld(mov_i); } + } ok &= mov_i.no_err(); } @@ -1033,6 +1074,7 @@ result_estr TEstrazione::estrai() // Se non c'e' nessun movimento non sto nemmeno a scrivere il record di estrazione. // Se estrazione definitiva controllo che il periodo non si sovrapponga alle altre estrazioni def. // Do' errore ed esco subito. + result_estr res = estr_ok; if (_movs.empty()) { warning_box("Non esistono movimenti estraibili per il periodo selezionato."); @@ -1071,9 +1113,11 @@ result_estr TEstrazione::estrai() // Scrivo record estrazione (in stato '01': in diagnostica). const bool ok = insert_into_drd(); + if (!ok) { TString msg; + msg << "Errore database: impossibile scrivere nuova estrazione.\n" << fp_db().sq_get_text_error(false); error_box(msg); @@ -1091,16 +1135,18 @@ result_estr TEstrazione::estrai() // Se in errore, esporto lista errori sul db if (!export_error_list()) warning_box("Errore scrittura db. Controllare log errori."); - update_drd_stato_estr(); - return estr_diag_err; // Errore diagnostica gestionale + res = estr_diag_err; // Errore diagnostica gestionale } // Se va tutto ben fino a qui, posso andare a scrivere nella // tabella IVA i movimenti. F9IVA - const result_estr res = estrazione_iva() ? estr_ok : estr_err_db_iva; - if (res == estr_err_db_iva) - _head.stato_estr = D_GEST_ERR; - update_drd_stato_estr(); + if (res == estr_ok) + { + res = estrazione_iva() ? estr_ok : estr_err_db_iva; + if (res == estr_err_db_iva) + _head.stato_estr = D_GEST_ERR; + } + update_drd_stato_estr(); return res; } @@ -1114,18 +1160,10 @@ bool TEstrazione::estrazione_iva(bool escluso) FOR_EACH_ARRAY_ITEM(_movs, r, obj) { TMovimento_estr & mov_i = (TMovimento_estr &)*obj; - const TRectype& mov = cache().get(LF_MOV, mov_i.numreg()); - const TCausale caus(mov.get(MOV_CODCAUS), mov.get_date(MOV_DATAREG).year()); - bool harambe = caus.escludi2archiviazione(); - - if (caus.escludi2archiviazione()) { - int siamodentro = 0; - } - - - if (bar.add_status() && mov_i.estratto() && !caus.escludi2archiviazione()) + if (bar.add_status() && mov_i.estratto()) { + const TRectype& mov = cache().get(LF_MOV, mov_i.numreg()); TToken_string key = mov.get(MOV_TIPO); key.add(mov.get(MOV_CODCF)); @@ -1154,32 +1192,27 @@ bool TEstrazione::estrazione_iva(bool escluso) iva_query.add(IVA_IDFISC, idfisc, 30); iva_query.add(IVA_PIVA, paiv, 28); iva_query.add(IVA_CODFIS, codfis, 16); - - - const TClasse_doc* catdoc = mov_i.catdoc(categorie_doc()); - - if (catdoc != nullptr) - iva_query.add(IVA_CATDOC, catdoc->catdoc(), 10); + iva_query.add(IVA_CATDOC, mov_i.catdoc(categorie_doc())->catdoc(), 10); const TRegistro& reg = cached_registro(mov.get(MOV_REG), mov.get_int(MOV_ANNOIVA)); if (reg.iva() == iva_vendite) { - const int anno_doc = mov.get_int(MOV_DANNO); + int anno = mov.get_int(MOV_DANNO); - if (anno_doc > 0) + if (anno > 0) { const char provv = mov.get(MOV_DPROVV)[0]; const TString& codnum = mov.get(MOV_DCODNUM); const long ndoc = mov.get_long(MOV_DNDOC); - TDocumento doc(provv, anno_doc, codnum, ndoc); + TDocumento doc(provv, anno, codnum, ndoc); iva_query.add(IVA_CAUSSOS, tipo_doc_sdi(doc) , 6); } else - if(catdoc!=nullptr) - iva_query.add(IVA_CAUSSOS, catdoc->caus_sost(), 6); + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); } + // else { TToken_string key(mov.get((MOV_KEYFPPRO)), ';'); @@ -1192,12 +1225,10 @@ bool TEstrazione::estrazione_iva(bool escluso) if(tipodoc.full()) iva_query.add(IVA_CAUSSOS, tipodoc, 6); else - if (catdoc != nullptr) - iva_query.add(IVA_CAUSSOS, catdoc->caus_sost(), 6); + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); } else - if (catdoc != nullptr) - iva_query.add(IVA_CAUSSOS, catdoc->caus_sost(), 6); + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); } iva_query.add(IVA_NUMDOC, mov_i.numdoc(), 20); iva_query.add(IVA_DATADOC, datadoc); @@ -1206,66 +1237,67 @@ bool TEstrazione::estrazione_iva(bool escluso) iva_query.add(IVA_NPROT, mov.get(MOV_PROTIVA), 20); iva_query.add(IVA_DATPROT, datareg); - if (catdoc != nullptr) - iva_query.add(IVA_CLASDOC, catdoc->class_sost(), 10); - - iva_query.add(IVA_NOMFD, mov_i.nomefilecart().name(), 100); + /*if(is_autofattura(mov)) + { + iva_query.add(IVA_FORNOR, ""); + iva_query.add(IVA_REGOR, ""); + iva_query.add(IVA_NUMOR, N ORI); + iva_query.add(IVA_DATAOR, TDate(20010101)); + }*/ + + iva_query.add(IVA_CLASDOC, mov_i.catdoc(categorie_doc())->class_sost(), 10); + iva_query.add(IVA_NOMFD, mov_i.nomefiledoc().name(), 100); // Load annessi... - if(!mov_i.annessi().empty()) + if(mov_i.allegati()) { - TArray & ann = mov_i.annessi(); + TString_array & docs = mov_i.documenti_allegati(); int i = 0; - const int size = ann.items(); + const int size = docs.items(); - iva_query.add(IVA_CLASAN1, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF1, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN1, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF1, docs.row(i++).get(0), 100); // HOW DID MY LIFE COME TO THIS?... if (size > i) { - iva_query.add(IVA_CLASAN2, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF2, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN2, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF2, docs.row(i++).get(0), 100); } if (size > i) { - iva_query.add(IVA_CLASAN3, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF3, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN3, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF3, docs.row(i++).get(0), 100); } if (size > i) { - iva_query.add(IVA_CLASAN4, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF4, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN4, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF4, docs.row(i++).get(0), 100); } if (size > i) { - iva_query.add(IVA_CLASAN5, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF5, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN5, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF5, docs.row(i++).get(0), 100); } if (size > i) { - iva_query.add(IVA_CLASAN4, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF4, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN6, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF6, docs.row(i++).get(0), 100); } if (size > i) { - iva_query.add(IVA_CLASAN6, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF6, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN7, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF7, docs.row(i++).get(0), 100); } if (size > i) { - iva_query.add(IVA_CLASAN7, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF7, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN8, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF8, docs.row(i++), 100); } if (size > i) { - iva_query.add(IVA_CLASAN8, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF8, ((TAnnesso_mov &)ann[i++]).filename(), 100); + iva_query.add(IVA_CLASAN9, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF9, docs.row(i++).get(0), 100); } - if (size > i) - { - iva_query.add(IVA_CLASAN9, ((TAnnesso_mov &)ann[i]).catdocann(), 10); - iva_query.add(IVA_NOMF9, ((TAnnesso_mov &)ann[i++]).filename(), 100); - } } iva_query.add(IVA_USERELA, user(), 10); @@ -1327,8 +1359,8 @@ void TEstrazione::set_dates() } TEstrazione::TEstrazione(const TString& ambiente, const bool flag_prov, const char tipodoc, const TString& descr, - const TString& addrcart, const bool escluso, TFilename& spotlite_path, const TDate* const dal, const TDate* const al, const bool has_cartacei) - : _descr(descr), _has_cartacei(has_cartacei), _spotlite_path(spotlite_path) + const TString& addrcart, const bool escluso, TFilename& spotlite_path, TLog_report * log, const TDate* const dal, const TDate* const al, const bool has_cartacei) + : _descr(descr), _has_cartacei(has_cartacei), _spotlite_path(spotlite_path), _log(log) { _head.cod_soc = ambiente; _head.flag_prov = flag_prov; @@ -1342,12 +1374,6 @@ TEstrazione::TEstrazione(const TString& ambiente, const bool flag_prov, const ch _head.addr_cart = addrcart; _escluso = escluso; - _error_sql = new ofstream("f9_TEstrazione_error_sql.txt"); - - // Svuoto log. - ofstream f("TF9Prospetto_integr_error.txt"); - - f << "\n"; } @@ -1367,14 +1393,10 @@ void TF9_dberr::add_str(const TString& string) void TF9_dberr::write_sqlerrlog(const TString& query) const { - if (_fout->is_open()) - { - TString msg; - msg << query << "\n" << - fp_db().sq_get_string_error() << "\n" << - fp_db().sq_get_text_error(); - *_fout << msg << "\n"; - } + _log->log_error(query); + _log->log_error(fp_db().sq_get_string_error()); + _log->log_error(fp_db().sq_get_text_error()); + _log->line(); } void TF9_dberr::add(const TString& string) @@ -1428,22 +1450,25 @@ bool TF9_dberr::send() return ok; } -bool TF9_dberr::del_err(const TString& codsoc, const TString& id_estr, const int numreg) +bool dberr_del_err(const TString& codsoc, const TString& id_estr, const int numreg) { TString query; + query << "DELETE FROM " F9_ERR "\nWHERE " ERR_CODSOC " = '" << codsoc << "'" "\nAND " ERR_IDESTR " = '" << id_estr << "' AND " ERR_NUMREG " = '" << numreg << "';"; return fp_db().sq_set_exec(query) && fp_db().sq_commit(); } -char TF9_dberr::get_errori(const TString& codsoc, const TString& id_estr, TArray& controllo_mov) +char dberr_get_err(const TString& codsoc, const TString& id_estr, TArray& controllo_mov) { TString query; + query << "SELECT * FROM " F9_ERR "\nWHERE " ERR_CODSOC " = '" << codsoc << "' AND " ERR_IDESTR " = '" << id_estr << "';"; fp_db().sq_set_exec(query, false); + controllo_mov.destroy(); for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) { TToken_string row("", '|'); @@ -1464,7 +1489,7 @@ char TF9_dberr::get_errori(const TString& codsoc, const TString& id_estr, TArray return fp_db().sq_get((unsigned)0)[0]; } -TF9_dberr::TF9_dberr() +TF9_dberr::TF9_dberr(TLog_report * log) : _log(log) { _insert.cut(0) << "INSERT INTO " F9_ERR " (" ERR_CODSOC ", " @@ -1481,8 +1506,6 @@ TF9_dberr::TF9_dberr() ERR_PROTIVA ", " ERR_DESCR ", " ERR_DESCERR ") VALUES ()"; - _fout = new ofstream; - _fout->open("f9_dberr.txt"); } ; TString _user; diff --git a/src/f9/f9lib02.cpp b/src/f9/f9lib02.cpp index 291a95285..b6a8abdf6 100644 --- a/src/f9/f9lib02.cpp +++ b/src/f9/f9lib02.cpp @@ -100,10 +100,21 @@ bool TF9_doccart::add_cart(const TFilename& file, long numreg, const bool is_ann "Se si tratta di un annesso inserire le informazioni per la cat. documentale.", (const char*)numreg, (const char*)doc); return false; } + f9docs.zero(); + f9docs.put(F9C_NUMREG, numreg); + f9docs.put(F9C_NRIG, 9); + f9docs.read(); + if (f9docs.get_long(F9C_NUMREG) != numreg) + f9docs.prev(); + int nrig = 1; + + if (f9docs.get_long(F9C_NUMREG) == numreg) + nrig += f9docs.get_long(F9C_NRIG); f9docs.zero(); f9docs.put(F9C_FILENAME, file.name()); f9docs.put(F9C_NUMREG, numreg); + f9docs.put(F9C_NRIG, nrig); f9docs.put(F9C_LOADDATE, TDate(TODAY)); f9docs.put(F9C_USER, user()); } @@ -154,39 +165,27 @@ bool TF9_doccart::add_cart(const TFilename& file, long numreg, const bool is_ann return false; } if (!is_annesso) - { - f9docs.write(); - f9docs.rewrite(); - } + f9docs.write_rewrite(); else - { - f9annessi.write(); - f9annessi.rewrite(); - } + f9annessi.write_rewrite(); return true; } bool TF9_doccart::doc_already_exists(const TFilename& file, long& numreg, bool& annesso) { + const TRectype & docs_cart = cache().get(LF_F9DOCS, file.name(), 2); + bool ok = docs_cart.full(); + annesso = false; - - const TRectype & tdocs = cache().get(LF_F9DOCS, file.name(), 2); - bool ok = tdocs.full(); - if (ok) - numreg = tdocs.get_long(F9C_NUMREG); + numreg = docs_cart.get_long(F9C_NUMREG); else { - numreg = 0L; - _tannessi.zero(); - _tannessi.setkey(2); - _tannessi.put(F9A_FILENAME, file.name()); - ok = _tannessi.read() == NOERR; + const TRectype & annessi = cache().get(LF_F9ANNESSI, file.name(), 2); + + ok = annesso = annessi.full(); if (ok) - { - numreg = _tannessi.get_long(F9A_NUMREG); - annesso = true; - } + numreg = annessi.get_long(F9A_NUMREG); } return ok; } @@ -202,64 +201,54 @@ bool TF9_doccart::mov2doc(long numreg, TFilename& doc) return ok; } -bool TF9_doccart::mov2listann(const TString& numreg, _Out_ TString_array& list_annessi) +bool doc_already_exists(const TFilename& file, long& numreg) { - list_annessi.destroy(); - _tannessi.zero(); - _tannessi.setkey(1); - _tannessi.put(F9A_NUMREG, numreg); + const TRectype & annessi = cache().get(LF_F9ANNESSI, file.name(), 2); + bool ok = annessi.full(); - TString numreg_fetched; - bool ok = false; - // Si posiziona nl primo record giusto. Poi per sapere quando terminare guardo se la chiave e' ancora quella giusta. - for (_tannessi.read(_isgteq); (numreg_fetched = _tannessi.get(F9A_NUMREG)) == numreg; _tannessi.next()) - { - ok = true; - TString filename = _tannessi.get(F9A_FILENAME); - TToken_string t; - t.add(numreg_fetched); - t.add(_tannessi.get(F9A_FILENAME)); - t.add(_tannessi.get(F9A_CATDOCPAD)); - t.add(_tannessi.get(F9A_CATDOCANN)); - t.add(_tannessi.get(F9A_LOADDATE)); - t.add(_tannessi.get(F9A_USER)); - list_annessi.add(t); -#ifdef DBG - CHECK(numreg_fetched == numreg_fetched, "*Maledetooo*"); -#endif - } + if (ok) + numreg = annessi.get_long(F9A_NUMREG); return ok; } bool TF9_doccart::mov2listann_vect(const long numreg, TArray & list_annessi) { list_annessi.destroy(); - _tannessi.zero(); - _tannessi.setkey(1); - _tannessi.put(F9A_NUMREG, numreg); + + TLocalisamfile annessi(LF_F9ANNESSI); + + annessi.put(F9A_NUMREG, numreg); bool ok = false; // Si posiziona nl primo record giusto. Poi per sapere quando terminare guardo se la chiave e' ancora quella giusta. - for (int err = _tannessi.read(_isgteq) == NOERR; err == NOERR; err = _tannessi.next()) + for (int err = annessi.read(_isgteq) == NOERR; err == NOERR; err = annessi.next()) { - long numreg_fetched = _tannessi.get_long(F9A_NUMREG); + long numreg_fetched = annessi.get_long(F9A_NUMREG); if (numreg_fetched == numreg) { ok = true; - TString filename = _tannessi.get(F9A_FILENAME); - TAnnesso_mov t(numreg_fetched, _tannessi.get(F9A_FILENAME), _tannessi.get(F9A_CATDOCPAD), - _tannessi.get(F9A_CATDOCANN), _tannessi.get_date(F9A_LOADDATE), _tannessi.get(F9A_USER)); + TString filename = annessi.get(F9A_FILENAME); + TAnnesso_mov t(numreg_fetched, annessi.get(F9A_FILENAME), annessi.get(F9A_CATDOCPAD), + annessi.get(F9A_CATDOCANN), annessi.get_date(F9A_LOADDATE), annessi.get(F9A_USER)); list_annessi.add(t); } else break; } - return ok; } +const TString & get_full_path_file_cartaceo(const TString& filename) +{ + TFilename name = (F9CONF.get_addr_cart()); + + name = name.make_absolute_path(); + name.add(filename); + return get_tmp_string() = name; +} + /////////////////////////////////////////////////////////////////////////////// // TIva_insert_prepared_stat /////////////////////////////////////////////////////////////////////////////// @@ -362,10 +351,11 @@ void TProspetto_recset::precarica_tabelle() } } -void TProspetto_recset::get_sum_imponibile_imposta(const char* numreg_ven, real& s_imponibili, real& s_imposte) +void TProspetto_recset::get_sum_imponibile_imposta(long numreg_ven, real& s_imponibili, real& s_imposte) { TRecord_array iva(LF_RMOVIVA, RMI_NUMRIG); TRectype* ivafilter = new TRectype(LF_RMOVIVA); + ivafilter->put(RMI_NUMREG, numreg_ven); iva.read(ivafilter); s_imponibili = ZERO; @@ -373,12 +363,13 @@ void TProspetto_recset::get_sum_imponibile_imposta(const char* numreg_ven, real& for (int i = iva.first_row(); i <= iva.rows(); ++i) { TRectype& r = iva[i]; + s_imponibili += r.get_real("IMPONIBILE"); s_imposte += r.get_real("IMPOSTA"); } } -TProspetto_recset::TProspetto_recset(const char* numreg_acq, const char* numreg_ven) : TSQL_recordset("") +TProspetto_recset::TProspetto_recset(long numreg_acq, long numreg_ven) : TSQL_recordset("") { _numreg = new TString; _today = new TString; @@ -408,6 +399,7 @@ TProspetto_recset::TProspetto_recset(const char* numreg_acq, const char* numreg_ precarica_tabelle(); TLocalisamfile anagraf(LF_ANAG), clifo(LF_CLIFO), comuni(LF_COMUNI), mov_acq(LF_MOV), mov_ven(LF_MOV), rmoviva(LF_RMOVIVA); + mov_acq.put(MOV_NUMREG, numreg_acq); mov_acq.read(); anagraf.put(ANA_TIPOA, "G"); @@ -573,12 +565,12 @@ bool TF9Prospetto_integr::preview() return _book.preview(); } -bool TF9Prospetto_integr::operator()(const char* numreg_acq, const char* numreg_ven) +bool TF9Prospetto_integr::operator()(long numreg_acq, long numreg_ven) { if (_rep.load(_f_report)) { TFilename fprosp; fprosp.tempdir().slash_terminate() << make_name_rep(); - TProspetto_recset* _prosp_rs = new TProspetto_recset(numreg_acq, numreg_ven); + TProspetto_recset * _prosp_rs = new TProspetto_recset(numreg_acq, numreg_ven); _items = _prosp_rs->items(); if (_items == 0) From 1e16e6d4f57a9fdb9ddc73c0b42e8195d98cf87e Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Fri, 4 Nov 2022 16:22:25 +0100 Subject: [PATCH 2/4] Patch level : 12.0 1214 Files correlati : fp0.exe Archiviazione cartacei --- src/include/reputils.h | 1 + src/include/tsdb.cpp | 59 +++++++++++++++++++++++++++--------- src/include/tsdb.h | 69 +++++++++++------------------------------- 3 files changed, 63 insertions(+), 66 deletions(-) diff --git a/src/include/reputils.h b/src/include/reputils.h index 1ef6fb766..6f884a776 100755 --- a/src/include/reputils.h +++ b/src/include/reputils.h @@ -45,6 +45,7 @@ protected: public: void reset(); bool log(int severity, const char* msg); // severity: 0=normal; 1=warning; 2=error + bool line() { return log(0, ""); } void set_title(const char* title); void kill_duplicates(bool k = true) { _kill_duplicates = k; } const TString& title() const { return _title; } diff --git a/src/include/tsdb.cpp b/src/include/tsdb.cpp index bf95a2c6b..0902f4f9e 100644 --- a/src/include/tsdb.cpp +++ b/src/include/tsdb.cpp @@ -7,32 +7,58 @@ * Classe per esecuzioni di query temporanee (wrapper semplice per SACommand) * ******************************************************************************/ +const bool SSimple_query::sq_set_exec(const char* query, const bool auto_f) +{ + bool ok = false; + + if (sq_is_connect()) + { + ok = _rec.set(query); + if (ok) + _rec.exec(auto_f); + } + return ok; +} + const TDate SSimple_query::sq_get_date(const char * field) { - TDate date(_rec.get_date(field)); - if(!date.ok() || date == 19000100) + TDate date; + + if (sq_is_connect()) { - TString dt_str = _rec.get(field); - if (dt_str.len() > 10) - dt_str = dt_str.left(10); - date = dt_str; + date = _rec.get_date(field); + + if (!date.ok() || date == 19000100) + { + TString dt_str = _rec.get(field); + + if (dt_str.len() > 10) + dt_str = dt_str.left(10); + date = dt_str; + } } return date; } const real SSimple_query::sq_get_real(const char * field) { - const real app(_rec.get(field)); - return app; + real r; + + if (sq_is_connect()) + r = _rec.get(field); + return r; } const TString & SSimple_query::sq_get(const char* field, const bool rtrim) { TString & fld = get_tmp_string(1024); - fld = _rec.get(field); - if (rtrim) - fld.rtrim(); + if (sq_is_connect()) + { + fld = _rec.get(field); + if (rtrim) + fld.rtrim(); + } return fld; } @@ -51,15 +77,18 @@ const TString & SSimple_query::sq_get(unsigned int column, const bool rtrim) { TString & val = get_tmp_string(1024); - val << _rec.get(column); - if (rtrim) - val.rtrim(); + if (sq_is_connect()) + { + val << _rec.get(column); + if (rtrim) + val.rtrim(); + } return val; } unsigned SSimple_query::sq_get_num_fields() const { - return _rec.get_num_fields(); + return sq_is_connect() ? _rec.get_num_fields() : 0; } const TString & SSimple_query::sq_get_name_field(const unsigned column) const diff --git a/src/include/tsdb.h b/src/include/tsdb.h index 8fc0196aa..63da48341 100644 --- a/src/include/tsdb.h +++ b/src/include/tsdb.h @@ -1,30 +1,3 @@ -/********************************************************************************** - * ######\ * - * ## __##\ * - * ## / \__| ######\ ######\####\ ######\ ######\ * - * ## | \____##\ ## _## _##\ ## __##\ ## __##\ * - * ## | ####### |## / ## / ## |## / ## |## / ## | * - * ## | ##\ ## __## |## | ## | ## |## | ## |## | ## | * - * \###### |\####### |## | ## | ## |####### |\###### | * - * \______/ \_______|\__| \__| \__|## ____/ \______/ * - * ## | * - * ## | * - * \__| * - **********************************************************************************/ - - -/******************************************************************************************************************************** - * TSDB.H * - * Inizio sviluppo: 13.10.2016 * - * Autore: Tolla * - * Descrizione: * - * La seguente libreria ha due scopi: * - * - Implementare una serie di funzioni che emulino interamente il funzionamento attuale di campo in Visual FoxPro su MSQL * - * - Creare delle nuove API per gestire il database in MSSQL con cui verranno riscritti i programmi * - * Librerie esterne utilizzate: * - * - SQLAPI++ (Permette la gestione dei pių famosi DB attualmente esistenti) * - ********************************************************************************************************************************/ - #ifndef __TSDB_H #define __TSDB_H @@ -51,12 +24,6 @@ #include "recset.h" -/******************************************************************************** - * SSimpleQuery (Sirio Simple Query) * - * "Wrapper" di TXvt_recordset, implementa OGNI funzione in modo tale da * - * poterlo sostituire brutalmente in qualsiasi momento cosė da non aver * - * problemi come durante il passaggio da ISAM a SQL (spero). che cazzata da riscrivere * - ********************************************************************************/ class SSimple_query { protected: @@ -108,44 +75,44 @@ public: // Configuration /**< Imposta la query ricevuta come (const char *) nel recordset */ - const bool sq_set(const char* query) { return _rec.set(query); } + const bool sq_set(const char* query) { return sq_is_connect() && _rec.set(query); } /**< Imposta la query ricevuta come (string) nel recordset */ - const bool sq_set(const string& query) { return _rec.set(query.c_str()); } + const bool sq_set(const string& query) { return sq_is_connect() && _rec.set(query.c_str()); } /**< Imposta la query ricevuta come (TString) nel recordset */ - const bool sq_set(TString& query) { return _rec.set(static_cast(query)); } + const bool sq_set(TString& query) { return sq_is_connect() && _rec.set(static_cast(query)); } /**< Esegue la query impostata nel recordset, se viene passato autoF == true esegue anche un comando sqNext() */ - const bool sq_exec(bool autoF = true) { return _rec.exec(autoF); } + const bool sq_exec(bool autoF = true) { return sq_is_connect() && _rec.exec(autoF); } /**< Unisce le funzioni sqSet e sqExec, riceve la query come (const char *) */ - const bool sq_set_exec(const char* query, const bool auto_f = true) { _rec.set(query); return _rec.exec(auto_f); } + const bool sq_set_exec(const char* query, const bool auto_f = true); /**< Unisce le funzioni sqSet e sqExec, riceve la query come (string) */ const bool sq_set_exec(const string& query, const bool auto_f = true) { _rec.set(query.c_str()); return _rec.exec(auto_f); } /**< Unisce le funzioni sqSet e sqExec, riceve la query come (TString) */ const bool sq_set_exec(TString& query, const bool auto_f = true) { return sq_set_exec(static_cast(query), auto_f); } /**< Si sposta avanti di un record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sq_next() { return _rec.next(); } + const bool sq_next() { return sq_is_connect() && _rec.next(); } /**< Si sposta indietro di un record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sq_prev() { return _rec.prev(); } + const bool sq_prev() { return sq_is_connect() && _rec.prev(); } /**< Si sposta al primo record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sq_first() { return _rec.first(); } + const bool sq_first() { return sq_is_connect() && _rec.first(); } /**< Si sposta all'ultimo record, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sq_last() { return _rec.last(); } + const bool sq_last() { return sq_is_connect() && _rec.last(); } /**< Si sposta alla posizione n, in caso di esito negativo valorizza _stringError e _codeError */ - const bool sq_go(const int new_pos) { return _rec.go(new_pos); } + const bool sq_go(const int new_pos) { return sq_is_connect() && _rec.go(new_pos); } /**< Ritorna il numero di righe affette dall'ultima query */ - const int sq_rows_affected() const { return _rec.rows_affected(); } + const int sq_rows_affected() const { return sq_is_connect() ? _rec.rows_affected() : 0; } // Getters /**< Ritorna il valore nel campo (field) in formato (int) */ - const int sq_get_int(const char* field) { return _rec.get_int(field); } + const int sq_get_int(const char* field) { return sq_is_connect() ? _rec.get_int(field) : 0; } /**< Ritorna il valore nel campo (field) in formato (short) */ - const short sq_get_short(const char* field) { return _rec.get_short(field); } + const short sq_get_short(const char* field) { return sq_is_connect() ? _rec.get_short(field) : 0; } /**< Ritorna il valore nel campo (field) in formato (long) */ - const long sq_get_long(const char* field) { return _rec.get_long(field); } + const long sq_get_long(const char* field) { return sq_is_connect() ? _rec.get_long(field) : 0L; } /**< Ritorna il valore nel campo (field) in formato (double) */ - const double sq_get_double(const char* field) { return _rec.get_double(field); } + const double sq_get_double(const char* field) { return sq_is_connect() ? _rec.get_double(field) : 0.0; } /**< Ritorna il valore nel campo (field) in formato (bool) */ - const bool sq_get_bool(const char* field) { return _rec.get_bool(field); } + const bool sq_get_bool(const char* field) { return sq_is_connect() && _rec.get_bool(field); } /**< Ritorna il valore nel campo (field) in formato (TDate) */ const TDate sq_get_date(const char* field); /**< Ritorna il valore nel campo (field) in formato (real) */ @@ -161,7 +128,7 @@ public: /**< Ritorna il valore della colonna numero (column) passato come (unsigned int) */ const TString & sq_get(unsigned int column, bool rtrim = true); /**< Ritorna il valore nel campo (field) in formato (char) */ - const char sq_get_char(const char* field) { return _rec.get_char(field); } + const char sq_get_char(const char* field) { return sq_is_connect() && _rec.get_char(field); } /**< Ritorna il numero di campi dopo l'ultimo comando di esecuzione effettuato; se il risultato esiste */ unsigned int sq_get_num_fields() const; /**< Ritorna il nome del campo numero (column) in formato (TString) = */ @@ -171,7 +138,7 @@ public: /**< Ritorna il tipo del campo numero (column) in formato (TFieldtypes) */ TFieldtypes sq_get_type_field(unsigned column) const; /**< Ritorna la posizione attuale */ - const long sq_pos() const { return _rec.pos(); } + const long sq_pos() const { return sq_is_connect() ? _rec.pos() : 0; } // Error Getters /**< Ritorno l'ultimo codice errore segnalato in formato /int) */ From 4073f87b6b10f66905159564ac9cc488e9678412 Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Fri, 4 Nov 2022 16:27:13 +0100 Subject: [PATCH 3/4] Patch level : 12.0 1214 Files correlati : fp0.exe Archiviazione cartacei --- build/f90.vcxproj | 1 + build/f90.vcxproj.filters | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/build/f90.vcxproj b/build/f90.vcxproj index 8bda43863..ac79b6b4d 100644 --- a/build/f90.vcxproj +++ b/build/f90.vcxproj @@ -93,6 +93,7 @@ MachineX86 ..\lib + false true diff --git a/build/f90.vcxproj.filters b/build/f90.vcxproj.filters index 6be8207d7..9270b4d88 100644 --- a/build/f90.vcxproj.filters +++ b/build/f90.vcxproj.filters @@ -68,10 +68,13 @@ Sources + + Sources + Sources - + Sources From db2c9d257297cf700c47b277bc49bc8573faecd4 Mon Sep 17 00:00:00 2001 From: smen Date: Fri, 25 Nov 2022 12:03:28 +0100 Subject: [PATCH 4/4] Patch level : 12.0 1216 Files correlati : f9.exe Bugfix dopo test archiviazione cartacei --- src/f9/f90100.cpp | 2 +- src/f9/f9lib01.cpp | 8 +++++++- src/include/automask.h | 2 +- src/include/golem.cpp | 23 ++++++++++++++++------- src/include/golem.h | 2 ++ src/include/msksheet.cpp | 19 +++++++++++++++++-- 6 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/f9/f90100.cpp b/src/f9/f90100.cpp index ecec09176..bf54630aa 100644 --- a/src/f9/f90100.cpp +++ b/src/f9/f90100.cpp @@ -84,7 +84,7 @@ int TEstrai_mask::estrai() long nreg = mov.get_long(MOV_NUMREG); - if (nreg == 20045) + if (nreg == 207) int here = 0; if (escluso) diff --git a/src/f9/f9lib01.cpp b/src/f9/f9lib01.cpp index af03a0347..6499dad0a 100644 --- a/src/f9/f9lib01.cpp +++ b/src/f9/f9lib01.cpp @@ -482,6 +482,12 @@ void TEstrazione::copy_file_to_webapp_fld(TMovimento_estr& movimento) const { TFilename dest(base); + if (file.is_relative_path()) + { + const TString studio = prefix().get_studio(); + file.insert(studio); + } + if (cd != nullptr && file.full()) dest.add(cd->catdoc()); else @@ -879,7 +885,7 @@ const char* TEstrazione::diagnostica_mov() const long numreg = mov_i.numreg(); - if (numreg == 20045) { + if (numreg == 210) { int here = 0; } diff --git a/src/include/automask.h b/src/include/automask.h index 5f52634e2..39e55a6b3 100755 --- a/src/include/automask.h +++ b/src/include/automask.h @@ -1,7 +1,7 @@ #ifndef __AUTOMASK_H #define __AUTOMASK_H -#ifndef __DEFMASK_H +#ifndef __DEFMASK_Hautomask #include #endif diff --git a/src/include/golem.cpp b/src/include/golem.cpp index 3214a30af..dccc0b41e 100755 --- a/src/include/golem.cpp +++ b/src/include/golem.cpp @@ -73,6 +73,18 @@ bool print_url(const char* url) return ok; } +const TString & get_golem_path(long ditta) +{ + TFilename golem_path; + if (ditta < 0) + ditta = prefix().get_codditta(); + golem_path = firm2dir(ditta); + golem_path.add("golem"); + if (!dexist(golem_path)) + make_dir(golem_path); + return get_tmp_string() = golem_path; +} + /////////////////////////////////////////////////////////// // Maschera GOLEM /////////////////////////////////////////////////////////// @@ -452,13 +464,8 @@ bool TGolem_field::autosave(TRelation& r) const int logicnum = r.lfile().num(); dir.get(logicnum, _nolock, _nordir, _sysdirop); const long ditta = dir.is_com() ? 0 : prefix().get_codditta(); - - TFilename golem_path; - golem_path = firm2dir(ditta); - golem_path.add("golem"); - if (!dexist(golem_path)) - make_dir(golem_path); - + const TFilename golem_path = get_golem_path(ditta); + const int old_items = _old_value.items(); const int new_items = new_value.items(); const int items = new_items > old_items ? new_items : old_items; @@ -506,6 +513,8 @@ bool TGolem_field::autosave(TRelation& r) } fcopy(new_file, old_file); + if (old_file.starts_with(golem_path)) + old_file = old_file.mid(golem_path.len()); new_row.add(old_file, 0); new_value.add(new_row, i); diff --git a/src/include/golem.h b/src/include/golem.h index f8dedd29a..e54084633 100755 --- a/src/include/golem.h +++ b/src/include/golem.h @@ -15,6 +15,8 @@ bool print_url(const char* url); class TMAPI_session; +const TString & get_golem_path(long ditta); + class TMail_message : public TString_array { TString_array _recipients, _copy_recipients, _attachments; diff --git a/src/include/msksheet.cpp b/src/include/msksheet.cpp index f67b88e69..2d0e72f17 100755 --- a/src/include/msksheet.cpp +++ b/src/include/msksheet.cpp @@ -337,9 +337,9 @@ public: // @cmember Modifica a video la riga void update(int row); // @cmember Ritorna la disabilitazione della colonna

- bool column_disabled(int col) const { return _column_disabled[col]; } + bool column_disabled(int col) const; // @cmember Ritorna l' abilitazione della colonna

- bool column_enabled(int col) const { return !column_disabled(col); } + bool column_enabled(int col) const; // @cmember Ritorna il contenuto della riga

-esima TToken_string& row(int n) { return _str.row(n); } @@ -1065,6 +1065,21 @@ bool TSpreadsheet::destroy( return ok; } +bool TSpreadsheet::column_disabled(int col) const +{ + if (col >= FIRST_FIELD) + col = cid2index(col); + return _column_disabled[col]; +} + +bool TSpreadsheet::column_enabled(int col) const +{ + if (col >= FIRST_FIELD) + col = cid2index(col); + return !column_disabled(col); +} + + // @doc INTERNAL // @mfunc Modifica a video la riga