2019-02-08 17:18:16 +01:00
/////////////////////////////////////////////////////////////////////////////////////
// TPassive_mask
/////////////////////////////////////////////////////////////////////////////////////
# include "defmask.h"
# include "automask.h"
# include "applicat.h"
# include <progind.h>
# include "tsdb.h"
# include "fp0400a.h"
# include "fplib.h"
2019-02-14 22:56:23 +01:00
# include "sheet.h"
2019-02-22 15:14:05 +01:00
# include "execp.h"
# include "dongle.h"
2019-03-18 16:43:44 +01:00
# include <map>
2019-05-16 09:34:21 +02:00
# include "../f1/f1lib.h"
# include "../ba/bafrm.h"
2019-02-08 17:18:16 +01:00
2019-02-13 17:29:08 +01:00
enum
{
2019-02-22 15:14:05 +01:00
no_cf = - 14 , // Non trovato con cod. fisc. (se non ho nemmeno la p.iva)
2019-02-13 17:29:08 +01:00
no_match_cf = - 15 , // Trovato forn. ma il cod. fisc non corrisponde
2019-02-22 15:14:05 +01:00
no_forn = - 5 , // Non trovato forn. con p.iva
2019-02-13 17:29:08 +01:00
err_match_db = - 3 , // Salvato in db ma non corrisponde a un fornitore
2019-02-22 15:14:05 +01:00
saved_db = 0 , // Salvato già in db FPPRO
2019-02-13 17:29:08 +01:00
found_piva = 2 , // Lo trovo con p.iva
found_cf = 4 , // Non ho p.iva lo trovo con cod.fisc
} ;
2019-02-14 22:56:23 +01:00
enum { filtri = 0 , elenco_fe = 1 , elenco_err = 2 } ; // Enum per bottoni toolbar (numero pagina in cui mi trovo)
2019-02-08 17:18:16 +01:00
class TPassive_mask : public TAutomask
{
2019-05-16 09:34:21 +02:00
bool _f1 ;
2019-02-08 17:18:16 +01:00
protected :
2019-03-18 16:43:44 +01:00
bool _filter_changed ;
TFilename tmp_dir ;
struct TForn_err
{
int forn_code ;
int fatt_err ;
} ;
std : : map < TString , TForn_err > _list_fatt_err ;
2019-02-08 17:18:16 +01:00
void set_filter_changed ( ) ;
2019-02-14 22:56:23 +01:00
void select_all ( int sheet_field ) ;
2019-03-18 16:43:44 +01:00
2019-02-22 15:14:05 +01:00
// Tasto nuovo: apre nuovo fornitore valorizzando già i dati dalla fattura
2019-05-16 09:34:21 +02:00
void new_forn ( ) ;
2019-02-22 15:14:05 +01:00
// Tasto aggiorna: aggiorna cliente che non corrisponde.
2019-05-16 09:34:21 +02:00
void aggiorna_forn ( ) ;
void salva_for ( ) const ;
void clean_ini ( const TString & filename ) const ;
void run_cg0 ( const TString & filename ) const ;
void elenco_prots_sel ( TString & string ) const ;
// Gestione F1
int prepara_contab ( ) ;
void contabilizza ( ) ;
TDate load_data ( ) const ;
// Handlers
static bool causfa_handler ( TMask_field & f , KEY k ) ;
static bool causnc_handler ( TMask_field & f , KEY k ) ;
2019-03-18 16:43:44 +01:00
2019-02-08 17:18:16 +01:00
bool on_field_event ( TOperable_field & o , TField_event e , long jolly ) override ;
void next_page ( int p ) override ;
2019-02-14 22:56:23 +01:00
// Elenco dei protocolli selezionati
2019-05-16 09:34:21 +02:00
2019-02-08 17:18:16 +01:00
void fill ( ) ;
2019-02-13 17:29:08 +01:00
static int find_fornitore ( TLocalisamfile & clifo ) ;
static void add_row_err_forn ( int forn_code , TSheet_field & sf_err , TString & denom ) ;
2019-02-22 15:14:05 +01:00
void aggiungi_riga ( TLocalisamfile & clifo , TSheet_field & sf , TSheet_field & sf_err ) ;
// Aggiunge i protocolli che sono già presenti per le fatture nel db alla tabellina per il filtro
2019-02-14 22:56:23 +01:00
void aggiungi_prot ( ) const ;
2019-02-08 17:18:16 +01:00
void init ( ) ;
void load_all_fields ( ) ;
public :
void save_all_fields ( ) const ;
2019-05-16 09:34:21 +02:00
TPassive_mask ( bool f1 ) ;
2019-02-08 17:18:16 +01:00
} ;
void TPassive_mask : : set_filter_changed ( )
{
_filter_changed = true ;
}
void TPassive_mask : : next_page ( int p )
{
2019-05-16 09:34:21 +02:00
field ( DLG_EXPORT ) . enable ( ( curr_page ( ) + p = = 1 | | p = = 1001 ) & & _f1 ) ;
field ( DLG_SAVEREC ) . enable ( curr_page ( ) + p = = 1 | | p = = 1001 ) ;
if ( p > = 1000 )
{
field ( DLG_NEWREC ) . enable ( p = = 1002 ) ;
field ( DLG_RECALC ) . enable ( p = = 1002 ) ;
}
else
{
field ( DLG_NEWREC ) . enable ( curr_page ( ) + p = = 2 | | curr_page ( ) + p = = 3 ) ;
field ( DLG_RECALC ) . enable ( curr_page ( ) + p = = 2 | | curr_page ( ) + p = = 3 ) ;
}
2019-02-08 17:18:16 +01:00
if ( _filter_changed & & p ! = 1000 )
{
fill ( ) ;
_filter_changed = false ;
}
TAutomask : : next_page ( p ) ;
}
void TPassive_mask : : fill ( )
{
2019-02-13 17:29:08 +01:00
TSheet_field & sf = sfield ( F_DOCS ) ;
TSheet_field & sf_err = sfield ( F_ERR ) ;
TString query ;
2019-02-15 10:58:17 +01:00
TString prots_query ;
2019-02-13 17:29:08 +01:00
TLocalisamfile clifo ( LF_CLIFO ) ;
2019-02-08 17:18:16 +01:00
2019-02-13 17:29:08 +01:00
const TDate dal = get ( F_DATAINI ) ;
const TDate al = get ( F_DATAEND ) ;
2019-04-05 15:04:05 +02:00
const TString & ordin = get ( F_FATTORD ) ;
const TString & verso_ord = get ( F_VERSOORD ) ;
2019-02-08 17:18:16 +01:00
2019-02-13 17:29:08 +01:00
sf . hide ( ) ;
sf . destroy ( ) ;
sf_err . hide ( ) ;
sf_err . destroy ( ) ;
2019-02-14 22:56:23 +01:00
2019-02-15 10:58:17 +01:00
elenco_prots_sel ( prots_query ) ;
2019-02-14 22:56:23 +01:00
query < < " SELECT PZ_TIPOPROT AS TIPO_PROT, YEAR(P7_DATA) AS ANNO, P7_TIPODOC AS [TIPO_SDI], P7_NUMERO AS [NUM_DOC], " < <
2019-04-05 15:04:05 +02:00
" P7_DATA AS [DATA_DOC], PZ_DATAORARIC AS [DATA_RIC], PQ_IMPTOTDOC AS [TOT_DOC], PZ_NUMREGCONT AS NUMREGCONT, PZ_DATAREGCONT AS DATAREGCONT, P2_ANADENOMIN AS [RAG_SOC], P2_ANANOME AS NOME, " < <
2019-02-13 17:29:08 +01:00
" P2_ANACOGNOME AS COGNOME, P2_FISCIVACOD AS [P_IVA], P2_CODFISCALE AS [COD_FISC], P2_FISCIVAPAESE AS [COD_PAESE], \n " < <
" COUNT(PP_ATTACHMENT) AS ATTACHMENT, P1_CODDEST AS [COD_SDI], PU_PEC AS PEC, P1_KEYPRGINVIO AS KEYPROG, P1_KEYHEADERFATT AS KEYHEAD, P1_KEYBODYFATT AS KEYFATT, " < <
2019-04-05 15:04:05 +02:00
" PZ_NUMPROT AS [NUM_PROT], PZ_ANNOPROT AS [ANNO_PROT], PZ_TIPOCF AS [TIPO_CF], PZ_CLIFOR AS [COD_CLIFOR] \n " < <
2019-02-08 17:18:16 +01:00
" FROM PAA0100F PAA01 \n " < <
" JOIN PAA0200F PAA02 ON P1_KEYPRGINVIO = P2_KEYPRGINVIO and P1_KEYHEADERFATT = P2_KEYHEADERFATT and P1_KEYBODYFATT = P2_KEYBODYFATT \n " < <
" JOIN PAA0700F PAA07 ON P1_KEYPRGINVIO = P7_KEYPRGINVIO and P1_KEYHEADERFATT = P7_KEYHEADERFATT and P1_KEYBODYFATT = P7_KEYBODYFATT \n " < <
" JOIN PAA2700F PAA27 ON P1_KEYPRGINVIO = PQ_KEYPRGINVIO and P1_KEYHEADERFATT = PQ_KEYHEADERFATT and P1_KEYBODYFATT = PQ_KEYBODYFATT \n " < <
" LEFT JOIN PAA2600F PAA26 ON P1_KEYPRGINVIO = PP_KEYPRGINVIO and P1_KEYHEADERFATT = PP_KEYHEADERFATT and P1_KEYBODYFATT = PP_KEYBODYFATT \n " < <
2019-02-13 17:29:08 +01:00
" LEFT JOIN PAA3200F PAA32 ON P1_KEYPRGINVIO = PU_KEYPRGINVIO and P1_KEYHEADERFATT = PU_KEYHEADERFATT and P1_KEYBODYFATT = PU_KEYBODYFATT \n " < <
" LEFT JOIN FPPRO00F FPPRO ON P1_KEYPRGINVIO = PZ_KEYPRGINVIO and P1_KEYHEADERFATT = PZ_KEYHEADERFATT and P1_KEYBODYFATT = PZ_KEYBODYFATT \n " < <
2019-02-15 10:58:17 +01:00
" WHERE P7_DATA >= \' " < < dal . date2ansi ( ) < < " \' AND P7_DATA <= \' " < < al . date2ansi ( ) < < " \' " < < prots_query < < " \n " < <
2019-04-05 15:04:05 +02:00
" GROUP BY YEAR(P7_DATA), P7_TIPODOC, P7_NUMERO, P7_DATA, PZ_DATAORARIC, PQ_IMPTOTDOC, PZ_NUMREGCONT, PZ_DATAREGCONT, P2_ANADENOMIN, P2_ANANOME, P2_ANACOGNOME, P2_FISCIVACOD, P2_CODFISCALE, P2_FISCIVAPAESE, \n " < <
2019-02-15 11:33:17 +01:00
" P1_CODDEST, PU_PEC, P1_KEYPRGINVIO, P1_KEYHEADERFATT, P1_KEYBODYFATT, PZ_TIPOPROT, PZ_NUMPROT, PZ_ANNOPROT, PZ_TIPOCF, PZ_CLIFOR \n " < <
2019-04-08 11:19:21 +02:00
" ORDER BY " < < ( ordin = = " D " ? " P7_DATA " : " PZ_DATAORARIC " ) < < " " < < ( verso_ord = = " C " ? " ASC " : " DESC " ) ;
2019-02-08 17:18:16 +01:00
fp_db ( ) . sq_set_exec ( query , false ) ;
2019-03-18 16:43:44 +01:00
_list_fatt_err . clear ( ) ;
2019-02-08 17:18:16 +01:00
while ( fp_db ( ) . sq_next ( ) )
{
2019-02-13 17:29:08 +01:00
aggiungi_riga ( clifo , sf , sf_err ) ;
}
sf . force_update ( ) ;
sf . show ( ) ;
sf_err . force_update ( ) ;
sf_err . show ( ) ;
}
2019-02-14 22:56:23 +01:00
void TPassive_mask : : elenco_prots_sel ( TString & string ) const
{
TString_array elenco ;
TSheet_field & sf = sfield ( F_PROT ) ;
2019-02-15 10:58:17 +01:00
string < < " AND PZ_TIPOPROT IN ( " ;
2019-02-14 22:56:23 +01:00
FOR_EACH_SHEET_ROW ( sf , nr , row )
{
if ( * row - > get ( 0 ) = = ' X ' )
elenco . add ( row - > get ( ) ) ;
}
2019-02-22 15:14:05 +01:00
// Creo una stringa da aggiungere alla query per la ricerca col codice protocollo, così fatta:
2019-02-15 11:33:17 +01:00
// " AND PZ_TIPOPROT IN ('a', 'b', 'c')". (con elenco avente "a", "b" e "c" come stringhe)
2019-02-14 22:56:23 +01:00
if ( elenco . items ( ) > 0 )
{
for ( int i = 0 ; i < elenco . items ( ) - 1 ; i + + )
string < < " \' " < < elenco . row ( i ) < < " \' , " ;
2019-02-15 11:33:17 +01:00
string < < " \' " < < elenco . row ( elenco . items ( ) - 1 ) < < " \' ) " ;
2019-02-14 22:56:23 +01:00
}
else
2019-02-15 10:58:17 +01:00
string = " " ;
2019-02-14 22:56:23 +01:00
}
2019-02-13 17:29:08 +01:00
void TPassive_mask : : aggiungi_riga ( TLocalisamfile & clifo , TSheet_field & sf , TSheet_field & sf_err )
{
2019-04-05 15:04:05 +02:00
TString denom = fp_db ( ) . sq_get ( " RAG_SOC " ) ;
const TString & paa_codfisc = fp_db ( ) . sq_get ( " COD_FISC " ) ;
const TString & paa_piva = fp_db ( ) . sq_get ( " P_IVA " ) ;
const TString & paa_codpaese = fp_db ( ) . sq_get ( " COD_PAESE " ) ;
const TString & paa_codsdi = fp_db ( ) . sq_get ( " COD_SDI " ) ;
const TString & prot = fp_db ( ) . sq_get ( " TIPO_PROT " ) ;
const TDate & dataregcont = fp_db ( ) . sq_get_date ( " DATAREGCONT " ) ;
const TString & filter_elab = get ( F_FATTSEL ) ;
2019-02-13 17:29:08 +01:00
clifo . zero ( ) ;
clifo . put ( CLI_TIPOCF , ' F ' ) ;
2019-02-08 17:18:16 +01:00
2019-04-05 15:04:05 +02:00
const int forn_code = find_fornitore ( clifo ) ;
2019-05-16 09:34:21 +02:00
const bool data_range = ! get_bool ( F_ENDATAREG ) | | dataregcont > = TDate ( get ( F_DATAINIREG ) ) & & dataregcont < = TDate ( get ( F_DATAENDREG ) ) ;
if ( filter_elab . blank ( ) & & forn_code ! = 0 | | filter_elab = = " E " & & forn_code = = 0 & & data_range | | filter_elab = = " A " )
2019-03-06 11:02:11 +01:00
{
2019-03-07 11:30:00 +01:00
TToken_string & row = sf . row ( - 1 ) ;
2019-03-06 11:02:11 +01:00
if ( denom . blank ( ) ) {
denom = fp_db ( ) . sq_get ( " NOME " ) ;
denom < < " " < < fp_db ( ) . sq_get ( " COGNOME " ) ;
}
denom . cut ( 50 ) ;
row . add ( fp_db ( ) . sq_get_int ( " ANNO " ) , 1 ) ;
row . add ( fp_db ( ) . sq_get ( " TIPO_SDI " ) ) ;
row . add ( fp_db ( ) . sq_get ( " NUM_DOC " ) ) ;
2019-04-05 15:04:05 +02:00
row . add ( fp_db ( ) . sq_get_date ( " DATA_RIC " ) ) ;
2019-03-18 16:43:44 +01:00
row . add ( fp_db ( ) . sq_get_date ( " DATA_DOC " ) ) ;
2019-03-06 11:02:11 +01:00
row . add ( fp_db ( ) . sq_get ( " TOT_DOC " ) ) ;
2019-03-18 16:43:44 +01:00
// Decido se mettere o meno il flag
if ( forn_code = = 0 )
row . add ( " X " ) ;
else
row . add ( " " ) ;
2019-03-06 11:02:11 +01:00
2019-03-27 14:53:22 +01:00
row . add ( fp_db ( ) . sq_get ( " NUMREGCONT " ) ) ;
if ( dataregcont = = TDate ( " 20010101 " ) )
row . add ( " " ) ;
else
row . add ( dataregcont ) ;
2019-03-18 16:43:44 +01:00
// Valorizzo le colonne rimanenti o la tabella degli errori
2019-03-06 11:02:11 +01:00
if ( forn_code > = 0 )
{
row . add ( clifo . get ( CLI_CODCF ) ) ;
row . add ( clifo . get ( CLI_RAGSOC ) ) ;
}
2019-03-18 16:43:44 +01:00
else if ( _list_fatt_err . find ( denom ) = = _list_fatt_err . end ( ) )
2019-03-06 11:02:11 +01:00
{
2019-03-18 16:43:44 +01:00
TForn_err & forn_err = _list_fatt_err [ denom ] ;
forn_err . forn_code = forn_code ;
forn_err . fatt_err = sf . items ( ) - 1 ;
2019-03-06 11:02:11 +01:00
add_row_err_forn ( forn_code , sf_err , denom ) ;
}
2019-02-22 15:14:05 +01:00
2019-03-06 11:02:11 +01:00
row . add ( paa_codpaese , sf . cid2index ( S_STATOPAIV ) ) ;
row . add ( paa_piva ) ;
row . add ( paa_codfisc ) ;
2019-02-08 17:18:16 +01:00
2019-03-06 11:02:11 +01:00
row . add ( fp_db ( ) . sq_get ( " ATTACHMENT " ) ! = " 0 " ? " " : " X " ) ;
row . add ( paa_codsdi . blank ( ) ? fp_db ( ) . sq_get ( " PEC " ) : paa_codsdi ) ;
row . add ( denom ) ;
row . add ( fp_db ( ) . sq_get ( " ANNO_PROT " ) < < ( prot . empty ( ) ? " " : " - " ) < < prot < < " / " < < fp_db ( ) . sq_get ( " NUM_PROT " ) < < ( prot . empty ( ) ? " (no prot.) " : " " ) ) ;
TString key_prot ; key_prot < < fp_db ( ) . sq_get ( " KEYPROG " ) < < " ; " < < fp_db ( ) . sq_get ( " KEYHEAD " ) < < " ; " < < fp_db ( ) . sq_get ( " KEYFATT " ) ;
row . add ( key_prot ) ;
2019-02-13 17:29:08 +01:00
}
}
2019-02-08 17:18:16 +01:00
2019-02-14 22:56:23 +01:00
void TPassive_mask : : aggiungi_prot ( ) const
{
TSheet_field & sf_prot = sfield ( F_PROT ) ;
TString query = " " ;
2019-02-15 10:58:17 +01:00
TString prot = " " ;
2019-02-14 22:56:23 +01:00
query < < " SELECT DISTINCT(PZ_TIPOPROT) AS TIPO_PROT \n FROM FPPRO00F " ;
fp_db ( ) . sq_set_exec ( query , false ) ;
while ( fp_db ( ) . sq_next ( ) )
{
TToken_string & row = sf_prot . row ( sf_prot . items ( ) + 1 ) ;
2019-02-15 10:58:17 +01:00
prot = fp_db ( ) . sq_get ( " TIPO_PROT " ) ;
2019-02-14 22:56:23 +01:00
row . add ( " " , 0 ) ;
2019-02-15 10:58:17 +01:00
row . add ( prot . empty ( ) ? " no-prot. " : prot ) ;
2019-02-14 22:56:23 +01:00
}
sf_prot . force_update ( ) ;
}
2019-03-18 16:43:44 +01:00
void TPassive_mask : : add_row_err_forn ( const int forn_code , TSheet_field & sf_err , TString & denom )
2019-02-13 17:29:08 +01:00
{
TToken_string & row_err = sf_err . row ( - 1 ) ;
2019-02-22 15:14:05 +01:00
row_err . add ( fp_db ( ) . sq_get ( " COD_PAESE " ) , 1 ) ;
2019-02-13 17:29:08 +01:00
row_err . add ( fp_db ( ) . sq_get ( " P_IVA " ) ) ;
row_err . add ( fp_db ( ) . sq_get ( " COD_FISC " ) ) ;
row_err . add ( denom ) ;
switch ( forn_code ) {
case err_match_db :
2019-02-22 15:14:05 +01:00
row_err . add ( " Salvato in database ma non corrisponde a un fornitore codificato. (Nuovo fornitore disabilitato) " ) ;
2019-02-13 17:29:08 +01:00
break ;
case no_forn :
2019-02-15 11:33:17 +01:00
row_err . add ( " Non trovato fornitore per la P.IVA. " ) ;
2019-02-13 17:29:08 +01:00
break ;
case no_match_cf :
2019-03-18 14:37:47 +01:00
row_err . add ( " Trovato fornitore ma il codice fiscale non corrisponde. Aggiornare? (Solo se non e' gruppo IVA) " ) ;
2019-02-13 17:29:08 +01:00
break ;
case no_cf :
2019-02-15 11:33:17 +01:00
row_err . add ( " Fornitore senza P. IVA, non trovato il codice fiscale " ) ;
2019-02-13 17:29:08 +01:00
break ;
default :
row_err . add ( " Errore durante identificazione fornitore. " ) ;
break ;
}
}
int TPassive_mask : : find_fornitore ( TLocalisamfile & clifo )
{
2019-05-16 09:34:21 +02:00
TString paa_codfisc = fp_db ( ) . sq_get ( " COD_FISC " ) ;
const TString paa_piva = fp_db ( ) . sq_get ( " P_IVA " ) ;
TString paa_codpaese = fp_db ( ) . sq_get ( " COD_PAESE " ) ;
const TString fppro_tipocf = fp_db ( ) . sq_get ( " TIPO_CF " ) ;
TString fppro_codcf = fp_db ( ) . sq_get ( " COD_CLIFOR " ) ;
2019-02-13 17:29:08 +01:00
2019-02-22 15:14:05 +01:00
// Cerco se il fornitore è presente in Campo
2019-02-13 17:29:08 +01:00
int found_clifo = - 1 ;
if ( fppro_codcf = = " 17 " )
bool simo = true ;
TString piva ;
2019-02-22 15:14:05 +01:00
// Leggo dall FPPRO se è già stato salvato il fornitore
// Se è già salvato nell FPPRO ricerco in Campo col codice fornitore (chiave 1)
2019-02-13 17:29:08 +01:00
if ( fppro_tipocf = = " F " & & ! fppro_codcf . blank ( ) )
{
clifo . setkey ( 1 ) ;
clifo . put ( CLI_CODCF , fppro_codcf ) ;
// Se trovo dall FPPRO setto a 0
clifo . read ( ) = = NOERR ? found_clifo = 0 : found_clifo = - 3 ;
}
2019-02-22 15:14:05 +01:00
else if ( paa_codpaese . full ( ) & & ( piva = paa_piva ) . full ( ) ) // Se non c'è nell FPPRO ricerco con chiave 5
2019-02-13 17:29:08 +01:00
{
if ( piva = = " 01903590154 " )
bool simo = true ;
clifo . setkey ( 5 ) ;
clifo . put ( CLI_STATOPAIV , paa_codpaese ) ;
clifo . put ( CLI_PAIV , paa_piva ) ;
clifo . read ( ) = = NOERR ? found_clifo = 2 : found_clifo = - 1 ; // Se trovo con partita iva setto a 2
if ( found_clifo ! = 2 & & paa_codpaese = = " IT " ) // Se non l'ho trovato potrebbe essere italiano e ha codice paese blank
2019-02-08 17:18:16 +01:00
{
2019-02-13 17:29:08 +01:00
clifo . put ( CLI_PAIV , paa_piva ) ;
clifo . put ( CLI_STATOPAIV , " " ) ;
clifo . read ( ) = = NOERR ? found_clifo = 2 : found_clifo = - 5 ; // Se trovo con partita iva setto a 2
2019-02-08 17:18:16 +01:00
}
2019-02-22 15:14:05 +01:00
// Se trovo con p.iva controllo il cod. fisc. e, se c'è da db e se c'è in clienti-fornitori, altrimenti vado avanti
2019-02-13 17:29:08 +01:00
if ( found_clifo = = 2 & & paa_codfisc . full ( ) & & clifo . get ( CLI_COFI ) . full ( ) )
2019-02-08 17:18:16 +01:00
{
2019-02-22 15:14:05 +01:00
if ( clifo . get ( CLI_COFI ) = = paa_codfisc ) // Controllo che il cod fisc (se c'è) corrisponda
2019-02-13 17:29:08 +01:00
found_clifo = 2 ;
else
found_clifo = - 15 ;
2019-02-08 17:18:16 +01:00
}
}
2019-02-13 17:29:08 +01:00
// Altrimenti lo cerco con chiave 4, se ho il codice fiscale o ho il cod fisc e l'ho trovato con p iva
else if ( paa_codfisc . full ( ) )
{
clifo . setkey ( 4 ) ;
clifo . put ( CLI_COFI , paa_codfisc ) ;
clifo . read ( ) = = NOERR ? found_clifo = 4 : found_clifo = - 14 ; // Se il cod fisc corrisponde setto a 2
}
2019-05-16 09:34:21 +02:00
// Se lo trovo controllo che non abbia il flag di sospeso se no ricerco ancora
bool noerr = true ;
if ( found_clifo = = 2 )
{
while ( clifo . get_bool ( CLI_SOSPESO ) & & noerr & & clifo . get ( CLI_PAIV ) = = paa_piva )
noerr = clifo . next ( ) = = NOERR ;
if ( clifo . get_bool ( CLI_SOSPESO ) | | ! noerr | | clifo . get ( CLI_PAIV ) ! = paa_piva )
found_clifo = - 5 ;
}
else if ( found_clifo = = 4 )
{
while ( clifo . get_bool ( CLI_SOSPESO ) & & noerr & & clifo . get ( CLI_COFI ) = = paa_codfisc )
noerr = clifo . next ( ) = = NOERR ;
if ( clifo . get_bool ( CLI_SOSPESO ) | | ! noerr | | clifo . get ( CLI_COFI ) ! = paa_codfisc )
found_clifo = - 14 ;
}
2019-02-13 17:29:08 +01:00
return found_clifo ;
2019-02-08 17:18:16 +01:00
}
void TPassive_mask : : init ( )
{
2019-02-14 22:56:23 +01:00
aggiungi_prot ( ) ;
2019-02-08 17:18:16 +01:00
}
void TPassive_mask : : load_all_fields ( )
{
}
2019-05-16 09:34:21 +02:00
bool TPassive_mask : : causfa_handler ( TMask_field & f , KEY k )
{
if ( k = = K_TAB & & f . focusdirty ( ) )
{
TMask & msk = f . mask ( ) ;
TString codcaus ( msk . get ( F_CAUSFA ) ) ;
if ( ! check_causale ( codcaus , " FA " ) )
{
warning_box ( " Impossibile selezionare questa causale registrazione. \n Prego inserire una causale di Fattura Acquisti " ) ;
msk . field ( F_CAUSFA ) . set ( " " ) ;
msk . field ( F_DESCAUSFA ) . set ( " " ) ;
set_ini_codcaus ( " " ) ;
return false ;
}
set_ini_codcaus ( codcaus ) ;
}
return true ;
}
bool TPassive_mask : : causnc_handler ( TMask_field & f , KEY k )
{
if ( k = = K_TAB & & f . focusdirty ( ) )
{
TMask & msk = f . mask ( ) ;
TString codcaus ( msk . get ( F_CAUSNC ) ) ;
if ( ! check_causale ( codcaus , " NC " ) )
{
warning_box ( " Impossibile selezionare questa causale registrazione. \n Prego inserire una causale di Nota Credito Acquisti. " ) ;
msk . field ( F_CAUSNC ) . set ( " " ) ;
msk . field ( F_DESCAUSNC ) . set ( " " ) ;
set_ini_codcaus ( " " , true ) ;
return false ;
}
set_ini_codcaus ( codcaus , true ) ;
}
return true ;
}
2019-02-14 22:56:23 +01:00
void TPassive_mask : : select_all ( int sheet_field )
{
TSheet_field & docs = sfield ( sheet_field ) ;
TString_array & sht = docs . rows_array ( ) ;
const int items = sht . items ( ) ;
if ( items > 0 )
{
const TString4 select = * sht . row ( 0 ) . get ( 0 ) = = ' X ' ? " " : " X " ;
for ( int i = 0 ; i < items ; i + + )
sht . row ( i ) . add ( select , 0 ) ;
docs . force_update ( ) ;
}
}
2019-02-22 15:14:05 +01:00
void TPassive_mask : : salva_for ( ) const
2019-02-13 17:29:08 +01:00
{
if ( fp_db ( ) . sq_is_connect ( ) )
{
TString q_update ; // Query per update
TSheet_field & sf = sfield ( F_DOCS ) ;
TLocalisamfile clifo ( LF_CLIFO ) ; // Leggo in Campo per controllare che il codice cliente non sia errato
FOR_EACH_SHEET_ROW ( sf , nr , row )
{
if ( row - > starts_with ( " X " ) & & strcmp ( clifo . get ( CLI_CODCF ) , " 17 " ) = = 0 )
bool simo = true ;
TString cod_forn = row - > get ( sf . cid2index ( S_FORNITORE ) ) ;
if ( row - > starts_with ( " X " ) & & cod_forn ! = " " )
{
clifo . zero ( ) ;
clifo . setkey ( 1 ) ;
clifo . put ( CLI_TIPOCF , " F " ) ;
clifo . put ( CLI_CODCF , cod_forn ) ;
if ( clifo . read ( ) = = NOERR )
{
q_update = " " ;
TToken_string key ( row - > get ( sf . cid2index ( S_PROKEY ) ) , ' ; ' ) ;
2019-05-16 09:34:21 +02:00
const TString & clifo_cofi = clifo . get ( CLI_COFI ) ;
const TString & clifo_paiv = clifo . get ( CLI_PAIV ) ;
if ( ! clifo_cofi . empty ( ) & & strcmp ( row - > get ( sf . cid2index ( S_CODFISC ) ) , clifo_cofi ) = = 0 | | ! clifo_paiv . empty ( ) & & strcmp ( row - > get ( sf . cid2index ( S_PARIVA ) ) , clifo_paiv ) = = 0 )
2019-02-13 17:29:08 +01:00
{
q_update < < " UPDATE FPPRO00F SET PZ_TIPOCF = 'F', PZ_CLIFOR = ' " < < row - > get ( sf . cid2index ( S_FORNITORE ) ) < < " ' WHERE PZ_KEYPRGINVIO = ' " < < key . get ( 0 ) < < " ' AND PZ_KEYHEADERFATT = ' " < < key . get ( 1 ) < < " ' AND PZ_KEYBODYFATT = ' " < < key . get ( 2 ) < < " ' " ;
fp_db ( ) . sq_set_exec ( q_update , false ) ;
2019-02-15 10:58:17 +01:00
row - > add ( " X " , sf . cid2index ( S_FPPRO ) ) ;
sf . force_update ( ) ;
2019-02-13 17:29:08 +01:00
}
}
}
2019-02-15 10:58:17 +01:00
row - > add ( " " , 0 ) ;
2019-02-13 17:29:08 +01:00
}
fp_db ( ) . sq_commit ( ) ;
2019-02-14 22:56:23 +01:00
sf . force_update ( ) ;
2019-02-13 17:29:08 +01:00
}
}
2019-05-16 09:34:21 +02:00
void TPassive_mask : : clean_ini ( const TString & filename ) const
2019-03-18 16:43:44 +01:00
{
static TString remove_string ;
2019-05-16 09:34:21 +02:00
# ifdef DBG
remove_string . cut ( 0 ) < < filename < < " *.ini " ;
# else
2019-03-18 16:43:44 +01:00
remove_string . cut ( 0 ) < < tmp_dir < < " \\ " < < filename < < " *.* " ;
2019-05-16 09:34:21 +02:00
# endif
2019-03-18 16:43:44 +01:00
remove_files ( remove_string , false ) ;
}
void TPassive_mask : : run_cg0 ( const TString & filename ) const
{
static TString run_string ;
run_string . cut ( 0 ) < < " cg0 -1 -i " < < tmp_dir < < " \\ " < < filename < < " * " < < " .ini " < < " /u " < < user ( ) ;
TExternal_app ( run_string ) . run ( ) ;
}
2019-05-16 09:34:21 +02:00
int TPassive_mask : : prepara_contab ( )
{
int n_sel = 0 ;
TSheet_field & sf = sfield ( F_DOCS ) ;
sf . hide ( ) ;
clean_ini ( F1_INIREGCONT ) ;
FOR_EACH_SHEET_ROW ( sf , n , row ) {
if ( row - > starts_with ( " X " ) )
{
if ( ! TString ( row - > get ( sf . cid2index ( S_NUMREGCONT ) ) ) . empty ( ) )
return n + 1000 ;
TString codcaus ( get_codcaus ( row - > get ( 2 ) , row - > get ( 10 ) ) ) ;
if ( codcaus . empty ( ) )
return no_codcaus ;
n_sel + + ;
TString num ; num . format ( " %04d " , n ) ;
TFilename newf_ini ;
# ifndef DBG
newf_ini . tempdir ( ) < < " \\ " < < regcont < < num < < " .ini " ;
# else
newf_ini < < F1_INIREGCONT < < num < < " .ini " ;
# endif
TConfig contab_ini ( newf_ini , " Transaction " ) ;
contab_ini . set ( " Action " , " INSERT " ) ;
contab_ini . set_paragraph ( LF_MOV ) ; // [23]
contab_ini . set ( " CODCAUS " , codcaus ) ;
contab_ini . set ( " CODCF " , row - > get ( sf . cid2index ( S_FORNITORE ) ) ) ;
contab_ini . set ( " DATACOMP " , TDate ( TODAY ) ) ;
contab_ini . set ( " DATADOC " , row - > get ( sf . cid2index ( S_DATADOC ) ) ) ;
contab_ini . set ( " NUMDOCEXT " , row - > get ( sf . cid2index ( S_NDOC ) ) ) ;
contab_ini . set ( " NUMDOC " , TString ( row - > get ( sf . cid2index ( S_NDOC ) ) ) . right ( 7 ) ) ;
contab_ini . set ( " TOTDOC " , row - > get ( sf . cid2index ( S_TOTDOC ) ) ) ;
contab_ini . set ( " PROGFPPRO " , row - > get ( sf . cid2index ( S_NPROT ) ) ) ;
contab_ini . set ( " KEYFPPRO " , row - > get ( sf . cid2index ( S_PROKEY ) ) ) ;
row - > add ( " " , 0 ) ;
}
}
sf . force_update ( ) ;
sf . show ( ) ;
if ( n_sel = = 0 )
return no_selected ;
return is_ready ;
}
void TPassive_mask : : contabilizza ( )
{
const int stato = prepara_contab ( ) ;
switch ( stato )
{
case is_ready :
run_cont_ini ( ) ; // Eseguo gli ini
fill ( ) ; // Ricarico sheet per togliere quelli contabilizzati
break ;
case no_codcaus :
message_box ( " Attenzione, il fornitore non ha associato nessun codice causale predefinito. \n Prego selezionare un codice causale per la contabilizzazione. " ) ;
next_page ( 1000 ) ;
break ;
case no_selected :
message_box ( " Selezionare almeno un documento. " ) ;
break ;
default : break ;
}
if ( stato > = 1000 )
{
TSheet_field & sf = sfield ( F_DOCS ) ;
TToken_string & row = sf . row ( stato - 1000 ) ;
const TString ndoc = row . get_int ( sf . cid2index ( S_NDOC ) ) ;
const TDate datadoc = row . get ( sf . cid2index ( S_DATADOC ) ) ;
const int nreg = row . get_int ( sf . cid2index ( S_NUMREGCONT ) ) ;
TString msg ;
msg < < " Attenzione il doc " < < ndoc < < " del " < < datadoc < < " e' gia' stato registrato con numero reg. " < < nreg ;
warning_box ( msg ) ;
fill ( ) ;
}
}
TDate TPassive_mask : : load_data ( ) const
{
TString date ; date < < ini_get_string ( CONFIG_DITTA , " fp " , " dataini_fp04 " ) ;
TDate start_date ( TODAY ) ;
if ( ! date . empty ( ) )
start_date = date ;
else
start_date . set_day ( 1 ) ;
return start_date ;
}
2019-02-22 15:14:05 +01:00
void TPassive_mask : : new_forn ( )
{
TSheet_field & sf = sfield ( F_ERR ) ;
2019-03-18 16:43:44 +01:00
static const TString newf = " fpnewf " ;
2019-05-16 09:34:21 +02:00
clean_ini ( newf ) ;
2019-02-22 15:14:05 +01:00
FOR_EACH_SHEET_ROW ( sf , nr , row )
{
2019-03-18 16:43:44 +01:00
const TString denom = row - > get ( sf . cid2index ( S_RAGSERR ) ) ;
TForn_err & forn_err = _list_fatt_err [ denom ] ;
const int & cod_forn = forn_err . forn_code ; // Prendo codice di errore associazione fornitore
const int & n_row_elenco = forn_err . fatt_err ; // Prendo che numero di riga a cui mi riferisco in fatture
2019-02-22 15:14:05 +01:00
TSheet_field & f_docs = sfield ( F_DOCS ) ; // Prendo SheetField da elenco fatture
TToken_string & row_elenco_fatt = f_docs . row ( n_row_elenco ) ; // Prendo riga dall'elenco delle fatture
TToken_string keys ( row_elenco_fatt . get ( f_docs . cid2index ( S_PROKEY ) ) , ' ; ' ) ; // Dalla riga leggo la chiave del db
if ( row - > starts_with ( " X " ) & & ( cod_forn = = no_forn | | cod_forn = = no_match_cf | | cod_forn = = no_cf ) )
{
TString query ; query < < " SELECT PU_PEC AS PEC \n " < <
" FROM PAA3200F \n " < <
" WHERE PU_KEYPRGINVIO = ' " < < keys . get ( ) ;
query < < " ' AND PU_KEYHEADERFATT = ' " < < keys . get ( ) ;
query < < " ' AND PU_KEYBODYFATT = ' " < < keys . get ( ) < < " ' " ;
fp_db ( ) . sq_set_exec ( query ) ;
TString pec = fp_db ( ) . sq_get ( " PEC " ) ;
TString num ; num . format ( " %04d " , nr ) ;
TFilename newf_ini ;
newf_ini . tempdir ( ) < < " \\ " < < newf < < num < < " .ini " ;
TConfig forn_conf ( newf_ini , " Transaction " ) ;
forn_conf . set ( " Action " , " INSERT " ) ;
forn_conf . set_paragraph ( " 20 " ) ;
forn_conf . set ( " TIPOCF " , " F " ) ;
forn_conf . set ( " COFI " , row - > get ( sf . cid2index ( S_CODFIERR ) ) ) ;
forn_conf . set ( " PAIV " , row - > get ( sf . cid2index ( S_PIVAERR ) ) ) ;
forn_conf . set ( " PEC " , pec ) ;
forn_conf . set ( " RAGSOC " , row - > get ( sf . cid2index ( S_RAGSERR ) ) ) ;
forn_conf . set ( " STATOPAIV " , row_elenco_fatt . get ( sf . cid2index ( S_STATOPAIV ) ) ) ;
forn_conf . set_paragraph ( " 17 " ) ;
forn_conf . set ( " TIPOCF " , " F " ) ;
forn_conf . set ( " RAGGOR " , " O " ) ;
forn_conf . set ( " PADESTIN " , row_elenco_fatt . get ( sf . cid2index ( S_CODSDI ) ) ) ;
row - > add ( " " , 0 ) ;
}
}
2019-03-18 16:43:44 +01:00
run_cg0 ( newf ) ;
2019-02-22 15:14:05 +01:00
sf . force_update ( ) ;
}
void TPassive_mask : : aggiorna_forn ( )
{
TSheet_field & sf = sfield ( F_ERR ) ;
2019-03-18 14:37:47 +01:00
static const TString newf = " fpaggf " ;
2019-05-16 09:34:21 +02:00
clean_ini ( newf ) ;
2019-02-22 15:14:05 +01:00
FOR_EACH_SHEET_ROW ( sf , nr , row )
{
2019-03-18 16:43:44 +01:00
const TString denom = row - > get ( sf . cid2index ( S_RAGSERR ) ) ;
TForn_err & forn_err = _list_fatt_err [ denom ] ;
const int & cod_forn = forn_err . forn_code ; // Prendo codice di errore associazione fornitore
const int & n_row_elenco = forn_err . fatt_err ; // Prendo che numero di riga a cui mi riferisco in fatture
2019-02-22 15:14:05 +01:00
TSheet_field & f_docs = sfield ( F_DOCS ) ; // Prendo SheetField da elenco fatture
TToken_string & row_elenco_fatt = f_docs . row ( n_row_elenco ) ; // Prendo riga dall'elenco delle fatture
if ( row - > starts_with ( " X " ) & & cod_forn = = no_match_cf )
{
2019-02-27 13:06:34 +01:00
TLocalisamfile clifo ( LF_CLIFO ) ;
clifo . setkey ( 5 ) ;
clifo . put ( CLI_TIPOCF , ' F ' ) ;
2019-03-18 16:43:44 +01:00
clifo . put ( CLI_STATOPAIV , row - > get ( sf . cid2index ( S_STATOERR ) ) ) ;
clifo . put ( CLI_PAIV , row - > get ( ) ) ;
if ( clifo . read ( ) ! = NOERR )
{
TString msg = " Impossibile trovare il fornitore scelto " ;
msg < < row - > get ( sf . cid2index ( S_STATOERR ) ) < < " " < < row - > get ( ) ;
warning_box ( msg ) ;
continue ;
}
if ( clifo . get ( CLI_ALLEG ) ! = " G " ) // Controllo che non sia un gruppo IVA
2019-02-27 13:06:34 +01:00
{
TString num ; num . format ( " %04d " , nr ) ;
TFilename newf_ini ;
newf_ini . tempdir ( ) < < " \\ " < < newf < < num < < " .ini " ;
TConfig forn_conf ( newf_ini , " Transaction " ) ;
forn_conf . set ( " Action " , " MODIFY " ) ;
forn_conf . set_paragraph ( " 20 " ) ;
forn_conf . set ( " TIPOCF " , " F " ) ;
forn_conf . set ( " COFI " , row - > get ( sf . cid2index ( S_CODFIERR ) ) ) ;
2019-03-18 16:43:44 +01:00
forn_conf . set ( " CODCF " , clifo . get ( CLI_CODCF ) ) ;
2019-02-27 13:06:34 +01:00
row - > add ( " " , 0 ) ;
}
2019-02-22 15:14:05 +01:00
}
}
2019-03-18 16:43:44 +01:00
run_cg0 ( newf ) ;
2019-02-22 15:14:05 +01:00
sf . force_update ( ) ;
}
2019-02-08 17:18:16 +01:00
bool TPassive_mask : : on_field_event ( TOperable_field & o , TField_event e , long jolly )
{
switch ( o . dlg ( ) )
{
2019-02-14 22:56:23 +01:00
case S_SELCODPROT :
if ( e = = fe_modify )
set_filter_changed ( ) ;
break ;
case F_PROT :
if ( e = = fe_init )
init ( ) ;
break ;
case DLG_ALL :
if ( e = = fe_button )
switch ( curr_page ( ) )
{
case filtri :
select_all ( F_PROT ) ;
set_filter_changed ( ) ;
break ;
2019-02-15 10:58:17 +01:00
case elenco_fe :
select_all ( F_DOCS ) ;
break ;
2019-02-22 15:14:05 +01:00
case elenco_err :
select_all ( F_ERR ) ;
break ;
2019-02-14 22:56:23 +01:00
default : break ;
}
break ;
2019-02-13 17:29:08 +01:00
case DLG_SAVEREC :
if ( e = = fe_button )
2019-02-22 15:14:05 +01:00
if ( curr_page ( ) = = elenco_fe )
2019-02-14 22:56:23 +01:00
salva_for ( ) ;
2019-02-22 15:14:05 +01:00
break ;
case DLG_NEWREC :
if ( e = = fe_button )
if ( curr_page ( ) = = elenco_err )
new_forn ( ) ;
break ;
case DLG_RECALC :
if ( e = = fe_button )
if ( curr_page ( ) = = elenco_err )
aggiorna_forn ( ) ;
2019-02-13 17:29:08 +01:00
break ;
2019-05-16 09:34:21 +02:00
case DLG_EXPORT :
if ( e = = fe_button & & curr_page ( ) = = elenco_fe )
{
contabilizza ( ) ;
}
break ;
2019-02-08 17:18:16 +01:00
case F_DATAINI :
2019-03-06 11:02:11 +01:00
if ( e = = fe_init )
{
2019-05-16 09:34:21 +02:00
o . set ( load_data ( ) ) ;
}
case F_ENDATAREG :
if ( e = = fe_modify )
{
field ( F_DATAINIREG ) . enable ( get_bool ( F_ENDATAREG ) ) ;
field ( F_DATAENDREG ) . enable ( get_bool ( F_ENDATAREG ) ) ;
2019-03-06 11:02:11 +01:00
}
2019-02-08 17:18:16 +01:00
break ;
case F_DATAEND :
if ( e = = fe_init )
o . set ( TDate ( TODAY ) ) ;
2019-02-15 10:58:17 +01:00
break ;
2019-02-08 17:18:16 +01:00
default : break ;
}
if ( ( e = = fe_modify | | e > = se_enter ) & & jolly = = 0 )
2019-02-14 22:56:23 +01:00
if ( o . dlg ( ) > = START_MASK & & o . dlg ( ) < = END_MASK | | o . dlg ( ) = = F_PROT )
2019-02-08 17:18:16 +01:00
set_filter_changed ( ) ;
return true ;
}
2019-05-16 09:34:21 +02:00
TPassive_mask : : TPassive_mask ( bool f1 ) : TAutomask ( " fp0400a " ) , _f1 ( f1 ) , _filter_changed ( true )
{
tmp_dir = tmp_dir . tempdir ( ) ;
load_all_fields ( ) ;
TMask : : set_handler ( F_CAUSFA , causfa_handler ) ;
TMask : : set_handler ( F_CAUSNC , causnc_handler ) ;
}
2019-02-08 17:18:16 +01:00
/////////////////////////////////////////////////////////////////////////////////////
// TPassive_app
/////////////////////////////////////////////////////////////////////////////////////
class TPassive_app : public TSkeleton_application
{
2019-05-16 09:34:21 +02:00
void load_mask ( const TPassive_mask & mask ) const ;
bool check_f1 ( ) const ;
void save_field ( const TPassive_mask & mask ) ;
2019-02-08 17:18:16 +01:00
public :
void main_loop ( ) override ;
TPassive_app ( ) = default ;
} ;
2019-05-16 09:34:21 +02:00
void TPassive_app : : load_mask ( const TPassive_mask & mask ) const
{
if ( check_f1 ( ) )
{
mask . field ( F_CAUSFA ) . set ( get_ini_codcaus ( ) ) ;
mask . field ( F_CAUSNC ) . set ( get_ini_codcaus ( true ) ) ;
mask . field ( F_ENDATAREG ) . set ( get_endatareg ( ) ) ;
mask . field ( F_DATAINIREG ) . enable ( mask . get_bool ( F_ENDATAREG ) ) ;
mask . field ( F_DATAINIREG ) . set ( get_datainireg ( ) ) ;
mask . field ( F_DATAENDREG ) . enable ( mask . get_bool ( F_ENDATAREG ) ) ;
mask . field ( F_DATAENDREG ) . set ( get_dataendreg ( ) ) ;
}
}
bool TPassive_app : : check_f1 ( ) const
{
return has_module ( F1AUT ) ;
}
void TPassive_app : : save_field ( const TPassive_mask & mask )
{
if ( check_f1 ( ) )
{
set_ini_codcaus ( mask . get ( F_CAUSFA ) ) ;
set_endatareg ( mask . get_bool ( F_ENDATAREG ) ) ;
set_datainireg ( mask . get ( F_DATAINIREG ) ) ;
set_dataendreg ( mask . get ( F_DATAENDREG ) ) ;
}
ini_set_string ( CONFIG_DITTA , " fp " , " dataini_fp04 " , mask . get ( F_DATAINI ) ) ;
}
2019-02-08 17:18:16 +01:00
void TPassive_app : : main_loop ( )
{
2019-05-16 09:34:21 +02:00
TPassive_mask mask ( check_f1 ( ) ) ;
load_mask ( mask ) ;
2019-02-08 17:18:16 +01:00
while ( mask . run ( ) = = K_ENTER )
{
}
2019-05-16 09:34:21 +02:00
save_field ( mask ) ;
2019-02-08 17:18:16 +01:00
}
int fp0400 ( int argc , char * argv [ ] )
{
TPassive_app fpas ;
fpas . run ( argc , argv , TR ( " Fatturazione F.P. " ) ) ;
return 0 ;
}