Versione beta

git-svn-id: svn://10.65.10.50/trunk@3680 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1996-09-26 15:37:19 +00:00
parent 293c6e8c75
commit ac6e4946de
17 changed files with 2489 additions and 967 deletions

View File

@ -18,437 +18,76 @@
#include "sconti.h"
#endif
static void row_set_handler( TMask& m, const int field, const int index )
void TRiga_documento_motore::load(TSheet_field & f, TToken_string& row)
{
switch ( index )
{
case 1:
m.set_handler( field, dummy_hndl );
break;
default:
yesnofatal_box( FALSE, "Funzione di handler sulla riga non definita( %d ).", index );
}
}
HIDDEN TString16 curr_um;
HIDDEN real curr_fc(1.0);
HIDDEN bool codart_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask();
TMask & mask = app().edit_mask();
TCond_vendita & condv = app().condv();
condv.set_testa(&mask);
condv.set_riga(&row_mask);
TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file();
TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file();
condv.set_anamag(anamag);
condv.set_umart(umart);
TString80 codart(f.get());
anamag.setkey(1);
anamag.put("CODART", codart);
if (anamag.read() != NOERR)
{
TLocalisamfile codalt(LF_CODCORR);
codalt.setkey(2);
codalt.put("CODARTALT", codart);
if (codalt.read() == NOERR)
{
codart = codalt.get("CODART");
anamag.zero();
anamag.put("CODART", codart);
if (anamag.read() == NOERR)
f.set(codart);
}
}
if (anamag.good())
{
const TString16 lingua = mask.get(F_CODLIN);
const TString codart(row_mask.get(FR_CODART));
TString desc(anamag.get("DESCR"));
if (lingua.not_empty())
{
TLocalisamfile deslin(LF_DESLIN);
deslin.setkey(2);
deslin.put("CODART", codart);
deslin.put("CODLIN", lingua);
if (deslin.read() == NOERR)
desc = deslin.get("DESCR");
}
row_mask.set(FR_DESCR, desc);
umart.setkey(1);
umart.zero();
umart.put("CODART", codart);
if (umart.read(_isgteq) == NOERR && codart == umart.get("CODART"))
{
curr_um = umart.get("UM");
curr_fc = umart.get_real("FC");
}
else
{
curr_um.cut(0);
curr_fc = 1.0;
}
row_mask.set(FR_UMQTA, curr_um);
}
condv.ricerca();
}
return TRUE;
}
HIDDEN bool umart_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
TMask & mask = app().edit_mask();
TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file();
TLocalisamfile & umart = ((TEdit_field &) f).browse()->cursor()->file();
TCond_vendita & condv = app().condv();
condv.set_testa(&mask);
condv.set_riga(&row_mask);
condv.set_anamag(anamag);
condv.set_umart(umart);
condv.ricerca(FALSE);
const TString16 um(f.get());
real fc(1.0);
if (um.not_empty() && curr_um.not_empty() && um != curr_um)
{
umart.setkey(2);
umart.put("CODART", row_mask.get(FR_CODART));
umart.put("UM", um);
if (umart.read() == NOERR)
{
real qta(row_mask.get_real(FR_QTA));
qta *= curr_fc;
fc = umart.get_real("FC");
qta /= fc;
row_mask.set(FR_QTA, qta);
}
}
curr_um = um;
curr_fc = fc;
}
return TRUE;
}
HIDDEN bool descr_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
const TString s(f.get());
if (s.find('\n') < 0)
{
TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file();
anamag.zero();
anamag.setkey(2);
anamag.put("DESCR", ((TZoom_field &) f).get_first_line());
if (anamag.read() == NOERR)
{
f.mask().set(FR_CODART, anamag.get("CODART"));
f.mask().field(FR_CODART).set_dirty();
f.mask().check_field(FR_CODART);
}
}
}
return TRUE;
}
HIDDEN bool qta_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
TMask & mask = app().edit_mask();
TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file();
TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file();
TCond_vendita & condv = app().condv();
condv.set_testa(&mask);
condv.set_riga(&row_mask);
condv.set_anamag(anamag);
condv.set_umart(umart);
condv.ricerca(FALSE);
}
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 )) );
put( "STATORIGA", row.get( f.cid2index(FR_STATORIGA) ) );
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 )) );
put( "CODMAG", codmag);
put( "CODART", row.get( f.cid2index(FR_CODART )) );
TString s(row.get(f.cid2index(FR_DESCR)));
int split_pos = s.find('\n');
if (split_pos > 0)
{
_data.put( "DESCR", s.left(split_pos));
_data.put("DESCLUNGA", "X");
put( "DESCR", s.left(split_pos));
put("DESCLUNGA", "X");
s.ltrim(split_pos);
_data.put("DESCEST", s);
put("DESCEST", s);
}
else
{
_data.put("DESCR", s);
_data.put("DESCLUNGA", "");
_data.zero("DESCEST");
put("DESCR", s);
put("DESCLUNGA", "");
zero("DESCEST");
}
_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 );
_data.put( "G1", _piede.string( ) );
if (r)
*r = _data;
put( "PREZZO", row.get( f.cid2index(FR_PREZZO )) );
put( "UMQTA", row.get( f.cid2index(FR_UMQTA )) );
put( "QTA", row.get( f.cid2index(FR_QTA )) );
put( "QTAEVASA", row.get( f.cid2index(FR_QTAEVASA )) );
put( "RIGAEVASA", row.get( f.cid2index(FR_RIGAEVASA )) );
put( "TARA", row.get( f.cid2index(FR_TARA )) );
put( "PNETTO", row.get( f.cid2index(FR_PNETTO )) );
put( "NCOLLI", row.get( f.cid2index(FR_NCOLLI )) );
put( "DAEVADERE", row.get( f.cid2index(FR_DAEVADERE )) );
put( "SCONTO", row.get( f.cid2index(FR_SCONTO )) );
put( "PERCPROV", row.get( f.cid2index(FR_PERCPROV )) );
put( "IMPFISSO", row.get( f.cid2index(FR_IMPFISSO )) );
put( "CODIVA", row.get( f.cid2index(FR_CODIVA )) );
put( "ADDIVA", row.get( f.cid2index(FR_ADDIVA )) );
put( "ASPBENI", row.get( f.cid2index(FR_ASPBENI )) );
}
void TRiga::save(TSheet_field & f, TToken_string& row )
void TRiga_documento_motore::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( get( "STATORIGA" ), f.cid2index(FR_STATORIGA ));
row.add( get( "TIPORIGA" ), f.cid2index(FR_TIPORIGA ));
const TString codmag(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 ));
TString s(_data.get("DESCR"));
if (_data.get_bool("DESCLUNGA"))
s << _data.get("DESCEST");
row.add( get( "CODART" ), f.cid2index(FR_CODART ));
TString s(get("DESCR"));
if (get_bool("DESCLUNGA"))
s << get("DESCEST");
row.add(s, 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 ));
row.add( get( "UMQTA" ), f.cid2index(FR_UMQTA ));
row.add( get( "PREZZO" ), f.cid2index(FR_PREZZO ));
row.add( get( "QTA" ), f.cid2index(FR_QTA ));
row.add( get( "QTAEVASA" ), f.cid2index(FR_QTAEVASA ));
row.add( get( "RIGAEVASA" ), f.cid2index(FR_RIGAEVASA ));
row.add( get( "TARA" ), f.cid2index(FR_TARA ));
row.add( get( "PNETTO" ), f.cid2index(FR_PNETTO ));
row.add( get( "NCOLLI" ), f.cid2index(FR_NCOLLI ));
row.add( get( "DAEVADERE" ), f.cid2index(FR_DAEVADERE ));
row.add( get( "SCONTO" ), f.cid2index(FR_SCONTO ));
row.add( get( "PERCPROV" ), f.cid2index(FR_PERCPROV ));
row.add( get( "IMPFISSO" ), f.cid2index(FR_IMPFISSO ));
row.add( get( "CODIVA" ), f.cid2index(FR_CODIVA ));
row.add( get( "ADDIVA" ), f.cid2index(FR_ADDIVA ));
row.add( get( "ASPBENI" ), f.cid2index(FR_ASPBENI ));
}
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);
}
}
TVariable_mask * TRiga::getmask( )
{
TString16 msk("verig");
msk << _data.get("TIPORIGA");
TVariable_mask * mask = new TVariable_mask( 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 ) );
}
const TMask_field & f = mask->field(FR_CODART);
if (f.is_edit())
{
TBrowse * browse = ((TEdit_field &) f).browse();
if (browse )
{
TCursor * cur = browse->cursor();
CHECK(cur, "Null cursor in CODART check");
if (cur)
{
const int num = cur->file().num();
if (num == LF_ANAMAG)
{
mask->set_handler( FR_CODART, codart_handler );
mask->set_handler( FR_UMQTA, umart_handler );
mask->set_handler( FR_DESCR, descr_handler );
mask->set_handler( FR_QTA, qta_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;
}

View File

@ -25,72 +25,26 @@
#include "config.h"
#endif
#ifndef __MSKSHEET_H
#include "msksheet.h"
#endif
#ifndef __VARMASK_H
#include "varmask.h"
#endif
class TPiede_documento : public TAssoc_array
#ifndef __VELIB01_H
#include "velib01.h"
#endif
class TRiga_documento_motore : public TRiga_documento
{
public:
TToken_string& string( );
void load( TToken_string& s );
void somma( TPiede_documento& tosum, bool add = TRUE );
void sottrai( TPiede_documento& tosum ){ somma( tosum, FALSE ); };
void somma( TString16& piede, const real& importo );
void sottrai( TString16& piede, const real& importo ){ somma( piede, -importo ); };
real& get( TString16& piede );
};
class TRiga : public TObject
{
private:
// Record che contiene i dati sulla riga
TRectype _data;
// Profilo di riga
TConfig* _pro;
// Maschera per la riga
TPiede_documento _piede;
protected:
// Carca il profilo di riga: da migliorare mettendo una cache o precaricando
// tutti i profili per un documento
void carica_profilo( );
public:
// Setta il numero della riga
void set_numero( int r ) { _data.put( "NRIGA", r ); }
int numero( ) { return _data.get_int( "NRIGA" ); }
const TString & tipo( ) const { return _data.get( "TIPORIGA" ); }
// Carica la riga dalla riga dello sheet
void load( TSheet_field& f, TToken_string& row , TRectype * r = NULL);
void load( TSheet_field& f, TToken_string& row);
// Registra la riga sullo sheet
void save( TSheet_field& f, TToken_string& row);
// Legge la riga dal record
void load( const TRectype& rec );
// Scrive la riga sul record
void save( TRectype& rec );
// Disabilita le colonne dello sheet come da profilo riga
void configura_sheet( TSheet_field& f, int numriga );
// Somma la riga su di un piede documento
void edit_keys( const KEY key, TPiede_documento& nuovo );
// Costruisce e Ritorna la maschera della riga per la editazione
TVariable_mask * getmask();
// Costruttorino standard
TRiga( ) : _data( LF_RIGHEDOC ), _pro( NULL ) { }
TRiga_documento_motore(TDocumento* doc) : TRiga_documento(doc) { }
TRiga_documento_motore(const TRiga_documento& rec, TDocumento* doc) : TRiga_documento(rec, doc) { }
virtual ~TRiga( );
virtual ~TRiga_documento_motore() {}
};
#endif

View File

@ -26,8 +26,6 @@
#include <tabutil.h>
#endif
// #define A_ANAMAG 0
HIDDEN const real CENTO(100.0);
bool TCond_vendita::set_sconto( const char * exp, bool signal )
@ -58,7 +56,7 @@ bool TCond_vendita::set_sconto( const char * exp, bool signal )
{
// Aggiunge il numero alla sequenza
real newval( num );
_molt_sconto *= ( CENTO + newval ) / CENTO;
_molt_sconto *= ( CENTO - newval ) / CENTO;
goodexp << num;
}
// Inizia il nuovo numero
@ -106,7 +104,7 @@ bool TCond_vendita::set_sconto( const char * exp, bool signal )
{
// Aggiunge l'ultimo numero preso
real lastval( num );
_molt_sconto *= ( CENTO + lastval ) / CENTO;
_molt_sconto *= ( CENTO - lastval ) / CENTO;
goodexp << num; // Assegna la nuova espressione formattata bene
}
else
@ -118,7 +116,7 @@ bool TCond_vendita::set_sconto( const char * exp, bool signal )
}
}
_sconto = goodexp;
if (_riga && _riga->id2pos(FR_SCONTO) >= 0 && _riga->field(FR_SCONTO).active())
if (_load_mask && _riga && _riga->id2pos(FR_SCONTO) >= 0 && _riga->field(FR_SCONTO).active())
_riga->set(FR_SCONTO, _sconto);
return valid;
}
@ -148,7 +146,7 @@ void TCond_vendita::set_prezzo(const real & prezzo, const char * val_rif)
_prezzo.round(cambio == 1.0 ? 0 : 3);
}
}
if (_riga && _riga->id2pos(FR_PREZZO) >= 0 && _riga->field(FR_PREZZO).active())
if (_load_mask && _riga && _riga->id2pos(FR_PREZZO) >= 0 && _riga->field(FR_PREZZO).active())
_riga->set(FR_PREZZO, _prezzo);
}
@ -156,7 +154,7 @@ void TCond_vendita::set_provv(const real & provv)
{
_provv = provv;
if (_riga && _riga->id2pos(FR_PERCPROV) >= 0 && _riga->field(FR_PERCPROV).active())
if (_load_mask && _riga && _riga->id2pos(FR_PERCPROV) >= 0 && _riga->field(FR_PERCPROV).active())
_riga->set(FR_PERCPROV, _provv);
}
@ -164,7 +162,7 @@ void TCond_vendita::set_iva(const TString & codiva)
{
_codiva = codiva;
if (_riga && _riga->id2pos(FR_CODIVA) >= 0 && _riga->field(FR_CODIVA).active())
if (_load_mask && _riga && _riga->id2pos(FR_CODIVA) >= 0 && _riga->field(FR_CODIVA).active())
_riga->set(FR_CODIVA, _codiva);
}
@ -219,7 +217,15 @@ bool TCond_vendita::cerca( int tiporicerca )
}
if( _condv.read( ) == NOERR )
{
_rcondv.setkey( 2 );
// _rcondv.setkey( 2 );
const bool gest_scagl = _condv.get_bool("GESTSCAGL");
const TString16 seqricrighe( _condv.get( "SEQRIC" ) );
bool found = FALSE;
for( int i = 0; !found && i < seqricrighe.len( ); i ++ )
{
_rcondv.zero( );
_rcondv.put( "TIPO", _condv.get( "TIPO"));
_rcondv.put( "CATVEN", _condv.get( "CATVEN"));
@ -228,17 +234,9 @@ bool TCond_vendita::cerca( int tiporicerca )
_rcondv.put("COD", _condv.get("COD"));
if( _condv.get_bool( "GESTUM" ) )
_rcondv.put( "UM", riga().get(FR_UMQTA));
const bool gest_scagl = _condv.get_bool("GESTSCAGL");
const TString16 seqricrighe( _condv.get( "SEQRIC" ) );
bool found = FALSE;
if (gest_scagl)
_rcondv.put("NSCAGL", 1);
for( int i = 0; !found && i < seqricrighe.len( ); i ++ )
{
char ricerca = seqricrighe[ i ];
_rcondv.put( "TIPORIGA", ricerca );
switch( ricerca )
@ -262,13 +260,13 @@ bool TCond_vendita::cerca( int tiporicerca )
_rcondv.put("CODRIGA", anamag().get( "RAGGFIS"));
_rcondv.read();
break;
case 'C':
case 'S':
{
_rcondv.put( "CODRIGA", anamag().get("GRMERC"));
_rcondv.read( );
}
break;
case 'L':
case 'G':
{
_rcondv.put( "CODRIGA", anamag().get("GRMERC").left(3));
_rcondv.read( );
@ -308,10 +306,11 @@ bool TCond_vendita::cerca( int tiporicerca )
}
// Probabilmente dovrebbe lavorare sulla maschera, ma per ora la lasciamo cosl
void TCond_vendita::ricerca(bool full_load)
void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
{
TString codart = anamag().get( "CODART" );
const TString codriga = riga().get( FR_CODART );
_load_mask = !load_um_only && !load_scagl_only;
if(anamag().bad() || codriga != codart )
{
@ -319,13 +318,13 @@ void TCond_vendita::ricerca(bool full_load)
anamag().put("CODART", codriga);
if (anamag().read() != NOERR)
{
if (full_load)
{
// if (full_load)
// {
set_prezzo(ZERO);
set_sconto("");
set_iva("");
set_provv(ZERO);
}
// }
return;
}
}
@ -342,31 +341,39 @@ void TCond_vendita::ricerca(bool full_load)
}
const bool found_condv = cerca(A_CONTRATTI) || cerca(A_OFFERTE) || cerca(A_LISTINI);
const bool cv_scagl = _condv.get_bool("GESTSCAGL");
const bool cv_um = _condv.get_bool("GESTUM");
if (found_condv)
{
_load_mask |= load_scagl_only && cv_scagl;
_load_mask |= load_um_only && cv_um;
set_prezzo(_rcondv.get_real("PREZZO"), _condv.get("CODVAL"));
_load_mask = !load_um_only && !load_scagl_only;
}
else
if (full_load)
// if (full_load)
set_prezzo(umart().get_real("PREZZO"));
if (full_load)
{
// if (full_load)
// {
if (_ivarid)
set_iva(anamag().get("CODIVAR"));
else
set_iva(anamag().get("CODIVA"));
}
// }
const char gestione = config_ditta().get_char( "GESSCORIGA", "ve" );
const bool sco_scagl = config_ditta().get_bool("GESCOSCA", "ve");
const bool sco_um_gest = config_ditta().get_bool("GESSCORIGAUM", "ve");
if (!full_load && gestione != 'A' && !sco_scagl)
{
if (gestione == 'L' && found_condv)
set_sconto(_rcondv.get("SCONTO"));
}
else
// if (!full_load && gestione != 'A' && !sco_scagl)
// {
// if (gestione == 'L' && found_condv)
// set_sconto(_rcondv.get("SCONTO"));
//}
// else
{
switch (gestione)
{
@ -377,7 +384,12 @@ void TCond_vendita::ricerca(bool full_load)
case 'L':
// Percentuale su contratti/offerte/listini/anagrafica
if (found_condv)
{
_load_mask |= load_scagl_only && cv_scagl;
_load_mask |= load_um_only && cv_um;
set_sconto(_rcondv.get("SCONTO"));
_load_mask = !load_um_only && !load_scagl_only;
}
else
set_sconto(anamag().get("SCONTO"));
break;
@ -390,7 +402,7 @@ void TCond_vendita::ricerca(bool full_load)
_sconti.put("TIPO", "R");
if( config_ditta().get_bool("GESSCORIGACV", "ve"))
_sconti.put("CODCAT", clifo().get(LF_CFVEN, "CATVEN"));
if( config_ditta().get_bool("GESSCORIGAUM", "ve"))
if (sco_um_gest)
_sconti.put("UM", riga().get( FR_UMQTA));
_sconti.put("TIPORIGA", rigakey);
@ -448,7 +460,10 @@ void TCond_vendita::ricerca(bool full_load)
}
if (!found)
_sconti.zero();
_load_mask |= load_scagl_only && sco_scagl;
_load_mask |= load_scagl_only && sco_um_gest;
set_sconto(_sconti.get("SCONTO"));
_load_mask = !load_um_only && !load_scagl_only;
}
break;
case 'C':
@ -476,12 +491,12 @@ void TCond_vendita::ricerca(bool full_load)
if (tipoprovv <= ' ')
tipoprovv = config_ditta().get_char( "AGETIPOPERC", "ve" );
if (!full_load)
{
if (tipoprovv == 'L' && found_condv)
set_provv(_rcondv.get_real("PERCPROVV"));
}
else
// if (!full_load)
// {
// if (tipoprovv == 'L' && found_condv)
// set_provv(_rcondv.get_real("PERCPROVV"));
// }
// else
{
switch (tipoprovv)
{
@ -493,7 +508,11 @@ void TCond_vendita::ricerca(bool full_load)
break;
case 'L':
if (found_condv)
{
_load_mask |= load_scagl_only && sco_scagl;
_load_mask |= load_scagl_only && sco_um_gest;
set_provv(_rcondv.get_real("PERCPROVV"));
}
else
set_provv(anamag().get_real("PERCPROVV"));
break;
@ -524,9 +543,9 @@ void TCond_vendita::ricerca(bool full_load)
}
}
TCond_vendita::TCond_vendita(TCliFor& clifo, TConfig * ditta, TMask * testa, TMask * riga,
TCond_vendita::TCond_vendita(TCliFor * clifo, TConfig * ditta, TMask * testa, TMask * riga,
TLocalisamfile * anamag, TLocalisamfile * umart)
: _clifo(&clifo), _testa(testa), _riga(riga),
: _clifo(clifo), _testa(testa), _riga(riga),
_condv( LF_CONDV ), _rcondv( LF_RCONDV ), _sconti( LF_SCONTI ),
_anamag(anamag), _umart(umart), _config_ditta(ditta), _ivarid(FALSE)
{

View File

@ -34,6 +34,7 @@ class TCond_vendita : public TObject
TConfig * _config_ditta;
TMask * _testa;
TMask * _riga;
bool _load_mask;
bool cerca(int tiporicerca);
@ -43,7 +44,7 @@ protected:
void set_iva(const TString & codiva);
TCliFor & clifo() const { CHECK(_clifo, "Cliente/fornitore non inizializzato"); return * _clifo; }
TConfig & config_ditta() const { CHECK(_clifo, "Configurazione ditta non inizializzata"); return * _config_ditta; }
TConfig & config_ditta() const { CHECK(_config_ditta, "Configurazione ditta non inizializzata"); return * _config_ditta; }
TMask & testa() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _testa; }
TMask & riga() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _riga; }
TLocalisamfile & anamag() const { CHECK(_anamag, "Anagrafica di magazzino non inizializzata") ; return *_anamag; }
@ -62,10 +63,10 @@ public:
void set_riga( TMask * riga ){ _riga = riga; }
void set_anamag(TLocalisamfile & anamag) { _anamag = &anamag; }
void set_umart(TLocalisamfile & umart) { _umart = &umart; }
void ricerca(bool full_load = TRUE);
void ricerca(bool load_um_only = FALSE, bool load_scagl_only = FALSE);
bool gestum() const { return _condv.get_bool("GESTUM"); }
TCond_vendita(TCliFor & clifo, TConfig * _ditta = NULL, TMask * testa = NULL, TMask * riga = NULL,
TCond_vendita(TCliFor * clifo = NULL, TConfig * _ditta = NULL, TMask * testa = NULL, TMask * riga = NULL,
TLocalisamfile * anamag = NULL, TLocalisamfile * umart = NULL);
~TCond_vendita() {}
};

View File

@ -143,9 +143,8 @@ void TCliForVendite::update_mask( TMask& m, bool onload )
set( m, F_CODVETT1, LF_CFVEN, "CODVETT1" );
set( m, F_CODVETT2, LF_CFVEN, "CODVETT2" );
set( m, F_CODVETT3, LF_CFVEN, "CODVETT3" );
set( m, F_SPESEINC, LF_CFVEN, "ADDSPINC" );
set( m, F_ADDBRB, LF_CFVEN, "ADDBOLLIRB" );
set( m, F_ADDBTR, LF_CFVEN, "ADDBOLLITR" );
set( m, F_SPESEINC, LF_CFVEN, "PERCSPINC" );
set( m, F_ADDBOLLI, LF_CFVEN, "ADDBOLLI" );
set(m, F_CATVEN, LF_CFVEN, "CATVEN");
if (m.id2pos(F_CODLIST) >= 0 && m.field(F_CODLIST).active())
set(m, F_CODLIST, LF_CFVEN, "CODLIST");

View File

@ -6,13 +6,22 @@
#include "ve0100o.h"
#endif
#ifndef __VEINI_H
#include "veini.h"
#endif
#ifndef __UTILITY_H
#include "utility.h"
#endif
void TMotore_application::init_query_mode( TMask& m )
{
_msk->set( F_CODNUM, _doc->numerazione());
_msk->field(F_CODNUM).set_focusdirty(TRUE);
_msk->field(F_CODNUM).on_key(K_TAB);
_msk->field(F_CODNUM).set_dirty(FALSE);
_msk->set( F_TIPODOC, _doc->tipo().codice(), TRUE);
_msk->set( F_TIPODOC, _doc->get("TIPODOC"), TRUE);
}
void TMotore_application::init_insert_mode( TMask& m )
@ -26,7 +35,7 @@ void TMotore_application::init_insert_mode( TMask& m )
const long numdoc = m.get_long(F_NDOC);
_doc->read(provv, anno, codnum, numdoc);
_doc->head().put("TIPODOC", m.get(F_TIPODOC));
_doc->set_tipo(m.get(F_TIPODOC));
m.field(F_CODNUM).set_focusdirty(TRUE);
m.field(F_CODNUM).on_key(K_TAB);
@ -82,44 +91,11 @@ int TMotore_application::user_function( int index )
// Funzione che dato il profilo di riga ottiene la maschera
// Serve per ottenere una maschera diversa per ogni riga
TMask *TMotore_application::ss_getmask( int numriga, TMask& fullmask, bool destroy )
TMask * TMotore_application::ss_getmask( int numriga, TMask& fullmask)
{
static TRiga* r = NULL;
TRiga_documento & riga = (*(app()._doc))[numriga + 1];
if ( destroy )
{
delete r;
r = NULL;
return( NULL );
}
else
{
TSheet_field & ss = *fullmask.get_sheet( );
TToken_string& riga = ss.row( numriga );
const TString tipo(riga.get( ss.cid2index(FR_TIPORIGA)));
if ( tipo.blank() ) return &fullmask;
if ( !r )
r = new TRiga;
if(r->tipo() != tipo)
{
r->load(ss, riga);
}
TAssoc_array & row_masks = app()._row_masks;
TVariable_mask * row_mask = (TVariable_mask *) row_masks.objptr(tipo);
if (row_mask == NULL)
{
row_mask = r->getmask();
row_mask->set_sheet( &ss );
row_masks.add(tipo, row_mask);
}
return( row_mask );
}
}
void TMotore_application::azzera_piedi( )
{
_piede.destroy( );
return ((TTipo_riga_documento &)riga.tipo()).mask();
}
void TMotore_application::user_set_handler( int fieldid, int index, TMask* m )
@ -143,51 +119,27 @@ void TMotore_application::user_set_handler( int fieldid, int index, TMask* m )
bool TMotore_application::ss_handler( TSheet_field& ss, int r, KEY key )
{
static TRiga * riga = NULL;
if ( key == K_SPACE ) // Inizio modifica
if ( key == K_ENTER ) // Cancellazione
{
TPiede_documento& piede = app( ).piede( );
riga->edit_keys( key, piede );
}
if ( key == K_TAB ) // Mi posiziono su di una riga nello sheet
{
if ( riga )
delete riga;
riga = new TRiga;
TRiga_documento & riga = (*(app()._doc))[r + 1];
riga->load(ss, ss.row( r ));
riga.autosave(ss);
}
else
if ( key == K_DEL ) // Cancellazione
app()._doc->destroy_row(r + 1, TRUE);
else
if ( key == K_INS ) // Inserimento
{
TMask & emask = app().edit_mask();
TToken_string& tsr = ss.row( r );
tsr.add(emask.get( F_LBTIPORIGA ), FR_TIPORIGA - 101 );
tsr.add("", FR_STATORIGA - 101 );
if ( riga )
delete riga;
riga = new TRiga;
riga->load(ss, tsr);
return TRUE;
TRiga_documento & riga = app()._doc->insert_row(r + 1, emask.get( F_LBTIPORIGA ));
riga.autoload(ss);
}
else
if (key == K_CTRL + K_INS)
{
ss.select(r);
return TRUE;
}
if ( key == K_DEL ) // Cancellazione
{
TPiede_documento& piede = app( ).piede( );
riga->edit_keys( key, piede );
return TRUE;
}
if ( key == K_ENTER ) // Modifica
{
TPiede_documento& piede = app( ).piede( );
riga->edit_keys( key, piede );
return TRUE;
}
return TRUE;
}
bool TMotore_application::num_handler( TMask_field& f, KEY key )
@ -209,7 +161,6 @@ bool TMotore_application::num_handler( TMask_field& f, KEY key )
// Propone il primo tipo di documento come default
m.set( F_TIPODOC, tipidocs.left( 4 ) );
// m.field( F_TIPODOC ).check( );
m.send_key( K_TAB, F_TIPODOC );
// Se per questa numerazione h abilitata le numerazione provvisoria
if ( tabnum.get_bool ( "B0" ) )
@ -343,42 +294,6 @@ bool TMotore_application::clifo_handler( TMask_field& f, KEY key )
return TRUE;
}
void TMotore_application::carica_piedi( )
{
/*
TToken_string s( pro( ).get( "PROGPIEDE", "MAIN" ) ); // prof
TString s1 = s.get( );
TTable ppd( "PPD" );
while( !s1.blank( ) )
{
ppd.zero( );
ppd.put( "CODTAB", s1 );
if( ppd.read( ) == NOERR )
{
real valpiede( "0.0" );
if ( _piede.is_key( s1 ) )
valpiede = ( real & )( _piede[ s1 ] );
edit_mask( ).set( BASE_PIEDE + ppd.get_int( "I0" ), valpiede.stringa( 15 ) );
}
else
message_box( "Piede non trovato( %s )", ( const char * )s1 );
s1 = s.get( );
}
*/
}
void TMotore_application::somma_piedi( )
{
/*for ( int i = 0; i < NPIEDI; i++ )
_piedi[ i ] += _piedi_temp[ i ];*/
}
void TMotore_application::sottrai_piedi( )
{
/*for ( int i = 0; i < NPIEDI; i++ )
_piedi[ i ] -= _piedi_temp[ i ];*/
}
bool TMotore_application::changing_mask( int mode )
{
static int lastmode = NO_MODE;
@ -440,40 +355,34 @@ TMask* TMotore_application::get_mask( int mode )
{
const TString16 tipodoc(_msk->get(F_TIPODOC));
_doc->head().put("TIPODOC", tipodoc);
TVariable_mask * msk1 = (TVariable_mask *) _doc_masks.objptr(tipodoc);
TDocumento_mask * msk1 = (TDocumento_mask *) _doc_masks.objptr(tipodoc);
_doc->set_tipo(tipodoc);
update_profile();
TString tipocf( app( ).pro( ).get( "TIPOCF", "MAIN" ) ); //prof
app( ).tipocf( tipocf[ 0 ] );
if (msk1 == NULL)
{
msk1 = new TVariable_mask(_doc->tipo().mask_name()); // prof
msk1 = new TDocumento_mask(_doc->tipo().mask_name(), _doc); // prof
_doc_masks.add(tipodoc, msk1);
_sheet = &( TSheet_field& )msk1->field( F_SHEET );
sheet( ).set_notify( ss_handler );
sheet().set_append(FALSE);
TList_field& listbox = ( TList_field& ) msk1->field( F_LBTIPORIGA );
const int numtr = app( ).pro( ).get_int( "NTIPIRIGA", "RIGHE" ); //prof
TTable tabtr( "%TRI" );
TToken_string keys( "" ), descrs( "" );
TToken_string keys, descrs;
TRiga_documento r(_doc);
for ( int i = 1; i <= numtr; i ++ )
{
TString chiave;
TToken_string item;
chiave.format( "%d", i );
tabtr.zero( );
TString tiporiga( app( ).pro( ).get( chiave, "RIGHE" ) ); // pro
tabtr.put( "CODTAB", tiporiga );
if ( tabtr.read( ) == NOERR )
{
keys.add( tabtr.get( "CODTAB" ) );
descrs.add( tabtr.get( "S0" ) );
}
else
error_box( "Inserito un tipo di riga non valido ( %s )", ( const char * )tiporiga );
TString16 var;
var.format("%d", i);
TString tiporiga(app().pro().get(var, "RIGHE")); // pro
r.set_tipo(tiporiga);
keys.add(r.tipo().codice());
descrs.add(r.tipo().descrizione());
}
listbox.replace_items( keys, descrs );
configura_sheet( *_sheet, *_pro );
@ -628,14 +537,10 @@ const char* TMotore_application::get_next_key( )
int TMotore_application::read( TMask& m )
{
azzera_piedi( );
TRectype & curr = _rel->lfile().curr();
const int err = _doc->read(curr);
const int err = _doc->read(_doc->head());
if ( err == NOERR )
{
curr = _doc->head();
m.autoload(*_rel);
const char tipocf = _doc->head().get("TIPOCF")[0];
const long codcf = _doc->head().get_long("CODCF");
@ -650,16 +555,12 @@ int TMotore_application::read( TMask& m )
const int rows = _doc->rows();
for (int i = 1; i <= rows; i++)
{
TToken_string& srow = f.row( i - 1 );
TRectype& rec = (*_doc)[i];
TToken_string & r = f.row(i -1);
TRiga_documento & rec = (*_doc)[i];
TRiga currentrow;
currentrow.load( rec );
currentrow.save(f, srow);
rec.autoload(f);
f.post_insert(i - 1);
}
carica_piedi( );
}
return err;
}
@ -676,23 +577,11 @@ int TMotore_application::write( const TMask& m ) // C 90
if ( err == NOERR )
{
m.autosave(*_rel);
_doc->head() = _rel->lfile().curr();
TSheet_field& f = ss( );
_doc->destroy_rows();
for ( int i = 0; i < f.items( ); i ++ )
{
TToken_string& t = f.row( i );
TRectype& rec = _doc->new_row();
store_riga( f, i, rec );
}
err = _doc->write( );
}
if (err == NOERR)
{
_rel->curr() = _doc->head();
_rel->read(); // per posizionare correttamente la relazione
}
}
return err;
}
@ -710,16 +599,6 @@ int TMotore_application::rewrite( const TMask& m ) // C 90
if ( err == NOERR )
{
m.autosave(*_rel);
_doc->head() = _rel->lfile().curr();
TSheet_field& f = ss( );
_doc->destroy_rows( );
for ( int i = 0; i < f.items( ); i ++ )
{
TToken_string& t = f.row( i );
TRectype& rec = _doc->new_row();
store_riga( f, i, rec );
}
err = _doc->rewrite( );
}
}
@ -735,57 +614,6 @@ bool TMotore_application::remove( void ) // C 80
return _doc->remove() == NOERR;
}
void TMotore_application::load_riga( TSheet_field& f, int numrig, TRectype& r )
{
TToken_string& riga = f.row( numrig );
riga = r.get( "STATORIGA" );
riga.add( r.get( "TIPORIGA" ) );
TFilename proname( r.get( "PROFRIGA" ) );
riga.add( proname );
riga.add( r.get( "CODMAG" ) );
riga.add( r.get( "CODART" ) );
riga.add( r.get( "DESCR" ) );
riga.add( r.get( "DESCLUNGA" ) );
riga.add( r.get( "PREZZO" ) );
riga.add( r.get( "UMQTA" ) );
riga.add( r.get_real( "QTA" ).string( 11 ) );
riga.add( r.get( "QTAEVASA" ) );
riga.add( r.get( "RIGAEVASA" ) );
riga.add( r.get( "TARA" ) );
riga.add( r.get( "PNETTO" ) );
riga.add( r.get( "NCOLLI" ) );
riga.add( r.get( "DAEVADERE" ) );
riga.add( r.get( "SCONTO" ) );
riga.add( r.get( "PERCPROV" ) );
riga.add( r.get( "IMPFISSO" ) );
riga.add( r.get( "IMPFISUN" ) );
riga.add( r.get( "CODIVA" ) );
riga.add( r.get( "ADDIVA" ) );
riga.add( r.get( "ASPBENI" ) );
proname.ext( "ini" );
TConfig pro( proname );
int ncols = pro.get_int( "NCOLS", "COLUMNS" );
// Disabilita tutte le colonne
for ( int i = 1; i <= MAX_COLUMNS; i ++ )
f.disable_cell ( f.items( ) - 1, i );
// Abilita le colonne indicate nel profilo della riga
for ( i = 1; i <= ncols; i ++ )
{
TString16 chiave;
chiave.format( "%d", i );
int coltoenable = pro.get_int( chiave, "COLUMNS" );
f.enable_cell ( numrig - 1, coltoenable - 1 );
}
}
void TMotore_application::store_riga( TSheet_field& f, int numrig, TRectype& r )
{
TToken_string& rigastr = f.row( numrig );
TRiga riga;
riga.load(f, rigastr, &r);
riga.save( r );
}
void TMotore_application::open_files(int logicnum, ...)
{
va_list marker;
@ -805,7 +633,6 @@ void TMotore_application::on_firm_change()
_config_ditta = new TConfig(CONFIG_DITTA);
condv().set_config(_config_ditta);
_doc_masks.destroy();
_row_masks.destroy();
TApplication::on_firm_change();
}
@ -830,17 +657,19 @@ bool TMotore_application::user_create( )
_rel = new TRelation( LF_DOC );
open_files(LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, 0);
_doc = new TDocumento;
_rel->lfile().set_curr(_doc);
_doc->set_relation(_rel);
_clifor = new TCliForVendite( );
_condv = new TCond_vendita(*_clifor, _config_ditta);
_condv = new TCond_vendita(_clifor, _config_ditta);
_doc->set_condv(_condv);
azzera_piedi( );
_msk = new TMask( "ve0100a" );
query_mask( ).set_handler( F_CODNUM, num_handler );
query_mask( ).set_handler( F_TIPODOC, tip_handler );
TConfig utente( CONFIG_USER );
_doc->head().put("CODNUM", utente.get("CODNUM"));
_doc->head().put("TIPODOC", utente.get("TIPODOC"));
_msk->set(F_CODNUM, utente.get("CODNUM"));
_msk->set(F_TIPODOC, utente.get("TIPODOC"));
// La maschera di inserimento/modifica per ora non la so!
// Viene letta dal profilo non appena trovato il record
@ -852,7 +681,7 @@ bool TMotore_application::user_destroy( )
// Registro l'ultimo tipo documento e l'ultima numerazione
TConfig utente( CONFIG_USER );
utente.set( "CODNUM", _doc->numerazione(), "ve" );
utente.set( "TIPODOC", _doc->tipo().codice(), "ve" );
utente.set( "TIPODOC", _doc->get("TIPODOC"), "ve" );
if (_config_ditta != NULL)
delete _config_ditta;
@ -861,7 +690,6 @@ bool TMotore_application::user_destroy( )
delete _msk;
// Distruggo la relazione
delete _doc;
delete _rel;
delete _condv;

View File

@ -14,27 +14,8 @@
#define NO_CHANGE_STATUS -1
// #define NO_DOC_STATUS -2
#define F_SHEET 500
#define F_MEMORIGA 501
#define BASE_PIEDE 600
#define CHANGE_MESSAGE "Sono state effettuate modifiche alla configurazione.\nPrima di eseguire la gestione documenti occorre rigenerare le maschere.\nDesideri farlo ora ?"
// Modifiche pianificate per il dopo/cattolica:
// Rorganizzazione del codice come:
// Oggetto documento
// che contiene:
// Array di oggetti riga
// Oggetto Cliente
// Oggetto Cambio
// Oggetto Sconto testa
#define F_LBTIPORIGA 175
#define NPIEDI 40
// #include <xvt_defs.h>
#ifndef __CHECKS_H
#include <checks.h>
@ -48,10 +29,6 @@
#include <tabutil.h>
#endif
#ifndef __BRWAPP_H
#include <brwapp.h>
#endif
#ifndef __RELAPP_H
#include <relapp.h>
#endif
@ -129,8 +106,6 @@ class TMotore_application : public TRelation_application
{
TArray _file; // Tutti i fiels da usare
// Array di totalizzatori
TPiede_documento _piede;
TDocumento * _doc;
@ -167,16 +142,11 @@ class TMotore_application : public TRelation_application
TAssoc_array _doc_masks;
// Array di maschere righe
TAssoc_array _row_masks;
// Ridefinizione dei metodi virtuali
virtual bool user_create( );
virtual bool user_destroy( );
virtual TMask* get_mask( int mode );
virtual bool changing_mask( int mode );
virtual TRelation* get_relation( ) const { return _rel;}
virtual void init_query_mode(TMask& m);
virtual void init_insert_mode( TMask& m );
virtual int read( TMask& m );
@ -194,11 +164,6 @@ class TMotore_application : public TRelation_application
void user_set_handler( int fieldid, int index, TMask* m = NULL );
void azzera_piedi( );
void carica_piedi( );
void somma_piedi( );
void sottrai_piedi( );
// Esegue, se c'h, la procedura utente relativa ad una certa operazione
int esegui_procedura( int operazione );
@ -214,8 +179,7 @@ protected:
// formato dipendente dallo sheet ( sono le varie colonne )
void load_riga( TSheet_field& f, int numrig, TRectype& r );
void store_riga( TSheet_field& f, int numrig, TRectype& r );
// void load_riga( TSheet_field& f, int numrig, TRectype& r );
void save( TRelation* r ) const;
void set_descr ( int numrig, const char* descr );
@ -231,7 +195,7 @@ protected:
TString& stati_validi( int operazione ){ return ( pro( ).get( "STATIVALIDI", nome_sezione( operazione ) ) );}
// Handle che ritorna la maschera per le righe
static TMask * ss_getmask( int numriga, TMask& fullmask, bool destroy );
static TMask * ss_getmask( int numriga, TMask& fullmask);
// Handler che gestisce la richiesta del tipo riga in inserimento
static bool ss_handler( TSheet_field& ss, int r, KEY key );
@ -255,6 +219,8 @@ protected:
public:
virtual TRelation* get_relation( ) const { return _rel;}
// Funzioni di accesso alle variabili private
TConfig & pro() { CHECK( _pro, "Profilo del documento nullo!" ); return *_pro; }
@ -264,9 +230,9 @@ public:
TRelation & rel() { CHECK( _rel, "Relazione nulla!" ); return *_rel; }
TSheet_field & sheet() { CHECK( _sheet, "Sheet nullo!" ); return *_sheet; }
TCliForVendite & clifo() { CHECK( _clifor, "Oggetto cliente nullo!" ); return *_clifor; }
TPiede_documento & piede() { return _piede; }
TCond_vendita & condv() { return *_condv; }
TConfig & config_ditta() {return *_config_ditta; }
TDocumento & doc() {return *_doc; }
// Operazione
@ -281,5 +247,6 @@ public:
};
TMotore_application& app( ) { return ( TMotore_application& ) main_app( ); }
inline TMotore_application & app() { return (TMotore_application &) main_app(); }
#endif

View File

@ -21,11 +21,11 @@
#endif
#ifndef __VEUML_H
#include "VeUML.h"
#include "veuml.h"
#endif
#ifndef __VEUML1_H
#include "VeUML1.h"
#include "veuml1.h"
#endif
#ifndef __VE0100_H
@ -104,3 +104,200 @@ bool condpag_hndl( TMask_field& field, KEY key )
return TRUE;
}
// handler delle righe
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 );
}
}
HIDDEN TString16 curr_um;
HIDDEN real curr_fc(1.0);
bool codart_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask();
// TMask & mask = app().edit_mask();
TMask & mask = row_mask.get_sheet()->mask();
TCond_vendita & condv = app().condv();
condv.set_testa(&mask);
condv.set_riga(&row_mask);
TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file();
TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file();
condv.set_anamag(anamag);
condv.set_umart(umart);
TString80 codart(f.get());
anamag.setkey(1);
anamag.put("CODART", codart);
if (anamag.read() != NOERR)
{
TLocalisamfile codalt(LF_CODCORR);
codalt.setkey(2);
codalt.put("CODARTALT", codart);
if (codalt.read() == NOERR)
{
codart = codalt.get("CODART");
anamag.zero();
anamag.put("CODART", codart);
if (anamag.read() == NOERR)
f.set(codart);
}
}
if (anamag.good())
{
const TString16 lingua = mask.get(F_CODLIN);
const TString codart(row_mask.get(FR_CODART));
TString desc(anamag.get("DESCR"));
if (lingua.not_empty())
{
TLocalisamfile deslin(LF_DESLIN);
deslin.setkey(2);
deslin.put("CODART", codart);
deslin.put("CODLIN", lingua);
if (deslin.read() == NOERR)
desc = deslin.get("DESCR");
}
row_mask.set(FR_DESCR, desc);
umart.setkey(1);
umart.zero();
umart.put("CODART", codart);
if (umart.read(_isgteq) == NOERR && codart == umart.get("CODART"))
{
curr_um = umart.get("UM");
curr_fc = umart.get_real("FC");
}
else
{
curr_um.cut(0);
curr_fc = 1.0;
}
row_mask.set(FR_UMQTA, curr_um);
}
condv.ricerca();
}
return TRUE;
}
bool umart_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
// TMask & mask = app().edit_mask();
TMask & mask = row_mask.get_sheet()->mask();
TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file();
TLocalisamfile & umart = ((TEdit_field &) f).browse()->cursor()->file();
TCond_vendita & condv = app().condv();
condv.set_testa(&mask);
condv.set_riga(&row_mask);
condv.set_anamag(anamag);
condv.set_umart(umart);
condv.ricerca(FALSE);
const TString16 um(f.get());
real fc(1.0);
if (um.not_empty() && curr_um.not_empty() && um != curr_um)
{
umart.setkey(2);
umart.put("CODART", row_mask.get(FR_CODART));
umart.put("UM", um);
if (umart.read() == NOERR)
{
real qta(row_mask.get_real(FR_QTA));
qta *= curr_fc;
fc = umart.get_real("FC");
qta /= fc;
row_mask.set(FR_QTA, qta);
}
}
curr_um = um;
curr_fc = fc;
}
return TRUE;
}
bool descr_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
const TString s(f.get());
if (s.find('\n') < 0)
{
TLocalisamfile & anamag = ((TEdit_field &) f).browse()->cursor()->file();
anamag.zero();
anamag.setkey(2);
anamag.put("DESCR", ((TZoom_field &) f).get_first_line());
if (anamag.read() == NOERR)
{
f.mask().set(FR_CODART, anamag.get("CODART"));
f.mask().field(FR_CODART).set_dirty();
f.mask().check_field(FR_CODART);
}
}
}
return TRUE;
}
bool qta_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
// TMask & mask = app().edit_mask();
TMask & mask = row_mask.get_sheet()->mask();
TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file();
TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file();
TCond_vendita & condv = app().condv();
condv.set_testa(&mask);
condv.set_riga(&row_mask);
condv.set_anamag(anamag);
condv.set_umart(umart);
condv.ricerca(FALSE);
}
return TRUE;
}
bool cod_handler( TMask_field& f, KEY key )
{
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
TMask & mask = row_mask.get_sheet()->mask();
real cambio = mask.get(F_CAMBIO);
if (cambio != 0.0)
{
real prezzo = row_mask.get(FR_PREZZO);
prezzo /= mask.get_real(F_CAMBIO);
row_mask.set(FR_PREZZO, prezzo);
}
}
return TRUE;
}

