Patch level : 12.0 646
Files correlati : ba,cg,fp Commento : - Modificata tabella tabcom, aggiunto campo S13 per vettori - Rifatta gestione vettori per fatture accompagnatorie - Corretti errore pec in esportazione fp - Aggiunta valorizzazione blocco fattura accompagnatoria - Rifatta gestione filtri fattura elettronica con codice numerazione in riga dello sheet - Aggiunte macro per non inviare più documenti a clienti - Aggiunto controllo sullo stato del documento, se non è almeno stampato viene saltato - Aggiunto salto righe con descrizione vuota - Cambiato controllo che l'articolo sia corretto, la funzione ok() non verifica sta cosa - Cambiata valorizzazione codiva per righe descrizione e plafond, così da evitare l'errore in DatiRiepilogoIVA - Aggiunto controllo sul pagamento, adesso non escono più i warning indesiderati
This commit is contained in:
		
							parent
							
								
									30e9c1876a
								
							
						
					
					
						commit
						baef2bfba4
					
				| @ -1,3 +1,3 @@ | ||||
| 4 | ||||
| 1 | ||||
| %tabcom|0|0|1210|0|Tabelle comuni|1500|| | ||||
| %tabcom|0|0|1280|0|Tabelle comuni|1500|| | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| 4 | ||||
| 89 | ||||
| 90 | ||||
| COD|1|3|0| | ||||
| CODTAB|1|25|0| | ||||
| S0|1|70|0| | ||||
| @ -15,6 +15,7 @@ S9|1|5|0| | ||||
| S10|1|5|0| | ||||
| S11|1|5|0| | ||||
| S12|1|5|0| | ||||
| S13|1|70|0| | ||||
| I0|3|7|0| | ||||
| I1|3|7|0| | ||||
| I2|3|7|0| | ||||
|  | ||||
| @ -1667,7 +1667,7 @@ END | ||||
| STRING F_PADESTIN 7 | ||||
| BEGIN | ||||
|   PROMPT 2 19 "Destinatario " | ||||
|   FLAGS "U" | ||||
|   FLAGS "" | ||||
|   MODULES PA,FP | ||||
|   HELP "Codice ufficio dell destinatario della fattura elettronica" | ||||
|   FIELD LF_CFVEN->PADESTIN | ||||
|  | ||||
| @ -8,6 +8,7 @@ | ||||
| #include "cgtbbnp.h" | ||||
| #include "cgtbesc.h" | ||||
| #include "cgtbnot.h" | ||||
| #include "cgtbvet.h" | ||||
| 
 | ||||
| #include "cglib01.h" | ||||
| 
 | ||||
| @ -148,6 +149,13 @@ int CGTTable_application::read(TMask& m) | ||||
|   if (table_name == TAB_NOTECLI) | ||||
|     glue_string(); | ||||
| 
 | ||||
| 	else if (table_name == "%VET" && err == NOERR) | ||||
| 	{ | ||||
| 		// Prendo il vecchio campo della P.IVA e lo sbatto in quello nuovo
 | ||||
| 		if(m.get(F_PAIV).empty()) | ||||
| 			m.set(F_PAIV, get_relation()->curr().get("S3").mid(20, 12)); | ||||
| 	} | ||||
| 
 | ||||
|   return err; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| 
 | ||||
| #define F_CODVETT                            101 | ||||
| #define F_RAGSO                              102 | ||||
| #define F_RAGSOA														 121 | ||||
| #define F_IND                                103 | ||||
| #define F_TEL                                104 | ||||
| #define F_PTEL                               105 | ||||
| @ -16,11 +17,12 @@ | ||||
| #define F_DENCOM                             114 | ||||
| #define F_NUM                                115 | ||||
| #define F_PFAX                               116 | ||||
| #define F_PTELEX                             117 | ||||
| #define F_EORI	                             117 | ||||
| #define F_STATOPAIV                          118 | ||||
| #define F_PAIV                               119 | ||||
| #define F_ALBO                               120 | ||||
| 
 | ||||
| #define F_COFI															 122 | ||||
| #define F_ISFISICA													 123 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -28,37 +28,70 @@ OUTPUT F_RAGSO S0 | ||||
| KEY 1 | ||||
| END | ||||
| 
 | ||||
| STRING F_RAGSO 50 | ||||
| BOOLEAN F_ISFISICA | ||||
| BEGIN | ||||
| PROMPT 2 4 "Ragione sociale " | ||||
| PROMPT 40 2 "Persona Fisica" | ||||
| FIELD B0 | ||||
| HELPT "Indica se è una persona fisica" | ||||
| END | ||||
| 
 | ||||
