Patch level : 12.0 476
Files correlati : ve Commento : - Divise le funzioni, adesso non ha più senso tenerle tutte collegate - Rifatta modifica del documento, vedere meglio commenti in checkPlafondRewrite() per le casistiche - Aggiunta eliminazione del documento, tranne in casi particolari avvisa soltanto senza limitare l'utente dal combinare danni git-svn-id: svn://10.65.10.50/branches/R_10_00@24193 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									556dc28d00
								
							
						
					
					
						commit
						f152762e16
					
				| @ -528,7 +528,7 @@ int TMotore_application::write( const TMask& m )  // C 90 | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| 	// Aggiunte per il controllo plafond
 | 	// Aggiunte per il controllo plafond
 | ||||||
| 	if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondAvailability(d) == -1) | 	if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondWrite(d) == -1) | ||||||
| 	{ | 	{ | ||||||
| 		return _isnowarning; | 		return _isnowarning; | ||||||
| 	} | 	} | ||||||
| @ -564,7 +564,7 @@ int TMotore_application::rewrite( const TMask& m ) // C 90 | |||||||
|   d = ((TDocumento_mask&)m).doc(); // Trasferisce il documento da maschera a record
 |   d = ((TDocumento_mask&)m).doc(); // Trasferisce il documento da maschera a record
 | ||||||
| 
 | 
 | ||||||
| 	// Aggiunte per il controllo plafond
 | 	// Aggiunte per il controllo plafond
 | ||||||
| 	if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondAvailability(d, true) == -1) | 	if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondRewrite(d) == -1) | ||||||
| 	{ | 	{ | ||||||
| 		return _isnowarning; | 		return _isnowarning; | ||||||
| 	} | 	} | ||||||
| @ -583,12 +583,15 @@ int TMotore_application::rewrite( const TMask& m ) // C 90 | |||||||
| bool TMotore_application::remove() // C 90
 | bool TMotore_application::remove() // C 90
 | ||||||
