235 lines
6.9 KiB
C++
235 lines
6.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)
|
|||
|
{
|
|||
|
// Azzero recimposte
|
|||
|
recimposte.destroy();
|
|||
|
// Return code
|
|||
|
return_code err;
|
|||
|
// Record
|
|||
|
TRectype record = _next(err, tipocf, codcf);
|
|||
|
if(err == eof)
|
|||
|
{
|
|||
|
record = _nextCust(err, tipocf, codcf);
|
|||
|
}
|
|||
|
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);
|
|||
|
}
|
|||
|
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 numMov = c_rmoviva->get("23.NUMREG").as_string();
|
|||
|
// Record di ritorno
|
|||
|
TRectype retRec(LF_TRASFATT);
|
|||
|
// Controllo che non sia il primo record del movimento
|
|||
|
if(_newMov)
|
|||
|
{
|
|||
|
_newMov = false;
|
|||
|
// Se <20> un cliente occasionale passo "O"
|
|||
|
if(c_rmoviva->get("23.OCFPI").as_string() != "")
|
|||
|
{
|
|||
|
tipocf = "O";
|
|||
|
codcf = c_rmoviva->get("23.OCFPI").as_string();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tipocf = c_rmoviva->get("23.TIPO").as_string();
|
|||
|
codcf = c_rmoviva->get("23.CODCF").as_string();
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TString codiva;
|
|||
|
do
|
|||
|
{
|
|||
|
// Se ritorna false ho finito i records
|
|||
|
if(!c_rmoviva->move_next())
|
|||
|
{
|
|||
|
code = eof;
|
|||
|
return retRec;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Controllo se ho cambiato movimento
|
|||
|
_newMov = numMov != c_rmoviva->get("23.NUMREG").as_string();
|
|||
|
}
|
|||
|
} // Ciclo finch<63> non trovo un nuovo movimento o trovo cod IVA gi<67> presi da cust
|
|||
|
while(!checkRecord(c_rmoviva) || (!_newMov && _alqCust.get_pos(codiva) > -1));
|
|||
|
}
|
|||
|
|
|||
|
// Se ho cambiato movimento ritorno, legger<65> poi al prossimo giro
|
|||
|
if(_newMov)
|
|||
|
{
|
|||
|
_alqCust.cut(0);
|
|||
|
code = nextmov;
|
|||
|
return retRec;
|
|||
|
}
|
|||
|
else
|
|||
|
code = found;
|
|||
|
|
|||
|
// Controllo dell'esistenza di un record custom in tasfatt
|
|||
|
retRec = getTrasFatt(c_rmoviva->get("23.NUMREG").as_string(), c_rmoviva->get("25.CODIVA").as_string());
|
|||
|
if(retRec.empty())
|
|||
|
{
|
|||
|
code = found;
|
|||
|
// Carico il record
|
|||
|
retRec.put("NUMREG", c_rmoviva->get("23.NUMREG").as_int());
|
|||
|
retRec.put("TIPO", c_rmoviva->get("23.TIPO").as_string());
|
|||
|
retRec.put("CODCF", c_rmoviva->get("23.CODCF").as_string());
|
|||
|
retRec.put("OCCAS", c_rmoviva->get("23.OCFPI").as_string());
|
|||
|
retRec.put("TIPODOC", c_rmoviva->get("23.TIPODOC").as_string());
|
|||
|
retRec.put("NUMDOC", c_rmoviva->get("23.NUMDOC").as_string());
|
|||
|
retRec.put("DATAREG", c_rmoviva->get("23.DATAREG").as_date());
|
|||
|
retRec.put("DATADOC", c_rmoviva->get("23.DATADOC").as_date());
|
|||
|
retRec.put("IMPONIBILE", c_rmoviva->get("25.IMPONIBILE").as_real());
|
|||
|
retRec.put("IMPOSTA", c_rmoviva->get("25.IMPOSTA").as_real());
|
|||
|
retRec.put("CODIVA", c_rmoviva->get("25.CODIVA").as_string());
|
|||
|
retRec.put("TIPODET", c_rmoviva->get("25.TIPODET").as_string());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_alqCust.add(c_rmoviva->get("25.CODIVA").as_string());
|
|||
|
code = foundcust;
|
|||
|
}
|
|||
|
return retRec;
|
|||
|
}
|
|||
|
|
|||
|
TRectype TTrFa_cursors::_nextCust(return_code& code, TString& tipocf, TString& codcf)
|
|||
|
{
|
|||
|
bool ok;
|
|||
|
// Preparo il nuovo cursore
|
|||
|
if(_newCust)
|
|||
|
{
|
|||
|
ok = c_trasfatt->move_first();
|
|||
|
_newCust = false;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ok = c_trasfatt->move_next();
|
|||
|
}
|
|||
|
tipocf = c_trasfatt->get("TIPO").as_string();
|
|||
|
codcf = c_trasfatt->get("CODCF").as_string();
|
|||
|
code = ok ? foundidcust : eofcust;
|
|||
|
return c_trasfatt->cursor()->curr();
|
|||
|
}
|
|||
|
|
|||
|
/* Utilizzo questa funzione per filtrare al meglio i record, tutti i casi che devo omettere verranno rilevati e ritorneranno false
|
|||
|
* Nota bene: viene sfruttato un puntatore di TISA_Recordset per non creare nuovi oggetti e velocizzare la chiamata
|
|||
|
* a questo punto il programma non ha ancora creato un record di $trasfatt con i dati che mi interessano
|
|||
|
*/
|
|||
|
bool TTrFa_cursors::checkRecord(TISAM_recordset* rec)
|
|||
|
{
|
|||
|
|
|||
|
TString keyClifo; keyClifo << rec->get("23.TIPO").as_string() << "|" << rec->get("23.CODCF").as_string();
|
|||
|
// Salto le schede carburanti
|
|||
|
if(cache().get(LF_CLIFO, keyClifo, "ALLEG") == "C")
|
|||
|
return false;
|
|||
|
|
|||
|
// Clienti
|
|||
|
if(rec->get("23.TIPO").as_string() == "C")
|
|||
|
{
|
|||
|
// Tolgo tutti i movimenti di sola IVA e in reverse charge o di tipo 3 (Acquisto di beni e servizi di soggetti non residenti)
|
|||
|
TCausale caus(rec->get("23.CODCAUS").as_string());
|
|||
|
if(caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3))
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
int TTrFa_cursors::updateFilters(const char tipocf, const long codcf, TDate dal, TDate al, int cod)
|
|||
|
{
|
|||
|
TString query = "USE RMOVIVA\n", queryCust = "USE TRASFATT\n";
|
|||
|
query << "SELECT (23.REG!=\"\")&&BETWEEN(23.DATAREG,#DADATAREG,#ADATAREG)&&(23.TIPO=\"" << tipocf << "\")";
|
|||
|
queryCust << "SELECT BETWEEN(DATAREG,#DADATAREG,#ADATAREG)&&(TIPO=\"" << tipocf << "\")";
|
|||
|
|
|||
|
if(codcf > 0)
|
|||
|
{
|
|||
|
query << "&&STR((23.CODCF=#CODCF))";
|
|||
|
queryCust << "&&STR((CODCF=#CODCF))";
|
|||
|
}
|
|||
|
|
|||
|
switch(cod)
|
|||
|
{
|
|||
|
case toSend:
|
|||
|
query << "&&((23.TFINVIO=\"\")||(23.TFINVIO=\"X\")||(23.TFINVIO=\"F\"))";
|
|||
|
queryCust << "&&((TFINVIO=\"\")||(TFINVIO=\"X\")||(TFINVIO=\"F\"))";
|
|||
|
break;
|
|||
|
case sent:
|
|||
|
query << "&&(23.TFINVIO=\"I\")";
|
|||
|
queryCust << "&&(TFINVIO=\"I\")";
|
|||
|
break;
|
|||
|
case disabled:
|
|||
|
query << "&&(23.TFINVIO=\"N\")";
|
|||
|
queryCust << "&&(TFINVIO=\"N\")";
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
query << "\nJOIN MOV INTO NUMREG==NUMREG\n";
|
|||
|
queryCust << "\nFROM NUMREG=" << MOV_CUSTOM;
|
|||
|
|
|||
|
c_rmoviva = new TISAM_recordset(query);
|
|||
|
c_trasfatt= new TISAM_recordset(queryCust);
|
|||
|
|
|||
|
if(dal.empty()) dal = "20170101"; // Data in cui questo modulo <20> 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);
|
|||
|
}
|
|||
|
|
|||
|
int items = c_rmoviva->items() + c_trasfatt->items();
|
|||
|
if(items > 0)
|
|||
|
{
|
|||
|
_newMov = true;
|
|||
|
_newCust = true;
|
|||
|
return items;
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|