| STRING F_RAGSO 30 | ||||
| BEGIN | ||||
| PROMPT 2 3 "Cognome/Ragione sociale     " | ||||
| HELP "Ragione sociale del vettore" | ||||
| FIELD S0 | ||||
| FIELD S0[1,30] | ||||
| USE %VET KEY 2 | ||||
| CHECKTYPE REQUIRED | ||||
| INPUT S0 F_RAGSO | ||||
| DISPLAY "Codice vettore" CODTAB | ||||
| DISPLAY "Ragione sociale@50" S0 | ||||
| OUTPUT F_CODVETT CODTAB | ||||
| OUTPUT F_RAGSO S0 | ||||
| OUTPUT F_RAGSO S0[1,30] | ||||
| OUTPUT F_RAGSO S0[31,50] | ||||
| KEY 2 | ||||
| END | ||||
| 
 | ||||
| STRING F_RAGSOA 20 | ||||
| BEGIN | ||||
|   PROMPT 2 4 "Nome/Seconda parte Rag. Soc." | ||||
|   FIELD S0[31,50] | ||||
|   USE %VET KEY 2 | ||||
|   HELP "Seconda parte della ragione sociale o nome" | ||||
|   MESSAGE COPY,6@ | ||||
| END | ||||
| 
 | ||||
| 
 | ||||
| STRING F_STATOPAIV 2 | ||||
| BEGIN | ||||
|   PROMPT 50 50 "Partita IVA " | ||||
|   FLAGS "H" | ||||
| END | ||||
| 
 | ||||
| STRING F_PAIV 12 | ||||
| BEGIN | ||||
|   PROMPT 2 6 "Partita IVA " | ||||
|   FIELD S3[21,32] | ||||
|   HELP "Partita IVA del cliente/fornitore" | ||||
|   VALIDATE PI_FUNC  F_STATOPAIV | ||||
|   CHECKTYPE NORMAL | ||||
|   FIELD S3[49,51] | ||||
|   HELP "Codice ISO dello stato" | ||||
|   FLAGS "U" | ||||
|   USE %SCE | ||||
|   INPUT CODTAB F_STATOPAIV | ||||
|   DISPLAY "Codice" CODTAB | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|   OUTPUT F_STATOPAIV CODTAB | ||||
|   CHECKTYPE REQUIRED | ||||
| END | ||||
| 
 | ||||
| GROUPBOX DLG_NULL 75 7 | ||||
| STRING F_PAIV 28 16 | ||||
| BEGIN | ||||
|   PROMPT 20 6 "" | ||||
|   FIELD S13[1,28] | ||||
|   HELP "Partita IVA del vettore" | ||||
|   VALIDATE PI_FUNC  F_STATOPAIV | ||||
|   CHECKTYPE REQUIRED | ||||
| END | ||||
| 
 | ||||
| STRING F_COFI 16 | ||||
| BEGIN | ||||
|   PROMPT 38 6 "Ident. fiscale" | ||||
|   FIELD S13[29,45] | ||||
|   HELP "Codice fiscale del vettore" | ||||
| END | ||||
| 
 | ||||
| GROUPBOX DLG_NULL 75 8 | ||||
| BEGIN | ||||
|  PROMPT 1 7 "Recapito" | ||||
|  FLAGS "R" | ||||
| @ -165,15 +198,22 @@ BEGIN | ||||
|  FIELD S3[33,48] | ||||
| END | ||||
| 
 | ||||
| GROUPBOX DLG_NULL 75 5 | ||||
| STRING F_EORI 17 | ||||
| BEGIN | ||||
|  PROMPT 1 14 "Numeri telefonici" | ||||
|  PROMPT 2 13 "Codice EORI       " | ||||
|  FIELD S2[1,17] | ||||
|  CHECKTYPE REQUIRED | ||||
| END | ||||
| 
 | ||||
| GROUPBOX DLG_NULL 75 4 | ||||
| BEGIN | ||||
|  PROMPT 1 15 "Numeri telefonici" | ||||
|  FLAGS "R" | ||||
| END | ||||
| 
 | ||||
| STRING F_PTEL 10 | ||||
| BEGIN | ||||
| PROMPT 2 15 "Telefono  " | ||||
| PROMPT 2 16 "Telefono  " | ||||
| HELP "Prefisso telefonico del vettore" | ||||
| FIELD S5[1,10] | ||||
| FLAGS "U" | ||||
| @ -181,7 +221,7 @@ END | ||||
| 
 | ||||
| STRING F_TEL 20 | ||||
| BEGIN | ||||
| PROMPT 30 15 "" | ||||
| PROMPT 30 16 "" | ||||
| HELP "Numero telefonico del vettore" | ||||
| FIELD S3[1,20] | ||||
| FLAGS "U" | ||||
| @ -189,7 +229,7 @@ END | ||||
| 
 | ||||
| STRING F_PFAX 10 | ||||
| BEGIN | ||||
| PROMPT 2 16 "Fax       " | ||||
| PROMPT 2 17 "Fax       " | ||||
| HELP "Numero di Fax del vettore" | ||||
| FIELD S5[11,20] | ||||
| FLAGS "U" | ||||
| @ -197,29 +237,12 @@ END | ||||
| 
 | ||||
