diff --git a/src/fp/fp0.cpp b/src/fp/fp0.cpp index bbcdc387c..3cad13b6d 100644 --- a/src/fp/fp0.cpp +++ b/src/fp/fp0.cpp @@ -4,7 +4,7 @@ int main(int argc, char** argv) { int rt = -1; - const int r = (argc > 1) ? atoi( &argv[1][1] ) : 1; + const int r = (argc > 1) ? atoi( &argv[1][1] ) : 0; switch (r) { diff --git a/src/fp/fp0100.cpp b/src/fp/fp0100.cpp index 5aa4b88e7..49adc7e18 100644 --- a/src/fp/fp0100.cpp +++ b/src/fp/fp0100.cpp @@ -47,6 +47,7 @@ void TParametri_mask::save_all() const fp_settings().set_f8(get_bool(F_F8)); fp_settings().set_check_not_block(get_bool(F_CHECK_NOT_BLOCK)); fp_settings().set_no_sconti_fatt(get_bool(F_CHECK_NO_SCONTI)); + fp_settings().set_no_export_pronto(get_bool(F_CHECK_NO_EXPORT_PRONTO)); TFP_righe_custom().save_sheet(sfield(F_FORMPERS)); TFP_nota_piede_f().save_sheet(sfield(F_NPFSHEET)); } @@ -65,6 +66,7 @@ void TParametri_mask::load_all() set(F_F8, fp_settings().is_f8()); set(F_CHECK_NOT_BLOCK, fp_settings().get_check_not_block()); set(F_CHECK_NO_SCONTI, fp_settings().get_no_sconti_fatt()); + set(F_CHECK_NO_EXPORT_PRONTO, fp_settings().get_no_export_pronto()); TFP_righe_custom().load_sheet(sfield(F_FORMPERS)); TFP_nota_piede_f().load_sheet(sfield(F_NPFSHEET)); } @@ -109,30 +111,15 @@ TMask & TParametri_mask::get_tmp_msk(const char * title) return *m; } -bool TParametri_mask::on_key(KEY key) +bool TParametri_mask::on_key(const KEY key) { - switch(key) + if (key == K_SHIFT + K_F12) { - case K_SHIFT + K_F12: + if (run_fp_psw_mask()) { - TMask& m = get_tmp_msk("Password"); - m.add_string(101, 0, "Password ", 1, 1, 15, "*"); - m.field(101).check_type(CHECK_REQUIRED); - while(m.run() == K_ENTER) - { - if (m.get(101) == "sirioFATT99") // Hardcoded password are the best! - { - for (int i = F_SETPATCH; i <= F_REBORNDB; i++) - enable(i); - break; - } - else - error_box("Password errata"); - } - break; + for (int i = F_SETPATCH; i <= F_REBORNDB; i++) + enable(i); } - default: - break; } return true; } diff --git a/src/fp/fp0100a.h b/src/fp/fp0100a.h index f85275565..53f1bc5aa 100644 --- a/src/fp/fp0100a.h +++ b/src/fp/fp0100a.h @@ -1,32 +1,33 @@ -#define F_INDIRIZZO 201 -#define F_DATABASE 202 -#define F_USER 203 -#define F_PASSWORD 204 -#define F_FLDDEST 205 -#define F_FLDUSRDEST 206 -#define F_COFI 207 -#define F_ESPORTAALLEG 208 -#define F_ESPORTADOC 209 -#define F_F8 210 -#define F_CHECK_NOT_BLOCK 211 -#define F_CHECK_NO_SCONTI 212 +#define F_INDIRIZZO 201 +#define F_DATABASE 202 +#define F_USER 203 +#define F_PASSWORD 204 +#define F_FLDDEST 205 +#define F_FLDUSRDEST 206 +#define F_COFI 207 +#define F_ESPORTAALLEG 208 +#define F_ESPORTADOC 209 +#define F_F8 210 +#define F_CHECK_NOT_BLOCK 211 +#define F_CHECK_NO_SCONTI 212 +#define F_CHECK_NO_EXPORT_PRONTO 213 -#define F_SETPATCH 301 -#define F_ENPTYTABLE 302 -#define F_DROPTABLE 303 -#define F_REBORNDB 304 +#define F_SETPATCH 301 +#define F_ENPTYTABLE 302 +#define F_DROPTABLE 303 +#define F_REBORNDB 304 -#define F_FORMPERS 401 +#define F_FORMPERS 401 -#define S_TIPODOC 101 -#define S_TIPORIGA 102 -#define S_QTA 103 -#define S_PREZZO 104 -#define S_IMPONIBILE 105 +#define S_TIPODOC 101 +#define S_TIPORIGA 102 +#define S_QTA 103 +#define S_PREZZO 104 +#define S_IMPONIBILE 105 -#define F_NPFSHEET 501 +#define F_NPFSHEET 501 -#define S_DOC 101 -#define S_NOTAPF 102 \ No newline at end of file +#define S_DOC 101 +#define S_NOTAPF 102 \ No newline at end of file diff --git a/src/fp/fp0100a.uml b/src/fp/fp0100a.uml index ebcbd7356..6bf0392cf 100644 --- a/src/fp/fp0100a.uml +++ b/src/fp/fp0100a.uml @@ -101,7 +101,7 @@ BEGIN ITEM "Imponibile" END -GROUPBOX DLG_NULL 78 3 +GROUPBOX DLG_NULL 78 4 BEGIN PROMPT 1 8 "@BControlli preventivi" END @@ -111,19 +111,24 @@ BEGIN PROMPT 2 9 "Rendi controlli XML non bloccanti" END +BOOLEAN F_CHECK_NO_EXPORT_PRONTO +BEGIN + PROMPT 2 10 "Esporta i documenti in stato diagnosticato" +END + GROUPBOX DLG_NULL 78 3 BEGIN - PROMPT 1 11 "@BPersonalizzazioni documento" + PROMPT 1 12 "@BPersonalizzazioni documento" END BOOLEAN F_CHECK_NO_SCONTI BEGIN - PROMPT 2 12 "Non esporre sconti in fattura" + PROMPT 2 13 "Non esporre sconti in fattura" END SPREADSHEET F_NPFSHEET 60 6 BEGIN - PROMPT 1 14 "Inserimento\nNote piede fattura" + PROMPT 1 15 "Inserimento\nNote piede fattura" ITEM "Tipo\nDoc@4" ITEM "Nota piede\nFattura@15" END diff --git a/src/fp/fp0300.cpp b/src/fp/fp0300.cpp index 404e8ff83..e377e2ad4 100644 --- a/src/fp/fp0300.cpp +++ b/src/fp/fp0300.cpp @@ -12,6 +12,7 @@ #include "fp0.h" #include "fp0300a.h" +#include "fp0100a.h" ///////////////////////////////////////////////////////////////////////////////////// // Globals @@ -29,23 +30,28 @@ class TPA_mask : public TAutomask protected: enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi}; - void set_filter_changed(); - void set_pronto(); - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - void next_page(int p); - bool check_not_empty(); - bool check_full_fields() const; - bool check_doc_filter(const TDocumentoEsteso& td) const; - void set_err_paf(); - void fill(); - void init(); + void set_filter_changed(); + void set_pronto(); + void connect_keys(); + void export_paf(); + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; + void next_page(int p) override; + bool on_key(KEY key) override; + bool check_not_empty(); + bool check_full_fields() const; + bool check_doc_filter(const TDocumentoEsteso& td) const; + void set_err_paf(); + void fill(); + void init(); + void force_reload_sheet(); void load_all_fields(); bool _filter_changed; + bool _enable_chiave_fixer; public: - TPA_mask() : TAutomask("fp0300a"), _filter_changed(true) + TPA_mask() : TAutomask("fp0300a"), _filter_changed(true), _enable_chiave_fixer(false) { disable(DLG_OK); disable(DLG_SAVEREC); @@ -70,6 +76,16 @@ void TPA_mask::save_all_fields() const fp_settings().set_esp_est_cod(get(F_VALCODEST)); } +void TPA_mask::force_reload_sheet() +{ + // Mi sposto nella prima pagina, setto il flag di dirty sul filtro e mi risposto + // Lo faccio perché eliminando la riga direttamente e chiamando la force_update() si crea un bug che cliccando sulla prima riga viene mostrata quella che c'era prima della eliminazione + TAutomask::next_page(0); + set_focus_field(F_DATAINI); + _filter_changed = true; + next_page(1); +} + void TPA_mask::load_all_fields() { set(F_DATAINI, ini_get_string(CONFIG_DITTA, "fp", "dataini")); @@ -140,10 +156,12 @@ void TPA_mask::fill() enable(DLG_OK); enable(DLG_SAVEREC); enable(DLG_FINDREC); + enable(DLG_PRINT); #else enable(DLG_OK, filter_selected != "X" && filter_selected != "P"); - enable(DLG_SAVEREC, fp_settings().is_f8() && filter_selected == "X"); + enable(DLG_SAVEREC, (fp_settings().is_f8() && filter_selected == "X") || filter_selected == "P"); enable(DLG_FINDREC, filter_selected == "P"); + enable(DLG_PRINT, _enable_chiave_fixer && filter_selected == "X"); #endif // Record di controllo per eventuali elaborazioni precedenti @@ -264,10 +282,199 @@ void TPA_mask::set_filter_changed() void TPA_mask::set_pronto() { - if(fp_db().sq_set_exec("UPDATE PAF0100F SET P1_GESTIONE = 'P' WHERE P1_GESTIONE = 'D'") && fp_db().sq_commit()) + TString_array& sht = sfield(F_DOCS).rows_array(); + TProgress_monitor pi(sht.items(), "Esportazione Fatture"); + FOR_EACH_ARRAY_ROW(sht, r, riga) { - message_box("Fatture esportate!"); + if (!pi.add_status()) + break; + + if (!riga->starts_with("X")) + continue; + + static TString campo_hfatt, campo_bfatt, query; + TDocumento doc('D', riga->get_int(xvtil_cid2index(S_ANNO)), riga->get(xvtil_cid2index(S_CODNUM)), riga->get_long(xvtil_cid2index(S_NDOC))); + + if (chiave_paf(doc, campo_hfatt, campo_bfatt)) + { + // Come prima cosa controllo che effettivamente la chiave di questo doc sia in giro per il mondo + query.cut(0) << "UPDATE PAF0100F SET P1_GESTIONE = 'P' WHERE P1_KEYHEADERFATT = '" << campo_hfatt << "' AND P1_KEYBODYFATT = '" << campo_bfatt << "'"; + fp_db().sq_set_exec(query); + } } + + // Committo tutto + fp_db().sq_commit(); + force_reload_sheet(); +} + +void TPA_mask::connect_keys() +{ + TString_array& sht = sfield(F_DOCS).rows_array(); + TLog_report legno("Allineamento chiavi documento"); + // Non sto a fare 8000 variabili, oggi mi sento a corto di Byte + static TString msg_log; + int updated = 0; + + if (sht.empty()) + { + warning_box("Impossibile allineare le chiavi di uno sheet vuoto!"); + return; + } + TProgress_monitor pi(sht.items(), "Esportazione Fatture"); + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (!pi.add_status()) + break; + + if (!riga->starts_with("X")) + continue; + + TDocumento doc('D', riga->get_int(xvtil_cid2index(S_ANNO)), riga->get(xvtil_cid2index(S_CODNUM)), riga->get_long(xvtil_cid2index(S_NDOC))); + static TString campo_hfatt, campo_bfatt, query; + if (chiave_paf(doc, campo_hfatt, campo_bfatt)) + { + // Come prima cosa controllo che effettivamente la chiave di questo doc sia in giro per il mondo + query.cut(0) << "SELECT * FROM PAF0100F WHERE P1_KEYHEADERFATT = '" << campo_hfatt << "' AND P1_KEYBODYFATT = '" << campo_bfatt << "'"; + if(fp_db().sq_set_exec(query)) + { + msg_log.cut(0) << "Il documento " << campo_bfatt << " è già presente nel DB, verrà saltato"; + legno.log(9000, msg_log); + continue; + } + + // Provo a cercare il documento nel paf07 come un vero uomo + query.cut(0) << "SELECT P7_KEYPRGINVIO, P7_KEYHEADERFATT, P7_KEYBODYFATT FROM PAF0700F WHERE P7_KEYHEADERFATT = '" << campo_hfatt + << "' AND P7_TIPODOC = '" << tipo_doc_sdi(doc) << "' AND P7_DATA = '" << doc.data().date2ansi() << "' AND P7_NUMERO LIKE '%" << doc.numero() << "%'"; + + if (fp_db().sq_set_exec(query, false)) + { + bool found = false; + // Valori nel db + static TString db_prginv, db_hfatt, db_bfatt; + + // Posso avere più di un risulatato, per esempio se effettuo la fatturazione di gennaio potrei avere la fattura 1, 10 e 11 del cliente 100. + for (bool ok = fp_db().sq_set_exec(query); ok && !found; ok = fp_db().sq_next()) + { + db_prginv.cut(0) << fp_db().sq_get("P7_KEYPRGINVIO"); + db_hfatt.cut(0) << fp_db().sq_get("P7_KEYHEADERFATT"); + db_bfatt.cut(0) << fp_db().sq_get("P7_KEYBODYFATT"); + + // Adesso che ho trovato il documento vado a verificare per scrupolo anche le righe documento + query.cut(0) << "SELECT * FROM PAF1800F WHERE PI_KEYPRGINVIO = '" << db_prginv + << "' AND PI_KEYHEADERFATT = '" << db_hfatt + << "' AND PI_KEYBODYFATT = '" << db_bfatt << "'"; + + // Setto momentaneamente a true per ciclare sotto + found = true; + for (bool move_ok = fp_db().sq_set_exec(query); move_ok && found; move_ok = fp_db().sq_next()) + { + const TRiga_documento& rigadoc = doc[fp_db().sq_get_int("PI_NUMEROLINEA")]; + // Testo solo la qta, il prezzo è troppo complicato + const real& qta = rigadoc.quantita(); + found &= !qta.is_zero() ? qta == fp_db().sq_get_real("PI_QUANTITA") : fp_db().sq_get_real("PI_QUANTITA") <= UNO; + } + } + + if(!found) + { + msg_log.cut(0) << "Il documento " << campo_bfatt << " non è presente nel DB PAF, verrà saltato"; + legno.log(9000, msg_log); + continue; + } + else + { + query.cut(0) << + "UPDATE PAF0100F SET P1_KEYHEADERFATT = '" << campo_hfatt << "', P1_KEYBODYFATT = '" << campo_bfatt << "' WHERE P1_KEYPRGINVIO = '" << db_prginv << "' AND P1_KEYHEADERFATT = '" << db_hfatt << "' AND P1_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0200F SET P2_KEYHEADERFATT = '" << campo_hfatt << "', P2_KEYBODYFATT = '" << campo_bfatt << "' WHERE P2_KEYPRGINVIO = '" << db_prginv << "' AND P2_KEYHEADERFATT = '" << db_hfatt << "' AND P2_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0400F SET P4_KEYHEADERFATT = '" << campo_hfatt << "', P4_KEYBODYFATT = '" << campo_bfatt << "' WHERE P4_KEYPRGINVIO = '" << db_prginv << "' AND P4_KEYHEADERFATT = '" << db_hfatt << "' AND P4_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0700F SET P7_KEYHEADERFATT = '" << campo_hfatt << "', P7_KEYBODYFATT = '" << campo_bfatt << "' WHERE P7_KEYPRGINVIO = '" << db_prginv << "' AND P7_KEYHEADERFATT = '" << db_hfatt << "' AND P7_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0800F SET P8_KEYHEADERFATT = '" << campo_hfatt << "', P8_KEYBODYFATT = '" << campo_bfatt << "' WHERE P8_KEYPRGINVIO = '" << db_prginv << "' AND P8_KEYHEADERFATT = '" << db_hfatt << "' AND P8_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1000F SET P0_KEYHEADERFATT = '" << campo_hfatt << "', P0_KEYBODYFATT = '" << campo_bfatt << "' WHERE P0_KEYPRGINVIO = '" << db_prginv << "' AND P0_KEYHEADERFATT = '" << db_hfatt << "' AND P0_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1100F SET PA_KEYHEADERFATT = '" << campo_hfatt << "', PA_KEYBODYFATT = '" << campo_bfatt << "' WHERE PA_KEYPRGINVIO = '" << db_prginv << "' AND PA_KEYHEADERFATT = '" << db_hfatt << "' AND PA_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1200F SET PB_KEYHEADERFATT = '" << campo_hfatt << "', PB_KEYBODYFATT = '" << campo_bfatt << "' WHERE PB_KEYPRGINVIO = '" << db_prginv << "' AND PB_KEYHEADERFATT = '" << db_hfatt << "' AND PB_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1600F SET PF_KEYHEADERFATT = '" << campo_hfatt << "', PF_KEYBODYFATT = '" << campo_bfatt << "' WHERE PF_KEYPRGINVIO = '" << db_prginv << "' AND PF_KEYHEADERFATT = '" << db_hfatt << "' AND PF_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1700F SET PG_KEYHEADERFATT = '" << campo_hfatt << "', PG_KEYBODYFATT = '" << campo_bfatt << "' WHERE PG_KEYPRGINVIO = '" << db_prginv << "' AND PG_KEYHEADERFATT = '" << db_hfatt << "' AND PG_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1800F SET PI_KEYHEADERFATT = '" << campo_hfatt << "', PI_KEYBODYFATT = '" << campo_bfatt << "' WHERE PI_KEYPRGINVIO = '" << db_prginv << "' AND PI_KEYHEADERFATT = '" << db_hfatt << "' AND PI_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1900F SET PY_KEYHEADERFATT = '" << campo_hfatt << "', PY_KEYBODYFATT = '" << campo_bfatt << "' WHERE PY_KEYPRGINVIO = '" << db_prginv << "' AND PY_KEYHEADERFATT = '" << db_hfatt << "' AND PY_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2000F SET PJ_KEYHEADERFATT = '" << campo_hfatt << "', PJ_KEYBODYFATT = '" << campo_bfatt << "' WHERE PJ_KEYPRGINVIO = '" << db_prginv << "' AND PJ_KEYHEADERFATT = '" << db_hfatt << "' AND PJ_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2100F SET PK_KEYHEADERFATT = '" << campo_hfatt << "', PK_KEYBODYFATT = '" << campo_bfatt << "' WHERE PK_KEYPRGINVIO = '" << db_prginv << "' AND PK_KEYHEADERFATT = '" << db_hfatt << "' AND PK_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2200F SET PL_KEYHEADERFATT = '" << campo_hfatt << "', PL_KEYBODYFATT = '" << campo_bfatt << "' WHERE PL_KEYPRGINVIO = '" << db_prginv << "' AND PL_KEYHEADERFATT = '" << db_hfatt << "' AND PL_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2400F SET PN_KEYHEADERFATT = '" << campo_hfatt << "', PN_KEYBODYFATT = '" << campo_bfatt << "' WHERE PN_KEYPRGINVIO = '" << db_prginv << "' AND PN_KEYHEADERFATT = '" << db_hfatt << "' AND PN_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2500F SET PO_KEYHEADERFATT = '" << campo_hfatt << "', PO_KEYBODYFATT = '" << campo_bfatt << "' WHERE PO_KEYPRGINVIO = '" << db_prginv << "' AND PO_KEYHEADERFATT = '" << db_hfatt << "' AND PO_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2600F SET PP_KEYHEADERFATT = '" << campo_hfatt << "', PP_KEYBODYFATT = '" << campo_bfatt << "' WHERE PP_KEYPRGINVIO = '" << db_prginv << "' AND PP_KEYHEADERFATT = '" << db_hfatt << "' AND PP_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2700F SET PQ_KEYHEADERFATT = '" << campo_hfatt << "', PQ_KEYBODYFATT = '" << campo_bfatt << "' WHERE PQ_KEYPRGINVIO = '" << db_prginv << "' AND PQ_KEYHEADERFATT = '" << db_hfatt << "' AND PQ_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF3000F SET PT_KEYHEADERFATT = '" << campo_hfatt << "', PT_KEYBODYFATT = '" << campo_bfatt << "' WHERE PT_KEYPRGINVIO = '" << db_prginv << "' AND PT_KEYHEADERFATT = '" << db_hfatt << "' AND PT_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF3200F SET PU_KEYHEADERFATT = '" << campo_hfatt << "', PU_KEYBODYFATT = '" << campo_bfatt << "' WHERE PU_KEYPRGINVIO = '" << db_prginv << "' AND PU_KEYHEADERFATT = '" << db_hfatt << "' AND PU_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAFW300F SET PW_KEYHEADERFATT = '" << campo_hfatt << "', PW_KEYBODYFATT = '" << campo_bfatt << "' WHERE PW_KEYPRGINVIO = '" << db_prginv << "' AND PW_KEYHEADERFATT = '" << db_hfatt << "' AND PW_KEYBODYFATT = '" << db_bfatt << "'\n"; + + if(fp_db().sq_set_exec(query)) + { + msg_log.cut(0) << "Il documento " << campo_bfatt << " e' stato aggiornato correttamente\nChiave precedente: " << db_bfatt << " chiave nuova: " << campo_bfatt; + legno.log(0, msg_log); + updated++; + } + } + } + } + } + if (fp_db().sq_commit()) + { + msg_log.cut(0) << "Aggiornati " << updated << " documenti"; + legno.log(0, msg_log); + } + + legno.preview(); + force_reload_sheet(); +} + +void TPA_mask::export_paf() +{ + int ndocs = 0; + TLocalisamfile doc(LF_DOC); + static const int col_cod_sdi = sfield(F_DOCS).cid2index(S_CODSDI); + TString_array& sht = sfield(F_DOCS).rows_array(); + TDoc_fp elab; + //elab.set_cache_insert(true); + if (!sht.empty()) + { + TProgress_monitor pi(sht.items(), "Esportazione Fatture"); + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (!pi.add_status()) + break; + + if (riga->starts_with("X")) + { + const int anno = riga->get_int(sfield(F_DOCS).cid2index(S_ANNO)); + const long ndoc = riga->get_long(sfield(F_DOCS).cid2index(S_NDOC)); + const TFixed_string codnum(riga->get(sfield(F_DOCS).cid2index(S_CODNUM))); // lascio sapientemente per ultima la get di una stringa + const TDoc_key key(anno, codnum, ndoc); + + // Verifico che il codice sdi nello sheet sia lo stesso sulla testata del documento in caso contrario lo aggiorno + TRectype rec_doc = elab.key_to_doc(key); + if (rec_doc.read(doc) == NOERR) + { + if (rec_doc.get(DOC_TIPODOCSDI).compare(riga->get(col_cod_sdi)) != 0) + { + rec_doc.put(DOC_TIPODOCSDI, riga->get(col_cod_sdi)); + rec_doc.rewrite(doc); + } + + if (elab.doc_to_paf(key)) + ndocs++; + else + { + if (!yesno_box("L'ultima fattura non è stata esportata, continuare?")) + break; + } + } + } + } + } + if (elab.force_commit() <= 0) + error_box("Errore durante il cambiamento di stato finale, potrebbero esser rimaste delle fatture in Pronto"); + elab.show_log(); } bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) @@ -291,6 +498,10 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) if (e == se_query_add || e == se_query_del) return false; break; + case DLG_OK: + if (e == fe_button) + export_paf(); + break; case DLG_USER: if (e == fe_button && jolly > 0) { @@ -335,6 +546,13 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) if (e == fe_button) set_pronto(); } + break; + case DLG_PRINT: + { + if (e == fe_button) + connect_keys(); + } + break; default: break; } if((e == fe_modify || e >= se_enter) && jolly == 0) @@ -363,6 +581,20 @@ void TPA_mask::next_page(int p) TAutomask::next_page(p); } +bool TPA_mask::on_key(const KEY key) +{ + if (key == K_SHIFT + K_F12) + { + if (run_fp_psw_mask()) + { + _enable_chiave_fixer = true; + if (curr_page() > 0) + force_reload_sheet(); + } + } + return true; +} + bool TPA_mask::check_not_empty() { TSheet_field& sheet = sfield(F_DOCS); @@ -393,8 +625,8 @@ bool TPA_mask::check_full_fields() const bool TPA_mask::check_doc_filter(const TDocumentoEsteso& d) const { - const TString codnum = d.get(DOC_CODNUM); - const TString tipodoc = d.get(DOC_TIPODOC); + const TString& codnum = d.get(DOC_CODNUM); + const TString& tipodoc = d.get(DOC_TIPODOC); const char stato = d.stato(); const TTipo_documento& td = cached_tipodoc(d.get(DOC_TIPODOC)); // Mi precarico la tabella dei documenti scelti @@ -402,7 +634,7 @@ bool TPA_mask::check_doc_filter(const TDocumentoEsteso& d) const { if (codnum.compare(row->get(_codnum)) == 0 && // Codice numerazione tipodoc.compare(row->get(_tipodoc)) == 0 && // Tipo documento - td.reg_fisc().full() && // Regime fiscale + td.reg_fisc().full() && // Regime fiscale row->get_char(_dastato) <= stato && // Da stato row->get_char(_astato) >= stato) // A stato return true; @@ -442,7 +674,31 @@ void TPA_mask::set_err_paf() TPaf_record paf0100f("PAF0100F"); if (fdoc.read() == NOERR && chiave_paf(fdoc.curr(), hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt)) { - TString query = "UPDATE PAF0100F SET P1_GESTIONE = 'E' WHERE P1_KEYHEADERFATT = '"; query << hfatt << "' AND P1_KEYBODYFATT = '" << bfatt << "';"; + static TString query; + query.cut(0) << + "UPDATE PAF0100F SET P1_GESTIONE = 'E', P1_KEYPRGINVIO = 'DELETED' WHERE P1_KEYHEADERFATT = '" << hfatt << "' AND P1_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0200F SET P2_GESTIONE = 'E', P2_KEYPRGINVIO = 'DELETED' WHERE P2_KEYHEADERFATT = '" << hfatt << "' AND P2_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0400F SET P4_GESTIONE = 'E', P4_KEYPRGINVIO = 'DELETED' WHERE P4_KEYHEADERFATT = '" << hfatt << "' AND P4_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0700F SET P7_GESTIONE = 'E', P7_KEYPRGINVIO = 'DELETED' WHERE P7_KEYHEADERFATT = '" << hfatt << "' AND P7_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0800F SET P8_GESTIONE = 'E', P8_KEYPRGINVIO = 'DELETED' WHERE P8_KEYHEADERFATT = '" << hfatt << "' AND P8_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1000F SET P0_GESTIONE = 'E', P0_KEYPRGINVIO = 'DELETED' WHERE P0_KEYHEADERFATT = '" << hfatt << "' AND P0_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1100F SET PA_GESTIONE = 'E', PA_KEYPRGINVIO = 'DELETED' WHERE PA_KEYHEADERFATT = '" << hfatt << "' AND PA_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1200F SET PB_GESTIONE = 'E', PB_KEYPRGINVIO = 'DELETED' WHERE PB_KEYHEADERFATT = '" << hfatt << "' AND PB_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1600F SET PF_GESTIONE = 'E', PF_KEYPRGINVIO = 'DELETED' WHERE PF_KEYHEADERFATT = '" << hfatt << "' AND PF_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1700F SET PG_GESTIONE = 'E', PG_KEYPRGINVIO = 'DELETED' WHERE PG_KEYHEADERFATT = '" << hfatt << "' AND PG_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1800F SET PI_GESTIONE = 'E', PI_KEYPRGINVIO = 'DELETED' WHERE PI_KEYHEADERFATT = '" << hfatt << "' AND PI_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1900F SET PY_GESTIONE = 'E', PY_KEYPRGINVIO = 'DELETED' WHERE PY_KEYHEADERFATT = '" << hfatt << "' AND PY_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2000F SET PJ_GESTIONE = 'E', PJ_KEYPRGINVIO = 'DELETED' WHERE PJ_KEYHEADERFATT = '" << hfatt << "' AND PJ_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2100F SET PK_GESTIONE = 'E', PK_KEYPRGINVIO = 'DELETED' WHERE PK_KEYHEADERFATT = '" << hfatt << "' AND PK_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2200F SET PL_GESTIONE = 'E', PL_KEYPRGINVIO = 'DELETED' WHERE PL_KEYHEADERFATT = '" << hfatt << "' AND PL_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2400F SET PN_GESTIONE = 'E', PN_KEYPRGINVIO = 'DELETED' WHERE PN_KEYHEADERFATT = '" << hfatt << "' AND PN_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2500F SET PO_GESTIONE = 'E', PO_KEYPRGINVIO = 'DELETED' WHERE PO_KEYHEADERFATT = '" << hfatt << "' AND PO_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2600F SET PP_GESTIONE = 'E', PP_KEYPRGINVIO = 'DELETED' WHERE PP_KEYHEADERFATT = '" << hfatt << "' AND PP_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2700F SET PQ_GESTIONE = 'E', PQ_KEYPRGINVIO = 'DELETED' WHERE PQ_KEYHEADERFATT = '" << hfatt << "' AND PQ_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF3000F SET PT_GESTIONE = 'E', PT_KEYPRGINVIO = 'DELETED' WHERE PT_KEYHEADERFATT = '" << hfatt << "' AND PT_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF3200F SET PU_GESTIONE = 'E', PU_KEYPRGINVIO = 'DELETED' WHERE PU_KEYHEADERFATT = '" << hfatt << "' AND PU_KEYBODYFATT = '" << bfatt << "';\n" << + // PAFW3 non ha il flag di gestione + "UPDATE PAFW300F SET PW_KEYPRGINVIO = 'DELETED' WHERE PW_KEYHEADERFATT = '" << hfatt << "' AND PW_KEYBODYFATT = '" << bfatt << "';\n"; if(!fp_db().sq_set_exec(query)) { TString err = "Impossibile salvare la fattura "; err << anno << " " << codnum << " " << ndoc << "\nVerrà saltata."; @@ -459,13 +715,7 @@ void TPA_mask::set_err_paf() } fp_db().sq_commit(); } - - // Mi sposto nella prima pagina, setto il flag di dirty sul filtro e mi risposto - // Lo faccio perché eliminando la riga direttamente e chiamando la force_update() si crea un bug che cliccando sulla prima riga viene mostrata quella che c'era prima della eliminazione - TAutomask::next_page(0); - set_focus_field(F_DATAINI); - _filter_changed = true; - next_page(1); + force_reload_sheet(); } @@ -486,56 +736,7 @@ public: void TDoc2Paf::main_loop() { - int ndocs = 0; - TPA_mask mask; - TLocalisamfile doc(LF_DOC); - static const int col_cod_sdi = mask.sfield(F_DOCS).cid2index(S_CODSDI); - while (mask.run() == K_ENTER) - { - TString_array& sht = mask.sfield(F_DOCS).rows_array(); - TDoc_fp elab; - //elab.set_cache_insert(true); - if (!sht.empty()) - { - TProgress_monitor pi(sht.items(), "Esportazione Fatture"); - ndocs = 0; - FOR_EACH_ARRAY_ROW(sht, r, riga) - { - if (!pi.add_status(1)) - break; - - if (riga->starts_with("X")) - { - const int anno = riga->get_int(mask.sfield(F_DOCS).cid2index(S_ANNO)); - const long ndoc = riga->get_long(mask.sfield(F_DOCS).cid2index(S_NDOC)); - const TFixed_string codnum(riga->get(mask.sfield(F_DOCS).cid2index(S_CODNUM))); // lascio sapientemente per ultima la get di una stringa - const TDoc_key key(anno, codnum, ndoc); - - // Verifico che il codice sdi nello sheet sia lo stesso sulla testata del documento in caso contrario lo aggiorno - TRectype rec_doc = elab.key_to_doc(key); - if(rec_doc.read(doc) == NOERR) - { - if(rec_doc.get(DOC_TIPODOCSDI).compare(riga->get(col_cod_sdi)) != 0) - { - rec_doc.put(DOC_TIPODOCSDI, riga->get(col_cod_sdi)); - rec_doc.rewrite(doc); - } - - if (elab.doc_to_paf(key)) - ndocs++; - else - { - if (!yesno_box("L'ultima fattura non è stata esportata, continuare?")) - break; - } - } - } - } - } - if (elab.force_commit() <= 0) - error_box("Errore durante il cambiamento di stato finale, potrebbero esser rimaste delle fatture in Pronto"); - elab.show_log(); - } + while (TPA_mask().run() == K_ENTER) {} } bool TDoc2Paf::create() diff --git a/src/fp/fp0300a.uml b/src/fp/fp0300a.uml index e80b2cf22..0de0c2824 100644 --- a/src/fp/fp0300a.uml +++ b/src/fp/fp0300a.uml @@ -15,6 +15,12 @@ BEGIN FLAGS "D" END +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 1 "" + PICTURE 0 +END + BUTTON DLG_SAVEREC 2 2 BEGIN PROMPT 1 1 "Elimina" @@ -29,6 +35,13 @@ BEGIN FLAGS "D" END +BUTTON DLG_PRINT 2 2 +BEGIN + PROMPT 1 1 "Correggi chiavi" + PICTURE TOOL_SMILE + FLAGS "D" +END + #include ENDPAGE diff --git a/src/fp/fp1200.cpp b/src/fp/fp1200.cpp index 0c7a2766e..eba58207d 100644 --- a/src/fp/fp1200.cpp +++ b/src/fp/fp1200.cpp @@ -381,7 +381,7 @@ void TMancati_app::main_loop() const TString mail = row->get(mask.sfield(F_DOCS).cid2index(S_DOCMAIL)); bool accord = TString(row->get(mask.sfield(F_DOCS).cid2index(S_BYMAIL))) == "X"; if (row->starts_with("X") && (mail.blank() || !accord)) { - error_box("Attenzione: c'è almeno un cliente senza indirizzo email o senza il consenso per l'invio email."); + error_box("Attenzione: è presente almeno un cliente senza indirizzo email o senza il consenso per l'invio email."); break; } } diff --git a/src/fp/fplib.h b/src/fp/fplib.h index aa7ee9950..961de8fc1 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -16,6 +16,8 @@ #define SQL_FLD "sql/" #define MANCATA_SEND "S" // Se la mail di mancata consegna è già stata inviata P1_ERRINT è segnato con "S" +class TFPRiga_documento; + // Typedef per aiutare a capire cosa sono le chiavi typedef TString MCodice_riga; typedef TString MTipo_documento; @@ -78,6 +80,8 @@ enum { no_pdf = -1, pdf_ok = 0, no_alleg = -2}; // Ritorna la connessione al DB paf secondo i parametri impostati nel programma di configurazione SSimple_query& fp_db(); +// Lancia una maschera di password FP +bool run_fp_psw_mask(); // Controlla il livello di patch installato e aggiorna le tabelle se necessario bool check_tables(); // Compila il numero di documento per la scrittura sui paf @@ -196,7 +200,6 @@ private: TPaf_container _paf_container; int _count_r_conai; bool _nascondi_sconti_righe_fatt; - TFP_righe_custom _righe_custom; TFP_nota_piede_f _riga_npf; // Classe interna per gestire righe aggiuntive in riepilogo @@ -256,7 +259,7 @@ protected: bool add_row_art(long& riga_art, const TString& codice_tipo, const TString& codice_valore, TPaf_record& paf); bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf); const TString& converti_prezzo(const real& prezzo) const; - void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc); + void set_qta_prezzo(TPaf_record& paf1800f, TFPRiga_documento* rdoc) const; void add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const; bool add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva, const char* eiva, const real& imponibile = ZERO, const real& imposta = ZERO); bool add_cassa_previdenziale(TRiga_documento& rdoc); @@ -278,8 +281,8 @@ public: TRectype& key_to_doc(const TDoc_key& key); // Mostra il log a fine esecuzione bool show_log(); - const int commit(); - const int force_commit(); + int commit(); + int force_commit(); void set_cache_insert(const bool v) { _cache_insert = v; } @@ -309,6 +312,7 @@ public: const TString& get_body_mail(int idx = -1) const; const TString& get_npf(const char* tipodoc, int idx) const; const bool get_no_sconti_fatt() const; + bool get_no_export_pronto() const; // Get tipidoc per NotaPiedeFattura const TString get_npf_tipodoc(int indx) const; @@ -329,6 +333,8 @@ public: void set_check_not_block(bool not_block) const; void set_body_mail(const char* msg, int idx = -1) const; void set_no_sconti_fatt(const bool no_sconti_fatt) const; + void set_no_export_pronto(const bool no_export_pronto) const; + void set_npf(const char * tipodoc, const char* msg, int idx) const; void set_npf_tipodoc(const TString& tipodoc, int indx) const; @@ -393,4 +399,20 @@ public: TFp_mail_sender(const int anno, const long ndoc, const TFixed_string& codnum, const TFixed_string& tipodoc, const long codcf, TString mail, bool accord, TString ragsoc, bool sent) { set_doc(anno, ndoc, codnum, tipodoc, codcf, mail, accord, ragsoc, sent); } }; + +class TFPRiga_documento : public TRiga_documento +{ +public: + real prezzo(bool scontato, bool lordo, int ndec = AUTO_DECIMALS) const; + real importo(bool scontato, bool lordo, int ndec = AUTO_DECIMALS) const; + real quantita() const; + TString& quantita_string() const; + + TFPRiga_documento(const TRiga_documento& rd) : TRiga_documento(rd) {} +}; + +#define FOR_EACH_PHYSICAL_FPRDOC(__doc, __r, __rdoc) TFPRiga_documento* __rdoc=NULL; \ + TRecord_array& bodyof##__rdoc = (__doc).body(); \ + for (int __r = bodyof##__rdoc.first_row(); bodyof##__rdoc.exist(__r) && (__rdoc=&(TFPRiga_documento&)bodyof##__rdoc.row(__r))!=NULL; __r=bodyof##__rdoc.succ_row(__r)) + #endif // __FPLIB_H diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index b558f1787..6a9b57130 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -2,25 +2,23 @@ #include #include #include -#include #include #include -#include "text.h" #include #include #include #include #include "../fe/felib.h" -#include "../cg/cglib03.h" #include "../ve/velib04.h" #include #include #include #include #include -#include #include "../cg/cfban.h" -#include "modaut.h" +#include +#include + void set_connection(SSimple_query& s) { #ifdef DBG @@ -59,6 +57,31 @@ SSimple_query& fp_db() } return *db; } + +bool run_fp_psw_mask() +{ + static TMask* m; + // Cancello la maschera se esiste + delete m; + m = new TMask("Password", 1, 30, 5); + m->add_button_tool(DLG_OK, "~Conferma", TOOL_OK); + m->add_button_tool(DLG_CANCEL, "Annulla", TOOL_CANCEL); + m->add_string(101, 0, "Password ", 1, 1, 15, "*"); + m->field(101).check_type(CHECK_REQUIRED); + while (m->run() == K_ENTER) + { + if (m->get(101) == "sirioFATT99") // Hardcoded password are the best! + { + return true; + } + else + { + error_box("Password errata"); + } + } + return false; +} + string getline(ifstream& f) { string app; @@ -163,9 +186,9 @@ bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt) // Crea la coppia di chiavi per il db PAF a partire da un semplice record di testata documento bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt) { - TDocumento d(doc); - chiave_paf(d, hfatt, bfatt); - return hfatt.full(); + const TDocumento d(doc); + chiave_paf(d, hfatt, bfatt); + return hfatt.full(); } TString get_dest_sdi(const char tipocf, const long codcf) { @@ -359,7 +382,7 @@ const TString& TPaf_record::var2str(const TString& fldname, const TVariant& var) } return tmp; } -TString& TPaf_record::remove_string(bool id_riga) +TString& TPaf_record::remove_string(const bool id_riga) { TString& query = get_tmp_string().cut(0); query << "DELETE FROM " << _table << " WHERE "; @@ -873,7 +896,7 @@ bool TDoc_fp::check_initial(TDocumentoEsteso& doc) if(pag.cond_pag_sdi().empty()) { - msg.cut(0) << "Non è valorizzata la condizione di pagamento SDI (TP01, TP02, TP03) per la condizione di pagamento " << pag.code(); + msg.cut(0) << "Non e' valorizzata la condizione di pagamento SDI (TP01, TP02, TP03) per la condizione di pagamento " << pag.code(); log(1, msg); ok = false; } @@ -885,11 +908,10 @@ bool TDoc_fp::check_initial(TDocumentoEsteso& doc) if(cache().get("%CLR", key_class, "S12").empty()) { - msg.cut(0) << "Non è valorizzata la tipologia di pagamento SDI (MPXX) per la condizione di pagamento " << pag.code(); + msg.cut(0) << "Non e' valorizzata la tipologia di pagamento SDI (MPXX) per la condizione di pagamento " << pag.code(); log(1, msg); ok = false; } - } return ok; @@ -905,7 +927,7 @@ bool TDoc_fp::check_row(const TRiga_documento& rdoc) const TSpesa_prest& spesa = rdoc.spesa(); if(spesa.is_percentuale() && spesa.perc().is_zero()) { - msg.cut(0) << "É corretto che per la spesa " << spesa.codice() << " la percentuale sia zero?"; + msg.cut(0) << "E' corretto che per la spesa " << spesa.codice() << " la percentuale sia zero?"; log(1, msg); } } @@ -1062,14 +1084,33 @@ bool TDoc_fp::show_log() return true; } -const int TDoc_fp::commit() +int TDoc_fp::commit() { int r = 0; if (_to_commit) { - if(fp_db().sq_set_exec("UPDATE PAF0100F SET P1_GESTIONE = 'P' WHERE P1_GESTIONE = 'D'") && fp_db().sq_commit()) + // Controllo stato diagnosticato + if (!fp_settings().get_no_export_pronto()) { - r = 1; + if (fp_db().sq_set_exec("UPDATE PAF0100F SET P1_GESTIONE = 'P' WHERE P1_GESTIONE = 'D'")) + { + r += 1; + log(2, "Le fatture sono state esportate correttamente in stato pronto"); + } + else + { + r = -1; + log(2, fp_db().sq_get_token_text_error(1)); + } + } + else + { + log(2, "Le fatture sono state esportate in stato diagnosticato"); + } + + if(r >= 0 && fp_db().sq_commit()) + { + r += 2; } else { @@ -1082,7 +1123,7 @@ const int TDoc_fp::commit() return r; } -const int TDoc_fp::force_commit() +int TDoc_fp::force_commit() { _to_commit = true; return commit(); @@ -1162,55 +1203,29 @@ const TString& TDoc_fp::converti_prezzo(const real& prezzo) const ret << prezzo; return ret; } -void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) + +void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TFPRiga_documento* rdoc) const { // Setto l'unità di misura paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); - const TString& field_qta = _righe_custom.get_qta(rdoc->tipo().codice(), rdoc->doc().tipo().codice()); - const TString& field_prezzo = _righe_custom.get_prezzo(rdoc->tipo().codice(), rdoc->doc().tipo().codice()); - const TString& field_imponibile = _righe_custom.get_imponibile(rdoc->tipo().codice(), rdoc->doc().tipo().codice()); - - const bool custom_prezzo = field_prezzo.full(); - - real qta = rdoc->get_real(field_qta); + const real qta = rdoc->quantita(); // Prendendo la stringa non ho problemi in scrittura della query, a volte accadono cose stupide - const TString& qta_string = rdoc->get(field_qta); - real prezzo_unit; - real prezzo_tot; - if (qta >= ZERO) - { - if (qta == ZERO) - qta = UNO; - paf1800f.set("PI_QUANTITA", qta_string); - if(custom_prezzo) - { - prezzo_unit = rdoc->get_real(field_prezzo); - prezzo_tot = rdoc->get_real(field_imponibile); - } - else - { - prezzo_unit = rdoc->prezzo(_nascondi_sconti_righe_fatt, false, 5); - prezzo_tot = rdoc->importo(true, false); - } - } - else if(qta < ZERO) + TString& qta_string = rdoc->quantita_string(); + real prezzo_unit = rdoc->prezzo(_nascondi_sconti_righe_fatt, false, 5); + real prezzo_tot = rdoc->importo(true, false); + + if(qta < ZERO) { // Metto la qualità senza il segno - paf1800f.set("PI_QUANTITA", qta_string.mid(1)); - // E i prezzi in negativo, perchè l'importo non ha lo stesso segno del prezzo? - if (custom_prezzo) - { - prezzo_unit = -abs(rdoc->get_real(field_prezzo)); - prezzo_tot = -abs(rdoc->get_real(field_imponibile)); - } - else - { - prezzo_unit = -abs(rdoc->prezzo(_nascondi_sconti_righe_fatt, false, 5)); - prezzo_tot = -abs(rdoc->importo(true, false)); - } + qta_string = qta_string.mid(1); + + // E i prezzi in negativo + prezzo_unit = -abs(prezzo_unit); + prezzo_tot = -abs(prezzo_tot); } // Salvo tutto + paf1800f.set("PI_QUANTITA", qta_string); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(prezzo_unit)); paf1800f.set("PI_PRZTOTALE", converti_prezzo(prezzo_tot)); } @@ -1244,7 +1259,7 @@ void TDoc_fp::add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, paf0700f.set("P7_TIPORITENUTA", _rec_clifo.get_char(CLI_TIPOPERS) == 'F' ? "RT01" : "RT02"); TString doc_imponibile = doc.imponibile().string(); - const real imponibile = calc_ritenuta(doc); + const real imponibile = doc.ritenute(); paf0700f.set("P7_IMPORTORIT", converti_prezzo(imponibile * sp.perc() / CENTO)); paf0700f.set("P7_ALIQUOTARIT", sp.perc()); @@ -1341,7 +1356,7 @@ bool TDoc_fp::export_paf0100f() TPaf_record& paf0100f = _paf_container.get_paf("PAF0100F"); paf0100f.set("P1_TRASMITTPAESE", _paese); paf0100f.set("P1_TRASMITTCOD", _cofi); - paf0100f.set("P1_FMTTRASMISS", _privato ? "FPR12" : "FPA12"); // SDI11 si usa dal 2015 per lo split payment (prima era SDI10) + paf0100f.set("P1_FMTTRASMISS", _privato ? "FPR12" : "FPA12"); paf0100f.set("P1_CODDEST", _coddest); TString80 tel; @@ -1467,8 +1482,8 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) { paf0400f.set("P4_ANADENOM", cliente.ragione_sociale()); } + // DatiSede - paf0400f.set("P4_SEDEIND", cliente.via_residenza()); paf0400f.set("P4_SEDENRCIVICO", cliente.civico_residenza().left(8)); paf0400f.set("P4_SEDECOMUNE", cliente.comune_residenza()); @@ -1617,7 +1632,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) long riga = 1; - FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + FOR_EACH_PHYSICAL_FPRDOC(doc, r, rdoc) { // Controllo la riga if (check_row(*rdoc) && !fp_settings().get_check_not_block()) diff --git a/src/fp/fplib02.cpp b/src/fp/fplib02.cpp index 2bea45d76..6f3f4f30d 100644 --- a/src/fp/fplib02.cpp +++ b/src/fp/fplib02.cpp @@ -6,23 +6,24 @@ -#define FP_IP "ip" -#define FP_DB "db" -#define FP_USR "usr" -#define FP_PSW "psw" -#define FP_FLD_DEST "flddest" -#define FP_FLD_USR_DEST "fldusrdest" -#define FP_COFI_TRAS "cofitras" -#define FP_GEST_ALLEG "gestioneallegati" -#define FP_ALLEG_FAT "allegafatt" -#define FP_ESP_PRI "esppri" -#define FP_ESP_EST "espest" -#define FP_ESP_EST_COD "espestcod" -#define FP_F8 "f8" -#define FP_CHECK_NOT_BLOCK "checknotblock" -#define FP_MAIL "mail" -#define FP_NOTA_PIEDE_F "npf" // Nota piede fattura -#define FP_CHECK_NO_SCONTI_FATT "noscontifatt" +#define FP_IP "ip" +#define FP_DB "db" +#define FP_USR "usr" +#define FP_PSW "psw" +#define FP_FLD_DEST "flddest" +#define FP_FLD_USR_DEST "fldusrdest" +#define FP_COFI_TRAS "cofitras" +#define FP_GEST_ALLEG "gestioneallegati" +#define FP_ALLEG_FAT "allegafatt" +#define FP_ESP_PRI "esppri" +#define FP_ESP_EST "espest" +#define FP_ESP_EST_COD "espestcod" +#define FP_F8 "f8" +#define FP_CHECK_NOT_BLOCK "checknotblock" +#define FP_MAIL "mail" +#define FP_NOTA_PIEDE_F "npf" // Nota piede fattura +#define FP_CHECK_NO_SCONTI_FATT "noscontifatt" +#define FP_CHECK_NO_EXPORT_PRONTO "noexportpronto" // Sheet fp0300 #define FP_SLD_COD "SLD" @@ -143,6 +144,11 @@ const bool TFP_settings::get_no_sconti_fatt() const return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_SCONTI_FATT, false); } +bool TFP_settings::get_no_export_pronto() const +{ + return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_EXPORT_PRONTO, false); +} + void TFP_settings::set_db_indirizzo(const TString& ind) const { ini_set_string(FILE_CONFIG, FILE_SECTION, FP_IP, ind); @@ -230,6 +236,11 @@ void TFP_settings::set_no_sconti_fatt(const bool no_sconti_fatt) const ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_SCONTI_FATT, no_sconti_fatt); } +void TFP_settings::set_no_export_pronto(const bool no_export_pronto) const +{ + ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_EXPORT_PRONTO, no_export_pronto); +} + void TFP_settings::remove_para_ini(int idx) { ini_remove(FILE_CONFIG, FILE_SECTION, FP_MAIL, idx); diff --git a/src/fp/fplib03.cpp b/src/fp/fplib03.cpp index c71f902ef..1e4d320b6 100644 --- a/src/fp/fplib03.cpp +++ b/src/fp/fplib03.cpp @@ -1,9 +1,5 @@ #include "fplib.h" #include "execp.h" -#include -#include -#include "modaut.h" -#include "fp1200a.h" class TExternal_app;