#include "scandich.h"


///////////////////////////////////////////////////////////
// TScandich
///////////////////////////////////////////////////////////

TScandich::TScandich(scantype type)
             : _type(type),   
               _lasterr(NOERR)
{
	// salvo codice dichiarazione in manutenzione
	_dich_prec = get_firm_770();  
	               
	switch (_type)
	{
		case _sel_dich:
			_cnf_user = new TConfig(CONFIG_USER);
	  	break; 
	  case _all_dich:
	  	_base_file = new TLocalisamfile(LF_BASE);  
	  	_base_file->setkey(1);
	  	break;
	  default:
	  	break;	
	}			
}

TScandich::~TScandich()
{
  switch (_type)
	{
		case _sel_dich:
	  	delete _cnf_user;
	  	break; 
	  case _all_dich:
	  	delete _base_file;
	  	break;
	  default:
	  	break;	
	}	
			    
	// ripristino codice dichiarazione in manutenzione 
	set_firm_770(_dich_prec);   
}

// @doc EXTERNAL
// @mfunc ritorna il codice della prima dichiarazione da elaborare
long TScandich::first()
{	
	// codice dichiarazione da restituire
	long coddich = 0L;	
	
	// primo codice se richiesto _sel_dich    
	if (_type == _sel_dich)           
	{
		_num_dich = 0;
		coddich = _cnf_user->get_long(DITTE_SEL, "77", _num_dich++); 
		if (coddich == 0L)
			_lasterr = _iseof;
	}	
	                                          
	// primo codice se richiesto _all_dich    
	if (_type == _all_dich)           
	{                                 
		_lasterr = _base_file->first();
		if (_lasterr == NOERR) 
			coddich = _base_file->get_long("CODDITTA");
	}	                                          
		
	return coddich;
}	
	              
// @doc EXTERNAL
// @mfunc ritorna il codice della successiva dichiarazione da elaborare
long TScandich::next()
{	
	// codice dichiarazione da restituire
	long coddich = 0L;	
	
	// codice successivo se richiesto _sel_dich    
	if (_type == _sel_dich)           
	{
		coddich = _cnf_user->get_long(DITTE_SEL, "77", _num_dich++); 
		if (coddich == 0L)
			_lasterr = _iseof;
	}	
	                                          
	// codice successivo se richiesto _all_dich    
	if (_type == _all_dich)           
	{                                 
		_lasterr = _base_file->next();
		if (_lasterr == NOERR)
			// se dichiarazione "dichiarante" forzo fine file
			if (_base_file->get_char("TIPOQUA") == 'D')
				_lasterr = _iseof;
			else
				coddich = _base_file->get_long("CODDITTA");
	}	                                          
		
	return coddich;
}