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 (?!)
This commit is contained in:
Simone Palacino 2019-06-03 15:20:42 +02:00
parent 91df0c01a1
commit a266e781dd
4 changed files with 64 additions and 61 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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)