/* 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); // 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(); } 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è non trovo un nuovo movimento o trovo cod IVA già presi da cust while(!checkRecord(c_rmoviva) || (!_newMov && _alqCust.get_pos(codiva) > -1)); } // Se ho cambiato movimento ritorno, leggerò 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\"))"; 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 è 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; }