diff --git a/at/at0200.cpp b/at/at0200.cpp
index ebd4111d1..0b9d09c0b 100755
--- a/at/at0200.cpp
+++ b/at/at0200.cpp
@@ -65,6 +65,7 @@ protected:
 	bool check_sog_sheet(const char* codsog);	
 	static bool nome_handler(TMask_field& f, KEY k);
 	static bool codice_handler(TMask_field& f, KEY k);
+	static bool tipodon_handler(TMask_field& f, KEY k);
 	static bool soggetti_notify(TSheet_field& s, int r, KEY k);
 	void add_rows_soggetti(TSheet_field& s, int count = 20, int start = 0);
 	static bool ins_controlli_handler(TMask_field& f, KEY k);
@@ -117,6 +118,7 @@ bool TGiornalieroDC::create()
 	ss.set_notify(soggetti_notify);
 	ss.sheet_mask().set_handler(F_S_NOME,nome_handler);
 	ss.sheet_mask().set_handler(F_S_CODICE,codice_handler);
+	ss.sheet_mask().set_handler(F_S_TIPODON,tipodon_handler);
   TConfig config(CONFIG_STUDIO);
   _numdon1 = config.get_int("NumDon1");
   _numdon2 = config.get_int("NumDon2");
@@ -136,17 +138,17 @@ bool TGiornalieroDC::create()
 }	
 
 bool TGiornalieroDC::destroy()	
