Files correlati : fp0300.cpp, fplib01.cpp, fatturac.src, ve0300a.src Commento: Nella videata "Magazzino" di ve0-0 (Documenti interattivi) aggiunti al campo "Collegamento documento P.A." due nuovi valori: "Ricezione" e "Fatt.Coll." Modificato leggermente il programma di fatturazione in relazione a questa aggiunta
		
			
				
	
	
		
			783 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			783 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <applicat.h>
 | |
| #include <automask.h>
 | |
| #include <config.h>
 | |
| #include "fplib.h"
 | |
| #include <progind.h>
 | |
| #include <cfven.h>
 | |
| #include <doc.h>
 | |
| 
 | |
| #include "../ve/velib05.h"
 | |
| #include "../fe/felib.h"
 | |
| 
 | |
| #include "fp0.h"
 | |
| #include "fp0300a.h"
 | |
| #include "fp0100a.h"
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////////////
 | |
| // Globals
 | |
| /////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #define LEN_HFATT 20
 | |
| #define LEN_BFATT 50
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////////////
 | |
| // TPa_mask
 | |
| /////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| class TPA_mask : public TAutomask
 | |
| {
 | |
| protected:
 | |
| 	enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi};
 | |
| 
 | |
| 	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), _enable_chiave_fixer(false)
 | |
| 	{
 | |
| 		disable(DLG_OK);
 | |
| 		disable(DLG_SAVEREC);
 | |
| 		disable(DLG_FINDREC);
 | |
| 		load_all_fields();
 | |
| 		const TDate data_inizio = get_date_start_new_fatt();
 | |
| 
 | |
| 		if (today < data_inizio)
 | |
| 		{
 | |
| 			const TSheet_field & sheet = sfield(F_DOCS);
 | |
| 			const TMask & rowmask = sheet.sheet_mask();
 | |
| 			TList_field & tdsdi = rowmask.lfield(S_CODSDI);
 | |
| 
 | |
| 			tdsdi.delete_item("TD24");
 | |
| 			tdsdi.delete_item("TD25");
 | |
| 			tdsdi.delete_item("TD27");
 | |
| 		}
 | |
| 	}
 | |
| 	void save_all_fields() const;
 | |
| };
 | |
| 
 | |
| void TPA_mask::save_all_fields() const
 | |