| STRING F_FAX 20 | ||||
| BEGIN | ||||
| PROMPT 30 16 "" | ||||
| PROMPT 30 17 "" | ||||
| HELP "Numero di Fax del vettore" | ||||
| FIELD S4 | ||||
| FLAGS "U" | ||||
| END | ||||
| 
 | ||||
| STRING F_PTELEX 10 | ||||
| BEGIN | ||||
| PROMPT 2 17 "Telex     " | ||||
| HELP "Numero di Telex del vettore" | ||||
| FIELD S2[1,10] | ||||
| FLAGS "U" | ||||
| END | ||||
| 
 | ||||
| STRING F_TELEX 20 | ||||
| BEGIN | ||||
| PROMPT 30 17 "" | ||||
| HELP "Numero di Telex del vettore" | ||||
| FIELD S2[11,30] | ||||
| FLAGS "U" | ||||
| END | ||||
| 
 | ||||
| 
 | ||||
| ENDPAGE | ||||
| 
 | ||||
| ENDMASK | ||||
|  | ||||
| @ -12,7 +12,7 @@ | ||||
| #include "fp0.h" | ||||
| #include "fp0300a.h" | ||||
| #include <memory> | ||||
| 
 | ||||
| #include <map> | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Globals
 | ||||
| @ -20,6 +20,7 @@ | ||||
| 
 | ||||
| #define LEN_HFATT 20 | ||||
| #define LEN_BFATT 50 | ||||
| #define MAPPA_DOC_SCELTI map<TString,TToken_string> | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // TPa_mask
 | ||||
| @ -28,12 +29,14 @@ | ||||
| class TPA_mask : public TAutomask | ||||
| { | ||||
| protected: | ||||
| 	enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi}; | ||||
| 
 | ||||
| 	void         set_filter_changed(); | ||||
| 	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_tipo_doc(const TTipo_documento& td); | ||||
| 	bool check_doc_filter(const TDocumentoEsteso& td); | ||||
| 	void fill(); | ||||
| 	void init(); | ||||
| 	bool is_fattura(const TRectype& doc) const; | ||||
| @ -41,7 +44,7 @@ protected: | ||||
| 	void load_all_fields(); | ||||
| 
 | ||||
| 	bool _filter_changed; | ||||
| 	unique_ptr<TToken_string> _tipi_doc_scelti; | ||||
| 	unique_ptr<MAPPA_DOC_SCELTI> _doc_scelti; | ||||
| 
 | ||||
| public: | ||||
| 	TPA_mask() : TAutomask("fp0300a"), _filter_changed(true) | ||||
| @ -66,31 +69,56 @@ 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)); | ||||
| 	ini_set_string(CONFIG_DITTA, "fp", "codnum", get(F_CODNUM)); | ||||
| 	 | ||||
| 	TToken_string tipidocs = get_tmp_string(); | ||||
| 
 | ||||
| 	TToken_string tipidocs(get_tmp_string(), ';'); | ||||
| 	FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r) | ||||
| 	{ | ||||
| 		tipidocs.add(r->get(0)); | ||||
| 		TToken_string app; | ||||
| 		// Prendo tutta la riga tranne il cod sdi
 | ||||
| 		app.add(r->get(_codnum)); | ||||
| 		app.add(r->get(_tipodoc)); | ||||
| 		app.add(r->get(_dastato)); | ||||
| 		app.add(r->get(_astato)); | ||||
| 		tipidocs.add(app); | ||||
| 	} | ||||
| 	ini_set_string(CONFIG_DITTA, "fp", "tipodocs", tipidocs); | ||||
| 	ini_set_string(CONFIG_DITTA, "fp", "accepted_docs", tipidocs); | ||||
| } | ||||
| 
 | ||||
| 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")); | ||||
| 	set(F_CODNUM, ini_get_string(CONFIG_DITTA, "fp", "codnum")); | ||||
| 	TToken_string tipidocs(ini_get_string(CONFIG_DITTA, "fp", "tipodocs")); | ||||
| 
 | ||||
| 	const TToken_string s_accepted_docs(ini_get_string(CONFIG_DITTA, "fp", "accepted_docs"), ';'); | ||||
| 	//
 | ||||
| 	auto& sheet = sfield(F_DOCUMENTI_TIPO); | ||||
| 	sheet.hide(); | ||||
| 	FOR_EACH_STR_TOKEN(tipidocs, tok) | ||||
| 
 | ||||
