2008-10-28 15:03:16 +00:00
# include <automask.h>
# include <textset.h>
2009-03-11 14:11:30 +00:00
# include <utility.h>
# include "../ve/velib.h"
2008-10-28 15:03:16 +00:00
2009-03-12 12:15:09 +00:00
# include "lv2600a.h"
2009-03-16 16:30:01 +00:00
/////////////////////////////////
//// TACQUISIZIONE_MSK ////
/////////////////////////////////
2008-10-28 15:03:16 +00:00
2009-03-16 16:30:01 +00:00
//classe TAcquisizione_msk
2008-10-28 15:03:16 +00:00
class TAcquisizione_msk : public TAutomask
{
protected :
virtual bool on_field_event ( TOperable_field & o , TField_event e , long jolly ) ;
public :
TAcquisizione_msk ( ) ;
} ;
2009-03-16 16:30:01 +00:00
//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera
2008-10-28 15:03:16 +00:00
bool TAcquisizione_msk : : on_field_event ( TOperable_field & f , TField_event e , long jolly )
{
switch ( f . dlg ( ) )
{
2009-03-16 16:30:01 +00:00
case F_PATH :
//se il campo <20> vuoto, provo a scriverlo dalla configurazione
if ( f . empty ( ) )
{
TConfig * configlv = new TConfig ( CONFIG_DITTA , " lv " ) ;
TString path = configlv - > get ( " PathContapezzi " ) ;
if ( path . full ( ) )
f . set ( path ) ;
}
break ;
default :
break ;
2008-10-28 15:03:16 +00:00
}
return true ;
}
TAcquisizione_msk : : TAcquisizione_msk ( ) : TAutomask ( " lv2600a " )
{
}
2009-03-16 16:30:01 +00:00
///////////////////////////////////
//// TACQUISIZIONE_CACHE ////
///////////////////////////////////
2008-10-28 15:03:16 +00:00
2009-03-16 16:30:01 +00:00
//classe TAcquisizione_cache
2008-10-28 15:03:16 +00:00
class TAcquisizione_cache : TCache
{
2009-03-16 16:30:01 +00:00
TString4 _codnum , _tipodoc , _stato ;
2008-10-28 15:03:16 +00:00
protected :
virtual void discarding ( const THash_object * obj ) ;
virtual TObject * key2obj ( const char * key ) ;
public :
TDocumento & doc ( const TDate & gg , const long cc ) ;
TAcquisizione_cache ( ) ;
} ;
2009-03-16 16:30:01 +00:00
//DISCARDING: metodo che salva un documento sul disco prima di eliminarlo dalla cache
2008-10-28 15:03:16 +00:00
void TAcquisizione_cache : : discarding ( const THash_object * obj )
{
TDocumento & doc = ( TDocumento & ) obj - > obj ( ) ;
doc . rewrite ( ) ;
}
2009-03-16 16:30:01 +00:00
//KEY2OBJ: metodo che sceglie il documento giusto da disco in modo da poterlo continuare, o lo crea se non c'<27>
2008-10-28 15:03:16 +00:00
TObject * TAcquisizione_cache : : key2obj ( const char * key )
{
TToken_string chiave ( key ) ;
2009-03-16 16:30:01 +00:00
const TDate datadoc = chiave . get ( ) ;
const long codcf = chiave . get_long ( ) ;
2008-10-28 15:03:16 +00:00
TString query ;
query < < " USE DOC KEY 2 SELECT STATO=#STATO \n " ;
2009-03-16 16:30:01 +00:00
for ( int i = 0 ; i < 2 ; i + + )
2008-10-28 15:03:16 +00:00
{
2009-03-16 16:30:01 +00:00
query < < ( i ? " TO " : " FROM " ) < < " "
< < " TIPOCF=C CODCF=#CODCF ANNO=#ANNO DATADOC=#DATADOC CODNUM=#CODNUM \n " ;
2008-10-28 15:03:16 +00:00
}
TISAM_recordset rset ( query ) ;
2009-03-16 16:30:01 +00:00
rset . set_var ( " #STATO " , TVariant ( _stato ) ) ;
rset . set_var ( " #CODCF " , codcf ) ;
rset . set_var ( " #ANNO " , long ( datadoc . year ( ) ) ) ;
rset . set_var ( " #DATADOC " , datadoc ) ;
rset . set_var ( " #CODNUM " , TVariant ( _codnum ) ) ;
2008-10-28 15:03:16 +00:00
2009-03-16 16:30:01 +00:00
TDocumento * doc = NULL ;
2008-10-28 15:03:16 +00:00
2009-03-16 16:30:01 +00:00
if ( rset . move_first ( ) )
doc = new TDocumento ( rset . cursor ( ) - > curr ( ) ) ;
2008-10-28 15:03:16 +00:00
else
{
2009-03-16 16:30:01 +00:00
doc = new TDocumento ( ' D ' , datadoc . year ( ) , _codnum , 0 ) ;
doc - > put ( DOC_TIPODOC , _tipodoc ) ;
doc - > put ( DOC_STATO , _stato ) ;
doc - > put ( DOC_DATADOC , datadoc ) ;
doc - > put ( DOC_TIPOCF , " C " ) ;
doc - > put ( DOC_CODCF , codcf ) ;
2008-10-28 15:03:16 +00:00
}
return doc ;
}
2009-03-16 16:30:01 +00:00
//DOC: metodo che restituisce un puntatore ad un documento identificato dalla coppia data - cliente
2008-10-28 15:03:16 +00:00
TDocumento & TAcquisizione_cache : : doc ( const TDate & gg , const long cc )
{
TString16 key ;
key < < gg . date2ansi ( ) < < ' | ' < < cc ;
return * ( TDocumento * ) objptr ( key ) ;
}
2009-03-16 16:30:01 +00:00
//metodo costruttore di una cache di 17 elementi
2008-10-28 15:03:16 +00:00
TAcquisizione_cache : : TAcquisizione_cache ( ) : TCache ( 17 )
{
2009-03-16 16:30:01 +00:00
TConfig cfg ( CONFIG_DITTA , " lv " ) ;
_codnum = cfg . get ( " NUM_RIT " , NULL , 0 ) ;
_tipodoc = cfg . get ( " TIPOOC_RIT " , NULL , 0 ) ;
_stato = cfg . get ( " STATO_RIT " , NULL , 0 ) ;
2008-10-28 15:03:16 +00:00
}
2009-03-16 16:30:01 +00:00
////////////////////////////////////////////
//// TACQUISIZIONE_LAVANDERIE_APP ////
////////////////////////////////////////////
2008-10-28 15:03:16 +00:00
2009-03-16 16:30:01 +00:00
//classe TAcquisizione_lavanderie_app
2008-10-28 15:03:16 +00:00
class TAcquisizione_lavanderie_app : public TSkeleton_application
{
2009-03-16 16:30:01 +00:00
TAcquisizione_msk * _msk ;
2008-10-28 15:03:16 +00:00
protected :
2009-03-16 16:30:01 +00:00
virtual bool create ( ) ;
virtual bool destroy ( ) ;
void elabora_file ( const TString & file , bool new_file ) ;
public :
bool transfer ( ) ;
virtual void main_loop ( ) ;
2008-10-28 15:03:16 +00:00
} ;
2009-03-16 16:30:01 +00:00
//CREATE: metodo costruttore
bool TAcquisizione_lavanderie_app : : create ( )
2008-10-28 15:03:16 +00:00
{
2009-03-16 16:30:01 +00:00
_msk = new TAcquisizione_msk ( ) ;
TSheet_field & sheet = _msk - > sfield ( F_SHEET_NAME ) ;
sheet . set_auto_append ( ) ;
return TSkeleton_application : : create ( ) ;
}
//DESTROY: metodo distruttore
bool TAcquisizione_lavanderie_app : : destroy ( )
{
delete _msk ;
return TApplication : : destroy ( ) ;
}
//ELABORA_FILE: metodo che effettivamente fa l'elaborazione del file, creando i documenti
void TAcquisizione_lavanderie_app : : elabora_file ( const TString & file , bool new_file )
{
TAcquisizione_cache ca ;
//scandisco il file
TScanner s ( file ) ;
while ( s . ok ( ) )
2008-10-28 15:03:16 +00:00
{
2009-03-16 16:30:01 +00:00
TString80 riga = s . line ( ) ;
if ( riga . blank ( ) )
continue ;
TDate datadoc ;
long codcf ;
TString80 codart ;
long qta ;
long rotti ;
long ndoc ;
TString16 tipo_conteggio ;
TString80 operatore ;
//controllo quale tracciato record devo seguire
if ( riga . len ( ) = = 34 ) // -> MONTANARI
{
//leggo i campi dalla riga del file
datadoc . set_day ( atoi ( riga . mid ( 0 , 2 ) ) ) ;
datadoc . set_month ( atoi ( riga . mid ( 2 , 2 ) ) ) ;
datadoc . set_year ( atoi ( riga . mid ( 4 , 4 ) ) ) ;
codcf = atol ( riga . mid ( 8 , 6 ) ) ;
codart = riga . mid ( 14 , 8 ) ;
qta = atol ( riga . mid ( 22 , 6 ) ) ;
rotti = atol ( riga . mid ( 28 , 6 ) ) ;
}
else if ( riga . len ( ) = = 121 ) // ->SKEMA
2008-10-28 15:03:16 +00:00
{
2009-03-16 16:30:01 +00:00
//leggo i campi dalla riga del file
TDate datadoc ;
datadoc . set_year ( atoi ( riga . mid ( 0 , 4 ) ) ) ;
datadoc . set_month ( atoi ( riga . mid ( 4 , 2 ) ) ) ;
datadoc . set_day ( atoi ( riga . mid ( 6 , 2 ) ) ) ;
codart = riga . mid ( 8 , 20 ) ;
codcf = atol ( riga . mid ( 28 , 20 ) ) ;
qta = atoi ( riga . mid ( 48 , 11 ) ) ;
ndoc = atoi ( riga . mid ( 59 , 11 ) ) ;
switch ( atoi ( riga . mid ( 70 , 11 ) ) )
2008-10-28 15:03:16 +00:00
{
2009-03-16 16:30:01 +00:00
case 1 : tipo_conteggio = " Automatico " ; break ;
case 2 : tipo_conteggio = " Manuale " ; break ;
case 3 : tipo_conteggio = " Scarto " ; break ;
default : break ;
2008-10-28 15:03:16 +00:00
}
2009-03-16 16:30:01 +00:00
operatore = riga . mid ( 81 , 40 ) ;
}
bool found = false ;
TDocumento & doc = ca . doc ( datadoc , codcf ) ;
//cerco se esiste gi<67> una riga sul documento selezionato per quell'articolo;
//se la trovo sommo la quantit<69> appena letta a quella gi<67> esistente,
//altrimenti creo una nuova riga documento
if ( doc . rows ( ) > 0 & & new_file )
{
if ( ! yesno_box ( TR ( " ATTENZIONE: il documento che si sta importando esiste gi<67> ! \n Si desidera continuare? " ) ) )
return ;
else if ( yesno_box ( TR ( " ATTENZIONE: Si desidera sovrascrivere il documento esistente(rispondendo NO le quantit<69> verranno sommate a quelle esistenti)? " ) ) )
doc . destroy_rows ( ) ;
}
for ( int i = 1 ; i < = doc . rows ( ) ; i + + )
{
TRiga_documento & rdoc = doc [ i ] ;
if ( rdoc . get ( RDOC_CODART ) = = codart )
2008-10-28 15:03:16 +00:00
{
2009-03-16 16:30:01 +00:00
long qtardoc = rdoc . get_long ( RDOC_QTA ) ;
qtardoc + = qta ;
rdoc . put ( RDOC_QTA , qtardoc ) ;
found = true ;
break ;
}
}
2008-10-28 15:03:16 +00:00
2009-03-16 16:30:01 +00:00
if ( found = = false )
{
TRiga_documento & rdoc = doc . new_row ( " 01 " ) ;
rdoc . put ( RDOC_CODART , codart ) ;
rdoc . put ( RDOC_QTA , qta ) ;
}
new_file = false ;
}
}
//TRANSFER: metodo che scorre i campi nome e, se sono pieni, richiama il metodo
//ELABORA_FILE(), che effettivamente fa l'elaborazione
bool TAcquisizione_lavanderie_app : : transfer ( )
{
//prendo il path dalla maschera
const TString & path = _msk - > get ( F_PATH ) ;
TSheet_field & sheet = _msk - > sfield ( F_SHEET_NAME ) ;
TFilename file ;
//per ogni riga dello sheet, leggo il suo contenuto, se contiene dei caratteri jolly
//preparo la lista dei file che soddisfano la maschera in quella directory e li elaboro
//tutti, altrimenti elaboro esattamente il file che <20> scritto sullo sheet
FOR_EACH_SHEET_ROW ( sheet , r1 , row1 )
{
if ( row1 - > full ( ) )
{
file = path ;
file . add ( * row1 ) ;
if ( file . find ( ' * ' ) > = 0 | | file . find ( ' ? ' ) > = 0 )
{
TString_array lista_file ;
list_files ( file , lista_file ) ;
FOR_EACH_ARRAY_ROW ( lista_file , r2 , row2 )
elabora_file ( * row2 , true ) ;
}
else
elabora_file ( file , true ) ;
2008-10-28 15:03:16 +00:00
}
}
2009-03-16 16:30:01 +00:00
return true ;
}
void TAcquisizione_lavanderie_app : : main_loop ( )
{
while ( _msk - > run ( ) = = K_ENTER )
transfer ( ) ;
2008-10-28 15:03:16 +00:00
}
int lv2600 ( int argc , char * argv [ ] )
{
TAcquisizione_lavanderie_app a ;
a . run ( argc , argv , " Acquisizione bolle di rientro/ritiro " ) ;
return TRUE ;
}