#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; }