diff --git a/cd/test/cg0704.txt b/cd/test/cg0704.txt new file mode 100644 index 000000000..d962170ff --- /dev/null +++ b/cd/test/cg0704.txt @@ -0,0 +1,8 @@ +cg4.exe + +Modificato salvataggio percentuale pro-rata (diana2000) per sistemare si puo azzerare il campo R12 della tabella PLM del mese in oggetto (è 1999) o ricalcolare la liquidazione +Va provato anche con un pro-rata per verificare che salvi la % giusta. + +Modificato prospetto pro-rata annuale. + +Modificato il calcolo interessi per i trimestrali. Ora anche a dicembre (Pastore). \ No newline at end of file diff --git a/cd/test/cg0704a.ini b/cd/test/cg0704a.ini new file mode 100644 index 000000000..387824f2f --- /dev/null +++ b/cd/test/cg0704a.ini @@ -0,0 +1,94 @@ +[Main] +Demo=0 + +[cg1] +Edit_23 = cg2 -0 +File(39) = cg4.exe|X +Patch = 704 +Versione = 21511200 + +[cg99] +Kill(0) = batbmsp.msk|x +Kill(1) = bastcve.rep|x +Kill(2) = batbins.msk|x +Kill(3) = bastscc.rep|x +Kill(4) = batbcam.msk|x +Kill(5) = batbpdb.msk|x +Kill(6) = bastver.msk|x +Kill(7) = batbcco.msk|x +Kill(8) = batbesc.msk|x +Kill(9) = batbdpn.msk|x +Kill(10) = bastndo.msk|x +Kill(11) = bastesc.msk|x +Kill(12) = batbndo.msk|x +Kill(13) = batbind.msk|x +Kill(14) = bastmsp.msk|x +Kill(15) = bastreg.rep|x +Kill(16) = batbleg.msk|x +Kill(17) = bastpor.msk|x +Kill(18) = batbpor.msk|x +Kill(19) = batbcfi.msk|x +Kill(20) = bastcco.msk|x +Kill(21) = bastmsp.rep|x +Kill(22) = batbtit.msk|x +Kill(23) = batbcve.msk|x +Kill(24) = batbivd.msk|x +Kill(25) = batbscc.msk|x +Kill(26) = bastcfi.rep|x +Kill(27) = batbarb.msk|x +Kill(28) = bastver.rep|x +Kill(29) = bastleg.msk|x +Kill(30) = bastzon.rep|x +Kill(31) = bastleg.rep|x +Kill(32) = bastcam.rep|x +Kill(33) = batblia.msk|x +Kill(34) = batbzon.msk|x +Kill(35) = bastvet.rep|x +Kill(36) = bastdpn.msk|x +Kill(37) = bastivd.msk|x +Kill(38) = bastarb.rep|x +Kill(39) = bastcam.msk|x +Kill(40) = bastntb.msk|x +Kill(41) = bastivd.rep|x +Kill(42) = bastdpn.rep|x +Kill(43) = bastpdb.msk|x +Kill(44) = batbinl.msk|x +Kill(45) = bastesc.rep|x +Kill(46) = bastreg.msk|x +Kill(47) = batbreg.msk|x +Kill(48) = bastzon.msk|x +Kill(49) = bastarb.msk|x +Kill(50) = batblia.msk|x +Kill(51) = cgtbcon.msk|x +Kill(52) = batbnot.msk|x +Kill(53) = batbdel.msk|x +Kill(54) = batbvet.msk|x +Kill(55) = batbtra.msk|x +Kill(56) = bastnot.rep|x +Kill(57) = bastpdb.rep|x +Kill(58) = bastscc.msk|x +Kill(59) = bastcco.rep|x +Kill(60) = batbntb.msk|x +Kill(61) = bastvet.msk|x +Kill(62) = batbver.msk|x +Kill(63) = bastcfi.msk|x +Kill(64) = batblbu.msk|x +Kill(65) = bastntb.rep|x +Kill(66) = bastcve.msk|x +Kill(67) = bastndo.rep|x +Kill(68) = bastnot.msk|x +Kill(69) = bastpor.rep|x + +[cg] +Data = 20-02-2019 +Descrizione = Contabilita' Generale +Dischi = 1 +Moduli = ba +OEM = +Patch = 704 +PostProcess = bainst -0 CG +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/cg0704a1.zip b/cd/test/cg0704a1.zip new file mode 100644 index 000000000..14865bde8 Binary files /dev/null and b/cd/test/cg0704a1.zip differ diff --git a/cd/test/fp0706.txt b/cd/test/fp0706.txt new file mode 100644 index 000000000..e80b0ae29 --- /dev/null +++ b/cd/test/fp0706.txt @@ -0,0 +1,7 @@ +fp0.exe +fp0100a.msk + +- Aggiunto piccolo controllo preventivo durante l'esportazione degli XML +- Aggiunto flag per non rendere il controllo bloccante +- Sistemata banca di appoggio +- Aggiunta gestione casse professionali \ No newline at end of file diff --git a/cd/test/fp0706a.ini b/cd/test/fp0706a.ini new file mode 100644 index 000000000..a78e51341 --- /dev/null +++ b/cd/test/fp0706a.ini @@ -0,0 +1,20 @@ +[Main] +Demo=0 + +[fp1] +File(0) = fp0.exe|X +File(1) = fp0100a.msk|X +Patch = 0706 +Versione = 21511200 + +[fp] +Data = 21-02-2019 +Descrizione = Fattura Elettronica +Dischi = 1 +Moduli = cg,ve +OEM = +Patch = 706 +PostProcess = +PreProcess = +Versione = 21511200 + diff --git a/cd/test/fp0706a1.zip b/cd/test/fp0706a1.zip new file mode 100644 index 000000000..33cac6d70 Binary files /dev/null and b/cd/test/fp0706a1.zip differ diff --git a/cd/test/fp0708.txt b/cd/test/fp0708.txt new file mode 100644 index 000000000..4b195fd18 --- /dev/null +++ b/cd/test/fp0708.txt @@ -0,0 +1,3 @@ +fp0.exe +fp0100a.msk +fp0400a.msk diff --git a/cd/test/fp0708a.ini b/cd/test/fp0708a.ini new file mode 100644 index 000000000..5adcbe396 --- /dev/null +++ b/cd/test/fp0708a.ini @@ -0,0 +1,21 @@ +[Main] +Demo=0 + +[fp1] +File(0) = fp0.exe|X +File(1) = fp0100a.msk|X +File(4) = fp0400a.msk|X +Patch = 0708 +Versione = 21511200 + +[fp] +Data = 22-02-2019 +Descrizione = Fattura Elettronica +Dischi = 1 +Moduli = cg,ve +OEM = +Patch = 708 +PostProcess = +PreProcess = +Versione = 21511200 + diff --git a/cd/test/fp0708a1.zip b/cd/test/fp0708a1.zip new file mode 100644 index 000000000..d65bbe751 Binary files /dev/null and b/cd/test/fp0708a1.zip differ diff --git a/src/fp/fp0100.cpp b/src/fp/fp0100.cpp index f20467e49..00c0e2fa9 100644 --- a/src/fp/fp0100.cpp +++ b/src/fp/fp0100.cpp @@ -44,6 +44,7 @@ void TParametri_mask::save_all() const fp_settings().set_gest_alleg(get_bool(F_ESPORTAALLEG)); fp_settings().set_allega_fat(get_bool(F_ESPORTADOC)); fp_settings().set_f8(get_bool(F_F8)); + fp_settings().set_check_not_block(get_bool(F_CHECK_NOT_BLOCK)); TFP_righe_custom().save_sheet(sfield(F_FORMPERS)); } @@ -59,6 +60,7 @@ void TParametri_mask::load_all() set(F_ESPORTAALLEG, fp_settings().get_gest_alleg()); set(F_ESPORTADOC, fp_settings().get_allega_fat()); set(F_F8, fp_settings().is_f8()); + set(F_CHECK_NOT_BLOCK, fp_settings().get_check_not_block()); TFP_righe_custom().load_sheet(sfield(F_FORMPERS)); } diff --git a/src/fp/fp0100a.h b/src/fp/fp0100a.h index c6f9d6b0d..d7508bfb6 100644 --- a/src/fp/fp0100a.h +++ b/src/fp/fp0100a.h @@ -1,24 +1,25 @@ -#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_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_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 \ No newline at end of file +#define S_TIPODOC 101 +#define S_TIPORIGA 102 +#define S_QTA 103 +#define S_PREZZO 104 +#define S_IMPONIBILE 105 \ No newline at end of file diff --git a/src/fp/fp0100a.uml b/src/fp/fp0100a.uml index bb14396e5..0d3bdfb50 100644 --- a/src/fp/fp0100a.uml +++ b/src/fp/fp0100a.uml @@ -89,6 +89,32 @@ END ENDPAGE +PAGE "Configurazione (2) " 0 2 0 0 + +SPREADSHEET F_FORMPERS 60 6 +BEGIN + PROMPT 1 1 "Personalizzazioni calcolo tipi righe " + ITEM "Tipo\nDoc@4" + ITEM "Tipo\nRiga@4" + ITEM "Qta" + ITEM "Prezzo" + ITEM "Imponibile" +END + + +GROUPBOX DLG_NULL 78 2 +BEGIN + PROMPT 1 8 "@BControlli preventivi" +END + +BOOLEAN F_CHECK_NOT_BLOCK +BEGIN + PROMPT 2 11 "Rendi controlli XML non bloccanti" +END + + + +ENDPAGE PAGE "Assistenza FP" 0 2 0 0 @@ -118,19 +144,6 @@ END ENDPAGE -PAGE "Formule Pers " 0 2 0 0 - -SPREADSHEET F_FORMPERS 60 6 -BEGIN - PROMPT 1 1 "Personalizzazioni calcolo tipi righe " - ITEM "Tipo\nDoc@4" - ITEM "Tipo\nRiga@4" - ITEM "Qta" - ITEM "Prezzo" - ITEM "Imponibile" -END - -ENDPAGE ENDMASK PAGE "Elementi spredsheet" 0 2 0 0 @@ -185,7 +198,6 @@ BEGIN OUTPUT S_IMPONIBILE CODTAB END - ENDPAGE TOOLBAR "Riga" 0 0 0 2 diff --git a/src/fp/fp0300.cpp b/src/fp/fp0300.cpp index 7cb9b0b89..404e8ff83 100644 --- a/src/fp/fp0300.cpp +++ b/src/fp/fp0300.cpp @@ -214,7 +214,7 @@ void TPA_mask::fill() row.add(rec.get("20." CLI_RAGSOC).as_string()); TString rif = get_dest_sdi(rec.get(CFV_TIPOCF).as_string()[0], rec.get(CFV_CODCF).as_int()); - // Se è ancora vuoto potrebbe essere estero + // Se è ancora vuoto potrebbe essere estero if(rif.empty()) { // Segno la riga errata @@ -254,7 +254,7 @@ void TPA_mask::fill() docs.show(); if (fat_no_cod > 0) - warning_box("Sono state trovate una o più fatture senza codice destinatario nè pec"); + warning_box("Sono state trovate una o più fatture senza codice destinatario né pec"); } void TPA_mask::set_filter_changed() @@ -369,7 +369,7 @@ bool TPA_mask::check_not_empty() TString msg; if (sheet.empty()) - msg = "La tabella dei movimenti è vuota, vuoi caricarla con i filtri selezionati?"; + msg = "La tabella dei movimenti è vuota, vuoi caricarla con i filtri selezionati?"; else if (_filter_changed) msg = "I filtri sono stati cambiati, vuoi ricaricare la tabella con i nuovi filtri selezionati?"; @@ -445,14 +445,14 @@ void TPA_mask::set_err_paf() TString query = "UPDATE PAF0100F SET P1_GESTIONE = 'E' WHERE P1_KEYHEADERFATT = '"; query << hfatt << "' AND P1_KEYBODYFATT = '" << bfatt << "';"; if(!fp_db().sq_set_exec(query)) { - TString err = "Impossibile salvare la fattura "; err << anno << " " << codnum << " " << ndoc << "\nVerrà saltata."; + TString err = "Impossibile salvare la fattura "; err << anno << " " << codnum << " " << ndoc << "\nVerrà saltata."; error_box(err); } } else { - TString err = "Impossibile trovare la fattura "; err << anno << " " << codnum << " " << ndoc << "\nVerrà saltata."; + TString err = "Impossibile trovare la fattura "; err << anno << " " << codnum << " " << ndoc << "\nVerrà saltata."; error_box(err); } } @@ -461,7 +461,7 @@ void TPA_mask::set_err_paf() } // 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 + // 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; @@ -525,7 +525,7 @@ void TDoc2Paf::main_loop() ndocs++; else { - if (!yesno_box("L'ultima fattura non è stata esportata, continuare?")) + if (!yesno_box("L'ultima fattura non è stata esportata, continuare?")) break; } } diff --git a/src/fp/fp0400.cpp b/src/fp/fp0400.cpp index f2ccd04a5..cf07ef122 100644 --- a/src/fp/fp0400.cpp +++ b/src/fp/fp0400.cpp @@ -10,14 +10,16 @@ #include "fp0400a.h" #include "fplib.h" #include "sheet.h" +#include "execp.h" +#include "dongle.h" enum { - no_cf = -14, // Non trovato con cod.fisc. (se non ho nemmeno la p.iva) + no_cf = -14, // Non trovato con cod. fisc. (se non ho nemmeno la p.iva) no_match_cf = -15, // Trovato forn. ma il cod. fisc non corrisponde - no_forn = -5, // Non trovato forn.con p.iva + no_forn = -5, // Non trovato forn. con p.iva err_match_db = -3, // Salvato in db ma non corrisponde a un fornitore - saved_db = 0, // Salvato già in db FPPRO + saved_db = 0, // Salvato già in db FPPRO found_piva = 2, // Lo trovo con p.iva found_cf = 4, // Non ho p.iva lo trovo con cod.fisc }; @@ -29,6 +31,10 @@ protected: void set_filter_changed(); void select_all(int sheet_field); + // Tasto nuovo: apre nuovo fornitore valorizzando già i dati dalla fattura + void new_forn(); + // Tasto aggiorna: aggiorna cliente che non corrisponde. + void aggiorna_forn(); bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; void next_page(int p) override; // Elenco dei protocolli selezionati @@ -36,15 +42,17 @@ protected: void fill(); static int find_fornitore(TLocalisamfile& clifo); static void add_row_err_forn(int forn_code, TSheet_field& sf_err, TString& denom); - static void aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TSheet_field& sf_err); - // Aggiunge i protocolli che sono già presenti per le fatture nel db alla tabellina per il filtro + void aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TSheet_field& sf_err); + // Aggiunge i protocolli che sono già presenti per le fatture nel db alla tabellina per il filtro void aggiungi_prot() const; void init(); void load_all_fields(); + TToken_string _forn_code; + TToken_string _list_fatt_err; bool _filter_changed; - void salva_for(); + void salva_for() const; public: void save_all_fields() const; @@ -52,6 +60,10 @@ public: TPassive_mask() : TAutomask("fp0400a"), _filter_changed(true) { load_all_fields(); + _forn_code = ""; + _forn_code.separator('|'); + _list_fatt_err = ""; + _list_fatt_err.separator('|'); } }; @@ -107,7 +119,8 @@ void TPassive_mask::fill() "ORDER BY PZ_ANNOPROT DESC, PZ_TIPOPROT ASC, PZ_NUMPROT DESC"; fp_db().sq_set_exec(query, false); - + _forn_code = ""; + _list_fatt_err = ""; while(fp_db().sq_next()) { aggiungi_riga(clifo, sf, sf_err); @@ -133,7 +146,7 @@ void TPassive_mask::elenco_prots_sel(TString& string) const elenco.add(row->get()); } - // Creo una stringa da aggiungere alla query per la ricerca col codice protocollo, così fatta: + // Creo una stringa da aggiungere alla query per la ricerca col codice protocollo, così fatta: // " AND PZ_TIPOPROT IN ('a', 'b', 'c')". (con elenco avente "a", "b" e "c" come stringhe) if (elenco.items() > 0) { @@ -175,6 +188,11 @@ void TPassive_mask::aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TShee // Dopo aver fatto le ricerche se lo trovo lo segno e lo aggiungo, se no coloro la cella forn_code = find_fornitore(clifo); + TString forn_str; forn_str << forn_code; + TString nr_row; nr_row << sf.items(); + _forn_code.add(forn_str); + + _list_fatt_err.add(nr_row); if (forn_code == 0) row.add("X"); else row.add(""); @@ -226,20 +244,20 @@ void TPassive_mask::aggiungi_prot() const void TPassive_mask::add_row_err_forn(int forn_code, TSheet_field& sf_err, TString& denom) { TToken_string& row_err = sf_err.row(-1); - row_err.add(fp_db().sq_get("COD_PAESE"), 0); + row_err.add(fp_db().sq_get("COD_PAESE"), 1); row_err.add(fp_db().sq_get("P_IVA")); row_err.add(fp_db().sq_get("COD_FISC")); row_err.add(denom); switch (forn_code){ case err_match_db: - row_err.add("Salvato in database ma non corrisponde a un fornitore codificato."); + row_err.add("Salvato in database ma non corrisponde a un fornitore codificato. (Nuovo fornitore disabilitato)"); break; case no_forn: row_err.add("Non trovato fornitore per la P.IVA."); break; case no_match_cf: - row_err.add("Trovato fornitore ma il codice fiscale non corrisponde."); + row_err.add("Trovato fornitore ma il codice fiscale non corrisponde. Aggiornare?"); break; case no_cf: row_err.add("Fornitore senza P. IVA, non trovato il codice fiscale"); @@ -258,15 +276,15 @@ int TPassive_mask::find_fornitore(TLocalisamfile& clifo) const TString fppro_tipocf = fp_db().sq_get("TIPO_CF"); TString fppro_codcf = fp_db().sq_get("COD_CLIFOR"); - // Cerco se il fornitore è presente in Campo + // Cerco se il fornitore è presente in Campo int found_clifo = -1; if (fppro_codcf == "17") bool simo = true; TString piva; - // Leggo dall FPPRO se è già stato salvato il fornitore - // Se è già salvato nell FPPRO ricerco in Campo col codice fornitore (chiave 1) + // Leggo dall FPPRO se è già stato salvato il fornitore + // Se è già salvato nell FPPRO ricerco in Campo col codice fornitore (chiave 1) if (fppro_tipocf == "F" && !fppro_codcf.blank()) { clifo.setkey(1); @@ -274,7 +292,7 @@ int TPassive_mask::find_fornitore(TLocalisamfile& clifo) // Se trovo dall FPPRO setto a 0 clifo.read() == NOERR ? found_clifo = 0 : found_clifo = -3; } - else if (paa_codpaese.full() && (piva = paa_piva).full()) // Se non c'è nell FPPRO ricerco con chiave 5 + else if (paa_codpaese.full() && (piva = paa_piva).full()) // Se non c'è nell FPPRO ricerco con chiave 5 { if (piva == "01903590154") bool simo = true; @@ -289,10 +307,10 @@ int TPassive_mask::find_fornitore(TLocalisamfile& clifo) clifo.put(CLI_STATOPAIV, ""); clifo.read() == NOERR ? found_clifo = 2 : found_clifo = -5; // Se trovo con partita iva setto a 2 } - // Se trovo con p.iva controllo il cod. fisc. e, se c'è da db e se c'è in clienti-fornitori, altrimenti vado avanti + // Se trovo con p.iva controllo il cod. fisc. e, se c'è da db e se c'è in clienti-fornitori, altrimenti vado avanti if (found_clifo == 2 && paa_codfisc.full() && clifo.get(CLI_COFI).full()) { - if (clifo.get(CLI_COFI) == paa_codfisc) // Controllo che il cod fisc (se c'è) corrisponda + if (clifo.get(CLI_COFI) == paa_codfisc) // Controllo che il cod fisc (se c'è) corrisponda found_clifo = 2; else found_clifo = -15; @@ -333,7 +351,7 @@ void TPassive_mask::select_all(int sheet_field) } } -void TPassive_mask::salva_for() +void TPassive_mask::salva_for() const { if(fp_db().sq_is_connect()) { @@ -374,6 +392,97 @@ void TPassive_mask::salva_for() } } +void TPassive_mask::new_forn() +{ + TSheet_field& sf = sfield(F_ERR); + TString newf = "fpnewf"; + FOR_EACH_SHEET_ROW(sf, nr, row) + { + int cod_forn = _forn_code.get_int(nr); // Prendo codice di errore associazione fornitore + + int n_row_elenco = _list_fatt_err.get_int(nr); // Prendo che numero di riga a cui mi riferisco in fatture + TSheet_field& f_docs = sfield(F_DOCS); // Prendo SheetField da elenco fatture + TToken_string& row_elenco_fatt = f_docs.row(n_row_elenco); // Prendo riga dall'elenco delle fatture + TToken_string keys(row_elenco_fatt.get(f_docs.cid2index(S_PROKEY)), ';'); // Dalla riga leggo la chiave del db + + if (row->starts_with("X") && (cod_forn == no_forn || cod_forn == no_match_cf || cod_forn == no_cf)) + { + TString query; query << "SELECT PU_PEC AS PEC\n" << + "FROM PAA3200F\n" << + "WHERE PU_KEYPRGINVIO = '" << keys.get(); + query << "' AND PU_KEYHEADERFATT = '" << keys.get(); + query << "' AND PU_KEYBODYFATT = '" << keys.get() << "'"; + fp_db().sq_set_exec(query); + TString pec = fp_db().sq_get("PEC"); + + TString num; num.format("%04d", nr); + TFilename newf_ini; + TString temp_path = newf_ini.tempdir(); + newf_ini.tempdir() << "\\" << newf << num << ".ini"; + TConfig forn_conf(newf_ini, "Transaction"); + + + forn_conf.set("Action", "INSERT"); + + forn_conf.set_paragraph("20"); + forn_conf.set("TIPOCF", "F"); + forn_conf.set("COFI", row->get(sf.cid2index(S_CODFIERR))); + forn_conf.set("PAIV", row->get(sf.cid2index(S_PIVAERR))); + forn_conf.set("PEC", pec); + forn_conf.set("RAGSOC", row->get(sf.cid2index(S_RAGSERR))); + forn_conf.set("STATOPAIV", row_elenco_fatt.get(sf.cid2index(S_STATOPAIV))); + + forn_conf.set_paragraph("17"); + forn_conf.set("TIPOCF", "F"); + forn_conf.set("RAGGOR", "O"); + forn_conf.set("PADESTIN", row_elenco_fatt.get(sf.cid2index(S_CODSDI))); + + TExternal_app app(TString("cg0 -1 -i") << temp_path << "\\" << newf << "*" << ".ini" << " /u" << user()); + app.run(); + row->add("", 0); + } + } + + sf.force_update(); +} + +void TPassive_mask::aggiorna_forn() +{ + TSheet_field& sf = sfield(F_ERR); + TString newf = "fpaggf"; + FOR_EACH_SHEET_ROW(sf, nr, row) + { + int cod_forn = _forn_code.get_int(nr); // Prendo codice di errore associazione fornitore + + int n_row_elenco = _list_fatt_err.get_int(nr); // Prendo che numero di riga a cui mi riferisco in fatture + TSheet_field& f_docs = sfield(F_DOCS); // Prendo SheetField da elenco fatture + TToken_string& row_elenco_fatt = f_docs.row(n_row_elenco); // Prendo riga dall'elenco delle fatture + + if (row->starts_with("X") && cod_forn == no_match_cf) + { + TString num; num.format("%04d", nr); + TFilename newf_ini; + TString temp_path = newf_ini.tempdir(); + newf_ini.tempdir() << "\\" << newf << num << ".ini"; + TConfig forn_conf(newf_ini, "Transaction"); + + forn_conf.set("Action", "MODIFY"); + + forn_conf.set_paragraph("20"); + forn_conf.set("TIPOCF", "F"); + forn_conf.set("COFI", row->get(sf.cid2index(S_CODFIERR))); + forn_conf.set("CODCF", row_elenco_fatt.get(sf.cid2index(S_FORNITORE))); + + TExternal_app app(TString("cg0 -1 -i") << temp_path << "\\" << newf << "*" << ".ini" << " /u" << user()); + message_box(TString("Sto andando a modificare il codice fiscale del fornitore:\n") << row->get(sf.cid2index(S_RAGSERR))); + app.run(); + row->add("", 0); + } + } + sf.force_update(); +} + + bool TPassive_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) @@ -397,18 +506,26 @@ bool TPassive_mask::on_field_event(TOperable_field& o, TField_event e, long joll case elenco_fe: select_all(F_DOCS); break; + case elenco_err: + select_all(F_ERR); + break; default: break; } break; case DLG_SAVEREC: if (e == fe_button) - switch(curr_page()) - { - case elenco_fe: + if(curr_page() == elenco_fe) salva_for(); - break; - default: break; - } + break; + case DLG_NEWREC: + if(e == fe_button) + if(curr_page() == elenco_err) + new_forn(); + break; + case DLG_RECALC: + if (e == fe_button) + if (curr_page() == elenco_err) + aggiorna_forn(); break; case F_DATAINI: if (e == fe_init) diff --git a/src/fp/fp0400a.h b/src/fp/fp0400a.h index 17fe99768..a0a410d62 100644 --- a/src/fp/fp0400a.h +++ b/src/fp/fp0400a.h @@ -10,18 +10,11 @@ #define S_SELCODPROT 101 #define S_CODPROT 102 -//#define F_DOCUMENTI_TIPO 301 -//#define S_SELCODNUM 101 -//#define S_TIPODOCSEL 102 -//#define S_DASTATO 103 -//#define S_ASTATO 104 -//#define S_TIPODOCSDI 105 - #define F_DOCS 201 #define S_SELECTED 101 #define S_ANNO 102 -#define S_CODSDI 103 +#define S_TIPODOCSDI 103 #define S_NDOC 104 #define S_DATADOC 105 #define S_TOTDOC 106 @@ -32,7 +25,7 @@ #define S_PARIVA 111 #define S_CODFISC 112 #define S_ATTACH 113 -#define S_COFI 114 +#define S_CODSDI 114 #define S_RAGXML 115 #define S_NPROT 116 #define S_PROKEY 117 @@ -40,8 +33,9 @@ #define F_ERR 301 -#define S_STATOERR 101 -#define S_PIVAERR 102 -#define S_CODFIERR 103 -#define S_RAGSERR 104 -#define S_DESCERR 105 \ No newline at end of file +#define S_SELECTF 101 +#define S_STATOERR 102 +#define S_PIVAERR 103 +#define S_CODFIERR 104 +#define S_RAGSERR 105 +#define S_DESCERR 106 \ No newline at end of file diff --git a/src/fp/fp0400a.uml b/src/fp/fp0400a.uml index 7475a2118..2d7f77fa8 100644 --- a/src/fp/fp0400a.uml +++ b/src/fp/fp0400a.uml @@ -15,6 +15,19 @@ BEGIN FLAGS "" END +BUTTON DLG_NEWREC 10 2 +BEGIN + PROMPT 1 1 "Nuovo" + PICTURE BMP_NEWREC + PICTURE BMP_NEWRECDN +END + +BUTTON DLG_RECALC 10 2 +BEGIN + PROMPT -13 -11 "Aggiorna" + PICTURE BMP_RECALC +END + #include ENDPAGE @@ -42,7 +55,6 @@ BEGIN ITEM "Codice\nProtocol.@12" END - ENDPAGE PAGE "Elenco Fatture" 0 2 0 0 @@ -76,6 +88,7 @@ PAGE "Errore Fornitori" 0 2 0 0 SPREADSHEET F_ERR BEGIN PROMPT 0 2 "" + ITEM "@1" ITEM "Stato\nP.IVA@5" ITEM "P. IVA@16" ITEM "Cod. Fiscale@16" @@ -87,25 +100,41 @@ ENDPAGE ENDMASK -PAGE "Spread protocol " 0 2 0 0 +PAGE "Spread protocol " -1 -1 50 5 BOOLEAN S_SELCODPROT BEGIN - PROMPT 1 1 "" + PROMPT 1 1 "Seleziona Protocollo" FLAGS "" END STRING S_CODPROT 12 BEGIN - PROMPT 1 1 "" + PROMPT 1 3 "Codice Protocollo" FLAGS "" END +ENDPAGE + +TOOLBAR "Fatture Passive" 0 0 0 2 + BUTTON DLG_OK 2 2 BEGIN PROMPT 1 1 "" END +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 1 1 "Collega" + PICTURE TOOL_LINK +END + + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + ENDPAGE ENDMASK @@ -114,19 +143,19 @@ PAGE "Documento" -1 -1 78 9 BOOLEAN S_SELECTED BEGIN - PROMPT 1 8 "" + PROMPT 1 0 "" FLAGS "" END NUMBER S_ANNO 4 BEGIN - PROMPT 1 2 "Anno " + PROMPT 1 1 "Anno " FLAGS "D" END -LIST S_CODSDI 35 +LIST S_TIPODOCSDI 35 BEGIN - PROMPT 41 2 "Tipo Doc SDI" + PROMPT 12 1 "Tipo Doc SDI" ITEM "TD01|TD01 Fattura" ITEM "TD02|TD02 Acconto/Anticipo su fattura" ITEM "TD03|TD03 Acconto/Anticipo su parcella" @@ -134,30 +163,30 @@ BEGIN ITEM "TD05|TD05 Nota di debito" ITEM "TD06|TD06 Parcella" ITEM "TD20|TD20 Autofattura" - FLAG "D" + FLAGS "D" END NUMBER S_NDOC 11 BEGIN - PROMPT 1 3 "Numero " + PROMPT 1 2 "Numero Doc. " FLAGS "D" END DATE S_DATADOC BEGIN - PROMPT 21 3 "Data " + PROMPT 20 0 "Data Doc. " FLAGS "D" END NUMBER S_TOTDOC 11 3 BEGIN - PROMPT 26 3 "Data " + PROMPT 26 2 "Totale Doc. " FLAGS "D" END BOOLEAN S_FPPRO BEGIN - PROMPT 28 3 "Salvato" + PROMPT 1 3 "Salvato in FP-PRO" FLAGS "D" END @@ -177,9 +206,9 @@ BEGIN DISPLAY "Partita IVA@11" PAIV OUTPUT S_FORNITORE CODCF OUTPUT S_RAGSOC RAGSOC + ADD RUN cg0 -1 F S_FORNITORE HELP "Codice relativo al cliente o fornitore" MESSAGE COPY,2@ - CHECKTYPE REQUIRED END STRING S_RAGSOC 50 @@ -198,7 +227,6 @@ BEGIN HELP "Prima parte della ragione sociale o cognome" MESSAGE COPY,3@ WARNING "Manca la ragione sociale" - CHECKTYPE REQUIRED END STRING S_STATOPAIV 2 @@ -218,7 +246,7 @@ END STRING S_PARIVA 50 20 BEGIN - PROMPT 1 5 "" + PROMPT 10 5 "P. IVA" KEY 5 USE LF_CLIFO KEY 5 INPUT TIPOCF "F" @@ -237,7 +265,7 @@ END STRING S_CODFISC 50 20 BEGIN - PROMPT 1 5 "" + PROMPT 1 6 "Cod. Fisc." FLAGS "U" KEY 4 USE LF_CLIFO KEY 4 @@ -253,40 +281,39 @@ BEGIN FLAGS "D" END -STRING S_COFI 20 +STRING S_CODSDI 20 BEGIN - PROMPT 1 6 "" + PROMPT 35 6 "Cod. Destinatario" FLAGS "D" END BOOLEAN S_ATTACH BEGIN - PROMPT 1 8 "Documenti in allegato" + PROMPT 1 7 "Documenti in allegato" FLAGS "D" END STRING S_RAGXML 50 BEGIN - PROMPT 21 4 "" - FLAG "D" + PROMPT 1 8 "" + FLAGS "D" HELP "Ragione sociale scritta nell'xml" END STRING S_NPROT 22 BEGIN - PROMPT 1 5 "" + PROMPT 1 9 "Numero Protocollo" HELP "Numero Protocollo" FLAGS "D" END STRING S_PROKEY 80 BEGIN - PROMPT 1 5 "" - HELP "Numero Protocollo" + PROMPT 1 10 "db key" + HELP "Chiave database" FLAGS "D" END - ENDPAGE TOOLBAR "Documento" 0 0 0 2 @@ -314,34 +341,40 @@ ENDMASK PAGE "Riga Errore" -1 -1 69 14 +BOOLEAN S_SELECTF +BEGIN + PROMPT 21 4 "Seleziona Fornitore da salvare" + FLAGS "" +END + STRING S_STATOERR 2 BEGIN PROMPT 21 4 "" - FLAG "D" + FLAGS "D" END STRING S_PIVAERR 50 20 BEGIN PROMPT 21 4 "" - FLAG "D" + FLAGS "D" END STRING S_CODFIERR 50 20 BEGIN PROMPT 21 4 "" - FLAG "D" + FLAGS "D" END STRING S_RAGSERR 50 BEGIN PROMPT 21 4 "" - FLAG "D" + FLAGS "D" END STRING S_DESCERR 100 BEGIN PROMPT 21 4 "" - FLAG "D" + FLAGS "D" END diff --git a/src/fp/fplib.h b/src/fp/fplib.h index fa39d1f5f..10f3a6e49 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -147,15 +147,28 @@ private: protected: - bool initialize(const TDocumentoEsteso& doc); + + /**< Funzioni di controllo */ + /**< Controlli di testata, non è const per il calcolo della codizione di pagamento */ + bool check_initial(TDocumentoEsteso& doc); + /**< Controllo di riga */ + bool check_row(const TRiga_documento& rdoc); + /**< Controllo riepilogo IVA */ + bool check_riepilogo(const TDocumentoEsteso& doc, const TRiepilogo_iva& riva); + + + bool initialize(TDocumentoEsteso& doc); bool parse_sconto(const TString& formula, TToken_string& sconti) const; static bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban); - bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; + bool get_bank(TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; + bool get_bank_presentazione(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; + bool get_bank_appoggio(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; const TString& descrizione(const TRiga_documento& rdoc); const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta void log(int severity, const char* msg); const char* natura(const TString& codiva) const; + const char* get_esigibilita_iva(const TDocumentoEsteso& doc); void set_IVA(TString codiva, TPaf_record& paf) const; void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const; bool add_row_art(long& riga_art, const TString& codice_tipo, const TString& codice_valore, TPaf_record& paf); @@ -211,6 +224,7 @@ public: const bool get_esp_est() const; const TString& get_esp_est_cod() const; const bool is_f8() const; + const bool get_check_not_block() const; // Setters void set_db_indirizzo(const TString& ind) const; @@ -226,6 +240,7 @@ public: void set_esp_est(bool esp_est) const; void set_esp_est_cod(const TString& esp_est_cod) const; void set_f8(bool f8) const; + void set_check_not_block(bool not_block) const; }; inline TFP_settings& fp_settings() diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index 779411c3c..fd1b6809b 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -190,7 +190,7 @@ bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString& } else pec = ""; - // Dopo la versione 1.2 torna sempre true + return coddest.full(); } inline const TString& no_special(char a) @@ -538,47 +538,74 @@ bool TDoc_fp::get_bnp_iban(const TString& abi, const TString& cab, int nprog, TS iban = bnp.get("S3"); return err == NOERR; } -bool TDoc_fp::get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const +bool TDoc_fp::get_bank(TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const { - bool found = false; - abi = doc.get(DOC_CODABIP); - cab = doc.get(DOC_CODCABP); - int prg = doc.get_int(DOC_PROGBNP); + bool found = false; + if(doc.pagamento().tipo_rata(0) == TTipo_pag::_bonfico) + { + found = get_bank_presentazione(doc, iban, abi, cab, istituto); + } + else if(doc.pagamento().tipo_rata(0) == TTipo_pag::_ric_ban || doc.pagamento().tipo_rata(0) == TTipo_pag::_rid) + { + found = get_bank_appoggio(doc, iban, abi, cab, istituto); + } + return found; +} + +bool TDoc_fp::get_bank_presentazione(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const +{ + bool found = false; + abi = doc.get(DOC_CODABIP); + cab = doc.get(DOC_CODCABP); + int prg = doc.get_int(DOC_PROGBNP); + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, prg, iban); + if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN + { + const TRectype& cfven = doc.clifor().vendite(); + abi = cfven.get(CFV_CODABIPR); + cab = cfven.get(CFV_CODCABPR); found = abi.full() && cab.full(); if (found) - get_bnp_iban(abi, cab, prg, iban); - if (!found) // Se non trovo banca sul DOC la cerco su CFBAN - { - TToken_string key; - key.add("C"); - key.add(doc.codcf()); - key.add("N"); - key.add(1); - const TRectype& cfban = cache().get(LF_CFBAN, key); - if (!cfban.empty()) - { - abi = cfban.get(CFBAN_ABI); - cab = cfban.get(CFBAN_CAB); - prg = cfban.get_int(CFBAN_PROGPR); - found = abi.full() && cab.full(); - iban = cfban.get(CFBAN_IBAN); - if (found && iban.blank()) - get_bnp_iban(abi, cab, prg, iban); - } - } - if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN - { - const TRectype& cfven = doc.clifor().vendite(); - abi = cfven.get(CFV_CODABIPR); - cab = cfven.get(CFV_CODCABPR); - found = abi.full() && cab.full(); - if (found) - get_bnp_iban(abi, cab, 0, iban); - } - if (found) - istituto = cache().get("%BAN", abi, "S0"); - return found; + get_bnp_iban(abi, cab, 0, iban); + } + if (found) + istituto = cache().get("%BAN", abi, "S0"); + return found; } + +bool TDoc_fp::get_bank_appoggio(const TDocumento& doc, TString& iban, TString& abi, TString& cab, + TString& istituto) const +{ + bool found = false; + abi = doc.get(DOC_CODABIA); + cab = doc.get(DOC_CODCABA); + iban = doc.get(DOC_IBAN); + found = iban.full(); + if (!found) // Se non trovo banca sul DOC la cerco su CFBAN + { + TToken_string key; + key.add("C"); + key.add(doc.codcf()); + key.add("N"); + key.add(1); + const TRectype& cfban = cache().get(LF_CFBAN, key); + if (!cfban.empty()) + { + abi = cfban.get(CFBAN_ABI); + cab = cfban.get(CFBAN_CAB); + found = abi.full() && cab.full(); + iban = cfban.get(CFBAN_IBAN); + if (found && iban.blank()) + get_bnp_iban(abi, cab, -1, iban); + } + } + if (found) + istituto = cache().get("%BAN", abi, "S0"); + return found; +} + const TString& TDoc_fp::descrizione(const TRiga_documento& rdoc) { if (rdoc.get_bool(RDOC_DESCLUNGA)) @@ -696,7 +723,91 @@ bool TDoc_fp::save_paf() return ok; } -bool TDoc_fp::initialize(const TDocumentoEsteso& doc) +bool TDoc_fp::check_initial(TDocumentoEsteso& doc) +{ + bool ok = true; + static TString msg; + + if (_coddest.len() != 6 && _coddest.len() != 7) + { + log(1, "Il codice destinatario ha una lunghezza non conforme."); + ok = false; + } + + if (_rec_clifo.get(CLI_PAIV).empty() && _rec_clifo.get(CLI_COFI).empty()) + { + log(1, "Sia la partita IVA che il codice fiscale del cessionario committente sono vuoti, almeno uno dei due deve essere valorizzato."); + ok = false; + } + + TPagamento& pag = doc.pagamento(); + 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(); + log(1, msg); + ok = false; + } + + for (int nr = 0; nr < doc.scadenze().items(); nr++) + { + const int rp = nr < pag.n_rate() ? nr : 0; + static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp); + + 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(); + log(1, msg); + ok = false; + } + + } + + return ok; +} + +bool TDoc_fp::check_row(const TRiga_documento& rdoc) +{ + bool ok = false; + static TString msg; + + if(rdoc.is_spese()) + { + const TSpesa_prest& spesa = rdoc.spesa(); + if(spesa.perc().is_zero()) + { + msg.cut(0) << "É corretto che per la spesa " << spesa.codice() << " la percentuale sia zero?"; + log(1, msg); + } + } + + const TCodiceIVA& codice_iva = rdoc.iva(); + if (codice_iva.codice().full() && codice_iva.percentuale() == ZERO && codice_iva.natura().empty()) + { + msg.cut(0) << "Impossibile avere la natura non valorizzata a fronte di una aliquota con percentuale zero. Codice IVA: "; msg << codice_iva.codice(); + log(1, msg); + ok = false; + } + + return ok; +} + +bool TDoc_fp::check_riepilogo(const TDocumentoEsteso& doc, const TRiepilogo_iva& riva) +{ + bool ok = true; + static TString msg; + + if(*get_esigibilita_iva(doc) == 'S' && riva.cod_iva().natura() == "N6") + { + msg.cut(0) << "Impossibile avere un documento con scissione dei pagamenti e natura iva N6, codice: " << riva.cod_iva().codice(); + log(1, msg); + ok = false; + } + + return ok; +} + +bool TDoc_fp::initialize(TDocumentoEsteso& doc) { // Azzero _hfatt.cut(0); @@ -732,7 +843,10 @@ bool TDoc_fp::initialize(const TDocumentoEsteso& doc) #ifndef DBG _is_pa = doc.clifor().get_int("ALLEG") == 7; if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), _coddest, _pec)) + { + log(1, "Impossibile trovare il codice destinatario per la fattura"); return false; + } #else _is_pa = true; _coddest = "WSUHKZ"; @@ -756,7 +870,7 @@ bool TDoc_fp::initialize(const TDocumentoEsteso& doc) // Azzero indici _index_cassa_previdenziale = 1; - return true; + return check_initial(doc) || fp_settings().get_check_not_block(); } const TRectype& TDoc_fp::cco(const TRectype& doc) const @@ -844,6 +958,18 @@ const char* TDoc_fp::natura(const TString& codiva) const return cache().get("%IVA", codiva, "S12"); } +const char* TDoc_fp::get_esigibilita_iva(const TDocumentoEsteso& doc) +{ + // Esigibilità IVA: Immediata, Differita, Split payment + const char* eiva = "I"; + if (doc.is_split_payment()) + eiva = "S"; + else if (doc.get_bool(DOC_LIQDIFF) || doc.get_bool(DOC_IVAXCASSA)) + eiva = "D"; + + return eiva; +} + void TDoc_fp::set_IVA(TString codiva, TPaf_record& paf) const { if (codiva.empty()) @@ -1106,6 +1232,7 @@ bool TDoc_fp::export_paf0100f() paf0100f.set("P1_TELEFONO", tel); paf0100f.set("P1_MAIL", get_firm().get(NDT_MAIL)); paf0100f.set("P1_GESTIONE", "D"); + paf0100f.set("P1_ERRINT", ""); // return insert(paf0100f); } @@ -1411,46 +1538,50 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) { + // Controllo la riga + if (check_row(*rdoc) && !fp_settings().get_check_not_block()) + return false; + bool skip_riga = false; - paf1800f.reset(); - paf1800f.set("PI_KEYHEADERFATT", _hfatt); - paf1800f.set("PI_KEYBODYFATT", _bfatt); - paf1800f.set("PI_NUMEROLINEA", riga); - const TString& descrizione_riga = descrizione(*rdoc); - if (descrizione_riga.empty()) - continue; - paf3000f.reset(); - paf3000f.set("PT_KEYHEADERFATT", _hfatt); - paf3000f.set("PT_KEYBODYFATT", _bfatt); - paf3000f.set("PT_RIFNUMLINEA", riga); - paf3000f.set("PT_COMMENTO", descrizione_riga); - // - if (rdoc->is_articolo()) - { - TString codartmag = rdoc->get(RDOC_CODARTMAG); - TString codart = rdoc->get(RDOC_CODART); - long riga_art = 0; - if (codart.full()) + paf1800f.reset(); + paf1800f.set("PI_KEYHEADERFATT", _hfatt); + paf1800f.set("PI_KEYBODYFATT", _bfatt); + paf1800f.set("PI_NUMEROLINEA", riga); + const TString& descrizione_riga = descrizione(*rdoc); + if (descrizione_riga.empty()) + continue; + paf3000f.reset(); + paf3000f.set("PT_KEYHEADERFATT", _hfatt); + paf3000f.set("PT_KEYBODYFATT", _bfatt); + paf3000f.set("PT_RIFNUMLINEA", riga); + paf3000f.set("PT_COMMENTO", descrizione_riga); + // + if (rdoc->is_articolo()) { - if (codartmag.full()) + TString codartmag = rdoc->get(RDOC_CODARTMAG); + TString codart = rdoc->get(RDOC_CODART); + long riga_art = 0; + if (codart.full()) { - paf1900f.reset(); - paf1900f.set("PY_KEYHEADERFATT", _hfatt); - paf1900f.set("PY_KEYBODYFATT", _bfatt); - paf1900f.set("PY_KEYNLINEA", riga); - ok &= add_row_art(riga_art, "Codice articolo interno", codartmag, paf1900f); - } - // Se il codice articolo del magazzino è diverso quello è del cliente - if (codart.full() && codart != codartmag) - { - paf1900f.reset(); - paf1900f.set("PY_KEYHEADERFATT", _hfatt); - paf1900f.set("PY_KEYBODYFATT", _bfatt); - paf1900f.set("PY_KEYNLINEA", riga); - ok &= add_row_art(riga_art, "Codice articolo cliente", codart, paf1900f); + if (codartmag.full()) + { + paf1900f.reset(); + paf1900f.set("PY_KEYHEADERFATT", _hfatt); + paf1900f.set("PY_KEYBODYFATT", _bfatt); + paf1900f.set("PY_KEYNLINEA", riga); + ok &= add_row_art(riga_art, "Codice articolo interno", codartmag, paf1900f); + } + // Se il codice articolo del magazzino è diverso quello è del cliente + if (codart.full() && codart != codartmag) + { + paf1900f.reset(); + paf1900f.set("PY_KEYHEADERFATT", _hfatt); + paf1900f.set("PY_KEYBODYFATT", _bfatt); + paf1900f.set("PY_KEYNLINEA", riga); + ok &= add_row_art(riga_art, "Codice articolo cliente", codart, paf1900f); + } } } - } // if(rdoc->is_descrizione()) { @@ -1570,6 +1701,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) // Controllo se è una ritenuta fiscale if (sp.tipo_ritenuta() == 'F') { + paf1800f.set("PI_RITENUTA", "SI"); add_ritenuta(doc, rdoc->spesa(), paf0700f); } } @@ -1842,17 +1974,16 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf2200f.set("PL_KEYHEADERFATT", _hfatt); paf2200f.set("PL_KEYBODYFATT", _bfatt); remove(paf2200f); // Cancella tutte le righe di riepilogo IVA - const char* eiva = "I"; // Esigibilità IVA: Immediata, Differita, Split payment - if (doc.is_split_payment()) - eiva = "S"; - else if (doc.get_bool(DOC_LIQDIFF) || doc.get_bool(DOC_IVAXCASSA)) - eiva = "D"; + const char* eiva = get_esigibilita_iva(doc); long num_riep = 0; TAssoc_array& tiva = doc.tabella_iva(false); FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm) { const TRiepilogo_iva& riva = *dynamic_cast(itm); - + + if (!check_riepilogo(doc, riva) && !fp_settings().get_check_not_block()) + return false; + add_riepilogo_iva(paf2200f, riva.cod_iva(), eiva, riva.imponibile(), riva.imposta()); } @@ -1895,10 +2026,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) TString8 abi, cab; if (get_bank(doc, iban, abi, cab, istituto)) { - paf2500f.set("PO_ISTFINANZ", istituto); - paf2500f.set("PO_IBAN", iban); - paf2500f.set("PO_ABI", abi); - paf2500f.set("PO_CAB", cab); + paf2500f.set("PO_ISTFINANZ", istituto); + paf2500f.set("PO_IBAN", iban); + paf2500f.set("PO_ABI", abi); + paf2500f.set("PO_CAB", cab); } if (tipo_pag == 3 && cab.blank()) // Ricevuta bancaria log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento")); @@ -1908,15 +2039,15 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) } for (int nr = 0; nr < nrate; nr++) { - paf2500f.set("PO_RIGA", long(nr + 1)); // Numero rata - int rp = nr < pag.n_rate() ? nr : 0; - static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp); - paf2500f.set("PO_MODALITAPAGAM", cache().get("%CLR", key_class, "S12")); // Si assicura che il numero riga sia accettabile - TToken_string& riga_scadenze = scad.row(nr); // Data|Importo - paf2500f.set("PO_DATASCADENZA", TDate(riga_scadenze.get(0))); // Data scadenza - paf2500f.set("PO_IMPORTO", converti_prezzo(real(riga_scadenze.get()))); // Importo rata - paf2500f.set("PO_GESTIONE", "D"); - ok &= insert(paf2500f); + paf2500f.set("PO_RIGA", long(nr + 1)); // Numero rata + const int rp = nr < pag.n_rate() ? nr : 0; + static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp); + paf2500f.set("PO_MODALITAPAGAM", cache().get("%CLR", key_class, "S12")); // Si assicura che il numero riga sia accettabile + TToken_string& riga_scadenze = scad.row(nr); // Data|Importo + paf2500f.set("PO_DATASCADENZA", TDate(riga_scadenze.get(0))); // Data scadenza + paf2500f.set("PO_IMPORTO", converti_prezzo(real(riga_scadenze.get()))); // Importo rata + paf2500f.set("PO_GESTIONE", "D"); + ok &= insert(paf2500f); } // if (_gestioneallegati) @@ -1941,11 +2072,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) } else { - //ve1 -2 {CODNUM} {ANNO} {PROVV} {NDOC}(-{ANDOC}) {TIPO_ELABORAZIONE} {TIPO_STAMPA} + //ve1 -2 {CODNUM} {ANNO} {PROVV} {NDOC}(-{ANDOC}) {TIPO_ELABORAZIONE} {TIPO_STAMPA} {NUM_COPIE} {ARCHIVIAZIONE} // Costruisco la chiamata static TString commandline; commandline.cut(0) << "ve1 -2 " << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_ANNO) - << ' ' << doc.get(DOC_PROVV) << ' ' << doc.get(DOC_NDOC) << " X P"; // X: stampa su disco, P: provvisorio + << ' ' << doc.get(DOC_PROVV) << ' ' << doc.get(DOC_NDOC) << " X P 1 D"; // X: stampa su disco, P: provvisorio, 1: 1 copia, D: disabilita archiviazione TExternal_app interattivo(commandline); if (interattivo.run() != NOERR) { diff --git a/src/fp/fplib02.cpp b/src/fp/fplib02.cpp index d0db3d38a..9e0a0b369 100644 --- a/src/fp/fplib02.cpp +++ b/src/fp/fplib02.cpp @@ -19,6 +19,7 @@ #define FP_ESP_EST "espest" #define FP_ESP_EST_COD "espestcod" #define FP_F8 "f8" +#define FP_CHECK_NOT_BLOCK "checknotblock" // Sheet fp0300 #define FP_SLD_COD "SLD" @@ -112,6 +113,11 @@ const bool TFP_settings::is_f8() const return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_F8); } +const bool TFP_settings::get_check_not_block() const +{ + return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NOT_BLOCK); +} + void TFP_settings::set_db_indirizzo(const TString& ind) const { ini_set_string(FILE_CONFIG, FILE_SECTION, FP_IP, ind); @@ -177,6 +183,11 @@ void TFP_settings::set_f8(const bool f8) const ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_F8, f8); } +void TFP_settings::set_check_not_block(const bool not_block) const +{ + ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NOT_BLOCK, not_block); +} + TRectype TFP_selected_docs::fill_rectype() const { TRectype r(LF_TABMOD); diff --git a/src/ve/ve1300.cpp b/src/ve/ve1300.cpp index bb0d19082..1106151af 100755 --- a/src/ve/ve1300.cpp +++ b/src/ve/ve1300.cpp @@ -1096,6 +1096,8 @@ class TReport_doc_app : public TSkeleton_application char _tipocf; bool _no_print_dlg; + enum {_disabled, _force, _auto} _arc_type; + protected: void add_cli_filter(TString& query, bool from) const; void add_data_filter(TString& query, bool from) const; @@ -1398,6 +1400,10 @@ bool TReport_doc_app::print_loop(TRecordset& doc, TOutput_mode mode, bool final_ const TCodice_numerazione& cn = cached_numerazione(codnum); arc = cn.auto_archive(); } + + // Controllo se devo archiviare in base ai parametri passati + arc = _arc_type == _force || _arc_type == _auto && arc; + set_next_pdf(&doc); TToken_string to, cc; @@ -1648,6 +1654,11 @@ TReport_doc_app::TOutput_mode TReport_doc_app::key2mode(KEY k) const void TReport_doc_app::main_loop() { _no_print_dlg = false; // Normalmente mostra la GUI di stampa + + _arc_type = _auto; + + // Chiamata: ve1 -2 {CODNUM} {ANNO} {PROVV} {NDOC}(-{ANDOC}) {TIPO_ELABORAZIONE} {TIPO_STAMPA} {NUM_COPIE} {ARCHIVIAZIONE} + const int a = argc(); if (a > 2) { @@ -1697,6 +1708,24 @@ void TReport_doc_app::main_loop() _msk->set(F_NCOPIE, argv(8)); // Numero copie print_selection(mode); + + if(a > 9) + { + const TString arc_type = argv(9); + if(arc_type == "A") + { + _arc_type = _auto; + } + else if(arc_type == "D") + { + _arc_type = _disabled; + } + else if(arc_type == "F") + { + _arc_type = _force; + } + } + return; }