| 	if(s_accepted_docs.full()) | ||||
| 	{ | ||||
| 		 | ||||
| 		TToken_string& row = sheet.row(-1); | ||||
| 		row.add(tok); | ||||
| 		row.add(TTipo_documento(tok).tipo_doc_sdi()); | ||||
| 		// Nuova gestione avanzata!
 | ||||
| 		FOR_EACH_STR_TOKEN(s_accepted_docs, tok) | ||||
| 		{ | ||||
| 			TToken_string& row = sheet.row(-1); | ||||
| 			row.add(tok); | ||||
| 			row.add(TTipo_documento(tok).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(); | ||||
| @ -119,9 +147,8 @@ TString& add_filter(const TString& field, const TString& from, const TString& to | ||||
| 
 | ||||
| void TPA_mask::fill() | ||||
| { | ||||
| 	save_all_fields(); | ||||
| 	// Pulisco i tipi documento
 | ||||
| 	_tipi_doc_scelti.reset(); | ||||
| 	_doc_scelti.reset(); | ||||
| 
 | ||||
| 	TSheet_field&  docs = sfield(F_DOCS); | ||||
| 	TString_array& sht  = docs.rows_array(); | ||||
| @ -130,6 +157,7 @@ void TPA_mask::fill() | ||||
| 	sht.destroy(); | ||||
| 
 | ||||
| 	const TDate dal             = get(F_DATAINI); | ||||
| 	const TDate al							= get(F_DATAEND); | ||||
| 	TString filter_selected		  = get(F_FATTSEL); | ||||
| 
 | ||||
| #ifdef DBG | ||||
| @ -144,21 +172,18 @@ void TPA_mask::fill() | ||||
| 
 | ||||
| 	TString query; | ||||
| 
 | ||||
| 	query << "USE 33 KEY 3" << | ||||
| 					 "\nSELECT (33.TIPOCF=='C')&&" << | ||||
| 					 "(33.CODNUM==#CODNUM)"; | ||||
| 
 | ||||
| 	query <<	"\nJOIN 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"; | ||||
| 	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("#CODNUM", get(F_CODNUM)); | ||||
| 	rec.set_var("#DADATADOC", get_date(F_DATAINI)); | ||||
| 	rec.set_var("#ADATADOC", get_date(F_DATAEND)); | ||||
| 
 | ||||
| 	rec.set_var("#DADATADOC", dal); | ||||
| 	rec.set_var("#ADATADOC", al); | ||||
| 
 | ||||
| 	TProgress_monitor pi(rec.items(), nullptr); | ||||
| 
 | ||||
| @ -175,8 +200,10 @@ void TPA_mask::fill() | ||||
| 		const TRectype& doc = rec.cursor()->curr(); | ||||
| 		const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); | ||||
| 
 | ||||
| 		// Controllo che la numerazione sia tra quelle giuste
 | ||||
| 
 | ||||
| 		// Controllo che il tipo documento sia OK
 | ||||
| 		if(!check_tipo_doc(td)) | ||||
| 		if(!check_doc_filter(doc)) | ||||
| 				continue; | ||||
| 
 | ||||
| 		bool sent = false; | ||||
| @ -373,20 +400,30 @@ bool TPA_mask::check_full_fields() const | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| bool TPA_mask::check_tipo_doc(const TTipo_documento& td) | ||||
| bool TPA_mask::check_doc_filter(const TDocumentoEsteso& d) | ||||
| { | ||||
| 	const TTipo_documento& td = cached_tipodoc(d.get(DOC_TIPODOC)); | ||||
| 
 | ||||
| 	// Mi precarico la tabella dei documenti scelti
 | ||||
| 	 | ||||
| 	if(_tipi_doc_scelti == nullptr) | ||||
| 	if(_doc_scelti == nullptr) | ||||
| 	{ | ||||
| 		_tipi_doc_scelti.reset(new TToken_string()); | ||||
| 		_doc_scelti.reset(new MAPPA_DOC_SCELTI); | ||||
| 		FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r) | ||||
| 		{ | ||||
| 			_tipi_doc_scelti->add(r->get(0)); | ||||
| 			MAPPA_DOC_SCELTI & app = *_doc_scelti; | ||||
| 			TToken_string& tipi = app[r->get(_codnum)]; | ||||
| 			if(tipi.find(r->get(_tipodoc)) < 0) | ||||
| 			{ | ||||
| 				tipi.add(r->get(_tipodoc)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	// Controllo innanzitutto che sia tra quelli scelti
 | ||||
| 	return _tipi_doc_scelti->find(td.codice()) >= 0 && td.tipo_doc_sdi().full() && td.reg_fisc().full(); | ||||
| 	return | ||||
| 		_doc_scelti->find(d.codice_numerazione().codice()) != _doc_scelti->end() &&	// Esiste il codice numerazione
 | ||||
| 		(*_doc_scelti)[d.codice_numerazione().codice()].find(td.codice()) >= 0 &&  // Se esiste il tipo documento
 | ||||
| 		td.reg_fisc().full();	// Se ha il regime fiscale
 | ||||
| 	 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -2,14 +2,16 @@ | ||||
| #define F_DATAINI   401 | ||||
| #define F_DATAEND   402 | ||||
| #define F_FATTSEL   403 | ||||
| #define F_CODNUM    404 | ||||
| #define END_MASK    499 | ||||
| 
 | ||||
| 
 | ||||
| #define F_DOCUMENTI_TIPO 301 | ||||
| 
 | ||||
| #define S_TIPODOCSEL  101 | ||||
| #define S_TIPODOCSDI  102 | ||||
| #define S_SELCODNUM   101 | ||||
| #define S_TIPODOCSEL  102 | ||||
| #define S_DASTATO     103 | ||||
| #define S_ASTATO      104 | ||||
| #define S_TIPODOCSDI  105 | ||||
| 
 | ||||
| #define F_DOCS     201 | ||||
| 
 | ||||
|  | ||||
| @ -15,40 +15,29 @@ END | ||||
| 
 | ||||
| DATE F_DATAEND | ||||
| BEGIN | ||||
|   PROMPT 40 1 "Data finale " | ||||
|   PROMPT 50 1 "Data finale " | ||||
|   VALIDATE DATE_CMP_FUNC >= F_DATAINI | ||||
|   WARNING "La data finale non può essere minore della data iniziale" | ||||
|   CHECKTYPE REQUIRED | ||||
| END | ||||
| 
 | ||||
| RADIOBUTTON F_FATTSEL 3 35 | ||||
| RADIOBUTTON F_FATTSEL 3 80 | ||||
| BEGIN | ||||
|   PROMPT 1 2 "Fatture da visualizzare" | ||||
|   ITEM "|Da inviare" | ||||
|   ITEM "X|XML Generato" | ||||
|   ITEM "N|Notificato" | ||||
|   ITEM "E|In errore" | ||||
|   FLAGS "Z" | ||||
| END | ||||
| 
 | ||||
| STRING F_CODNUM 4 | ||||
| SPREADSHEET F_DOCUMENTI_TIPO 80 5 | ||||
| BEGIN | ||||
|   PROMPT 40 2 "Numerazione " | ||||
|   HELP "Codice numerazione" | ||||
|   USE %NUM | ||||
|   INPUT CODTAB F_CODNUM | ||||
|   DISPLAY "Codice" CODTAB | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|   OUTPUT F_CODNUM CODTAB | ||||
|   CHECKTYPE REQUIRED | ||||
|   FLAG "UPA" | ||||
|   WARNING "Numerazione assente" | ||||
|   KEY 1 2 | ||||
| END | ||||
| 
 | ||||
| SPREADSHEET F_DOCUMENTI_TIPO 25 5 | ||||
| BEGIN | ||||
|   PROMPT 40 3 "" | ||||
|   PROMPT 1 6 "" | ||||
|   ITEM "Cod Num" | ||||
|   ITEM "Tipo Doc" | ||||
|   ITEM "Stato Iniziale" | ||||
|   ITEM "Stato Finale" | ||||
|   ITEM "Tipo SDI" | ||||
| END | ||||
| 
 | ||||
| @ -68,7 +57,7 @@ BEGIN | ||||
|   ITEM "Data\nDoc.@10" | ||||
|   ITEM "Cliente" | ||||
|   ITEM "Ragione Sociale@50" | ||||
|   ITEM "Codice destinatario" | ||||
|   ITEM "Codice destinatario@20" | ||||
|   ITEM "Riferimento\nAmministrazione@20" | ||||
|   ITEM "Codice Fiscale@16" | ||||
|   ITEM "Scissione\nPagamenti@9" | ||||
| @ -79,11 +68,26 @@ END | ||||
| ENDPAGE | ||||
| ENDMASK | ||||
| 
 | ||||
| PAGE "Riga tipo doc" -1 -1 25 3 | ||||
| PAGE "Riga tipo doc" -1 -1 50 3 | ||||
| 
 | ||||
| STRING S_SELCODNUM 4 | ||||
| BEGIN | ||||
|   PROMPT 1 1 "Numerazione " | ||||
|   HELP "Codice numerazione" | ||||
|   USE %NUM | ||||
|   INPUT CODTAB S_SELCODNUM | ||||
|   DISPLAY "Codice" CODTAB | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|   OUTPUT S_SELCODNUM CODTAB | ||||
|   CHECKTYPE REQUIRED | ||||
|   FLAG "UPA" | ||||
|   WARNING "Numerazione assente" | ||||
|   KEY 1 2 | ||||
| END | ||||
| 
 | ||||
| STRING S_TIPODOCSEL 4 | ||||
| BEGIN | ||||
|   PROMPT 1 1  "Tipo doc    " | ||||
|   PROMPT 15 1  "Tipo doc    " | ||||
|   HELP "Codice tipo documento" | ||||
|   USE %TIP | ||||
|   SELECT S3[37,40]!="" | ||||
| @ -97,9 +101,31 @@ BEGIN | ||||
|   FLAG "UPA" | ||||
| END | ||||
| 
 | ||||
| STRING S_DASTATO 1 | ||||
| BEGIN | ||||
|   PROMPT 1 2 "Da stato " | ||||
|   USE %STD | ||||
|   INPUT CODTAB S_DASTATO | ||||
|   DISPLAY "Codice" CODTAB | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|   OUTPUT S_DASTATO CODTAB   | ||||
|   FLAG "U"   | ||||
| END | ||||
| 
 | ||||
| STRING S_ASTATO 1 | ||||
| BEGIN | ||||
|   PROMPT 15 2 "A stato " | ||||
|   USE %STD | ||||
|   INPUT CODTAB S_ASTATO | ||||
|   DISPLAY "Codice" CODTAB | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|   OUTPUT S_ASTATO CODTAB   | ||||
|   FLAG "U"   | ||||
| END | ||||
| 
 | ||||
| STRING S_TIPODOCSDI 4 | ||||
| BEGIN | ||||
|   PROMPT 1 2  "Tipo Doc SDI" | ||||
|   PROMPT 30 1  "Tipo Doc SDI" | ||||
|   FLAG "D" | ||||
| END | ||||
| 
 | ||||
| @ -181,7 +207,7 @@ BEGIN | ||||
|   FLAGS "D" | ||||
| END | ||||
| 
 | ||||
| STRING S_UFFICIO 20 | ||||
| STRING S_UFFICIO 50 20 | ||||
| BEGIN | ||||
|   PROMPT 1 5 "" | ||||
|   FLAGS "D" | ||||
|  | ||||
| @ -13,6 +13,7 @@ | ||||
| 
 | ||||
| #include "../fe/felib.h" | ||||
| #include "../cg/cglib03.h" | ||||
| #include "../ve/velib04.h" | ||||
| 
 | ||||
| #include <anagiu.h> | ||||
| #include <comuni.h> | ||||
| @ -840,24 +841,37 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 	_hfatt.cut(0); | ||||
| 	_bfatt.cut(0); | ||||
| 
 | ||||
| 	if (!chiave_paf(doc, _hfatt, _bfatt)) | ||||
| 		return false; | ||||
| 	log(-1, _bfatt); | ||||
| 
 | ||||
| #ifndef  DBG | ||||
| 	// Controllo se il documento è almeno in stato di stampa
 | ||||
| 	if (doc.stato() < doc.tipo().stato_finale_stampa()) | ||||
| 	{ | ||||
| 		log(3, "Il documento non è stato ancora stampato, verrà saltato"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 	TAnagrafica clifo(doc.clifor().tipo(), doc.clifor().codice()); | ||||
| 
 | ||||
| 	TString8 coddest = doc.clifor().vendite().get("PADESTIN"); | ||||
| 	TString pec = doc.clifor().get("PEC"); | ||||
| 	TString8 coddest; | ||||
| 	TString pec; | ||||
| 	const bool is_pa = doc.clifor().get_int("ALLEG") == 7; | ||||
| 
 | ||||
| #ifndef DBG | ||||
| 	if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec)) | ||||
| 		return false; | ||||
| #else | ||||
| 	coddest = "WSUHKZ"; | ||||
| #endif | ||||
| 
 | ||||
| 	const bool enapec = coddest == "0000000" && pec.full(); | ||||
| 
 | ||||
| 	const bool privato = coddest.len() != 6; | ||||
| 	bool ok = true; | ||||
| 
 | ||||
| 	if (!chiave_paf(doc, _hfatt, _bfatt)) | ||||
| 			return false; | ||||
| 	log(-1, _bfatt); | ||||
| 
 | ||||
| 	const TFirm&      firm = prefix().firm(); | ||||
| 	const char* const paese = "IT"; | ||||
| 	TCausale          caus = TCausale(doc.tipo().causale(), doc.anno()); | ||||
| @ -881,6 +895,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 	ok &= insert(paf0100f); | ||||
| 	// </DatiTrassmissione>
 | ||||
| 
 | ||||
| #ifndef DBG | ||||
| 	if (enapec) | ||||
| 	{ | ||||
| 			// <Datipec>
 | ||||
| @ -892,6 +907,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 			ok &= insert(paf3200f); | ||||
| 			// </Datipec>
 | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	// <CedentePrestatore>
 | ||||
| 	TPaf_record paf0200f("PAF0200F"); | ||||
| @ -972,12 +988,17 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 	paf0400f.set("P4_KEYBODYFATT", _bfatt); | ||||
| 	remove(paf0400f); | ||||
| 
 | ||||
| #ifndef DBG | ||||
| 	if (cliente.partita_IVA().full()) | ||||
| 	{ | ||||
| 			paf0400f.set("P4_FISCIVAPAESE", cliente.stato_partita_IVA()); | ||||
| 			paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA()); | ||||
| 	} | ||||
| 	paf0400f.set("P4_CODFISC", cliente.codice_fiscale()); | ||||
| #else | ||||
| 	paf0400f.set("P4_FISCIVAPAESE", "IT"); | ||||
| 	paf0400f.set("P4_FISCIVACOD", "00261170039"); | ||||
| #endif | ||||
| 
 | ||||
| 	if (cliente.fisica()) | ||||
| 	{ | ||||
| @ -1179,6 +1200,34 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 			log(1, "CIG e CUP assenti"); | ||||
| 	// <DatiBeniServizi>
 | ||||
| 
 | ||||
| 	// <DatiDDT>
 | ||||
| 	TPaf_record paf1700f("PAF1700F"); | ||||
| 	paf1700f.set("PG_KEYHEADERFATT", _hfatt); | ||||
| 	paf1700f.set("PG_KEYBODYFATT", _bfatt); | ||||
| 	remove(paf1700f); // Cancella la riga del vettore
 | ||||
| 
 | ||||
| 	if(doc.get("CODVETT1").full()) | ||||
| 	{ | ||||
| 		TRectype vet = cache().get("%VET", doc.get("CODVETT1")); | ||||
| 		paf1700f.set("PG_FISCIVAPAESE", vet.get("S3").mid(48,2)); | ||||
| 		paf1700f.set("PG_FISCIVACODICE", vet.get("S13").mid(0, 28)); | ||||
| 		paf1700f.set("PG_CODICEFISCALE", vet.get("S13").mid(28, 16)); | ||||
| 
 | ||||
| 		if (vet.get_bool("B0")) | ||||
| 		{ | ||||
| 			paf1700f.set("PG_ANANOME", vet.get("S0").mid(0, 30)); | ||||
| 			paf1700f.set("PG_ANACOGNOME", vet.get("S0").mid(30, 20)); | ||||
| 		} | ||||
| 		else | ||||
| 			paf1700f.set("PG_ANADENOMINAZ", vet.get("S0").mid(0, 50)); | ||||
| 
 | ||||
| 		paf1700f.set("PG_ANACODEORI", vet.get("S2").mid(0, 17)); | ||||
| 		ok &= insert(paf1700f); | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	// </DatiDDT>
 | ||||
| 
 | ||||
| 	TPaf_record paf1800f("PAF1800F"); | ||||
| 	paf1800f.set("PI_KEYHEADERFATT", _hfatt); | ||||
| 	paf1800f.set("PI_KEYBODYFATT", _bfatt); | ||||
| @ -1217,6 +1266,9 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 			paf1800f.set("PI_KEYBODYFATT", _bfatt); | ||||
| 			paf1800f.set("PI_NUMEROLINEA", ++riga); | ||||
| 
 | ||||
| 			if (descrizione(*rdoc).empty()) | ||||
| 				continue; | ||||
| 
 | ||||
| 			paf3000f.reset(); | ||||
| 			paf3000f.set("PT_KEYHEADERFATT", _hfatt); | ||||
| 			paf3000f.set("PT_KEYBODYFATT", _bfatt); | ||||
| @ -1227,12 +1279,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 			paf1800f.set("PI_QUANTITA", UNO); | ||||
| 			paf1800f.set("PI_PREZZOUNIT", ZERO); | ||||
| 			paf1800f.set("PI_PRZTOTALE", ZERO); | ||||
| 			paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione
 | ||||
| 
 | ||||
| 			// <CodiceArticolo>
 | ||||
| 			long riga_art = 0; | ||||
| 			TArticolo& art = rdoc->articolo(); | ||||
| 			if (art.ok()) | ||||
| 			if (art.full()) | ||||
| 			{ | ||||
| 					paf1900f.reset(); | ||||
| 					paf1900f.set("PY_KEYHEADERFATT", _hfatt); | ||||
| @ -1433,7 +1484,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 			paf1800f.set("PI_QUANTITA", UNO); | ||||
| 			paf1800f.set("PI_PREZZOUNIT", ZERO); | ||||
| 			paf1800f.set("PI_PRZTOTALE", ZERO); | ||||
| 			paf1800f.set("PI_ALIQUOTAIVA", "22.00"); | ||||
| 			set_IVA(codivadefault, paf1800f); | ||||
| 			ok &= insert(paf1800f) && insert(paf3000f); | ||||
| 		} | ||||
| 	} | ||||
| @ -1501,25 +1552,12 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 		paf1800f.set("PI_QUANTITA", UNO); | ||||
| 		paf1800f.set("PI_PREZZOUNIT", ZERO); | ||||
| 		paf1800f.set("PI_PRZTOTALE", ZERO); | ||||
| 		paf1800f.set("PI_ALIQUOTAIVA", "22.00"); | ||||
| 		set_IVA(codivadefault, paf1800f); | ||||
| 		ok &= insert(paf1800f) && insert(paf3000f); | ||||
| 	} | ||||
| 
 | ||||
| 	// </DatiBeniServizi>
 | ||||
| 
 | ||||
| 
 | ||||
| 	// <DatiTrasporto>
 | ||||
| 	TString cod_vettore = doc.get("CODVETT1"); | ||||
| 	// É una fattura accompagnatoria!
 | ||||
| 	if(cod_vettore.full()) | ||||
| 	{ | ||||
| 		TRectype vettore = cache().get("%VET", cod_vettore); | ||||
| 		// Controllo di avere tutto quello che mi interessa
 | ||||
| 
 | ||||
| 	} | ||||
| 	 | ||||
| 	// </DatiTrasporto>
 | ||||
| 
 | ||||
| 	// Salvo la testata
 | ||||
| 	ok &= insert(paf0700f); | ||||
| 
 | ||||
| @ -1583,6 +1621,9 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 	paf2500f.set("PO_CONDPAGAMENTO", rateazione); // Condizione di pagamento PA
 | ||||
| 	paf2500f.set("PO_CODICEPAGAM", pag.code());   // Condizione di pagamento CAMPO   
 | ||||
| 
 | ||||
| 	TRectype cod_pag = cache().get("CPG", doc.pagamento().code()); | ||||
| 	const int tipo_pag = cod_pag.get_int("S4"); | ||||
| 	 | ||||
| 	TString80 iban, istituto; | ||||
| 	TString8  abi, cab; | ||||
| 	if (get_bank(doc, iban, abi, cab, istituto)) | ||||
| @ -1593,21 +1634,20 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 			paf2500f.set("PO_CAB", cab); | ||||
| 	} | ||||
| 
 | ||||
| 	if (cab.blank()) | ||||
| 	if (tipo_pag == 3 && cab.blank())	// Ricevuta bancaria
 | ||||
| 			log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento")); | ||||
| 	else if (iban.blank()) | ||||
| 			log(1, TR("Non è presente il codice IBAN per il pagamento")); | ||||
| 
 | ||||
| 	if ((tipo_pag == 8 || tipo_pag == 9) && iban.blank()) // R.I.D. o Bonifico
 | ||||
| 	{ | ||||
| 		log(1, TR("Non è presente il codice IBAN per il pagamento")); | ||||
| 	} | ||||
| 
 | ||||
| 	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); | ||||
| #ifdef DBG | ||||
| 			bool tolla = true; | ||||
| 			TString pop = cache().get("%CLR", key_class, "S12"); | ||||
| 			bool aaaa = true; | ||||
| #endif | ||||
| 
 | ||||
| 			paf2500f.set("PO_MODALITAPAGAM", cache().get("%CLR", key_class, "S12")); // Si assicura che il numero riga sia accettabile
 | ||||
| 
 | ||||
| 			TToken_string& riga = scad.row(nr);                  // Data|Importo   
 | ||||
| @ -1685,15 +1725,16 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) | ||||
| 	} | ||||
| 	// </DatiPagamento>
 | ||||
| 
 | ||||
| 	// Tabella di non invio XML
 | ||||
| 	TPaf_record pafw300f("PAFW300F"); | ||||
| 	pafw300f.set("PW_KEYHEADERFATT", _hfatt); | ||||
| 	pafw300f.set("PW_KEYBODYFATT", _bfatt); | ||||
| 	remove(pafw300f); // Cancella eventuali allegati
 | ||||
| 	const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); | ||||
| 	const TString codsdi = !td.invio_xml() ? "**********" : (enapec ? pec : coddest); | ||||
| 	pafw300f.set("PW_CODSDI", codsdi); | ||||
| 	ok &= insert(pafw300f); | ||||
| 	if (!cached_tipodoc(doc.get(DOC_TIPODOC)).invio_xml()) | ||||
| 	{ | ||||
| 		// Tabella di non invio XML
 | ||||
| 		TPaf_record pafw300f("PAFW300F"); | ||||
| 		pafw300f.set("PW_KEYHEADERFATT", _hfatt); | ||||
| 		pafw300f.set("PW_KEYBODYFATT", _bfatt); | ||||
| 		remove(pafw300f); | ||||
| 		pafw300f.set("PW_CODSDI", "**********"); | ||||
| 		ok &= insert(pafw300f); | ||||
| 	} | ||||
| 
 | ||||
| 	return _to_commit = (ok && save_paf()); | ||||
| } | ||||
|  | ||||
| @ -102,7 +102,7 @@ private: | ||||
| 
 | ||||
| protected: | ||||
| 	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); | ||||
| 	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; | ||||
| 	const TString&      descrizione(const TRiga_documento& rdoc) const; | ||||
| 	const TRectype& cco(const TRectype&                doc) const; // Contratto/Convenzione/Offerta
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user