View File

@ -1,8 +1,14 @@
#define __VE0100C_H
// Handlers per i campi delle bolle
// Handlers per testata e righe
extern bool ora_hndl(TMask_field& field, KEY key);
extern bool codcli_hndl(TMask_field& field, KEY key);
extern bool dummy_hndl(TMask_field& field, KEY key);
extern bool condpag_hndl(TMask_field& field, KEY key);
bool ora_hndl(TMask_field& field, KEY key);
bool codcli_hndl(TMask_field& field, KEY key);
bool dummy_hndl(TMask_field& field, KEY key);
bool condpag_hndl(TMask_field& field, KEY key);
void row_set_handler(TMask& m, const int field, const int index);
bool codart_handler(TMask_field& f, KEY key);
bool umart_handler(TMask_field& f, KEY key);
bool descr_handler(TMask_field& f, KEY key);
bool qta_handler(TMask_field& f, KEY key);
bool cod_handler(TMask_field& f, KEY key);

View File

@ -87,7 +87,7 @@ PAGE "Gestione spese bolli" 1 1 60 14
NUMBER F_SPBOSCA1 11
BEGIN
PROMPT 2 2 "Scaglione "
FIELD SPBOBSCA[1]
FIELD SPBOSCA[1]
PICTURE "."
END

