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-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
2017-06-23 13:30:54 +00:00
TRectype getTrasFatt ( TString reg , TString codiva )
{
TString key = reg ; key < < " | " < < codiva ;
return cache ( ) . get ( LF_TRASFATT , key ) ;
}
TRectype getCli ( TString tipocf , TString codcf )
{
if ( tipocf ! = " O " )
{
TString key = tipocf ; key < < " | " < < codcf ;
return cache ( ) . get ( LF_CLIFO , key ) ;
}
// Cliente occasionale!
else
{
TRectype cli ( LF_CLIFO ) ;
TRectype occas = cache ( ) . get ( LF_OCCAS , codcf ) ;
cli . put ( " RAGSOC " , occas . get ( " RAGSOC " ) ) ;
cli . put ( " CODRFSO " , " " ) ;
cli . put ( " PAIV " , occas . get ( " PAIV " ) ) ;
cli . put ( " COFI " , occas . get ( " COFI " ) ) ;
return cli ;
}
}
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-06-23 13:30:54 +00:00
// Controlla se l'azienda ha un RFSO
2017-07-10 14:16:23 +00:00
bool haveRFSO ( TString & codrfso )
2017-05-02 07:49:23 +00:00
{
codrfso = cache ( ) . get ( LF_NDITTE , prefix ( ) . firm ( ) . codice ( ) , " CODRFSO " ) ;
if ( codrfso = = " " ) return false ;
return true ;
}
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 " ;
else
return tipodoc ;
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-06-23 13:30:54 +00:00
// Devo inserire la riga in trasfatt
2017-06-30 12:57:07 +00:00
TRectype rCust ( LF_TRASFATT ) ;
if ( strcmp ( row . get ( _spedita ) , " X " ) = = 0 ) // Controllo che non sia gi<67> stata spedita prima
{
TString key = row . get ( _numero ) ; key < < " | " < < row . get ( _aliquota ) ;
rCust = cache ( ) . get ( LF_TRASFATT , key ) ;
}
// Controllo non si sa mai
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 )
{
rCust . put ( " TFINVIO " , true ) ;
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
}
/////////////////////////////////////////////////////////////////////////////////////
// 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 ( ) ;
}
return TSkeleton_application : : create ( ) ;
}
// 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 ;
}
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 )
{
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 ( ) ;
}
ini_set_bool ( CONFIG_DITTA , " tf " , " FirstExec " , false ) ;
}
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-06-29 15:27:59 +00:00
bool ok ;
2017-06-23 13:30:54 +00:00
// Testata
2017-06-29 15:27:59 +00:00
ok = tff0100 ( sheet ) ;
if ( ok )
{
// Anagrafica
ok = tff0400 ( sheet ) ;
if ( ok )
// Documenti
ok = tff0700 ( sheet ) ;
}
if ( ! ok )
2017-06-23 13:30:54 +00:00
{
log ( - 1 , " WTF!? " ) ;
xvt_sql_rollback ( _db ) ;
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? " ) )
setEsportato ( sheet ) ;
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 )
{
if ( strarr - > get_char ( _tipocf ) = = ' C ' )
cli = true ;
else
fo = true ;
if ( cli & fo ) break ;
}
// Metto qua il numero di telefono per dopo
2017-07-10 14:16:23 +00:00
TString80 tel ; tel < < firm . get ( " PTEL " ) < < firm . get ( " TEL " ) ;
2017-06-23 13:30:54 +00:00
bool ok = true ;
if ( cli )
{
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 ) ;
dte . set ( " P1_TRASMITTCOD " , _cofi ) ;
dte . set ( " P1_TIPOINVIO " , " DTE " ) ;
dte . set ( " P1_TELEFONO " , tel ) ;
2017-07-10 14:16:23 +00:00
dte . set ( " P1_MAIL " , firm . get ( " MAIL " ) ) ;
2017-06-23 13:30:54 +00:00
dte . set ( " P1_GESTIONE " , " " ) ;
ok = dte . insert ( ) ;
if ( ! ok ) return false ;
ok = tff0200 ( DTE_PROVV ) ;
if ( ! ok ) return false ;
}
if ( fo )
{
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 ) )
{
if ( ! emptyTables ( DTE_PROVV ) )
{
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 ) ;
dtr . set ( " P1_TRASMITTCOD " , _cofi ) ;
dtr . set ( " P1_TIPOINVIO " , " DTR " ) ;
dtr . set ( " P1_TELEFONO " , tel ) ;
2017-07-10 14:16:23 +00:00
dtr . set ( " P1_MAIL " , firm . get ( " MAIL " ) ) ;
2017-06-23 13:30:54 +00:00
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-10 14:16:23 +00:00
TString via = _ditta . via_residenza ( ) , cap = _ditta . CAP_residenza ( ) , nazione = _ditta . stato_residenzaISO ( ) ;
// Valori necessari, se non ci sono salto
if ( via . full ( ) & & cap . full ( ) & & nazione . full ( ) )
{
tff0200f . set ( " P2_SEDEIND " , via ) ;
tff0200f . set ( " P2_SEDENRCIVICO " , _ditta . civico_residenza ( ) ) ;
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 ) )
{
TRectype r_ana = cache ( ) . get ( LF_ANAG , TString ( myrfso [ 0 ] ) < < myrfso . sub ( 1 ) ) ;
if ( r_ana . get_char ( " TIPORFSO " ) = = ' S ' ) // Stabile Organizzazione
2017-07-10 14:16:23 +00:00
{
TAnagrafica rfso ( r_ana ) ;
//TAnagrafica rfso(LF_ANAG, myrfso[0], myrfso.sub(1));
TString via = rfso . via_residenza ( ) , cap = rfso . CAP_residenza ( ) , nazione = rfso . stato_residenzaISO ( ) ;
tff0200f . set ( " P2_STABORGIND " , via ) ;
tff0200f . set ( " P2_STABORGNRCIVICO " , rfso . civico_residenza ( ) ) ;
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-06-23 13:30:54 +00:00
TTrFa_record tff0300f ( " TFF0300F " ) ;
tff0300f . set ( " P3_KEYPRGINVIO " , key ) ;
2017-07-10 14:16:23 +00:00
tff0300f . set ( " P3_FISCIVAPAESE " , rfso . stato_residenzaISO ( ) ) ;
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 ;
if ( strcmp ( strarr - > get ( _invio ) , " X " ) ! = 0 ) continue ; // Non mi interessa se non <20> selezionata
// 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 ;
TAnagrafica cedeprest ( LF_CLIFO , strarr - > get_char ( _tipocf ) , strarr - > get_long ( _codcf ) ) ;
2017-06-28 13:09:56 +00:00
TString keyCedPrest ; keyCedPrest < < strarr - > get_char ( _tipocf ) < < " | " < < strarr - > get_long ( _codcf ) ;
2017-07-05 14:40:11 +00:00
2017-06-28 13:09:56 +00:00
TRectype r_cedeprest = cache ( ) . get ( LF_CLIFO , keyCedPrest ) ;
TString statocli = cache ( ) . get ( " %STA " , r_cedeprest . get ( " STATOCF " ) , " S10 " ) ;
// Se rimane vuoto <20> italiano
if ( statocli = = " " )
statocli = " IT " ;
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-10 14:16:23 +00:00
// Per le bolle doganali metto OO e 11 "9" in id paese e id fiscale iva
if ( strcmp ( strarr - > get ( _codnum ) , " BD " ) = = 0 )
2017-06-23 13:30:54 +00:00
{
2017-07-10 14:16:23 +00:00
tff0400f . set ( " P4_FISCIVAPAESE " , " OO " ) ;
tff0400f . set ( " P4_FISCIVACOD " , " 99999999999 " ) ;
2017-06-23 13:30:54 +00:00
}
else
{
2017-07-10 14:16:23 +00:00
if ( cedeprest . stato_partita_IVA ( ) . full ( ) & & cedeprest . partita_IVA ( ) . full ( ) )
{
tff0400f . set ( " P4_FISCIVAPAESE " , cedeprest . stato_partita_IVA ( ) ) ;
tff0400f . set ( " P4_FISCIVACOD " , cedeprest . partita_IVA ( ) ) ;
}
else
{
tff0400f . set ( " P4_CODFISC " , cedeprest . codice_fiscale ( ) ) ;
}
2017-06-23 13:30:54 +00:00
}
}
2017-05-02 07:49:23 +00:00
2017-07-05 14:40:11 +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 ) ;
bool rsoc = cedeprest . giuridica ( ) | | ( tipo = = ' 3 ' | | tipo = = ' 7 ' | | tipo = = ' 8 ' ) ;
bool privato = tipo = = ' 6 ' ;
if ( ! rsoc )
2017-05-02 07:49:23 +00:00
{
2017-07-05 14:40:11 +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 ( ) )
{
// La vita <20> bella faccio che scrivere
tff0400f . set ( " P4_ANANOME " , cedeprest . nome ( ) ) ;
tff0400f . set ( " P4_ANACOGNOME " , cedeprest . cognome ( ) ) ;
}
else
{
// Devo indovinare quale <20> il nome e il cognome
TToken_string nomeCog ( cedeprest . cognome ( ) , ' ' ) ; // Notare il separatore spazio
// Controllo se ho solo un nome e un cognome
if ( nomeCog . items ( ) < = 2 )
{
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 ) )
{
// 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 ) < < " " ;
tff0400f . set ( " P4_ANANOME " , cognome ) ;
tff0400f . set ( " P4_ANACOGNOME " , nome ) ;
}
else
rsoc = true ;
}
else
rsoc = true ;
}
}
2017-05-02 07:49:23 +00:00
}
2017-07-05 14:40:11 +00:00
// Ricontrollo!!!! rsoc potrebbe essere cambiato sopra
if ( rsoc )
2017-06-23 13:30:54 +00:00
{
tff0400f . set ( " P4_ANADENOM " , cedeprest . ragione_sociale ( ) ) ;
}
2017-07-10 14:16:23 +00:00
TString via = cedeprest . via_residenza ( ) , cap = cedeprest . CAP_residenza ( ) , nazione = cedeprest . stato_residenzaISO ( ) ;
// Valori necessari, se non ci sono salto
if ( via . full ( ) & & cap . full ( ) & & nazione . full ( ) )
{
tff0400f . set ( " P4_SEDEIND " , via ) ;
tff0400f . set ( " P4_SEDENRCIVICO " , cedeprest . civico_residenza ( ) ) ;
tff0400f . set ( " P4_SEDECAP " , cap ) ;
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 " , nazione ) ;
}
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 ( ) )
{
TRectype r_ana = cache ( ) . get ( LF_ANAG , TString ( myrfso [ 0 ] ) < < rfso . sub ( 1 ) ) ;
ok = tff3100 ( strarr , r_ana ) ;
}
// 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 ;
if ( strcmp ( strarr - > get ( _invio ) , " X " ) ! = 0 ) continue ; // Non mi interessa se non <20> selezionata
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 ) ) ;
tff0700f . set ( " P7_TIPODOC " , decodTipo ( strarr ) ) ;
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-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-10 14:16:23 +00:00
TString via = rfso . via_residenza ( ) , cap = rfso . CAP_residenza ( ) , nazione = rfso . stato_residenzaISO ( ) ;
tff3100f . set ( " PH_STABORGIND " , via ) ;
tff3100f . set ( " PH_STABORGNRCIVICO " , rfso . civico_residenza ( ) ) ;
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 ( ) ;
tff3100f . set ( " PH_FISCIVAPAESE " , rfso . stato_residenzaISO ( ) ) ;
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 ;
if ( strcmp ( strarr - > get ( _invio ) , " X " ) ! = 0 ) continue ; // Non mi interessa se non <20> selezionata
if ( strcmp ( strarr - > get ( _forzata ) , " X " ) = = 0 )
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-06-23 13:30:54 +00:00
row . put ( " TFINVIO " , " X " ) ;
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 ( )
{
TTrFa_mask msk ( " tf0100a " ) ;
while ( msk . run ( ) = = K_ENTER )
{
2017-06-23 13:30:54 +00:00
if ( msk . checkNotEmpty ( ) )
send ( & msk ) ;
2017-05-02 07:49:23 +00:00
}
}
bool TTrFa_app : : destroy ( )
{
if ( _cofi . full ( ) )
ini_set_string ( CONFIG_DITTA , " pa " , " TRASMITTCOD " , _cofi ) ;
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 ;
}