2017-05-02 07:49:23 +00:00
# include "tf0.h"
2017-07-10 14:20:56 +00:00
# include "tf0100b.h"
2017-06-23 13:30:54 +00:00
2017-07-24 09:50:05 +00:00
# include "cglib03.h" // is_split_payment()
2017-07-10 14:16:23 +00:00
/* Utilities & Main App */
2017-06-23 13:30:54 +00:00
2017-05-02 07:49:23 +00:00
/////////////////////////////////////////////////////////////////////////////////////
2017-06-23 13:30:54 +00:00
// Utilities
2017-05-02 07:49:23 +00:00
/////////////////////////////////////////////////////////////////////////////////////
2017-06-23 13:30:54 +00:00
// Le funzioni quelle belle
TString getTipoDoc ( int id )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
TString ret ;
switch ( id )
{
case B_TIPO_AUTOFATT :
ret = " AF " ;
break ;
case B_TIPO_FATTACQ :
ret = " FA " ;
break ;
case B_TIPO_FATTFISC :
ret = " FF " ;
break ;
2017-06-28 13:09:56 +00:00
2017-06-23 13:30:54 +00:00
case B_TIPO_FATTVEN :
ret = " FV " ;
break ;
case B_TIPO_NOTC :
ret = " NC " ;
break ;
case B_TIPO_NOTD :
ret = " ND " ;
break ;
2017-06-28 13:09:56 +00:00
case B_TIPO_STORDOC :
ret = " ST " ;
break ;
case B_TIPO_BOLLADOG :
ret = " BD " ;
break ;
2017-06-30 12:57:07 +00:00
/*
2017-06-28 13:09:56 +00:00
case B_TIPO_CORRNINC :
ret = " CN " ;
break ;
case B_TIPO_CORR :
ret = " CR " ;
break ;
case B_TIPO_FATTSC :
ret = " FS " ;
break ;
2017-06-23 13:30:54 +00:00
case B_TIPO_RICFIS :
ret = " RF " ;
break ;
2017-06-28 13:09:56 +00:00
2017-06-23 13:30:54 +00:00
case B_TIPO_RICFISNI :
ret = " RN " ;
break ;
case B_TIPO_SCONT :
ret = " SC " ;
break ;
case B_TIPO_SCONTNI :
ret = " SN " ;
break ;
2017-06-28 13:09:56 +00:00
*/
default :
ret = " ERR " ;
2017-06-23 13:30:54 +00:00
break ;
}
return ret ;
}
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
int getTipoDoc ( TString id )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
int ret = - 1 ;
if ( id = = " AF " ) ret = B_TIPO_AUTOFATT ;
2017-06-30 12:57:07 +00:00
else if ( id = = " BD " ) ret = B_TIPO_BOLLADOG ;
2017-06-28 13:09:56 +00:00
// else if(id == "CN") ret = B_TIPO_CORRNINC;
// else if(id == "CR") ret = B_TIPO_CORR;
2017-06-23 13:30:54 +00:00
else if ( id = = " FA " ) ret = B_TIPO_FATTACQ ;
else if ( id = = " FF " ) ret = B_TIPO_FATTFISC ;
2017-06-28 13:09:56 +00:00
// else if(id == "FS") ret = B_TIPO_FATTSC;
2017-06-23 13:30:54 +00:00
else if ( id = = " FV " ) ret = B_TIPO_FATTVEN ;
else if ( id = = " NC " ) ret = B_TIPO_NOTC ;
else if ( id = = " ND " ) ret = B_TIPO_NOTD ;
2017-06-28 13:09:56 +00:00
// else if(id == "RF") ret = B_TIPO_RICFIS;
// else if(id == "RN") ret = B_TIPO_RICFISNI;
// else if(id == "SC") ret = B_TIPO_SCONT;
// else if(id == "SN") ret = B_TIPO_SCONTNI;
2017-06-23 13:30:54 +00:00
else if ( id = = " ST " ) ret = B_TIPO_STORDOC ;
return ret ;
}
2017-05-02 07:49:23 +00:00
// Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h)
static SLIST_ELT xvt_slist_find_str ( SLIST list , const char * str )
{
SLIST_ELT e = NULL ;
for ( e = xvt_slist_get_first ( list ) ; e ; e = xvt_slist_get_next ( list , e ) )
{
const char * val = xvt_slist_get ( list , e , NULL ) ;
if ( xvt_str_compare_ignoring_case ( str , val ) = = 0 )
break ;
}
return e ;
}
2017-07-13 12:27:06 +00:00
// Aggiorna il file dst se pi<70> vecchio di src (Potrebbe diventare una funzione di XVT.h)
bool xvt_fsys_fupdate ( const char * src , const char * dst )
{
bool ok = false ;
if ( xvt_fsys_file_exists ( src ) )
{
const long tsrc = xvt_fsys_file_attr ( src , XVT_FILE_ATTR_MTIME ) ;
if ( tsrc > 0 )
{
long tdst = 0 ;
if ( xvt_fsys_file_exists ( dst ) )
tdst = xvt_fsys_file_attr ( dst , XVT_FILE_ATTR_MTIME ) ;
if ( tsrc > tdst )
ok = xvt_fsys_fcopy ( src , dst ) ! = 0 ;
}
}
return ok ;
}
2017-06-23 13:30:54 +00:00
/* Ritorno il tipo di documento
* TD01 : Fattura
* TD04 : Nota di credito
* TD05 : Nota di debito
* NO - > TD07 : Fattura semplificata
* NO - > TD08 : NC semplificata
* TD10 : Fatt di acquisto intra beni
* TD11 : Fatt di acquisto intra servizi
*/
2017-07-10 14:16:23 +00:00
const char * decodTipo ( TToken_string * strarr )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
TRectype mov = cache ( ) . get ( LF_MOV , strarr - > get ( _numero ) ) ;
TCausale caus ( mov . get ( " CODCAUS " ) , mov . get_int ( " ANNOIVA " ) ) ;
2017-06-28 13:09:56 +00:00
TString tipodoc ; tipodoc < < strarr - > get ( _codnum ) ;
2017-06-30 12:57:07 +00:00
// Le autofatture possono essere solo di tipo TDO1 e le bolle doganali nel dubbio pure
if ( tipodoc = = " AF " | | tipodoc = = " BD " )
2017-06-28 13:09:56 +00:00
return " TD01 " ;
else if ( tipodoc = = " FA " | | tipodoc = = " FV " )
2017-06-23 13:30:54 +00:00
{
// Potrebbe essere normale o intra
if ( ! caus . intra ( ) )
return " TD01 " ;
else
{
// Controlliamo se <20> di beni o servizi
// Per capire se sono beni o servizi devo prendere il movimento, e trovare quale dei due ha un importo pi<70> alto
TAssoc_array intraval ;
TRelation r_moviva ( LF_RMOVIVA ) ;
TRectype filter ( r_moviva . curr ( ) ) ; filter . put ( " NUMREG " , strarr - > get ( _numero ) ) ;
TCursor c_moviva ( & r_moviva , " " , 1 , & filter , & filter ) ;
for ( c_moviva = 0 ; c_moviva . pos ( ) < c_moviva . items ( ) ; + + c_moviva )
{
TRectype row = c_moviva . curr ( ) ;
real importo = row . get_real ( " IMPONIBILE " ) ;
// La chiave deve essere formata da CODIVA, GRUPPO + CONTO + SOTTOCONTO
TString keyAssoc ; keyAssoc < < row . get ( " CODIVA " ) < < " | " < < row . get ( " GRUPPO " ) < < " | " < < row . get ( " CONTO " ) < < " | " < < row . get ( " SOTTOCONTO " ) ;
if ( intraval . is_key ( keyAssoc ) )
{
importo + = * ( real * ) intraval . objptr ( keyAssoc ) ;
intraval . add ( keyAssoc , importo , true ) ;
}
else
{
intraval . add ( keyAssoc , importo ) ;
}
}
// Adesso che ho tutti i totali divisi per CODIVA e GCS vado a pescare il valore maggiore
TString keyMax = " " ;
real max = ZERO ;
TString_array keys ;
intraval . get_keys ( keys ) ;
for ( int i = 0 ; i < keys . items ( ) ; i + + )
{
TString key = * ( TString * ) keys . objptr ( i ) ;
real valItem = * ( real * ) intraval . objptr ( key ) ;
if ( valItem > max )
{
keyMax = key ;
max = valItem ;
}
}
// Una volta che ho trovato il nostro vincitore vado a prendere il tipo di fattura dal GCS
TString keyPCon = keyMax . ssub ( keyMax . find ( ' | ' ) + 1 ) ;
if ( cache ( ) . get ( LF_PCON , keyPCon , " RICSER " ) = = " 1 " )
return " TD11 " ;
else
return " TD10 " ;
}
}
2017-06-28 13:09:56 +00:00
else if ( tipodoc = = " NC " )
return " TD04 " ;
else if ( tipodoc = = " ND " )
return " TD05 " ;
2017-07-24 09:50:05 +00:00
else if ( tipodoc = = " ST " )
2017-07-20 14:39:52 +00:00
{
// Devo capire a che documento <20> associato
2017-07-24 09:50:05 +00:00
TRelation r ( LF_RMOV ) ;
TRectype filter ( r . curr ( ) ) ;
2017-07-20 14:39:52 +00:00
filter . put ( " NUMREG " , strarr - > get ( _numero ) ) ;
TCursor c ( & r , " " , 1 , & filter , & filter ) ;
for ( c = 0 ; c . pos ( ) < c . items ( ) ; + + c )
{
TRectype r = c . curr ( ) ;
2017-07-24 09:50:05 +00:00
if ( r . get ( " TIPOC " ) = = " C " )
2017-07-20 14:39:52 +00:00
{
if ( r . get ( " SEZIONE " ) = = " D " )
return " TD01 " ;
else
return " TD04 " ;
} else
2017-07-24 09:50:05 +00:00
if ( r . get ( " TIPOC " ) = = " F " )
2017-07-20 14:39:52 +00:00
{
if ( r . get ( " SEZIONE " ) = = " A " )
return " TD01 " ;
else
return " TD04 " ;
}
}
}
// Nel caso ritorno un valore che da errore
return " ERR0 " ;
2017-05-02 07:49:23 +00:00
}
2017-06-23 13:30:54 +00:00
/* Salvo il record modificato in TFCustom */
bool saveRec ( TToken_string row , bool esportato )
2017-05-02 07:49:23 +00:00
{
2017-06-30 12:57:07 +00:00
static TLocalisamfile trasfatt ( LF_TRASFATT ) ;
2017-07-18 09:49:17 +00:00
TString key = row . get ( _numero ) ; key < < " | " < < row . get ( _aliquota ) ;
TRectype rCust = cache ( ) . get ( LF_TRASFATT , key ) ;
// Se la riga non esiste metto la chiave
2017-06-30 12:57:07 +00:00
if ( rCust . empty ( ) )
{
rCust . put ( " NUMREG " , row . get ( _numero ) ) ;
}
rCust . put ( " TIPO " , row . get ( _tipocf ) ) ;
rCust . put ( " CODCF " , row . get ( _codcf ) ) ;
rCust . put ( " OCCAS " , row . get ( _occas ) ) ;
rCust . put ( " TIPODOC " , row . get ( _codnum ) ) ;
rCust . put ( " NUMDOC " , row . get ( _numdoc ) ) ;
rCust . put ( " DATAREG " , row . get ( _datareg ) ) ;
rCust . put ( " DATADOC " , row . get ( _datadoc ) ) ;
rCust . put ( " IMPONIBILE " , row . get ( _imponibile ) ) ;
rCust . put ( " IMPOSTA " , row . get ( _importoIVA ) ) ;
rCust . put ( " CODIVA " , row . get ( _aliquota ) ) ;
rCust . put ( " AUTOFATT " , row . get ( _autofatt ) ) ;
if ( esportato )
{
2017-07-18 09:49:17 +00:00
TString invio = esportato ? " I " : row . get ( _invio ) ;
rCust . put ( " TFINVIO " , invio ) ;
2017-06-30 12:57:07 +00:00
rCust . put ( " TFDATA " , TDate ( TODAY ) ) ;
}
2017-06-23 13:30:54 +00:00
2017-06-30 12:57:07 +00:00
return rCust . write_rewrite ( trasfatt ) = = NOERR ;
2017-05-02 07:49:23 +00:00
}
2017-07-25 13:15:55 +00:00
inline const char * noSpecial ( char a )
2017-07-24 09:50:05 +00:00
{
if ( a = = ' <EFBFBD> ' )
2017-07-25 13:15:55 +00:00
return " a'' " ;
2017-07-24 09:50:05 +00:00
else if ( a = = ' <EFBFBD> ' | | a = = ' <EFBFBD> ' )
2017-07-25 13:15:55 +00:00
return " e'' " ;
2017-07-24 09:50:05 +00:00
else if ( a = = ' <EFBFBD> ' )
2017-07-25 13:15:55 +00:00
return " i'' " ;
2017-07-24 09:50:05 +00:00
else if ( a = = ' <EFBFBD> ' )
2017-07-25 13:15:55 +00:00
return " o'' " ;
else if ( a = = ' <EFBFBD> ' )
return " u'' " ;
// Se non trovo nulla lo tolgo
return " " ;
2017-07-24 09:50:05 +00:00
}
2017-07-26 14:58:22 +00:00
bool bd2017 ( )
{
static TDate today = TDate ( TODAY ) , lastDay = TDate ( 31 , 12 , 2017 ) ;
return today < = lastDay ;
}
2017-07-10 15:02:18 +00:00
/////////////////////////////////////////////////////////////////////////////////////
// TTrFa_record
/////////////////////////////////////////////////////////////////////////////////////
// Imposta il valore di un campo variant
void TTrFa_record : : set ( const char * fld , const TVariant & var )
{
CHECK ( fld & & * fld , " Null field name " ) ;
if ( var . is_null ( ) )
{
_fields . remove ( fld ) ;
}
else
{
TVariant * obj = ( TVariant * ) _fields . objptr ( fld ) ;
if ( obj ! = NULL )
* obj = var ;
else
_fields . add ( fld , new TVariant ( var ) ) ;
}
}
// Imposta il valore di un campo intero
void TTrFa_record : : set ( const char * fld , long val )
{
const TVariant var ( val ) ;
set ( fld , var ) ;
}
// Imposta il valore di un campo stringa
void TTrFa_record : : set ( const char * fld , const char * val )
{
if ( val = = NULL )
set ( fld , NULL_VARIANT ) ;
else
{
const TVariant var ( val ) ;
set ( fld , var ) ;
}
}
// Imposta il valore di un campo stringa
void TTrFa_record : : set ( const char * fld , const TString & val )
{
const TVariant var ( val ) ;
set ( fld , var ) ;
}
// Imposta il valore di un campo numerico
void TTrFa_record : : set ( const char * fld , const real & val )
{
const TVariant var ( val ) ;
set ( fld , var ) ;
}
// Imposta il valore di un campo data in formato ISO
void TTrFa_record : : set ( const char * fld , const TDate & val )
{
if ( val . ok ( ) )
{
const TVariant var ( val ) ;
set ( fld , var ) ;
}
else
set ( fld , " " ) ;
}
// Imposta il valore di un campo booleano
void TTrFa_record : : set ( const char * fld , bool var )
{
set ( fld , var ? " SI " : " NO " ) ;
}
// Legge il valore di un campo variant
const TVariant & TTrFa_record : : get ( const char * fld ) const
{
const TVariant * var = ( const TVariant * ) _fields . objptr ( fld ) ;
return var ? * var : NULL_VARIANT ;
}
// Converte un variant in una stringa valida per SQLite
const TString & TTrFa_record : : var2str ( const TString & fldname , const TVariant & var ) const
{
const TFieldtypes vt = var . type ( ) ;
if ( vt = = _realfld )
{
2017-07-24 15:19:20 +00:00
const real r = var . as_string ( ) ;
2017-07-10 15:02:18 +00:00
TString & tmp = get_tmp_string ( ) ;
2017-07-24 15:19:20 +00:00
tmp < < ' \' ' < < r . string ( ) < < ' \' ' ;
return tmp ;
2017-07-10 15:02:18 +00:00
}
if ( vt = = _datefld )
{
TString & tmp = get_tmp_string ( ) ;
tmp < < ' \' ' < < var . as_date ( ) . string ( full , ' - ' , full , full , amg_date ) < < ' \' ' ;
return tmp ;
}
const TString & str = var . as_string ( ) ;
bool apici = vt = = _alfafld ;
if ( apici & & str [ 0 ] ! = ' 0 ' & & real : : is_natural ( str ) )
apici = false ;
if ( ! apici )
return str ;
TString & tmp = get_tmp_string ( ) ;
2017-07-25 13:15:55 +00:00
TString & tmp2 = get_tmp_string ( ) ;
2017-07-10 15:02:18 +00:00
tmp = str ;
2017-07-25 13:15:55 +00:00
TString speciali = CARATTERI_SPECIALI ;
for ( int i = 0 ; i < speciali . len ( ) ; i + + )
2017-07-24 09:50:05 +00:00
{
2017-07-25 13:15:55 +00:00
for ( int a = str . rfind ( speciali [ i ] ) ; a > = 0 ; a - - )
2017-07-24 09:50:05 +00:00
{
2017-07-25 13:15:55 +00:00
if ( tmp [ a ] = = speciali [ i ] )
2017-07-24 09:50:05 +00:00
{
2017-07-25 13:15:55 +00:00
tmp2 . cut ( 0 ) < < tmp . left ( a ) < < noSpecial ( speciali [ i ] ) < < tmp . mid ( a + 1 ) ;
tmp = tmp2 ;
2017-07-24 09:50:05 +00:00
}
}
}
2017-07-10 15:02:18 +00:00
for ( int a = str . rfind ( ' \' ' ) ; a > = 0 ; a - - )
{
if ( tmp [ a ] = = ' \' ' )
tmp . insert ( " ' " , a ) ;
}
2017-07-24 09:50:05 +00:00
tmp . insert ( " ' " , 0 ) ;
tmp < < ' \' ' ;
return tmp ;
2017-07-10 15:02:18 +00:00
}
// Elimina il record in base ai campi chiave
bool TTrFa_record : : remove ( )
{
TString256 query ;
query < < " DELETE FROM " < < _table < < " WHERE " ;
int nkf = 0 ;
FOR_EACH_TOKEN ( _key , fld )
{
const TVariant & var = get ( fld ) ;
if ( ! var . is_null ( ) )
{
if ( nkf + + > 0 )
query < < " AND " ;
query < < fld < < ' = ' < < var2str ( fld , var ) ;
}
}
CHECKS ( nkf > = 2 , " Can't remove partial key on table " , ( const char * ) _table ) ;
query < < ' ; ' ;
return xvt_sql_execute ( _db , query , NULL , 0L ) > 0 ;
}
// Callback per la sottostante funzione search()
static int tff_search_record ( void * jolly , int cols , char * * values , char * * names )
{
TTrFa_record & rec = * ( TTrFa_record * ) jolly ;
for ( int i = 0 ; i < cols ; i + + )
rec . set ( names [ i ] , values [ i ] ) ;
return 0 ;
}
// Carica un record in base ai campi chiave
bool TTrFa_record : : search ( )
{
CHECKS ( _fields . items ( ) > = _key . items ( ) , " Can't search partial key on table " , _table ) ;
TString256 query ;
query < < " SELECT * FROM " < < _table < < " WHERE " ;
FOR_EACH_TOKEN ( _key , fld )
{
const TVariant & var = get ( fld ) ;
if ( ! var . is_null ( ) )
query < < fld < < ' = ' < < var2str ( fld , var ) < < " AND " ;
}
query . rtrim ( 5 ) ;
query < < ' ; ' ;
return xvt_sql_execute ( _db , query , tff_search_record , this ) = = 1 ;
}
// Carica un record in base ad un massimo di 3 campi chiave
bool TTrFa_record : : search ( const char * k1 , const char * k2 , const char * k3 )
{
_fields . destroy ( ) ;
set ( _key . get ( 0 ) , k1 ) ;
if ( k2 & & * k2 )
set ( _key . get ( 1 ) , k2 ) ;
if ( k3 & & * k3 )
set ( _key . get ( 2 ) , k3 ) ;
return search ( ) ;
}
// Aggiunge un record al db
bool TTrFa_record : : insert ( )
{
CHECKS ( _fields . items ( ) > _key . items ( ) , " Can't insert empty record on table " , _table ) ;
TString query , values ;
query < < " INSERT INTO " < < _table < < " \n ( " ;
FOR_EACH_ASSOC_OBJECT ( _fields , obj , fld , itm )
{
const TVariant & var = get ( fld ) ;
if ( ! var . is_null ( ) )
{
query < < fld < < ' , ' ;
values < < var2str ( fld , var ) < < ' , ' ;
}
}
query . rtrim ( 1 ) ; values . rtrim ( 1 ) ;
query < < " ) \n VALUES ( " < < values < < " ); " ;
return xvt_sql_execute ( _db , query , NULL , 0L ) = = 1 ;
}
// Crea un record della tabella data ed imposta i nomi dei campi chiave
TTrFa_record : : TTrFa_record ( const char * table ) : _table ( table ) , _key ( 15 , ' , ' )
{
_key = ini_get_string ( " ./tff.ini " , table , " INDEX_1 " ) ;
if ( _key . empty ( ) )
{
// Cerco di costruire i nomi della chiave cercando la K, come in P1_KEYHEADERFATT
TConfig cfg ( " tff.ini " , table ) ;
TAssoc_array & fields = cfg . list_variables ( ) ;
FOR_EACH_ASSOC_STRING ( fields , obj , key , str )
{
if ( key [ 3 ] = = ' K ' )
_key . add ( key ) ;
}
}
CHECKS ( ! _key . empty_items ( ) , " Invalid primary key for table " , table ) ;
}
2017-05-02 07:49:23 +00:00
/////////////////////////////////////////////////////////////////////////////////////
// TTrFa_app
/////////////////////////////////////////////////////////////////////////////////////
void TTrFa_app : : log ( int severity , const char * msg )
{
if ( severity < 0 )
{
_logTFF = msg ;
} else
if ( _log = = NULL )
{
_log = new TLog_report ;
if ( _logTFF . full ( ) )
{
TString txt ;
txt < < _logTFF < < " : " < < msg ;
_log - > log ( severity , txt ) ;
}
else
_log - > log ( severity , msg ) ;
}
}
bool TTrFa_app : : show_log ( )
{
bool ok = true ;
if ( _log )
{
_log - > preview ( ) ;
delete _log ;
_log = NULL ;
ok = noyes_box ( TR ( " Si desidera procedere con la generazione file xml? " ) ) ;
}
return ok ;
}
int TTrFa_app : : parse_line ( const TString & line , TString & var , TString & val ) const
{
if ( line . blank ( ) )
return 0 ;
if ( line [ 0 ] = = ' [ ' )
{
var = line . mid ( 1 ) ;
var . rtrim ( 1 ) ;
val . cut ( 0 ) ;
return 1 ;
}
const int equal = line . find ( ' = ' ) ;
if ( equal < 6 )
return 0 ;
var = line . left ( equal ) ; var . trim ( ) ;
val = line . mid ( equal + 1 ) ; val . trim ( ) ;
return 2 ;
}
bool TTrFa_app : : create_table ( TScanner & tff , const TString & table )
{
TString query , var , val ;
if ( xvt_sql_table_exists ( _db , table ) )
{
SLIST fields = xvt_sql_list_fields ( _db , table ) ;
while ( ! tff . eof ( ) )
{
const TString & line = tff . line ( ) ;
const int n = parse_line ( line , var , val ) ;
if ( n < = 0 )
break ;
if ( var . starts_with ( " INDEX_ " ) )
break ;
if ( xvt_slist_find_str ( fields , var ) = = NULL )
{
query . cut ( 0 ) < < " ALTER TABLE " < < table < < " ADD COLUMN " < < var < < ' ' < < val < < " NOT NULL " ;
if ( val . find ( " INT " ) > = 0 | | val . find ( " NUM " ) > = 0 )
query < < " DEFAULT 0 " ;
else
query < < " DEFAULT '' " ;
query < < " ; " ;
xvt_sql_execute ( _db , query , NULL , NULL ) ; // Create table
}
}
xvt_slist_destroy ( fields ) ;
}
else
{
query < < " CREATE TABLE " < < table < < " ( " ;
while ( ! tff . eof ( ) )
{
const TString & line = tff . line ( ) ;
const int n = parse_line ( line , var , val ) ;
if ( n < = 0 )
break ;
if ( n = = 1 )
{
tff . push ( line ) ;
break ;
}
if ( var . starts_with ( " INDEX_ " ) )
{
query . rtrim ( 1 ) ; // toglie ultima ,
query < < " ); " ;
xvt_sql_execute ( _db , query , NULL , NULL ) ; // Create table
query . cut ( 0 ) ;
query < < " CREATE UNIQUE INDEX "
< < table < < " _1 ON " < < table
< < " ( " < < val < < " ); " ;
xvt_sql_execute ( _db , query , NULL , NULL ) ; // Create index
break ;
}
else
{
query < < " \n " < < var < < ' ' < < val < < " NOT NULL " ;
if ( val . find ( " INT " ) > = 0 | | val . find ( " NUM " ) > = 0 )
query < < " DEFAULT 0 " ;
else
query < < " DEFAULT '' " ;
query < < " , " ;
}
}
}
return true ;
}
bool TTrFa_app : : create ( )
{
open_files ( LF_MOV , LF_RMOV , LF_RMOVIVA , LF_TABCOM , LF_ANAG ,
LF_CLIFO , LF_OCCAS , LF_CFVEN , LF_NDITTE , 0 ) ;
// Controllo preventivo dell'avvenuta conversione del tracciato record
TRectype rmoviva ( LF_RMOVIVA ) ;
//if (rmoviva.type("TFINVIO") != _boolfld)
//return error_box(TR("Database non convertito per il Trasferimento Elettronico"));
_ditta . init ( LF_NDITTE , prefix ( ) . get_codditta ( ) ) ;
_dbname = prefix ( ) . get_studio ( ) ; // base direcotry
_dbname . add ( " sql " ) ; make_dir ( _dbname ) ;
2017-06-23 13:30:54 +00:00
TString16 d ; d . format ( " TF%05ld.db " , prefix ( ) . get_codditta ( ) ) ;
2017-05-02 07:49:23 +00:00
_dbname . add ( d ) ;
bool create = ! _dbname . exist ( ) ;
_db = xvt_sql_open ( _dbname , user ( ) , " " , _dbname . path ( ) ) ;
if ( _db = = NULL )
return false ;
if ( create )
{
createDB ( ) ;
}
2017-07-13 12:27:06 +00:00
return TSkeleton_application : : create ( ) ;
2017-05-02 07:49:23 +00:00
}
// Sincronizzo il DB SQL con quello di campo
bool TTrFa_app : : syncronizeDB ( )
{
//xvt_sql_begin(_db);
return true ;
}
bool TTrFa_app : : createDB ( )
{
const TFilename ini = " tff.ini " ;
bool ok = ini . exist ( ) ;
if ( ok )
{
xvt_sql_begin ( _db ) ;
TScanner TFF ( ini ) ;
while ( ok & & ! TFF . eof ( ) )
{
const TString & p = TFF . line ( ) ;
if ( p . starts_with ( " [TF " ) & & p . ends_with ( " F] " ) )
{
TString16 table = p ; table . strip ( " [] " ) ;
ok = create_table ( TFF , table ) ;
}
}
2017-06-28 13:09:56 +00:00
if ( ok )
{
// Aggiungo il valore di default in TFNUM
TTrFa_record tfnum ( " TFNUM00F " ) ;
tfnum . set ( " PJNKEY " , " 00001 " ) ;
tfnum . set ( " PJNINV " , " 0000000000 " ) ;
ok = tfnum . insert ( ) ;
}
2017-05-02 07:49:23 +00:00
if ( ok )
xvt_sql_commit ( _db ) ;
else
xvt_sql_rollback ( _db ) ;
}
else
return cantread_box ( ini ) ;
return true ;
}
2017-07-13 12:27:06 +00:00
bool TTrFa_app : : copySSA ( )
{
2017-07-14 10:49:00 +00:00
TFilename tmp ;
2017-07-13 12:27:06 +00:00
// Copia eventuali protezioni software
TString_array files ;
if ( list_files ( SPESOMETROBASE " /*.ssa " , files ) = = 0 )
{
list_files ( " *.ssa " , files ) ;
FOR_EACH_ARRAY_ROW ( files , i , row )
{
tmp = SPESOMETROBASE ; tmp . add ( * row ) ;
xvt_fsys_fupdate ( * row , tmp ) ;
}
}
files . destroy ( ) ;
if ( list_files ( SPESOMETROBASE " /*.ssa " , files ) ! = 1 )
{
warning_box ( FR ( " Nella cartella %s deve essere presente esattamente un file .ssa " ) , SPESOMETROBASE ) ;
return false ;
}
TFilename home ;
xvt_sys_get_env ( " USERPROFILE " , home . get_buffer ( ) , home . size ( ) ) ;
home . add ( " SoftwareSirio " ) ; home . add ( SPESOMETROBASE ) ;
if ( ! dexist ( home ) )
make_dir ( home ) ;
return true ;
}
2017-05-02 07:49:23 +00:00
bool TTrFa_app : : send ( TTrFa_mask * msk )
{
2017-06-23 13:30:54 +00:00
// Controllo se <20> la prima esecuzione, in caso positivo chiedo se vuole controllare p.iva e cf
bool first = ini_get_bool ( CONFIG_DITTA , " tf " , " FirstExec " , true ) ;
if ( first )
{
2017-07-18 15:27:20 +00:00
ini_set_bool ( CONFIG_DITTA , " tf " , " FirstExec " , false ) ;
2017-06-23 13:30:54 +00:00
if ( yesno_box ( " Stai eseguendo il programma per la prima volta, \n vuoi controllare di avere tutti i Codici Fiscali e Partite IVA corrette? " ) )
{
TExternal_app checkApp ( " cg1 -2 L " ) ;
checkApp . run ( ) ;
2017-07-18 15:27:20 +00:00
if ( ! yesno_box ( " Desideri proseguire con l'esportazione? " ) )
{
return false ;
}
2017-06-23 13:30:54 +00:00
}
}
2017-07-13 12:41:19 +00:00
2017-05-02 07:49:23 +00:00
// Mi carico i miei dati
TSheet_field & sheet = msk - > sfield ( F_RIGHE ) ;
2017-06-23 13:30:54 +00:00
// Booleano per appendere i record nel db
2017-06-29 15:27:59 +00:00
2017-06-23 13:30:54 +00:00
/***********************************************************************************************
* Esporto
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
xvt_sql_begin ( _db ) ;
2017-07-13 12:41:19 +00:00
// Eseguo l'esportazione
bool ok = tff0100 ( sheet ) & & tff0400 ( sheet ) & & tff0700 ( sheet ) ;
2017-06-29 15:27:59 +00:00
if ( ! ok )
2017-06-23 13:30:54 +00:00
{
log ( - 1 , " WTF!? " ) ;
xvt_sql_rollback ( _db ) ;
2017-07-10 15:02:18 +00:00
message_box ( " Esportazione fallita " ) ;
2017-06-29 15:27:59 +00:00
return false ;
2017-06-23 13:30:54 +00:00
}
if ( xvt_sql_commit ( _db ) )
{
2017-06-23 13:43:55 +00:00
message_box ( " Ho esportato correttamente! " ) ;
2017-06-23 13:30:54 +00:00
// Imposto l'esportazione
2017-06-30 12:57:07 +00:00
if ( yesno_box ( " Vuoi segnare i record esportati? " ) )
2017-07-13 12:27:06 +00:00
{
if ( setEsportato ( sheet ) )
message_box ( " Record segnati correttamente! " ) ;
else
message_box ( " Ci sono stati degli errori durante la riscrittura dei records " ) ;
msk - > setFilterChanged ( ) ;
}
2017-06-23 13:30:54 +00:00
}
2017-06-23 13:43:55 +00:00
else
2017-06-29 15:27:59 +00:00
message_box ( " Errore durante il salvataggio delle modifiche " ) ;
2017-06-23 13:30:54 +00:00
return true ;
}
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
TString TTrFa_app : : getKey ( TToken_string * strarr )
{
return strarr - > get_char ( _tipocf ) = = ' C ' ? DTE_PROVV : DTR_PROVV ;
}
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
TString TTrFa_app : : getHeader ( TToken_string * strarr )
{
/*
// Chiave header (20): TIPOCF(1) + NANANANANA(10) + CODCF(6)
TString header ; header . format ( " %c3753N4108E%06ld " , strarr - > get_char ( _tipocf ) , strarr - > get_int ( _codcf ) ) ;
return header ;
*/
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
/* Devo crearmi una struttura dove immagazzino delle strutture di clienti e all'interno ci metto i numeratori che mi chiedono
* Cos <EFBFBD> facendo mando a puttane persino l ' append che potevo tranquillamente implementare prima e creare fastidiose query per capire dove cazzo sto
*/
2017-06-28 13:14:40 +00:00
// Chiave header (20): TIPOCF(1) + CODCF(6)
2017-06-23 13:30:54 +00:00
static long int idHeader = 0L ;
// Cerco/Aggiungo il Clifo all'std::map
2017-06-30 08:49:03 +00:00
TString keyMap ; keyMap < < strarr - > get_char ( _tipocf ) < < " | " < < strarr - > get_int ( _codcf ) ;
2017-06-23 13:30:54 +00:00
clifoDoc app ;
2017-06-30 08:49:03 +00:00
// Non <20> presente e lo inserisco per la chiave body
2017-06-23 13:30:54 +00:00
if ( mCliDoc . find ( keyMap ) = = mCliDoc . end ( ) )
{
idHeader + + ;
app . contCliFo = idHeader ;
app . countDoc = 0L ;
mCliDoc . insert ( std : : pair < TString , clifoDoc > ( keyMap , app ) ) ;
2017-05-02 07:49:23 +00:00
}
2017-06-28 13:14:40 +00:00
TString header ; header . format ( " %c%06ld " , strarr - > get_char ( _tipocf ) , strarr - > get_int ( _codcf ) ) ;
2017-06-23 13:30:54 +00:00
// Ritorno l'header
return header ;
}
2017-06-28 13:09:56 +00:00
TString TTrFa_app : : getBody ( TToken_string * strarr , bool add )
2017-06-23 13:30:54 +00:00
{
/*
// Chiave body (20): TIPODOC(2) + DATADOC[YEAR](4) + NUMDOC(7) + AAA(3) + CODALIQUOTA(4)
TDate datadoc ( strarr - > get ( _datadoc ) ) ;
TString body ; body . format ( " %02s%04d%07s%04s " , strarr - > get ( _codnum ) , datadoc . year ( ) , strarr - > get ( _numdoc ) , strarr - > get ( _aliquota ) ) ;
return body ;
*/
/* Sembra che utilizzare identificatori chiari e sensati in questo mondo non <20> concesso, quindi adesso vi sbatto un bell'ID numerico
* Ok per OGNI cliente devo assegnarli un identificativo del numero della fattura
*/
2017-06-30 08:49:03 +00:00
TString keyMap ; keyMap < < strarr - > get_char ( _tipocf ) < < " | " < < strarr - > get_int ( _codcf ) ;
2017-06-23 13:30:54 +00:00
clifoDoc app = mCliDoc [ keyMap ] ;
2017-06-28 13:09:56 +00:00
if ( add )
app . countDoc + = 1 ;
2017-06-23 13:30:54 +00:00
mCliDoc [ keyMap ] = app ;
TString body ; body . format ( " %010d%010d " , app . contCliFo , app . countDoc ) ;
return body ;
2017-05-02 07:49:23 +00:00
}
2017-06-23 13:30:54 +00:00
bool TTrFa_app : : tff0100 ( TSheet_field & sheet )
2017-05-02 07:49:23 +00:00
{
const char * const paese = " IT " ;
static const TFirm & firm = prefix ( ) . firm ( ) ;
2017-06-23 13:30:54 +00:00
// Controllo la presenza di clienti e fornitori
// Scandisco in maniera ignorante sperando di beccare subito un cliente e un fornitore
bool cli = false , fo = false ;
FOR_EACH_SHEET_ROW ( sheet , r , strarr )
{
2017-07-13 12:27:06 +00:00
IF_IS_ENABLED ( strarr ) ;
2017-06-23 13:30:54 +00:00
if ( strarr - > get_char ( _tipocf ) = = ' C ' )
cli = true ;
else
fo = true ;
2017-07-10 15:02:18 +00:00
if ( cli | | fo ) break ;
2017-06-23 13:30:54 +00:00
}
2017-07-13 12:27:06 +00:00
bool ok = false ;
2017-06-23 13:30:54 +00:00
if ( cli )
{
2017-07-13 12:27:06 +00:00
ok = true ;
2017-06-23 13:30:54 +00:00
TTrFa_record dte ( " TFF0100F " ) ;
2017-06-29 15:27:59 +00:00
// Controllo la presenza di un caricamento in attesa
if ( dte . search ( DTE_PROVV ) )
{
bool sent = dte . get ( " P1_KEYPRGINVIO " ) . as_string ( ) = = DTE_PROVV ;
if ( sent )
{
TString msg = " <EFBFBD> presente un'altra esportazione non ancora elaborata vuoi eliminarla?" ;
if ( yesno_box ( msg ) )
{
if ( ! emptyTables ( DTE_PROVV ) )
{
error_box ( " Fallita eliminazione record!!! " ) ;
return false ;
}
}
else
return false ;
}
}
2017-06-23 13:30:54 +00:00
dte . set ( " P1_KEYPRGINVIO " , DTE_PROVV ) ;
dte . set ( " P1_TRASMITTPAESE " , paese ) ;
2017-07-10 15:02:18 +00:00
dte . set ( " P1_TRASMITTCOD " , " " ) ;
2017-06-23 13:30:54 +00:00
dte . set ( " P1_TIPOINVIO " , " DTE " ) ;
dte . set ( " P1_GESTIONE " , " " ) ;
ok = dte . insert ( ) ;
if ( ! ok ) return false ;
ok = tff0200 ( DTE_PROVV ) ;
if ( ! ok ) return false ;
}
if ( fo )
{
2017-07-13 12:27:06 +00:00
ok = true ;
2017-06-23 13:30:54 +00:00
TTrFa_record dtr ( " TFF0100F " ) ;
2017-06-29 15:27:59 +00:00
// Controllo la presenza di un caricamento in attesa
if ( dtr . search ( DTR_PROVV ) )
{
bool sent = dtr . get ( " P1_KEYPRGINVIO " ) . as_string ( ) = = DTR_PROVV ;
TString msg = " <EFBFBD> presente un'altra esportazione non ancora elaborata vuoi eliminarla?" ;
if ( sent )
{
if ( yesno_box ( msg ) )
{
2017-07-14 10:49:00 +00:00
if ( ! emptyTables ( DTR_PROVV ) )
2017-06-29 15:27:59 +00:00
{
error_box ( " Fallita eliminazione record!!! " ) ;
return false ;
}
}
else
return false ;
}
}
2017-06-23 13:30:54 +00:00
dtr . set ( " P1_KEYPRGINVIO " , DTR_PROVV ) ;
dtr . set ( " P1_TRASMITTPAESE " , paese ) ;
2017-07-10 15:02:18 +00:00
dtr . set ( " P1_TRASMITTCOD " , " " ) ;
2017-06-23 13:30:54 +00:00
dtr . set ( " P1_TIPOINVIO " , " DTR " ) ;
dtr . set ( " P1_GESTIONE " , " " ) ;
ok = dtr . insert ( ) ;
if ( ! ok ) return false ;
ok = tff0200 ( DTR_PROVV ) ;
if ( ! ok ) return false ;
}
return ok ;
}
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
bool TTrFa_app : : tff0200 ( TString key )
{
2017-05-02 07:49:23 +00:00
/********************************************************************************************************************
2017-06-23 13:30:54 +00:00
* Cedeprest *
2017-05-02 07:49:23 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// <CedentePrestatore>
TTrFa_record tff0200f ( " TFF0200F " ) ;
2017-06-23 13:30:54 +00:00
tff0200f . set ( " P2_KEYPRGINVIO " , key ) ;
2017-05-02 07:49:23 +00:00
if ( _ditta . partita_IVA ( ) . full ( ) )
{
2017-06-23 13:30:54 +00:00
tff0200f . set ( " P2_FISCIVAPAESE " , _ditta . stato_partita_IVA ( ) ) ; // Sempre IT
tff0200f . set ( " P2_FISCIVACOD " , _ditta . partita_IVA ( ) ) ;
2017-05-02 07:49:23 +00:00
}
2017-06-23 13:30:54 +00:00
tff0200f . set ( " P2_CODFISCALE " , _ditta . codice_fiscale ( ) ) ;
2017-05-02 07:49:23 +00:00
if ( _ditta . fisica ( ) )
{
2017-06-23 13:30:54 +00:00
tff0200f . set ( " P2_ANANOME " , _ditta . nome ( ) ) ;
tff0200f . set ( " P2_ANACOGNOME " , _ditta . cognome ( ) ) ;
2017-05-02 07:49:23 +00:00
}
else
{
2017-06-23 13:30:54 +00:00
tff0200f . set ( " P2_ANADENOMIN " , _ditta . ragione_sociale ( ) ) ;
2017-05-02 07:49:23 +00:00
}
// DatiSede
2017-07-18 09:49:17 +00:00
TString via = _ditta . via_residenza ( ) , cap = _ditta . CAP_residenza ( ) , nazione = _ditta . stato_residenza_ISO ( ) ;
2017-07-10 14:16:23 +00:00
// Valori necessari, se non ci sono salto
if ( via . full ( ) & & cap . full ( ) & & nazione . full ( ) )
{
tff0200f . set ( " P2_SEDEIND " , via ) ;
2017-07-24 09:50:05 +00:00
tff0200f . set ( " P2_SEDENRCIVICO " , _ditta . civico_residenza ( ) . left ( 7 ) ) ;
2017-07-10 14:16:23 +00:00
tff0200f . set ( " P2_SEDECAP " , cap ) ;
tff0200f . set ( " P2_SEDECOMUNE " , _ditta . comune_residenza ( ) ) ;
if ( _ditta . italiano ( ) ) // Campo ritornerebbe "EE" se estero
tff0200f . set ( " P2_SEDEPROV " , _ditta . provincia_residenza ( ) ) ;
tff0200f . set ( " P2_SEDENAZ " , nazione ) ;
}
2017-06-23 13:30:54 +00:00
myrfso = " " ;
2017-05-02 07:49:23 +00:00
if ( haveRFSO ( myrfso ) )
{
2017-07-20 14:39:52 +00:00
TRectype r_ana = cache ( ) . get ( LF_ANAG , TString ( myrfso . left ( 1 ) ) < < " | " < < myrfso . sub ( 1 ) ) ;
2017-05-02 07:49:23 +00:00
if ( r_ana . get_char ( " TIPORFSO " ) = = ' S ' ) // Stabile Organizzazione
2017-07-10 14:16:23 +00:00
{
2017-07-14 10:49:00 +00:00
TAnagrafica rfso ( r_ana ) ;
2017-07-18 09:49:17 +00:00
TString via = rfso . via_residenza ( ) , cap = rfso . CAP_residenza ( ) , nazione = rfso . stato_residenza_ISO ( ) ;
2017-07-10 14:16:23 +00:00
tff0200f . set ( " P2_STABORGIND " , via ) ;
2017-07-24 09:50:05 +00:00
tff0200f . set ( " P2_STABORGNRCIVICO " , rfso . civico_residenza ( ) . left ( 7 ) ) ;
2017-07-10 14:16:23 +00:00
tff0200f . set ( " P2_STABORGCAP " , cap ) ;
tff0200f . set ( " P2_STABORGCOMUNE " , rfso . comune_residenza ( ) ) ;
if ( rfso . italiano ( ) )
tff0200f . set ( " P2_STABORGPROV " , rfso . provincia_residenza ( ) ) ;
tff0200f . set ( " P2_STABORGNAZ " , nazione ) ;
2017-05-02 07:49:23 +00:00
}
else // Rappresentante Fiscale
{
2017-06-23 13:30:54 +00:00
bool ok = tff0300 ( key , r_ana ) ;
if ( ! ok ) return false ;
2017-05-02 07:49:23 +00:00
}
}
2017-06-23 13:30:54 +00:00
tff0200f . set ( " P2_GESTIONE " , " " ) ;
return tff0200f . insert ( ) ;
}
2017-07-10 14:16:23 +00:00
2017-06-23 13:30:54 +00:00
bool TTrFa_app : : tff0300 ( TString key , TRectype r_ana )
{
2017-07-10 14:16:23 +00:00
// Il copy constructor non <20> accessibile (e non sar<61> io a modificarlo)
TAnagrafica rfso ( r_ana ) ;
// Per il nome e cognome non mi faccio gli stessi problemi con i cli/fo in quanto stiamo parlando di cose "nuove"
// Se il cliente ha messo nome e cognome insieme pu<70> bruciare nelle fiamme dei controlli dell'agenzia delle entrate
TString paiv = rfso . partita_IVA ( ) , ragsoc = rfso . ragione_sociale ( ) , nom = rfso . nome ( ) , cog = rfso . cognome ( ) ;
2017-07-10 15:02:18 +00:00
2017-06-23 13:30:54 +00:00
TTrFa_record tff0300f ( " TFF0300F " ) ;
tff0300f . set ( " P3_KEYPRGINVIO " , key ) ;
2017-07-18 09:49:17 +00:00
tff0300f . set ( " P3_FISCIVAPAESE " , rfso . stato_residenza_ISO ( ) ) ;
2017-07-10 14:16:23 +00:00
tff0300f . set ( " P3_FISCIVACODICE " , paiv ) ;
2017-06-23 13:30:54 +00:00
if ( r_ana . get_char ( " TIPOA " ) = = ' G ' )
{
2017-07-10 14:16:23 +00:00
tff0300f . set ( " P3_ANADENOMI " , ragsoc ) ;
2017-06-23 13:30:54 +00:00
}
else
{
TString nomCom = r_ana . get ( " RAGSOC " ) ;
2017-07-10 14:16:23 +00:00
tff0300f . set ( " P3_ANANOME " , nom ) ;
tff0300f . set ( " P3_ANACOGNOME " , cog ) ;
2017-06-23 13:30:54 +00:00
}
tff0300f . set ( " P3_GESTIONE " , " D " ) ;
return tff0300f . insert ( ) ;
}
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
bool TTrFa_app : : tff0400 ( TSheet_field & sheet )
{
// Siccome non siamo in grado di fare delle join devo in qualche modo evitare di caricare clienti gi<67> caricati quindi mi salvo tutto in un bel TToken_string e controllo
// Era troppo complicato fare una join codice cliente con i documenti per prendere solo quelli valorizzati.
TToken_string clifoSent = " " ;
bool ok = true ;
TProgress_monitor p ( sheet . items ( ) , " Caricamento Clienti/Fornitori " ) ;
FOR_EACH_SHEET_ROW ( sheet , r , strarr )
{
if ( ! p . add_status ( ) )
return false ;
2017-07-13 12:27:06 +00:00
IF_IS_ENABLED ( strarr ) ;
2017-06-23 13:30:54 +00:00
// Controllo il clifo, se non c'<27> lo aggiungo altrimenti salto sto giro
TString checkClifo ; checkClifo < < strarr - > get_char ( _tipocf ) < < strarr - > get_long ( _codcf ) ;
if ( clifoSent . get_pos ( checkClifo ) < 0 )
clifoSent . add ( checkClifo ) ;
else
continue ;
2017-07-14 10:49:00 +00:00
2017-07-17 08:15:41 +00:00
TVariant vtipocf = strarr - > get ( _tipocf ) , vcodcf = strarr - > get ( _codcf ) , voccas = strarr - > get ( _occas ) ;
2017-07-14 10:49:00 +00:00
2017-07-26 14:58:22 +00:00
# ifdef DBG
2017-07-28 08:20:30 +00:00
if ( vtipocf . as_string ( ) = = " C " & & vcodcf . as_string ( ) = = " 316 " )
2017-07-26 14:58:22 +00:00
bool tolla = true ;
# endif
2017-07-17 08:15:41 +00:00
TRectype r_cedeprest = getCli ( vtipocf . as_string ( ) , vcodcf . as_string ( ) , voccas . as_string ( ) ) ;
TAnagrafica cedeprest ;
// Con l'uscita di questo programma <20> stato messo un collegamento in prima nota
// per il fornitore a cui <20> riferita la bolla doganale
if ( strcmp ( strarr - > get ( _codnum ) , " BD " ) = = 0 )
{
TString codcf ;
// Attenzione! Se <20> una riga inserita a mano dall'utente prendo lo stesso il fornitore della riga!
int movimento = strarr - > get_int ( _numero ) ;
if ( movimento > = MOV_CUSTOM )
codcf < < strarr - > get ( _codcf ) ;
else
codcf = cache ( ) . get ( LF_MOV , strarr - > get ( _numero ) , " CFBOLLADOG " ) ;
r_cedeprest = getCli ( " F " , codcf , " " ) ;
cedeprest . init ( ' F ' , atol ( codcf ) ) ;
}
else
{
cedeprest . init ( vtipocf . as_string ( ) [ 0 ] , vcodcf . as_int ( ) , voccas . as_string ( ) ) ;
}
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
TTrFa_record tff0400f ( " TFF0400F " ) ;
tff0400f . set ( " P4_KEYPRGINVIO " , getKey ( strarr ) ) ;
tff0400f . set ( " P4_KEYHEADERFATT " , getHeader ( strarr ) ) ;
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
// Autofattura
if ( strcmp ( strarr - > get ( _autofatt ) , " X " ) = = 0 )
{
tff0400f . set ( " P4_FISCIVAPAESE " , _ditta . stato_partita_IVA ( ) ) ;
tff0400f . set ( " P4_FISCIVACOD " , _ditta . partita_IVA ( ) ) ;
tff0400f . set ( " P4_CODFISC " , _ditta . codice_fiscale ( ) ) ;
}
else // Fattura normale
{
2017-07-13 12:27:06 +00:00
if ( cedeprest . stato_partita_IVA ( ) . full ( ) & & cedeprest . partita_IVA ( ) . full ( ) )
2017-06-23 13:30:54 +00:00
{
2017-07-13 12:27:06 +00:00
tff0400f . set ( " P4_FISCIVAPAESE " , cedeprest . stato_partita_IVA ( ) ) ;
tff0400f . set ( " P4_FISCIVACOD " , cedeprest . partita_IVA ( ) ) ;
2017-06-23 13:30:54 +00:00
}
else
{
2017-07-17 08:15:41 +00:00
// Ovviamente tutte le bolle doganali fatte prima del rilascio
// non avranno questo campo compilato e quindi dovr<76> passare la partita IVA "OO99999999999"
2017-07-26 14:58:22 +00:00
// Controllo anche di essere in una data entro il 31/12/2017, dopo tale data sto ragionamento non <20> valido
if ( strcmp ( strarr - > get ( _codnum ) , " BD " ) = = 0 & & bd2017 ( ) )
2017-07-10 14:16:23 +00:00
{
2017-07-13 12:27:06 +00:00
tff0400f . set ( " P4_FISCIVAPAESE " , " OO " ) ;
tff0400f . set ( " P4_FISCIVACOD " , " 99999999999 " ) ;
2017-07-10 14:16:23 +00:00
}
else
2017-07-18 09:49:17 +00:00
{
// Se <20> un estero non CEE prendo nella partita IVA metto l'identificativo fiscale
if ( cedeprest . estero_non_CEE ( ) )
{
tff0400f . set ( " P4_FISCIVAPAESE " , cedeprest . stato_partita_IVA ( ) ) ;
tff0400f . set ( " P4_FISCIVACOD " , cedeprest . codice_fiscale ( ) ) ;
}
else
{
tff0400f . set ( " P4_CODFISC " , cedeprest . codice_fiscale ( ) ) ;
}
}
2017-06-23 13:30:54 +00:00
}
}
2017-07-17 08:15:41 +00:00
if ( cedeprest . ok ( ) ) // Con bolle doganali non a posto impazzisce
2017-05-02 07:49:23 +00:00
{
2017-07-17 08:15:41 +00:00
// Sono sicuro che se <20> di tipo 3,7 o 8 ha la ragione sociale
char tipo = r_cedeprest . get_char ( CLI_ALLEG ) ;
2017-07-28 08:20:30 +00:00
bool rsoc = cedeprest . giuridica ( ) | | ( tipo = = ' 3 ' | | tipo = = ' 7 ' | | tipo = = ' 8 ' | | tipo = = ' \0 ' ) ;
2017-07-17 08:15:41 +00:00
bool privato = tipo = = ' 6 ' ;
if ( ! rsoc )
2017-07-05 14:40:11 +00:00
{
2017-07-17 08:15:41 +00:00
// Bisogna fare un ragionamento pi<70> complesso, esistono ancora record salvati con Nome e Cognome nella prima parte
// e non divisi come si fa adesso quindi far<61> cos<6F> :
// Controllo se il nome <20> pieno
if ( cedeprest . nome ( ) . full ( ) )
2017-07-05 14:40:11 +00:00
{
2017-07-17 08:15:41 +00:00
// La vita <20> bella faccio che scrivere
tff0400f . set ( " P4_ANANOME " , cedeprest . nome ( ) ) ;
tff0400f . set ( " P4_ANACOGNOME " , cedeprest . cognome ( ) ) ;
2017-07-05 14:40:11 +00:00
}
else
{
2017-07-17 08:15:41 +00:00
// Devo indovinare quale <20> il nome e il cognome
TToken_string nomeCog ( cedeprest . cognome ( ) , ' ' ) ; // Notare il separatore spazio
2017-07-26 14:58:22 +00:00
// Se ho solo un nominativo <20> una ditta per Diana
if ( nomeCog . items ( ) = = 1 )
{
rsoc = true ;
}
2017-07-17 08:15:41 +00:00
// Controllo se ho solo un nome e un cognome
2017-07-26 14:58:22 +00:00
else if ( nomeCog . items ( ) = = 2 )
2017-07-05 14:40:11 +00:00
{
2017-07-17 08:15:41 +00:00
tff0400f . set ( " P4_ANANOME " , nomeCog . get ( 1 ) ) ;
tff0400f . set ( " P4_ANACOGNOME " , nomeCog . get ( 0 ) ) ;
}
else
{
TString cognome ; cognome < < nomeCog . get ( 0 ) ;
// Potrebbe essere un cognome tipo "De Fischello"
// Dai quante persone hanno pi<70> di 4 parole per nome e cognome?
if ( privato | | ( cognome . len ( ) > = 2 & & cognome . len ( ) < = 4 ) )
2017-07-05 14:40:11 +00:00
{
2017-07-17 08:15:41 +00:00
// Controllo che non sia una Ragione sociale! Tipo "ZG di Gianluigi Zibello"
// Se <20> segnato privato me ne sbatto anche di sto controllo
if ( privato | | TString ( nomeCog . get ( 1 ) ) . len ( ) > 2 )
{
cognome < < " " < < nomeCog . get ( 1 ) ;
TString nome ;
for ( int i = 2 ; i < nomeCog . items ( ) ; i + + )
nome < < nomeCog . get ( i ) < < " " ;
2017-07-24 15:19:20 +00:00
tff0400f . set ( " P4_ANANOME " , nome ) ;
tff0400f . set ( " P4_ANACOGNOME " , cognome ) ;
2017-07-17 08:15:41 +00:00
}
else
rsoc = true ;
2017-07-05 14:40:11 +00:00
}
else
rsoc = true ;
}
}
}
2017-07-17 08:15:41 +00:00
// Ricontrollo!!!! rsoc potrebbe essere cambiato sopra
if ( rsoc )
{
tff0400f . set ( " P4_ANADENOM " , cedeprest . ragione_sociale ( ) ) ;
}
2017-07-20 14:39:52 +00:00
tff0400f . set ( " P4_SEDEIND " , cedeprest . via_residenza ( ) ) ;
2017-07-24 09:50:05 +00:00
tff0400f . set ( " P4_SEDENRCIVICO " , cedeprest . civico_residenza ( ) . left ( 7 ) ) ;
2017-07-20 14:39:52 +00:00
tff0400f . set ( " P4_SEDECAP " , cedeprest . CAP_residenza ( ) ) ;
tff0400f . set ( " P4_SEDECOMUNE " , cedeprest . comune_residenza ( ) ) ;
if ( cedeprest . italiano ( ) ) // Campo ritornerebbe "EE" se estero
tff0400f . set ( " P4_SEDEPROV " , cedeprest . provincia_residenza ( ) ) ;
tff0400f . set ( " P4_SEDENAZ " , cedeprest . stato_residenza_ISO ( ) ) ;
2017-07-10 14:16:23 +00:00
}
2017-06-23 13:30:54 +00:00
tff0400f . set ( " P4_GESTIONE " , " D " ) ;
2017-07-10 14:16:23 +00:00
2017-06-23 13:30:54 +00:00
ok = tff0400f . insert ( ) ;
// Controllo dopo l'inserimento del tff0400
if ( ! ok ) return false ;
TString rfso = strarr - > get ( _rfso ) ;
if ( rfso . full ( ) )
{
2017-07-20 14:39:52 +00:00
TRectype r_ana = cache ( ) . get ( LF_ANAG , TString ( rfso . left ( 1 ) ) < < " | " < < rfso . sub ( 1 ) ) ;
ok = r_ana . full ( ) & & tff3100 ( strarr , r_ana ) ;
2017-06-23 13:30:54 +00:00
}
// E dopo l'inserimento del tff3100
if ( ! ok ) return false ;
2017-05-02 07:49:23 +00:00
}
2017-06-23 13:30:54 +00:00
return ok ;
}
2017-05-02 07:49:23 +00:00
2017-06-23 13:30:54 +00:00
bool TTrFa_app : : tff0700 ( TSheet_field & sheet )
{
/********************************************************************************************************************
* Fattura *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Mentre per i clienti <20> una porcata per le fatture non posso fare altrimenti, potrebbe essere che i clienti mettono righe in fondo customizzate spezzando fatture
TToken_string fattSent = " " ;
bool ok = true ;
2017-06-28 13:09:56 +00:00
TProgress_monitor p ( sheet . items ( ) , " Caricamento Fatture " ) ;
TString oldKey = " " ;
int numRiga ;
2017-06-23 13:30:54 +00:00
FOR_EACH_SHEET_ROW ( sheet , r , strarr )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
if ( ! p . add_status ( ) )
return false ;
2017-07-13 12:27:06 +00:00
IF_IS_ENABLED ( strarr ) ;
2017-06-30 08:49:03 +00:00
TString checkFatt ; checkFatt < < strarr - > get_char ( _tipocf ) < < " | " < < strarr - > get_long ( _codcf ) < < " | " < < strarr - > get ( _numdoc ) ;
2017-06-23 13:30:54 +00:00
if ( fattSent . get_pos ( checkFatt ) < 0 )
{
fattSent . add ( checkFatt ) ;
// <DatiFatturaBody>
TTrFa_record tff0700f ( " TFF0700F " ) ;
tff0700f . set ( " P7_KEYPRGINVIO " , getKey ( strarr ) ) ;
tff0700f . set ( " P7_KEYHEADERFATT " , getHeader ( strarr ) ) ;
tff0700f . set ( " P7_KEYBODYFATT " , getBody ( strarr ) ) ;
2017-07-18 09:49:17 +00:00
TString natura = strarr - > get ( _natura ) ;
2017-06-23 13:30:54 +00:00
tff0700f . set ( " P7_TIPODOC " , decodTipo ( strarr ) ) ;
2017-07-24 09:50:05 +00:00
// Controllo il tipo di esigilit<69>
2017-06-28 13:09:56 +00:00
tff0700f . set ( " P7_DATA " , toDate ( strarr - > get ( _datadoc ) ) ) ;
2017-06-23 13:30:54 +00:00
tff0700f . set ( " P7_NUMERO " , strarr - > get ( _numdoc ) ) ;
2017-06-28 13:09:56 +00:00
tff0700f . set ( " P7_DATAREG " , toDate ( strarr - > get ( _datareg ) ) ) ; // Obbligatoria nei DTR
2017-06-23 13:30:54 +00:00
tff0700f . set ( " P7_GESTIONE " , " " ) ;
ok = tff0700f . insert ( ) ;
// Controllo dopo l'inserimento del tff0700f
if ( ! ok ) return false ;
}
2017-06-28 13:09:56 +00:00
// In qualsiasi caso va messa la riga ma prima elaboro il numero della riga!
TString newKey = getBody ( strarr , false ) ;
if ( oldKey ! = newKey )
{
numRiga = 1 ;
oldKey = newKey ;
}
else
numRiga + + ;
ok = tff2200 ( strarr , numRiga ) ;
2017-06-23 13:30:54 +00:00
// E dopo l'inserimento del tff2200
if ( ! ok ) return false ;
2017-05-02 07:49:23 +00:00
}
2017-06-23 13:30:54 +00:00
return ok ;
}
2017-06-28 13:09:56 +00:00
bool TTrFa_app : : tff2200 ( TToken_string * strarr , int nriga )
2017-06-23 13:30:54 +00:00
{
TTrFa_record tff2200f ( " TFF2200F " ) ;
tff2200f . set ( " PL_KEYPRGINVIO " , getKey ( strarr ) ) ;
tff2200f . set ( " PL_KEYHEADERFATT " , getHeader ( strarr ) ) ;
2017-06-28 13:09:56 +00:00
tff2200f . set ( " PL_KEYBODYFATT " , getBody ( strarr , false ) ) ;
2017-06-30 08:49:03 +00:00
2017-06-28 13:09:56 +00:00
TString numriga ; numriga . format ( " %020d " , nriga ) ;
2017-06-30 08:49:03 +00:00
2017-06-28 13:09:56 +00:00
tff2200f . set ( " PL_KEYBODYDETT " , numriga ) ;
2017-06-23 13:30:54 +00:00
2017-06-28 13:09:56 +00:00
tff2200f . set ( " PL_IMPONIBILE " , real ( strarr - > get ( _imponibile ) ) ) ; // Se li converto in real una volta passati vengono parsati da var2str nel formato che vuole l'agenzia delle entrate
tff2200f . set ( " PL_IMPOSTA " , real ( strarr - > get ( _importoIVA ) ) ) ;
2017-06-30 12:57:07 +00:00
real aliquota = cache ( ) . get ( " %IVA " , strarr - > get ( _aliquota ) , " R0 " ) ;
tff2200f . set ( " PL_ALIQUOTAIVA " , aliquota ) ;
2017-07-24 09:50:05 +00:00
TRectype thisMov = cache ( ) . get ( LF_MOV , strarr - > get ( _numero ) ) ;
2017-07-26 14:58:22 +00:00
tff2200f . set ( " PL_ESIGIVA " , is_split_payment ( thisMov ) ? " S " : is_IVA_diff ( thisMov ) | | is_IVAxCassa ( thisMov ) ? " D " : " I " ) ;
2017-06-23 13:30:54 +00:00
tff2200f . set ( " PL_NATURA " , strarr - > get ( _natura ) ) ;
real det ( strarr - > get ( _detraibile ) ) ;
// Nella conversione la vigola viene persa e 100,00 diventa 10.000 quindi divido
det / = CENTO ;
if ( det > ZERO )
2017-05-02 07:49:23 +00:00
{
2017-06-28 13:09:56 +00:00
tff2200f . set ( " PL_DETRAIBILE " , det ) ;
2017-06-23 13:30:54 +00:00
}
else if ( false ) // Sempre disabilitato!
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
tff2200f . set ( " PL_DEDUCIBILE " , " SI " ) ;
}
tff2200f . set ( " PL_GESTIONE " , " D " ) ;
return tff2200f . insert ( ) ;
}
bool TTrFa_app : : tff3100 ( TToken_string * strarr , TRectype r_ana )
{
2017-05-02 07:49:23 +00:00
TTrFa_record tff3100f ( " TFF3100F " ) ;
2017-06-23 13:30:54 +00:00
tff3100f . set ( " PH_KEYPRGINVIO " , getKey ( strarr ) ) ;
tff3100f . set ( " PH_KEYHEADERFATT " , getHeader ( strarr ) ) ;
if ( _append )
tff3100f . remove ( ) ;
2017-07-10 14:16:23 +00:00
TAnagrafica rfso ( r_ana ) ;
2017-05-02 07:49:23 +00:00
if ( r_ana . get_char ( " TIPORFSO " ) = = ' S ' ) // Stabile Organizzazione
{
2017-07-18 09:49:17 +00:00
TString via = rfso . via_residenza ( ) , cap = rfso . CAP_residenza ( ) , nazione = rfso . stato_residenza_ISO ( ) ;
2017-07-10 14:16:23 +00:00
tff3100f . set ( " PH_STABORGIND " , via ) ;
2017-07-24 09:50:05 +00:00
tff3100f . set ( " PH_STABORGNRCIVICO " , rfso . civico_residenza ( ) . left ( 7 ) ) ;
2017-07-10 14:16:23 +00:00
tff3100f . set ( " PH_STABORGCAP " , cap ) ;
tff3100f . set ( " PH_STABORGCOMUNE " , rfso . comune_residenza ( ) ) ;
if ( rfso . italiano ( ) )
tff3100f . set ( " PH_STABORGPROV " , rfso . provincia_residenza ( ) ) ;
tff3100f . set ( " PH_STABORGNAZ " , nazione ) ;
2017-05-02 07:49:23 +00:00
}
else // Rappresentante Fiscale
{
// La P.IVA del rappresentante fiscale deve essere in AT quindi non faccio alcun controllo,
// se il valore nullo perch<63> Extra CEE non <20> un errore di campo (Anche perch<63> che senso ha un RF extra CEE?)
2017-07-10 14:16:23 +00:00
TString paiv = rfso . partita_IVA ( ) , ragsoc = rfso . ragione_sociale ( ) , nom = rfso . nome ( ) , cog = rfso . cognome ( ) ;
2017-07-18 09:49:17 +00:00
tff3100f . set ( " PH_FISCIVAPAESE " , rfso . stato_residenza_ISO ( ) ) ;
2017-07-10 14:16:23 +00:00
tff3100f . set ( " PH_FISCIVACODICE " , paiv ) ;
2017-05-02 07:49:23 +00:00
if ( r_ana . get_char ( " TIPOA " ) = = ' G ' )
{
2017-07-10 14:16:23 +00:00
tff3100f . set ( " PH_ANADENOMI " , ragsoc ) ;
2017-05-02 07:49:23 +00:00
}
else
{
TString nomCom = r_ana . get ( " RAGSOC " ) ;
2017-07-10 14:16:23 +00:00
tff3100f . set ( " PH_ANANOME " , nom ) ;
tff3100f . set ( " PH_ANACOGNOME " , cog ) ;
2017-05-02 07:49:23 +00:00
}
}
tff3100f . set ( " PH_GESTIONE " , " D " ) ;
2017-06-23 13:30:54 +00:00
return tff3100f . insert ( ) ;
2017-05-02 07:49:23 +00:00
}
2017-06-23 13:30:54 +00:00
bool TTrFa_app : : setEsportato ( TSheet_field & sheet )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
bool ok = true ;
TProgress_monitor p ( sheet . items ( ) , " Segno l'esportazione sui records " ) ;
FOR_EACH_SHEET_ROW ( sheet , r , strarr )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
if ( ! p . add_status ( ) )
return false ;
2017-07-13 12:27:06 +00:00
TString modificato = strarr - > get ( _forzata ) ;
if ( modificato = = " X " )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
ok = saveRec ( * strarr , true ) ;
if ( ! ok ) return false ;
2017-05-02 07:49:23 +00:00
}
else
{
2017-06-30 12:57:07 +00:00
TRectype row = cache ( ) . get ( LF_MOV , TString ( strarr - > get ( _numero ) ) ) ;
2017-07-13 12:41:19 +00:00
char invio = strarr - > get_char ( _invio ) ;
if ( invio = = ' F ' | | invio = = ' X ' )
invio = ' I ' ;
row . put ( " TFINVIO " , invio ) ;
2017-06-28 13:09:56 +00:00
row . put ( " TFDATA " , TDate ( TODAY ) . string ( ) ) ;
2017-06-30 12:57:07 +00:00
ok = row . rewrite ( TLocalisamfile ( LF_MOV ) ) = = NOERR ;
2017-06-23 13:30:54 +00:00
if ( ! ok ) return false ;
2017-05-02 07:49:23 +00:00
}
}
2017-06-23 13:30:54 +00:00
return ok ;
2017-05-02 07:49:23 +00:00
}
2017-06-29 15:27:59 +00:00
bool TTrFa_app : : emptyTables ( TString key )
{
TString query ;
query < < " DELETE FROM TFF0100F WHERE P1_KEYPRGINVIO = ' " < < key < < " '; \n " ;
query < < " DELETE FROM TFF0200F WHERE P2_KEYPRGINVIO = ' " < < key < < " '; \n " ;
query < < " DELETE FROM TFF0300F WHERE P3_KEYPRGINVIO = ' " < < key < < " '; \n " ;
query < < " DELETE FROM TFF0400F WHERE P4_KEYPRGINVIO = ' " < < key < < " '; \n " ;
query < < " DELETE FROM TFF0700F WHERE P7_KEYPRGINVIO = ' " < < key < < " '; \n " ;
query < < " DELETE FROM TFF2200F WHERE PL_KEYPRGINVIO = ' " < < key < < " '; \n " ;
query < < " DELETE FROM TFF3100F WHERE PH_KEYPRGINVIO = ' " < < key < < " '; \n " ;
return xvt_sql_execute ( _db , query , NULL , NULL ) > = 0 ;
}
2017-05-02 07:49:23 +00:00
void TTrFa_app : : main_loop ( )
{
2017-07-13 12:27:06 +00:00
// Sposto SSA
if ( ! copySSA ( ) ) return ;
2017-05-02 07:49:23 +00:00
TTrFa_mask msk ( " tf0100a " ) ;
while ( msk . run ( ) = = K_ENTER )
{
2017-07-14 10:49:00 +00:00
if ( msk . checkNotEmpty ( ) )
2017-07-25 13:15:55 +00:00
{
// Sistemo tutti i flag prima di inviare
msk . theFinalCheckDown ( ) ;
2017-07-14 10:49:00 +00:00
send ( & msk ) ;
//ini_set_string(CONFIG_DITTA, "tf", "LastSend", ++TDate(msk.get(F_DATAFIN)));
2017-07-25 13:15:55 +00:00
}
2017-05-02 07:49:23 +00:00
}
}
bool TTrFa_app : : destroy ( )
{
xvt_sql_close ( _db ) ; _db = NULL ;
return TSkeleton_application : : destroy ( ) ;
}
int tf0100 ( int argc , char * argv [ ] )
{
TTrFa_app t2t ;
t2t . run ( argc , argv , TR ( " Trasferimento Fatture Elettroniche " ) ) ;
return 0 ;
}