campo-sirio/ve/sconti.cpp
alex 10b13bec8e Correzzioni al 24/07/96
git-svn-id: svn://10.65.10.50/trunk@3244 c028cbd2-c16b-5b4b-a496-9718f37d4682
1996-07-25 13:05:29 +00:00

300 lines
8.0 KiB
C++
Executable File

#ifndef __SCONTI_H
#include "sconti.h"
#endif
#ifndef __VEUML_H
#include "veuml.h"
#endif
#ifndef __VERIG_H
#include "verig.h"
#endif
#ifndef __TCLIFOR_H
#include "tclifor.h"
#endif
#ifndef __CONFIG_H
#include "config.h"
#endif
#ifndef __VECONF_H
#include "veconf.h"
#endif
#define A_ANAMAG 0
HIDDEN const real CENTO(100.0);
void TCond_vendita::set_sconto( const char * exp, bool signal )
{
TString work( exp );
TString goodexp;
TString num;
// Elimina gli spazi molesti
work.strip_spaces( );
if (work.empty())
{
_sconto = "";
return;
}
// Per ora nessun errore
_errorpos = -1;
int i = 0;
_part = 1.0;
const int wlen = work.len( );
// Flag che indica se sono nella parte decimale di un numero
bool dec = FALSE;
// Flag che indica se si attende l'inizio di un numero
bool startnum = TRUE;
// Flag che indica se siamo all'inizio di un numero
while ( i < wlen && _errorpos < 0 )
{
char c = work[ i++ ];
switch( c )
{
case '+':
case '-':
// Se ero in in numero ...
if( !startnum )
{
// Aggiunge il numero alla sequenza
real newval( num );
_part = _part * ( CENTO + newval ) / CENTO;
if( newval >= 0 )
goodexp << '+';
goodexp << num;
}
// Inizia il nuovo numero
num = ( c == '-' )?"-":"";
startnum = TRUE;
dec = FALSE;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
num << c;
startnum = FALSE;
break;
case '.':
case ',':
// Se siamo gi` nella parte decimale ...
if( dec )
{
// Segnala un errore
_errorpos = i;
break;
}
// Se occorreva un numero ci metto lo 0
if( startnum )
num << '0';
// Interpreto la virgola come punto
num << '.';
dec = TRUE;
startnum = TRUE;
break;
default:
_errorpos = i;
break;
}
}
// Controlla la validit`
_valid = ( _errorpos < 0 );
// Se richiesto segnala l'errore
if( !_valid && signal )
warning_box( "Espressione di sconto non valida. Errore sul carattere %d.", _errorpos + 1 );
if( _valid )
{
// Aggiunge l'ultimo numero preso
real lastval( num );
_part = _part * ( CENTO + lastval ) / CENTO;
if( lastval >= 0 )
goodexp << '+';
goodexp << num;
// Assegna la nuova espressione formattata bene
_sconto = goodexp;
}
else
{
// Azzera la sequenza di percentuali
_part = 1.0;
}
}
real TCond_vendita::sconto_val( )
{
CHECK(is_valid( ),"Tentativo di usare uno sconto non valido!" );
return ( ( _part * CENTO ) - CENTO );
}
bool TCond_vendita::cerca( int tiporicerca )
{
TString codart = _anamag.get( "CODART" );
TString codriga = riga( ).get( FR_CODART );
if( codriga != codart )
{
_anamag.setkey( 1 );
_anamag.zero( );
_anamag.put( "CODART", codriga );
if (_anamag.read( ) != NOERR)
_anamag.zero();
}
if( tiporicerca == A_ANAMAG )
// Se ricercavo per anagrafica, ho gi` finito
return !_anamag.curr().empty();
if( _ditta.get_bool( "GES", "ve", tiporicerca ) )
{
// Se h attiva la gestione contratti ...
_condv.setkey( 1 );
_condv.zero( );
switch( tiporicerca )
{
case A_CONTRATTI:
_condv.put( "TIPO", "C" );
if( _ditta.get_bool( "GESSCONCC", "ve" ) )
{
// Se in ditta h abilitata la gestione del cliente in chiave
// al contratto, lo carico con gioia
_condv.put( "TIPOCF", clifo( ).tipocf( ) );
_condv.put( "CODCF", clifo( ).codcf( ) );
}
_condv.put( "COD", testa( ).get( F_CODCONT ) );
break;
case A_LISTINI:
_condv.put( "TIPO", "L" );
if( _ditta.get_bool( "GESLISCV", "ve" ) )
{
// Se in ditta h abilitata la gestione del cliente in chiave
// al contratto, lo carico con gioia
_condv.put( "TIPOCF", clifo( ).tipocf( ) );
_condv.put( "CODCF", clifo( ).codcf( ) );
}
_condv.put( "COD", testa( ).get( F_CODLIST ) );
break;
case A_OFFERTE:
_condv.put( "TIPO", "O" );
_condv.put( "COD", testa( ).get( F_CODCAMP ) );
break;
}
if( _condv.read( ) == NOERR )
{
_rcondv.setkey( 2 );
_rcondv.zero( );
_rcondv.put( "TIPO", _condv.get( "TIPO" ) );
_rcondv.put( "CATVEN", _condv.get( "CATVEN" ) );
_rcondv.put( "TIPOCF", _condv.get( "TIPOCF" ) );
_rcondv.put( "CODCF", _condv.get( "CODCF" ) );
if( _condv.get_bool( "GESTUM" ) )
_rcondv.put( "UM", riga( ).get( FR_UMQTA ) );
if( _condv.get_bool( "GESTSCAGL" ) )
_rcondv.put( "QLIM", riga( ).get( FR_QTA ) );
const TString16 seqricrighe( _condv.get( "SEQRIC" ) );
for( int i = 0; i < seqricrighe.len( ); i ++ )
{
char ricerca = seqricrighe[ i ];
_rcondv.put( "TIPORIGA", ricerca );
switch( ricerca )
{
case 'A':
_rcondv.put( "CODRIGA", codriga);
if( _rcondv.read( ) == NOERR ) return TRUE;
if( _rcondv.prev() == NOERR && _rcondv.get("TIPORIGA")[0] == 'A')
{
const TString cod_found(_rcondv.get("CODRIGA"));
return cod_found.compare(codriga, cod_found.len()) == 0;
}
break;
case 'R':
_rcondv.put( "CODRIGA", _anamag.get( "RAGGFIS" ) );
if( _rcondv.read( ) == NOERR ) return TRUE;
break;
case 'G':
{
const TRectype rec_to_found(_rcondv.curr());
_rcondv.put( "CODRIGA", _anamag.get( "GRMERC1" ) );
if( _rcondv.read( ) == NOERR ) return TRUE;
_rcondv.curr() = rec_to_found;
_rcondv.put( "CODRIGA", _anamag.get( "GRMERC2" ) );
if( _rcondv.read( ) == NOERR ) return TRUE;
_rcondv.curr() = rec_to_found;
_rcondv.put( "CODRIGA", _anamag.get( "GRMERC3" ) );
if( _rcondv.read( ) == NOERR ) return TRUE;
}
break;
default:
error_box("Tipo di ricerca righe %c non valido", ricerca );
break;
}
}
}
}
// Ricerca fallita
return FALSE;
}
// Probabilmente dovrebbe lavorare sulla maschera, ma per ora la lasciamo cosl
void TCond_vendita::calcola( )
{
const char gestione = _ditta.get_char( "GESSCORIGA", "ve" );
set_sconto("");
const bool condv_found = cerca(A_CONTRATTI) || cerca(A_OFFERTE) || cerca(A_LISTINI);
set_prezzo(condv_found ? _rcondv.get_real( "PREZZO") : ZERO);
switch( gestione )
{
case 'N':
// Sconti di riga non gestiti
break;
case 'L':
// Percentuale su contratti/offerte/listini/anagrafica
if (condv_found)
set_sconto( _rcondv.get( "SCONTO" ) );
else
if(cerca( A_ANAMAG ))
set_sconto( _anamag.get("SCONTO"));
break;
case 'A':
// Posiziono l'anagrafica
_sconti.setkey( 1 );
_sconti.put( "TIPO", "R" );
_sconti.put( "CODART", riga().get(FR_CODART));
if( _ditta.get_bool( "GESSCORIGACV", "ve" ) )
_sconti.put( "CODCAT", clifo( ).get( LF_CFVEN, "SCONTO" ) );
if( _ditta.get_bool( "GESSCORIGAUM", "ve" ) )
_sconti.put( "UM", riga( ).get( FR_UMQTA ) );
if( _sconti.read( ) == NOERR )
set_sconto( _sconti.get("SCONTO") );
break;
case 'C':
set_sconto(clifo( ).get(LF_CFVEN, "SCONTO"));
break;
default:
error_box( FALSE, "Tipo di gestione sconti %c non valido!", gestione );
break;
}
}
TCond_vendita::TCond_vendita( TCliFor& clifo, TMask * testa, TMask * riga ) : _condv( LF_CONDV ), _rcondv( LF_RCONDV ), _anamag( LF_ANAMAG ), _sconti( LF_SCONTI ), _ditta( CONFIG_DITTA )
{
_clifo = &clifo;
_testa = testa;
_riga = riga;
}