Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 873 git-svn-id: svn://10.65.10.50/trunk@15151 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1074 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1074 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <form.h>
 | ||
| #include <msksheet.h>
 | ||
| #include <progind.h>
 | ||
| #include <relapp.h>
 | ||
| #include <utility.h>
 | ||
| 
 | ||
| #include "at4.h"
 | ||
| #include "atlib.h"
 | ||
| 
 | ||
| // nomi campi maschera
 | ||
| #include "at4500a.h"
 | ||
|           
 | ||
| // nomi dei campi
 | ||
| #include "soggetti.h"
 | ||
| #include "sezioni.h"
 | ||
| #include "convoc.h"
 | ||
| #include "rconvoc.h"
 | ||
| 
 | ||
| #define ALIAS_CTD -700
 | ||
| #define ALIAS_TCS -200
 | ||
| #define IDON_SI "SI"
 | ||
| #define IDON_AF "AF"
 | ||
|        
 | ||
| class TGestioneConvocazioni: public TRelation_application
 | ||
| {
 | ||
| 	static bool filter_func_convoc(const TRelation* rel);
 | ||
| 
 | ||
| 	TMask*					_msk;
 | ||
| 	TRelation*   		_rel;
 | ||
| 	TRelation*   		_tmprel;
 | ||
| 	TRelation*			_relsog;
 | ||
| 	TCursor*				_cur;						// cursore per selezione soggetti
 | ||
| 	TIsamtempfile*  _tmpconv;
 | ||
| 	TIsamtempfile*  _tmprconv;
 | ||
| 	TLocalisamfile* _rconvoc;
 | ||
| 	TLocalisamfile* _soggetti;
 | ||
| 	TLocalisamfile* _sezioni;
 | ||
| 	TRecord_array*	_sconvocati;		// sheet convocati
 | ||
| 	long 						_lastcod;				// progressivo convocazione da assegnare
 | ||
| 	long						_numero;				// numero convocazione
 | ||
| 	TDate						_data; 					// data convocazione
 | ||
| 	TString16				_punto;					// punto di prelievo
 | ||
| 	TString16				_tipo;					// tipo donazione
 | ||
| 	TString16				_codsez;				// codice sezione convocata
 | ||
| 	TString16				_codsot;				// codice sottogruppo
 | ||
| 	TString16				_modconv;				// modalita di convocazione
 | ||
| 	TDate						_dataini;
 | ||
| 	bool						_tutti, _ritarda;		
 | ||
| 	int							_maxrit;
 | ||
| 	bool						_inserimento;	 
 | ||
| 	TBit_array			_modified;
 | ||
|               
 | ||
| protected:
 | ||
| 	virtual bool user_create();
 | ||
| 	virtual bool user_destroy();
 | ||
| 	virtual const char* get_next_key();
 | ||
| 	virtual int scrivi(const TMask& m, bool ri);
 | ||
| 	virtual int write(const TMask& m);
 | ||
| 	virtual int rewrite(const TMask& m);
 | ||
| 	virtual int read(TMask& m);
 | ||
| 	virtual bool remove();
 | ||
| 	virtual bool changing_mask(int mode) { return FALSE; }
 | ||
| 	virtual TMask* get_mask( int mode = 0) { return _msk; }
 | ||
| 	virtual TRelation* get_relation() const { return _rel; }
 | ||
|   virtual void init_query_insert_mode(TMask& m);
 | ||
|   virtual void init_query_mode(TMask& m) { _inserimento = FALSE; init_query_insert_mode(m);};
 | ||
|   virtual void init_modify_mode(TMask& m);
 | ||
|   virtual void init_insert_mode(TMask& m) { _inserimento = TRUE; init_modify_mode(m); }
 | ||
| 	
 | ||
| 	static bool nome_handler(TMask_field& f, KEY k);
 | ||
| 	static bool codice_handler(TMask_field& f, KEY k);
 | ||
| 	static bool convocati_notify(TSheet_field& s, int r, KEY k);
 | ||
| 	static bool esegui_handler(TMask_field& f, KEY k);
 | ||
| 	static bool sistampa_handler(TMask_field& f, KEY k);
 | ||
| 	static bool nostampa_handler(TMask_field& f, KEY k);
 | ||
| 	static bool data_handler(TMask_field&f, KEY k);
 | ||
| 	static bool dataini_handler(TMask_field&f, KEY k);
 | ||
| 	static bool sezione_handler(TMask_field&f, KEY k);
 | ||
| 	
 | ||
| public:
 | ||
| 	virtual void print();       
 | ||
| 	TGestioneConvocazioni() {}
 | ||
| 	
 | ||
| };
 | ||
| 
 | ||
| HIDDEN inline TGestioneConvocazioni& app() { return (TGestioneConvocazioni&) main_app(); }
 | ||
| 
 | ||
| void TGestioneConvocazioni::init_query_insert_mode(TMask& m)
 | ||
| {
 | ||
|   disable_menu_item(M_FILE_NEW);
 | ||
|   m.hide(-1);
 | ||
|   m.show(-2); 
 | ||
|   m.enable(-3); 
 | ||
| }
 | ||
| 
 | ||
| void TGestioneConvocazioni::init_modify_mode(TMask& m)
 | ||
