353 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			353 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#ifndef __RIGHEDOC_H
 | 
						|
#include "righedoc.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef __VE0100_H
 | 
						|
#include "ve0100.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef __VERIG_H
 | 
						|
#include "verig.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef __VE0100C_H
 | 
						|
#include "ve0100c.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef __SCONTI_H
 | 
						|
#include "sconti.h"
 | 
						|
#endif
 | 
						|
 | 
						|
static void row_set_handler( TMask& m, const int field, const int index )
 | 
						|
{
 | 
						|
  switch ( index )
 | 
						|
  {
 | 
						|
    case 1:
 | 
						|
      m.set_handler( field, dummy_hndl );
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      yesnofatal_box( FALSE, "Funzione di handler sulla riga non definita( %d ).", index );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
static bool riga_des_handler( TMask_field& f, KEY key )
 | 
						|
{
 | 
						|
  TMask& m = f.mask( );
 | 
						|
  // Se qualcuno cerca di modificare la maschera
 | 
						|
  if ( key == K_SPACE && m.is_running( ) )
 | 
						|
  { 
 | 
						|
    TString val( f.get( ) ); 
 | 
						|
    if ( val.len( ) >= 49 )
 | 
						|
    {
 | 
						|
      TMask m1( "VE1000C" );
 | 
						|
      m1.set( 101, f.get( ) );
 | 
						|
      KEY k = m1.run( );
 | 
						|
      if ( k == K_SAVE )
 | 
						|
        f.set( m1.get( 101 ) );
 | 
						|
    }
 | 
						|
  } 
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
static bool riga_art_handler( TMask_field& f, KEY key )
 | 
						|
{
 | 
						|
  TMask& m = f.mask( );
 | 
						|
  // Se qualcuno cerca di modificare la maschera
 | 
						|
  if ( key == K_TAB ) // && m.is_running( ) )
 | 
						|
  { 
 | 
						|
    TSconto_riga r( app( ).clifo( ), &app( ).edit_mask( ), &m );
 | 
						|
    r.calcola( );
 | 
						|
    f.mask( ).set( FR_SCONTO, r.get( ) );
 | 
						|
  } 
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TRiga::load(TSheet_field & f,  TToken_string& row, TRectype * r)
 | 
						|
{
 | 
						|
  if (r)
 | 
						|
    _data = *r;  
 | 
						|
  _data.put( "STATORIGA", row.get( f.cid2index(FR_STATORIGA) ) );
 | 
						|
  _data.put( "TIPORIGA", row.get( f.cid2index(FR_TIPORIGA )) );
 | 
						|
  TString16 codmag(row.get(f.cid2index(FR_CODMAG)));
 | 
						|
    
 | 
						|
  codmag.left_just(3);
 | 
						|
  codmag << row.get( f.cid2index(FR_CODDEP ));
 | 
						|
  _data.put( "CODMAG",  codmag);
 | 
						|
  _data.put( "CODART", row.get( f.cid2index(FR_CODART )) );
 | 
						|
  _data.put( "DESCR", row.get( f.cid2index(FR_DESCR )) );
 | 
						|
  _data.put( "PREZZO", row.get( f.cid2index(FR_PREZZO )) );
 | 
						|
  _data.put( "UMQTA", row.get( f.cid2index(FR_UMQTA )) );
 | 
						|
  _data.put( "QTA", row.get( f.cid2index(FR_QTA )) );
 | 
						|
  _data.put( "QTAEVASA", row.get( f.cid2index(FR_QTAEVASA )) );
 | 
						|
  _data.put( "RIGAEVASA", row.get( f.cid2index(FR_RIGAEVASA )) );
 | 
						|
  _data.put( "TARA", row.get( f.cid2index(FR_TARA )) );
 | 
						|
  _data.put( "PNETTO", row.get( f.cid2index(FR_PNETTO )) );
 | 
						|
  _data.put( "NCOLLI", row.get( f.cid2index(FR_NCOLLI )) );
 | 
						|
  _data.put( "DAEVADERE", row.get( f.cid2index(FR_DAEVADERE )) );  
 | 
						|
  _data.put( "SCONTO", row.get( f.cid2index(FR_SCONTO )) );
 | 
						|
  _data.put( "PERCPROV", row.get( f.cid2index(FR_PERCPROV )) );
 | 
						|
  _data.put( "IMPFISSO", row.get( f.cid2index(FR_IMPFISSO )) );
 | 
						|
  _data.put( "CODIVA", row.get( f.cid2index(FR_CODIVA )) );
 | 
						|
  _data.put( "ADDIVA", row.get( f.cid2index(FR_ADDIVA )) );
 | 
						|
  _data.put( "ASPBENI", row.get( f.cid2index(FR_ASPBENI )) );  
 | 
						|
  carica_profilo( );
 | 
						|
  _piede.destroy( );
 | 
						|
  somma( _piede );  
 | 
						|
// _piede.put( "G1", _piede.string( ) );
 | 
						|
  if (r)
 | 
						|
    *r = _data;
 | 
						|
  
 | 
						|
}
 | 
						|
    
 | 
						|
void TRiga::save(TSheet_field & f, TToken_string& row )
 | 
						|
{
 | 
						|
  row.add( _data.get( "STATORIGA" ), f.cid2index(FR_STATORIGA ));
 | 
						|
  row.add( _data.get( "TIPORIGA" ), f.cid2index(FR_TIPORIGA ));
 | 
						|
  const TString codmag(_data.get("CODMAG"));
 | 
						|
  row.add( codmag.left(3), f.cid2index(FR_CODMAG ));
 | 
						|
  row.add( codmag.mid(3), f.cid2index(FR_CODDEP ));
 | 
						|
  row.add( _data.get( "CODART" ), f.cid2index(FR_CODART ));
 | 
						|
  row.add( _data.get( "DESCR" ), f.cid2index(FR_DESCR ));
 | 
						|
  row.add( _data.get( "UMQTA" ), f.cid2index(FR_UMQTA ));
 | 
						|
  row.add( _data.get( "PREZZO" ), f.cid2index(FR_PREZZO ));
 | 
						|
  row.add( _data.get( "QTA" ), f.cid2index(FR_QTA ));
 | 
						|
  row.add( _data.get( "QTAEVASA" ), f.cid2index(FR_QTAEVASA ));
 | 
						|
  row.add( _data.get( "RIGAEVASA" ), f.cid2index(FR_RIGAEVASA ));
 | 
						|
  row.add( _data.get( "TARA" ), f.cid2index(FR_TARA ));
 | 
						|
  row.add( _data.get( "PNETTO" ), f.cid2index(FR_PNETTO ));
 | 
						|
  row.add( _data.get( "NCOLLI" ), f.cid2index(FR_NCOLLI ));
 | 
						|
  row.add( _data.get( "DAEVADERE" ), f.cid2index(FR_DAEVADERE ));
 | 
						|
  row.add( _data.get( "SCONTO" ), f.cid2index(FR_SCONTO ));
 | 
						|
  row.add( _data.get( "PERCPROV" ), f.cid2index(FR_PERCPROV ));
 | 
						|
  row.add( _data.get( "IMPFISSO" ), f.cid2index(FR_IMPFISSO ));
 | 
						|
  row.add( _data.get( "CODIVA" ), f.cid2index(FR_CODIVA ));
 | 
						|
  row.add( _data.get( "ADDIVA" ), f.cid2index(FR_ADDIVA ));
 | 
						|
  row.add( _data.get( "ASPBENI" ), f.cid2index(FR_ASPBENI ));
 | 
						|
//  row.add( _piede.string( ), f.cid2index(FR_G1 ));  rimettere
 | 
						|
}
 | 
						|
 | 
						|
void TRiga::load( const TRectype& rec )
 | 
						|
{
 | 
						|
  _data = rec;
 | 
						|
  carica_profilo( );
 | 
						|
}
 | 
						|
 | 
						|
void TRiga::save( TRectype& rec )
 | 
						|
{
 | 
						|
  rec = _data;
 | 
						|
}
 | 
						|
 | 
						|
void TRiga::carica_profilo( )
 | 
						|
{
 | 
						|
  if( _pro )
 | 
						|
     delete _pro;              
 | 
						|
  TFilename proname("verig");
 | 
						|
  proname << _data.get("TIPORIGA");
 | 
						|
  proname.ext( "ini" );  
 | 
						|
  _pro = new TConfig( proname );
 | 
						|
}
 | 
						|
 | 
						|
void TRiga::configura_sheet( TSheet_field& f, int numriga )
 | 
						|
{
 | 
						|
  int ncols = _pro->get_int( "NCOLS", "COLUMNS" );
 | 
						|
  // Disabilita tutte le colonne
 | 
						|
  f.disable_cell ( numriga, -1 );
 | 
						|
  // Abilita le colonne indicate nel profilo della riga  
 | 
						|
  for( int i = 1; i <= ncols; i ++ )
 | 
						|
  {
 | 
						|
    TString16 chiave;
 | 
						|
    chiave.format( "%d", i );
 | 
						|
    int coltoenable = _pro->get_int( chiave, "COLUMNS" );
 | 
						|
    f.enable_cell ( numriga, coltoenable);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TRiga::somma( TPiede_documento& piede )
 | 
						|
{
 | 
						|
  // Metti solo i campi numerici poichh sono gli unici che si calcolano
 | 
						|
  //static const TString tabella_campi( "#STATORIGA#TIPORIGA#PROFRIGA#CODMAG#CODART#DESCR#DESCLUNGA#PREZZO#UMQTA#QTA#QTAEVASA#RIGAEVASA#TARA#PNETTO#NCOLLI#DAEVADERE#SCONTO#PERCPROV#IMPFISSO#IMPFISUN#CODIVA#ADDIVA#ASPBENI#" );
 | 
						|
  static const TString tabella_campi( "#PREZZO#QTA#QTAEVASA#TARA#PNETTO#NCOLLI#PERCPROV#" );
 | 
						|
  
 | 
						|
  TToken_string s( _pro->get( "PROGPIEDE", "MAIN" ) );
 | 
						|
  TString16 progpiede( s.get( ) );
 | 
						|
  TTable ppd( "PPD" );
 | 
						|
  while( !progpiede.blank( ) )
 | 
						|
  {
 | 
						|
    TString formula = s.get( );
 | 
						|
    if( formula.blank( ) )
 | 
						|
    { 
 | 
						|
      // Se non h indicata alcuna formula, la prendo dalla tabella piedi
 | 
						|
      ppd.zero( );
 | 
						|
      ppd.put( "CODTAB", progpiede );
 | 
						|
      if( ppd.read( ) == NOERR )
 | 
						|
        formula = ppd.get( "S0" );
 | 
						|
      else
 | 
						|
        yesnofatal_box( "Progressivo piede non definito( %s ).", ( const char * ) progpiede );
 | 
						|
    }
 | 
						|
    // Calcolo la espressione
 | 
						|
    TExpression espr( ""  );
 | 
						|
    if ( espr.set( formula ) )
 | 
						|
    {
 | 
						|
      int last = espr.numvar( );
 | 
						|
      for( int i = 0; i < last; i ++ )
 | 
						|
      {
 | 
						|
        TString varname( espr.varname( i ) );
 | 
						|
        TString cerca;
 | 
						|
        cerca.format( "#%s#", ( const char *)varname );
 | 
						|
        if ( tabella_campi.find( cerca ) != -1 )
 | 
						|
        {
 | 
						|
          real value ( _data.get_real( varname ) );
 | 
						|
          espr.setvar( varname, value );
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          if ( varname[ 0 ] == 'F' || varname[ 0 ] == 'f' )
 | 
						|
          {
 | 
						|
            TString16 nfunz ( varname );
 | 
						|
            nfunz.rtrim( 1 );
 | 
						|
            espr.setvar( varname, atoi( nfunz ) );
 | 
						|
          }
 | 
						|
          else
 | 
						|
          {
 | 
						|
            yesnofatal_box( "Variabile non definita nella funzione di calcolo della riga ( %s ).", ( const char * ) varname );
 | 
						|
            break;
 | 
						|
          }
 | 
						|
        }      
 | 
						|
      }
 | 
						|
      piede.somma( progpiede, espr );
 | 
						|
    }
 | 
						|
    else
 | 
						|
      yesnofatal_box( "Espressione non valida( %s )", ( const char * )formula );
 | 
						|
    progpiede = s.get( );
 | 
						|
  }    
 | 
						|
}
 | 
						|
 | 
						|
void TRiga::sottrai( TPiede_documento& piede )
 | 
						|
{
 | 
						|
  
 | 
						|
  TPiede_documento temp_piede;
 | 
						|
  
 | 
						|
  somma( temp_piede );
 | 
						|
  piede.sottrai( temp_piede );
 | 
						|
}
 | 
						|
 | 
						|
TMask * TRiga::getmask( )
 | 
						|
{           
 | 
						|
                             
 | 
						|
  TString16 msk("verig");
 | 
						|
  msk << _data.get("TIPORIGA");
 | 
						|
  TMask * mask = new TMask( msk );
 | 
						|
  int numhandler = _pro->get_int( "NHANDLER", "HANDLERS" );
 | 
						|
  for( int i = 1; i <= numhandler; i ++ )
 | 
						|
  {
 | 
						|
    TString chiave;
 | 
						|
    chiave.format( "%d", i );
 | 
						|
    TToken_string riga = _pro->get( chiave, "HANDLERS" );
 | 
						|
    row_set_handler( *mask, riga.get_int( 0 ), riga.get_int( 1 ) );
 | 
						|
  }
 | 
						|
  mask->set_handler( FR_DESCR, riga_des_handler );
 | 
						|
  return mask;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TRiga::edit_keys( const KEY key, TPiede_documento& nuovo )
 | 
						|
{
 | 
						|
  static TPiede_documento vecchio;
 | 
						|
  
 | 
						|
  switch( key )
 | 
						|
  {
 | 
						|
    // Inizio modifica
 | 
						|
    case K_SPACE:
 | 
						|
      vecchio.destroy( );
 | 
						|
      somma( vecchio );
 | 
						|
      break;
 | 
						|
      
 | 
						|
    // Cancellazione  
 | 
						|
    case K_DEL:
 | 
						|
      // Toglie i vecchi valori
 | 
						|
      nuovo.sottrai( vecchio );
 | 
						|
      break;
 | 
						|
      
 | 
						|
    // Modifica
 | 
						|
    case K_ENTER:
 | 
						|
      // Toglie i vecchi valori
 | 
						|
      nuovo.sottrai( vecchio );
 | 
						|
      // Aggiunge i nuovi all
 | 
						|
      somma( nuovo );
 | 
						|
      break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
TRiga::~TRiga( )
 | 
						|
{ 
 | 
						|
  if( _pro )
 | 
						|
    delete _pro;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TPiede_documento::somma( TPiede_documento& tosum, bool add  )
 | 
						|
{                        
 | 
						|
  tosum.restart( );
 | 
						|
  THash_object* curr = tosum.get_hashobj( );
 | 
						|
  while( curr )
 | 
						|
  {
 | 
						|
    TString16 key( curr->key( ) );
 | 
						|
    if( add )
 | 
						|
      somma( key, ( real& )curr->obj( ) );
 | 
						|
    else
 | 
						|
      sottrai( key, ( real& )curr->obj( ) );
 | 
						|
    curr = tosum.get_hashobj( );
 | 
						|
  }
 | 
						|
}
 | 
						|
    
 | 
						|
void TPiede_documento::somma( TString16& piede, const real& importo )
 | 
						|
{
 | 
						|
  if( is_key( piede ) )
 | 
						|
  {
 | 
						|
    real& attuale = ( real& ) operator []( piede );
 | 
						|
    attuale += importo;
 | 
						|
  }
 | 
						|
  else
 | 
						|
    add( piede, importo );
 | 
						|
}
 | 
						|
 | 
						|
TToken_string& TPiede_documento::string( )
 | 
						|
{
 | 
						|
  TToken_string ret;
 | 
						|
  
 | 
						|
  ret.separator( '~' );
 | 
						|
  restart( );
 | 
						|
  THash_object* curr = get_hashobj( );
 | 
						|
  while( curr )
 | 
						|
  {
 | 
						|
    ret.add( curr->key( ) );
 | 
						|
    ret.add( (( real& ) curr->obj( )).string( ) );
 | 
						|
    curr = get_hashobj( );
 | 
						|
  }
 | 
						|
  return ret;  
 | 
						|
}
 | 
						|
 | 
						|
void TPiede_documento::load( TToken_string& s )
 | 
						|
{
 | 
						|
  s.separator( '~' );
 | 
						|
  for( int i = 0; i < s.items( ); i+=2 )
 | 
						|
  {
 | 
						|
    TString16 piede = s.get( i );
 | 
						|
    TString num = s.get( i + 1 );
 | 
						|
    real valore( num );
 | 
						|
    add( piede, valore );
 | 
						|
  }
 | 
						|
}
 | 
						|
    
 | 
						|
real& TPiede_documento::get( TString16& piede )
 | 
						|
{
 | 
						|
  static real zero( "0.0" );
 | 
						|
  
 | 
						|
  if( is_key( piede ) )
 | 
						|
  {
 | 
						|
    return ( real& ) find( piede );
 | 
						|
  }
 | 
						|
  else
 | 
						|
    return zero;
 | 
						|
} |