campo-sirio/src/tf/tf0102.cpp

237 lines
7.2 KiB
C++
Raw Normal View History

/* 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 = _nextCust(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)
{
TString numMov = c_rmoviva->get("23.NUMREG").as_string();
// Record di ritorno
TRectype retRec(LF_TRASFATT);
// 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;
// Controllo che non sia il primo record del movimento
if(_newMov)
{
_newMov = 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 <20> un movimento o il controllo fallisce mi sposto
if(!newMov || !checkRecord(c_rmoviva))
{
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("TFINVIO", c_rmoviva->get("23.TFINVIO").as_string());
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, TString& ocfpi)
{
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();
ocfpi = c_trasfatt->get("OCFPI").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\")||(23.TFINVIO=\"E\"))";
queryCust << "&&((TFINVIO=\"\")||(TFINVIO=\"X\")||(TFINVIO=\"F\")||(TFINVIO=\"E\"))";
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;
}