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