campo-sirio/src/tf/tf0102.cpp
Simone Palacino 0861213978 Patch level : 12.0 728
Files correlati     : tf0100, tf0400
Commento            :
- Sistemati filtri per esterometro
- Aggiunta visualizzazione fatture non inviate in trasferimento fatture
2019-03-11 17:36:52 +01:00

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;
}