From a266e781dd362cb548c38d0a32392f544ebf3082 Mon Sep 17 00:00:00 2001 From: Simone Palacino Date: Mon, 3 Jun 2019 15:20:42 +0200 Subject: [PATCH] Patch level : 12.0 808 Files correlati : cg2.exe, fp0.exe Commento : - Corretto salvataggio movimenti spostato in write/rewrite - Tolto controllo se F8: inutile basta avere fp e f1 - Corretto flag registrazione collegata a fppro quando apro da monito passive - Cambiato messaggio in registrazione quando si modifica una registrazione gia' collegata a fppro - Aggiunto controllo data inizio fatturazione nell'handler di DATAREG - Corretto salvataggio data inizio fatturazione: salvava un booleano invece della data (?!) --- src/cg/cg2100.cpp | 105 +++++++++++++++++++++------------------------ src/cg/cg2102.cpp | 7 ++- src/cg/cg2102.h | 11 +++-- src/fp/fplib02.cpp | 2 +- 4 files changed, 64 insertions(+), 61 deletions(-) diff --git a/src/cg/cg2100.cpp b/src/cg/cg2100.cpp index fba63ae35..e94eb21c6 100755 --- a/src/cg/cg2100.cpp +++ b/src/cg/cg2100.cpp @@ -1255,7 +1255,6 @@ int TPrimanota_application::read(TMask& m) return _rel->status(); } - // Trasferisce i dati da maschera a movimento di prima nota void TPrimanota_application::mask2rel(const TMask& m) { @@ -1446,6 +1445,13 @@ void TPrimanota_application::check_saldi() } } +void TPrimanota_application::write_fppro() +{ + // Controllo se la registrazione ha avuto effetto anche su FPPRO allora salvo riferimento sul mov + if (save_fppro() > 0 && !save_dbmov()) + message_box(TString("ATTENZIONE:") << " non č stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n" << + "Movimento registrato senza collegamento ai documenti in ingresso."); +} int TPrimanota_application::write(const TMask& m) { @@ -1470,6 +1476,8 @@ int TPrimanota_application::write(const TMask& m) const int err = _rel->write(true); if (err == NOERR) { + write_fppro(); + _saldi.registra(); check_saldi(); @@ -1558,6 +1566,8 @@ int TPrimanota_application::rewrite(const TMask& m) const int err = _rel->rewrite(true); if (err == NOERR) { + write_fppro(); + _saldi.registra(); check_saldi(); @@ -1602,10 +1612,10 @@ void TPrimanota_application::clean_fppro() TMask& msk = curr_mask(); const KEY last_key = msk.last_key(); - // Controlli: solo in mod modifica; che abbia fp (no F8); che non sono in salvataggio + // Controlli: solo in mod modifica; che abbia fp-f1 (no F8); che non sono in salvataggio if (_mode != MODE_MOD || !has_f1_db(&msk) - || last_key != K_DEL && last_key != K_SAVE && last_key != K_ELIMMAS) + || last_key != K_DEL && last_key != K_SAVE && last_key != K_ELIMMAS && last_key != K_QUIT) return; const TString& numreg = msk.get(F_NUMREG); @@ -1624,7 +1634,7 @@ void TPrimanota_application::set_has_f1_db(TMask* m) if (m->find_by_id(F_DATAREG) != NULL && !m->get(F_DATAREG).empty()) { if (TDate(m->get(F_DATAREG)) >= TDate(fp_settings().get_data_start_fatt())) - _isfp = has_module(F1AUT) && !fp_settings().get_db_indirizzo().empty() && !fp_settings().is_f8(); + _isfp = has_module(F1AUT) && !fp_settings().get_db_indirizzo().empty(); else _isfp = false; _is_set_fpcheck = true; @@ -2254,7 +2264,10 @@ void TPrimanota_application::ini2mask(TConfig& ini, TMask& msk, bool query) } } if (_f1_ini && msk.find_by_id(FS_RECALC) != NULL) + { + msk.set(F_COLFPPRO, "X"); msk.set(FS_RECALC, ""); + } if (_f1_liq && msk.find_by_id(F_DIFFERITA) != NULL) { TDate datadoc(msk.get(F_DATADOC)); datadoc.set_day(1); @@ -2271,18 +2284,8 @@ bool TPrimanota_application::save(bool check_dirty) _swap_mask = false; return true; } - const int fp_code = save_fppro(); - const bool saved = TRelation_application::save(check_dirty); - // Controllo se la registrazione ha avuto effetto anche su FPPRO allora salvo riferimento sul mov - if (saved) - { - if(fp_code > 0 && !save_dbmov()) - message_box(TString("ATTENZIONE:") << " non č stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n" << - "Movimento registrato senza collegamento ai documenti in ingresso."); - } - - return saved; + return TRelation_application::save(check_dirty); } void TPrimanota_application::dump_rec(TConfig & ini, const TRectype & rec, int row, int pref) @@ -2410,48 +2413,36 @@ int TPrimanota_application::save_fppro() } // Anzitutto guardo la modalita' in cui sono - // Se in modalita' inserimento continuo normalmente - if (_mode != MODE_INS) + // Se in modalita' inserimento continuo normalmente o in mod. modifica + // Guardo se quel documento corrisponde a un doc in FPPRO + // Lancio messaggio di avvertimento pulisco su db e proseguo col salvataggio del documento modificato + if (_mode != MODE_INS && _mode == MODE_MOD) { - // Se in modalita' modifica e sto salvando - // Guardo se quel documento corrisponde a un doc in FPPRO - // Lancio messaggio di avvertimento pulisco su db e proseguo col salvataggio del documento modificato - if(_mode == MODE_MOD && last == K_SAVE) + TString query; + query << "SELECT COUNT(*) AS COUNT FROM FPPRO00F WHERE PZ_NUMREGCONT = '" << msk.get(F_NUMREG) << "'"; + fp_db().sq_set_exec(query); + if (fp_db().sq_get_int("COUNT") != 0) { - TString query; - query << "SELECT COUNT(*) AS COUNT FROM FPPRO00F WHERE PZ_NUMREGCONT = '" << msk.get(F_NUMREG) << "'"; - fp_db().sq_set_exec(query); - if (fp_db().sq_get_int("COUNT") != 0) - { - message_box(TString("Attenzione!") << " E' stato modificato un movimento giā collegato a un documento in ingresso."); - clean_fppro(); // Pulisco db - save_dbmov(); // Svuoto riferimento doc ingresso sul mov - } + message_box(TString("Attenzione!") << " E' stato modificato un movimento giā collegato a un documento in ingresso."); + clean_fppro(); // Pulisco db + save_dbmov(true); // Svuoto riferimento doc ingresso sul mov } - // In altre modalita' esco senza fare nulla sul db - else return pro_notsaved; } + else return pro_notsaved; // In altre modalita' esco senza fare nulla sul db // Controllo che sto registrando un documento FA Fattura di Acquisto o NC Acquisto if (!check_causale(msk.get(F_CODCAUS))) return pro_notsaved; - if (last != K_SAVE) { // Se sto uscendo avvertimento di non salvataggio e salto - message_box("La registrazione del movimento non verrā salvata sul database."); - return pro_notsaved; - } - const TDate data_operazione(msk.get(F_DATAREG)); - const TDate data_documento(msk.get(F_DATADOC)); - const TString& numero_docext = msk.get(F_NUMDOCEXT); - const TString& numero_doc = msk.get(F_NUMDOC); - const TString& codforn = msk.get(F_CODCLIFOR); - const TString& stato_piva = msk.get(F_STATOPAIV); - const TString& piva = msk.get(F_PIVA); - const TString& tot_doc = msk.get(F_TOTALE); - TToken_string fppro_keys(msk.get(F_PROKEY), ';'); - const TString& keyprginvio = fppro_keys.get(); - const TString& keyheaderfatt = fppro_keys.get(); - const TString& keybodyfatt = fppro_keys.get(); + const TDate data_operazione(msk.get(F_DATAREG)); + const TDate data_documento(msk.get(F_DATADOC)); + const TString& numero_docext = msk.get(F_NUMDOCEXT); + const TString& numero_doc = msk.get(F_NUMDOC); + const TString& tot_doc = msk.get(F_TOTALE); + TToken_string fppro_keys(msk.get(F_PROKEY), ';'); + const TString& keyprginvio = fppro_keys.get(); + const TString& keyheaderfatt = fppro_keys.get(); + const TString& keybodyfatt = fppro_keys.get(); TString where_str; where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\' AND PQ_IMPTOTDOC = \'" << tot_doc << "\' AND PZ_NUMERO = \'" << (!numero_docext.empty() ? numero_docext : numero_doc) << "\') "; @@ -2461,17 +2452,21 @@ int TPrimanota_application::save_fppro() const int n = fp_db().sq_items(); if (n != 1) { - warning_box(TString("Attenzione, ") << "al movimento non č stato abbinato nessun documento elettronico.\n" << - "Per consentire una corretta archiviazione sostitutiva si consiglia di non confermare la registrazione e di procedere\n" << - "all'identificazione del fornitore tramite il monitor fatture passive.\n" << + warning_box(TString("Attenzione, ") << "al movimento non č stato abbinato nessun documento elettronico.\n" << + "Per consentire una corretta archiviazione sostitutiva si consiglia di non confermare la registrazione e di procedere\n" << + "all'identificazione del fornitore tramite il monitor fatture passive.\n" << "In caso di documento escluso dalla fatturazione elettronica ignorate questo messaggio."); return pro_notsaved; } const int numreg = fp_db().sq_get_int("PZ_NUMREGCONT"); if (numreg != 0) { - error_box(TString("Il documento ") << data_documento.year() << " / " << numero_doc << " č giā stato inserito con la registrazione numero " << numreg << "\nSalvataggio su protocollo in ingresso impossibile."); - return pro_notsaved; + const bool key = noyes_box( + TString("Il documento ") << data_documento.year() << " / " << numero_doc << + " č giā stato inserito con la registrazione numero " << numreg << + "\nSi desidera continuare comunque?"); + if(!key) + return pro_notsaved; } // Devo controllare che la data operazione sia maggiore della data ric @@ -2497,7 +2492,7 @@ int TPrimanota_application::save_fppro() return saved? pro_noerr : pro_notsaved; } -bool TPrimanota_application::save_dbmov() const +bool TPrimanota_application::save_dbmov(bool clean) const { const TMask& msk = curr_mask(); const TString& numreg = msk.get(H_NUMREG); @@ -2508,7 +2503,7 @@ bool TPrimanota_application::save_dbmov() const bool ok = mov.read() == NOERR; if (ok) { - mov.put(MOV_KEYFPPRO, keyfppro); + mov.put(MOV_KEYFPPRO, !clean ? keyfppro : ""); ok = mov.rewrite() == NOERR; } return ok; diff --git a/src/cg/cg2102.cpp b/src/cg/cg2102.cpp index 6c9924edf..fae48ad15 100755 --- a/src/cg/cg2102.cpp +++ b/src/cg/cg2102.cpp @@ -2262,10 +2262,13 @@ bool TPrimanota_application::caus_query_handler(TMask_field& f, KEY key) void TPrimanota_application::check_fppro_fields(TMask& m) { - if (!check_causale(m.get(F_CODCAUS)) || !app().has_f1_db(&m)) + const bool after_data = TDate(m.get(F_DATAREG)) >= TDate(fp_settings().get_data_start_fatt()); + if (!check_causale(m.get(F_CODCAUS)) || !app().has_f1_db(&m) || !after_data) { if(m.find_by_id(DLG_LINK) != NULL) m.disable(DLG_LINK); + if (m.find_by_id(F_COLFPPRO) != NULL) + m.hide(F_COLFPPRO); } else { @@ -3977,7 +3980,7 @@ bool TPro_msk::fppro_ok_handler(TMask_field& f, KEY k) sf.force_update(); if(!ok) message_box("Nessun documento selezionato."); - msk.stop_run(20334); + msk.stop_run(K_QUIT); return true; } diff --git a/src/cg/cg2102.h b/src/cg/cg2102.h index c6da6d4bd..12295e703 100755 --- a/src/cg/cg2102.h +++ b/src/cg/cg2102.h @@ -208,21 +208,26 @@ protected: // TApplication virtual void mask2ini(const TMask& msk, TConfig& ini); // Metodi per aggancio FPPRO (solo su operazioni di Fattura di Acquisto) + + // Metodo chiamato dalla write e rewrite per salvare su db fatt. + void write_fppro(); // Salvo dati fornitore e registrazione contabile sul db FPPRO int save_fppro(); - // Salva sul movimento il riferimento al documento in FPPRO - bool save_dbmov() const; + // Salva sul movimento il riferimento al documento in FPPRO (keys) + bool save_dbmov(bool clean = false) const; // Pulisce il mov e db dai firerimenti FPPRO (in MODE_MOD per edit/delete) void clean_fppro(); + // setta variabili prima del controllo has_f1_db void set_has_f1_db(TMask* m); bool has_f1_db(TMask* m); + virtual bool save(bool check_dirty); bool get_mask_swap_file(TFilename& name) const; bool force_mask_swap(const TCausale& old_caus, const TCausale& new_caus); protected: // TRelation_application - void check_f1_ini(); + void check_f1_ini(); // setto variabili se ho f1 o liq nei parametri (ini da fp) virtual bool user_create(); virtual bool user_destroy(); virtual bool changing_mask(int mode); diff --git a/src/fp/fplib02.cpp b/src/fp/fplib02.cpp index 3c19a60ba..a55251b71 100644 --- a/src/fp/fplib02.cpp +++ b/src/fp/fplib02.cpp @@ -249,7 +249,7 @@ void TFP_settings::set_no_export_pronto(const bool no_export_pronto) const void TFP_settings::set_data_start_fatt(const char* date) const { - ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_DATASTARTFATT, date); + ini_set_string(FILE_CONFIG, FILE_SECTION, FP_DATASTARTFATT, date); } void TFP_settings::remove_para_ini(int idx)