2017-07-10 14:16:23 +00:00
|
|
|
|
/* 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;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-13 12:27:06 +00:00
|
|
|
|
int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi)
|
2017-07-10 14:16:23 +00:00
|
|
|
|
{
|
|
|
|
|
// Azzero recimposte
|
|
|
|
|
recimposte.destroy();
|
|
|
|
|
// Return code
|
|
|
|
|
return_code err;
|
|
|
|
|
// Record
|
2017-07-13 12:27:06 +00:00
|
|
|
|
TRectype record = _next(err, tipocf, codcf, ocfpi);
|
2017-07-10 14:16:23 +00:00
|
|
|
|
if(err == eof)
|
|
|
|
|
{
|
2017-07-13 12:27:06 +00:00
|
|
|
|
record = _nextCust(err, tipocf, codcf, ocfpi);
|
2017-07-10 14:16:23 +00:00
|
|
|
|
}
|
|
|
|
|
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;
|
2017-07-13 12:27:06 +00:00
|
|
|
|
record = _next(err, tipocf, codcf, ocfpi);
|
2017-07-10 14:16:23 +00:00
|
|
|
|
}
|
|
|
|
|
ok = err != eofcust;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Questa funzione precarica un array associativo con il movimento diviso per codiva e lo ritorna
|
|
|
|
|
*/
|
2017-07-13 12:27:06 +00:00
|
|
|
|
TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi)
|
2017-07-10 14:16:23 +00:00
|
|
|
|
{
|
|
|
|
|
TString numMov = c_rmoviva->get("23.NUMREG").as_string();
|
2017-07-18 15:27:20 +00:00
|
|
|
|
|
2017-07-10 14:16:23 +00:00
|
|
|
|
// Record di ritorno
|
|
|
|
|
TRectype retRec(LF_TRASFATT);
|
2017-07-18 15:27:20 +00:00
|
|
|
|
|
|
|
|
|
// Variabile di appoggio per forzare il controllo sui movimenti nuovi,
|
|
|
|
|
// cos<6F> facendo riesco a entrare nel ciclo sotto. Prima c'era un else
|
|
|
|
|
bool newMov = _newMov;
|
|
|
|
|
|
2017-07-10 14:16:23 +00:00
|
|
|
|
// Controllo che non sia il primo record del movimento
|
|
|
|
|
if(_newMov)
|
|
|
|
|
{
|
|
|
|
|
_newMov = false;
|
2017-07-13 12:27:06 +00:00
|
|
|
|
tipocf = c_rmoviva->get("23.TIPO").as_string();
|
|
|
|
|
codcf = c_rmoviva->get("23.CODCF").as_string();
|
|
|
|
|
ocfpi = c_rmoviva->get("23.OCFPI").as_string();
|
2017-07-10 14:16:23 +00:00
|
|
|
|
}
|
2017-07-18 15:27:20 +00:00
|
|
|
|
|
|
|
|
|
// Se non <20> un movimento o il controllo fallisce mi sposto
|
|
|
|
|
if(!newMov || !checkRecord(c_rmoviva))
|
2017-07-10 14:16:23 +00:00
|
|
|
|
{
|
|
|
|
|
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());
|
2017-07-18 09:49:17 +00:00
|
|
|
|
retRec.put("TFINVIO", c_rmoviva->get("23.TFINVIO").as_string());
|
2017-07-10 14:16:23 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-13 12:27:06 +00:00
|
|
|
|
TRectype TTrFa_cursors::_nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi)
|
2017-07-10 14:16:23 +00:00
|
|
|
|
{
|
|
|
|
|
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();
|
2017-07-13 12:27:06 +00:00
|
|
|
|
ocfpi = c_trasfatt->get("OCFPI").as_string();
|
2017-07-10 14:16:23 +00:00
|
|
|
|
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:
|
2017-07-24 09:50:05 +00:00
|
|
|
|
query << "&&((23.TFINVIO=\"\")||(23.TFINVIO=\"X\")||(23.TFINVIO=\"F\")||(23.TFINVIO=\"E\"))";
|
|
|
|
|
queryCust << "&&((TFINVIO=\"\")||(TFINVIO=\"X\")||(TFINVIO=\"F\")||(TFINVIO=\"E\"))";
|
2017-07-10 14:16:23 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|