Files correlati : tf0100, tf0400 Commento : - Sistemati filtri per esterometro - Aggiunta visualizzazione fatture non inviate in trasferimento fatture
254 lines
7.9 KiB
C++
254 lines
7.9 KiB
C++
/* Query in Campo e SQLite */
|
|
|
|
#include "tf0100b.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// TTrFa_cursors
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
TTrFa_cursors::~TTrFa_cursors()
|
|
{
|
|
if(_c_rmoviva != NULL)
|
|
delete _c_rmoviva;
|
|
if(_c_trasfatt != NULL)
|
|
delete _c_trasfatt;
|
|
}
|
|
|
|
int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi)
|
|
{
|
|
// Azzero recimposte
|
|
recimposte.destroy();
|
|
// Return code
|
|
return_code err;
|
|
// Record
|
|
TRectype record = _next(err, tipocf, codcf, ocfpi);
|
|
if(err == eof)
|
|
{
|
|
record = _next_cust(err, tipocf, codcf, ocfpi);
|
|
}
|
|
while(err < nextmov)
|
|
{
|
|
// Se ho trovato un record custom o non trovo il suo codiva tra i record custom lo salvo
|
|
if(recimposte.is_key(record.get("CODIVA")))
|
|
{
|
|
// Prelevo il record salvato
|
|
TRectype app = *(TRectype*)recimposte.objptr(record.get("CODIVA"));
|
|
// Aggiorno i valori
|
|
app.put("IMPONIBILE", app.get_real("IMPONIBILE") + record.get_real("IMPONIBILE"));
|
|
app.put("IMPOSTA", app.get_real("IMPOSTA") + record.get_real("IMPOSTA"));
|
|
// Lo reinserisco
|
|
recimposte.add(record.get("CODIVA"), app, true);
|
|
}
|
|
else // Inserisco per la prima volta
|
|
{
|
|
// Salvo il record nell'array
|
|
recimposte.add(record.get("CODIVA"), record);
|
|
}
|
|
if(err == foundidcust) break;
|
|
record = _next(err, tipocf, codcf, ocfpi);
|
|
}
|
|
ok = err != eofcust;
|
|
return err;
|
|
}
|
|
|
|
/*
|
|
* Questa funzione precarica un array associativo con il movimento diviso per codiva e lo ritorna
|
|
*/
|
|
TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi)
|
|
{
|
|
const TString num_mov = _c_rmoviva->get("23.NUMREG").as_string();
|
|
|
|
// Record di ritorno
|
|
TRectype ret_rec(LF_TRASFATT);
|
|
|
|
// Variabile di appoggio per forzare il controllo sui movimenti nuovi,
|
|
// così facendo riesco a entrare nel ciclo sotto. Prima c'era un else
|
|
const bool new_mov = _new_mov;
|
|
|
|
// Controllo che non sia il primo record del movimento
|
|
if(_new_mov)
|
|
{
|
|
_new_mov = false;
|
|
tipocf = _c_rmoviva->get("23.TIPO").as_string();
|
|
codcf = _c_rmoviva->get("23.CODCF").as_string();
|
|
ocfpi = _c_rmoviva->get("23.OCFPI").as_string();
|
|
}
|
|
|
|
// Se non è un movimento o il controllo fallisce mi sposto
|
|
const int tipo_doc = get_tipo_doc(_c_rmoviva->get("23.TIPODOC").as_string());
|
|
if(!new_mov ||
|
|
!check_record(_c_rmoviva, _esterometro, _paf_ns, _paf_s, _paf_sf, _paf_e, _paa_ns, _paa_s, _paa_sf, _paa_e) ||
|
|
tipo_doc == -1 || !msk().get_bool(tipo_doc))
|
|
{
|
|
static TString codiva;
|
|
TString n_simo;
|
|
do
|
|
{
|
|
// Se ritorna false ho finito i records
|
|
if(!_c_rmoviva->move_next())
|
|
{
|
|
code = eof;
|
|
return ret_rec;
|
|
}
|
|
else
|
|
{
|
|
// Controllo se ho cambiato movimento
|
|
_new_mov = num_mov != (n_simo = _c_rmoviva->get("23.NUMREG").as_string());
|
|
if (n_simo == "44583")
|
|
bool simo = true;
|
|
codiva.cut(0) << _c_rmoviva->get("25.CODIVA").as_string();
|
|
}
|
|
} // Ciclo finchè non trovo un nuovo movimento o trovo cod IVA già presi da cust
|
|
while((!_new_mov && _alq_cust.get_pos(codiva) > -1) || !check_enabled(_c_rmoviva) ||
|
|
!check_record(_c_rmoviva, _esterometro, _paf_ns, _paf_s, _paf_sf, _paf_e, _paa_ns, _paa_s, _paa_sf, _paa_e));
|
|
}
|
|
|
|
// Se ho cambiato movimento ritorno, leggerò poi al prossimo giro
|
|
if(_new_mov)
|
|
{
|
|
_alq_cust.cut(0);
|
|
code = nextmov;
|
|
return ret_rec;
|
|
}
|
|
else
|
|
code = found;
|
|
|
|
#ifdef DBG
|
|
if(_c_rmoviva->get("23.NUMREG").as_int() == 1930131)
|
|
bool tolla = true;
|
|
#endif
|
|
|
|
// Controllo dell'esistenza di un record custom in trasfatt
|
|
ret_rec = getTrasFatt(_c_rmoviva->get("23.NUMREG").as_string(), _c_rmoviva->get("25.CODIVA").as_string());
|
|
if(ret_rec.empty())
|
|
{
|
|
code = found;
|
|
// Carico il record
|
|
ret_rec.put("NUMREG", _c_rmoviva->get("23.NUMREG").as_int());
|
|
ret_rec.put("TIPO", _c_rmoviva->get("23.TIPO").as_string());
|
|
ret_rec.put("CODCF", _c_rmoviva->get("23.CODCF").as_string());
|
|
ret_rec.put("OCCAS", _c_rmoviva->get("23.OCFPI").as_string());
|
|
ret_rec.put("TIPODOC", _c_rmoviva->get("23.TIPODOC").as_string());
|
|
ret_rec.put("NUMDOC", _c_rmoviva->get("23.NUMDOC").as_string());
|
|
ret_rec.put("DATAREG", _c_rmoviva->get("23.DATAREG").as_date());
|
|
ret_rec.put("DATADOC", _c_rmoviva->get("23.DATADOC").as_date());
|
|
ret_rec.put("TFINVIO", _c_rmoviva->get("23.TFINVIO").as_string());
|
|
ret_rec.put("IMPONIBILE", _c_rmoviva->get("25.IMPONIBILE").as_real());
|
|
ret_rec.put("IMPOSTA", _c_rmoviva->get("25.IMPOSTA").as_real());
|
|
ret_rec.put("CODIVA", _c_rmoviva->get("25.CODIVA").as_string());
|
|
ret_rec.put("TIPODET", _c_rmoviva->get("25.TIPODET").as_string());
|
|
}
|
|
else
|
|
{
|
|
_alq_cust.add(_c_rmoviva->get("25.CODIVA").as_string());
|
|
code = foundcust;
|
|
}
|
|
return ret_rec;
|
|
}
|
|
|
|
TRectype TTrFa_cursors::_next_cust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi)
|
|
{
|
|
bool ok;
|
|
// Preparo il nuovo cursore
|
|
if(_new_cust)
|
|
{
|
|
ok = _c_trasfatt->move_first();
|
|
_new_cust = false;
|
|
}
|
|
else
|
|
{
|
|
ok = _c_trasfatt->move_next();
|
|
}
|
|
tipocf = _c_trasfatt->get("TIPO").as_string();
|
|
codcf = _c_trasfatt->get("CODCF").as_string();
|
|
ocfpi = _c_trasfatt->get("OCFPI").as_string();
|
|
code = ok ? foundidcust : eofcust;
|
|
return _c_trasfatt->cursor()->curr();
|
|
}
|
|
|
|
bool TTrFa_cursors::check_enabled(TISAM_recordset* orig_cur)
|
|
{
|
|
// Controllo che il record sia effettivamente abilitato
|
|
static TString flag; flag.cut(0);
|
|
// Controllo se sono su un movimento custom
|
|
if(orig_cur->find_column("MOV.REG") >= 0)
|
|
{
|
|
TRectype r_cust = getTrasFatt(_c_rmoviva->get("23.NUMREG").as_string(), _c_rmoviva->get("25.CODIVA").as_string());
|
|
if(r_cust.empty())
|
|
flag << orig_cur->get("23.TFINVIO");
|
|
else
|
|
flag << r_cust.get("TFINVIO");
|
|
}
|
|
else
|
|
{
|
|
flag << orig_cur->get("TFINVIO").as_string();
|
|
}
|
|
|
|
return msk().check_invio(flag);
|
|
}
|
|
|
|
void TTrFa_cursors::reset_esterometro()
|
|
{
|
|
_esterometro = msk().get_bool(B_ESTEROMETRO);
|
|
_paf_ns = msk().get_bool(B_PAF_NOT_SENT);
|
|
_paf_s = msk().get_bool(B_PAF_SENT);
|
|
_paf_sf = msk().get_bool(B_PAF_SOG_FAT);
|
|
_paf_e = msk().get_bool(B_PAF_ESTERI);
|
|
_paa_ns = msk().get_bool(B_PAA_NOT_SENT);
|
|
_paa_s = msk().get_bool(B_PAA_SENT);
|
|
_paa_e = msk().get_bool(B_PAA_ESTERI);
|
|
_paa_sf = msk().get_bool(B_PAA_SOG_FAT);
|
|
}
|
|
|
|
TTrFa_cursors::TTrFa_cursors(): _c_rmoviva(nullptr), _c_trasfatt(nullptr), _new_mov(false), _new_cust(false),
|
|
_esterometro(false), _paf_ns(false), _paf_s(false), _paf_sf(false), _paf_e(false),
|
|
_paa_ns(false), _paa_s(false), _paa_sf(false), _paa_e(false) {}
|
|
|
|
|
|
int TTrFa_cursors::update_filters(const char tipocf, const long codcf, TDate dal, TDate al, int cod)
|
|
{
|
|
// Svuoto la cache per aggiornare i file custom
|
|
cache().discard(LF_TRASFATT);
|
|
|
|
// Resetto i filtri booleani
|
|
reset_esterometro();
|
|
|
|
TString query = "USE RMOVIVA\n", query_cust = "USE TRASFATT\n";
|
|
query << R"(SELECT (23.REG!="")&&BETWEEN(23.DATAREG,#DADATAREG,#ADATAREG)&&(23.TIPO=")" << tipocf << "\")";
|
|
query_cust << "SELECT BETWEEN(DATAREG,#DADATAREG,#ADATAREG)&&(TIPO=\"" << tipocf << "\")";
|
|
|
|
if(codcf > 0)
|
|
{
|
|
query << "&&STR((23.CODCF=#CODCF))";
|
|
query_cust << "&&STR((CODCF=#CODCF))";
|
|
}
|
|
|
|
query << "\nJOIN MOV INTO NUMREG==NUMREG\n";
|
|
query_cust << "\nFROM NUMREG=" << MOV_CUSTOM;
|
|
|
|
_c_rmoviva = new TISAM_recordset(query);
|
|
_c_trasfatt= new TISAM_recordset(query_cust);
|
|
|
|
if(dal.empty()) dal = "20170101"; // Data in cui questo modulo è diventato valido
|
|
if(al.empty()) al = TODAY;
|
|
|
|
_c_rmoviva->set_var("#DADATAREG", dal);
|
|
_c_rmoviva->set_var("#ADATAREG", al);
|
|
_c_trasfatt->set_var("#DADATAREG", dal);
|
|
_c_trasfatt->set_var("#ADATAREG", al);
|
|
|
|
if(codcf > 0)
|
|
{
|
|
_c_rmoviva->set_var("#CODCF", codcf);
|
|
_c_trasfatt->set_var("#CODCF", codcf);
|
|
}
|
|
|
|
const int items = _c_rmoviva->items() + _c_trasfatt->items();
|
|
if(items > 0)
|
|
{
|
|
_new_mov = true;
|
|
_new_cust = true;
|
|
return items;
|
|
}
|
|
return -1;
|
|
}
|