2017-05-02 07:49:23 +00:00
# include "tf0.h"
2020-09-17 17:09:13 +02:00
# include "tf0100b.h"
# include "../fp/fplib.h"
2017-07-24 09:50:05 +00:00
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
2019-03-07 18:11:41 +01:00
TString get_tipo_doc ( 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 ;
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-10-16 12:27:34 +00:00
case B_TIPO_FATTSCO :
ret = " FS " ;
break ;
2019-03-07 18:11:41 +01:00
case B_ESTEROMETRO :
ret = " ESTER " ;
2017-06-28 13:09:56 +00:00
break ;
2019-03-07 18:11:41 +01:00
case B_PAF_NOT_SENT :
ret = " PAF_NS " ;
2017-06-28 13:09:56 +00:00
break ;
2019-03-07 18:11:41 +01:00
case B_PAF_SENT :
ret = " PAF_S " ;
2017-06-23 13:30:54 +00:00
break ;
2019-03-07 18:11:41 +01:00
case B_PAF_SOG_FAT :
ret = " PAF_SF " ;
2017-06-23 13:30:54 +00:00
break ;
2019-03-07 18:11:41 +01:00
case B_PAF_ESTERI :
ret = " PAF_E " ;
2017-06-23 13:30:54 +00:00
break ;
2019-03-07 18:11:41 +01:00
case B_PAA_NOT_SENT :
ret = " PAA_NS " ;
break ;
case B_PAA_SENT :
ret = " PAA_S " ;
break ;
case B_PAA_ESTERI :
ret = " PAA_E " ;
break ;
case B_PAA_SOG_FAT :
ret = " PAA_SF " ;
2017-06-23 13:30:54 +00:00
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
2019-03-07 18:11:41 +01:00
int get_tipo_doc ( const TString id )
2017-05-02 07:49:23 +00:00
{
2017-06-23 13:30:54 +00:00
int ret = - 1 ;
2019-03-07 18:11:41 +01:00
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-23 13:30:54 +00:00
else if ( id = = " FA " ) ret = B_TIPO_FATTACQ ;
else if ( id = = " FF " ) ret = B_TIPO_FATTFISC ;
2017-10-16 12:27:34 +00:00
else if ( id = = " FS " ) ret = B_TIPO_FATTSCO ;
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 ;
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)
2020-09-17 17:09:13 +02:00
//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-05-02 07:49:23 +00:00
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)
2020-09-17 17:09:13 +02:00
//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-07-13 12:27:06 +00:00
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
*/
2021-04-22 22:23:28 +02:00
const char * decod_tipo ( TToken_string & strarr )
2017-05-02 07:49:23 +00:00
{
2021-04-22 22:23:28 +02:00
const TString tipodoc = strarr . get ( _codnum ) ;
TRectype mov = cache ( ) . get ( LF_MOV , strarr . get ( _numero ) ) ;
2021-04-30 17:17:09 +02:00
TCausale caus = cached_causale ( mov . get ( " CODCAUS " ) , mov . get_int ( " ANNOIVA " ) ) ;
2017-06-30 12:57:07 +00:00
// Le autofatture possono essere solo di tipo TDO1 e le bolle doganali nel dubbio pure
2017-10-16 12:27:34 +00:00
if ( tipodoc = = " AF " | | tipodoc = = " BD " | | tipodoc = = " FF " | | tipodoc = = " FV " | | tipodoc = = " FS " )
2017-06-28 13:09:56 +00:00
return " TD01 " ;
2017-10-02 08:56:31 +00:00
else if ( tipodoc = = " FA " )
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 ) ;
2021-04-22 22:23:28 +02:00
TRectype filter ( r_moviva . curr ( ) ) ; filter . put ( " NUMREG " , strarr . get ( _numero ) ) ;
2017-06-23 13:30:54 +00:00
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
2021-04-30 17:17:09 +02:00
TToken_string keyAssoc = row . get ( " CODIVA " ) ;
keyAssoc . add ( row . get ( " GRUPPO " ) ) ;
keyAssoc . add ( row . get ( " CONTO " ) ) ;
keyAssoc . add ( row . get ( " SOTTOCONTO " ) ) ;
real * imp = ( real * ) intraval . objptr ( keyAssoc ) ;
if ( imp = = nullptr )
intraval . add ( keyAssoc , imp = new real ) ;
* imp + = importo ;
2017-06-23 13:30:54 +00:00
}
// Adesso che ho tutti i totali divisi per CODIVA e GCS vado a pescare il valore maggiore
2021-04-30 17:17:09 +02:00
TToken_string keyMax ;
real max ;
2017-06-23 13:30:54 +00:00
TString_array keys ;
2021-04-30 17:17:09 +02:00
2017-06-23 13:30:54 +00:00
intraval . get_keys ( keys ) ;
for ( int i = 0 ; i < keys . items ( ) ; i + + )
{
2021-04-30 17:17:09 +02:00
const TToken_string & key = keys . row ( i ) ;
real imp = * ( ( real * ) intraval . objptr ( key ) ) ;
if ( imp > max )
2017-06-23 13:30:54 +00:00
{
keyMax = key ;
2021-04-30 17:17:09 +02:00
max = imp ;
2017-06-23 13:30:54 +00:00
}
}
// Una volta che ho trovato il nostro vincitore vado a prendere il tipo di fattura dal GCS
2021-04-30 17:17:09 +02:00
TToken_string key_p_con = keyMax ;
key_p_con . destroy ( 0 ) ;
2019-03-07 18:11:41 +01:00
if ( cache ( ) . get ( LF_PCON , key_p_con , " RICSER " ) = = " 1 " )
2017-06-23 13:30:54 +00:00
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 ( ) ) ;
2021-04-22 22:23:28 +02:00
filter . put ( " NUMREG " , strarr . get ( _numero ) ) ;
2017-07-20 14:39:52 +00:00
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 */
2019-03-07 18:11:41 +01:00
bool save_rec ( TToken_string row , const bool esportato )
2017-05-02 07:49:23 +00:00
{
2017-06-30 12:57:07 +00:00
static TLocalisamfile trasfatt ( LF_TRASFATT ) ;
2017-08-23 07:53:29 +00:00
static TLocalisamfile mov ( LF_MOV ) ;
2017-10-05 14:23:59 +00:00
static TString invio ; invio . cut ( 0 ) ;
static TString key ; key . cut ( 0 ) < < row . get ( _numero ) < < " | " < < row . get ( _aliquota ) ;
2017-07-18 09:49:17 +00:00
2019-03-07 18:11:41 +01:00
TRectype r_cust = cache ( ) . get ( LF_TRASFATT , key ) ;
2017-07-18 09:49:17 +00:00
// Se la riga non esiste metto la chiave
2019-03-07 18:11:41 +01:00
if ( r_cust . empty ( ) )
2017-06-30 12:57:07 +00:00
{
2019-03-07 18:11:41 +01:00
r_cust . put ( " NUMREG " , row . get ( _numero ) ) ;
2017-06-30 12:57:07 +00:00
}
2019-03-07 18:11:41 +01:00
r_cust . put ( " TIPO " , row . get ( _tipocf ) ) ;
2019-03-11 11:37:21 +01:00
r_cust . put ( " CODCF " , row . get ( _codcf ) ) ;
r_cust . put ( " OCCAS " , row . get ( _occas ) ) ;
r_cust . put ( " TIPODOC " , row . get ( _codnum ) ) ;
r_cust . put ( " TIPODOCAE " , row . get ( _codnumAE ) ) ;
2019-03-07 18:11:41 +01:00
r_cust . put ( " NUMDOC " , row . get ( _numdoc ) ) ;
2019-03-11 11:37:21 +01:00
r_cust . put ( " DATAREG " , row . get ( _datareg ) ) ;
r_cust . put ( " DATADOC " , row . get ( _datadoc ) ) ;
2019-03-07 18:11:41 +01:00
r_cust . put ( " IMPONIBILE " , row . get ( _imponibile ) ) ;
2019-03-11 11:37:21 +01:00
r_cust . put ( " IMPOSTA " , row . get ( _importoIVA ) ) ;
2019-03-07 18:11:41 +01:00
r_cust . put ( " CODIVA " , row . get ( _aliquota ) ) ;
r_cust . put ( " NATURA " , row . get ( _natura ) ) ;
r_cust . put ( " AUTOFATT " , row . get ( _autofatt ) ) ;
2017-06-30 12:57:07 +00:00
if ( esportato )
{
2017-10-05 14:23:59 +00:00
invio < < " I " ;
2019-03-07 18:11:41 +01:00
r_cust . put ( " TFDATA " , TDate ( TODAY ) ) ;
2017-06-30 12:57:07 +00:00
}
2017-10-05 14:23:59 +00:00
else
{
invio < < row . get ( _invio ) ;
}
2019-03-07 18:11:41 +01:00
r_cust . put ( " TFINVIO " , invio ) ;
2017-10-05 14:23:59 +00:00
2019-03-07 18:11:41 +01:00
return r_cust . write_rewrite ( trasfatt ) = = NOERR ;
2017-05-02 07:49:23 +00:00
}
2019-03-07 18:11:41 +01:00
inline const char * no_special ( const 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-09-27 15:05:24 +00:00
TTrFa_mask & msk ( )
{
2019-03-07 18:11:41 +01:00
static TTrFa_mask * msk = nullptr ;
if ( msk = = nullptr )
2017-09-27 15:05:24 +00:00
msk = new TTrFa_mask ( " tf0100a " ) ;
return * msk ;
2017-09-27 08:32:28 +00:00
}
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
{
2019-03-07 18:11:41 +01:00
tmp2 . cut ( 0 ) < < tmp . left ( a ) < < no_special ( speciali [ i ] ) < < tmp . mid ( a + 1 ) ;
2017-07-25 13:15:55 +00:00
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 )
{
2019-03-07 18:11:41 +01:00
_log_tff = msg ;
2017-05-02 07:49:23 +00:00
} else
if ( _log = = NULL )
{
_log = new TLog_report ;
2019-03-07 18:11:41 +01:00
if ( _log_tff . full ( ) )
2017-05-02 07:49:23 +00:00
{
TString txt ;
2019-03-07 18:11:41 +01:00
txt < < _log_tff < < " : " < < msg ;
2017-05-02 07:49:23 +00:00
_log - > log ( severity , txt ) ;
}
else
_log - > log ( severity , msg ) ;
}
}
2021-04-22 22:23:28 +02:00
bool TTrFa_app : : display_log ( )
2017-05-02 07:49:23 +00:00
{
bool ok = true ;
if ( _log )
{
_log - > preview ( ) ;
2021-04-22 22:23:28 +02:00
safe_delete ( _log ) ;
2017-05-02 07:49:23 +00:00
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 ;
2021-01-21 23:20:57 +01:00
bool modified = false ;
TToken_string field_list ( " " , ' , ' ) ;
const bool new_table = ! xvt_sql_table_exists ( _db , table ) ;
streampos cur_pos = tff . pos ( ) ;
if ( ! new_table )
2017-05-02 07:49:23 +00:00
{
SLIST fields = xvt_sql_list_fields ( _db , table ) ;
2021-01-21 23:20:57 +01:00
while ( ! modified & & ! tff . eof ( ) )
2017-05-02 07:49:23 +00:00
{
const TString & line = tff . line ( ) ;
const int n = parse_line ( line , var , val ) ;
2021-01-21 23:20:57 +01:00
2017-05-02 07:49:23 +00:00
if ( n < = 0 )
break ;
if ( var . starts_with ( " INDEX_ " ) )
break ;
if ( xvt_slist_find_str ( fields , var ) = = NULL )
{
2021-01-22 00:57:36 +01:00
2021-01-21 23:20:57 +01:00
modified = true ;
2017-05-02 07:49:23 +00:00
}
2021-01-21 23:20:57 +01:00
else
modified = ( val ! = xvt_sql_field_type ( _db , table , var ) ) ;
}
if ( modified )
{
const int nfields = xvt_slist_count ( fields ) ;
for ( SLIST_ELT field = xvt_slist_get_first ( fields ) ; field ! = nullptr ; field = xvt_slist_get_next ( fields , field ) )
field_list . add ( field - > str ) ;
2017-05-02 07:49:23 +00:00
}
xvt_slist_destroy ( fields ) ;
2021-01-21 23:20:57 +01:00
if ( modified )
{
query = " ALTER TABLE " ;
query < < table < < " RENAME TO " < < table < < " _OLD; " ;
xvt_sql_execute ( _db , query , NULL , NULL ) ; // rename table table
query = " DROP INDEX " ;
query < < table < < " _1; " ;
xvt_sql_execute ( _db , query , NULL , NULL ) ; // rename table table
tff . setpos ( cur_pos ) ;
}
2017-05-02 07:49:23 +00:00
}
2021-01-21 23:20:57 +01:00
if ( new_table | | modified )
2017-05-02 07:49:23 +00:00
{
2021-01-21 23:20:57 +01:00
query = " CREATE TABLE " ; query < < table < < " ( " ;
2017-05-02 07:49:23 +00:00
while ( ! tff . eof ( ) )
{
const TString & line = tff . line ( ) ;
const int n = parse_line ( line , var , val ) ;
2021-01-21 23:20:57 +01:00
2017-05-02 07:49:23 +00:00
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
2021-01-21 23:20:57 +01:00
query = " CREATE UNIQUE INDEX " ;
query < < table < < " _1 ON " < < table
2017-05-02 07:49:23 +00:00
< < " ( " < < 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 < < " , " ;
}
}
2021-01-21 23:20:57 +01:00
if ( modified )
{
query = " INSERT INTO " ;
query < < table < < " ( " < < field_list
< < " ) SELECT " < < field_list < < " FROM "
< < table < < " _OLD; " ;
xvt_sql_execute ( _db , query , NULL , NULL ) ; // rename table table
query = " DROP TABLE " ;
query < < table < < " _OLD; " ;
xvt_sql_execute ( _db , query , NULL , NULL ) ; // rename table table
}
2017-05-02 07:49:23 +00:00
}
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 ) ;
2018-02-05 14:32:06 +00:00
bool create = ! _dbname . exist ( ) ;
2017-05-02 07:49:23 +00:00
_db = xvt_sql_open ( _dbname , user ( ) , " " , _dbname . path ( ) ) ;
if ( _db = = NULL )
return false ;
2017-12-13 14:26:18 +00:00
// Questa funzione crea/verifica il DB
2019-03-07 18:11:41 +01:00
verify_db ( create ) ;
2017-07-13 12:27:06 +00:00
2019-02-11 14:12:10 +01:00
// Setto se ha il modulo FP
msk ( ) . set_has_fp ( has_module ( FPAUT ) ) ;
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
2019-03-07 18:11:41 +01:00
bool TTrFa_app : : syncronize_db ( )
2017-05-02 07:49:23 +00:00
{
//xvt_sql_begin(_db);
return true ;
}
2019-03-07 18:11:41 +01:00
bool TTrFa_app : : verify_db ( const bool create )
2017-05-02 07:49:23 +00:00
{
const TFilename ini = " tff.ini " ;
bool ok = ini . exist ( ) ;
if ( ok )
{
xvt_sql_begin ( _db ) ;
2019-03-07 18:11:41 +01:00
TScanner tff ( ini ) ;
while ( ok & & ! tff . eof ( ) )
2017-05-02 07:49:23 +00:00
{
2019-03-07 18:11:41 +01:00
const TString & p = tff . line ( ) ;
2017-05-02 07:49:23 +00:00
if ( p . starts_with ( " [TF " ) & & p . ends_with ( " F] " ) )
{
TString16 table = p ; table . strip ( " [] " ) ;
2019-03-07 18:11:41 +01:00
ok = create_table ( tff , table ) ;
2017-05-02 07:49:23 +00:00
}
}
2017-12-13 14:26:18 +00:00
if ( ok & & create )
2017-06-28 13:09:56 +00:00
{
// 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
2018-02-05 14:32:06 +00:00
{
2017-05-02 07:49:23 +00:00
xvt_sql_rollback ( _db ) ;
2018-02-05 14:32:06 +00:00
fatal_box ( " Fallita la creazione/aggiornamento del Database " ) ;
}
2017-05-02 07:49:23 +00:00
}
else
return cantread_box ( ini ) ;
return true ;
}
2019-03-07 18:11:41 +01:00
bool TTrFa_app : : copy_ssa ( )
2017-07-13 12:27:06 +00:00
{
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 )
{
2017-08-22 07:56:40 +00:00
warning_box ( FR ( " Nella cartella %s deve essere presente un file .ssa, ModuliSirio non <20> abilitato. " ) , SPESOMETROBASE ) ;
2017-07-13 12:27:06 +00:00
}
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
2019-03-07 18:11:41 +01:00
const bool first = ini_get_bool ( CONFIG_DITTA , " tf " , " FirstExec " , true ) ;
2017-06-23 13:30:54 +00:00
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? " ) )
{
2019-03-07 18:11:41 +01:00
TExternal_app check_app ( " cg1 -2 L " ) ;
check_app . 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
2020-09-17 17:09:13 +02: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
{
2019-03-07 18:11:41 +01:00
if ( set_esportato ( sheet ) )
2017-07-13 12:27:06 +00:00
message_box ( " Record segnati correttamente! " ) ;
else
message_box ( " Ci sono stati degli errori durante la riscrittura dei records " ) ;
2019-03-07 18:11:41 +01:00
msk - > set_filter_changed ( ) ;
2017-07-13 12:27:06 +00:00
}
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
2019-03-07 18:11:41 +01:00
TString TTrFa_app : : get_key ( TToken_string * strarr )
2017-06-23 13:30:54 +00:00
{
return strarr - > get_char ( _tipocf ) = = ' C ' ? DTE_PROVV : DTR_PROVV ;
}
2017-05-02 07:49:23 +00:00
2019-03-07 18:11:41 +01:00
TString TTrFa_app : : get_header ( TToken_string * strarr )
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)
2019-03-07 18:11:41 +01:00
static long int id_header = 0L ;
2017-06-23 13:30:54 +00:00
// Cerco/Aggiungo il Clifo all'std::map
2019-03-07 18:11:41 +01:00
static TString key_map ; key_map . cut ( 0 ) ;
2017-09-27 08:32:28 +00:00
static TString tipocf , codcf , occas ;
tipocf . cut ( 0 ) ; codcf . cut ( 0 ) ; occas . cut ( 0 ) ;
2017-09-12 07:34:07 +00:00
// Controlli per bolladog
if ( strcmp ( strarr - > get ( _codnum ) , " BD " ) = = 0 )
{
tipocf = " F " ;
codcf = cache ( ) . get ( LF_MOV , strarr - > get_long ( _numero ) , " CFBOLLADOG " ) ;
if ( codcf . blank ( ) )
codcf . cut ( 0 ) < < strarr - > get ( _codcf ) ;
}
else
{
tipocf < < strarr - > get_char ( _tipocf ) ;
codcf < < strarr - > get ( _codcf ) ;
2017-09-27 08:32:28 +00:00
occas < < strarr - > get ( _occas ) ;
2017-09-12 07:34:07 +00:00
}
2019-03-07 18:11:41 +01:00
key_map < < tipocf < < " | " < < codcf < < " | " < < occas ;
2017-09-12 07:34:07 +00:00
2019-03-07 18:11:41 +01:00
clifo_doc app ;
2017-06-30 08:49:03 +00:00
// Non <20> presente e lo inserisco per la chiave body
2019-03-07 18:11:41 +01:00
if ( _m_cli_doc . find ( key_map ) = = _m_cli_doc . end ( ) )
2017-06-23 13:30:54 +00:00
{
2019-03-07 18:11:41 +01:00
id_header + + ;
app . _cont_cli_fo = id_header ;
app . _count_doc = 0L ;
_m_cli_doc . insert ( std : : pair < TString , clifo_doc > ( key_map , app ) ) ;
2017-05-02 07:49:23 +00:00
}
2017-09-27 08:32:28 +00:00
static TString header ;
2019-03-07 18:11:41 +01:00
static TString format_string ; format_string . cut ( 0 ) < < " %c%0 " ;
2017-09-27 08:32:28 +00:00
if ( occas . blank ( ) )
{
2019-03-07 18:11:41 +01:00
format_string < < 13 - codcf . len ( ) < < " d " ;
header . format ( format_string , tipocf [ 0 ] , 0 ) ;
2017-09-27 08:32:28 +00:00
header < < codcf ; // Perch<63> cazzo non va il %s!?
}
else
{
2019-03-07 18:11:41 +01:00
format_string < < 13 - occas . len ( ) < < " d " ;
header . format ( format_string , ' O ' , 0 ) ;
2017-09-27 08:32:28 +00:00
header < < occas ;
}
2017-06-23 13:30:54 +00:00
// Ritorno l'header
return header ;
}
2019-03-07 18:11:41 +01:00
TString TTrFa_app : : get_body ( TToken_string * strarr , bool add )
2017-06-23 13:30:54 +00:00
{
/* 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
*/
2019-03-07 18:11:41 +01:00
static TString key_map ; key_map . cut ( 0 ) < < strarr - > get_char ( _tipocf ) < < " | " < < strarr - > get_int ( _codcf ) < < " | " < < strarr - > get ( _occas ) ;
2017-06-23 13:30:54 +00:00
2019-03-07 18:11:41 +01:00
clifo_doc app = _m_cli_doc [ key_map ] ;
static TString num_doc ; num_doc . cut ( 0 ) < < strarr - > get ( _numdoc ) < < " | " < < TDate ( strarr - > get ( _datadoc ) ) . year ( ) ;
2017-06-28 13:09:56 +00:00
if ( add )
2017-09-21 14:07:17 +00:00
{
2019-03-07 18:11:41 +01:00
app . _count_doc + = 1 ;
app . _doc_id . insert ( std : : pair < TString , long > ( num_doc , app . _count_doc ) ) ;
2017-09-21 14:07:17 +00:00
}
2019-03-07 18:11:41 +01:00
_m_cli_doc [ key_map ] = app ;
2017-06-23 13:30:54 +00:00
2019-03-07 18:11:41 +01:00
static TString body ; body . format ( " %07d%07d " , app . _cont_cli_fo , app . _doc_id [ num_doc ] ) ;
2017-06-23 13:30:54 +00:00
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 ) )
{
2019-03-07 18:11:41 +01:00
const bool sent = dte . get ( " P1_KEYPRGINVIO " ) . as_string ( ) = = DTE_PROVV ;
2017-06-29 15:27:59 +00:00
if ( sent )
{
2019-03-07 18:11:41 +01:00
static const TString msg = " <EFBFBD> presente un'altra esportazione non ancora elaborata vuoi eliminarla?" ;
2017-06-29 15:27:59 +00:00
if ( yesno_box ( msg ) )
{
2019-03-07 18:11:41 +01:00
if ( ! empty_tables ( DTE_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
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 ) )
{
2019-03-07 18:11:41 +01:00
const bool sent = dtr . get ( " P1_KEYPRGINVIO " ) . as_string ( ) = = DTR_PROVV ;
static const TString msg = " <EFBFBD> presente un'altra esportazione non ancora elaborata vuoi eliminarla?" ;
2017-06-29 15:27:59 +00:00
if ( sent )
{
if ( yesno_box ( msg ) )
{
2019-03-07 18:11:41 +01:00
if ( ! empty_tables ( 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
2019-03-07 18:11:41 +01:00
bool TTrFa_app : : tff0200 ( const TString & key )
2017-06-23 13:30:54 +00:00
{
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
2019-03-07 18:11:41 +01:00
_myrfso = " " ;
if ( have_rfso ( _myrfso ) )
2017-05-02 07:49:23 +00:00
{
2019-03-07 18:11:41 +01: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.
2017-09-21 14:07:17 +00:00
std : : map < TString , bool > clifoSent ;
2017-06-23 13:30:54 +00:00
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-09-12 07:34:07 +00:00
static TString checkClifo ; checkClifo . cut ( 0 ) ;
// Per le bolle doganali devo fare sempre questo giro
2019-03-19 11:10:37 +01:00
bool found_bolla = strcmp ( strarr - > get ( _codnum ) , " BD " ) = = 0 , found_bolla_cli = false ;
2017-09-27 09:36:23 +00:00
static TString cfbolladog ;
2019-03-19 11:10:37 +01:00
if ( found_bolla )
2017-09-12 07:34:07 +00:00
{
2017-09-27 09:36:23 +00:00
// Attenzione! Se <20> una riga inserita a mano dall'utente prendo lo stesso il fornitore della riga!
cfbolladog = strarr - > get_int ( _numero ) < MOV_CUSTOM ? cache ( ) . get ( LF_MOV , strarr - > get_long ( _numero ) , " CFBOLLADOG " ) : strarr - > get ( _codcf ) ;
2017-09-12 07:34:07 +00:00
if ( ! cfbolladog . blank ( ) )
{
2019-03-19 11:10:37 +01:00
found_bolla_cli = true ;
2017-09-12 07:34:07 +00:00
checkClifo < < " F " < < cfbolladog ;
}
}
2019-03-19 11:10:37 +01:00
if ( ! found_bolla_cli )
2017-09-12 07:34:07 +00:00
{
2017-09-27 08:32:28 +00:00
static TString tempOcfpi ; tempOcfpi . cut ( 0 ) < < strarr - > get ( _occas ) ;
if ( tempOcfpi . blank ( ) )
checkClifo < < strarr - > get_char ( _tipocf ) < < " | " < < strarr - > get_long ( _codcf ) ;
else
checkClifo < < strarr - > get_char ( _tipocf ) < < " | " < < strarr - > get ( _occas ) ;
2017-09-12 07:34:07 +00:00
}
2017-06-23 13:30:54 +00:00
// Controllo il clifo, se non c'<27> lo aggiungo altrimenti salto sto giro
2017-09-21 14:07:17 +00:00
if ( clifoSent . find ( checkClifo ) = = clifoSent . end ( ) )
clifoSent . insert ( std : : pair < TString , bool > ( checkClifo , true ) ) ;
2017-06-23 13:30:54 +00:00
else
continue ;
2017-09-12 07:34:07 +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
2018-05-24 08:33:51 +00:00
if ( vtipocf . as_string ( ) = = " F " & & ( vcodcf . as_string ( ) = = " 55 " | | vcodcf . as_string ( ) = = " 45 " ) )
//if(voccas.as_string().full())
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
2019-03-19 11:10:37 +01:00
if ( found_bolla_cli )
2017-07-17 08:15:41 +00:00
{
2017-09-27 09:36:23 +00:00
r_cedeprest = getCli ( " F " , cfbolladog , " " ) ;
2017-09-08 07:19:29 +00:00
cedeprest . init ( r_cedeprest ) ;
2017-07-17 08:15:41 +00:00
}
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 " ) ;
2019-03-07 18:11:41 +01:00
tff0400f . set ( " P4_KEYPRGINVIO " , get_key ( strarr ) ) ;
tff0400f . set ( " P4_KEYHEADERFATT " , get_header ( 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 ( ) ) ;
}
2017-09-27 09:36:23 +00:00
else // Fattura normale, lascio pi<70> volte la funzione con il nome del campo per leggibilit<69>
2017-06-23 13:30:54 +00:00
{
2019-03-19 11:10:37 +01:00
// Se la bolla doganale non ha un fornitore collegato posso passare come P.IVA OO99999999999
if ( found_bolla & & ! found_bolla_cli )
2017-09-27 09:36:23 +00:00
{
tff0400f . set ( " P4_FISCIVAPAESE " , " OO " ) ;
tff0400f . set ( " P4_FISCIVACOD " , " 99999999999 " ) ;
}
2018-05-24 08:33:51 +00:00
else if ( cedeprest . stato_partita_IVA ( ) . full ( ) & & cedeprest . partita_IVA ( ) . full ( )
& & ( cedeprest . partita_IVA ( ) [ 0 ] ! = ' 8 ' & & cedeprest . partita_IVA ( ) [ 0 ] ! = ' 9 ' | | ! cedeprest . italiano ( ) ) )
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-09-27 09:36:23 +00:00
// Se <20> un estero non CEE prendo nella partita IVA metto l'identificativo fiscale
if ( cedeprest . estero_non_CEE ( ) )
2017-07-10 14:16:23 +00:00
{
2017-09-27 09:36:23 +00:00
tff0400f . set ( " P4_FISCIVAPAESE " , cedeprest . stato_partita_IVA ( ) ) ;
tff0400f . set ( " P4_FISCIVACOD " , cedeprest . codice_fiscale ( ) ) ;
2017-07-10 14:16:23 +00:00
}
else
2017-07-18 09:49:17 +00:00
{
2017-09-27 09:36:23 +00:00
tff0400f . set ( " P4_CODFISC " , cedeprest . codice_fiscale ( ) ) ;
2017-07-18 09:49:17 +00:00
}
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
2017-10-04 10:17:55 +00:00
int tipo = cedeprest . inserimento_in_allegato ( ) ; //r_cedeprest.get_char(CLI_ALLEG);
bool rsoc = cedeprest . giuridica ( ) | | ( tipo = = 3 | | tipo = = 7 | | tipo = = 8 | | tipo = = 0 ) ;
bool privato = tipo = = 6 | | ( cedeprest . estero ( ) & & cedeprest . fisica ( ) ) ;
2017-09-27 09:36:23 +00:00
2019-03-19 11:10:37 +01:00
if ( found_bolla & & ! found_bolla_cli )
2017-09-27 09:36:23 +00:00
{
tff0400f . set ( " P4_ANADENOM " , " Dato Assente " ) ;
}
else 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
2017-09-27 09:36:23 +00:00
// Devo trovare rsoc e:
// 1 - Non trovo la bolla
// 2 - Trovo il cliente
2019-03-19 11:10:37 +01:00
if ( rsoc & & ( ! found_bolla | | found_bolla_cli ) )
2017-07-17 08:15:41 +00:00
{
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
2017-09-21 14:07:17 +00:00
std : : map < TString , bool > fattSent ;
std : : map < TString , long > docRighe ;
2017-06-23 13:30:54 +00:00
bool ok = true ;
2017-06-28 13:09:56 +00:00
TProgress_monitor p ( sheet . items ( ) , " Caricamento Fatture " ) ;
TString oldKey = " " ;
int numRiga ;
2017-09-21 14:07:17 +00:00
2017-06-28 13:09:56 +00:00
2017-06-23 13:30:54 +00:00
FOR_EACH_SHEET_ROW ( sheet , r , strarr )
2017-05-02 07:49:23 +00:00
{
2017-09-21 14:07:17 +00:00
# ifdef DBG
2017-09-27 15:05:24 +00:00
if ( strarr - > get_char ( _tipocf ) = = ' F ' & & strarr - > get_long ( _codcf ) = = 3 )
2017-09-21 14:07:17 +00:00
bool tolla = true ;
# endif
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-08-29 13:24:37 +00:00
// Chiave: Tipo C/F, Cod C/F, Numero doc. anno doc
2017-09-21 14:07:17 +00:00
static TString checkFatt ;
2017-09-27 08:32:28 +00:00
static TString codcf ;
// Prendo il cliente occasionale se c'<27>
codcf . cut ( 0 ) < < strarr - > get ( _occas ) ;
if ( codcf . blank ( ) )
codcf . cut ( 0 ) < < strarr - > get ( _codcf ) ;
checkFatt . cut ( 0 ) < < codcf < < " , " < < strarr - > get ( _numdoc ) < < " , " < < TString ( strarr - > get ( _datadoc ) ) . right ( 4 ) ;
2017-09-21 14:07:17 +00:00
if ( fattSent . find ( checkFatt ) = = fattSent . end ( ) )
2017-06-23 13:30:54 +00:00
{
2017-09-21 14:07:17 +00:00
fattSent . insert ( std : : pair < TString , bool > ( checkFatt , true ) ) ;
2017-06-23 13:30:54 +00:00
// <DatiFatturaBody>
TTrFa_record tff0700f ( " TFF0700F " ) ;
2019-03-07 18:11:41 +01:00
tff0700f . set ( " P7_KEYPRGINVIO " , get_key ( strarr ) ) ;
2017-12-27 11:01:20 +00:00
static TString header ;
2019-03-07 18:11:41 +01:00
header . cut ( 0 ) < < get_header ( strarr ) ;
2017-12-27 11:01:20 +00:00
tff0700f . set ( " P7_KEYHEADERFATT " , header ) ;
2019-03-07 18:11:41 +01:00
tff0700f . set ( " P7_KEYBODYFATT " , get_body ( strarr ) ) ;
2017-06-23 13:30:54 +00:00
2017-07-18 09:49:17 +00:00
TString natura = strarr - > get ( _natura ) ;
2018-02-09 12:00:52 +00:00
tff0700f . set ( " P7_TIPODOC " , strarr - > get ( _codnumAE ) ) ;
2017-07-24 09:50:05 +00:00
// Controllo il tipo di esigilit<69>
2019-03-07 18:11:41 +01:00
tff0700f . set ( " P7_DATA " , to_date ( strarr - > get ( _datadoc ) ) ) ;
2017-12-27 11:01:20 +00:00
static TString ndoc ;
2018-02-08 12:00:51 +00:00
ndoc . cut ( 0 ) < < cache ( ) . get ( LF_MOV , strarr - > get ( _numero ) , " NUMDOCEXT " ) . right ( 20 ) ;
2017-12-27 11:01:20 +00:00
if ( ndoc . blank ( ) )
ndoc . cut ( 0 ) < < strarr - > get ( _numdoc ) ;
tff0700f . set ( " P7_NUMERO " , ndoc ) ;
2019-03-07 18:11:41 +01:00
tff0700f . set ( " P7_DATAREG " , to_date ( strarr - > get ( _datareg ) ) ) ; // Obbligatoria nei DTR
2017-06-23 13:30:54 +00:00
tff0700f . set ( " P7_GESTIONE " , " " ) ;
2017-12-27 11:01:20 +00:00
// Campi di controllo
tff0700f . set ( " P7_CLIFOR " , header ) ;
tff0700f . set ( " P7_NRODOC " , ndoc ) ;
2019-03-07 18:11:41 +01:00
tff0700f . set ( " P7_DTADOC " , to_date ( strarr - > get ( _datadoc ) ) ) ;
2017-12-27 11:01:20 +00:00
2017-06-23 13:30:54 +00:00
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!
2019-03-07 18:11:41 +01:00
static TString newKey ; newKey . cut ( 0 ) < < get_body ( strarr , false ) ;
2017-09-21 14:07:17 +00:00
if ( docRighe . find ( newKey ) = = docRighe . end ( ) )
2017-06-28 13:09:56 +00:00
{
2017-09-21 14:07:17 +00:00
numRiga = 1 ;
docRighe . insert ( std : : pair < TString , long > ( newKey , numRiga ) ) ;
2017-06-28 13:09:56 +00:00
}
else
2017-09-21 14:07:17 +00:00
{
// Incremento e aggiorno
numRiga = docRighe [ newKey ] + 1 ;
docRighe [ newKey ] = numRiga ;
}
2017-06-28 13:09:56 +00:00
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 " ) ;
2019-03-07 18:11:41 +01:00
tff2200f . set ( " PL_KEYPRGINVIO " , get_key ( strarr ) ) ;
tff2200f . set ( " PL_KEYHEADERFATT " , get_header ( strarr ) ) ;
tff2200f . set ( " PL_KEYBODYFATT " , get_body ( 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 ) ) ;
2017-08-29 12:31:55 +00:00
/* Tutto disabilitato! *************************************
2017-06-23 13:30:54 +00:00
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-08-29 12:31:55 +00:00
tff2200f . set ( " PL_DETRAIBILE " , CENTO - 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 " ) ;
}
2017-08-29 12:31:55 +00:00
*/
2017-06-23 13:30:54 +00:00
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 " ) ;
2019-03-07 18:11:41 +01:00
tff3100f . set ( " PH_KEYPRGINVIO " , get_key ( strarr ) ) ;
tff3100f . set ( " PH_KEYHEADERFATT " , get_header ( strarr ) ) ;
2017-06-23 13:30:54 +00:00
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
2017-09-12 07:34:07 +00:00
TString paiv = rfso . partita_IVA ( ) , ragsoc , nom , cog ;
ragsoc = rfso . ragione_sociale ( ) ;
if ( ragsoc . blank ( ) )
{
nom = rfso . nome ( ) ,
cog = rfso . cognome ( ) ;
}
2017-07-10 14:16:23 +00:00
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
}
2019-03-07 18:11:41 +01:00
bool TTrFa_app : : set_esportato ( 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
{
2019-03-07 18:11:41 +01:00
ok = save_rec ( * strarr , true ) ;
2017-06-23 13:30:54 +00:00
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
}
2019-03-07 18:11:41 +01:00
bool TTrFa_app : : empty_tables ( TString key )
2017-06-29 15:27:59 +00:00
{
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
2019-03-07 18:11:41 +01:00
if ( ! copy_ssa ( ) ) return ;
2017-10-04 10:17:55 +00:00
2017-09-27 08:32:28 +00:00
while ( msk ( ) . run ( ) = = K_ENTER )
2017-05-02 07:49:23 +00:00
{
2019-03-07 18:11:41 +01:00
if ( msk ( ) . check_not_empty ( ) )
2017-07-25 13:15:55 +00:00
{
2017-09-27 08:32:28 +00:00
send ( & msk ( ) ) ;
2017-07-14 10:49:00 +00:00
//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
}
}
2020-09-17 17:09:13 +02:00
bool TTrFa_app : : is_new_tipodoc ( const TString & tipodoc )
{
return tipodoc ! = " TD01 " & & tipodoc ! = " TD04 " & & tipodoc ! = " TD05 " & & tipodoc ! = " TD07 " & & tipodoc ! = " TD08 " & & tipodoc ! = " TD10 " & & tipodoc ! = " TD11 " ;
}
bool TTrFa_app : : is_new_natura ( const TString & natura )
{
return natura . full ( ) & & natura ! = " N1 " & & natura ! = " N2 " & & natura ! = " N3 " & & natura ! = " N4 " & & natura ! = " N5 " & & natura ! = " N6 " & & natura ! = " N7 " ;
}
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 ;
}