| {
 | ||
|   m.show(-1);
 | ||
|   m.hide(-2);
 | ||
|   if (app()._inserimento)
 | ||
|   {
 | ||
|   	m.enable(-3);
 | ||
| 		m.set(F_TUTTI, TRUE);				
 | ||
| 		m.set(F_MODCONV, "PO");				
 | ||
|   }	 
 | ||
|   else
 | ||
|   	m.disable(-3); 
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::filter_func_convoc(const TRelation* rel)
 | ||
| {   
 | ||
| 	bool filtrato = FALSE;
 | ||
| 	TRectype& sog = rel->curr();
 | ||
| 	const long codice = sog.get_long(SOG_CODICE);
 | ||
| 	const TString16 cat = sog.get(SOG_CATDON);
 | ||
| 	const char stato = modstato_tcs(sog.get(SOG_STATO));
 | ||
| 	const TString16 escluso = sog.get(SOG_ESCLUSO);
 | ||
| 	const TString16 modconv = sog.get(SOG_MODCONV);
 | ||
| 	const bool dimesso = rel->lfile(ALIAS_CTD).get_bool("B0");	
 | ||
| 	filtrato = (cat.not_empty() && (stato == 'I' || stato == 'F') && !dimesso && escluso.empty());
 | ||
| 	if (filtrato)
 | ||
| 		filtrato = ((modconv.empty()) || (modconv == app()._modconv) || (modconv == "IN"));
 | ||
| 	if (filtrato)
 | ||
| 	{
 | ||
| 		filtrato = FALSE;
 | ||
| 		const TString16 punto = sog.get(SOG_PUNTORACC);
 | ||
| 		const TString16 codsez = sog.get(SOG_CODSEZ);
 | ||
| 		const TString16 codsot = sog.get(SOG_CODSOT);
 | ||
| 		if (app()._codsez.not_empty())
 | ||
| 		{
 | ||
| 			filtrato = (codsez == app()._codsez);
 | ||
| 			if ((filtrato) && (app()._codsot.not_empty()))
 | ||
| 				filtrato = (codsot == app()._codsot);			
 | ||
| 			if (filtrato)
 | ||
| 				filtrato = ((punto == app()._punto) || punto.empty());
 | ||
| 		}				
 | ||
| 		else
 | ||
| 				filtrato = (punto == app()._punto);
 | ||
| 		if (app()._tutti && !filtrato)
 | ||
| 			filtrato = (punto == app()._punto);
 | ||
| 						
 | ||
| 		// filtro per data prossima donazione
 | ||
| 		//const TDate dataprossi = sog.get(SOG_DATAPROSSI);
 | ||
| 		//filtrato = (dataprossi.ok()) && (dataprossi <= data) && filtrato;
 | ||
| 		// filtro per intervallo tra cartoline/solleciti/ritardatari
 | ||
| 		if (filtrato)
 | ||
| 		{ 
 | ||
| 			filtrato = FALSE;
 | ||
| 			const TDate data = app()._data;
 | ||
| 			//TDate data = app()._dataini; prima era cosi'
 | ||
| 			const int numconv = sog.get_int(SOG_NUMCONV);
 | ||
| 			const TDate dataultconv = sog.get(SOG_DATACONV);
 | ||
| 			const TDate dataultsol = sog.get(SOG_DATAULTSOL);
 | ||
| 			TRectype& sez = rel->curr(LF_SEZIONI);
 | ||
| 			const int giocarsol = sez.get_int(SEZ_GIOCARSOL);
 | ||
| 			const int giosolsol = sez.get_int(SEZ_GIOSOLSOL);
 | ||
| 			const int gioultsol = sez.get_int(SEZ_GIOULTSOL);
 | ||
| 			const int giorit = sez.get_int(SEZ_GIOPERRIT);
 | ||
| 			const int numsol = sez.get_int(SEZ_NUMMAXSOL);
 | ||
| 			if (numconv == 0)
 | ||
| 				filtrato = TRUE;
 | ||
| 			else			
 | ||
| 				if ((numconv == 1) && (data-dataultconv>=giocarsol))
 | ||
| 					filtrato = TRUE;
 | ||
| 				else
 | ||
| 					if ((numconv >= 2 && numconv <= numsol-1) && (data-dataultconv >= giosolsol))
 | ||
| 						filtrato = TRUE;
 | ||
| 					else
 | ||
| 						if ((numconv == numsol && numsol > 0) && (data-dataultconv >= gioultsol))
 | ||
| 							filtrato = TRUE;
 | ||
| 						else
 | ||
| 							if ((numconv > numsol && numsol > 0) && (app()._ritarda) && (data-dataultsol<=app()._maxrit) && (data-dataultconv>=giorit))
 | ||
| 				      	filtrato = TRUE;
 | ||
| 		}			      	
 | ||
| 	}		
 | ||
|   return filtrato;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::sezione_handler(TMask_field& f, KEY k)
 | ||
| { 
 | ||
| 	if (f.to_check(k))
 | ||
| 	{
 | ||
| 		TMask& m = f.mask();
 | ||
| 		if (m.get(F_DATAINI).empty() && (m.mode() == MODE_INS))
 | ||
| 		//if (m.mode() == MODE_INS)
 | ||
| 		{
 | ||
| 			//const TString16 codsez = m.get(F_CODSEZ);
 | ||
| 			//const TString16 codsot = m.get(F_CODSOT);		
 | ||
| 			TLocalisamfile sez(LF_SEZIONI);
 | ||
| 			sez.setkey(1);
 | ||
| 			TRectype& recsez = sez.curr();
 | ||
| 			recsez.zero();
 | ||
| 			recsez.put(SEZ_CODSEZ, m.get(F_CODSEZ));
 | ||
| 			recsez.put(SEZ_CODSOT, m.get(F_CODSOT));
 | ||
| 			if (sez.read() == NOERR)
 | ||
| 			{
 | ||
| 				TDate data = sez.get_date(SEZ_DATAULTCON);
 | ||
| 				++data;
 | ||
| 				if (data <= m.get_date(F_DATA) && data.ok())
 | ||
| 				{
 | ||
| 					m.set(F_DATAINI, data);				
 | ||
| 					m.check_field(F_DATAINI);
 | ||
| 				}					
 | ||
| 			}			
 | ||
| 		}			
 | ||
| 	}
 | ||
| 	return TRUE;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::data_handler(TMask_field& f, KEY k)
 | ||
| {
 | ||
| 	if (f.to_check(k))
 | ||
| 	{
 | ||
| 		const TDate data = f.get();
 | ||
| 		const int giorno = data.wday();
 | ||
| 		TString16 datagio = "";
 | ||
| 		switch (giorno)
 | ||
| 		{
 | ||
| 			case 1:
 | ||
| 				datagio = "Lunedi";
 | ||
| 			break;
 | ||
| 			case 2:
 | ||
| 				datagio = "Martedi";
 | ||
| 			break;
 | ||
| 			case 3:
 | ||
| 				datagio = "Mercoledi";
 | ||
| 			break;
 | ||
| 			case 4:
 | ||
| 				datagio = "Giovedi";
 | ||
| 			break;
 | ||
| 			case 5:
 | ||
| 				datagio = "Venerdi";
 | ||
| 			break;
 | ||
| 			case 6:
 | ||
| 				datagio = "Sabato";
 | ||
| 			break;
 | ||
| 			case 7:
 | ||
| 				datagio = "Domenica";
 | ||
| 			break;
 | ||
| 		}
 | ||
| 		f.mask().set(F_DATAGIO,datagio);
 | ||
| 	}
 | ||
| 	return TRUE;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::dataini_handler(TMask_field& f, KEY k)
 | ||
| {
 | ||
| 	if (f.to_check(k))
 | ||
| 	{
 | ||
| 		const TDate data = f.get();
 | ||
| 		if (data > f.mask().get_date(F_DATA))
 | ||
| 			return f.error_box("ATTENZIONE! La data iniziale non puo' essere superiore alla data finale");
 | ||
| 		const int giorno = data.wday();
 | ||
| 		TString16 datagio = "";
 | ||
| 		switch (giorno)
 | ||
| 		{
 | ||
| 			case 1:
 | ||
| 				datagio = "Lunedi";
 | ||
| 			break;
 | ||
| 			case 2:
 | ||
| 				datagio = "Martedi";
 | ||
| 			break;
 | ||
| 			case 3:
 | ||
| 				datagio = "Mercoledi";
 | ||
| 			break;
 | ||
| 			case 4:
 | ||
| 				datagio = "Giovedi";
 | ||
| 			break;
 | ||
| 			case 5:
 | ||
| 				datagio = "Venerdi";
 | ||
| 			break;
 | ||
| 			case 6:
 | ||
| 				datagio = "Sabato";
 | ||
| 			break;
 | ||
| 			case 7:
 | ||
| 				datagio = "Domenica";
 | ||
| 			break;
 | ||
| 		}
 | ||
| 		f.mask().set(F_DATAINIGIO,datagio);
 | ||
| 	}
 | ||
| 	return TRUE;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::esegui_handler(TMask_field& f, KEY k)
 | ||
| {
 | ||
| 	if (k == K_SPACE)
 | ||
| 	{
 | ||
| 		f.disable();
 | ||
| 		TMask& m = f.mask();
 | ||
| 		TCursor* cur = app()._cur;
 | ||
| 		app()._numero	 = m.get_long(F_NUMERO);		                     
 | ||
| 	 	app()._data		 = m.get(F_DATA);
 | ||
| 		app()._punto	 = m.get(F_PUNTO);
 | ||
| 		app()._tutti	 = m.get_bool(F_TUTTI);
 | ||
| 		app()._tipo		 = m.get(F_TIPO);
 | ||
| 		app()._codsez	 = m.get(F_CODSEZ);
 | ||
| 		app()._codsot	 = m.get(F_CODSOT);
 | ||
| 	 	app()._dataini = m.get(F_DATAINI);
 | ||
| 	 	if (app()._dataini.empty())
 | ||
| 	 		app()._dataini = app()._data;
 | ||
| 	 	app()._ritarda = m.get_bool(F_RITARDA);
 | ||
| 	 	app()._maxrit  = m.get_int(F_MAXRIT);
 | ||
| 	 	app()._modconv  = m.get(F_MODCONV);
 | ||
| 		if (app()._numero == 0 || !app()._data.ok() || app()._punto.empty() || app()._tipo.empty())
 | ||
| 			return f.error_box("Mancano i dati fondamentali per la convocazione");
 | ||
|     const TDate data = app()._data;
 | ||
|     const TDate dataini = app()._dataini;
 | ||
|     TDate datalimite = dataini;
 | ||
|     datalimite.set_year(datalimite.year()-2);
 | ||
| 		// filtro per data prossima donazione
 | ||
|   	TRectype da(LF_SOGGETTI);
 | ||
|   	TRectype a(LF_SOGGETTI);
 | ||
| 		da.put(SOG_DATAPROSSI,datalimite);
 | ||
| 		a.put(SOG_DATAPROSSI,data);
 | ||
| 		cur->setregion(da, a);
 | ||
| 		cur->set_filterfunction(filter_func_convoc, TRUE);
 | ||
| 		app()._modified.reset();
 | ||
| 		TSheet_field& s = (TSheet_field&)m.field(F_CONVOCATI);
 | ||
| 		s.destroy();
 | ||
|     TRectype& rec = cur->curr();
 | ||
| 		TRectype& sez = cur->curr(LF_SEZIONI);
 | ||
|     int nconv=0;
 | ||
|     int nsoll=0;
 | ||
|     int nrit=0;
 | ||
|     TDate datasog = data;
 | ||
|    	const int giorni = (int)(data-dataini);	// giorni su cui suddividere la chiamata -1
 | ||
|    	const int dim = giorni+1;
 | ||
|  		int* numperdata = new int[dim];
 | ||
|  		int quanti = ((int)(cur->items())/(giorni+1))+1; // quanti donatori per giorno
 | ||
|  		if (quanti < 1)
 | ||
|  			quanti = 1;
 | ||
|  		for (int i=0; i<giorni+1; i++)
 | ||
|  			numperdata[i] = 0;
 | ||
|     long last = cur->items();   
 | ||
|     int r=0;
 | ||
|     TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30);
 | ||
|     for ( *cur=0; cur->pos() < last; ++(*cur) )
 | ||
|     { 
 | ||
|       prg.addstatus(1);
 | ||
|       TDate datarif(NULLDATE);
 | ||
| 			const int numconv = rec.get_int(SOG_NUMCONV);
 | ||
| 			const TDate dataultconv = rec.get(SOG_DATACONV);
 | ||
| 			const TDate dataultsol = rec.get(SOG_DATAULTSOL);
 | ||
| 			const TDate dataprossi = rec.get(SOG_DATAPROSSI);
 | ||
| 			const int giocarsol = sez.get_int(SEZ_GIOCARSOL);
 | ||
| 			const int giosolsol = sez.get_int(SEZ_GIOSOLSOL);
 | ||
| 			const int gioultsol = sez.get_int(SEZ_GIOULTSOL);
 | ||
| 			const int giorit = sez.get_int(SEZ_GIOPERRIT);
 | ||
| 			const int numsol = sez.get_int(SEZ_NUMMAXSOL);
 | ||
| 			char chiamata = ' ';
 | ||
| 			if (numconv == 0)
 | ||
| 			{
 | ||
| 				chiamata = 'C';
 | ||
| 				datarif = dataprossi;
 | ||
| 			}				
 | ||
| 			else			             
 | ||
| 			{
 | ||
| 				if ((numconv == 1) && (data-dataultconv>=giocarsol))
 | ||
| 				{
 | ||
| 					chiamata = 'S';
 | ||
| 					datarif = dataultconv+(long)giocarsol;
 | ||
| 				}					
 | ||
| 				else                              
 | ||
| 				{
 | ||
| 					if ((numconv >= 2 && numconv <= numsol-1) && (data-dataultconv >= giosolsol))
 | ||
| 					{
 | ||
| 						chiamata = 'S';
 | ||
| 						datarif = dataultconv+(long)giosolsol;
 | ||
| 					}						
 | ||
| 					else
 | ||
| 					{
 | ||
| 						if ((numconv == numsol && numsol > 0) && (data-dataultconv >= gioultsol))
 | ||
| 						{
 | ||
| 							chiamata = 'S';
 | ||
| 							datarif = dataultconv+(long)gioultsol;
 | ||
| 						}							
 | ||
| 						else
 | ||
| 						{
 | ||
| 							if ((numconv > numsol && numsol > 0) && (app()._ritarda) && (data-dataultsol<=app()._maxrit) && (data-dataultconv>=giorit))
 | ||
| 							{
 | ||
| 				      	chiamata = 'R';
 | ||
| 				      	datarif = dataultconv+(long)giorit;
 | ||
| 							}				      	
 | ||
| 						}				      	
 | ||
| 					}				      	
 | ||
| 				}				      	
 | ||
| 			}				      	
 | ||
| 			if (dataprossi<=data)
 | ||
| 			{
 | ||
| 				switch (chiamata)
 | ||
| 				{
 | ||
| 					case 'C':
 | ||
| 						nconv++;
 | ||
| 					break;
 | ||
| 					case 'S':
 | ||
| 						nsoll++;
 | ||
| 					break;
 | ||
| 					case 'R':
 | ||
| 						nrit++;
 | ||
| 					break;
 | ||
| 				}				
 | ||
| 				if (giorni > 0)
 | ||
| 				{
 | ||
| 					datasog = NULLDATE;
 | ||
| 					int partenza;
 | ||
| 					if (datarif <= dataini)
 | ||
| 						partenza = 0;					
 | ||
| 					else  
 | ||
| 						partenza = (int)(datarif-dataini);
 | ||
| 											
 | ||
| 					for (int r=partenza;r<=giorni;r++)
 | ||
| 					{
 | ||
| 						if ((numperdata[r]<quanti) && (!datasog.ok()))
 | ||
| 						{
 | ||
| 							datasog = dataini+(long)(r);
 | ||
| 							numperdata[r]++;
 | ||
| 						}						
 | ||
| 					}					
 | ||
| 					if (!datasog.ok())
 | ||
| 					{
 | ||
| 						//if (dataprossi < dataini)
 | ||
| 						//	datasog = dataini;
 | ||
| 						//else
 | ||
| 						//	datasog = dataprossi;						
 | ||
| 						datasog = datarif;   //aggiunto da Marco in data 24/09/99 per sostituire le azioni commentate in quanto non rispettava gli intervalli fra cartoline
 | ||
| 					}					
 | ||
| 				}
 | ||
| 				TToken_string& row = s.row(r);
 | ||
| 				row.add(rec.get(SOG_CODICE));
 | ||
| 				row.add(rec.get(SOG_COGNOME));
 | ||
| 				row.add(rec.get(SOG_NOME));
 | ||
| 				row.add(datasog);
 | ||
| 				row.add(chiamata);
 | ||
| 				row.add(' '); // stampato
 | ||
| 				row.add(' '); // annullato
 | ||
| 				row.add(rec.get(SOG_DATANASC));
 | ||
| 				row.add(rec.get(SOG_CATDON));
 | ||
| 				row.add(rec.get(SOG_TESSAVIS));
 | ||
| 				row.add(rec.get(SOG_CODSEZ));
 | ||
| 				row.add(rec.get(SOG_CODSOT));
 | ||
| 				row.add(rec.get(SOG_DATAULTDON));
 | ||
| 				row.add(rec.get(SOG_DATAPROSSI));
 | ||
| 	      r++;
 | ||
| 			}	      
 | ||
| 		}
 | ||
| 		m.set(F_NUMCONV,nconv);
 | ||
| 		m.set(F_NUMSOLL,nsoll);
 | ||
| 		m.set(F_NUMRIT,nrit);
 | ||
| 		s.force_update();
 | ||
| 		delete numperdata;
 | ||
| 	}
 | ||
| 	return TRUE;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::sistampa_handler(TMask_field& f, KEY k)
 | ||
| {
 | ||
| 	if (k == K_SPACE)
 | ||
| 	{
 | ||
| 		TSheet_field& s = f.mask().sfield(F_CONVOCATI);
 | ||
| 		const int pos = s.cid2index(F_S_STAMPATO);
 | ||
| 		const int posann = s.cid2index(F_S_ANNULLATO);
 | ||
| 		FOR_EACH_SHEET_ROW(s,r,row)
 | ||
| 			if (row->get(posann)[0] != 'X')			
 | ||
| 				row->add('X',pos);
 | ||
| 		s.force_update();
 | ||
| 	}
 | ||
| 	return TRUE;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::nostampa_handler(TMask_field& f, KEY k)
 | ||
| {
 | ||
| 	if (k == K_SPACE)
 | ||
| 	{
 | ||
| 		TSheet_field& s = f.mask().sfield(F_CONVOCATI);
 | ||
| 		const int pos = s.cid2index(F_S_STAMPATO);
 | ||
| 		const int posann = s.cid2index(F_S_ANNULLATO);
 | ||
| 		FOR_EACH_SHEET_ROW(s,r,row)
 | ||
| 			if (row->get(posann)[0] != 'X')			
 | ||
| 				row->add(' ',pos);
 | ||
| 		s.force_update();
 | ||
| 	}
 | ||
| 	return TRUE;
 | ||
| }
 | ||
|   
 | ||
| bool TGestioneConvocazioni::nome_handler(TMask_field& f, KEY k)
 | ||
| {
 | ||
| 	bool ok = TRUE;
 | ||
|   if (f.to_check(k))
 | ||
|   {
 | ||
|   	TMask& m = f.mask();
 | ||
|   	long codsog = m.get_long(F_S_CODICE);
 | ||
|   	if (codsog == 0)
 | ||
|       f.on_key(K_F9);
 | ||
|   }	
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::codice_handler(TMask_field& f, KEY k)
 | ||
| {
 | ||
| 	bool ok = TRUE;
 | ||
|   if (f.to_check(k))
 | ||
|   {
 | ||
|   	TMask& m = f.mask();
 | ||
|   	long codsog = m.get_long(F_S_CODICE);
 | ||
|   	if (codsog != 0)
 | ||
|   	{
 | ||
| 			TLocalisamfile sog(LF_SOGGETTI); ;
 | ||
|   		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));
 | ||
|   			m.set(F_S_DATAULTDON, sog.get(SOG_DATAULTDON));
 | ||
|   			m.set(F_S_DATAPROSSI, sog.get(SOG_DATAPROSSI));
 | ||
| 			}  			
 | ||
| 			else
 | ||
| 				ok = FALSE; // codice non esistente  			
 | ||
|   	}
 | ||
|   }	
 | ||
|   return ok;
 | ||
| }
 | ||
|   
 | ||
| bool TGestioneConvocazioni::user_create()
 | ||
| {
 | ||
|   _tmpconv = new TIsamtempfile(LF_CONVOC,NULL,TRUE,TRUE);
 | ||
|   _tmprconv = new TIsamtempfile(LF_RCONVOC,NULL,TRUE,TRUE);
 | ||
| 
 | ||
| 	_tmprel = new TRelation(LF_CONVOC);
 | ||
|   _tmprel->add(LF_RCONVOC, "CODICE==CODICE");
 | ||
| 
 | ||
| 	_msk = new TMask("at4500a");
 | ||
| 	_rel = new TRelation(LF_CONVOC);
 | ||
| 	_relsog = new TRelation(LF_SOGGETTI);
 | ||
|   _relsog->add("CTD", "CODTAB==CATDON",1,0,-ALIAS_CTD);
 | ||
|   _relsog->add("TCS", "CODTAB==STATO",1,0,-ALIAS_TCS);
 | ||
|   _relsog->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT");
 | ||
| 	// ordinamento per data prossima donazione  
 | ||
|   _cur = new TCursor(_relsog, "", 5);
 | ||
| 	_rconvoc = new TLocalisamfile(LF_RCONVOC);
 | ||
| 	_soggetti = new TLocalisamfile(LF_SOGGETTI);
 | ||
| 	_sconvocati = new TRecord_array(LF_RCONVOC,RCV_PROGCONV);
 | ||
| 	_msk->set_handler(F_SISTAMPA,sistampa_handler);
 | ||
| 	_msk->set_handler(F_NOSTAMPA,nostampa_handler);
 | ||
| 	_msk->set_handler(F_ESEGUI,esegui_handler);
 | ||
| 	_msk->set_handler(F_DATA,data_handler);	
 | ||
| 	_msk->set_handler(F_DATAINI,dataini_handler);	
 | ||
| 	_msk->set_handler(F_CODSEZ,sezione_handler);
 | ||
| 	_msk->set_handler(F_CODSOT,sezione_handler);
 | ||
| 	TSheet_field& sc = (TSheet_field&)_msk->field(F_CONVOCATI);
 | ||
| 	sc.set_notify(convocati_notify);
 | ||
| 	sc.sheet_mask().set_handler(F_S_NOME,nome_handler);
 | ||
| 	sc.sheet_mask().set_handler(F_S_CODICE,codice_handler);
 | ||
| 	
 | ||
| 	_rel->lfile().last();
 | ||
| 	_lastcod = _rel->lfile().get_long(COV_NUMERO);
 | ||
|   enable_menu_item(M_FILE_PRINT);
 | ||
| 	return TRUE;
 | ||
| }	
 | ||
| 	
 | ||
| bool TGestioneConvocazioni::user_destroy()	
 | ||
| {             
 | ||
| 	delete _sconvocati;
 | ||
| 	delete _soggetti;
 | ||
| 	delete _rconvoc;
 | ||
| 	delete _cur;
 | ||
| 	delete _relsog;
 | ||
| 	delete _rel;
 | ||
| 	delete _msk;
 | ||
| 	delete _tmprel;
 | ||
| 	delete _tmprconv;
 | ||
| 	delete _tmpconv;
 | ||
| 	return TRUE;
 | ||
| }
 | ||
| 
 | ||
| const char* TGestioneConvocazioni::get_next_key()
 | ||
| {
 | ||
| 	// autonumerazione progressiva delle convocazioni
 | ||
| 	_rel->lfile().last();
 | ||
| 	_lastcod = _rel->lfile().get_long(COV_NUMERO);	
 | ||
| 	return format("%d|%ld", F_NUMERO, _lastcod+1 );
 | ||
| }	
 | ||
| 
 | ||
| bool TGestioneConvocazioni::remove()
 | ||
| {
 | ||
|   TWait_cursor hourglass;
 | ||
| 
 | ||
|  	// cancella convocati
 | ||
|  	// cancella testata convocazione
 | ||
|  	bool ok = TRUE;
 | ||
|  	// cancella convocati
 | ||
|  	// prima cancella dall'archivio soggetti la data ultima convocazione
 | ||
| 	TLocalisamfile soggetti(LF_SOGGETTI);
 | ||
| 	soggetti.setkey(1);
 | ||
| 	TLocalisamfile rconvoc(LF_RCONVOC);
 | ||
| 	rconvoc.setkey(3);
 | ||
| 	for (int r=1; r<=_sconvocati->rows(); r++)
 | ||
| 	{
 | ||
| 		const TRectype& riga = _sconvocati->row(r);
 | ||
| 		const long codice = riga.get_long(RCV_CODICE);
 | ||
| 		const TDate dataconv = riga.get_date(RCV_DATACONV);
 | ||
| 		soggetti.put(SOG_CODICE,codice);
 | ||
| 		if (soggetti.read() == NOERR) 
 | ||
| 		{ 
 | ||
| 			const TDate dataprossi = soggetti.get_date(SOG_DATAPROSSI);
 | ||
| 			int numconv = soggetti.get_int(SOG_NUMCONV);
 | ||
| 			if (numconv > 0)
 | ||
| 			{
 | ||
| 				numconv--;
 | ||
| 				soggetti.put(SOG_NUMCONV,numconv);
 | ||
| 				rconvoc.put(RCV_CODICE,codice);
 | ||
| 				rconvoc.put(RCV_DATACONV,dataconv);			
 | ||
| 				if (rconvoc.read() == NOERR)
 | ||
| 				{           
 | ||
| 					bool ok = TRUE;
 | ||
| 					while (ok)
 | ||
| 					{
 | ||
| 						--rconvoc;
 | ||
| 						const long codprec = rconvoc.get_long(RCV_CODICE);
 | ||
| 						if (codprec == codice)
 | ||
| 						{
 | ||
| 							if (rconvoc.get(RCV_ANNULLATO)[0] != 'X')
 | ||
| 							{
 | ||
| 								ok = FALSE;
 | ||
| 								soggetti.put(SOG_DATACONV, rconvoc.get(RCV_DATACONV));
 | ||
| 							}	
 | ||
| 						}	
 | ||
| 						else
 | ||
| 						{
 | ||
| 							ok = FALSE;
 | ||
| 							soggetti.put(SOG_NUMCONV, 0);
 | ||
| 							soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 							soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 						}											
 | ||
| 					}	
 | ||
| 					if (numconv == 1)
 | ||
| 						soggetti.put(SOG_DATAULTSOL, NULLDATE);									
 | ||
| 				}				
 | ||
| 				else
 | ||
| 				{
 | ||
| 					soggetti.put(SOG_NUMCONV, 0);
 | ||
| 					soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 					soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 				}				
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				soggetti.put(SOG_NUMCONV, 0);
 | ||
| 				soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 				soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 			}				
 | ||
| 			const TDate dataconvsog = soggetti.get_date(SOG_DATACONV);
 | ||
| 			if (dataconvsog < dataprossi)
 | ||
| 			{
 | ||
| 				soggetti.put(SOG_NUMCONV, 0);
 | ||
| 				soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 				soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 			}				
 | ||
| 			soggetti.rewrite();
 | ||
| 		}			
 | ||
| 	}
 | ||
| 	int err = _sconvocati->remove();	
 | ||
|   if (err == _iseof || err == _isemptyfile)
 | ||
| 		err = NOERR;
 | ||
| 	if (err == NOERR)
 | ||
| 	{
 | ||
| 		TLocalisamfile sez(LF_SEZIONI);
 | ||
| 		sez.setkey(1);
 | ||
| 		sez.zero();         
 | ||
| 		
 | ||
| 		TMask& m = curr_mask();
 | ||
| 		sez.put(SEZ_CODSEZ, m.get(F_CODSEZ));
 | ||
| 		sez.put(SEZ_CODSOT, m.get(F_CODSOT));
 | ||
| 		if (sez.read() == NOERR)
 | ||
| 		{ 
 | ||
| 			TLocalisamfile convoc(LF_CONVOC);
 | ||
| 			convoc.setkey(3);
 | ||
| 			convoc.put(COV_CODSEZ, m.get(F_CODSEZ));
 | ||
| 			convoc.put(COV_CODSOT, m.get(F_CODSOT));
 | ||
| 			convoc.put(COV_DATA, m.get(F_DATA));
 | ||
| 			convoc.read();			
 | ||
| 			--convoc;
 | ||
| 			TDate dataini = convoc.get_date(COV_DATAINI);
 | ||
| 			TDate datanulla(NULLDATE);
 | ||
| 			while (!convoc.eof() && (dataini == datanulla))
 | ||
| 			{
 | ||
| 				--convoc;
 | ||
| 				dataini = convoc.get_date(COV_DATAINI);
 | ||
| 			}				
 | ||
| 			if ((convoc.get(COV_CODSEZ) == m.get(F_CODSEZ)) && (convoc.get(COV_CODSOT) == m.get(F_CODSOT)))
 | ||
| 				sez.put(SEZ_DATAULTCON, convoc.get_date(COV_DATA));
 | ||
| 			else				
 | ||
| 				sez.put(SEZ_DATAULTCON,NULLDATE);
 | ||
| 			sez.rewrite();
 | ||
| 		}		
 | ||
| 	}	
 | ||
| 	// cancella la testata
 | ||
| 	if (err == NOERR) ok = TRelation_application::remove();
 | ||
| 	return (ok && err == NOERR);
 | ||
| }
 | ||
| 
 | ||
| int TGestioneConvocazioni::read(TMask& m)
 | ||
| {
 | ||
| 	int err = TRelation_application::read(m);
 | ||
| 	if (err == NOERR)
 | ||
| 	{ 
 | ||
| 	  TRectype* key = new TRectype(LF_RCONVOC);
 | ||
| 		key->put(RCV_NUMERO, m.get(F_NUMERO));
 | ||
| 		err = _sconvocati->read(key);
 | ||
| 		if (err == NOERR)
 | ||
| 		{
 | ||
| 			TLocalisamfile soggetti(LF_SOGGETTI);
 | ||
| 			TSheet_field& s = (TSheet_field&)m.field(F_CONVOCATI);
 | ||
| 			app()._modified.reset();
 | ||
| 			s.destroy();
 | ||
| 			for (int r=1; r<=_sconvocati->rows(); r++)
 | ||
| 			{
 | ||
| 				TToken_string& row = s.row(r-1);
 | ||
| 				const TRectype& riga = _sconvocati->row(r);
 | ||
| 				const TString& codice = riga.get(RCV_CODICE);
 | ||
| 				row.add(codice);
 | ||
| 				soggetti.put(SOG_CODICE,codice);
 | ||
| 				if (soggetti.read() != NOERR) 
 | ||
| 					soggetti.zero();
 | ||
| 				row.add(soggetti.get(SOG_COGNOME));
 | ||
| 				row.add(soggetti.get(SOG_NOME));
 | ||
| 				row.add(riga.get(RCV_DATACONV));
 | ||
| 				row.add(riga.get(RCV_CHIAMATA));
 | ||
| 				row.add(riga.get(RCV_STAMPATO));
 | ||
| 				row.add(riga.get(RCV_ANNULLATO));
 | ||
| 				row.add(soggetti.get(SOG_DATANASC));
 | ||
|  				row.add(soggetti.get(SOG_CATDON));
 | ||
| 				row.add(soggetti.get(SOG_TESSAVIS));
 | ||
| 				row.add(soggetti.get(SOG_CODSEZ));
 | ||
| 				row.add(soggetti.get(SOG_CODSOT));
 | ||
| 				row.add(soggetti.get(SOG_DATAULTDON));
 | ||
| 				row.add(soggetti.get(SOG_DATAPROSSI));
 | ||
| 			}
 | ||
| 		}
 | ||
| 		else
 | ||
| 		  if (err == _iseof || err == _isemptyfile)
 | ||
| 		    err = NOERR;
 | ||
| 	}
 | ||
| 	return err;
 | ||
| }
 | ||
| 
 | ||
| int TGestioneConvocazioni::write(const TMask& m)
 | ||
| {  
 | ||
| 	long curcod = m.get_long(F_NUMERO);
 | ||
| 	if (curcod > _lastcod) _lastcod = curcod;
 | ||
| 	_inserimento = FALSE;
 | ||
| 	return TGestioneConvocazioni::scrivi(m, FALSE);	
 | ||
| }
 | ||
| 
 | ||
| int TGestioneConvocazioni::rewrite(const TMask& m)
 | ||
| {
 | ||
| 	return TGestioneConvocazioni::scrivi(m, TRUE);	
 | ||
| }
 | ||
| 
 | ||
| int TGestioneConvocazioni::scrivi(const TMask& m, bool ri)
 | ||
| {                             
 | ||
| 	int err = ri ? TRelation_application::rewrite(m) : TRelation_application::write(m);
 | ||
| 	if (err == NOERR)
 | ||
| 	{
 | ||
| 		TLocalisamfile sez(LF_SEZIONI);
 | ||
| 		sez.setkey(1);
 | ||
| 		sez.zero();
 | ||
| 		sez.put(SEZ_CODSEZ, app()._codsez);
 | ||
| 		sez.put(SEZ_CODSOT, app()._codsot);
 | ||
| 		if (sez.read() == NOERR)
 | ||
| 		{
 | ||
| 			sez.put(SEZ_DATAULTCON, app()._data);
 | ||
| 			sez.rewrite();
 | ||
| 		}		
 | ||
| 		TLocalisamfile soggetti(LF_SOGGETTI);
 | ||
| 		_sconvocati->destroy_rows();
 | ||
| 		TRectype* key = new TRectype(LF_RCONVOC);
 | ||
| 		key->put(RCV_NUMERO, m.get(F_NUMERO));
 | ||
| 		_sconvocati->set_key(key);
 | ||
| 		TSheet_field& s = (TSheet_field&)m.field(F_CONVOCATI);
 | ||
| 		TProgind prg (s.items(), "Registrazione in corso... Prego attendere", FALSE, TRUE, 30);
 | ||
| 		for (int r=s.items(); r>0; r--)
 | ||
| 		{
 | ||
|   	  prg.addstatus(1);
 | ||
| 			TToken_string& row = s.row(r-1);
 | ||
| 			TRectype& rec = _sconvocati->row(r,TRUE);
 | ||
| 			const long codice = row.get_long(0);			
 | ||
| 			const TDate dataconv = row.get(3);
 | ||
| 			const char chiamata = row.get_char(4);
 | ||
| 			const bool annullato = (row.get(6)[0] == 'X');
 | ||
| 			rec.put(RCV_CODICE,codice);
 | ||
| 			rec.put(RCV_DATACONV,dataconv);
 | ||
| 			rec.put(RCV_CHIAMATA,chiamata);
 | ||
| 			rec.put(RCV_STAMPATO,row.get(5));
 | ||
| 			rec.put(RCV_ANNULLATO,row.get(6));
 | ||
| 	  }
 | ||
| 		err = ri ? _sconvocati->rewrite() : _sconvocati->write();
 | ||
| 		if (err == NOERR)
 | ||
| 		{
 | ||
| 			for (int r=s.items(); r>0; r--)
 | ||
| 			{
 | ||
| 	  	  prg.addstatus(1);
 | ||
| 				TToken_string& row = s.row(r-1);
 | ||
| 				//TRectype& rec = _sconvocati->row(r,TRUE);
 | ||
| 				const long codice = row.get_long(0);			
 | ||
| 				const TDate dataconv = row.get(3);
 | ||
| 				const char chiamata = row.get_char(4);
 | ||
| 				const bool annullato = (row.get(6)[0] == 'X');
 | ||
| 				//rec.put(RCV_CODICE,codice);
 | ||
| 				//rec.put(RCV_DATACONV,dataconv);
 | ||
| 				//rec.put(RCV_CHIAMATA,chiamata);
 | ||
| 				//rec.put(RCV_STAMPATO,row.get(5));
 | ||
| 				//rec.put(RCV_ANNULLATO,row.get(6));
 | ||
| 				// aggiornamento archivio soggetti
 | ||
| 				soggetti.put(SOG_CODICE,codice);
 | ||
| 				/* Messo il < invece del != nel primo if, spostato il controllo se sollecito
 | ||
| 					o meno all'interno del controllo sulla data da Marco in data 23/08/99
 | ||
| 				*/
 | ||
| 				if (soggetti.read() == NOERR) 
 | ||
| 				{
 | ||
| 					if (soggetti.get_date(SOG_DATACONV) < dataconv)  //Aggiungo 30/08/99 da qui
 | ||
| 					{
 | ||
| 						if (!_modified[r-1] && (!annullato))
 | ||
| 						{                                                //Fino a qui
 | ||
| 							if (chiamata == 'S')
 | ||
| 								soggetti.put(SOG_DATAULTSOL,dataconv);
 | ||
| 							soggetti.put(SOG_DATACONV,dataconv);
 | ||
| 							int numconv = soggetti.get_int(SOG_NUMCONV);
 | ||
| 							soggetti.put(SOG_NUMCONV,numconv+1);
 | ||
| 						}                                                  //Aggiungo 30/08/99 da qui
 | ||
| 						else
 | ||
| 						{
 | ||
| 							if (_modified[r-1] && (!annullato))
 | ||
| 							{
 | ||
| 								if (chiamata == 'S')
 | ||
| 									soggetti.put(SOG_DATAULTSOL,dataconv);
 | ||
| 								soggetti.put(SOG_DATACONV,dataconv);
 | ||
| 							}                                                       
 | ||
| 							else
 | ||
| 							{
 | ||
| 								if (_modified[r-1] && (annullato))
 | ||
| 								{
 | ||
| 									const TDate dataprossi = soggetti.get_date(SOG_DATAPROSSI);
 | ||
| 									int numconv = soggetti.get_int(SOG_NUMCONV);
 | ||
| 									numconv--;
 | ||
| 									if (numconv > 0)
 | ||
| 										soggetti.put(SOG_NUMCONV,numconv);
 | ||
| 									TRectype da(LF_RCONVOC);
 | ||
| 									da.put(RCV_CODICE,codice);
 | ||
| 									TRectype a(LF_RCONVOC);
 | ||
| 									a.put(RCV_CODICE,codice);
 | ||
| 									TRelation rel(LF_RCONVOC);
 | ||
| 									TCursor cur(&rel,"",3,&da,&a);
 | ||
| 									const TRecnotype convocazioni = cur.items();
 | ||
| 									TRectype& rec = cur.curr();
 | ||
| 									for (TRecnotype pos = convocazioni-2; pos>=0; pos--)
 | ||
| 									{
 | ||
| 										cur = pos;
 | ||
| 										//TRectype& rec = cur.curr();
 | ||
| 										if (rec.get(RCV_ANNULLATO)[0] != 'X')	
 | ||
| 										{
 | ||
| 											soggetti.put(SOG_DATACONV, rec.get(RCV_DATACONV));									
 | ||
| 											break;
 | ||
| 										}
 | ||
| 									}
 | ||
| 									if (pos < 0)
 | ||
| 									{
 | ||
| 										soggetti.put(SOG_NUMCONV, 0);
 | ||
| 										soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 										soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 									}
 | ||
| 									else
 | ||
| 									{
 | ||
| 									 	if (numconv > 1)
 | ||
| 											soggetti.put(SOG_DATAULTSOL, rec.get(RCV_DATACONV));
 | ||
| 										else
 | ||
| 											soggetti.put(SOG_DATAULTSOL, NULLDATE);									
 | ||
| 									}
 | ||
| 									const TDate dataconvsog = soggetti.get_date(SOG_DATACONV);
 | ||
| 									if (dataconvsog < dataprossi)
 | ||
| 									{
 | ||
| 										soggetti.put(SOG_NUMCONV, 0);
 | ||
| 										soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 										soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 									}
 | ||
| 								}		
 | ||
| 							}
 | ||
| 						}																								
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						if ((annullato) && (dataconv == soggetti.get_date(SOG_DATACONV)))
 | ||
| 						{
 | ||
| 							const TDate dataprossi = soggetti.get_date(SOG_DATAPROSSI);
 | ||
| 							int numconv = soggetti.get_int(SOG_NUMCONV);
 | ||
| 							numconv--;
 | ||
| 							if (numconv > 0)
 | ||
| 								soggetti.put(SOG_NUMCONV,numconv);
 | ||
| 							TLocalisamfile rconvoc(LF_RCONVOC);
 | ||
| 							rconvoc.setkey(3);
 | ||
| 							rconvoc.put(RCV_CODICE,codice);
 | ||
| 							rconvoc.put(RCV_DATACONV,dataconv);			
 | ||
| 							if (rconvoc.read() == NOERR)
 | ||
| 							{           
 | ||
| 								bool ok = TRUE;
 | ||
| 								while (ok)
 | ||
| 								{
 | ||
| 									--rconvoc;
 | ||
| 									const long codprec = rconvoc.get_long(RCV_CODICE);
 | ||
| 									if (codprec == codice)
 | ||
| 									{
 | ||
| 										if (rconvoc.get(RCV_ANNULLATO)[0] != 'X')
 | ||
| 										{
 | ||
| 											ok = FALSE;
 | ||
| 											soggetti.put(SOG_DATACONV, rconvoc.get(RCV_DATACONV));
 | ||
| 										}	
 | ||
| 									}	
 | ||
| 									else
 | ||
| 									{
 | ||
| 										ok = FALSE;
 | ||
| 										soggetti.put(SOG_NUMCONV, 0);
 | ||
| 										soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 										soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 									}											
 | ||
| 								}	
 | ||
| 								if (numconv > 1) 
 | ||
| 									soggetti.put(SOG_DATAULTSOL, rconvoc.get(RCV_DATACONV));
 | ||
| 								else
 | ||
| 									soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 							}				
 | ||
| 							const TDate dataconvsog = soggetti.get_date(SOG_DATACONV);
 | ||
| 							if (dataconvsog < dataprossi)
 | ||
| 							{
 | ||
| 								soggetti.put(SOG_NUMCONV, 0);
 | ||
| 								soggetti.put(SOG_DATACONV, NULLDATE);
 | ||
| 								soggetti.put(SOG_DATAULTSOL, NULLDATE);
 | ||
| 							}
 | ||
| 						}
 | ||
| 					}                                               //Fino a qui
 | ||
| 					soggetti.rewrite();
 | ||
| 				}			
 | ||
| 			}
 | ||
| 			//err = ri ? _sconvocati->rewrite() : _sconvocati->write();
 | ||
| 			message_box("Convocazione registrata");
 | ||
| 		}
 | ||
| 		else
 | ||
|   		error_box("Errore %d durante la scrittura. Convocazione non registrata correttamente", err);
 | ||
| 	}	
 | ||
| 	else
 | ||
| 		error_box("Errore %d durante la scrittura. Convocazione non registrata correttamente", err);
 | ||
| 	return err;
 | ||
| }
 | ||
| 
 | ||
| bool TGestioneConvocazioni::convocati_notify(TSheet_field& s, int r, KEY k)
 | ||
| {              
 | ||
| 	static TToken_string oldrow;
 | ||
| 	bool result = TRUE;
 | ||
| 	switch (k)
 | ||
| 	{ 
 | ||
| 	  /* Tolto da Marco in data 26/08/99 in quanto si vuole impedire l'eliminazione di una singola riga
 | ||
| 	  		dello sheet dei convocati
 | ||
| 	  case K_CTRL+K_DEL: // avvenuta cancellazione riga
 | ||
| 		{               
 | ||
| 			int numconv = s.mask().get_int(F_NUMCONV);
 | ||
| 			s.mask().set(F_NUMCONV,numconv-1);
 | ||
| 		}
 | ||
| 		break;                       
 | ||
| 		
 | ||
| 			Aggiunto da Marco in data 26/08/99 per impedire l'eliminazione di una singola riga dallo sheet 
 | ||
| 			dei convocati
 | ||
| 		*/
 | ||
| 		case K_DEL: //richiesta cancellazione riga
 | ||
| 		{
 | ||
| 			message_box("Impossibile eliminare la convocazione di un singolo soggetto!/n Eventualmente annullarla.");
 | ||
| 			result = FALSE;
 | ||
| 		}
 | ||
| 		  break;                    
 | ||
| 		// Aggiunto da Marco in data 26/08/99 per gestire la modifica di una singola convocazione
 | ||
| 		case K_SPACE:
 | ||
| 		{
 | ||
| 		  oldrow = s.row(r);
 | ||
| 		  TDate olddata = oldrow.get(s.cid2index(F_S_DATACONV));   // Le righe seguenti impostano un blocco per impedire di modificare una convocazione che non sia l'ultima per il soggetto
 | ||
| 		  const long codice = oldrow.get_long(0); 
 | ||
| 		  TLocalisamfile soggetti(LF_SOGGETTI);
 | ||
| 		  soggetti.put(SOG_CODICE,codice);
 | ||
| 		  if (soggetti.read() == NOERR)
 | ||
| 		  	  if (olddata != soggetti.get_date(SOG_DATACONV))
 | ||
| 		  	  	{
 | ||
| 		  	  	message_box("Impossibile modificare una convocazione che non sia l'ultima per il soggetto in questione.");
 | ||
| 		  	  	result = FALSE;
 | ||
| 		  	  	s.row(r) = oldrow;
 | ||
| 		  	  	s.force_update();
 | ||
| 		  	  	}
 | ||
| 		}
 | ||
| 		  break;		
 | ||
| 		case K_ENTER:
 | ||
| 		{
 | ||
| 		  TToken_string& newrow = s.row(r);
 | ||
| 		  TDate olddata = oldrow.get(s.cid2index(F_S_DATACONV));
 | ||
| 		  TDate newdata = newrow.get(s.cid2index(F_S_DATACONV));
 | ||
| 		  if (newdata != olddata)
 | ||
| 		  {
 | ||
| 		  	app()._modified.set(r);
 | ||
| 		  }
 | ||
| 		}
 | ||
|       break;
 | ||
| 		case K_CTRL+K_TAB:
 | ||
| 		// uscita riga
 | ||
| 		{ 
 | ||
| 			TToken_string& row = s.row(r);
 | ||
| 			const long codsog = row.get_long(0);
 | ||
| 			if (codsog != 0)
 | ||
| 				for (int i=s.items()-1; i>=0; i--)
 | ||
| 				{
 | ||
| 					if (i != r)
 | ||
| 					{
 | ||
| 						TToken_string& row = s.row(i); 
 | ||
| 						if (codsog == row.get_long(0))
 | ||
| 							return s.sheet_mask().field(F_S_CODICE).error_box("Soggetto gia' inserito");
 | ||
| 					}					
 | ||
| 				}				
 | ||
| 			else
 | ||
| 			{
 | ||
| 				const char* cognome = row.get(1);
 | ||
| 				if ((cognome != NULL) && (cognome != "\0"))
 | ||
| 					s.sheet_mask().field(F_S_NOME).set_focusdirty();
 | ||
| 					//s.set_focus_cell(r,2);
 | ||
| 			}
 | ||
| 		}
 | ||
| 	  break;  	
 | ||
| 		case K_CTRL+K_INS:
 | ||
| 		{
 | ||
| 			int numconv = s.mask().get_int(F_NUMCONV);
 | ||
| 			s.mask().set(F_NUMCONV,numconv+1);
 | ||
| 		}
 | ||
| 		break;
 | ||
| 		case K_INS:
 | ||
| 			result = FALSE;
 | ||
| 		break;
 | ||
| 	}
 | ||
|   return result;  
 | ||
| }
 | ||
| 
 | ||
| void TGestioneConvocazioni::print()
 | ||
| {
 | ||
| 	TForm	elenco("ATCONVOC");
 | ||
| 	TCursor& cur = *elenco.cursor();
 | ||
| 	if (_inserimento)
 | ||
| 	{
 | ||
| 		message_box("Convocazione non registrata; non <20> possibile la stampa");
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 		TLocalisamfile& convoc = cur.file();
 | ||
| 		const long numero = app()._msk->get_long(F_NUMERO);
 | ||
| 		convoc.put(COV_NUMERO, numero);
 | ||
| 		cur.read();
 | ||
| 		elenco.print(-1);
 | ||
| 	}		
 | ||
| }
 | ||
| 
 | ||
| int at4500(int argc, char* argv[])
 | ||
| {
 | ||
| 	TGestioneConvocazioni a;
 | ||
| 	a.run(argc, argv, "Gestione convocazione su punto prelievo");
 | ||
| 	return 0;
 | ||
| } |