| { | { | ||||||
|   TDocumento& d = (TDocumento &) _rel->curr(); |   TDocumento& d = (TDocumento &) _rel->curr(); | ||||||
| 
 | 	bool ok = checkPlafondDelete(d); | ||||||
|  | 	if(ok) | ||||||
|  | 	{ | ||||||
| 		d.put(DOC_NOTE, "DELETING"); | 		d.put(DOC_NOTE, "DELETING"); | ||||||
| 		do_elab(d); | 		do_elab(d); | ||||||
|   const bool ok = TRelation_application::remove(); | 		ok = TRelation_application::remove(); | ||||||
| 		if(ok) | 		if(ok) | ||||||
| 			edit_mask().save_father_rows(); | 			edit_mask().save_father_rows(); | ||||||
|  | 	} | ||||||
| 	return ok; | 	return ok; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1296,15 +1299,13 @@ void TMotore_application::preview() | |||||||
|   save_and_print(true, screenvis); |   save_and_print(true, screenvis); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExist) | int TMotore_application::checkPlafondWrite(TDocumento& d) | ||||||
| { | { | ||||||
| 	TLi_manager plafond(d.tipocf(), d.codcf(), d.data()); | 	TLi_manager plafond(d.tipocf(), d.codcf(), d.data()); | ||||||
| 	if(!plafond.hasValidPlafond())	// Se il cliente non mi interessa
 | 	if(!plafond.hasValidPlafond())	// Se il cliente non mi interessa
 | ||||||
| 		return NOERR; | 		return NOERR; | ||||||
| 
 | 
 | ||||||
| 	TAssoc_array tabIva = d.tabella_iva(true); | 	TAssoc_array tabIva = d.tabella_iva(true); | ||||||
| 	TDocumento oldDoc; |  | ||||||
| 	bool recalc = false; |  | ||||||
| 
 | 
 | ||||||
| 	real plaUtil = ZERO; | 	real plaUtil = ZERO; | ||||||
| 
 | 
 | ||||||
| @ -1316,44 +1317,11 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Se il documento è già stato scritto nel DB sottraggo solo le modifiche
 | 	if(plaUtil <= ZERO) | ||||||
| 	if(alreadyExist) |  | ||||||
| 	{ | 	{ | ||||||
| 		// Prima di tutto controllo che non stia salvando la stessa roba che ho già, confronto il totale dei plafond con il totale da calcolare
 |  | ||||||
| 		TToken_string lePlafs(d.get("PLAFOND"), ','); |  | ||||||
| 		real totPlaf = ZERO; |  | ||||||
| 		for(int i = 0; i < lePlafs.items(); i++) |  | ||||||
| 		{ |  | ||||||
| 			// É + ottimizzato rispetto a farlo in una linea sola?
 |  | ||||||
| 			//static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i);
 |  | ||||||
| 			totPlaf += (real)((TToken_string)lePlafs.get(i)).get(_plimporto); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Se sono uguali esco
 |  | ||||||
| 		if(totPlaf == plaUtil) |  | ||||||
| 		return NOERR; | 		return NOERR; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 		oldDoc = TDocumento('D', d.anno(), d.numerazione(), d.numero()); |  | ||||||
| 		// Prima di tutto controllo che siano modificabili tutti i documenti dopo di lui
 |  | ||||||
| 		// Visto che ho delle funzioni già pronti in TLi_manager gli passo il controllo
 |  | ||||||
| 		switch(plafond.checkEditability(oldDoc)) |  | ||||||
| 		{ |  | ||||||
| 		case -1: |  | ||||||
| 			// ERRORE!
 |  | ||||||
| 			error_box("Impossibile modificare il documento, ci sono presenti altri documenti non modificabili successivamente"); |  | ||||||
| 			return -1; |  | ||||||
| 		case 1: |  | ||||||
| 			// Altri documenti!
 |  | ||||||
| 			if(!yesno_box("Attenzione!! Sono presenti altri documenti successivi a questo, per continuare bisogna ricalcolarli tutti!\nVuoi continuare?")) |  | ||||||
| 				return -1; |  | ||||||
| 			else |  | ||||||
| 				recalc = true; |  | ||||||
| 			// Notare la mancanza del break
 |  | ||||||
| 		case 0: |  | ||||||
| 		default: |  | ||||||
| 			plafond.stornaDoc(oldDoc, true); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	real plaRes = plafond.getPlaRes(); | 	real plaRes = plafond.getPlaRes(); | ||||||
| 
 | 
 | ||||||
| 	TToken_string used; | 	TToken_string used; | ||||||
| @ -1361,7 +1329,7 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi | |||||||
| 	{ | 	{ | ||||||
| 		used = plafond.incrPlaf(d, plaUtil, true); | 		used = plafond.incrPlaf(d, plaUtil, true); | ||||||
| 	} | 	} | ||||||
| 	else if(plaRes - plaUtil >= ZERO) | 	else | ||||||
| 	{ | 	{ | ||||||
| 		// Il controllo è andato bene, adesso mi segno i plafond che ho utilizzato nel memo del documento
 | 		// Il controllo è andato bene, adesso mi segno i plafond che ho utilizzato nel memo del documento
 | ||||||
| 		used = plafond.consPlaf(plaUtil, true); | 		used = plafond.consPlaf(plaUtil, true); | ||||||
| @ -1377,15 +1345,180 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi | |||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		if(recalc) |  | ||||||
| 		{ |  | ||||||
| 			// Insert some cool code here
 |  | ||||||
| 		} |  | ||||||
| 		d.put("PLAFOND", used); | 		d.put("PLAFOND", used); | ||||||
| 		return NOERR; | 		return NOERR; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | int TMotore_application::checkPlafondRewrite(TDocumento& d) | ||||||
|  | { | ||||||
|  | 	TLi_manager plafond(d.tipocf(), d.codcf(), d.data()); | ||||||
|  | 	if(!plafond.hasValidPlafond())	// Se il cliente non mi interessa
 | ||||||
|  | 		return NOERR; | ||||||
|  | 
 | ||||||
|  | 	TAssoc_array tabIva = d.tabella_iva(true); | ||||||
|  | 	TDocumento oldDoc; | ||||||
|  | 
 | ||||||
|  | 	real plaUtil = ZERO; | ||||||
|  | 
 | ||||||
|  | 	for (TRiepilogo_iva * totali = (TRiepilogo_iva *) tabIva.get(); totali != NULL; totali = (TRiepilogo_iva *) tabIva.get()) | ||||||
|  | 		if(plafond.checkIva(totali->cod_iva().codice()))	// Se l'iva del documento è diversa non mi interessa
 | ||||||
|  | 			plaUtil += totali->imp_orig(); | ||||||
|  | 
 | ||||||
|  | 	if(plaUtil <= ZERO) | ||||||
|  | 		return NOERR; | ||||||
|  | 
 | ||||||
|  | 	// Prima di tutto controllo che non stia salvando la stessa roba che ho già, confronto il totale dei plafond con il totale da calcolare
 | ||||||
|  | 	TToken_string lePlafs(d.get("PLAFOND"), ','); | ||||||
|  | 	real totPlaf = ZERO; | ||||||
|  | 	for(int i = 0; i < lePlafs.items(); i++) | ||||||
|  | 	{ | ||||||
|  | 		// É + ottimizzato rispetto a farlo in una linea sola?
 | ||||||
|  | 		//static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i);
 | ||||||
|  | 		totPlaf += (real)((TToken_string)lePlafs.get(i)).get(_plimporto); | ||||||
|  | 	} | ||||||
|  | 		 | ||||||
|  | 	// Calcolo le differenze tra il plafond attuale da verificare e quello precedente
 | ||||||
|  | 	if(totPlaf == plaUtil) | ||||||
|  | 		return NOERR; | ||||||
|  | 	 | ||||||
|  | 	real plaRes = plafond.getPlaRes(); | ||||||
|  | 	TToken_string used; | ||||||
|  | 	/* Devo gestire queste modifiche dividendo in 4 parti:
 | ||||||
|  | 	 * 1) > vecchio Doc : faccio la differenza nuovo - vecchio e provo a generare un used nuovo | ||||||
|  | 	 * 2) > vecchio NC	: aggiungo alla parte che già storno | ||||||
|  | 	 * 3) < vecchio Doc : storno parte del plafond già utilizzato | ||||||
|  | 	 * 4) < vecchio NC	: verifico che il plafond stornato con questa NC non sia stato utilizzato, in caso negativo tutto OK, positivo blocco. | ||||||
|  | 	 */ | ||||||
|  | 	if(totPlaf < plaUtil) | ||||||
|  | 	{ | ||||||
|  | 		if(d.tipo().nota_credito())	// 2
 | ||||||
|  | 		{ | ||||||
|  | 			plaUtil -= totPlaf; | ||||||
|  | 			used = plafond.incrPlaf(d, plaUtil, true); | ||||||
|  | 		} | ||||||
|  | 		else	// 1
 | ||||||
|  | 		{ | ||||||
|  | 			plaUtil -= totPlaf; | ||||||
|  | 			used = plafond.consPlaf(plaUtil, true); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		if(d.tipo().nota_credito()) // 4
 | ||||||
|  | 		{ | ||||||
|  | 			if(plafond.checkUtilizzo(d, plaUtil)) | ||||||
|  | 			{ | ||||||
|  | 				TString msg = "Attenzione! Si sta cercando di modificare una Nota di Credito che influisce le seguenti lettere di intento: \n"; | ||||||
|  | 				for(int i = 0; i < lePlafs.items(); i++) | ||||||
|  | 				{ | ||||||
|  | 					msg << i+1 << " - N." <<  lePlafs.get(_plnumprot) << "\n"; | ||||||
|  | 				} | ||||||
|  | 				msg << "Vuoi continuare?"; | ||||||
|  | 				if(yesno_box(msg)) | ||||||
|  | 				{ | ||||||
|  | 					used = plafond.stornaDoc(d, totPlaf - plaUtil, true); | ||||||
|  | 				} | ||||||
|  | 				else | ||||||
|  | 					return -1; | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 				return -1; | ||||||
|  | 		} | ||||||
|  | 		else	// 3
 | ||||||
|  | 		{ | ||||||
|  | 			used = plafond.stornaDoc(d, totPlaf - plaUtil, true); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(used.starts_with("ERRORE")) | ||||||
|  | 	{ | ||||||
|  | 		plafond.revertModifiche(); | ||||||
|  | 		warning_box(used); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		d.put("PLAFOND", used); | ||||||
|  | 		return NOERR; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool TMotore_application::checkPlafondDelete(TDocumento& d) | ||||||
|  | { | ||||||
|  | 	TLi_manager plafond(d.tipocf(), d.codcf(), d.data()); | ||||||
|  | 	if(d.get("PLAFOND").blank() || !plafond.hasValidPlafond())	// Se la fattura non ha nulla scritto in plafond non mi interessa
 | ||||||
|  | 		return true; | ||||||
|  | 
 | ||||||
|  | 	TAssoc_array tabIva = d.tabella_iva(true); | ||||||
|  | 	TDocumento oldDoc; | ||||||
|  | 
 | ||||||
|  | 	// Prima di tutto controllo che non stia salvando la stessa roba che ho già, confronto il totale dei plafond con il totale da calcolare
 | ||||||
|  | 	TToken_string lePlafs(d.get("PLAFOND"), ','); | ||||||
|  | 	real totPlaf = ZERO; | ||||||
|  | 	for(int i = 0; i < lePlafs.items(); i++) | ||||||
|  | 	{ | ||||||
|  | 		// É + ottimizzato rispetto a farlo in una linea sola?
 | ||||||
|  | 		//static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i);
 | ||||||
|  | 		totPlaf += (real)((TToken_string)lePlafs.get(i)).get(_plimporto); | ||||||
|  | 	} | ||||||
|  | 		 | ||||||
|  | 	// Calcolo le differenze tra il plafond attuale da verificare e quello precedente
 | ||||||
|  | 	if(totPlaf == ZERO) | ||||||
|  | 		return true; | ||||||
|  | 	 | ||||||
|  | 	real plaRes = plafond.getPlaRes(); | ||||||
|  | 	TToken_string used; | ||||||
|  | 	/* Devo gestire queste modifiche dividendo in 4 parti:
 | ||||||
|  | 	 * 1) < vecchio Doc : storno parte del plafond già utilizzato | ||||||
|  | 	 * 2) < vecchio NC	: verifico che il plafond stornato con questa NC non sia stato utilizzato, in caso negativo tutto OK, positivo blocco. | ||||||
|  | 	 */ | ||||||
|  | 	if(d.tipo().nota_credito()) // 2
 | ||||||
|  | 	{ | ||||||
|  | 		if(plafond.checkUtilizzo(d, totPlaf)) | ||||||
|  | 		{ | ||||||
|  | 			TString msg = "Attenzione! Si sta cercando di modificare una Nota di Credito che influisce le seguenti lettere di intento: \n"; | ||||||
|  | 			for(int i = 0; i < lePlafs.items(); i++) | ||||||
|  | 			{ | ||||||
|  | 				TToken_string thisPlaf(lePlafs.get(i)); | ||||||
|  | 				msg << i+1 << " - N." <<  thisPlaf.get(_plnumprot) << "\n"; | ||||||
|  | 			} | ||||||
|  | 			msg << "Vuoi continuare?"; | ||||||
|  | 			if(yesno_box(msg)) | ||||||
|  | 			{ | ||||||
|  | 				used = plafond.stornaDoc(d, totPlaf, true); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 				return false; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			return false; | ||||||
|  | 	} | ||||||
|  | 	else	// 1
 | ||||||
|  | 	{ | ||||||
|  | 		real plafSto = ZERO; | ||||||
|  | 		for(int i = 0; i < lePlafs.items(); i++) | ||||||
|  | 		{ | ||||||
|  | 			TToken_string thisPlaf(lePlafs.get(i)); | ||||||
|  | 			plafSto += static_cast<real>(thisPlaf.get(_plNC)); | ||||||
|  | 		} | ||||||
|  | 		if(plafSto > ZERO) | ||||||
|  | 		{ | ||||||
|  | 			if(!yesno_box(TR("Attenzione! Si sta cercando di eliminare un documento per cui sono presenti una o più note di variazione per un totale di %s€\nContinuare?"), TCurrency(plafSto).string())) | ||||||
|  | 				return false; | ||||||
|  | 		} | ||||||
|  | 		used = plafond.stornaDoc(d, totPlaf, true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(used.starts_with("ERRORE")) | ||||||
|  | 	{ | ||||||
|  | 		plafond.revertModifiche(); | ||||||
|  | 		warning_box(used); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 	return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int ve0100( int argc, char* argv[]) | int ve0100( int argc, char* argv[]) | ||||||
| { | { | ||||||
|   TMotore_application a; |   TMotore_application a; | ||||||
|  | |||||||
| @ -108,7 +108,10 @@ public: | |||||||
|    |    | ||||||
|   virtual const char* get_next_key( ); |   virtual const char* get_next_key( ); | ||||||
| 
 | 
 | ||||||
| 	int checkPlafondAvailability(TDocumento& d, bool alreadyExist = false);		// Controllo aggiunto dal modulo Li per verificare la disponibilità di plafond
 | 	// Test Plafond
 | ||||||
|  | 	int checkPlafondWrite(TDocumento& d); | ||||||
|  | 	int checkPlafondRewrite(TDocumento& d); | ||||||
|  | 	bool checkPlafondDelete(TDocumento& d); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| inline TMotore_application& app() { return (TMotore_application &) main_app(); } | inline TMotore_application& app() { return (TMotore_application &) main_app(); } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user