300 lines
8.0 KiB
C++
Executable File
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;
|
|
}
|
|
|