2016-09-09 13:58:28 +00:00
# include <applicat.h>
# include <automask.h>
# include <config.h>
# include <ODBCrset.h>
# include <progind.h>
# include <reputils.h>
# include <tabutil.h>
# include <utility.h>
# include "../mg/mglib.h"
# include "../cg/cglib01.h"
# include "../cg/cg2101.h"
2017-08-28 15:39:35 +00:00
# include "../ve/velib.h"
# include <doc.h>
# include <rdoc.h>
2016-09-09 13:58:28 +00:00
# include "bs0.h"
# include "../fe/felib.h"
# include "../ve/condv.h"
# include "../ve/rcondv.h"
# include <comuni.h>
# include <clifo.h>
# include <cfven.h>
# include <rcausali.h>
# define BS_DTULTAGG "DtUltAgg"
///////////////////////////////////////////////////////////
// TBeeStore_cache
///////////////////////////////////////////////////////////
class TBeeStore_cache : TCache
{
protected :
virtual TObject * key2obj ( const char * key )
{
const char tipo = * key ;
const long codice = atol ( key + 1 ) ;
return new TAnagrafica ( LF_CLIFO , tipo , codice ) ;
}
public :
const TAnagrafica & anag ( char tipo , long codice )
{
CHECKD ( ( tipo = = ' C ' | | tipo = = ' F ' ) & & codice > 0L , " Codice cli/for non valido " , codice ) ;
TString8 key ; key . format ( " %c%06ld " , tipo , codice ) ;
const TAnagrafica * a = ( const TAnagrafica * ) objptr ( key ) ;
return * a ;
}
const TAnagrafica & anag ( const TRectype & rec )
{
const char tipo = rec . get_char ( CLI_TIPOCF ) ;
const long codice = rec . get_long ( CLI_CODCF ) ;
return anag ( tipo , codice ) ;
}
const TAnagrafica & anag ( const TISAM_recordset & rec )
{ return anag ( rec . cursor ( ) - > curr ( ) ) ; }
} ;
static TBeeStore_cache _anagr ;
///////////////////////////////////////////////////////////
// TBeeStore_mask
///////////////////////////////////////////////////////////
class TBeeStore_mask : public TAutomask
{
protected :
virtual bool on_field_event ( TOperable_field & o , TField_event e , long jolly ) ;
public :
void autoload ( ) ;
void autosave ( ) const ;
bool get_bool ( const char * fld )
{ TMask_field * f = find_by_fieldname ( fld ) ; return f ? f - > get ( ) . full ( ) : false ; }
TDate get_date ( const char * fld )
{ TMask_field * f = find_by_fieldname ( fld ) ; return TDate ( f ? f - > get ( ) : EMPTY_STRING ) ; }
TBeeStore_mask ( ) : TAutomask ( " bs0200a " ) { autoload ( ) ; }
~ TBeeStore_mask ( ) { autosave ( ) ; }
} ;
bool TBeeStore_mask : : on_field_event ( TOperable_field & o , TField_event e , long jolly )
{
if ( e = = fe_modify & & ! o . empty ( ) )
{
const TFieldref * fr = o . field ( ) ;
if ( fr & & fr - > name ( ) = = " CODCAUSC " )
{
// Configura righe aggiuntive causale corrispettivi
TRecord_array rcaus ( o . get ( ) , LF_RCAUSALI ) ;
if ( ! rcaus . exist ( 15 ) & & yesno_box ( TR ( " Si desidera configurare la causale per il collegamento a BeeStore? " ) ) )
{
const char * codice [ ] = { " BEECN " , " BEEBM " , " BEECC " , " BEEAS " , " BEEAL " , NULL } ;
const char * descr [ ] = { " Contanti " , " Bancomat " , " Carta di credito " , " Assegni " , " Altro " , NULL } ;
TTable dpn ( " %DPN " ) ;
for ( int i = 0 ; codice [ i ] ; i + + )
{
dpn . put ( " CODTAB " , codice [ i ] ) ;
dpn . put ( " S0 " , descr [ i ] ) ;
dpn . write ( ) ;
TRectype & row = rcaus . row ( 15 + i , true ) ;
row . put ( RCA_CODDESC , codice [ i ] ) ;
row . put ( RCA_DESC , descr [ i ] ) ;
}
rcaus . rewrite ( ) ;
TRectype caus ( LF_CAUSALI ) ;
caus . put ( RCA_CODCAUS , o . get ( ) ) ;
caus . edit ( ) ;
}
}
}
return true ;
}
void TBeeStore_mask : : autoload ( )
{
// Carica i valori default dei parametri dal [bs] in ditta,ini
FOR_EACH_MASK_FIELD ( * this , i , f )
{
const TFieldref * fr = f - > field ( ) ;
if ( fr ! = NULL )
f - > set ( ini_get_string ( CONFIG_DITTA , " bs " , fr - > name ( ) ) ) ;
}
}
void TBeeStore_mask : : autosave ( ) const
{
// Salva i valori dei parametri in [bs] in ditta,ini
FOR_EACH_MASK_FIELD ( * this , i , f )
{
const TFieldref * fr = f - > field ( ) ;
if ( fr ! = NULL )
ini_set_string ( CONFIG_DITTA , " bs " , fr - > name ( ) , f - > get ( ) ) ;
}
}
///////////////////////////////////////////////////////////
// TBeeStore_sync
///////////////////////////////////////////////////////////
typedef bool TFieldEvaluator ( const TISAM_recordset & rec , const char * fldname , const char * expr , TVariant & var ) ;
class TBeeStore_sync : public TSkeleton_application
{
2018-03-07 10:01:41 +00:00
TString _dsn ;
2017-11-09 08:56:30 +00:00
TString _usr ;
TString _psw ;
2016-09-09 13:58:28 +00:00
TFilename _sqlog ;
TLog_report * _log ;
private :
const TString & comune ( const TRecordset & recset , const char * fld_cap , const char * fld_den ) const ;
bool split_phone ( const TRecordset & odbc , const char * number , TIsamfile & clifo , const char * pre , const char * num ) const ;
void load_clifo ( char tipocf ) ;
void save_clifo ( int cfmask , const TDate & dal , const TDate & al ) ;
void add_rmov ( TMovimentoPN & mov , const real & importo , const TCausale & caus , const char * cod ) const ;
protected :
2017-08-28 15:39:35 +00:00
bool save_and_delete_movmag ( TMov_mag * & doc ) const ;
bool save_and_delete_doc ( TDocumento * & doc ) const ;
2016-09-09 13:58:28 +00:00
void load_origine_1 ( TISAM_recordset & out_set , const char * in_table , const TString_array & pairs ) ;
void save_origine_2 ( TISAM_recordset & in_set , const char * out_table , const TString_array & pairs , TFieldEvaluator * feval = NULL ) ;
void sync_table ( TISAM_recordset & in_set , const char * out_table ,
const TString_array & pairs ) ;
void sync_table ( const char * in_table , const char * out_table ,
const TString_array & fields , const TDate & dal , const TDate & al ) ;
void sync_table ( const int logicnum , const char * out_table ,
const TString_array & fields , const TDate & dal , const TDate & al ) ;
void sync_iva ( const TDate & dal , const TDate & al ) ;
void sync_ums ( const TDate & dal , const TDate & al ) ;
void sync_lines ( const TDate & dal , const TDate & al ) ;
void sync_catmer ( const TDate & dal , const TDate & al ) ;
void sync_val ( const TDate & dal , const TDate & al ) ;
void sync_anamag ( const TDate & dal , const TDate & al ) ;
void sync_barcode ( const TDate & dal , const TDate & al ) ;
void sync_corrisp ( const TDate & dal , const TDate & al ) ;
2017-08-28 15:39:35 +00:00
void sync_mov ( int tipotestata , const TDate & dal , const TDate & al ) ;
void sync_scontrini ( const TDate & dal , const TDate & al ) { sync_mov ( 3 , dal , al ) ; }
void sync_doc ( const TDate & dal , const TDate & al ) ;
void sync_carscar ( const TDate & dal , const TDate & al ) { sync_mov ( 1 , dal , al ) ; }
void sync_generici ( const TDate & dal , const TDate & al ) { sync_mov ( 4 , dal , al ) ; }
2016-09-09 13:58:28 +00:00
void sync_clifo ( int cfmask , const TDate & dal , const TDate & al ) ;
void sync_listino ( const TString & listino ) ;
public :
virtual bool create ( ) ;
virtual void main_loop ( ) ;
} ;
// Converte una TDate in una data SQL
const TString & date2sql ( const TDate & d )
{
TString & tmp = get_tmp_string ( ) ;
if ( d . ok ( ) )
2017-08-28 15:39:35 +00:00
tmp . format ( " '%04d-%02d-%02d' " , d . year ( ) , d . month ( ) , d . day ( ) ) ;
2016-09-09 13:58:28 +00:00
else
tmp = " NULL " ;
return tmp ;
}
// Coverte un qualsiasi TVariant in stringa SQL
const TString & var2sql ( const TVariant & var )
{
TString & tmp = get_tmp_string ( ) ;
switch ( var . type ( ) )
{
case _nullfld :
tmp = " NULL " ;
break ;
case _boolfld :
tmp = var . as_bool ( ) ? " 1 " : " 0 " ;
break ;
case _datefld :
tmp = date2sql ( var . as_date ( ) ) ;
break ;
case _intfld :
case _longfld :
var . as_string ( tmp ) ;
break ;
case _realfld :
if ( var . is_empty ( ) )
tmp = " 0 " ;
else
{
tmp = var . as_real ( ) . string ( 0 , 2 ) ;
if ( tmp . ends_with ( " .00 " ) )
tmp . rtrim ( 3 ) ;
}
break ;
default :
{
var . as_string ( tmp ) ;
const int pos = tmp . find ( ' \' ' ) ;
if ( pos > = 0 )
{
for ( int i = tmp . len ( ) - 1 ; i > = pos ; i - - )
if ( tmp [ i ] = = ' \' ' ) tmp . insert ( " ' " , i ) ;
}
tmp . insert ( " ' " ) ;
tmp < < " ' " ;
}
break ;
}
return tmp ;
}
// Coverte una qualsiasi espressione in stringa SQL
const TString & expr2sql ( const TISAM_recordset & set , const char * expr )
{
TVariant var ;
TExpression e ( expr , _strexpr , true ) ;
if ( e . numvar ( ) = = 0 )
{
if ( real : : is_natural ( expr ) )
var = atoi ( expr ) ;
else
var = expr ;
} else
if ( e . numvar ( ) = = 1 & & xvt_str_same ( e . varname ( 0 ) , expr ) )
{
var = set . get ( expr ) ;
}
else
{
for ( int v = e . numvar ( ) - 1 ; v > = 0 ; v - - )
{
var = set . get ( e . varname ( v ) ) ;
if ( var . is_real ( ) | | var . is_bool ( ) )
e . setvar ( v , var . as_real ( ) ) ;
else
e . setvar ( v , var . as_string ( ) ) ;
}
var = e . as_string ( ) ;
}
return var2sql ( var ) ;
}
// Carica da BeeStore i record con Origine=1, cio<69> generati da lui ed eventualmente aggiorna i corrispondenti in Campo
void TBeeStore_sync : : load_origine_1 ( TISAM_recordset & out_set , const char * in_table , const TString_array & pairs )
{
TString str ( 255 ) ;
2017-11-09 08:56:30 +00:00
str < < " SELECT " ;
2016-09-09 13:58:28 +00:00
FOR_EACH_ARRAY_ROW ( pairs , f , row )
str < < row - > get ( 0 ) < < ' , ' ;
str . rtrim ( 1 ) ; // toglie ultima virgola
str < < " \n FROM " < < in_table < < " WHERE (Origine=1); " ;
TODBC_recordset odbc ( str ) ;
2017-11-09 08:56:30 +00:00
odbc . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
const TRecnotype n = odbc . items ( ) ;
if ( n > 0 )
{
TLocalisamfile & file = out_set . cursor ( ) - > file ( ) ;
const RecDes & rd = file . curr ( ) . rec_des ( ) ;
TToken_string key_fields ;
for ( int i = 0 ; i < rd . Ky - > NkFields ; i + + )
{
const int nf = rd . Ky [ 0 ] . FieldSeq [ i ] % MaxFields ;
key_fields . add ( rd . Fd [ nf ] . Name ) ;
}
str . format ( TR ( " Importazione %ld record dalla tabella %s " ) , n , in_table ) ;
_log - > log ( 0 , " " ) ;
_log - > log ( 0 , str ) ;
TProgress_monitor pi ( n , str ) ;
for ( bool ok = odbc . move_first ( ) ; ok ; ok = odbc . move_next ( ) )
{
file . zero ( ) ;
TString80 cfld , bfld ; // Campo field e BeeStore field
FOR_EACH_ARRAY_ROW ( pairs , p , row )
{
bfld = row - > get ( 0 ) ;
cfld = row - > get ( ) ;
const int pos = key_fields . get_pos ( cfld ) ;
if ( pos > = 0 )
{
const TVariant & var = odbc . get ( bfld ) ;
if ( ! var . is_null ( ) )
file . put ( cfld , var . as_string ( ) ) ;
if ( pos = = key_fields . items ( ) - 1 )
break ;
}
}
int err = file . read ( _isequal , _lock ) ;
if ( err = = NOERR )
{
bool dirty = false ;
const TDate dataagg = file . get ( CLI_DATAAGG ) ;
TDate dtultagg = odbc . get ( BS_DTULTAGG ) . as_date ( ) ;
if ( ! dtultagg . ok ( ) ) dtultagg = TODAY ;
str = " record " ;
FOR_EACH_TOKEN ( key_fields , f )
str < < ' ' < < file . get ( f ) ;
if ( dtultagg > = dataagg )
{
FOR_EACH_ARRAY_ROW ( pairs , r , row )
{
bfld = row - > get ( 0 ) ;
cfld = row - > get ( ) ;
if ( cfld [ 0 ] > = ' A ' & & cfld . find ( " -> " ) < 0 & & key_fields . get_pos ( cfld ) < 0 ) // Aggiorno solo i campi NON chiave
{
const TString & vec = file . get ( cfld ) ;
const TString & nov = odbc . get ( bfld ) . as_string ( ) ;
if ( nov ! = vec )
{
if ( ! dirty )
str < < ' ' < < bfld < < " =' " < < nov < < ' \' ' ;
file . put ( cfld , nov ) ;
dirty = true ;
}
}
}
if ( dirty )
{
TRectype & rec = file . curr ( ) ;
if ( rec . exist ( CLI_UTENTE ) )
rec . put ( CLI_UTENTE , " BEESTORE " ) ;
if ( rec . exist ( CLI_DATAAGG ) )
rec . put ( CLI_DATAAGG , dtultagg ) ;
}
else
str < < " Nessuna variazione pertinente " ;
}
else
str < < " Data di ultimo aggiornamento obsoleta " ;
if ( dirty )
{
if ( file . rewrite ( ) = = 0 )
_log - > log ( 1 , str ) ;
else
{
TString80 err ; err < < TR ( " ERRORE " ) < < err < < TR ( " aggiornando il " ) ;
str . insert ( err ) ;
_log - > log ( 2 , str ) ;
}
}
else
{
_log - > log ( 0 , str ) ;
file . reread ( _unlock ) ;
}
} else
if ( err = = _iskeynotfound )
{
file . zero ( ) ;
FOR_EACH_ARRAY_ROW ( pairs , r , row )
{
bfld = row - > get ( 0 ) ;
cfld = row - > get ( ) ;
if ( cfld [ 0 ] > = ' A ' & & cfld . find ( " -> " ) )
{
const TString & nov = odbc . get ( bfld ) . as_string ( ) ;
file . put ( cfld , nov ) ;
}
}
if ( file . write ( ) = = 0 )
_log - > log ( 1 , str ) ;
else
{
TString80 msg ; msg < < TR ( " ERRORE " ) < < err < < TR ( " inserendo il " ) ;
str . insert ( msg ) ;
_log - > log ( 2 , str ) ;
}
}
}
str . cut ( 0 ) < < " DELETE FROM " < < in_table < < " WHERE Origine=1; " ;
odbc . exec ( str ) ;
}
}
void TBeeStore_sync : : save_origine_2 ( TISAM_recordset & in_set , const char * out_table , const TString_array & fields , TFieldEvaluator * fval )
{
const TRecnotype n = in_set . items ( ) ;
TString str ( 255 ) ;
TODBC_recordset odbc ( str ) ;
2017-11-09 08:56:30 +00:00
odbc . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
str . cut ( 0 ) < < " DELETE FROM " < < out_table < < " WHERE Origine=2; " ;
odbc . exec ( str ) ;
str . format ( TR ( " Esportazione %ld record in %s " ) , n , out_table ) ;
_log - > log ( 0 , " " ) ;
_log - > log ( 0 , str ) ;
const TRectype & curr = in_set . cursor ( ) - > curr ( ) ;
TProgress_monitor pi ( n , str ) ;
for ( bool ok = in_set . move_first ( ) ; ok ; ok = in_set . move_next ( ) )
{
str . cut ( 0 ) < < " INSERT INTO " < < out_table < < " \n ( " ;
FOR_EACH_ARRAY_ROW ( fields , sr , srow )
str < < ( sr ? " , " : " " ) < < srow - > get ( 0 ) ;
str < < " , Origine, Errore, " BS_DTULTAGG ;
str < < " ) \n VALUES ( " ;
FOR_EACH_ARRAY_ROW ( fields , ir , irow )
{
if ( ir ) str < < " , " ;
if ( fval )
{
const char * fname = irow - > get ( 0 ) ; // BeeStore field name
const char * fexpr = irow - > get ( ) ; // Campo expression
TVariant var ;
if ( fval ( in_set , fname , fexpr , var ) )
{
str < < var2sql ( var ) ;
continue ;
}
}
const TFixed_string cfld = irow - > get ( 1 ) ;
if ( cfld . find ( " SCONTO " ) > = 0 )
{
real sconto ;
const TString & exp = curr . get ( cfld ) ;
if ( exp . full ( ) )
{
if ( real : : is_natural ( exp ) )
sconto = real ( exp ) ;
else
{
TString80 goodexp ; real val_perc ;
if ( scontoexpr2perc ( exp , false , goodexp , val_perc ) & & val_perc ! = UNO )
{
sconto = CENTO - CENTO * val_perc ;
sconto . round ( 5 ) ;
}
}
}
str < < var2sql ( sconto ) ;
} else
if ( ( cfld [ 0 ] > = ' A ' & & cfld [ 0 ] < = ' Z ' ) | | cfld . find ( " -> " ) > 0 )
str < < expr2sql ( in_set , cfld ) ;
else
str < < cfld ;
}
str < < " , 2, 0, GETDATE() " ;
str < < " ); " ;
const long err = odbc . exec ( str ) ;
if ( err < = 0 )
{
TParagraph_string par ( str , 75 ) ;
if ( par . items ( ) > 4 )
{
str . cut ( 0 ) ;
bool values = false ;
FOR_EACH_TOKEN ( par , s )
{
if ( str . full ( ) & & ! values )
{
values = _strnicmp ( s , " VALUES " , 6 ) = = 0 ;
if ( ! values )
continue ;
}
str < < s < < ' \n ' ;
}
str . trim ( ) ;
}
_log - > log ( 1 , str ) ;
str . format ( " SQL error %d " , abs ( err ) ) ;
_log - > log ( 2 , str ) ;
}
if ( ! pi . add_status ( ) )
break ;
}
odbc . exec ( " COMMIT; " ) ;
}
void TBeeStore_sync : : sync_table ( TISAM_recordset & in_set , const char * out_table , const TString_array & fields )
{
load_origine_1 ( in_set , out_table , fields ) ;
save_origine_2 ( in_set , out_table , fields ) ;
}
static TString & build_query ( const char * table , const TDate & dal , const TDate & al )
{
TString & q = get_tmp_string ( ) ;
q < < " USE " < < table ;
if ( dal . ok ( ) | | al . ok ( ) )
q < < " SELECT BETWEEN(DATAAGG, " < < dal . date2ansi ( ) < < ' , ' < < al . date2ansi ( ) < < " ) " ;
return q ;
}
static TString & build_query ( const int logicnum , const TDate & dal , const TDate & al )
{
const TRectype rec ( logicnum ) ;
TString & q = get_tmp_string ( ) ;
q < < " USE " < < logicnum ;
if ( rec . exist ( CLI_UTENTE ) )
q < < " SELECT (UTENTE!= \" BEESTORE \" ) " ;
if ( ( dal . ok ( ) | | al . ok ( ) ) & & rec . exist ( CLI_DATAAGG ) )
{
if ( q . find ( " SELECT " ) < 0 )
q < < " SELECT " ;
else
q < < " && " ;
q < < " (BETWEEN(DATAAGG, " < < dal . date2ansi ( ) < < ' , ' < < al . date2ansi ( ) < < " )) " ;
}
return q ;
}
void TBeeStore_sync : : sync_table ( const char * table , const char * out_table ,
const TString_array & fields , const TDate & dal , const TDate & al )
{
const TString & q = build_query ( table , dal , al ) ;
TISAM_recordset set ( q ) ;
sync_table ( set , out_table , fields ) ;
}
void TBeeStore_sync : : sync_table ( const int logicnum , const char * out_table ,
const TString_array & fields , const TDate & dal , const TDate & al )
{
const TString & q = build_query ( logicnum , dal , al ) ;
TISAM_recordset set ( q ) ;
sync_table ( set , out_table , fields ) ;
}
void TBeeStore_sync : : sync_ums ( const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " CodUntMis|CODTAB " ) ;
fields . add ( " DSUntMis|S0 " ) ;
sync_table ( " %UMS " , " tieUntMisura " , fields , dal , al ) ;
}
void TBeeStore_sync : : sync_iva ( const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " CodIva|CODTAB " ) ;
fields . add ( " CodIvaSt|CODTAB " ) ;
fields . add ( " DSIva|S0 " ) ;
fields . add ( " Aliquota|R0 " ) ;
sync_table ( " %IVA " , " tieIva " , fields , dal , al ) ;
}
void TBeeStore_sync : : sync_lines ( const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " CodLinea|CODTAB " ) ;
fields . add ( " DSLinea|S0 " ) ;
TString query = build_query ( " GMC " , dal , al ) ;
if ( query . find ( " SELECT " ) < 0 )
query < < " SELECT " ;
else
query < < " && " ;
query < < " (CODTAB?='???') " ;
TISAM_recordset lin ( query ) ;
sync_table ( lin , " tieLineeArt " , fields ) ;
}
void TBeeStore_sync : : sync_catmer ( const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " CodCategoriaMerceologica|CODTAB " ) ;
fields . add ( " DSCategoriaMerceologica|S0 " ) ;
fields . add ( " CodTipoEtichetta|'' " ) ;
sync_table ( " GMC " , " tieCategorieMerceologiche " , fields , dal , al ) ;
}
void TBeeStore_sync : : sync_anamag ( const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " CodPadre| " ANAMAG_CODART ) ;
fields . add ( " DSArticolo| " ANAMAG_DESCR ) ;
fields . add ( " DSArticoloAgg| " ANAMAG_DESCRAGG " [1,70] " ) ;
fields . add ( " CodUntMagazzino|49->UM " ) ;
fields . add ( " CodIva| " ANAMAG_CODIVA ) ;
fields . add ( " CodLinea| " ANAMAG_GRMERC " [1,3] " ) ;
fields . add ( " CodCategMerceologica| " ANAMAG_GRMERC ) ;
fields . add ( " Bloccato| " ANAMAG_SOSPESO ) ;
TString query = build_query ( LF_ANAMAG , dal , al ) ;
query < < " \n JOIN " < < LF_UMART < < " INTO CODART==CODART " ;
TISAM_recordset art ( query ) ;
sync_table ( art , " tieArticoli " , fields ) ;
fields . destroy ( ) ;
fields . add ( " CodArticolo| " ANAMAG_CODART ) ;
fields . add ( " CodPadre| " ANAMAG_CODART ) ;
save_origine_2 ( art , " tieArtVarianti " , fields ) ;
}
void TBeeStore_sync : : sync_barcode ( const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " CodArticolo| " ANAMAG_CODART ) ;
fields . add ( " BarCode| " ANAMAG_DESCR ) ;
TString str ( 255 ) ;
2017-11-09 08:56:30 +00:00
str < < " SELECT " ;
2016-09-09 13:58:28 +00:00
FOR_EACH_ARRAY_ROW ( fields , f , row )
str < < row - > get ( 0 ) < < ' , ' ;
str . rtrim ( 1 ) ; // toglie ultima virgola
str < < " \n FROM tieArtBarCode WHERE (Origine=1); " ;
TODBC_recordset odbc ( str ) ;
2017-11-09 08:56:30 +00:00
odbc . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
const TRecnotype n = odbc . items ( ) ;
if ( n > 0 )
{
TProgress_monitor pi ( n , " Importazione codici a barre " ) ;
for ( bool go = odbc . move_first ( ) ; go ; go = odbc . move_next ( ) )
{
const TCodice_articolo ca = odbc . get ( " CodArticolo " ) . as_string ( ) ;
const TCodice_articolo bc = odbc . get ( " BarCode " ) . as_string ( ) ;
int tipo = 0 ;
switch ( bc . len ( ) )
{
case 8 : tipo = 8 ; break ;
case 13 : tipo = 1 ; break ;
default : break ;
}
if ( tipo )
{
TRecord_array codcor ( ca , LF_CODCORR ) ;
int n = 0 ;
for ( n = codcor . last_row ( ) ; n > 0 ; n = codcor . pred_row ( n ) )
{
const TRectype & row = codcor . row ( n ) ;
if ( row . get ( " CODARTALT " ) = = bc & & row . get_int ( " TIPO " ) = = tipo )
break ; // trovato!
}
if ( n < = 0 )
{
TRectype & row = codcor . row ( - 1 , true ) ; // Add new row
row . put ( " CODARTALT " , bc ) ;
row . put ( " TIPO " , tipo ) ;
codcor . rewrite ( ) ;
}
}
if ( ! pi . add_status ( ) )
break ;
}
}
}
static bool ClifoEvaluator ( const TISAM_recordset & rec , const char * fldname , const char * expr , TVariant & var )
{
const TAnagrafica & a = _anagr . anag ( rec ) ;
if ( xvt_str_same ( fldname , " Cod_PK " ) )
{
TLocalisamfile & cfv = rec . cursor ( ) - > file ( LF_CFVEN ) ;
TString80 codprcf = cfv . get ( CFV_CODPRCF ) ;
if ( codprcf . blank ( ) | | codprcf [ 0 ] = = ' C ' ) // Anagrafica gestita da Campo
{
const char t = rec . get ( CLI_TIPOCF ) . as_string ( ) [ 0 ] ;
const long c = rec . get ( CLI_CODCF ) . as_int ( ) ;
TString8 cod_pk ; cod_pk . format ( " C%06ld%c " , c , t ) ;
if ( cod_pk ! = codprcf )
{
cfv . put ( CFV_CODPRCF , codprcf = cod_pk ) ;
cfv . rewrite ( ) ;
}
}
var = codprcf ;
return true ;
}
if ( xvt_str_same ( fldname , " Cognome " ) )
{
if ( a . fisica ( ) )
var = a . cognome ( ) ;
return true ;
}
if ( xvt_str_same ( fldname , " Nome " ) )
{
if ( a . fisica ( ) )
var = a . nome ( ) ;
return true ;
}
if ( xvt_str_same ( fldname , " Indirizzo " ) )
{
TString ind ;
ind = a . via_residenza ( ) ;
if ( ind . full ( ) )
{
const TString & civ = a . civico_residenza ( ) ;
if ( civ . full ( ) ) ind < < ' , ' < < civ ;
}
const TString & loc = a . localita_residenza ( ) ;
if ( loc . full ( ) ) ind < < ' , ' < < loc ;
ind . strip_double_spaces ( ) ;
var = ind ;
return true ;
}
if ( xvt_str_same ( fldname , " Citta " ) )
{
var = a . comune_residenza ( ) ;
return true ;
}
if ( xvt_str_same ( fldname , " Provincia " ) )
{
var = a . provincia_residenza ( ) ;
return true ;
}
if ( xvt_str_same ( fldname , " ComuneNascita " ) )
{
var = a . comune_nascita ( ) ;
return true ;
}
if ( xvt_str_same ( fldname , " PVNascita " ) )
{
var = a . provincia_nascita ( ) ;
return true ;
}
if ( xvt_str_same ( fldname , " Telefono " ) | | xvt_str_same ( fldname , " Cellulare " ) | | xvt_str_same ( fldname , " CellulareSMS " ) )
{
const char * suff = ( * fldname = = ' C ' ) ? ( strlen ( fldname ) > 9 ? " 3 " : " 2 " ) : " " ;
TString8 pref ; pref < < " PTEL " < < suff ;
TString80 tele ; tele < < " TEL " < < suff ;
TString80 str ; rec . get ( pref ) . as_string ( str ) ; str < < ' ' < < rec . get ( tele ) . as_string ( ) ;
str . strip_double_spaces ( ) ;
char * s = str . get_buffer ( ) ;
for ( const char * f = s ; * f ; f + + )
{
if ( * f = = ' ' | | ( * f > = ' 0 ' & & * f < = ' 9 ' ) )
{
if ( f > s ) * s = * f ;
s + + ;
}
}
* s = ' \0 ' ;
}
if ( xvt_str_same ( fldname , " Tipo " ) )
{
var = a . fisica ( ) ? 1 : 2 ;
return true ;
}
if ( xvt_str_same ( fldname , " Cliente " ) )
{
const char tipocf = rec . get ( CLI_TIPOCF ) . as_string ( ) [ 0 ] ;
var = tipocf = = ' C ' ;
return true ;
}
if ( xvt_str_same ( fldname , " Fornitore " ) )
{
const char tipocf = rec . get ( CLI_TIPOCF ) . as_string ( ) [ 0 ] ;
var = tipocf = = ' F ' ;
return true ;
}
if ( _strnicmp ( fldname , " Cli_ " , 4 ) = = 0 )
{
const char tipocf = rec . get ( CLI_TIPOCF ) . as_string ( ) [ 0 ] ;
return tipocf ! = ' C ' ;
}
if ( _strnicmp ( fldname , " For_ " , 4 ) = = 0 )
{
const char tipocf = rec . get ( CLI_TIPOCF ) . as_string ( ) [ 0 ] ;
return tipocf ! = ' F ' ;
}
return false ;
}
const TString & TBeeStore_sync : : comune ( const TRecordset & recset , const char * fld_cap , const char * fld_den ) const
{
TString8 cap ; if ( fld_cap & & * fld_cap ) cap = recset . get ( fld_cap ) . as_string ( ) . left ( 5 ) ;
TString80 den ; if ( fld_den & & * fld_den ) den = recset . get ( fld_den ) . as_string ( ) ;
return : : cap2comune ( cap , den ) ;
}
bool TBeeStore_sync : : split_phone ( const TRecordset & odbc , const char * number , TIsamfile & clifo , const char * pre , const char * num ) const
{
TString pn = odbc . get ( number ) . as_string ( ) ;
if ( pn . full ( ) )
{
pn . strip_double_spaces ( ) ;
const int maxpref = clifo . curr ( ) . length ( pre ) ;
int split = - 1 ;
for ( int i = 0 ; pn [ i ] & & i < = maxpref ; i + + )
{
if ( ! isdigit ( pn [ i ] ) )
{
split = i ;
break ;
}
}
if ( split > 1 )
{
clifo . put ( pre , pn . left ( split ) ) ;
clifo . put ( num , pn . mid ( split + 1 ) ) ;
}
else
{
clifo . put ( pre , " " ) ;
clifo . put ( num , pn ) ;
}
}
return pn . full ( ) ;
}
void TBeeStore_sync : : load_clifo ( char tipocf )
{
TString str ( 255 ) ;
2017-11-09 08:56:30 +00:00
str < < " SELECT * FROM tieAnagCFP WHERE (Origine=1)AND " ;
2016-09-09 13:58:28 +00:00
str < < ' ( ' < < ( tipocf = = ' F ' ? " Fornitore " : " Cliente " ) < < " =1); " ;
TFast_isamfile clifo ( LF_CLIFO ) ;
TODBC_recordset odbc ( str ) ;
2017-11-09 08:56:30 +00:00
odbc . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
const TRecnotype n = odbc . items ( ) ;
str . cut ( 0 ) < < TR ( " Importazione " ) < < ( tipocf = = ' F ' ? TR ( " Fornitori " ) : TR ( " Clienti " ) ) ;
TProgress_monitor pi ( n , str ) ;
for ( bool ok = odbc . move_first ( ) ; ok ; ok = odbc . move_next ( ) )
{
long codcf = odbc . get ( tipocf = = ' F ' ? " For_CodFor " : " Cli_CodCG " ) . as_int ( ) ;
if ( codcf < = 0 )
{
const TString & cod_pk = odbc . get ( " Cod_PK " ) . as_string ( ) ;
if ( cod_pk [ 0 ] = = ' C ' & & cod_pk . len ( ) = = 8 & & cod_pk [ 7 ] = = tipocf )
codcf = atol ( cod_pk . mid ( 1 , 6 ) ) ;
}
if ( codcf > 0 )
{
clifo . put ( CLI_TIPOCF , tipocf ) ;
clifo . put ( CLI_CODCF , codcf ) ;
if ( clifo . read ( _isequal ) ! = NOERR )
{
clifo . zero ( ) ;
clifo . put ( CLI_TIPOCF , tipocf ) ;
clifo . put ( CLI_CODCF , codcf ) ;
}
}
else
{
codcf = 1L ;
if ( tipocf = = ' F ' )
{
if ( clifo . last ( ) = = NOERR & & clifo . get_char ( CLI_TIPOCF ) = = ' F ' )
codcf + = clifo . get_long ( CLI_CODCF ) ;
}
else
{
clifo . put ( CLI_TIPOCF , ' F ' ) ;
clifo . put ( CLI_CODCF , 0 ) ;
if ( clifo . read ( _isgteq ) = = NOERR )
{
if ( clifo . prev ( ) = = NOERR & & clifo . get_char ( CLI_TIPOCF ) = = ' C ' )
codcf + = clifo . get_long ( CLI_CODCF ) ;
}
}
clifo . zero ( ) ;
clifo . put ( CLI_TIPOCF , tipocf ) ;
clifo . put ( CLI_CODCF , codcf ) ;
clifo . write ( ) ;
TLocalisamfile cfv ( LF_CFVEN ) ;
cfv . put ( CFV_TIPOCF , tipocf ) ;
cfv . put ( CFV_CODCF , codcf ) ;
TString8 codprcf ; codprcf . format ( " C%06ld%c " , codcf , tipocf ) ;
cfv . put ( CFV_CODPRCF , codprcf ) ;
cfv . write ( ) ;
}
clifo . put ( CLI_RAGSOC , odbc . get ( " RagSoc " ) . as_string ( ) ) ;
const int tipo = odbc . get ( " Tipo " ) . as_int ( ) ; // 1=Fisica; 2=Giuridica; 3=Altro
if ( tipo = = 1 )
{
clifo . put ( CLI_SESSO , odbc . get ( " Sesso " ) . as_string ( ) ) ;
clifo . put ( CLI_DATANASC , odbc . get ( " DTNascita " ) . as_date ( ) ) ;
clifo . put ( CLI_COMNASC , comune ( odbc , " " , " ComuneNascita " ) ) ;
clifo . put ( CLI_TIPOPERS , ' F ' ) ;
}
else
clifo . put ( CLI_TIPOPERS , ' G ' ) ;
TToken_string indirizzo ( odbc . get ( " Indirizzo " ) . as_string ( ) , ' , ' ) ;
TString ind = indirizzo . get ( 0 ) ;
TString civ = indirizzo . get ( ) ;
TString loc = indirizzo . get ( ) ;
if ( civ . len ( ) > 10 )
{
if ( loc . full ( ) )
ind < < ' ' < < civ ;
else
loc = civ ;
civ . cut ( 0 ) ;
}
clifo . put ( CLI_INDCF , ind . left ( 50 ) ) ;
split_phone ( odbc , " Telefono " , clifo , CLI_PTEL , CLI_TEL ) ;
split_phone ( odbc , " Cellulare " , clifo , CLI_PTEL2 , CLI_TEL2 ) ;
split_phone ( odbc , " CellulareSMS " , clifo , CLI_PTEL3 , CLI_TEL3 ) ;
clifo . put ( CLI_MAIL , odbc . get ( " EMail " ) . as_string ( ) ) ;
clifo . put ( CLI_UTENTE , " BEESTORE " ) ;
TDate dua = odbc . get ( BS_DTULTAGG ) . as_date ( ) ;
if ( ! dua . ok ( ) ) dua = TDate ( TODAY ) ;
clifo . put ( CLI_DATAAGG , dua ) ;
clifo . rewrite ( ) ;
if ( ! pi . add_status ( ) )
break ;
}
}
void TBeeStore_sync : : save_clifo ( int cfmask , const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " Cod_PK| " CLI_CODCF ) ;
fields . add ( " RagSoc| " CLI_RAGSOC ) ;
fields . add ( " Cognome| " CLI_RAGSOC ) ;
fields . add ( " Nome| " CLI_RAGSOC ) ;
fields . add ( " Indirizzo| " CLI_INDCF ) ;
fields . add ( " Citta| " CLI_COMCF ) ;
fields . add ( " Cap| " CLI_CAPCF ) ;
fields . add ( " Provincia| " ) ;
fields . add ( " Telefono|PTEL+TEL " ) ;
fields . add ( " Cellulare|PTEL2+TEL2 " ) ;
fields . add ( " CellulareSMS|PTEL3+TEL3 " ) ;
fields . add ( " EMail| " CLI_MAIL ) ;
fields . add ( " PartitaIva| " CLI_PAIV ) ;
fields . add ( " CodFiscale| " CLI_COFI ) ;
fields . add ( " Tipo|1 " ) ;
fields . add ( " Sesso| " CLI_SESSO ) ;
fields . add ( " DTNascita| " CLI_DATANASC ) ;
fields . add ( " ComuneNascita| " CLI_COMNASC ) ;
fields . add ( " PVNascita| " ) ;
fields . add ( " Cliente| " ) ;
fields . add ( " Fornitore| " ) ;
fields . add ( " For_CodFor| " CLI_CODCF ) ;
fields . add ( " For_Blocco| " CLI_SOSPESO ) ;
fields . add ( " Cli_CodCG| " CLI_CODCF ) ;
fields . add ( " Cli_Blocco| " CLI_SOSPESO ) ;
fields . add ( " MagInserAnagrafica|1 " ) ;
fields . add ( " CodStato| " CLI_STATOCF ) ;
fields . add ( " Annullato|0 " ) ;
TString query = build_query ( LF_CLIFO , dal , al ) ;
query < < " \n JOIN " < < LF_CFVEN < < " INTO TIPOCF==TIPOCF CODCF==CODCF " ;
if ( cfmask = = 1 )
query < < " \n FROM TIPOCF=C \n TO TIPOCF=C " ; else
if ( cfmask = = 2 )
query < < " \n FROM TIPOCF=F \n TO TIPOCF=F " ;
TISAM_recordset clifo ( query ) ;
save_origine_2 ( clifo , " tieAnagCFP " , fields , ClifoEvaluator ) ;
}
void TBeeStore_sync : : sync_clifo ( int cfmask , const TDate & dal , const TDate & al )
{
if ( cfmask & 1 ) load_clifo ( ' C ' ) ;
if ( cfmask & 2 ) load_clifo ( ' F ' ) ;
TString str ( 255 ) ;
TODBC_recordset clifo ( str ) ;
2017-11-09 08:56:30 +00:00
clifo . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
str < < " DELETE FROM tieAnagCFP WHERE Origine=1; " ;
clifo . exec ( str ) ; // Elimina tutte le anagrafiche importate da BeeStore
save_clifo ( cfmask , dal , al ) ;
}
2017-08-28 15:39:35 +00:00
bool TBeeStore_sync : : save_and_delete_movmag ( TMov_mag * & doc ) const
2016-09-09 13:58:28 +00:00
{
int err = 0 ;
if ( doc ! = NULL )
{
if ( doc - > rows ( ) > 0 )
{
TLocalisamfile mm ( LF_MOVMAG ) ;
err = doc - > write ( mm ) ;
if ( err ! = NOERR )
{
TString msg ;
msg . format ( FR ( " Errore %d in registrazione scontrino %ld del %s " ) , err ,
doc - > get_long ( MOVMAG_NUMREG ) , ( const char * ) doc - > get ( MOVMAG_DATAREG ) ) ;
_log - > log ( 2 , msg ) ;
msg < < TR ( " \n Si desidera proseguire ugualmente? " ) ;
if ( noyes_box ( msg ) )
err = 0 ;
}
}
delete doc ;
doc = NULL ;
}
return err = = 0 ;
}
2017-08-28 15:39:35 +00:00
bool TBeeStore_sync : : save_and_delete_doc ( TDocumento * & doc ) const
{
int err = 0 ;
if ( doc ! = NULL )
{
if ( doc - > rows ( ) > 0 )
{
err = doc - > write ( ) ;
if ( err ! = NOERR )
{
TString msg ;
msg . format ( FR ( " Errore %d in registrazione dcoumento %s/%ld del %s " ) , err ,
( const char * ) doc - > get ( DOC_CODNUM ) , doc - > get_long ( DOC_NDOC ) , ( const char * ) doc - > get ( DOC_DATADOC ) ) ;
_log - > log ( 2 , msg ) ;
msg < < TR ( " \n Si desidera proseguire ugualmente? " ) ;
if ( noyes_box ( msg ) )
err = 0 ;
}
}
delete doc ;
doc = NULL ;
}
return err = = 0 ;
}
2016-09-09 13:58:28 +00:00
void TBeeStore_sync : : sync_val ( const TDate & dal , const TDate & al )
{
TString_array fields ;
fields . add ( " CodValuta|CODTAB " ) ;
fields . add ( " DSValuta|S0 " ) ;
fields . add ( " Simbolo|CODTAB " ) ;
sync_table ( " %VAL " , " tieValute " , fields , dal , al ) ;
}
void TBeeStore_sync : : sync_listino ( const TString & listino )
{
TString str ( 255 ) ;
TODBC_recordset prz ( str ) ;
2017-11-09 08:56:30 +00:00
prz . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
str = " DELETE FROM tiePrzVendita WHERE Origine=1 " ;
prz . exec ( str ) ; // Ignora tutti i listini di BeeStore
str . cut ( 0 ) < < " USE " < < LF_RCONDV < < " SELECT " < < LF_ANAMAG < < " .CODART!= \" \" "
< < " \n JOIN " < < LF_ANAMAG < < " INTO CODART==CODRIGA "
< < " \n FROM TIPO=L TIPORIGA=A COD= " < < listino
< < " \n TO TIPO=L TIPORIGA=A COD= " < < listino ;
TISAM_recordset lis ( str ) ;
if ( lis . move_first ( ) )
{
TString16 eur ; eur < < " CodValuta|' " < < TCurrency : : get_euro_val ( ) < < " ' " ;
TString16 key ; key < < " L|||| " < < listino ;
const TRectype & condv = cache ( ) . get ( LF_CONDV , key ) ;
TDate dt_inizio = condv . get ( CONDV_VALIN ) ;
if ( ! dt_inizio . ok ( ) ) dt_inizio = TDate ( 1 , 1 , 2000 ) ;
TDate dt_fine = condv . get ( CONDV_VALFIN ) ;
if ( dt_fine < dt_inizio ) dt_fine = TDate ( 31 , 12 , 2100 ) ;
TString descr ; descr < < " DSListino|' " < < condv . get ( CONDV_DESCR ) < < ' \' ' ;
TString dtini ; dtini < < " DTInizio|' " < < dt_inizio . string ( ) < < ' \' ' ;
TString dtfin ; dtfin < < " DTFine|' " < < dt_fine . string ( ) < < ' \' ' ;
TString_array fields ;
fields . add ( " Cod_PK| " RCONDV_CODRIGA ) ;
fields . add ( " CodPadre| " RCONDV_CODRIGA ) ;
//fields.add("CodArticolo|"RCONDV_CODRIGA); // NON metterlo!
fields . add ( " TipoPrezzo|'1' " ) ; // 1=Listino
fields . add ( eur ) ;
fields . add ( " Prezzo| " RCONDV_PREZZO ) ;
fields . add ( " Prezzo2|0 " ) ;
fields . add ( " Sconto| " RCONDV_SCONTO ) ;
if ( real : : is_natural ( listino ) )
fields . add ( " NumListino| " RCONDV_COD ) ;
fields . add ( descr ) ;
fields . add ( dtini ) ;
fields . add ( dtfin ) ;
save_origine_2 ( lis , " tiePrzVendita " , fields ) ;
}
}
2017-08-28 15:39:35 +00:00
void TBeeStore_sync : : sync_mov ( int tipotestata , const TDate & dal , const TDate & al )
2016-09-09 13:58:28 +00:00
{
2017-08-28 15:39:35 +00:00
const TString8 codcaus = ini_get_string ( CONFIG_DITTA , " bs " , MOVMAG_CODCAUS , " " , tipotestata ) ;
if ( codcaus . blank ( ) )
2016-09-09 13:58:28 +00:00
{
_log - > log ( 2 , " Configurare parametri per movimenti Bee Store " ) ;
return ;
}
TString str ( 255 ) ;
2017-08-28 15:39:35 +00:00
str < < " SELECT * FROM tieDMovMag WHERE Origine=1 AND TipoTestata= " < < tipotestata ;
2016-09-09 13:58:28 +00:00
if ( dal . ok ( ) | | al . ok ( ) )
{
str < < " AND DataMov " ;
if ( dal . ok ( ) & & al . ok ( ) )
str < < " BETWEEN " < < date2sql ( dal ) < < " AND " < < date2sql ( al ) ;
else
{
if ( dal . ok ( ) )
str < < " >= " < < date2sql ( dal ) ;
else
str < < " <= " < < date2sql ( al ) ;
}
}
str < < " \n ORDER BY NumMov,NumRiga " ;
TODBC_recordset mov ( str ) ;
2017-11-09 08:56:30 +00:00
mov . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
TProgress_monitor pi ( mov . items ( ) , str ) ;
TString num_mov , nm ;
TMov_mag * doc = NULL ;
for ( bool ok = mov . move_first ( ) ; ok ; ok = mov . move_next ( ) )
{
nm = mov . get ( " NumMov " ) . as_string ( ) ;
if ( nm ! = num_mov )
{
2017-08-28 15:39:35 +00:00
if ( ! save_and_delete_movmag ( doc ) )
2016-09-09 13:58:28 +00:00
break ;
num_mov = nm ;
const TDate datadoc = mov . get ( " DataMov " ) . as_date ( ) ;
doc = new TMov_mag ;
doc - > put ( MOVMAG_CODCAUS , codcaus ) ;
doc - > put ( MOVMAG_DATAREG , datadoc ) ;
}
TRectype & rdoc = doc - > new_row ( ) ;
rdoc . put ( RMOVMAG_CODART , mov . get ( " CodArticolo " ) . as_string ( ) ) ;
rdoc . put ( RMOVMAG_UM , mov . get ( " CodUntMis " ) . as_string ( ) ) ;
rdoc . put ( RMOVMAG_PREZZO , mov . get ( " PrzCassaValuta " ) . as_real ( ) ) ;
if ( ! pi . add_status ( ) )
break ;
}
2017-08-28 15:39:35 +00:00
save_and_delete_movmag ( doc ) ; // Salva ultimo documento in sospeso
2016-09-09 13:58:28 +00:00
}
void TBeeStore_sync : : add_rmov ( TMovimentoPN & mov , const real & importo , const TCausale & caus , const char * cod_da ) const
{
if ( ! importo . is_zero ( ) )
{
TRectype & rmov = mov . cg ( - 1 ) ;
rmov . put ( RMV_SEZIONE , caus . sezione_clifo ( ) ) ;
rmov . put ( RMV_IMPORTO , importo ) ;
int i = caus . last ( ) ;
for ( ; i > 15 ; i - - )
{
const char * cod = caus . cod_desc_agg ( i ) ;
if ( xvt_str_same ( cod , cod_da ) )
break ;
}
TBill zio1 ; caus . bill ( 1 , zio1 ) ;
TBill zio2 ; caus . bill ( i , zio2 ) ;
zio2 . put ( rmov ) ;
zio1 . put ( rmov , true ) ;
}
}
2017-08-28 15:39:35 +00:00
void TBeeStore_sync : : sync_doc ( const TDate & dal , const TDate & al )
{
const TString8 codcausdef = ini_get_string ( CONFIG_DITTA , " bs " , MOVMAG_CODCAUS , " " , 2 ) ;
if ( codcausdef . blank ( ) )
{
_log - > log ( 2 , " Configurare parametri per movimenti Bee Store " ) ;
return ;
}
TString str ( 255 ) ;
str < < " SELECT tieDMovMag.*,tieTBolFat.* FROM tieDMovMag,tieTBolFat WHERE tieDMovMag.Origine=1 AND tieDMovMag.TipoTestata=2 AND tieDMovMag.CodTestata=tieTBolFat.Cod_PK " ; // verificare
if ( dal . ok ( ) | | al . ok ( ) )
{
str < < " AND DataMov " ;
if ( dal . ok ( ) & & al . ok ( ) )
str < < " BETWEEN " < < date2sql ( dal ) < < " AND " < < date2sql ( al ) ;
else
{
if ( dal . ok ( ) )
str < < " >= " < < date2sql ( dal ) ;
else
str < < " <= " < < date2sql ( al ) ;
}
}
str < < " \n ORDER BY NumMov,NumRiga " ;
TODBC_recordset docs ( str ) ;
2017-11-09 08:56:30 +00:00
docs . connect ( _dsn , _usr , _psw ) ;
2017-08-28 15:39:35 +00:00
TProgress_monitor pi ( docs . items ( ) , str ) ;
long num_doc = - 1 , nd , codcf ;
TString4 tipocf ;
TDocumento * doc = NULL ;
for ( bool ok = docs . move_first ( ) ; ok ; ok = docs . move_next ( ) )
{
TToken_string test ( docs . get ( " CodTestata " ) . as_string ( ) , ' \\ ' ) ;
nd = atol ( test . get ( ) ) ;
TString wrk = docs . get ( " CodCliente " ) . as_string ( ) ;
while ( wrk [ 0 ] > = ' A ' )
wrk . ltrim ( 1 ) ;
codcf = atol ( wrk ) ;
tipocf = docs . get ( " TipoIntestatario " ) . as_string ( ) ;
if ( tipocf ! = " C " ) // verificare
tipocf = " F " ;
if ( nd ! = num_doc )
{
if ( num_doc > 0 & & ! save_and_delete_doc ( doc ) )
break ;
num_doc = nd ;
const TDate datadoc = docs . get ( " DataMov " ) . as_date ( ) ;
TString8 numdoc = docs . get ( " TipoDocCE " ) . as_string ( ) ;
TString8 tipodoc = docs . get ( " TipoDocCE " ) . as_string ( ) ;
TTipo_documento tipo ( tipodoc ) ;
const TString8 codcaus = tipo . caus_mov ( ) . blank ( ) ? codcausdef : tipo . caus_mov ( ) ;
doc = new TDocumento ( ) ;
doc - > put ( DOC_ANNO , datadoc . year ( ) ) ;
doc - > put ( DOC_DATADOC , datadoc ) ;
doc - > put ( DOC_NDOC , nd ) ;
doc - > put ( DOC_PROVV , " D " ) ;
doc - > put ( DOC_CODNUM , numdoc ) ;
doc - > put ( DOC_TIPODOC , tipodoc ) ;
doc - > put ( DOC_TIPOCF , tipocf ) ;
doc - > put ( DOC_CODCF , codcf ) ;
doc - > cli2doc ( ) ;
const TString8 codval = docs . get ( " CodValuta " ) . as_string ( ) ;
const real cambio = docs . get ( " CambioValuta " ) . as_real ( ) ;
const TString asp = docs . get ( " AspettoBeni " ) . as_string ( ) ;
const int ncolli = docs . get ( " NumeroColli " ) . as_int ( ) ;
doc - > put ( DOC_CODVAL , codval ) ;
doc - > put ( DOC_CAMBIO , cambio ) ;
doc - > put ( DOC_ASPBENI1 , asp . sleft ( 50 ) ) ;
doc - > put ( DOC_ASPBENI2 , asp . smid ( 50 ) ) ;
doc - > put ( DOC_NCOLLI , ncolli ) ;
doc - > put ( DOC_CAUSMAG , codcaus ) ;
}
const int tipoart = docs . get ( " TipoArticolo " ) . as_int ( ) ;
TString4 tiporiga = tipoart = = 2 ? " 04 " : " 02 " ;
TRectype & rdoc = doc - > new_row ( " 01 " ) ;
const TString80 codart = docs . get ( " CodArticolo " ) . as_string ( ) ;
rdoc . put ( RDOC_CODART , codart ) ;
if ( tipoart = = 2 )
{
if ( cache ( ) . get ( " SPP " , codart ) . not_empty ( ) )
rdoc . put ( RDOC_CODARTMAG , codart ) ;
}
else
{
if ( cache ( ) . get ( LF_ANAMAG , codart ) . not_empty ( ) )
rdoc . put ( RDOC_CODARTMAG , codart ) ;
}
rdoc . put ( RDOC_CODARTMAG , codart ) ;
// rdoc.check_row();
const TString descr = docs . get ( " DSRiga " ) . as_string ( ) ;
rdoc . put ( RDOC_DESCR , descr . sleft ( 50 ) ) ;
if ( descr . len ( ) > 50 )
{
rdoc . put ( RDOC_DESCLUNGA , " X " ) ;
rdoc . put ( RDOC_DESCEST , descr . smid ( 50 ) ) ;
}
rdoc . put ( RDOC_CODMAG , docs . get ( " CodMagazzino " ) . as_string ( ) . left ( 5 ) ) ;
rdoc . put ( RDOC_CODMAGC , docs . get ( " CodMagazDest " ) . as_string ( ) . left ( 5 ) ) ;
rdoc . put ( RDOC_UMQTA , docs . get ( " CodUntMis " ) . as_string ( ) ) ;
rdoc . put ( RDOC_QTA , docs . get ( " Quantita " ) . as_real ( ) ) ;
rdoc . put ( RDOC_PREZZO , docs . get ( " PrzNettoSede " ) . as_real ( ) ) ; // o PrzNettoValuta ??
real valsconto1 ( docs . get ( " Sconto1 " ) . as_real ( ) ) ;
real valsconto2 ( docs . get ( " Sconto2 " ) . as_real ( ) ) ;
real valsconto3 ( docs . get ( " Sconto3 " ) . as_real ( ) ) ;
TString80 sconto ;
if ( valsconto1 ! = ZERO )
sconto < < valsconto1 . stringa ( 6 , 2 ) ;
if ( valsconto2 ! = ZERO )
{
if ( sconto . full ( ) )
sconto < < " + " ;
sconto < < valsconto2 . stringa ( 6 , 2 ) ;
}
if ( valsconto3 ! = ZERO )
{
if ( sconto . full ( ) )
sconto < < " + " ;
sconto < < valsconto3 . stringa ( 6 , 2 ) ;
}
rdoc . put ( RDOC_SCONTO , sconto ) ;
rdoc . put ( RDOC_CODIVA , docs . get ( " CodIva " ) . as_string ( ) ) ;
if ( ! pi . add_status ( ) )
break ;
}
save_and_delete_doc ( doc ) ; // Salva ultimo documento in sospeso
}
2016-09-09 13:58:28 +00:00
void TBeeStore_sync : : sync_corrisp ( const TDate & , const TDate & )
{
const TString8 codcaus = ini_get_string ( CONFIG_DITTA , " bs " , " CODCAUSC " ) ;
if ( codcaus . blank ( ) )
{
_log - > log ( 2 , " Configurare la causale corrispettivi Bee Store " ) ;
return ;
}
TString str ( 255 ) ;
str < < " SELECT * FROM tieCorrispettivi WHERE Origine=1 " ;
str < < " \n ORDER BY DataCorr,CodCorrispettivo " ;
TODBC_recordset corr ( str ) ;
2017-11-09 08:56:30 +00:00
corr . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
TProgress_monitor pi ( corr . items ( ) , str ) ;
TString num_mov , nm ;
TMov_mag * doc = NULL ;
TMovimentoPN mov ;
mov . read ( _islast ) ;
long numreg = mov . curr ( ) . get_long ( MOV_NUMREG ) + 1 ;
for ( bool ok = corr . move_first ( ) ; ok ; ok = corr . move_next ( ) )
{
TRectype & mrec = mov . curr ( ) ;
mov . destroy_rows ( numreg ) ;
const TDate datareg = corr . get ( " DataCorr " ) . as_date ( ) ;
mrec . put ( MOV_NUMREG , numreg ) ;
mrec . put ( MOV_DATAREG , datareg ) ;
mrec . put ( MOV_ANNOIVA , datareg . year ( ) ) ;
mrec . put ( MOV_DATADOC , datareg ) ;
TString80 desc ; desc . format ( FR ( " Corrispettivi %s " ) , datareg . stringa ( ) ) ;
mrec . put ( MOV_DESCR , desc ) ;
TEsercizi_contabili esc ;
mrec . put ( MOV_DATACOMP , datareg ) ;
mrec . put ( MOV_ANNOES , esc . date2esc ( datareg ) ) ;
const TCausale caus ( codcaus , datareg . year ( ) ) ;
mrec . put ( MOV_CODCAUS , codcaus ) ;
mrec . put ( MOV_REG , caus . reg ( ) . name ( ) ) ;
const real totdoc = corr . get ( " Valore " ) . as_real ( ) ;
mrec . put ( MOV_TOTDOC , totdoc ) ;
str < < " SELECT * FROM tieDCorrispettivi WHERE (Origine=1) " ;
str < < " AND(CodCorrispettivo=' " < < corr . get ( " CodCorrispettivo " ) < < " ') " ;
TODBC_recordset dett ( str ) ;
2017-11-09 08:56:30 +00:00
dett . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
TBill zio1 ; caus . bill ( 1 , zio1 ) ;
TBill zio2 ; caus . bill ( 2 , zio2 ) ;
TBill zio3 ; caus . bill ( 3 , zio3 ) ;
int nriga = 0 ;
real imponibile , imposta ;
for ( bool dok = dett . move_first ( ) ; dok ; dok = dett . move_next ( ) )
{
const real imp = dett . get ( " ImportoReparto " ) . as_real ( ) ;
const real iva = dett . get ( " ImportoIva " ) . as_real ( ) ;
TRectype & irec = mov . iva ( nriga + + ) ;
irec . put ( RMI_IMPONIBILE , imp ) ;
irec . put ( RMI_CODIVA , dett . get ( " CodIva " ) . as_string ( ) ) ;
irec . put ( RMI_IMPOSTA , iva ) ;
zio2 . put ( irec ) ;
imponibile + = imp ;
imposta + = iva ;
}
const char sez1 = caus . sezione_clifo ( ) ;
TRectype & r1 = mov . cg ( 0 ) ;
r1 . put ( RMV_SEZIONE , sez1 ) ;
r1 . put ( RMV_IMPORTO , totdoc ) ;
zio1 . put ( r1 ) ;
zio2 . put ( r1 , true ) ;
r1 . put ( RMV_ROWTYPE , ' T ' ) ;
const char sez2 = sez1 = = ' D ' ? ' A ' : ' D ' ;
TRectype & r2 = mov . cg ( 1 ) ;
r2 . put ( RMV_SEZIONE , sez2 ) ;
r2 . put ( RMV_IMPORTO , imponibile ) ;
zio2 . put ( r2 ) ;
zio1 . put ( r2 , true ) ;
r2 . put ( RMV_ROWTYPE , ' I ' ) ;
TRectype & r3 = mov . cg ( 2 ) ;
r3 . put ( RMV_SEZIONE , sez2 ) ;
r3 . put ( RMV_IMPORTO , imposta ) ;
zio3 . put ( r3 ) ;
zio1 . put ( r3 , true ) ;
r3 . put ( RMV_ROWTYPE , ' D ' ) ;
TRectype & r4 = mov . cg ( 3 ) ;
r4 . put ( RMV_SEZIONE , sez2 ) ;
r4 . put ( RMV_IMPORTO , totdoc ) ;
zio1 . put ( r4 ) ;
zio1 . put ( r4 , true ) ;
const real contanti = corr . get ( " IncContanti " ) . as_real ( ) ;
const real bancomat = corr . get ( " IncBancomat " ) . as_real ( ) ;
const real credcard = corr . get ( " IncCarteCredito " ) . as_real ( ) ;
const real assegni = corr . get ( " IncAssegni " ) . as_real ( ) ;
real altro = corr . get ( " IncFinanziato " ) . as_real ( ) ;
altro + = corr . get ( " IncCrediti " ) . as_real ( ) ;
altro + = corr . get ( " IncBonifici " ) . as_real ( ) ;
altro + = corr . get ( " IncAltro " ) . as_real ( ) ;
add_rmov ( mov , contanti , caus , " BEECN " ) ;
add_rmov ( mov , bancomat , caus , " BEEBM " ) ;
add_rmov ( mov , credcard , caus , " BEECC " ) ;
add_rmov ( mov , assegni , caus , " BEEAS " ) ;
add_rmov ( mov , altro , caus , " BEEAL " ) ;
while ( mov . write ( ) = = _isreinsert )
mrec . put ( MOV_NUMREG , numreg + + ) ;
if ( ! pi . add_status ( ) )
break ;
}
if ( ! pi . is_cancelled ( ) )
{
TString str ( 255 ) ;
TODBC_recordset sco ( str ) ;
2017-11-09 08:56:30 +00:00
sco . connect ( _dsn , _usr , _psw ) ;
2016-09-09 13:58:28 +00:00
str = " DELETE FROM tieCorrispettivi WHERE Origine=1 " ;
sco . exec ( str ) ;
str = " DELETE FROM tieDCorrispettivi WHERE Origine=1 " ;
sco . exec ( str ) ;
}
}
2017-08-28 15:39:35 +00:00
2016-09-09 13:58:28 +00:00
bool TBeeStore_sync : : create ( )
{
_dsn = ini_get_string ( CONFIG_DITTA , " bs " , " DSN " , " BEESTORE " ) ;
_sqlog = ini_get_string ( CONFIG_DITTA , " bs " , " Log " , " " ) ;
2017-11-09 08:56:30 +00:00
_usr = ini_get_string ( CONFIG_DITTA , " bs " , " USR " , " BEESTORE " ) ;
_psw = decode ( ini_get_string ( CONFIG_DITTA , " bs " , " PSW " , " BEESTORE " ) ) ;
2016-09-09 13:58:28 +00:00
if ( _dsn . full ( ) )
{
TProgress_monitor ti ( 1 , TR ( " Connessione a SQL Server " ) , false ) ;
2017-11-09 08:56:30 +00:00
TString query ; query < < " SELECT * FROM tieValute; " ; //"ODBC(" << _dsn << ")\nSELECT * FROM tieValute;";
2016-09-09 13:58:28 +00:00
TODBC_recordset recset ( query ) ;
2017-11-09 08:56:30 +00:00
recset . connect ( _dsn , _usr , _psw ) ; // Dovrebbe connettersi anche con solo _dsn valorizzato
2016-09-09 13:58:28 +00:00
recset . move_first ( ) ;
if ( _sqlog . full ( ) & & _sqlog . is_relative_path ( ) )
{
TFilename n ; n . tempdir ( ) ;
n . add ( _sqlog . name ( ) ) ;
_sqlog = n ;
}
recset . set_log_file ( _sqlog ) ;
return TSkeleton_application : : create ( ) ;
}
return error_box ( FR ( " Impossibile connettersi al DSN '%s' " ) , ( const char * ) _dsn ) ;
}
void TBeeStore_sync : : main_loop ( )
{
TBeeStore_mask mask ;
while ( mask . run ( ) = = K_ENTER )
{
mask . autosave ( ) ; // Rende definitivi tutti i paramentri in [bs]
_log = new TLog_report ;
const TDate dal = mask . get_date ( " SyncDateFrom " ) ;
const TDate al = mask . get_date ( " SyncDateTo " ) ;
if ( mask . get_bool ( " SyncUMS " ) )
sync_ums ( dal , al ) ;
if ( mask . get_bool ( " SyncIVA " ) )
sync_iva ( dal , al ) ;
if ( mask . get_bool ( " SyncLinee " ) )
sync_lines ( dal , al ) ;
if ( mask . get_bool ( " SyncCatMer " ) )
sync_catmer ( dal , al ) ;
if ( mask . get_bool ( " SyncAnamag " ) )
sync_anamag ( dal , al ) ;
if ( mask . get_bool ( " SyncBarCode " ) )
sync_barcode ( dal , al ) ;
if ( mask . get_bool ( " SyncVAL " ) )
sync_val ( dal , al ) ;
int cfmask = 0 ;
if ( mask . get_bool ( " SyncClienti " ) ) cfmask | = 1 ;
if ( mask . get_bool ( " SyncFornitori " ) ) cfmask | = 2 ;
if ( cfmask )
sync_clifo ( cfmask , dal , al ) ;
if ( mask . get ( " SyncListino " ) . full ( ) )
sync_listino ( mask . get ( " SyncListino " ) ) ;
2017-08-28 15:39:35 +00:00
if ( mask . get_bool ( " SyncScontr " ) )
2016-09-09 13:58:28 +00:00
sync_scontrini ( dal , al ) ;
if ( mask . get_bool ( " SyncCorr " ) )
sync_corrisp ( dal , al ) ;
2017-08-28 15:39:35 +00:00
if ( mask . get_bool ( " SyncDoc " ) )
sync_doc ( dal , al ) ;
if ( mask . get_bool ( " SyncCarScar " ) )
sync_carscar ( dal , al ) ;
if ( mask . get_bool ( " SyncGenerici " ) )
sync_generici ( dal , al ) ;
2016-09-09 13:58:28 +00:00
_log - > preview ( ) ;
delete _log ;
_log = NULL ;
}
}
int bs0200 ( int argc , char * argv [ ] )
{
TBeeStore_sync bss ;
bss . run ( argc , argv , TR ( " BeeStore Synchronizer " ) ) ;
return 0 ;
}