2009-04-17 16:14:22 +00:00
# include <colors.h>
2009-04-22 16:01:28 +00:00
# include <urldefid.h>
2009-04-17 16:14:22 +00:00
2009-06-15 08:16:54 +00:00
# include "../ve/sconti.h"
2009-04-17 16:14:22 +00:00
# include "../ve/ve0100.h"
# include "../ve/veini.h"
# include "../ve/veuml.h"
# include "../ve/veuml3.h"
# include "../ve/verig.h"
# include "../ve/vepriv.h"
# include "../ve/velib.h"
# include "../ve/velib04.h"
# define F_K F_USERFLD
2009-04-21 00:07:11 +00:00
# define F_LIVELLO F_USERFLD+1
# define F_DETTAGLIO F_USERFLD+2
2009-04-22 16:01:28 +00:00
# define F_COPIA F_USERFLD+3
# define F_INCOLLA F_USERFLD+4
2009-04-25 07:04:22 +00:00
# define F_SHRINK_ALL F_USERFLD+5
# define F_ZOOM_ALL F_USERFLD+6
# define F_SHRINK_ROW F_USERFLD+7
# define F_ZOOM_ROW F_USERFLD+8
2009-05-11 13:00:22 +00:00
# define F_USEK F_USERFLD+9
2009-06-30 09:36:17 +00:00
# define F_REVISION F_USERFLD+10
2009-07-30 15:18:05 +00:00
# define F_LOAD_COSTS F_USERFLD+11
2009-08-29 18:56:49 +00:00
# define F_COPIA_TUTTO F_USERFLD+12
2010-04-20 10:41:59 +00:00
# define F_TIPO_COSTO F_USERFLD+13
2009-04-17 16:14:22 +00:00
# define FOR_EACH_DOC_ROW_BACK(d, r, row) const TRiga_documento* row = NULL; for (int r = d.rows(); r > 0 && (row = &d[r]) != NULL; r--)
//////////////////////////////////////////
//// CLASSE TGestione_preventivo_msk ////
//////////////////////////////////////////
//Definizione della classe della maschera
class TGestione_preventivo_msk : public TDocumento_mask
{
int _rule ;
2009-04-22 16:01:28 +00:00
int _clipboard_row ;
2009-07-01 22:53:41 +00:00
long _clipboard_ndoc ;
char _clipboard_provv ;
TString8 _clipboard_codnum ;
int _clipboard_anno ;
2009-05-11 13:16:47 +00:00
TString16 _field_costo ;
2009-05-04 23:34:22 +00:00
2009-04-17 16:14:22 +00:00
protected :
//hanlder di documento:
static bool pe_data_handler ( TMask_field & f , KEY k ) ;
//handler di riga:
static bool pe_ritirato_handler ( TMask_field & f , KEY k ) ;
static bool pe_codart_handler ( TMask_field & f , KEY k ) ;
2009-04-21 00:07:11 +00:00
static bool pe_qta_handler ( TMask_field & f , KEY k ) ;
2009-05-05 15:27:01 +00:00
static bool pe_k_handler ( TMask_field & f , KEY k ) ;
2009-06-15 08:16:54 +00:00
static bool pe_prezzo_handler ( TMask_field & f , KEY k ) ;
2009-06-16 15:56:21 +00:00
static bool pe_costo_handler ( TMask_field & f , KEY k ) ;
2009-04-17 16:14:22 +00:00
static bool ss_notify ( TSheet_field & ss , int r , KEY key ) ;
virtual void on_idle ( ) ;
2009-04-20 00:06:09 +00:00
virtual void highlight_row ( int row , COLOR back = COLOR_INVALID , COLOR fore = COLOR_INVALID , bool dirty = true , bool update = true ) ;
2009-04-22 21:33:43 +00:00
const TString & build_tree_string ( int level ) ;
2009-06-30 09:36:17 +00:00
bool new_revision ( const char * codnum , long & ndoc ) const ;
2009-04-17 16:14:22 +00:00
public :
2009-04-25 07:04:22 +00:00
static bool pe_espandi_handler ( TMask_field & f , KEY k ) ;
static bool pe_espandi_riga_handler ( TMask_field & f , KEY k ) ;
2009-04-22 16:01:28 +00:00
static bool pe_copia_handler ( TMask_field & f , KEY k ) ;
static bool pe_incolla_handler ( TMask_field & f , KEY k ) ;
2009-06-30 09:36:17 +00:00
static bool pe_new_revision_handler ( TMask_field & f , KEY k ) ;
2009-07-30 15:18:05 +00:00
static bool pe_update_costi_handler ( TMask_field & f , KEY k ) ;
2009-04-22 16:01:28 +00:00
virtual void user_set_handler ( short fieldid , int index ) ;
2009-04-17 16:14:22 +00:00
virtual void user_set_row_handler ( TMask & rm , short field , int index ) ;
2010-04-20 10:41:59 +00:00
const real get_costo ( const TArticolo_giacenza & art ) ;
2009-05-05 15:27:01 +00:00
void update_prezzo_vendita ( TMask & row_mask ) ;
2009-06-16 13:10:32 +00:00
void update_costi_ricavi ( int row = - 1 , bool update_sheet = false ) ;
2010-04-20 10:41:59 +00:00
bool var_cost ( ) const { return _field_costo = = " VAR " ; }
2009-05-05 15:27:01 +00:00
2009-04-17 16:14:22 +00:00
virtual TVariable_mask * riga_mask ( int numriga ) ;
2009-04-17 16:26:10 +00:00
virtual void doc2mask ( bool reload_clifo = true , bool force_load = false , bool update = true ) ;
2009-04-17 16:14:22 +00:00
TGestione_preventivo_msk ( const char * tipodoc ) ;
} ;
//////////////////////////////////////////
//// CLASSE TGestione_preventivo_APP ////
//////////////////////////////////////////
// Definizione della classe dell'applicazione motore
class TGestione_preventivo_app : public TMotore_application
{
protected :
virtual TMask * get_mask ( int mode ) ;
virtual int write ( const TMask & m ) ;
virtual int rewrite ( const TMask & m ) ;
virtual int read ( TMask & m ) ;
virtual void init_insert_mode ( TMask & m ) ;
2009-06-30 09:36:17 +00:00
virtual void init_modify_mode ( TMask & m ) ;
2009-04-17 16:14:22 +00:00
void elimina_vuote ( const TMask & m ) ;
2009-06-30 09:36:17 +00:00
virtual bool last_doc ( char provv , int anno , const char * codnum , long & ndoc , TDate & datadoc ) const ;
2009-04-17 16:14:22 +00:00
public :
TGestione_preventivo_app ( ) { }
} ;
inline TGestione_preventivo_app & peapp ( ) { return ( TGestione_preventivo_app & ) main_app ( ) ; } ;
//////////////////////////////////////////
//// CLASSE TGestione_preventivo_MSK ////
2009-04-22 21:33:43 +00:00
2009-04-17 16:14:22 +00:00
//////////////////////////////////////////
2009-04-22 21:33:43 +00:00
const TString & TGestione_preventivo_msk : : build_tree_string ( int level )
{
2009-06-15 14:16:20 +00:00
TString & tree = get_tmp_string ( 30 ) ;
2009-04-22 21:33:43 +00:00
if ( level < 10 )
{
2009-06-15 14:16:20 +00:00
tree . fill ( ' ' , level + 3 ) ;
2009-04-22 21:33:43 +00:00
tree < < ' + ' ;
2009-06-15 14:16:20 +00:00
tree . rpad ( 13 , ' - ' ) ;
2009-04-22 21:33:43 +00:00
}
else
2009-06-15 14:16:20 +00:00
tree = " + " ;
TString l ; l . format ( " %02d " , level + 1 ) ;
tree . overwrite ( l , 0 , 2 ) ;
2009-04-22 21:33:43 +00:00
return tree ;
}
2009-04-17 16:14:22 +00:00
////////////////////////////
// HANDLER DI DOCUMENTO //
////////////////////////////
void TGestione_preventivo_msk : : on_idle ( )
{
TDocumento_mask : : on_idle ( ) ;
}
//magico metodo per settare, al cambio riga dello sheet, il focus sul campo desiderato (il campo in questione <20> ..
//..definito nella on_idle(); ricordarsi la set_notify() nel costruttore della maschera senno' viene eseguito l'ss_notify()..
//..standard e non questo qui ridefinito. Allah!
2009-06-16 13:10:32 +00:00
void TGestione_preventivo_msk : : update_costi_ricavi ( int nrow , bool update_sheet )
{
2009-10-20 15:13:53 +00:00
TDocumento & d = doc ( ) ;
2009-06-16 13:10:32 +00:00
const int rows = d . physical_rows ( ) ;
TArray valori ;
TArray costi ;
TSheet_field & sh = sfield ( F_SHEET ) ;
2009-10-20 15:13:53 +00:00
const bool all = nrow < 0 ;
if ( all )
2009-06-16 13:10:32 +00:00
nrow = rows ;
else
d [ nrow ] . autosave ( sh ) ;
const int cur_level = d [ nrow ] . get_int ( RDOC_LEVEL ) ;
2009-08-29 18:56:49 +00:00
while ( nrow < rows & & cur_level < d [ nrow + 1 ] . get_int ( RDOC_LEVEL ) )
2009-06-16 13:10:32 +00:00
nrow + + ;
for ( int i = nrow ; i > 0 ; i - - )
{
2009-10-20 15:13:53 +00:00
TRiga_documento & row = d [ i ] ;
2009-06-16 13:10:32 +00:00
const int level = row . get_int ( RDOC_LEVEL ) ;
if ( i = = rows | | level > = doc ( ) [ i + 1 ] . get_int ( RDOC_LEVEL ) )
{
const real importo = row . importo ( true , false ) ;
row . put ( RDOC_VALV , importo ) ;
2009-08-29 18:56:49 +00:00
for ( int j = level - 1 ; j > = 0 ; j - - )
2009-06-16 13:10:32 +00:00
{
2009-08-29 18:56:49 +00:00
real * r = ( real * ) valori . objptr ( j ) ;
2009-06-16 13:10:32 +00:00
if ( r = = NULL )
{
r = new real ;
2009-08-29 18:56:49 +00:00
valori . add ( r , j ) ;
2009-06-16 13:10:32 +00:00
}
* r + = importo ;
}
const real costo = row . get_real ( RDOC_QTA ) * row . get_real ( RDOC_COSTO ) ;
row . put ( RDOC_VALC , costo ) ;
2009-08-29 18:56:49 +00:00
for ( int j = level - 1 ; j > = 0 ; j - - )
2009-06-16 13:10:32 +00:00
{
2009-08-29 18:56:49 +00:00
real * r = ( real * ) costi . objptr ( j ) ;
2009-06-16 13:10:32 +00:00
if ( r = = NULL )
{
r = new real ;
2009-08-29 18:56:49 +00:00
costi . add ( r , j ) ;
2009-06-16 13:10:32 +00:00
}
* r + = costo ;
}
}
else
{
real * r = ( real * ) valori . objptr ( level ) ;
if ( r ! = NULL )
{
row . put ( RDOC_VALV , * r ) ;
* r = ZERO ;
}
r = ( real * ) costi . objptr ( level ) ;
if ( r ! = NULL )
{
row . put ( RDOC_VALC , * r ) ;
* r = ZERO ;
}
}
if ( update_sheet )
{
row . autoload ( sh ) ;
sh . check_row ( i - 1 ) ;
sh . force_update ( i - 1 ) ;
}
if ( ! all & & level < = 0 )
break ;
}
}
2009-06-30 09:36:17 +00:00
2009-04-17 16:14:22 +00:00
bool TGestione_preventivo_msk : : ss_notify ( TSheet_field & ss , int r , KEY key )
{
2009-04-22 21:33:43 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) ss . mask ( ) ;
TSheet_field & sh = mask . sfield ( F_SHEET ) ;
TDocumento & doc = mask . doc ( ) ;
2009-04-17 16:14:22 +00:00
switch ( key )
{
2009-04-21 00:07:11 +00:00
case K_TAB : // entrata
{
2009-04-20 00:06:09 +00:00
TRiga_documento & row = doc [ r + 1 ] ;
2009-04-21 00:07:11 +00:00
TMask & row_mask = sh . sheet_row_mask ( r ) ;
2009-04-17 16:14:22 +00:00
const int level = row . get_int ( RDOC_LEVEL ) ;
const bool prodfin = level = = 0 ;
2009-04-20 00:06:09 +00:00
const bool price_enabled = ( r + 1 = = doc . physical_rows ( ) ) | | ( level > = doc [ r + 2 ] . get_int ( RDOC_LEVEL ) ) ;
2009-04-17 16:14:22 +00:00
short id ;
2009-05-11 13:00:22 +00:00
sh . enable_cell ( r , sh . cid2index ( FR_PREZZO ) , price_enabled ) ;
sh . enable_cell ( r , sh . cid2index ( FR_JOLLY3 ) , price_enabled ) ;
2009-04-21 00:07:11 +00:00
for ( id = FR_CDC1 ; id < FR_CDC12 ; id + + )
2009-05-11 13:00:22 +00:00
sh . enable_cell ( r , sh . cid2index ( id ) , prodfin ) ;
2009-04-21 00:07:11 +00:00
for ( id = FR_DESCDC1 ; id < FR_DESCDC12 ; id + + )
2009-05-11 13:00:22 +00:00
sh . enable_cell ( r , sh . cid2index ( id ) , prodfin ) ;
sh . force_update ( r ) ;
2009-04-17 16:14:22 +00:00
}
break ;
2009-04-20 00:06:09 +00:00
case K_CTRL + K_INS : // Inserimento
2009-04-17 16:14:22 +00:00
{
2009-04-20 00:06:09 +00:00
const int doc_row = r + 1 ;
2009-04-17 16:14:22 +00:00
int level = 0 ;
2009-04-20 00:06:09 +00:00
TRiga_documento & row = doc [ doc_row ] ;
2009-04-17 16:14:22 +00:00
if ( r > 0 & & row . is_merce ( ) )
{
2009-04-20 00:06:09 +00:00
const int father_sheet_row = r - 1 ;
TRiga_documento & father_row = doc [ father_sheet_row + 1 ] ;
const int rows = doc . physical_rows ( ) ;
2009-04-17 16:14:22 +00:00
2009-04-20 00:06:09 +00:00
level = father_row . get_int ( RDOC_LEVEL ) ;
2009-04-22 21:33:43 +00:00
const int next_level = mask . get_int ( F_LIVELLO ) ;
2009-04-21 00:07:11 +00:00
if ( next_level > 0 & & ( doc_row = = rows | | level > doc [ doc_row + 1 ] . get_int ( RDOC_LEVEL ) ) )
level = ( doc_row = = rows | | next_level - 1 > = doc [ doc_row + 1 ] . get_int ( RDOC_LEVEL ) ) ? next_level - 1 : doc [ doc_row + 1 ] . get_int ( RDOC_LEVEL ) ;
else
2009-04-22 21:33:43 +00:00
if ( mask . get_bool ( F_DETTAGLIO ) | | ( doc_row < rows & & level < doc [ doc_row + 1 ] . get_int ( RDOC_LEVEL ) ) )
2009-04-21 00:07:11 +00:00
level + + ;
2009-04-17 16:14:22 +00:00
if ( level > 0 )
{
2009-04-20 00:06:09 +00:00
row . put ( RDOC_CODCOSTO , father_row . get ( RDOC_CODCOSTO ) ) ;
row . put ( RDOC_CODCMS , father_row . get ( RDOC_CODCMS ) ) ;
row . put ( RDOC_FASCMS , father_row . get ( RDOC_FASCMS ) ) ;
2009-04-17 16:14:22 +00:00
2009-06-15 16:32:17 +00:00
if ( level > father_row . get_int ( RDOC_LEVEL ) )
2009-05-05 15:27:01 +00:00
{
sh . disable_cell ( father_sheet_row , sh . cid2index ( FR_PREZZO ) ) ;
sh . disable_cell ( father_sheet_row , sh . cid2index ( FR_JOLLY3 ) ) ;
2009-06-15 16:10:00 +00:00
father_row . zero ( RDOC_COSTO ) ;
2009-05-05 15:27:01 +00:00
father_row . zero ( RDOC_PREZZO ) ;
2009-08-29 18:56:49 +00:00
father_row . zero ( RDOC_PPROV ) ;
2009-05-05 15:27:01 +00:00
father_row . zero ( RDOC_K ) ;
father_row . autoload ( sh ) ;
sh . force_update ( father_sheet_row ) ;
}
2009-04-17 16:14:22 +00:00
short id ;
2009-04-21 00:07:11 +00:00
for ( id = FR_CDC1 ; id < FR_CDC12 ; id + + )
2009-04-20 00:06:09 +00:00
sh . disable_cell ( r , sh . cid2index ( id ) ) ;
2009-04-17 16:14:22 +00:00
}
}
2009-04-20 00:06:09 +00:00
row . put ( RDOC_LEVEL , level ) ;
2009-04-22 21:33:43 +00:00
row . put ( RDOC_TREE , mask . build_tree_string ( level ) ) ;
2009-04-20 00:06:09 +00:00
row . autoload ( sh ) ;
2009-04-22 21:33:43 +00:00
mask . reset ( F_LIVELLO ) ;
mask . reset ( F_DETTAGLIO ) ;
2009-04-17 16:14:22 +00:00
}
break ;
2009-04-20 00:06:09 +00:00
case K_DEL : // Cancellazione
{
const int doc_row = r + 1 ;
const int rows = doc . physical_rows ( ) ;
if ( doc_row < rows )
{
TRiga_documento & row = doc [ doc_row ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
int i ;
int last_row = doc_row ;
for ( i = doc_row + 1 ; i < = rows ; i + + )
if ( level < doc [ i ] . get_int ( RDOC_LEVEL ) )
last_row = i ;
else
break ;
for ( i = last_row ; i > doc_row ; i - - )
{
doc . destroy_row ( i , true ) ;
sh . destroy ( i - 1 ) ;
}
sh . force_update ( ) ;
}
}
break ;
2009-06-16 13:10:32 +00:00
case K_CTRL + K_DEL : // Cancellazione
mask . update_costi_ricavi ( - 1 , true ) ;
break ;
case K_ENTER : // Uscita con modifiche
mask . update_costi_ricavi ( r + 1 , true ) ;
2009-04-17 16:14:22 +00:00
default :
break ;
}
return TDocumento_mask : : ss_notify ( ss , r , key ) ;
}
2009-04-20 00:06:09 +00:00
void TGestione_preventivo_msk : : highlight_row ( int row , COLOR back , COLOR fore , bool dirty , bool update )
2009-04-17 16:14:22 +00:00
{
2009-04-21 21:22:12 +00:00
TDocumento_mask : : highlight_row ( row , back , fore , dirty , false ) ;
2009-04-17 16:14:22 +00:00
TRiga_documento & rigadoc = doc ( ) [ row + 1 ] ;
TSheet_field & sf = sfield ( F_SHEET ) ;
2009-04-21 21:22:12 +00:00
COLOR back1 = back , back2 = COLOR_BLUE ;
2009-04-17 16:14:22 +00:00
const TColor_rule * c = ( TColor_rule * ) color_rules ( ) . objptr ( _rule ) ;
if ( c ! = NULL )
c - > colors ( back2 , fore ) ;
2009-04-20 00:06:09 +00:00
back = blend_colors ( back1 , back2 , 1.0 - ( ( ( double ) rigadoc . get_int ( RDOC_LEVEL ) ) / 10.0 ) ) ;
2009-04-17 16:14:22 +00:00
2009-04-20 00:06:09 +00:00
sf . set_back_and_fore_color ( back , fore , row ) ;
2009-04-21 21:22:12 +00:00
if ( update )
sf . force_update ( row ) ;
2009-04-17 16:14:22 +00:00
}
TVariable_mask * TGestione_preventivo_msk : : riga_mask ( int numriga )
{
2009-04-17 16:40:42 +00:00
const bool is_new = new_mask ( numriga ) ;
2009-04-17 16:14:22 +00:00
TVariable_mask * m = TDocumento_mask : : riga_mask ( numriga ) ;
2009-04-17 16:40:42 +00:00
if ( is_new & & m ! = NULL )
2009-04-17 16:14:22 +00:00
{
const TRiga_documento & riga = doc ( ) [ numriga + 1 ] ;
2009-06-15 14:16:20 +00:00
TEdit_field & tree = m - > add_string ( FR_JOLLY1 , 0 , " Albero " , 2 , 20 , 13 , " D_ " ) ;
2009-04-20 00:06:09 +00:00
TEdit_field & k = m - > add_string ( FR_JOLLY2 , 0 , " K " , 25 , 20 , 25 ) ;
2009-05-11 13:00:22 +00:00
TEdit_field & v = m - > add_currency ( FR_JOLLY3 , 0 , " Costo " , 53 , 20 , 15 , " U " ) ;
2009-08-29 18:56:49 +00:00
TEdit_field & p = m - > add_string ( FR_JOLLY4 , 0 , " " , 75 , 20 , 1 , " U " ) ;
2009-04-17 16:14:22 +00:00
2009-04-20 00:06:09 +00:00
m - > set_handler ( FR_CODART , pe_codart_handler ) ;
2009-04-21 00:07:11 +00:00
m - > set_handler ( FR_QTA , pe_qta_handler ) ;
2009-06-15 08:16:54 +00:00
m - > set_handler ( FR_PREZZO , pe_prezzo_handler ) ;
2009-05-05 15:27:01 +00:00
m - > set_handler ( FR_JOLLY2 , pe_k_handler ) ;
2009-06-16 15:56:21 +00:00
m - > set_handler ( FR_JOLLY3 , pe_costo_handler ) ;
2009-04-17 16:14:22 +00:00
tree . set_field ( RDOC_TREE ) ;
k . set_field ( RDOC_K ) ;
2009-05-11 13:00:22 +00:00
v . set_field ( RDOC_COSTO ) ;
2009-08-29 18:56:49 +00:00
p . set_field ( RDOC_PPROV ) ;
2009-04-17 16:14:22 +00:00
}
return m ;
}
2009-04-17 16:26:10 +00:00
void TGestione_preventivo_msk : : doc2mask ( bool reload_clifo , bool force_load , bool update )
2009-04-17 16:14:22 +00:00
{
2009-04-17 16:26:10 +00:00
TDocumento_mask : : doc2mask ( reload_clifo , force_load , false ) ;
2009-04-17 16:14:22 +00:00
TSheet_field & s = sfield ( F_SHEET ) ;
const int righe = s . items ( ) ;
const TDocumento & d = doc ( ) ;
2009-05-11 13:00:22 +00:00
const bool has_k = get_bool ( F_USEK ) ;
2009-04-17 16:14:22 +00:00
for ( int i = 0 ; i < righe ; i + + )
{
const TRiga_documento & row = d [ i + 1 ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
const bool prodfin = level = = 0 ;
2009-04-20 00:06:09 +00:00
const bool price_enabled = ( i + 1 = = d . physical_rows ( ) ) | | ( level > = d [ i + 2 ] . get_int ( RDOC_LEVEL ) ) ;
2009-04-17 16:14:22 +00:00
s . enable_cell ( i , s . cid2index ( FR_PREZZO ) , price_enabled ) ;
2009-05-05 15:27:01 +00:00
s . enable_cell ( i , s . cid2index ( FR_JOLLY3 ) , price_enabled ) ;
2009-04-21 00:07:11 +00:00
for ( short id = FR_CDC1 ; id < FR_CDC12 ; id + + )
2009-04-17 16:14:22 +00:00
s . enable_cell ( i , s . cid2index ( id ) , prodfin ) ;
}
//aggiorna i colori delle righe e forza l'update dello sheet
highlight ( ) ;
}
//PE_TESTATA_HANDLER: handler che si occupa di decodificare i campi data in testata
bool TGestione_preventivo_msk : : pe_data_handler ( TMask_field & f , KEY k )
{
bool ok = true ;
2009-04-22 21:33:43 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) f . mask ( ) ;
2009-04-17 16:14:22 +00:00
return ok ;
}
2009-04-25 07:04:22 +00:00
bool TGestione_preventivo_msk : : pe_espandi_handler ( TMask_field & f , KEY k )
{
if ( k = = K_SPACE )
{
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) f . mask ( ) ;
TSheet_field & sh = mask . sfield ( F_SHEET ) ;
const int r = sh . selected ( ) ;
2009-05-04 23:34:22 +00:00
const bool shrink = f . dlg ( ) = = F_SHRINK_ALL ;
const int size = shrink ? 1 : - 1 ;
2009-04-25 07:04:22 +00:00
int row_to_select = 0 ;
2009-05-04 23:34:22 +00:00
2009-04-25 07:04:22 +00:00
FOR_EACH_SHEET_ROW ( sh , i , row )
{
const int row_level = mask . doc ( ) [ i + 1 ] . get_int ( RDOC_LEVEL ) ;
2009-05-04 23:34:22 +00:00
2009-04-25 07:04:22 +00:00
if ( row_level > 0 )
sh . set_row_height ( i , size ) ;
else
if ( i < = r )
row_to_select = i ;
}
if ( size < 0 )
sh . select ( row_to_select ) ;
sh . force_update ( ) ;
}
return true ;
}
bool TGestione_preventivo_msk : : pe_espandi_riga_handler ( TMask_field & f , KEY k )
{
if ( k = = K_SPACE )
{
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) f . mask ( ) ;
TSheet_field & sh = mask . sfield ( F_SHEET ) ;
const int r = sh . selected ( ) ;
const int level = mask . doc ( ) [ r + 1 ] . get_int ( RDOC_LEVEL ) ;
if ( r > = 0 & & r < sh . items ( ) )
{
2009-05-04 23:34:22 +00:00
const bool shrink = f . dlg ( ) = = F_SHRINK_ROW ;
const int size = shrink ? 1 : - 1 ;
2009-04-25 07:04:22 +00:00
for ( int i = r + 1 ; i < sh . items ( ) ; i + + )
{
const int child_level = mask . doc ( ) [ i + 1 ] . get_int ( RDOC_LEVEL ) ;
2009-05-04 23:34:22 +00:00
if ( child_level = = level + 1 )
2009-04-25 07:04:22 +00:00
sh . set_row_height ( i , size ) ;
else
2009-05-04 23:34:22 +00:00
if ( child_level > level + 1 )
sh . set_row_height ( i , 1 ) ;
else
2009-04-25 07:04:22 +00:00
break ;
}
}
sh . force_update ( ) ;
}
return true ;
}
2009-04-22 16:01:28 +00:00
bool TGestione_preventivo_msk : : pe_copia_handler ( TMask_field & f , KEY k )
{
bool ok = true ;
if ( k = = K_SPACE )
{
2009-04-22 21:33:43 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) f . mask ( ) ;
2009-04-22 16:01:28 +00:00
2009-07-01 22:53:41 +00:00
mask . _clipboard_ndoc = mask . get_long ( F_NDOC ) ;
mask . _clipboard_provv = mask . get ( F_PROVV ) [ 0 ] ;
mask . _clipboard_codnum = mask . get ( F_CODNUM ) ;
mask . _clipboard_anno = mask . get_int ( F_ANNO ) ;
2009-08-29 18:56:49 +00:00
mask . _clipboard_row = f . dlg ( ) = = F_COPIA ? mask . sfield ( F_SHEET ) . selected ( ) + 1 : 0 ;
2009-04-22 16:01:28 +00:00
}
return ok ;
}
bool TGestione_preventivo_msk : : pe_incolla_handler ( TMask_field & f , KEY k )
{
bool ok = true ;
if ( k = = K_SPACE )
{
2009-04-22 21:33:43 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) f . mask ( ) ;
2009-08-29 18:56:49 +00:00
const bool alldoc = mask . _clipboard_row = = 0 ;
const int cliprow = alldoc ? 1 : mask . _clipboard_row ;
2009-04-22 16:01:28 +00:00
2009-08-29 18:56:49 +00:00
if ( cliprow > 0 )
2009-04-22 16:01:28 +00:00
{
2009-07-01 22:53:41 +00:00
TDocumento & dest = mask . doc ( ) ;
TDocumento * newdoc = & mask . doc ( ) ;
bool different_doc = dest . get_char ( DOC_PROVV ) ! = mask . _clipboard_provv | |
dest . get_int ( DOC_ANNO ) ! = mask . _clipboard_anno | |
dest . get ( DOC_CODNUM ) ! = mask . _clipboard_codnum | |
dest . get_long ( DOC_NDOC ) ! = mask . _clipboard_ndoc ;
if ( different_doc )
newdoc = new TDocumento ( mask . _clipboard_provv , mask . _clipboard_anno , mask . _clipboard_codnum , mask . _clipboard_ndoc ) ;
TDocumento & orig = * newdoc ;
2009-04-22 21:33:43 +00:00
TSheet_field & sh = mask . sfield ( F_SHEET ) ;
2009-04-22 16:01:28 +00:00
const int selected_row = sh . selected ( ) + 1 ;
2009-07-01 22:53:41 +00:00
const int rows = dest . physical_rows ( ) ;
2009-04-22 21:33:43 +00:00
const int next_level = mask . get_int ( F_LIVELLO ) ;
2009-08-29 18:56:49 +00:00
const int orig_level = orig [ cliprow ] . get_int ( RDOC_LEVEL ) ;
2009-04-22 21:33:43 +00:00
const int level = next_level > 0 ? next_level - 1 : orig_level ;
const int level_offset = level - orig_level ;
2009-04-22 16:01:28 +00:00
int i ;
2009-08-29 18:56:49 +00:00
int start_row = rows > 0 ? - 1 : 1 ;
2009-04-22 16:01:28 +00:00
2009-04-22 21:33:43 +00:00
for ( i = selected_row ; start_row < 0 & & i < = rows ; i + + )
2009-04-22 16:01:28 +00:00
{
2009-07-01 22:53:41 +00:00
const int row_level = dest [ i ] . get_int ( RDOC_LEVEL ) ;
2009-04-22 21:33:43 +00:00
2009-04-22 16:01:28 +00:00
if ( level = = row_level )
2009-04-22 21:33:43 +00:00
start_row = i ;
2009-04-22 16:01:28 +00:00
}
2009-04-22 21:33:43 +00:00
if ( start_row > 0 )
2009-04-22 16:01:28 +00:00
{
2009-08-29 18:56:49 +00:00
const bool shift_source_rows = ( ! different_doc ) & & start_row < = cliprow ;
const int nrows = orig . physical_rows ( ) ;
2009-04-22 21:33:43 +00:00
2009-08-29 18:56:49 +00:00
for ( i = cliprow ; i < = nrows ; i + + )
2009-04-22 16:01:28 +00:00
{
2009-07-01 22:53:41 +00:00
int row_level = orig [ i ] . get_int ( RDOC_LEVEL ) ;
2009-04-22 21:33:43 +00:00
2009-08-29 18:56:49 +00:00
if ( ! alldoc & & i > cliprow & & orig_level > = row_level )
2009-04-22 21:33:43 +00:00
break ;
2009-07-01 22:53:41 +00:00
const TRiga_documento & row = orig [ i ] ;
2009-04-22 16:01:28 +00:00
2009-04-23 15:24:34 +00:00
sh . insert ( start_row - 1 , false , true ) ;
2009-07-01 22:53:41 +00:00
TRiga_documento & new_row = dest [ start_row ] ;
dest . copy_data ( new_row , row ) ;
2009-04-22 21:33:43 +00:00
row_level + = level_offset ;
new_row . put ( RDOC_LEVEL , row_level ) ;
2009-08-29 18:56:49 +00:00
new_row . put ( RDOC_TREE , mask . build_tree_string ( row_level ) ) ;
2009-04-22 21:33:43 +00:00
new_row . autoload ( sh ) ;
start_row + + ;
if ( shift_source_rows )
i + + ;
2009-04-22 16:01:28 +00:00
}
2009-04-23 15:24:34 +00:00
mask . highlight ( ) ;
2009-04-22 21:33:43 +00:00
sh . force_update ( ) ;
2009-04-23 15:24:34 +00:00
}
2009-07-01 22:53:41 +00:00
if ( different_doc )
delete newdoc ;
2009-04-22 21:33:43 +00:00
mask . reset ( F_LIVELLO ) ;
2009-04-22 16:01:28 +00:00
}
}
return ok ;
}
2009-06-30 09:36:17 +00:00
bool TGestione_preventivo_msk : : pe_new_revision_handler ( TMask_field & f , KEY k )
2009-05-11 13:00:22 +00:00
{
2009-06-30 09:36:17 +00:00
bool ok = true ;
2009-05-11 13:00:22 +00:00
if ( k = = K_SPACE )
{
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) f . mask ( ) ;
2009-08-27 09:30:00 +00:00
TDocumento & d = mask . doc ( ) ;
if ( d . bloccato ( ) )
return f . error_box ( TR ( " Documento bloccato: non e' possibile farne una nuova revisione " ) ) ;
2009-06-30 09:36:17 +00:00
TDocumento backup ( d ) ;
2009-08-27 09:30:00 +00:00
const TTipo_documento & td = d . tipo ( ) ;
2009-06-30 09:36:17 +00:00
const char stato_iniziale = d . stato ( ) ;
2009-05-11 13:00:22 +00:00
2009-06-30 09:36:17 +00:00
d . put ( DOC_STATO , td . stato_bloccato ( ) ) ;
if ( d . rewrite ( ) = = NOERR )
2009-05-11 13:00:22 +00:00
{
2009-06-30 09:36:17 +00:00
long ndoc = d . get_long ( DOC_NDOC ) ;
if ( mask . new_revision ( d . get ( DOC_CODNUM ) , ndoc ) )
{
d . renum_ndoc ( ndoc ) ;
d . put ( DOC_STATO , td . stato_finale_inserimento ( ) ) ;
2009-05-11 13:00:22 +00:00
2009-06-30 09:36:17 +00:00
ok = d . write ( ) = = NOERR ;
if ( ok )
{
2009-10-20 15:13:53 +00:00
mask . enable ( DLG_NEXTREC ) ; // Mi assicuro che sia acceso il bottone Avanti
2009-08-27 09:30:00 +00:00
mask . stop_run ( K_NEXT ) ; // Passo al documento successivo appena creato
2009-06-30 09:36:17 +00:00
}
}
else
ok = false ;
}
else
ok = false ;
if ( ! ok )
{
backup . stato ( stato_iniziale ) ;
ok = backup . rewrite ( ) = = NOERR ;
2009-05-11 13:00:22 +00:00
}
}
2009-06-30 09:36:17 +00:00
return ok ;
}
2009-05-11 13:00:22 +00:00
2010-04-20 10:41:59 +00:00
const real TGestione_preventivo_msk : : get_costo ( const TArticolo_giacenza & art )
{
if ( _field_costo = = " VAR " )
{
const int annoes = esercizi ( ) . date2esc ( doc ( ) . get_date ( DOC_DATADOC ) ) ;
switch ( get_int ( F_TIPO_COSTO ) )
{
case 1 : // Ultimo costo
return art . ultimo_costo ( annoes ) ;
case 2 : // Media ultimi costi
return art . media_costi ( annoes ) ;
case 4 : // Costo standard
return art . costo_standard ( annoes ) ;
case 5 : // Costo medio
return art . costo_medio ( annoes , " " , " " ) ;
case 6 : // Costo medio pond.
return art . costo_mediopond ( annoes , " " , " " ) ;
default :
return ZERO ;
}
}
return art . get_real ( _field_costo ) ;
}
2009-07-30 15:18:05 +00:00
bool TGestione_preventivo_msk : : pe_update_costi_handler ( TMask_field & f , KEY k )
{
if ( k = = K_SPACE )
{
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) f . mask ( ) ;
TDocumento & doc = mask . doc ( ) ;
TSheet_field & sf = mask . sfield ( F_SHEET ) ;
mask . mask2doc ( ) ;
const int rows = doc . physical_rows ( ) ;
for ( int i = 1 ; i < = rows ; i + + )
{
bool ok = i = = rows ;
TRiga_documento & row = doc [ i ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
if ( ! ok )
ok = ( level > = doc [ i + 1 ] . get_int ( RDOC_LEVEL ) ) ;
if ( ok )
{
const TString & codart = row . get ( RDOC_CODARTMAG ) ;
if ( codart . full ( ) )
{
const TArticolo_giacenza & art = cached_article ( codart ) ;
2010-04-20 10:41:59 +00:00
const real costo = mask . get_costo ( art ) ;
2009-07-30 15:18:05 +00:00
row . put ( RDOC_COSTO , costo ) ;
row . autoload ( sf ) ;
}
}
}
sf . force_update ( ) ;
}
return true ;
}
2009-04-17 16:14:22 +00:00
///////////////////////
// HANDLER DI RIGA //
///////////////////////
bool TGestione_preventivo_msk : : pe_codart_handler ( TMask_field & f , KEY k )
{
2009-04-21 00:07:11 +00:00
TMask & row_mask = f . mask ( ) ;
2009-04-17 16:14:22 +00:00
bool ok = codart_handler ( f , k ) ;
2009-06-15 08:16:54 +00:00
2009-04-22 21:33:43 +00:00
TSheet_field * sh = row_mask . get_sheet ( ) ;
2009-04-17 16:14:22 +00:00
2009-04-22 21:33:43 +00:00
if ( ok & & sh ! = NULL & & k = = K_TAB & & f . focusdirty ( ) )
{
2009-05-05 15:27:01 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) sh - > mask ( ) ;
2009-06-15 08:16:54 +00:00
const bool has_k = mask . get_bool ( F_USEK ) ;
2009-04-22 21:33:43 +00:00
bool update = false ;
const int r = sh - > selected ( ) ;
2009-07-30 15:18:05 +00:00
const TString & codart = row_mask . get ( FR_CODARTMAG ) ;
2009-05-11 13:00:22 +00:00
if ( codart . full ( ) )
2009-04-17 16:14:22 +00:00
{
2009-05-11 13:00:22 +00:00
const TArticolo_giacenza & art = cached_article ( codart ) ;
2010-04-20 10:41:59 +00:00
const real costo = mask . get_costo ( art ) ;
2009-04-22 21:33:43 +00:00
2009-06-15 08:16:54 +00:00
if ( has_k )
2009-04-17 16:14:22 +00:00
{
2009-05-05 15:31:56 +00:00
const real ric = art . get ( ANAMAG_PERCRIC ) ;
TString80 k ;
if ( ric ! = ZERO )
k = ric . string ( ) ;
2009-04-17 16:14:22 +00:00
2009-04-22 21:33:43 +00:00
if ( k . blank ( ) )
2009-04-17 16:14:22 +00:00
{
2009-04-22 21:33:43 +00:00
const TString catmer = art . get ( ANAMAG_GRMERC ) ;
2009-10-21 13:41:27 +00:00
k = cache ( ) . get ( " GMC " , catmer , " S5 " ) ;
2009-04-22 21:33:43 +00:00
if ( k . blank ( ) )
2009-10-21 13:41:27 +00:00
k = cache ( ) . get ( " GMC " , catmer . left ( 3 ) , " S5 " ) ;
2009-04-17 16:14:22 +00:00
}
2009-04-22 21:33:43 +00:00
if ( k . full ( ) )
row_mask . set ( FR_JOLLY2 , k ) ;
2009-04-17 16:14:22 +00:00
}
2009-05-11 13:00:22 +00:00
row_mask . set ( FR_JOLLY3 , costo ) ;
2009-04-17 16:14:22 +00:00
}
2009-05-20 11:33:33 +00:00
if ( has_k | | ! row_mask . field ( FR_PREZZO ) . enabled ( ) )
2009-04-22 21:33:43 +00:00
row_mask . set ( FR_PREZZO , " " ) ;
2009-05-11 13:00:22 +00:00
2009-08-29 18:56:49 +00:00
row_mask . set ( FR_JOLLY4 , mask . condv ( ) . get_prov ( ) ) ;
2009-05-11 13:00:22 +00:00
if ( row_mask . field ( FR_JOLLY3 ) . enabled ( ) )
{
2009-08-29 18:56:49 +00:00
if ( row_mask . get ( FR_PREZZO ) . blank ( ) & &
row_mask . get ( FR_JOLLY3 ) . full ( ) )
2009-05-11 13:00:22 +00:00
mask . update_prezzo_vendita ( row_mask ) ;
}
2009-05-05 15:27:01 +00:00
else
2009-05-11 13:00:22 +00:00
row_mask . set ( FR_JOLLY3 , " " ) ;
2009-04-22 21:33:43 +00:00
}
2009-04-21 00:07:11 +00:00
if ( k = = K_F8 )
{
TSheet_field * sh = row_mask . get_sheet ( ) ;
if ( sh ! = NULL )
{
2009-04-22 21:33:43 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) sh - > mask ( ) ;
2009-04-21 00:07:11 +00:00
TDocumento & doc = mask . doc ( ) ;
const int rows = doc . physical_rows ( ) ;
2009-05-11 13:00:22 +00:00
const bool has_k = mask . get_bool ( F_USEK ) ;
2009-05-20 11:33:33 +00:00
const int start_level = doc [ sh - > selected ( ) + 1 ] . get_int ( RDOC_LEVEL ) ;
2009-04-21 00:07:11 +00:00
2009-05-20 11:33:33 +00:00
for ( int i = sh - > selected ( ) + 2 ; i < = rows ; i + + )
2009-04-21 00:07:11 +00:00
{
TRiga_documento & row = doc [ i ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
2009-05-20 11:33:33 +00:00
if ( level < = start_level )
break ;
2009-04-21 00:07:11 +00:00
const bool prodfin = level = = 0 ;
const bool price_enabled = ( i = = doc . physical_rows ( ) ) | | ( level > = doc [ i + 1 ] . get_int ( RDOC_LEVEL ) ) ;
short id ;
sh - > enable_cell ( i - 1 , sh - > cid2index ( FR_PREZZO ) , price_enabled ) ;
2009-06-15 08:16:54 +00:00
// sh->enable_cell(i - 1, sh->cid2index(FR_JOLLY2), price_enabled && has_k);
2009-05-05 15:27:01 +00:00
sh - > enable_cell ( i - 1 , sh - > cid2index ( FR_JOLLY3 ) , price_enabled ) ;
2009-05-20 11:33:33 +00:00
const TString & codart = row . get ( RDOC_CODARTMAG ) ;
const TArticolo_giacenza & art = cached_article ( codart ) ;
const bool has_k = mask . get_bool ( F_USEK ) ;
if ( has_k | | ! price_enabled )
row . zero ( RDOC_PREZZO ) ;
if ( price_enabled & & has_k )
{
const real ric = art . get ( ANAMAG_PERCRIC ) ;
TString80 k ;
if ( ric ! = ZERO )
k = ric . string ( ) ;
if ( k . blank ( ) )
{
const TString catmer = art . get ( ANAMAG_GRMERC ) ;
2009-10-21 13:41:27 +00:00
k = cache ( ) . get ( " GMC " , catmer , " S5 " ) ;
2009-05-20 11:33:33 +00:00
if ( k . blank ( ) )
2009-10-21 13:41:27 +00:00
k = cache ( ) . get ( " GMC " , catmer . left ( 3 ) , " S5 " ) ;
2009-05-20 11:33:33 +00:00
}
if ( k . full ( ) )
row . put ( RDOC_K , k ) ;
}
if ( price_enabled )
{
2010-04-20 10:41:59 +00:00
const real costo = mask . get_costo ( art ) ;
2009-05-20 11:33:33 +00:00
row . put ( RDOC_COSTO , costo ) ;
}
2009-04-21 00:07:11 +00:00
for ( id = FR_CDC1 ; id < FR_CDC12 ; id + + )
sh - > enable_cell ( i - 1 , id , prodfin ) ;
for ( id = FR_DESCDC1 ; id < FR_DESCDC12 ; id + + )
sh - > enable_cell ( i - 1 , id , prodfin ) ;
2009-05-20 11:33:33 +00:00
row . put ( RDOC_TREE , mask . build_tree_string ( level ) ) ;
row . autoload ( * sh ) ;
mask . highlight_row ( i - 1 , COLOR_INVALID , COLOR_INVALID , true , false ) ;
2009-04-21 00:07:11 +00:00
}
sh - > force_update ( ) ;
}
}
2009-04-17 16:14:22 +00:00
return ok ;
}
2009-04-21 00:07:11 +00:00
bool TGestione_preventivo_msk : : pe_qta_handler ( TMask_field & f , KEY k )
2009-04-17 16:14:22 +00:00
{
2009-04-21 00:07:11 +00:00
bool ok = qta_handler ( f , k ) ;
2009-04-17 16:14:22 +00:00
if ( ok )
{
TMask & row_mask = f . mask ( ) ;
TSheet_field * sh = row_mask . get_sheet ( ) ;
if ( sh ! = NULL )
{
TDocumento_mask & mask = ( TDocumento_mask & ) sh - > mask ( ) ;
TDocumento & doc = mask . doc ( ) ;
if ( k = = K_F8 )
{
const int r = sh - > selected ( ) ;
if ( r > 0 )
{
TRiga_documento & row = doc [ r + 1 ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
if ( level > 0 )
{
2009-04-22 21:33:43 +00:00
int father_row = r ;
while ( r > 1 & & level = = doc [ father_row ] . get_int ( RDOC_LEVEL ) )
father_row - - ;
TRiga_documento & row = doc [ father_row ] ;
2009-04-17 16:14:22 +00:00
const real qta_prec = row . get_real ( RDOC_QTA ) ;
real qta ( f . get ( ) ) ;
TToken_string & shrow = sh - > row ( r ) ;
qta * = qta_prec ;
2009-04-21 00:07:11 +00:00
shrow . add ( qta . string ( ) , sh - > cid2index ( FR_QTA ) ) ;
2009-04-17 16:14:22 +00:00
sh - > force_update ( r ) ;
2009-04-20 00:06:09 +00:00
row . put ( RDOC_QTA , qta ) ;
2009-04-17 16:14:22 +00:00
f . focusdirty ( ) ;
}
}
}
if ( f . to_check ( k , true ) )
{
const int r = sh - > selected ( ) ;
TRiga_documento & row = doc [ r + 1 ] ;
const real old_qta = row . get_real ( RDOC_QTA ) ;
2009-04-20 00:06:09 +00:00
const real qta = row_mask . get_real ( FR_QTA ) ;
2009-04-17 16:14:22 +00:00
const int level = row . get_int ( RDOC_LEVEL ) ;
if ( old_qta ! = qta )
{
const int rows = doc . physical_rows ( ) ;
2009-04-20 00:06:09 +00:00
for ( int i = r + 2 ; i < = rows & & level < doc [ i ] . get_int ( RDOC_LEVEL ) ; i + + )
2009-04-17 16:14:22 +00:00
{
TToken_string & shrow = sh - > row ( i - 1 ) ;
2009-04-21 00:07:11 +00:00
real row_qta ( shrow . get ( sh - > cid2index ( FR_QTA ) ) ) ;
2009-04-17 16:14:22 +00:00
row_qta * = qta ;
2009-04-21 00:07:11 +00:00
if ( ! old_qta . is_zero ( ) )
row_qta / = old_qta ;
row_qta . round ( 5 ) ;
shrow . add ( row_qta . string ( ) , sh - > cid2index ( FR_QTA ) ) ;
2009-04-17 16:14:22 +00:00
doc [ i ] . put ( RDOC_QTA , row_qta ) ;
}
2009-04-20 00:06:09 +00:00
row . put ( RDOC_QTA , qta ) ;
2009-04-17 16:14:22 +00:00
sh - > force_update ( ) ;
}
}
}
}
return ok ;
}
2009-05-05 15:27:01 +00:00
void TGestione_preventivo_msk : : update_prezzo_vendita ( TMask & row_mask )
{
2009-06-15 08:16:54 +00:00
real costo = row_mask . get ( FR_JOLLY3 ) ;
TString k ( row_mask . get ( FR_JOLLY2 ) ) ;
TString ge ;
real perc ;
TSheet_field * sh = row_mask . get_sheet ( ) ;
const int r = sh - > selected ( ) ;
2009-05-11 13:00:22 +00:00
2009-06-15 08:16:54 +00:00
if ( k . blank ( ) )
k = get ( F_K ) ;
if ( scontoexpr2perc ( k , false , ge , perc ) )
costo * = ( real ( 2.00 ) - perc ) ;
TCurrency_documento prezzo ( costo , doc ( ) , true ) ;
row_mask . set ( FR_PREZZO , prezzo . get_num ( ) . string ( ) ) ;
2009-08-29 18:56:49 +00:00
row_mask . set ( FR_JOLLY4 , " K " ) ;
2009-05-05 15:27:01 +00:00
}
bool TGestione_preventivo_msk : : pe_k_handler ( TMask_field & f , KEY k )
{
TMask & row_mask = f . mask ( ) ;
TSheet_field * sh = row_mask . get_sheet ( ) ;
2009-06-15 08:16:54 +00:00
if ( sh = = NULL )
return true ;
2009-05-05 15:27:01 +00:00
2009-08-27 09:30:00 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) sh - > mask ( ) ;
2009-06-15 08:16:54 +00:00
2009-08-27 09:30:00 +00:00
const bool last_level = row_mask . field ( FR_JOLLY3 ) . enabled ( ) ;
2009-06-15 08:16:54 +00:00
if ( last_level )
2009-05-05 15:27:01 +00:00
{
2009-06-15 08:16:54 +00:00
if ( ( k = = K_TAB & & f . focusdirty ( ) ) | | k = = K_F8 )
mask . update_prezzo_vendita ( row_mask ) ;
}
else
if ( k = = K_F8 )
{
const TString k ( row_mask . get ( FR_JOLLY2 ) ) ;
const int r = sh - > selected ( ) ;
TDocumento & doc = mask . doc ( ) ;
const int start_level = doc [ r + 1 ] . get_int ( RDOC_LEVEL ) ;
TString ge ;
real perc ;
2009-08-27 00:00:07 +00:00
// row_mask.reset(FR_JOLLY2);
sh - > row ( r ) . add ( " " , sh - > cid2index ( FR_JOLLY2 ) ) ;
sh - > force_update ( r ) ;
2009-06-15 08:16:54 +00:00
for ( int i = r + 2 ; i < = doc . physical_rows ( ) ; i + + )
{
TRiga_documento & row = doc [ i ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
if ( level < = start_level )
break ;
if ( sh - > cell_enabled ( i - 1 , sh - > cid2index ( FR_PREZZO ) ) )
{
TToken_string & shrow = sh - > row ( i - 1 ) ;
row . put ( RDOC_K , k ) ;
shrow . add ( k , sh - > cid2index ( FR_JOLLY2 ) ) ;
TString row_k ( k ) ;
if ( row_k . blank ( ) )
row_k = mask . get ( F_K ) ;
real val = row . get_real ( RDOC_COSTO ) ;
if ( scontoexpr2perc ( row_k , false , ge , perc ) )
val * = ( 2 - perc ) ;
TCurrency_documento prezzo ( val , doc , true ) ;
row . put ( RDOC_PREZZO , prezzo . get_num ( ) ) ;
2009-08-29 18:56:49 +00:00
row . put ( RDOC_PPROV , " K " ) ;
2009-06-15 08:16:54 +00:00
shrow . add ( prezzo . get_num ( ) . string ( ) , sh - > cid2index ( FR_PREZZO ) ) ;
2009-08-29 18:56:49 +00:00
shrow . add ( " K " , sh - > cid2index ( FR_JOLLY4 ) ) ;
2009-06-15 08:16:54 +00:00
}
}
2009-08-27 00:00:07 +00:00
mask . update_costi_ricavi ( r + 1 , true ) ;
2009-06-15 08:16:54 +00:00
}
return true ;
}
2009-05-05 15:27:01 +00:00
2009-06-15 08:16:54 +00:00
bool TGestione_preventivo_msk : : pe_prezzo_handler ( TMask_field & f , KEY k )
{
TMask & row_mask = f . mask ( ) ;
const bool last_level = row_mask . field ( FR_JOLLY3 ) . enabled ( ) ;
2009-06-16 15:56:21 +00:00
if ( last_level )
2009-06-15 08:16:54 +00:00
{
2009-06-16 15:56:21 +00:00
if ( k = = K_F8 )
{
TSheet_field * sh = row_mask . get_sheet ( ) ;
2009-06-15 08:16:54 +00:00
2009-06-16 15:56:21 +00:00
if ( sh ! = NULL )
{
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) sh - > mask ( ) ;
TDocumento & doc = mask . doc ( ) ;
const int row = sh - > selected ( ) ;
TCond_vendita & condv = mask . condv ( ) ;
condv . set_testa ( & mask ) ;
condv . set_riga ( & row_mask ) ;
condv . ricerca ( ) ;
doc [ row + 1 ] . put ( RDOC_PREZZO , row_mask . get ( FR_PREZZO ) ) ;
2009-08-29 18:56:49 +00:00
doc [ row + 1 ] . put ( RDOC_PPROV , condv . get_prov ( ) ) ;
2009-06-16 15:56:21 +00:00
row_mask . reset ( FR_JOLLY2 ) ;
row_mask . field ( FR_JOLLY2 ) . set_focusdirty ( false ) ;
}
}
if ( k = = K_TAB & & f . focusdirty ( ) )
2009-06-15 08:16:54 +00:00
{
2009-06-16 15:56:21 +00:00
row_mask . reset ( FR_JOLLY2 ) ;
row_mask . field ( FR_JOLLY2 ) . set_focusdirty ( false ) ;
}
}
return true ;
}
2009-06-15 08:16:54 +00:00
2009-06-16 15:56:21 +00:00
bool TGestione_preventivo_msk : : pe_costo_handler ( TMask_field & f , KEY k )
{
TMask & row_mask = f . mask ( ) ;
const bool last_level = row_mask . field ( FR_JOLLY3 ) . enabled ( ) ;
if ( last_level )
{
if ( k = = K_TAB & & f . focusdirty ( ) )
{
row_mask . reset ( FR_JOLLY2 ) ;
row_mask . field ( FR_JOLLY2 ) . set_focusdirty ( false ) ;
2009-06-15 08:16:54 +00:00
}
2009-05-05 15:27:01 +00:00
}
2009-06-15 08:16:54 +00:00
return true ;
2009-05-05 15:27:01 +00:00
}
2009-04-17 16:14:22 +00:00
//metodo che setta gli handler sui campi di riga
void TGestione_preventivo_msk : : user_set_row_handler ( TMask & rm , short field , int index )
{
switch ( index )
{
2009-04-20 00:06:09 +00:00
case 5101 : rm . set_handler ( field , pe_codart_handler ) ; break ;
2009-04-21 00:07:11 +00:00
case 5102 : rm . set_handler ( field , pe_qta_handler ) ; break ;
2009-04-17 16:14:22 +00:00
default : TDocumento_mask : : user_set_row_handler ( rm , field , index ) ; break ;
}
}
//metodo che setta l'handler di bolla
void TGestione_preventivo_msk : : user_set_handler ( short fieldid , int index )
{
switch ( index )
{
case 5101 : set_field_handler ( fieldid , pe_data_handler ) ; break ;
default : TDocumento_mask : : user_set_handler ( fieldid , index ) ; break ;
}
}
2009-06-30 09:36:17 +00:00
bool TGestione_preventivo_msk : : new_revision ( const char * codnum , long & ndoc ) const
{
const TCodice_numerazione & num = cached_numerazione ( codnum ) ;
const int revlen = num . revision_len ( ) ;
if ( revlen > 0 )
{
real fattore = exp10 ( revlen ) ; fattore . round ( 0 ) ;
const long divisore = fattore . integer ( ) ;
const long newndoc = ndoc + 1 ;
2009-08-27 09:30:00 +00:00
// Obfuscated C contest: forse bastava scrivere questo
// if (newndoc/divisore != ndoc/divisore)
if ( ( ( newndoc / divisore ) - ( ndoc / divisore ) ) ! = 0 )
2009-06-30 09:36:17 +00:00
return false ;
else
{
ndoc = newndoc ;
return true ;
}
}
return false ;
}
2009-04-22 16:01:28 +00:00
TGestione_preventivo_msk : : TGestione_preventivo_msk ( const char * tipodoc ) : TDocumento_mask ( tipodoc ) , _clipboard_row ( - 1 )
2009-04-17 16:14:22 +00:00
{
2009-10-20 15:13:53 +00:00
//TConfig* configpe = new TConfig(CONFIG_DITTA, "pe"); // A cosa serve?
2009-04-17 16:14:22 +00:00
sfield ( F_SHEET ) . set_notify ( ss_notify ) ;
2009-04-20 00:06:09 +00:00
_rule = color_rules ( ) . add ( new TColor_rule ( " Livello " , " " , _numexpr , COLOR_BLUE , FOCUS_COLOR ) ) ;
2009-05-11 13:16:47 +00:00
TFilename pn ; doc ( ) . tipo ( ) . profile_name ( pn ) ;
TConfig prof ( pn , " MAIN " ) ;
2010-04-20 10:41:59 +00:00
_field_costo = prof . get ( " FieldCosto " , NULL , - 1 , " VAR " ) ;
2009-04-17 16:14:22 +00:00
}
//////////////////////////////////////////
//// CLASSE TGESTIONE_PREVENTIVO_APP ////
//////////////////////////////////////////
//ridefinisco il metodo get_mask delle TMotore_application
TMask * TGestione_preventivo_app : : get_mask ( int mode )
{
if ( mode = = MODE_INS | | mode = = MODE_MOD )
{
TString4 tipodoc ;
if ( mode = = MODE_MOD )
tipodoc = get_relation ( ) - > curr ( ) . get ( DOC_TIPODOC ) ; // Lo prendo dalla relazione (Gelai)
else
tipodoc = TMotore_application : : get_mask ( MODE_QUERY ) - > get ( F_TIPODOC ) ;
if ( _doc_masks . objptr ( tipodoc ) = = NULL )
{
TGestione_preventivo_msk * m = new TGestione_preventivo_msk ( tipodoc ) ;
_doc_masks . add ( tipodoc , m ) ;
const TTipo_documento & tdoc = m - > doc ( ) . tipo ( ) ;
const TString_array & handlers = tdoc . handlers ( ) ;
FOR_EACH_ARRAY_ROW ( handlers , i , row )
{
m - > user_set_handler ( row - > get_int ( 0 ) , row - > get_int ( 1 ) ) ;
}
TSheet_field & sh = m - > sfield ( F_SHEET ) ;
2009-04-20 00:06:09 +00:00
const int y = m - > sh_y ( ) - 1 ;
2009-04-25 07:04:22 +00:00
2010-04-20 10:41:59 +00:00
if ( m - > var_cost ( ) )
m - > add_list ( F_TIPO_COSTO , sh . page ( ) , " Tipo costo " , 2 , y - 1 , 20 , " " , " 1|2|4|5|6 " , " Ultimo costo|Media ultimi costi|Costo standard|Costo medio|Costo medio ponder. " ) ;
2009-07-30 15:18:05 +00:00
m - > add_button ( F_LOAD_COSTS , sh . page ( ) , " Costi " , 66 , y - 2 , 4 , 1 , " " ) ;
m - > set_handler ( F_LOAD_COSTS , TGestione_preventivo_msk : : pe_update_costi_handler ) ;
m - > add_button ( F_REVISION , sh . page ( ) , " Rev. " , 73 , y - 2 , 4 , 1 , " " ) ;
2009-06-30 09:36:17 +00:00
m - > set_handler ( F_REVISION , TGestione_preventivo_msk : : pe_new_revision_handler ) ;
2009-04-27 11:54:48 +00:00
m - > add_button ( F_SHRINK_ALL , sh . page ( ) , " -- " , 61 , y - 1 , 1 , 1 , " " , BMP_DARROWU ) ;
2009-04-25 07:04:22 +00:00
m - > set_handler ( F_SHRINK_ALL , TGestione_preventivo_msk : : pe_espandi_handler ) ;
2009-04-27 11:54:48 +00:00
m - > add_button ( F_ZOOM_ALL , sh . page ( ) , " ++ " , 66 , y - 1 , 1 , 1 , " " , BMP_DARROWD ) ;
2009-04-25 07:04:22 +00:00
m - > set_handler ( F_ZOOM_ALL , TGestione_preventivo_msk : : pe_espandi_handler ) ;
2009-04-27 11:54:48 +00:00
m - > add_button ( F_SHRINK_ROW , sh . page ( ) , " - " , 71 , y - 1 , 1 , 1 , " " , BMP_SARROWU ) ;
2009-04-25 07:04:22 +00:00
m - > set_handler ( F_SHRINK_ROW , TGestione_preventivo_msk : : pe_espandi_riga_handler ) ;
2009-04-27 11:54:48 +00:00
m - > add_button ( F_ZOOM_ROW , sh . page ( ) , " + " , 76 , y - 1 , 1 , 1 , " " , BMP_SARROWD ) ;
2009-04-25 07:04:22 +00:00
m - > set_handler ( F_ZOOM_ROW , TGestione_preventivo_msk : : pe_espandi_riga_handler ) ;
2009-05-11 13:00:22 +00:00
TBoolean_field & fk = m - > add_boolean ( F_USEK , sh . page ( ) , " " , 2 , y ) ;
fk . set_field ( DOC_USEK ) ;
2009-06-15 08:16:54 +00:00
// m->set_handler(F_USEK, TGestione_preventivo_msk::pe_usek_handler);
2009-05-11 13:00:22 +00:00
TToken_string * fk_false = fk . message ( 0 , true ) ;
TToken_string * fk_true = fk . message ( 1 , true ) ;
* fk_false < < " CLEAR, " < < F_K ;
* fk_true < < " ENABLE, " < < F_K ;
TEdit_field & k = m - > add_string ( F_K , sh . page ( ) , " K " , 5 , y , 25 ) ;
2009-04-17 16:14:22 +00:00
k . set_field ( DOC_K ) ;
2009-08-29 18:56:49 +00:00
m - > add_number ( F_LIVELLO , sh . page ( ) , " Livello Succ. " , 33 , y , 1 ) ;
m - > add_boolean ( F_DETTAGLIO , sh . page ( ) , " Dettaglia " , 53 , y ) ;
m - > add_button ( F_COPIA_TUTTO , sh . page ( ) , " ~Tutto " , 66 , y , 1 , 1 , " " , BMP_FILECHK ) ;
m - > set_handler ( F_COPIA_TUTTO , TGestione_preventivo_msk : : pe_copia_handler ) ;
2009-04-25 07:04:22 +00:00
m - > add_button ( F_COPIA , sh . page ( ) , " ~Copia " , 71 , y , 1 , 1 , " " , BMP_COPY ) ;
2009-04-22 16:01:28 +00:00
m - > set_handler ( F_COPIA , TGestione_preventivo_msk : : pe_copia_handler ) ;
2009-04-25 07:04:22 +00:00
m - > add_button ( F_INCOLLA , sh . page ( ) , " ~Incolla " , 76 , y , 1 , 1 , " " , BMP_PASTE ) ;
2009-04-22 16:01:28 +00:00
m - > set_handler ( F_INCOLLA , TGestione_preventivo_msk : : pe_incolla_handler ) ;
2009-04-20 00:06:09 +00:00
sh . enable_column ( sh . cid2index ( FR_JOLLY1 ) , false ) ;
2009-08-29 18:56:49 +00:00
sh . enable_column ( sh . cid2index ( FR_JOLLY4 ) , false ) ;
2009-04-17 16:14:22 +00:00
}
}
return TMotore_application : : get_mask ( mode ) ;
}
2009-06-30 09:36:17 +00:00
bool TGestione_preventivo_app : : last_doc ( char provv , int anno , const char * codnum ,
long & ndoc , TDate & ddoc ) const
{
bool ok = TMotore_application : : last_doc ( provv , anno , codnum , ndoc , ddoc ) ;
const TCodice_numerazione & num = cached_numerazione ( codnum ) ;
const int revlen = num . revision_len ( ) ;
if ( revlen > 0 )
{
real fattore = exp10 ( revlen ) ; fattore . round ( 0 ) ;
const long divisore = fattore . integer ( ) ;
if ( ok )
ndoc / = divisore ;
else
ndoc = 1 ;
ndoc + + ;
ndoc * = divisore ;
return true ;
}
return ok ;
}
2009-04-17 16:14:22 +00:00
//ridefinisco il metodo write delle TMotore_application
int TGestione_preventivo_app : : write ( const TMask & m )
{
2009-06-16 13:10:32 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) m ;
TDocumento & doc = mask . doc ( ) ;
const int rows = doc . physical_rows ( ) ;
2009-04-17 16:14:22 +00:00
const TString k = doc . get ( DOC_K ) ;
2009-04-20 00:06:09 +00:00
2009-05-20 13:30:47 +00:00
for ( int i = rows ; i > 0 ; i - - )
{
TRiga_documento & row = ( TRiga_documento & ) doc [ i ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
2009-06-25 09:10:49 +00:00
const TString & row_k = row . get ( RDOC_K ) ;
2009-05-20 13:30:47 +00:00
2009-06-25 09:10:49 +00:00
if ( ( row_k . blank ( ) ) & & ( i = = rows | | level > = doc [ i + 1 ] . get_int ( RDOC_LEVEL ) ) )
2009-06-16 13:10:32 +00:00
row . put ( RDOC_K , k ) ;
2009-05-20 13:30:47 +00:00
}
2009-06-16 13:10:32 +00:00
mask . update_costi_ricavi ( ) ;
2009-04-17 16:14:22 +00:00
return TMotore_application : : write ( m ) ;
}
//ridefinisco il metodo rewrite delle TMotore_application
int TGestione_preventivo_app : : rewrite ( const TMask & m )
{
2009-06-16 13:10:32 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) m ;
2009-04-17 16:14:22 +00:00
TDocumento & doc = ( ( TDocumento_mask & ) m ) . doc ( ) ;
2009-04-20 00:06:09 +00:00
const int rows = doc . physical_rows ( ) ;
2009-06-16 15:56:21 +00:00
const TString k = doc . get ( DOC_K ) ;
2009-04-17 16:14:22 +00:00
2009-05-20 13:30:47 +00:00
for ( int i = rows ; i > 0 ; i - - )
{
TRiga_documento & row = ( TRiga_documento & ) doc [ i ] ;
const int level = row . get_int ( RDOC_LEVEL ) ;
2009-06-25 09:10:49 +00:00
const TString & row_k = row . get ( RDOC_K ) ;
2009-05-20 13:30:47 +00:00
2009-06-25 09:10:49 +00:00
if ( ( row_k . blank ( ) ) & & ( i = = rows | | level > = doc [ i + 1 ] . get_int ( RDOC_LEVEL ) ) )
2009-06-16 13:10:32 +00:00
row . put ( RDOC_K , k ) ;
2009-05-20 13:30:47 +00:00
}
2009-06-16 13:10:32 +00:00
mask . update_costi_ricavi ( ) ;
2009-05-20 13:30:47 +00:00
return TMotore_application : : rewrite ( m ) ;
2009-04-17 16:14:22 +00:00
}
//ridefinisco il metodo read della TMotore_application
int TGestione_preventivo_app : : read ( TMask & m )
{
const int err = TMotore_application : : read ( m ) ;
if ( err = = NOERR )
{
TDocumento_mask & mask = ( TDocumento_mask & ) m ;
TDocumento & doc = mask . doc ( ) ;
const TString k = doc . get ( DOC_K ) ;
2009-06-16 15:56:21 +00:00
TSheet_field & sh = mask . sfield ( F_SHEET ) ;
2009-04-17 16:14:22 +00:00
for ( int i = 1 ; i < = doc . physical_rows ( ) ; i + + )
if ( k = = doc [ i ] . get ( RDOC_K ) )
2009-06-16 15:56:21 +00:00
{
2009-04-17 16:14:22 +00:00
doc [ i ] . zero ( RDOC_K ) ;
2009-06-16 15:56:21 +00:00
TToken_string & r = sh . row ( i - 1 ) ;
r . add ( " " , sh . cid2index ( FR_JOLLY2 ) ) ;
}
2009-04-17 16:14:22 +00:00
}
return err ;
}
//ridefinisco il metodo init_insert_mode della TMotore_application
void TGestione_preventivo_app : : init_insert_mode ( TMask & m )
2009-06-30 09:36:17 +00:00
{
2009-08-27 09:30:00 +00:00
m . disable ( F_REVISION ) ;
m . enable ( F_LOAD_COSTS ) ;
2009-06-30 09:36:17 +00:00
return TMotore_application : : init_insert_mode ( m ) ;
}
void TGestione_preventivo_app : : init_modify_mode ( TMask & m )
2009-04-17 16:14:22 +00:00
{
2009-08-27 09:30:00 +00:00
TGestione_preventivo_msk & mask = ( TGestione_preventivo_msk & ) m ;
const TDocumento & d = mask . doc ( ) ;
const TCodice_numerazione & num = d . codice_numerazione ( ) ;
mask . enable ( F_REVISION , ! d . bloccato ( ) & & num . revision_len ( ) > 0 ) ;
mask . enable ( F_LOAD_COSTS , ! d . bloccato ( ) ) ;
2009-04-17 16:14:22 +00:00
2009-06-30 09:36:17 +00:00
return TMotore_application : : init_modify_mode ( m ) ;
2009-04-17 16:14:22 +00:00
}
int pe0400 ( int argc , char * argv [ ] )
{
TGestione_preventivo_app a ;
a . run ( argc , argv , TR ( " Gestione Preventivi " ) ) ;
return 0 ;
2009-05-04 23:34:22 +00:00
}