-{
+{                          
+	delete _asoggetti;
+	delete _sidoneita;
+	delete _scontrolli;
+	delete _sdonazioni;
+	delete _rconvoc;
+	delete _idoneita;
+	delete _contsan;
+	delete _donaz;	
 	delete _rel;
 	delete _msk;
-	delete _donaz;
-	delete _contsan;
-	delete _idoneita;
-	delete _rconvoc;
-	delete _sdonazioni;
-	delete _scontrolli;
-	delete _sidoneita;
-	delete _asoggetti;
 	return TApplication::destroy();
 }
 
@@ -494,6 +496,29 @@ int TGiornalieroDC::write(TSheet_field& s)
 					bool id_af = FALSE;		// il soggetto � idoneo per af?
 					
 				  modstato = modstato_tcs(stato);
+				  /*
+					if (!(modstato == 'I' || modstato == 'F'))	// il soggetto non � idoneo
+					{
+		    		TTable tcs("TCS"); 
+	  	  		tcs.put("CODTAB",stato);
+	    			if (tcs.read() == NOERR)
+	    			{
+	    				if (tcs.get("S7").not_empty())
+	    				{
+								TRectype* keyc = new TRectype(LF_CONTSAN);
+								keyc->put(CON_CODICE, row.get(0));
+								int err = _scontrolli->read(keyc);
+								if (err == NOERR)
+								{
+									int r=_scontrolli->rows();
+									TDate dataultid
+									while (r>=1 &&
+	    					
+	    					modstato = modstato_tcs(stato);
+	    				}
+						}											
+					}				  
+					*/
 					if (modstato == 'I' || modstato == 'F')	// il soggetto � idoneo
 					{ 
 						id_si = (is_idon(id1,id2,id3,id4,IDON_SI) && intsi != 0);		// il soggetto � idoneo SI
@@ -585,15 +610,16 @@ int TGiornalieroDC::write(TSheet_field& s)
     			if (ctd.read() == NOERR)
     			{
     				bool dimissione = ctd.get_bool("B0");
-						if (dimissione)
-							sog.put(SOG_CATDON,ctd.get("S6"));		    				
-						else               
+						if (dimissione)          
 						{
-							if ((catdon == _catini1 || _catini1.empty()) && (totdon+1>=_numdon1) && _catfin1.not_empty())
-								sog.put(SOG_CATDON, _catfin1);
-							if ((catdon == _catini2 || _catini2.empty()) && (totdon+1>=_numdon2) && _catfin2.not_empty() && !_sttess2)
-								sog.put(SOG_CATDON, _catfin2);
-						}
+							sog.put(SOG_CATDON,ctd.get("S6"));		    				
+							if (ctd.get("S6").not_empty())
+								catdon = ctd.get("S6");							
+						}							
+						if ((catdon == _catini1 || _catini1.empty()) && (totdon+1>=_numdon1) && _catfin1.not_empty())
+							sog.put(SOG_CATDON, _catfin1);
+						if ((catdon == _catini2 || _catini2.empty()) && (totdon+1>=_numdon2) && _catfin2.not_empty() && (!_sttess2 || dimissione))
+							sog.put(SOG_CATDON, _catfin2);
 				  }
 				  TDate dataisc = sog.get_date(SOG_DATAISC);
 				  if (dataisc.empty() && _dataisc)
@@ -762,45 +788,153 @@ bool TGiornalieroDC::codice_handler(TMask_field& f, KEY k)
   			m.set(F_S_CODSEZ, sog.get(SOG_CODSEZ));
   			m.set(F_S_CODSOT, sog.get(SOG_CODSOT));
   			m.set(F_S_CATDON, sog.get(SOG_CATDON));
+  			/*
   			if (!(app()._ricerca))
   			{
 	  			const int totdon = sog.get_int(SOG_TOTDON);
 	  			if (totdon == 0)
 	  				m.set(F_S_PRIMADON, 'X');
-					TTable ctd("CTD");
-					ctd.zero();
-					ctd.put("CODTAB", sog.get(SOG_CATDON));
-					if (ctd.read() == NOERR)
-					{           
-	  				bool dimissione = ctd.get_bool("B0");
-						if (dimissione)            
-						{
-							TString16 catcoll = ctd.get("S6");
-							if (catcoll.empty())
-								messaggio << "Soggetto dimesso senza categoria collegata\n";							
+					if (!app()._nomessage)
+					{
+						TTable ctd("CTD");
+						ctd.zero();
+						ctd.put("CODTAB", sog.get(SOG_CATDON));
+						if (ctd.read() == NOERR)
+						{           
+		  				bool dimissione = ctd.get_bool("B0");
+							if (dimissione)            
+							{
+								TString16 catcoll = ctd.get("S6");
+								if (catcoll.empty())
+									messaggio << "Soggetto dimesso senza categoria collegata\n";							
+								else
+									messaggio << "Soggetto dimesso, cambio categoria automatico\n";
+							}						
+						}
+						TString16 stato = sog.get(SOG_STATO);
+		  			char modstato = modstato_tcs(stato);
+						if (modstato == 'I' || modstato == 'F')	// il soggetto � idoneo
+						{          
+							TDate datapros(NULLDATE);
+							TString16 tipodon = app().get_mask().get(F_TIPODON);
+							TDate datadon = app().get_mask().get_date(F_DATADON);
+							if (is_donaz(tipodon,IDON_SI))
+								datapros = sog.get_date(SOG_DATAPROSSI);
 							else
-								messaggio << "Soggetto dimesso, cambio categoria automatico\n";
+								datapros = sog.get_date(SOG_DATAPROSAF);											
+							if (datapros.empty())
+									messaggio << "Soggetto non idoneo al tipo donazione\n";
+							else
+								if (datapros > datadon)
+									messaggio << "Il soggetto ha donato prima della scadenza del " << datapros.string() << "\n";
+						}
+						else
+						{
+							messaggio << "Stato soggetto " << stato << " non compatibile con la donazione\n";	
+		    			TTable tcs("TCS"); 
+	  	  			tcs.put("CODTAB",stato);
+	    				if (tcs.read() == NOERR)
+	    				{
+	    					if (tcs.get("S7").empty())
+									messaggio << "Verificare la situazione del soggetto";
+								else
+									messaggio << "Cambio stato automatico";
+							}														
 						}						
-					}
-					TString16 stato = sog.get(SOG_STATO);
-	  			char modstato = modstato_tcs(stato);
-					if (modstato == 'I' || modstato == 'F')	// il soggetto � idoneo
-					{          
-						TDate datapros(NULLDATE);
-						TString16 tipodon = app().get_mask().get(F_TIPODON);
-						TDate datadon = app().get_mask().get_date(F_DATADON);
-						if (is_donaz(tipodon,IDON_SI))
-							datapros = sog.get_date(SOG_DATAPROSSI);
+					}						
+				}						
+				*/				
+			}  			
+			else
+				ok = FALSE; // codice non esistente  			
+	  	//if (messaggio.not_empty() && !app()._ricerca && !app()._nomessage)
+  		//	warning_box(messaggio);
+		}  			
+  }	
+  return ok;
+}
+
+bool TGiornalieroDC::tipodon_handler(TMask_field& f, KEY k)
+{
+	bool ok = TRUE;
+  if (f.to_check(k))
+  {                          
+  	TString256 messaggio = "";
+  	TMask& m = f.mask();
+  	long codsog = m.get_long(F_S_CODICE);
+  	if (codsog != 0)
+  	{
+			TLocalisamfile& sog = app().get_relation()->lfile();
+  		sog.setkey(1);	
+			sog.zero();
+			sog.put(SOG_CODICE, codsog);
+			int err = sog.read();
+			if (err == NOERR)
+			{
+				/*
+  			m.set(F_S_COGNOME, sog.get(SOG_COGNOME));
+  			m.set(F_S_NOME, sog.get(SOG_NOME));
+  			m.set(F_S_DATANASC, sog.get(SOG_DATANASC));
+  			m.set(F_S_TESSAVIS, sog.get(SOG_TESSAVIS));
+  			m.set(F_S_CODSEZ, sog.get(SOG_CODSEZ));
+  			m.set(F_S_CODSOT, sog.get(SOG_CODSOT));
+  			m.set(F_S_CATDON, sog.get(SOG_CATDON));
+  			*/
+  			if (!(app()._ricerca))
+  			{
+	  			const int totdon = sog.get_int(SOG_TOTDON);
+	  			if (totdon == 0)
+	  				m.set(F_S_PRIMADON, 'X');
+					if (!app()._nomessage)
+					{
+						TTable ctd("CTD");
+						ctd.zero();
+						ctd.put("CODTAB", sog.get(SOG_CATDON));
+						if (ctd.read() == NOERR)
+						{           
+		  				bool dimissione = ctd.get_bool("B0");
+							if (dimissione)            
+							{
+								TString16 catcoll = ctd.get("S6");
+								if (catcoll.empty())
+									messaggio << "Soggetto dimesso senza categoria collegata\n";							
+								else
+									messaggio << "Soggetto dimesso, cambio categoria automatico\n";
+							}						
+						}
+						TString16 stato = sog.get(SOG_STATO);
+		  			char modstato = modstato_tcs(stato);
+						if (modstato == 'I' || modstato == 'F')	// il soggetto � idoneo
+						{          
+							TDate datapros(NULLDATE);
+							TString16 tipodon = m.get(F_S_TIPODON);
+							if (tipodon.empty())
+								tipodon = app().get_mask().get(F_TIPODON);
+							TDate datadon = app().get_mask().get_date(F_DATADON);
+							if (is_donaz(tipodon,IDON_SI))
+								datapros = sog.get_date(SOG_DATAPROSSI);
+							else
+								datapros = sog.get_date(SOG_DATAPROSAF);											
+							if (datapros.empty())
+									messaggio << "Soggetto non idoneo al tipo donazione\n";
+							else
+								if (datapros > datadon)
+									messaggio << "Il soggetto ha donato prima della scadenza del " << datapros.string() << "\n";
+						}
 						else
-							datapros = sog.get_date(SOG_DATAPROSAF);											
-						if (datapros.empty())
-								messaggio << "Soggetto non idoneo al tipo donazione\n";
-						else
-							if (datapros > datadon)
-								messaggio << "Il soggetto ha donato prima della scadenza\n";
-					}
-					else
-						messaggio << "Stato soggetto non compatibile con la donazione\n";	
+						{
+							messaggio << "Stato soggetto " << stato << " non compatibile con la donazione\n";	
+		    			TTable tcs("TCS"); 
+	  	  			tcs.put("CODTAB",stato);
+	    				if (tcs.read() == NOERR)
+	    				{
+	    					if (tcs.get("S7").empty())
+									messaggio << "Verificare la situazione del soggetto";
+								else
+									messaggio << "Cambio stato automatico";
+							}														
+						}						
+					}						
 				}						
 			}  			
 			else
@@ -812,7 +946,6 @@ bool TGiornalieroDC::codice_handler(TMask_field& f, KEY k)
   }	
   return ok;
 }
-
 		
 int at0200(int argc, char* argv[])
 {