| {
 | |
| 	ini_set_string(CONFIG_DITTA, "fp", "dataini", get(F_DATAINI));
 | |
| 	ini_set_string(CONFIG_DITTA, "fp", "dataend", get(F_DATAEND));
 | |
| 
 | |
| 	// Salvo lo sheet
 | |
| 	TFP_selected_docs selected_docs;
 | |
| 	selected_docs.save_sheet(sfield(F_DOCUMENTI_TIPO));
 | |
| 
 | |
| 	// Salvo le impostazioni
 | |
| 	set_esp_pri_empty(get_bool(F_SETDEFCOD));
 | |
|   set_send_all_rifs(get_bool(F_SENDALLRIFS));
 | |
| 	set_esp_est(get_bool(F_SETCODEST));
 | |
| 	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"));
 | |
| 	set(F_DATAEND, ini_get_string(CONFIG_DITTA, "fp", "dataend"));
 | |
| 
 | |
| 	const TToken_string s_accepted_docs(ini_get_string(CONFIG_DITTA, "fp", "accepted_docs"), ';');
 | |
| 	TSheet_field& sheet = sfield(F_DOCUMENTI_TIPO);
 | |
| 	TFP_selected_docs selected_docs;
 | |
| 
 | |
| 	if (selected_docs.has_selected_docs())
 | |
| 	{
 | |
| 		// Super nuova gestione super avanzata!
 | |
| 		selected_docs.fill_sheet(sheet);
 | |
| 	}
 | |
| 	else if(s_accepted_docs.full())
 | |
| 	{
 | |
| 		// Nuova gestione avanzata!
 | |
| 		FOR_EACH_STR_TOKEN(s_accepted_docs, tok)
 | |
| 		{
 | |
| 			TToken_string& row = sheet.row(-1);
 | |
| 			row.add(tok);
 | |
| 			row.add(TTipo_documento(TToken_string(tok).get(1)).tipo_doc_sdi());
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		// Vecchia gestione ):
 | |
| 		const TString& codnum = ini_get_string(CONFIG_DITTA, "fp", "codnum");
 | |
| 		TToken_string tipidocs(ini_get_string(CONFIG_DITTA, "fp", "tipodocs"));
 | |
| 		FOR_EACH_STR_TOKEN(tipidocs, tok)
 | |
| 		{
 | |
| 			TToken_string& row = sheet.row(-1);
 | |
| 			row.add(codnum);
 | |
| 			row.add(tok);
 | |
| 			// Considero 1 e 9 come stati default?
 | |
| 			row.add(1);
 | |
| 			row.add(9);
 | |
| 			row.add(TTipo_documento(tok).tipo_doc_sdi());
 | |
| 		}
 | |
| 	}
 | |
| 	sheet.force_update();
 | |
| 	sheet.show();
 | |
| 
 | |
| 	set(F_SETDEFCOD, get_esp_pri_empty());
 | |
|   set(F_SENDALLRIFS, get_send_all_rifs()); 
 | |
|   set(F_SETCODEST, get_esp_est());
 | |
| 	set(F_VALCODEST, get_esp_est_cod());
 | |
| }
 | |
| 
 | |
| void TPA_mask::fill()
 | |
| {
 | |
| 	// Salvo subito su file le impostazioni di esportazione, in fplib accedo ai file
 | |
| 	save_all_fields();
 | |
| 
 | |
| 	TSheet_field&  docs = sfield(F_DOCS);
 | |
| 	//TString_array& sht  = docs.rows_array();
 | |
| 
 | |
| 	docs.reset();
 | |
| 
 | |
| 	const TDate dal             = get(F_DATAINI);
 | |
| 	const TDate al							= get(F_DATAEND);
 | |
| 	TString filter_selected		  = get(F_FATTSEL);
 | |
| 	bool provvisorio = get(F_PROVVISORIO);
 | |
| 
 | |
| 	enable(DLG_OK, filter_selected.empty() || filter_selected == "E");
 | |
| 	enable(DLG_SAVEREC, (is_f8() && filter_selected == "X") || filter_selected == "D");
 | |
| 	enable(DLG_FINDREC, filter_selected == "D");
 | |
| 	enable(DLG_PRINT, _enable_chiave_fixer && filter_selected.empty());
 | |
| 
 | |
| 	docs.enable_column(S_SELECTED, filter_selected!="X" || is_f8());
 | |
| 	docs.enable_column(S_CODSDI, filter_selected != "X");
 | |
| 	docs.enable_column(S_ONLYGEN, filter_selected != "X");
 | |
| 	// Record di controllo per eventuali elaborazioni precedenti
 | |
| 	TString     hfatt(LEN_HFATT), bfatt(LEN_BFATT);
 | |
| 	TPaf_record paf0100f("PAF0100F");
 | |
| 
 | |
| 	TString query;
 | |
| 
 | |
| 	query << "USE 33 KEY 3 \n" <<
 | |
| 		"SELECT 33.TIPOCF==\"C\" \n" <<
 | |
| 		"JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
 | |
| 		"JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
 | |
| 		"JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC \n" <<
 | |
| 		"FROM DATADOC=#DADATADOC \n" <<
 | |
| 		"TO DATADOC=#ADATADOC";
 | |
| 
 | |
| 	TISAM_recordset rec(query);
 | |
| 
 | |
| 	rec.set_var("#DADATADOC", dal);
 | |
| 	rec.set_var("#ADATADOC", al);
 | |
| 
 | |
| 	TProgress_monitor pi(rec.items(), nullptr);
 | |
| 
 | |
| 	bool first, show, ask = !((show = (first = true)));
 | |
| 	int fat_no_cod = 0;
 | |
| 
 | |
| 	// Disabilito la colonna del codice ufficio
 | |
| 	docs.enable_column(cid2index(S_UFFICIO), false);
 | |
| 	const TDate data_inizio = get_date_start_new_fatt();
 | |
| 
 | |
| 	for (bool okc = rec.move_first(); okc; okc = rec.move_next())
 | |
| 	{
 | |
| 		if (!pi.add_status())
 | |
| 			break;
 | |
| 		const TDocumentoEsteso doc(rec.cursor()->curr());
 | |
| 
 | |
| 		// Controllo che la numerazione sia tra quelle giuste
 | |
| 		// Controllo che il tipo documento sia OK
 | |
| 		if(!check_doc_filter(doc))
 | |
| 				continue;
 | |
| 
 | |
| 		const TTipo_documento& td = doc.tipo(); //cached_tipodoc(doc.get(DOC_TIPODOC));
 | |
| 		bool sent = false;
 | |
| 
 | |
| 		if (chiave_paf_doc(doc, hfatt, bfatt))
 | |
| 		{
 | |
| 				if (paf0100f.search(nullptr, hfatt, bfatt)&& paf0100f.sq_get("P1_GESTIONE") != " " &&
 | |
| 					  paf0100f.sq_get("P1_GESTIONE") != "0" && paf0100f.sq_get("P1_ERRINT") != "*")
 | |
| 				{
 | |
| 						if (paf0100f.sq_get("P1_GESTIONE") != filter_selected)
 | |
| 								continue;
 | |
| 						sent = true;
 | |
| 				}
 | |
| 				else if (filter_selected.not_empty())
 | |
| 						continue;
 | |
| 		}
 | |
| 
 | |
| 		TToken_string& row = docs.row(-1);
 | |
| 		row                = sent ? " " : "X";
 | |
| 		row.add(doc.get_int(DOC_ANNO), 1);
 | |
| 		row.add(doc.get(DOC_CODNUM));
 | |
| 		row.add(doc.get(DOC_TIPODOC));
 | |
| 
 | |
| 		TString tipodoc = doc.get(DOC_TIPODOCSDI);
 | |
| 		
 | |
| 		if (tipodoc.blank())
 | |
| 			tipodoc = td.tipo_doc_sdi();
 | |
| 		if (today <data_inizio && (tipodoc == "TD24" || tipodoc == "TD25" || tipodoc == "TD27"))
 | |
| 			tipodoc = "TD01";
 | |
| 		row.add(tipodoc);
 | |
| 		row.add(doc.get_int(DOC_NDOC));
 | |
| 		row.add(doc.get_date(DOC_DATADOC));
 | |
| 		row.add(doc.get_int(CFV_CODCF));
 | |
| 		row.add(doc.clifor().get(CLI_RAGSOC));
 | |
| 
 | |
|     TString cod_ind_sped = doc.get(DOC_CODINDSP);
 | |
| 		TString rif = get_dest_sdi(doc.get(DOC_TIPOCF)[0], doc.get_int(DOC_CODCF), cod_ind_sped);
 | |
| 
 | |
| 		// Se è ancora vuoto potrebbe essere estero
 | |
| 		if(rif.empty())
 | |
| 		{
 | |
| 			// Segno la riga errata
 | |
| 			if (first)
 | |
| 			{
 | |
| 				first = false;
 | |
| 				// Abilito la colonna del codice ufficio per segnalare l'errore
 | |
| 				docs.enable_column(docs.cid2index(S_UFFICIO));
 | |
| 			}
 | |
| 			docs.set_back_and_fore_color(COLOR_RED, COLOR_WHITE, rec.current_row(), docs.cid2index(S_UFFICIO));
 | |
| 			fat_no_cod++;
 | |
| 		}
 | |
| ;
 | |
| 		row.add(rif);
 | |
| 		row.add(doc.clifor().vendite().get(CFV_PARIFAMM));
 | |
| 		row.add(doc.clifor().get(CLI_COFI));
 | |
| 
 | |
| 		bool split = doc.clifor().get_bool(CLI_SPLITPAY);
 | |
| 
 | |
| 		if (split)
 | |
| 		{
 | |
| 			const long numreg = doc.get_int(DOC_NUMREG);
 | |
| 
 | |
| 			if (numreg > 0)
 | |
| 			{
 | |
| 				const TRectype& mov = cache().get(LF_MOV, numreg);
 | |
| 				split               = is_split_payment(mov);
 | |
| 			}
 | |
| 		}
 | |
| 		row.add(split ? "X" : " ");
 | |
| 
 | |
| 		const bool attach = !rec.get("COLL_GOLEM").is_empty();
 | |
| 
 | |
| 		row.add(attach ? "X" : " ");
 | |
| 		row.add((!td.invio_xml()) ? "X" : "");
 | |
| 	}
 | |
| 	docs.force_update();
 | |
| 	if (fat_no_cod > 0)
 | |
| 		warning_box("Sono state trovate una o più fatture senza codice destinatario né pec");
 | |
| }
 | |
| 
 | |
| void TPA_mask::set_filter_changed()
 | |
| {
 | |
| 	_filter_changed = true;
 | |
| }
 | |
| 
 | |
| void TPA_mask::set_pronto()
 | |
| {
 | |
| 	TString_array& sht = sfield(F_DOCS).rows_array();
 | |
| 	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;
 | |
| 
 | |
| 		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(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(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(get_bool(F_PROVVISORIO));
 | |
| 
 | |
| 	//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 e' 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)
 | |
| {
 | |
| 	switch (o.dlg())
 | |
| 	{
 | |
| 	case DLG_RECALC:
 | |
| 		if (e == fe_button)
 | |
| 			next_page(1);
 | |
| 		break;
 | |
| 	case F_DATAINI:
 | |
| 		if (e == fe_init)
 | |
| 			o.set(ini_get_string(CONFIG_DITTA, "fp", "LastXML", "01-01-2019"));
 | |
| 		else if (e == fe_close)
 | |
| 			ini_set_string(CONFIG_DITTA, "fp", "LastXML", o.get());
 | |
| 		break;
 | |
| 	case F_DATAEND:
 | |
| 		if (e == fe_init)
 | |
| 			o.set(TDate(TODAY));
 | |
| 	case F_DOCS:
 | |
| 		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)
 | |
| 		{
 | |
| 			TSheet_field&  docs = sfield(F_DOCS);
 | |
| 			TToken_string& row  = docs.row(docs.selected());
 | |
| 			TRectype       doc(LF_DOC);
 | |
| 			doc.put(DOC_PROVV, 'D');
 | |
| 			doc.put(DOC_ANNO, row.get(1));
 | |
| 			doc.put(DOC_CODNUM, row.get(2));
 | |
| 			doc.put(DOC_TIPODOC, row.get(3));
 | |
| 			doc.put(DOC_NDOC, row.get(5));
 | |
| 			if (doc.edit(LF_DOC, "", "ve0")) // Perchè prima andava senza dovergli mettere nulla?
 | |
| 				fill();
 | |
| 		}
 | |
| 		break;
 | |
| 	case DLG_ALL:
 | |
| 		{
 | |
| 			if (e == fe_button)
 | |
| 			{
 | |
| 				TSheet_field&  docs  = sfield(F_DOCS);
 | |
| 				TString_array& sht   = docs.rows_array();
 | |
| 				const int      items = sht.items();
 | |
| 
 | |
| 				if (items > 0)
 | |
| 				{
 | |
| 					const TString4 select = *(sht.row(0).get(0)) == 'X' ? "" : "X";
 | |
| 					for (int       i      = 0; i < items; i++)
 | |
| 						sht.row(i).add(select, 0);
 | |
| 					docs.force_update();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		break;
 | |
| 	case DLG_SAVEREC:
 | |
| 		{
 | |
| 		if (e == fe_button)
 | |
| 				set_err_paf();
 | |
| 		}
 | |
| 		break;
 | |
| 	case DLG_FINDREC:
 | |
| 		{
 | |
| 		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)
 | |
| 	{
 | |
| 		if (o.dlg() >= START_MASK && o.dlg() <= END_MASK)
 | |
| 		{
 | |
| 			set_filter_changed();
 | |
| 		}
 | |
| 	}
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| void TPA_mask::next_page(int p)
 | |
| {
 | |
| 	bool ok = true;
 | |
| 	if (_filter_changed && p != 1000)
 | |
| 	{
 | |
| 		if ((ok = _filter_changed = check_full_fields()))
 | |
| 		{
 | |
| 			TSheet_field& sf = sfield(F_DOCS);
 | |
| 			fill();
 | |
| 			_filter_changed = false;
 | |
| 		}
 | |
| 	}
 | |
| 	if(ok)
 | |
| 		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);
 | |
| 	TString       msg;
 | |
| 
 | |
| 	if (sheet.empty())
 | |
| 		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?";
 | |
| 
 | |
| 	if (msg.full() && yesno_box(msg))
 | |
| 	{
 | |
| 		next_page(1);
 | |
| 	}
 | |
| 	return sheet.full();
 | |
| }
 | |
| 
 | |
| bool TPA_mask::check_full_fields() const
 | |
| {
 | |
| 	// Controllo ogni campo che sia valorizzato
 | |
| 	FOR_EACH_MASK_FIELD(*this, i, f)
 | |
| 	{
 | |
| 		if (!f->on_key(K_ENTER))
 | |
| 			return false;
 | |
| 	}
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| 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 char stato = d.stato();
 | |
| 	const TTipo_documento& td = d.tipo(); // cached_tipodoc(d.get(DOC_TIPODOC));
 | |
| 	// Mi precarico la tabella dei documenti scelti
 | |
| 	FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), nr, row)
 | |
| 	{
 | |
| 		if (codnum.compare(row->get(_codnum)) == 0 &&		// Codice numerazione
 | |
| 			tipodoc.compare(row->get(_tipodoc)) == 0 &&		// Tipo documento
 | |
| 			td.reg_fisc().full() &&													// Regime fiscale
 | |
| 			row->get_char(_dastato) <= stato &&						// Da stato
 | |
| 			row->get_char(_astato) >= stato)							// A stato
 | |
| 			return true;
 | |
| 	}
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| void TPA_mask::set_err_paf()
 | |
| {
 | |
| 	// Vado a riportare sui paf l'errore
 | |
| 	TSheet_field& sfld = sfield(F_DOCS);
 | |
| 	TString_array& sht = sfld.rows_array();
 | |
| 	TLocalisamfile fdoc(LF_DOC);
 | |
| 	if (!sht.empty())
 | |
| 	{
 | |
| 		TProgress_monitor pi(sht.items(), "Cambio stato 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);
 | |
| 
 | |
| 				// Ricontrollo che la fattura sia presente in Campo prima di cambiare stato
 | |
| 				fdoc.zero();
 | |
| 				fdoc.put(DOC_PROVV, key.provv());
 | |
| 				fdoc.put(DOC_ANNO, key.anno());
 | |
| 				fdoc.put(DOC_CODNUM, key.codnum());
 | |
| 				fdoc.put(DOC_NDOC, key.ndoc());
 | |
| 
 | |
| 				TString hfatt, bfatt;
 | |
| 				TPaf_record paf0100f("PAF0100F");
 | |
| 				if (fdoc.read() == NOERR && chiave_paf_doc(fdoc.curr(), hfatt, bfatt) && paf0100f.search(nullptr, hfatt, 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.";
 | |
| 						error_box(err);
 | |
| 					}
 | |
| 					
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					TString err = "Impossibile trovare la fattura "; err << anno << " " << codnum << " " << ndoc << "\nVerrà saltata.";
 | |
| 					error_box(err);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		fp_db().sq_commit();
 | |
| 	}
 | |
| 	force_reload_sheet();
 | |
| }
 | |
| 
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////////////
 | |
| // TDoc2Paf
 | |
| /////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| class TDoc2Paf : public TSkeleton_application
 | |
| {
 | |
| 
 | |
| public:
 | |
| 	virtual bool create();
 | |
| 	virtual bool destroy();
 | |
| 	virtual void main_loop();
 | |
| 
 | |
| 	TDoc2Paf() {}
 | |
| };
 | |
| 
 | |
| void TDoc2Paf::main_loop()
 | |
| {
 | |
| 	while (TPA_mask().run() == K_ENTER) {}
 | |
| }
 | |
| 
 | |
| bool TDoc2Paf::create()
 | |
| {
 | |
| 	open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG,
 | |
| 	           LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE,
 | |
| 	           LF_DOC, LF_RIGHEDOC, LF_CODCORR, LF_ANAMAG, 0);
 | |
| 
 | |
| 	const TRectype cfven(LF_CFVEN);
 | |
| 	if (cfven.length(CFV_PADESTIN) != 7) // Nuova lunghezza per privati
 | |
| 		return error_box(TR("Database non convertito per fatturazione F.P."));
 | |
| 
 | |
| 	return check_tables() && TSkeleton_application::create();
 | |
| }
 | |
| 
 | |
| bool TDoc2Paf::destroy()
 | |
| {
 | |
| 	fp_db().sq_disconnect();
 | |
| 	return TSkeleton_application::destroy();
 | |
| }
 | |
| 
 | |
| int fp0300(int argc, char* argv[])
 | |
| {
 | |
| 	TDoc2Paf d2p;
 | |
| 	d2p.run(argc, argv, TR("Fatturazione F.P."));
 | |
| 	return 0;
 | |
| }
 |