View File

@ -91,7 +91,7 @@
// Numero massimo di linee per pagina
#define MAX_LINES_PER_PAGE 18
#define MAX_LINES_PER_PAGE 19
#define MASK_FIRST_LINE 6
#define GROUPKEY(x) format( "%5d", x )
@ -120,7 +120,7 @@ public:
void check( const int i );
// PAGE
void pagina( const int i, const TString& title = "Pagina " ){ _out << "PA \"" << title << " " << i << "\" 11 60 14\n"; };
void pagina( const int i, const TString& title = "Pag." ){ _out << "PA \"" << title << " " << i << "\" 11 60 14\n"; };
// PROMPT
void prompt( const int x, const int y, const TString& s = "" ){ _out << "PR " << x << " " << y << " \"" << s << "\"\n"; };
@ -148,7 +148,7 @@ public:
// PICTURE
void picture( const int p) { _out << "PI " << p << "\n"; };
void picture( const TString & s) { _out << "PI " << s << "\n"; };
void picture( const TString & s) { _out << "PI " << '\"' << s << "\"\n"; };
// FIELD
void field( const TString& s ) { outline( s, "FI "); };
@ -503,9 +503,8 @@ void TGruppo::add( TField * field )
TGruppo::TGruppo( int i )
{
TConfig pro( "ve0300c.ini" );
_id = i;
_height = pro.get_int( "HEIGHT", format( "%d", i ) );
_height = 0;
}
TGruppo::TGruppo( int i, int height )
@ -530,8 +529,16 @@ static void verifica_campo( const TObject& campo )
TGruppo & gruppo = cmp.grp();
cmp.stato(cmp.stato_reale());
if (!gruppo.present() && cmp.stato() != S_NASCOSTO)
if (cmp.stato() != S_NASCOSTO)
{
int h = cmp.y() + 1;
if (cmp.type() == T_CORNICE)
h += cmp.size()%100 - 1;
if (gruppo.height() < h)
gruppo.height(h);
if (!gruppo.present())
gruppo.present(TRUE);
}
}
HIDDEN TProgind * _bar;
@ -896,8 +903,7 @@ void TMask_generator::carica_dati_campi( const TFilename& fn, TAssoc_array& a )
}
TString16 taggruppo;
taggruppo.format( "%d", campo->gruppo( ) );
int hgruppo = _groupsini.get_int( "HEIGHT", taggruppo );
gruppo = new TGruppo( campo->gruppo( ), hgruppo );
gruppo = new TGruppo( campo->gruppo( ));
gruppo->generatore( *this );
}
gruppo->add( campo );
@ -974,9 +980,8 @@ void TMask_generator::carica_dati_campi( const TFilename& fn, TAssoc_array& a )
a.add( curgruppo, gruppo );
}
TString16 taggruppo;
taggruppo.format( "%d", campo->gruppo( ) );
int hgruppo = _groupsini.get_int( "HEIGHT", taggruppo );
gruppo = new TGruppo( campo->gruppo( ), hgruppo );
taggruppo.format("%d", campo->gruppo());
gruppo = new TGruppo(campo->gruppo());
gruppo->generatore( *this );
}
gruppo->add( campo );
@ -1184,7 +1189,7 @@ void TMask_generator::genera( const TString& profilo )
_m->begin( );
_m->prompt( 2, 1, "Cod. num. " );
_m->field("CODNUM");
_m->use("NUM", 1);
_m->use("%NUM", 1);
temp_s.format("CODTAB %d", F_CODNUM);
_m->input(temp_s);
_m->display("\"Codice\" CODTAB~\"Descrizione@50\" S0");
@ -1332,7 +1337,6 @@ void TMask_generator::genera( const TString& profilo )
// Generazione
// carica_ordine_gruppi( );
// Scorro l'array dei gruppi, e ne creo una copia ordinata
// con solo i gruppi visibili
@ -1381,29 +1385,38 @@ void TMask_generator::genera( const TString& profilo )
// Generazione pagina dei piedi
{
TToken_string s(_pro->get("PROGPIEDE", "MAIN"));
TToken_string s(_pro->get("CAMPICALC", "MAIN"));
if (s.not_empty())
{
intestazione_pagina( );
TTable ppd( "%PPD" );
TTable frd( "%FRD" );
int nr = 1;
int id = 0;
for (const char * cp = s.get(0); cp && *cp; cp = s.get())
{
const TString16 codpiede(cp);
do_events();
ppd.zero( );
ppd.put( "CODTAB", codpiede );
if ( ppd.read( ) == NOERR )
frd.zero( );
frd.put( "CODTAB", codpiede );
if ( frd.read( ) == NOERR )
{
const TString80 picture(ppd.get( "S3"));
const TString80 picture(frd.get( "S3"));
const int len = picture.len() > 0 ? picture.len() : 18;
int dec = picture.find(',');
if (dec >= 0)
dec = len - dec - 1;
else
dec = 0;
id++;
_m->control( T_NUMERO, BASE_PIEDE + id, 1805);
if (frd.get_bool("B0"))
_m->control( T_NUMERO, BASE_PIEDE + id, len * 100 + dec);
else
_m->control( T_STRINGA, BASE_PIEDE + id, len * 100);
_m->begin( );
TString80 header(ppd.get("S0")); header.left_just(40 - picture.len());
TString80 header(frd.get("S0")); header.left_just(58 - len);
_m->prompt( 2, 7 + nr, header );
_m->field(codpiede);
@ -1447,7 +1460,6 @@ protected:
virtual bool create ( );
virtual bool destroy( );
// virtual bool menu( MENU_TAG ); // Controlla il menu
};

View File

@ -57,16 +57,24 @@
// Campi per ve0200d.uml
#define F_SPINCODIVA 101
#define F_SPINDESIVA 102
#define F_SPINCODCON1 103
#define F_SPINCODCON2 104
#define F_SPINCODCON3 105
#define F_SPINDESCON 106
#define F_SPBRBCODIVA 107
#define F_SPBRBDESIVA 108
#define F_SPBRBCODCON1 109
#define F_SPBRBCODCON2 110
#define F_SPBRBCODCON3 111
#define F_SPBRBDESCON 112
#define F_SPINCODCON1V 103
#define F_SPINCODCON2V 104
#define F_SPINCODCON3V 105
#define F_SPINDESCONV 106
#define F_SPBOCODIVA 107
#define F_SPBODESIVA 108
#define F_SPBOCODCON1V 109
#define F_SPBOCODCON2V 110
#define F_SPBOCODCON3V 111
#define F_SPBODESCONV 112
#define F_SPBOCODCON1A 113
#define F_SPBOCODCON2A 114
#define F_SPBOCODCON3A 115
#define F_SPBODESCONA 116
#define F_SPINCODCON1A 117
#define F_SPINCODCON2A 118
#define F_SPINCODCON3A 119
#define F_SPINDESCONA 120
// Campi per ve0200e.uml
#define F_RICERCACR1 101

View File

@ -11,3 +11,11 @@
#define S_DISABILITATO 1
#define S_NORMALE 2
#define S_OBBLIGATORIO 3
// #define F_LBTIPORIGA 175
// #define NPIEDI 40
#define F_SHEET 500
// #define F_MEMORIGA 501
#define BASE_PIEDE 600

File diff suppressed because it is too large Load Diff

View File

@ -5,14 +5,176 @@
#include <relation.h>
#endif
real lordo2netto(real& lordo, const TString& codiva, bool is_valuta = FALSE);
real netto2lordo(const real& netto, const TString& codiva, bool is_valuta = FALSE);
real lordo2netto(real& lordo, const real& iva, bool is_valuta = FALSE);
real netto2lordo(const real& netto, const real& iva, bool is_valuta = FALSE);
#ifndef __VARREC_H
#include <varrec.h>
#endif
#ifndef __VARMASK_H
#include <varmask.h>
#endif
#ifndef __PAGAMENT_H
#include "../cg/pagament.h"
#endif
class TDocumento;
class TRiga_documento;
class TCond_vendita;
class TIVA;
real lordo2netto(real& lordo, const TString& codiva, int ndec);
inline real lordo2netto(real& lordo, const TString& codiva, bool is_valuta = FALSE) { return lordo2netto(lordo, codiva, is_valuta ? 3 : 0);}
real netto2lordo(const real& netto, const TString& codiva, int ndec);
inline real netto2lordo(const real& netto, const TString& codiva, bool is_valuta = FALSE) { return netto2lordo(netto, codiva, is_valuta ? 3 : 0);}
real lordo2netto(real& lordo, const real& iva, int ndec);
inline real lordo2netto(real& lordo, const real& iva, bool is_valuta = FALSE) {return lordo2netto(lordo, iva, is_valuta ? 3 : 0); }
real netto2lordo(const real& netto, const real& iva, int ndec);
inline real netto2lordo(const real& netto, const real& iva, bool is_valuta = FALSE) { return netto2lordo(netto, iva, is_valuta ? 3 : 0); }
real prezzo_scontato(const real& prezzo, const char * sconto);
real iva(real imponibile, const TIVA & codiva,int ndec);
bool ora_hndl(TMask_field& field, KEY key);
bool codcli_hndl(TMask_field& field, KEY key);
bool dummy_hndl(TMask_field& field, KEY key);
bool condpag_hndl(TMask_field& field, KEY key);
class TDocumento_variable_field : public TVariable_field
{
bool _dirty;
public:
// @cmember segnala che il campo deve essere ricalcolato
virtual bool dirty() const { return _dirty;}
// @cmember assegna lo stato di campo da ricalcolare
virtual void set_dirty(bool on = TRUE) { _dirty = on;}
// @ cmember Costruttore con una espressione di calcolo
TDocumento_variable_field(const char * name, const char * expr = "", TTypeexp type = _strexpr)
: TVariable_field(name, expr, type), _dirty(TRUE) {}
// @ cmember Costruttore con una funzione
TDocumento_variable_field(const char * name, VIRTUAL_GET_FUNCTION getfunc)
: TVariable_field(name, getfunc), _dirty(TRUE) {}
// @ cmember Costruttore con una espressione di calcolo
TDocumento_variable_field(const char * name, TExpression * expr, TTypeexp type = _strexpr)
: TVariable_field(name, expr, type), _dirty(TRUE) {}
// @ cmember Costruttore con un variable_field
TDocumento_variable_field(const TVariable_field & f) : TVariable_field(f), _dirty(TRUE) {}
// @ cmember Distruttore
~TDocumento_variable_field() {}
};
class TSpesa_prest : public TRectype
{
protected:
int read(const char* codice);
public:
TObject* dup() const { return new TSpesa_prest(codice()); }
public:
const TString& codice() const { return get("CODTAB");}
const TString& descrizione() const { return get("S0"); }
const TString& field_perc() const { return get("S5"); }
char tipo() const { return get_char("S6"); }
char genere() const { return get("COD") == "SPP" ? 'S' : 'P'; }
TSpesa_prest(const char* codice = NULL, char tipo = 'S');
TSpesa_prest(const TRectype& rec);
virtual ~TSpesa_prest() {}
};
class TIVA : public TRectype
{
protected:
int read(const char* codice);
public:
TObject* dup() const { return new TIVA(codice()); }
public:
const TString& codice() const { return get("CODTAB");}
const TString& descrizione() const { return get("S0"); }
const real aliquota() const { return get_real("R0"); }
const TString& tipo() const { return get("S1"); }
TIVA(const char* codice = NULL);
TIVA(const TRectype& rec);
virtual ~TIVA() {}
};
class TExpr_documento : public TExpression
{
TDocumento * _doc;
TRiga_documento * _row;
protected:
virtual void evaluate_user_func(int index, int nparms, TEval_stack & stack, TTypeexp type) const;
virtual int parse_user_func(const char * name, int nparms) const;
public:
// @cmember Duplica l'espressione
virtual TObject* dup() const;
// @cmember Assegna il documento corrente
void set_doc(TDocumento * doc) { _doc = doc; }
// @cmember Assegna il documento corrente
void set_row(TRiga_documento * row) { _row = row; }
// @cmember Costruttore (assegna l'estressione e il suo tipo)
TExpr_documento(const char* expression, TTypeexp type = _numexpr,
TDocumento * doc = NULL, TRiga_documento * row = NULL);
// @cmember Costruttore (assegna il tipo dell'istruzione)
TExpr_documento(TTypeexp type = _numexpr,
TDocumento * doc = NULL, TRiga_documento * row = NULL)
: TExpression(type), _doc(doc), _row(row) {}
// @cmember Costruttore di copia
TExpr_documento(const TExpr_documento & expr)
: TExpression(expr), _doc(expr._doc), _row(expr._row) {}
// @cmember Distruttore
virtual ~TExpr_documento() {}
};
enum TTipo_formula { _documento, _riga };
class TFormula_documento : public TRectype
{
TString16 _tab;
TExpr_documento * _expr;
protected:
int read(const char* codice);
public:
TObject* dup() const { return new TFormula_documento(_tab == "%FRD" ? _documento : _riga, codice()); }
public:
const TString& codice() const { return get("CODTAB");}
const TString& name() const { return codice();}
TExpr_documento * expr() const { return _expr ? new TExpr_documento(*_expr) : NULL;}
const TString& descrizione() const { return get("S0"); }
const TString& expr_string() const { return get("S1"); }
TTypeexp expr_type() const { return get_bool("B0") ? _numexpr : _strexpr;}
TFormula_documento(TTipo_formula tipo = _documento, const char* codice = NULL);
TFormula_documento(const TRectype& rec);
virtual ~TFormula_documento();
};
class TTipo_documento : public TRectype
{
static TAssoc_array _formule_documento;
TToken_string _formule;
TString16 _imponibile;
TString16 _imposta;
TString16 _totale;
TString16 _basesconto;
TString16 _spese;
protected:
void read_formule();
int read(const char* tipodoc);
public:
@ -26,6 +188,15 @@ public:
const TString& descrizione() const { return get("S0"); }
const TString& riferimento() const { return get("S1"); }
const TString& imponibile() const { return _imponibile;}
const TString& imposta() const { return _imposta;}
const TString& totale_doc() const { return _totale;}
const TString& basesconto() const { return _basesconto;}
const TString& spese() const { return _spese;}
TFormula_documento * first_formula() { return succ_formula(TRUE); }
TFormula_documento * succ_formula(bool restart = FALSE);
const int ncopie() const { return get_int("I0"); }
TTipo_documento(const char* tipodoc = NULL);
@ -35,17 +206,35 @@ public:
class TTipo_riga_documento : public TRectype
{
static TAssoc_array _formule_riga;
TToken_string _formule;
TString16 _name;
TString16 _imponibile;
TString16 _imposta;
TVariable_mask * _mask;
protected:
void read_formule();
int read(const char* tiporig);
public:
TObject* dup() const { return new TTipo_riga_documento(codice()); }
public:
const TString& profile_name() const { return _name;}
const TString& mask_name() const { return profile_name();}
const TString& codice() const { return get("CODTAB");}
bool mask_loaded() const { return _mask != NULL; }
TVariable_mask * mask();
const TString& descrizione() const { return get("S0"); }
char tipo() const { return get_char("S7"); }
const TString& imponibile() const { return _imponibile;}
const TString& imposta() const { return _imposta;}
TFormula_documento * first_formula() { return succ_formula(TRUE); }
TFormula_documento * succ_formula(bool restart = FALSE);
TTipo_riga_documento(const char* tiporig = NULL);
TTipo_riga_documento(const TRectype& rec);
@ -53,60 +242,107 @@ public:
};
class TRiga_documento : public TRectype
class TRiga_documento : public TAuto_variable_rectype
{
friend class TDocumento;
const TDocumento* _doc;
TDocumento * _doc;
static TAssoc_array _tipi;
static TAssoc_array _spese;
static TAssoc_array _ive;
protected:
void set_doc(const TDocumento* doc) { _doc = doc; }
// @cmember Setta il contenuto del campo <p fieldname> (non tipizzata)
virtual void put_str(const char* fieldname, const char* val);
protected:
TObject* dup() const { return new TRiga_documento(*this); }
public:
const TDocumento& documento() const
{ CHECK(_doc, "Riga documento orfana"); return *_doc; }
void dirty_fields(bool dirty_document = TRUE);
bool doc_dependent() const;
int numero() const { return get_int("NRIGA");}
void set_numero(int numero) { put("NRIGA", numero);}
// @cmember Assegna il documento corrente
void set_doc(TDocumento * doc) { _doc = doc; }
const TDocumento & doc() const { CHECK(_doc, "Documento nullo"); return *_doc;}
const TTipo_riga_documento& tipo() const;
virtual void zero(const char * fieldname);
virtual void zero(char c = '\0');
// row -> sheet
void autoload( TSheet_field& f);
// sheet -> row
void autosave( TSheet_field& f);
const TTipo_riga_documento & tipo() const;
const TSpesa_prest & spesa() const;
static const TIVA & iva(const char * codice);
const TIVA & iva() const {const TString16 cod(get("CODIVA")); return iva(cod);}
void set_tipo(const char * tipo) { put("TIPORIGA", tipo);}
bool sola_descrizione() const;
void forza_sola_descrizione();
TRiga_documento& operator =(const TRiga_documento& r)
{ TRectype::operator=(r); _doc = r._doc; return *this; }
virtual TRectype & operator =(const TRectype & r);
virtual TRectype & operator =(const char * r);
bool raggruppabile(const TRiga_documento& r, TToken_string& campi) const;
TRiga_documento& operator +=(const TRiga_documento& r);
TRiga_documento(const TDocumento* doc) : TRectype(LF_RIGHEDOC), _doc(doc) { }
TRiga_documento(const TRiga_documento& rec) : TRectype(rec), _doc(rec._doc) { }
virtual ~TRiga_documento() { }
void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); }
void set_fields(TAuto_variable_rectype & rec);
real prezzo(bool scontato, bool lordo, int ndec) const ;
real importo(bool scontato, bool lordo, int ndec, bool iva_calc = FALSE) const ;
// real iva(int ndec) const {return ::iva(importo(TRUE, FALSE, ndec, TRUE), iva(), ndec);}
real iva(int ndec) const {return ::iva(imponibile(), iva(), ndec);}
real imponibile() const;
real imposta() const;
TRiga_documento(TDocumento* doc, const char * tipo = NULL);
TRiga_documento(const TRiga_documento& rec, TDocumento* doc,
const char * tipo = NULL);
virtual ~TRiga_documento() {}
};
class TDocumento : public TRectype
class TDocumento : public TAuto_variable_rectype
{
static TAssoc_array _tipi;
TRecord_array _rows; // Array di TRectype per le righe documenti di vendita.
bool _nuovo;
TRelation * _rel;
TCond_vendita * _condv;
TPagamento _pag;
protected:
TRectype & row(int index) { return _rows.row(index, FALSE); }
TAuto_variable_rectype & row(int index) { return (TAuto_variable_rectype &) _rows.row(index, FALSE); }
long get_next_key(char provv, int anno, const char* codnum) const;
virtual void put_str(const char* fieldname, const char* val);
long renum(long numdoc = 0);
public:
const TRectype& head() const { return *this; } // Ritorna la testata del documento
TRectype& head() { return *this; } // Ritorna la testata del documento
void dirty_fields();
const TAuto_variable_rectype& head() const { return *this; } // Ritorna la testata del documento
TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento
TCond_vendita & condv() const {CHECK(_condv, "Condizioni di vendita nulle"); return *_condv;}
TRelation & get_relation() const {CHECK(_rel, "Relazione nulla"); return *_rel;}
void set_condv(TCond_vendita * condv) { _condv = condv; }
void set_relation(TRelation * rel) { _rel = rel; }
virtual TRectype & operator =(const TRectype & r);
virtual TRectype & operator =(const char * r);
virtual void zero(const char * fieldname);
virtual void zero(char c = '\0');
int rows() const { return _rows.rows(); }
const TRiga_documento& operator[](int index) const { return (const TRiga_documento&)_rows.row(index); }
TRiga_documento& operator[](int index) { return (TRiga_documento&)_rows.row(index, FALSE); }
TRiga_documento& new_row() { return (TRiga_documento&)_rows.row(-1, TRUE); }
bool destroy_row(int n) { return _rows.destroy_row(n); }
TRiga_documento& insert_row(int row, const char *tipo = NULL);
TRiga_documento& new_row(const char *tipo = NULL);
bool destroy_row(int n, bool pack = FALSE) { return _rows.destroy_row(n, pack); }
void destroy_rows() { _rows.destroy_rows(); }
int read(char provv, int anno, const char* codnum, long numdoc);
@ -121,10 +357,11 @@ public:
const TString& numerazione() { return get("CODNUM"); }
long numero() const { return get_long("NDOC"); }
TDate data() const { return get_date("DATADOC"); }
const bool in_valuta();
const TString& valuta() { return get("CODVAL"); }
const bool in_valuta() const;
const TString& valuta() const { return get("CODVAL"); }
const real cambio() { return get_real("CAMBIO"); }
const TTipo_documento& tipo() const;
void set_tipo(const char * tipo) { head().put("TIPODOC", tipo);}
char stato() const { return get_char("STATO"); }
void stato(char s) { put("STATO", s); }
@ -135,12 +372,49 @@ public:
static void set_key(TRectype& rec, char provv, int anno, const char* codnum, long numdoc);
static void copy_data(TRectype& dst, const TRectype& src);
void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); }
void set_fields(TAuto_variable_rectype & rec);
real spese_incasso(real & imp, int ndec, bool netto = FALSE) const ;
real bolli(real & imp, int ndec, bool netto = FALSE) const ;
real descrizione() const;
real riferimento() const;
real imponibile() const;
real imposta() const;
real totale_doc() const;
real basesconto() const;
real spese() const;
TPagamento & pagamento();
TDocumento ();
TDocumento(char provv, int anno, const char* codnum, long numdoc);
TDocumento(const TRectype& doc);
TDocumento(char provv, int anno, const char* codnum, long numdoc,
TCond_vendita * condv = NULL, TRelation * rel = NULL);
TDocumento(const TRectype& doc, TCond_vendita * condv = NULL,
TRelation * rel = NULL);
virtual ~TDocumento() { }
};
class TDocumento_mask : public TVariable_mask
{
int _progs_page; // pagina in cui cominciano i progressivi
int _last_prog; // numero dell'ultimo progressivo
TDocumento * _doc; // documento
protected:
virtual void next_page(int p);
public:
virtual bool on_key(KEY key);
TDocumento & doc() const {CHECK(_doc, "Documento nullo"); return *_doc;}
TCond_vendita & condv() const {CHECK(_doc, "Documento nullo"); return _doc->condv();}
TRelation & get_relation() const {CHECK(_doc, "Documento nullo"); return _doc->get_relation();}
TDocumento_mask(const char* name, TDocumento * _doc, int num = 0, int max = MAX_PAGES);
virtual ~TDocumento_mask() { }
};
class TLista_documenti : public TObject
{
TArray _documenti;

View File

@ -77,12 +77,7 @@ void TDocumentoEsteso::compile_summary()
if (_iva->read() != NOERR) continue; // Se non trova il codice salta questa riga
aliquota = _iva->get_real("R0");
if (_condv != NULL && sconto.not_empty()) // Se c'e' la condizione di vendita, calcola lo sconto...
{
_condv->set_sconto(sconto);
sc = 100.0 - _condv->sconto_val();
price = (price * sc);
}
price = scontato(price, sconto);
price.round(val ? _parm.pri_val : _parm.pri_lit); // prezzo scontato
qta.round(val ? _parm.qta_val : _parm.qta_lit);
imponibile = price * qta;
@ -299,30 +294,10 @@ const char* TDocumentoEsteso::get_head_info(const TString & what)
return (const char*) rt;
}
void TDocumentoEsteso::set_condv(TCliFor* cli)
{
if (_condv != NULL)
delete _condv;
if (cli != NULL)
_condv = new TCond_vendita(*cli);
}
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, TCliFor *cli)
: TDocumento(rec), _condv(NULL), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1)
: TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1)
{
_iva = new TTable("%IVA");
if (cli != NULL) _condv = new TCond_vendita(*cli);
else
{
TCliFor cf;
TString16 tipocf,ocfpi;
long codcf;
tipocf = get("TIPOCF");
codcf = get_long("CODCF");
ocfpi = get("OCFPI");
cf.load(tipocf[0],codcf,ocfpi);
_condv = new TCond_vendita(cf);
}
// Inizializza i parametri di default
_parm.pri_lit = 0; _parm.pri_val = 3;
_parm.qta_lit = 3; _parm.qta_val = 3;
@ -330,26 +305,14 @@ TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, TCliFor *cli)
}
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm, TCliFor *cli)
: TDocumento(rec), _condv(NULL), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1)
: TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1)
{
_parm = parm;
_iva = new TTable("%IVA");
if (cli != NULL) _condv = new TCond_vendita(*cli);
else
{
TCliFor cf;
TString16 tipocf,ocfpi;
long codcf;
tipocf = get("TIPOCF");
codcf = get_long("CODCF");
ocfpi = get("OCFPI");
cf.load(tipocf[0],codcf,ocfpi);
_condv = new TCond_vendita(cf);
}
}
TDocumentoEsteso::TDocumentoEsteso()
: TDocumento(), _condv(NULL), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1)
: TDocumento(), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1)
{
_iva = new TTable("%IVA");
}
@ -357,7 +320,6 @@ TDocumentoEsteso::TDocumentoEsteso()
TDocumentoEsteso::~TDocumentoEsteso()
{
if (_iva != NULL) delete _iva;
if (_condv != NULL) delete _condv;
}

View File

@ -78,7 +78,6 @@ class TDocumentoEsteso : public TDocumento
// Parametri del documento
dec_parm _parm; // Parametri per gli arrotondamenti
TTable * _iva; // Tabella codici IVA
TCond_vendita * _condv; // Condizioni di vendita per lo sconto
// Totali del documento ricalcolati non appena la tabellina di riepilogo IVA e' completa
real _importi_netti, _imposte;