From 44acefb3eed1950e1ab2cc67823011f6662863c9 Mon Sep 17 00:00:00 2001 From: Simone Palacino Date: Wed, 1 Apr 2020 21:29:53 +0200 Subject: [PATCH] PaPatch level : 12.0 no-patch Files correlati : f90.exe f90100a.msk f90100b.msk f90200a.msk Commento : - F9 ARCHIVIAZIONE SOSTITUTIVA: - Aggiunto programma f90200 per configurazione categorie documentali. - Aggiunti due flag nella configurazione: no fatt ven Campo e visualizza mov dopo diag. - Spostato pulsante estrai in prima posizione. - Aggiunta maschera per tabella conf categorie doc - Sostituiti tutti tab con spazi - Disattivato apri estrazione se non in stato '02' - Implementata classe TEstrazione che gestisce le informazioni e le procedure di un'estrazione - Aggiunta finestra per inserire descrizione per estrazione escluso - Creata struct movimento_t per gestire meglio il vettore dei movimenti da estr. - Riordinato codice --- src/f9/f90100.cpp | 1090 +++++++++++++++++++++++---------------------- 1 file changed, 549 insertions(+), 541 deletions(-) diff --git a/src/f9/f90100.cpp b/src/f9/f90100.cpp index 60971ce06..05e814448 100644 --- a/src/f9/f90100.cpp +++ b/src/f9/f90100.cpp @@ -23,7 +23,22 @@ #define SQL_VERSION 102 // Utilizzo questo per controllare la versione attuale delle tabelle e nel caso aggiornarle -TMask& descr_msk(); + //////////////////////////////////////////////////////// + // Utilities + //////////////////////////////////////////////////////// + +TMask& descr_msk() +{ + static TMask* m = nullptr; + if (m == nullptr) + { + m = new TMask("Estrazione", 1, 60, 5); + m->add_button_tool(DLG_OK, "Conferma", TOOL_OK); + m->add_groupbox(DES_GROUP, 0, "Inserire descrizione estrazione:", 1, 0, 59, 3, ""); + m->add_string(DES_TEXT, 0, "Descrizione", 4, 1, 250, "", 40); + } + return *m; +} // Doppio puntatore perche' cosi' sono sicuro di puntare alla stessa cosa che sta puntando la variabile // statica all'interno di questa funzione. @@ -37,8 +52,8 @@ TMask** esclusi_mask() _esclusi_mask = new TMask("f90100c.msk"); TMask& m = *_esclusi_mask; ((TSheet_field&)m.field(S_ESCL)).set_notify(TF9_app::select_escl_notify); // Handler dello sheet per selezione singola - m.set_handler(DLG_FINDREC, TF9_app::controllo_escl_handler); // Bottone per aprire maschera di controllo movimenti - m.set_handler(B_ESTRAI, TF9_app::estrai_escl_handler); // Bottone estrai + m.set_handler(DLG_FINDREC, TF9_app::controllo_escl_handler); // Bottone per aprire maschera di controllo movimenti + m.set_handler(B_ESTRAI, TF9_app::estrai_escl_handler); // Bottone estrai TMask& sheet_m = ((TSheet_field&)m.field(S_ESCL)).sheet_mask(); // Maschera dei campi dello sheet sheet_m.set_handler(DLG_USER, TF9_app::mov_handler_escl); // Bottone collega movimento @@ -63,6 +78,35 @@ TMask** inclusi_mask() return &_inclusi_mask; } +const TString& recset_get_string(const TRecordset& rec, const char* field, const int zero_filled) +{ + const TString& str = rec.get(rec.find_column(field)).as_string(); + if (zero_filled == -1) + return str; + static TString c; + c.cut(0); + const int len = str.len(); + for (int i = len; i < zero_filled; i++) // Sistemo il codcaus per via del TVariant che non restituisce la stringa esattamente come l'originale + c << "0"; + c << str; + return c; +} + +int recset_get_int(const TRecordset& rec, const char* field, const int zero_filled) +{ + return rec.get(rec.find_column(field)).as_int(); +} + +bool recset_get_bool(const TRecordset& rec, const char* field) +{ + return rec.get(rec.find_column(field)).as_bool(); +} + +real recset_get_real(const TRecordset& rec, const char* field) +{ + return rec.get(rec.find_column(field)).as_real(); +} + @@ -98,7 +142,7 @@ TEstrai_mask::TEstrai_mask() : TMask("Estrazione", 1, 60, 16) bool TEstrai_mask::estrai_handler(TMask_field& f, KEY key) { TEstrai_mask& msk = (TEstrai_mask&)f.mask(); // this estrai_mask - TF9_app& a = f9_app(); + TF9_app& a = f9_app(); // Estraggo const int stato = a.estrai(); // Main function @@ -158,6 +202,8 @@ bool TEstrai_mask::dataend_handler(TMask_field& f, KEY key) } + + //////////////////////////////////////////////////////// // TMonitor_mask //////////////////////////////////////////////////////// @@ -166,10 +212,10 @@ bool TMonitor_mask::save_conf_handler(TMask_field& f, KEY key) { TMask& config_mask = f.mask(); TF9_app& a = f9_app(); - a.set_ambiente (config_mask.get(CF_CODSOC)); - a.set_addr_doc (config_mask.get(CF_ADDRDOC)); - a.set_has_vendext (config_mask.get_bool(CF_VENDEXT)); - a.set_viewmov (config_mask.get_bool(CF_VIEWMOVPRE)); + a.set_ambiente(config_mask.get(CF_CODSOC)); + a.set_addr_doc(config_mask.get(CF_ADDRDOC)); + a.set_has_vendext(config_mask.get_bool(CF_VENDEXT)); + a.set_viewmov(config_mask.get_bool(CF_VIEWMOVPRE)); if (a.get_ambiente().full()) ini_set_string(CONFIG_DITTA, "F9", AMBIENTE_F9, a.get_ambiente()); @@ -205,87 +251,6 @@ void TMonitor_mask::controllo_errori() const warning_box("Selezionare un'estrazione."); } -bool TMonitor_mask::on_key(const KEY key) -{ - return TAutomask::on_key(key); -} - -void TMonitor_mask::open_win_estr() -{ - if (!f9_app().get_ambiente().full()) - warning_box("Inserire codice ambiente societa' in configurazione"); - else f9_app().run_estr_msk(); -} - -void TMonitor_mask::open_win_conf() const -{ - static TMask* m = nullptr; - - if (m == nullptr) - { - m = new TMask("Configurazione Archiviazione Sostitutiva", 1, 60, 18); - - m->add_button_tool(DLG_OK, "Conferma", TOOL_OK); - m->add_button_tool(DLG_NULL, "", 0); - m->add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); - - m->add_groupbox(CF_CODGROUP, 0, "Codice Ambiente Societa' (WEBAPP):", 1, 0, 59, 3, ""); - m->add_string(CF_CODSOC, 0, "Codice ambiente", 4, 1, 10, "", 10); - m->add_groupbox(CF_ADDRGROUP, 0, "Indicare percorso documenti cartacei:", 1, 3, 59, 3, ""); - m->add_string(CF_ADDRDOC, 0, "Percorso", 2, 4, 256, "", 40); - m->add_groupbox(CF_ESTRGROUP, 0, "Opzioni estrazione", 1, 6, 59, 4, ""); - m->add_boolean(CF_VENDEXT, 0, "Disabilita controllo documenti vendita (no fatturazione vendite)", 2, 7); - m->add_boolean(CF_VIEWMOVPRE, 0, "Visualizza movimenti preparati prima di lanciare l'estrazione", 2, 8); - - m->set_handler(DLG_OK, save_conf_handler); - - m->set(CF_CODSOC, ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9)); - m->set(CF_ADDRDOC, ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9)); - m->set(CF_VENDEXT, ini_get_bool(CONFIG_DITTA, PAR_MOD, VENDEXT_F9)); - m->set(CF_VIEWMOVPRE, ini_get_bool(CONFIG_DITTA, PAR_MOD, VIEWMOV_F9)); - } - m->run(); -} - -void TMonitor_mask::fill() const -{ - f9_app()._config.ambiente = ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9); - f9_app()._config.addr_doc = ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9); - - TString query; - query << "SELECT * FROM F9DRD00K ORDER BY " << DRD_TIME << " DESC;"; - fp_db().sq_set_exec(query, false); - - TSheet_field& sf = sfield(S_ELAB); - sf.hide(); - sf.destroy(); - int i = 0; - for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) - { - TString tipo; - TToken_string& row = sf.row(i++); - row.add(" "); - row.add(fp_db().sq_get(DRD_STATO) == "09" ? "X" : ""); - row.add(fp_db().sq_get(DRD_ID_EST)); - row.add(fp_db().sq_get_date(DRD_TIME)); - row.add(fp_db().sq_get(DRD_FLAG_PD) == "P" ? "X" : ""); - - tipo << fp_db().sq_get(DRD_TIPODOC); - if (tipo == "A") tipo << "cquisti"; - if (tipo == "V") tipo << "endite"; - if (tipo == "C") tipo << "orrispettivi"; - row.add(tipo); - - row.add(fp_db().sq_get_date(DRD_DATADA)); - row.add(fp_db().sq_get_date(DRD_DATAA)); - row.add(fp_db().sq_get(DRD_UTENTE)); - row.add(fp_db().sq_get(DRD_STATO) << " - " << TF9_app::traduci_stato(fp_db().sq_get(DRD_STATO))); - row.add(fp_db().sq_get(DRD_DESC)); - } - sf.force_update(); - sf.show(); -} - void TMonitor_mask::delete_pack(const bool all) const { bool flag = false; @@ -340,19 +305,88 @@ void TMonitor_mask::delete_pack(const bool all) const fill(); } -void TMonitor_mask::sel() const +void TMonitor_mask::fill() const { + f9_app()._config.ambiente = ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9); + f9_app()._config.addr_doc = ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9); + + TString query; + query << "SELECT * FROM F9DRD00K ORDER BY " << DRD_TIME << " DESC;"; + fp_db().sq_set_exec(query, false); + TSheet_field& sf = sfield(S_ELAB); sf.hide(); - FOR_EACH_SHEET_ROW(sf, nr, row) + sf.destroy(); + int i = 0; + for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) { - if (*row->get(0) == 'X') - row->add("", 0); + TString tipo; + TToken_string& row = sf.row(i++); + row.add(" "); + row.add(fp_db().sq_get(DRD_STATO) == "09" ? "X" : ""); + row.add(fp_db().sq_get(DRD_ID_EST)); + row.add(fp_db().sq_get_date(DRD_TIME)); + row.add(fp_db().sq_get(DRD_FLAG_PD) == "P" ? "X" : ""); + + tipo << fp_db().sq_get(DRD_TIPODOC); + if (tipo == "A") tipo << "cquisti"; + if (tipo == "V") tipo << "endite"; + if (tipo == "C") tipo << "orrispettivi"; + row.add(tipo); + + row.add(fp_db().sq_get_date(DRD_DATADA)); + row.add(fp_db().sq_get_date(DRD_DATAA)); + row.add(fp_db().sq_get(DRD_UTENTE)); + row.add(fp_db().sq_get(DRD_STATO) << " - " << TF9_app::traduci_stato(fp_db().sq_get(DRD_STATO))); + row.add(fp_db().sq_get(DRD_DESC)); } sf.force_update(); sf.show(); } +bool TMonitor_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_ELABORA: + if (e == fe_button) + open_win_estr(); + break; + case DLG_DELREC: + if (e == fe_button) + delete_pack(); + break; + case DLG_CONFIG: + if (e == fe_button) + open_win_conf(); + break; + case DLG_FINDREC: + if (e == fe_button) + controllo_errori(); + break; + case DLG_RECALC: + fill(); + break; + case B_SHOWESTR: + open_mostra_estrazione(); + break; + case B_SHOWESCL: + if (e == fe_button) + f9_app().open_esclusi(); + break; + case F_SEL: + if (e == fe_modify) + sel(); + default: break; + } + return true; +} + +bool TMonitor_mask::on_key(const KEY key) +{ + return TAutomask::on_key(key); +} + void TMonitor_mask::open_mostra_estrazione() const { TMask& msk = **inclusi_mask(); @@ -428,49 +462,419 @@ void TMonitor_mask::open_mostra_estrazione() const msk.run(); } -bool TMonitor_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +void TMonitor_mask::open_win_estr() +{ + if (!f9_app().get_ambiente().full()) + warning_box("Inserire codice ambiente societa' in configurazione"); + else f9_app().run_estr_msk(); +} + +void TMonitor_mask::open_win_conf() const +{ + static TMask* m = nullptr; + + if (m == nullptr) + { + m = new TMask("Configurazione Archiviazione Sostitutiva", 1, 60, 18); + + m->add_button_tool(DLG_OK, "Conferma", TOOL_OK); + m->add_button_tool(DLG_NULL, "", 0); + m->add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + + m->add_groupbox(CF_CODGROUP, 0, "Codice Ambiente Societa' (WEBAPP):", 1, 0, 59, 3, ""); + m->add_string(CF_CODSOC, 0, "Codice ambiente", 4, 1, 10, "", 10); + m->add_groupbox(CF_ADDRGROUP, 0, "Indicare percorso documenti cartacei:", 1, 3, 59, 3, ""); + m->add_string(CF_ADDRDOC, 0, "Percorso", 2, 4, 256, "", 40); + m->add_groupbox(CF_ESTRGROUP, 0, "Opzioni estrazione", 1, 6, 59, 4, ""); + m->add_boolean(CF_VENDEXT, 0, "Disabilita controllo documenti vendita (no fatturazione vendite)", 2, 7); + m->add_boolean(CF_VIEWMOVPRE, 0, "Visualizza movimenti preparati prima di lanciare l'estrazione", 2, 8); + + m->set_handler(DLG_OK, save_conf_handler); + + m->set(CF_CODSOC, ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9)); + m->set(CF_ADDRDOC, ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9)); + m->set(CF_VENDEXT, ini_get_bool(CONFIG_DITTA, PAR_MOD, VENDEXT_F9)); + m->set(CF_VIEWMOVPRE, ini_get_bool(CONFIG_DITTA, PAR_MOD, VIEWMOV_F9)); + } + m->run(); +} + +void TMonitor_mask::sel() const +{ + TSheet_field& sf = sfield(S_ELAB); + sf.hide(); + FOR_EACH_SHEET_ROW(sf, nr, row) + { + if (*row->get(0) == 'X') + row->add("", 0); + } + sf.force_update(); + sf.show(); +} + + + + +///////////////////////////////////////////// +// TControllo_mask +///////////////////////////////////////////// + +void TControllo_mask::associa() // todo: levare gli ultimi residui del vecchio funzionamento del controllo errori +{ + TToken_string* mov_sel = selected_mov(); + TToken_string* fat_sel = selected_fat(); + if (mov_sel == nullptr || fat_sel == nullptr) + { + warning_box("Selezionare prima un movimento e una fattura elettronica."); + return; + } + TToken_string keys(fat_sel->get(cid2index(F_FPROKEYS)), ';'); + fppro_db().set_keys(keys); + const bool ok = fppro_db().associa_mov(mov_sel->get_int(cid2index(F_CNUMREG))); + if (ok) + { + // Tolgo il flag di in errore sul vettore in modo da rifare la fill e non venir piu' contato come da controllare + auto it = _movs.begin(); + int count = -1; + while (count < _selected_mov && it != _movs.end()) + { + if (it->get(0)[0] == 'X') // Devo saltare tutti quelli che non hanno il flag e contare solo quelli che ce l'hanno + count++; + if (count < _selected_mov) + ++it; + } + it->add(' ', 0); + TF9_dberr::del_err(_id_estr, mov_sel->get_int(cid2index(F_CNUMREG))); + } +} + +void TControllo_mask::conferma_esclusi() const +{ + const TMask& mask = *this; + TSheet_field& sf = mask.sfield(S_CONTROLLO); + sf.hide(); + FOR_EACH_SHEET_ROW(sf, nr, row) + { + TLocalisamfile movs(LF_MOV); + movs.put(MOV_NUMREG, row->get_int(cid2index(F_CNUMREG))); + movs.read(); + if (*row->get(cid2index(F_CESCLUDI)) == 'X') + { + const TDate today(TODAY); + TToken_string stato("", ';'); + stato.add("", 0); + stato.add(today.date2ansi()); + stato.add("X"); + movs.put(MOV_ELABF9, stato); + movs.rewrite(); + row->add("Si", cid2index(F_CESCLUSO)); + TString query; + query << "UPDATE " F9_ERR " SET ESCLUSO = 'Si' WHERE IDESTR = '" << _id_estr << "' AND NUMREG = '" << row->get(cid2index(F_CNUMREG)) << "';"; + fp_db().sq_set_exec(query); + } + else + { + if (movs.get(MOV_ELABF9).full()) + { + movs.put(MOV_ELABF9, ""); + row->add("", cid2index(F_CESCLUSO)); + movs.rewrite(); + TString query; + query << "UPDATE " F9_ERR " SET ESCLUSO = NULL WHERE IDESTR = '" << _id_estr << "' AND NUMREG = '" << row->get(cid2index(F_CNUMREG)) << "';"; + fp_db().sq_set_exec(query); + } + } + } + sf.force_update(); + sf.show(); +} + +vector& TControllo_mask::import_error_list() +{ + static vector controllo_mov; + controllo_mov.clear(); + TF9_dberr dberr; + _tipo_doc_err = dberr.get_errori(_id_estr, controllo_mov); + return controllo_mov; +} + +void TControllo_mask::fill() +{ + TSheet_field& sf = sfield(S_CONTROLLO); + sf.hide(); + sf.destroy(); + _movs = !_is_escluso ? import_error_list() : f9_app()._esclusi; // Prendo da _esclusi se sto aprendo il controllo dalla maschera degli esclusi + + for (auto it = _movs.begin(); it != _movs.end(); ++it) + { + TToken_string& row = sf.row(-1); + if (*it->get(0) == 'X') + { + row = *it; + row[0] = (char&)" "; + /*if (!_is_escluso && _tipo_doc_err == 'A' || _is_escluso && f9_app().get_tipoiva_escl() == iva_acquisti) + row.add("", cid2index(F_CESCLUDI)); + else + row.add("X", cid2index(F_CESCLUDI));*/ + } + } + sf.force_update(); + sf.show(); + + // Fill fppro sheet + if (!_is_escluso && _tipo_doc_err == 'A' || _is_escluso && f9_app().get_tipoiva_escl() == iva_acquisti) + fill_fppro_sheet(); +} + +void TControllo_mask::fill_fppro_sheet() const +{ + TSheet_field& sf = sfield(S_FPPRO); + sf.hide(); + sf.destroy(); + const char* order; + switch (_ordin) + { + default: + case 'D': order = "P7_DATA"; break; + case 'N': order = "P7_NUMERO"; break; + case 'F': order = "FORNITORE"; break; + case 'R': order = "P2_ANADENOMIN"; break; + case 'P': order = "P2_FISCIVACOD"; break; + } + TString query; + query << "SELECT PQ_KEYPRGINVIO AS KEYPRGINVIO, PQ_KEYHEADERFATT AS KEYHEADERFATT, PQ_KEYBODYFATT AS KEYBODYFATT,\n" << + "PZ_TIPODOC AS TIPODOC, P7_DATA AS DATA, P7_NUMERO AS NUMDOC, PQ_IMPTOTDOC AS IMPTOTDOC,\n" << + "CASE\n" << + "WHEN PZ_CLIFOR <> '' THEN CAST(PZ_CLIFOR AS NUMERIC(10, 0))\n" << + "WHEN PZ_CLIFOR = '' THEN 0\n" << + "END AS FORNITORE, " << + "P2_ANADENOMIN AS RAGSOC, P2_FISCIVAPAESE AS STATOPIVA, P2_FISCIVACOD AS PIVA FROM PAA2700F\n" << + "JOIN PAA0700F ON PQ_KEYPRGINVIO = P7_KEYPRGINVIO AND PQ_KEYHEADERFATT = P7_KEYHEADERFATT AND PQ_KEYBODYFATT = P7_KEYBODYFATT\n" << + "JOIN PAA0200F ON PQ_KEYPRGINVIO = P2_KEYPRGINVIO AND PQ_KEYHEADERFATT = P2_KEYHEADERFATT AND PQ_KEYBODYFATT = P2_KEYBODYFATT\n" << + "JOIN FPPRO00F ON PQ_KEYPRGINVIO = PZ_KEYPRGINVIO AND PQ_KEYHEADERFATT = PZ_KEYHEADERFATT AND PQ_KEYBODYFATT = PZ_KEYBODYFATT\n" << + "WHERE PZ_NUMREGCONT = '0' AND PZ_DATAREGCONT = '2001-01-01'\n" << + "ORDER BY " << order << " " << (_verso == 'A' ? "ASC" : "DESC") << "\n"; + fp_db().sq_set_exec(query, false); + + for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) + { + TToken_string& row = sf.row(-1); + row.add(fp_db().sq_get("TIPODOC"), 1); + row.add(fp_db().sq_get_date("DATA")); + row.add(fp_db().sq_get("NUMDOC")); + row.add(fp_db().sq_get("IMPTOTDOC")); + row.add(fp_db().sq_get("FORNITORE")); + row.add(fp_db().sq_get("RAGSOC")); + row.add(fp_db().sq_get("STATOPIVA")); + row.add(fp_db().sq_get("PIVA")); + row.add(fp_db().sq_get("KEYPRGINVIO") << ";" << fp_db().sq_get("KEYHEADERFATT") << ";" << fp_db().sq_get("KEYBODYFATT")); + } + sf.force_update(); + sf.show(); +} + +TMask& TControllo_mask::get_win_order() +{ + static TMask* m = nullptr; + + if (m == nullptr) + { + m = new TMask("Configurazione Archiviazione Sostitutiva", 1, 60, 10); + // TOOLBAR + m->add_button_tool(DLG_OK, "Conferma", TOOL_OK); + m->add_button_tool(DLG_NULL, "", 0); + m->add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + + // Ordinatori + m->add_radio(F_ORDER, 0, "Ordina per:", 1, 0, 59, "D|N|F|R|P", "DATA|NUMDOC|FORNITORE|RAGSOC|PIVA", "Z"); + m->add_radio(F_VERSO, 0, "Verso:", 1, 3, 59, "A|D", "Crescente|Decrescente", "Z"); + + //m->set_handler(DLG_OK, save_conf_handler); + _ordin = ini_get_string(CONFIG_DITTA, PAR_MOD, "ORDINAM", "D")[0]; + _verso = ini_get_string(CONFIG_DITTA, PAR_MOD, "VERSO", "A")[0]; + m->set(F_ORDER, &_ordin); + m->set(F_VERSO, &_verso); + + /*m->set(CF_CODSOC, ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9)); + m->set(CF_ADDRDOC, ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9));*/ + } + return *m; +} + +void TControllo_mask::open_win_order() +{ + TMask& m = get_win_order(); + m.run(); + _ordin = m.get(F_ORDER)[0]; + _verso = m.get(F_VERSO)[0]; + ini_set_string(CONFIG_DITTA, PAR_MOD, "ORDINAM", &_ordin); + ini_set_string(CONFIG_DITTA, PAR_MOD, "VERSO", &_verso); +} + +TToken_string* TControllo_mask::selected_mov() +{ + TSheet_field& movs = sfield(S_CONTROLLO); + FOR_EACH_SHEET_ROW(movs, nr, row) + { + if (row->get(0)[0] == 'X') + { + _selected_mov = nr; + return row; + } + } + return nullptr; +} + +TToken_string* TControllo_mask::selected_fat() const +{ + TSheet_field& fppro = sfield(S_FPPRO); + FOR_EACH_SHEET_ROW(fppro, nr, row) + { + if (row->get(0)[0] == 'X') + return row; + } + return nullptr; +} + +void TControllo_mask::selfatt(TOperable_field& o, const long jolly) const +{ + const TMask& mask = *this; + TSheet_field* sf; + if (jolly == 1) // Sheet controllo + sf = &mask.sfield(S_CONTROLLO); + else + sf = &mask.sfield(S_FPPRO); + sf->hide(); + FOR_EACH_SHEET_ROW(*sf, nr, row) + { + if (*row->get(0) == 'X') + row->add("", 0); + } + sf->force_update(); + sf->show(); +} + +bool TControllo_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { - case DLG_ELABORA: + case DLG_USER: + if (e == fe_button && jolly > 0) + { + TSheet_field& sf = sfield(S_CONTROLLO); + TToken_string& row = sf.row(sf.selected()); + TRectype mov(LF_MOV); + mov.put(MOV_NUMREG, row.get(sf.cid2index(F_NUMREG))); + if (open_mov(mov)) + fill(); + } + break; + case B_ORDER: if (e == fe_button) - open_win_estr(); + { + open_win_order(); + fill_fppro_sheet(); + } break; - case DLG_DELREC: + case B_ASSOC: if (e == fe_button) - delete_pack(); + { + associa(); + fill(); // Ricarico gli sheet + } break; - case DLG_CONFIG: + case B_ESCL: if (e == fe_button) - open_win_conf(); + { + conferma_esclusi(); + fill(); + } break; - case DLG_FINDREC: + case B_SELESCL: if (e == fe_button) - controllo_errori(); + { + _sel_esclusi = !_sel_esclusi; + field(B_ASSOC).enable(!_sel_esclusi); + field(B_ESCL).enable(_sel_esclusi); + field(B_ALLESCL).enable(_sel_esclusi); + sfield(S_CONTROLLO).enable_column(cid2index(F_CESCLUDI), _sel_esclusi); + sfield(S_CONTROLLO).force_update(); + } break; - case DLG_RECALC: - fill(); - break; - case B_SHOWESTR: - open_mostra_estrazione(); - break; - case B_SHOWESCL: + case B_ALLESCL: if (e == fe_button) - f9_app().open_esclusi(); + { + TSheet_field& sf = sfield(S_CONTROLLO); + sf.hide(); + const bool active = *sf.row(0).get(cid2index(F_CESCLUDI)) == 'X'; + FOR_EACH_SHEET_ROW(sf, nr, row) + row->add(active ? " " : "X", cid2index(F_CESCLUDI)); + sf.force_update(); + sf.show(); + } break; - case F_SEL: + case S_CONTROLLO: + if (e == fe_init) + sfield(S_CONTROLLO).enable_column(cid2index(F_CESCLUDI), false); + break; + case F_CSEL: if (e == fe_modify) - sel(); + selfatt(o, jolly); + break; default: break; } return true; } +TControllo_mask::TControllo_mask(const char* id_estr, bool esclusi) : TAutomask("f90100b"), _ordin('D'), _verso('A'), _selected_mov(0), _sel_esclusi(false) +{ + _id_estr = id_estr; + field(B_ESCL).disable(); + field(B_ALLESCL).disable(); + get_win_order(); + _is_escluso = esclusi; + + // Fill controllo sheet + fill(); +} + + + //////////////////////////////////////////////////////// // TF9_app //////////////////////////////////////////////////////// +const char* TF9_app::traduci_stato(const TString& cod) +{ + static TString stato; + static TString last_cod; + if (last_cod != cod) + { + last_cod = cod; + stato.cut(0); + if (cod == "01") + stato << "in diagnostica"; + else if (cod == "02") + stato << "errore diagnostica gestionale"; + else if (cod == "03") + stato << "diagnostica gestionale passata"; + else if (cod == "04") + stato << "controllo WebApp"; + else if (cod == "05") + stato << "errore diagnostica WebApp"; + else if (cod == "06") + stato << "diagnostica WebApp passata"; + else if (cod == "07") + stato << "in elaborazione da sostitutiva"; + else if (cod == "08") + stato << "errore diagnostica da sostitutiva"; + else if (cod == "09") + stato << "Archiviato"; + } + return (const char*)stato; +} + // Estrazione esclusi bool TF9_app::select_escl_notify(TSheet_field& s, int row, KEY key) @@ -702,19 +1106,6 @@ bool TF9_app::mov_handler_escl(TMask_field& f, KEY key) return open_mov(mov); } -TMask& descr_msk() -{ - static TMask* m = nullptr; - if (m == nullptr) - { - m = new TMask("Estrazione", 1, 60, 5); - m->add_button_tool(DLG_OK, "Conferma", TOOL_OK); - m->add_groupbox(DES_GROUP, 0, "Inserire descrizione estrazione:", 1, 0, 59, 3, ""); - m->add_string(DES_TEXT, 0, "Descrizione", 4, 1, 250, "", 40); - } - return *m; -} - void TF9_app::edit_wa() const { TString query; @@ -804,36 +1195,6 @@ void TF9_app::print_log() _log.cut(0); } -const char* TF9_app::traduci_stato(const TString& cod) -{ - static TString stato; - static TString last_cod; - if (last_cod != cod) - { - last_cod = cod; - stato.cut(0); - if (cod == "01") - stato << "in diagnostica"; - else if (cod == "02") - stato << "errore diagnostica gestionale"; - else if (cod == "03") - stato << "diagnostica gestionale passata"; - else if (cod == "04") - stato << "controllo WebApp"; - else if (cod == "05") - stato << "errore diagnostica WebApp"; - else if (cod == "06") - stato << "diagnostica WebApp passata"; - else if (cod == "07") - stato << "in elaborazione da sostitutiva"; - else if (cod == "08") - stato << "errore diagnostica da sostitutiva"; - else if (cod == "09") - stato << "Archiviato"; - } - return (const char*)stato; -} - bool TF9_app::is_autofattura(const TLocalisamfile& mov) { return TCausale(mov.get(MOV_CODCAUS)).tipo_doc() == "AF"; @@ -872,39 +1233,6 @@ void TF9_app::segna_in_errore() const fp_db().sq_set_exec(query); } -#ifdef DBG -void pulisci_mov() -{ - TLocalisamfile mov(LF_MOV); - mov.setkey(2); - mov.put(MOV_DATAREG, TDate("01-01-2002")); - mov.read(); - do - { - mov.put(MOV_ELABF9, ""); - mov.write(); - mov.rewrite(); - } while (mov.next() == NOERR); -} -#endif - -void TF9_app::main_loop() -{ - if (!check_table()) - fatal_box("Controllo tabelle modulo fallito."); -#ifdef DBG - //pulisci_mov(); -#endif - - _msk = make_unique(); - _estr_msk = make_unique(); - - while (_msk->run() != K_QUIT) {} - - /*delete _msk; - delete _estr_msk;*/ -} - bool TF9_app::create_tables() const { bool ok = aggiorna_tab_f9(100); @@ -1027,6 +1355,39 @@ bool TF9_app::check_table() const return true; } +#ifdef DBG +void pulisci_mov() +{ + TLocalisamfile mov(LF_MOV); + mov.setkey(2); + mov.put(MOV_DATAREG, TDate("01-01-2002")); + mov.read(); + do + { + mov.put(MOV_ELABF9, ""); + mov.write(); + mov.rewrite(); + } while (mov.next() == NOERR); +} +#endif + +void TF9_app::main_loop() +{ + if (!check_table()) + fatal_box("Controllo tabelle modulo fallito."); +#ifdef DBG + //pulisci_mov(); +#endif + + _msk = make_unique(); + _estr_msk = make_unique(); + + while (_msk->run() != K_QUIT) {} + + /*delete _msk; + delete _estr_msk;*/ +} + TF9_app& f9_app() { static TF9_app* app = nullptr; @@ -1041,356 +1402,3 @@ int f90100(int argc, char* argv[]) app.run(argc, argv, TR("Archiviazione Sostitutiva")); return 0; } - - -///////////////////////////////////////////// -// TControllo_mask -///////////////////////////////////////////// - -vector& TControllo_mask::import_error_list() -{ - static vector controllo_mov; - controllo_mov.clear(); - TF9_dberr dberr; - _tipo_doc_err = dberr.get_errori(_id_estr, controllo_mov); - return controllo_mov; -} - -void TControllo_mask::fill() -{ - TSheet_field& sf = sfield(S_CONTROLLO); - sf.hide(); - sf.destroy(); - _movs = !_is_escluso ? import_error_list() : f9_app()._esclusi; // Prendo da _esclusi se sto aprendo il controllo dalla maschera degli esclusi - - for (auto it = _movs.begin(); it != _movs.end(); ++it) - { - TToken_string& row = sf.row(-1); - if (*it->get(0) == 'X') - { - row = *it; - row[0] = (char&)" "; - /*if (!_is_escluso && _tipo_doc_err == 'A' || _is_escluso && f9_app().get_tipoiva_escl() == iva_acquisti) - row.add("", cid2index(F_CESCLUDI)); - else - row.add("X", cid2index(F_CESCLUDI));*/ - } - } - sf.force_update(); - sf.show(); - - // Fill fppro sheet - if (!_is_escluso && _tipo_doc_err == 'A' || _is_escluso && f9_app().get_tipoiva_escl() == iva_acquisti) - fill_fppro_sheet(); -} - -void TControllo_mask::fill_fppro_sheet() const -{ - TSheet_field& sf = sfield(S_FPPRO); - sf.hide(); - sf.destroy(); - const char* order; - switch (_ordin) - { - default: - case 'D': order = "P7_DATA"; break; - case 'N': order = "P7_NUMERO"; break; - case 'F': order = "FORNITORE"; break; - case 'R': order = "P2_ANADENOMIN"; break; - case 'P': order = "P2_FISCIVACOD"; break; - } - TString query; - query << "SELECT PQ_KEYPRGINVIO AS KEYPRGINVIO, PQ_KEYHEADERFATT AS KEYHEADERFATT, PQ_KEYBODYFATT AS KEYBODYFATT,\n" << - "PZ_TIPODOC AS TIPODOC, P7_DATA AS DATA, P7_NUMERO AS NUMDOC, PQ_IMPTOTDOC AS IMPTOTDOC,\n" << - "CASE\n" << - "WHEN PZ_CLIFOR <> '' THEN CAST(PZ_CLIFOR AS NUMERIC(10, 0))\n" << - "WHEN PZ_CLIFOR = '' THEN 0\n" << - "END AS FORNITORE, " << - "P2_ANADENOMIN AS RAGSOC, P2_FISCIVAPAESE AS STATOPIVA, P2_FISCIVACOD AS PIVA FROM PAA2700F\n" << - "JOIN PAA0700F ON PQ_KEYPRGINVIO = P7_KEYPRGINVIO AND PQ_KEYHEADERFATT = P7_KEYHEADERFATT AND PQ_KEYBODYFATT = P7_KEYBODYFATT\n" << - "JOIN PAA0200F ON PQ_KEYPRGINVIO = P2_KEYPRGINVIO AND PQ_KEYHEADERFATT = P2_KEYHEADERFATT AND PQ_KEYBODYFATT = P2_KEYBODYFATT\n" << - "JOIN FPPRO00F ON PQ_KEYPRGINVIO = PZ_KEYPRGINVIO AND PQ_KEYHEADERFATT = PZ_KEYHEADERFATT AND PQ_KEYBODYFATT = PZ_KEYBODYFATT\n" << - "WHERE PZ_NUMREGCONT = '0' AND PZ_DATAREGCONT = '2001-01-01'\n" << - "ORDER BY " << order << " " << (_verso == 'A' ? "ASC" : "DESC") << "\n"; - fp_db().sq_set_exec(query, false); - - for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) - { - TToken_string& row = sf.row(-1); - row.add(fp_db().sq_get("TIPODOC"), 1); - row.add(fp_db().sq_get_date("DATA")); - row.add(fp_db().sq_get("NUMDOC")); - row.add(fp_db().sq_get("IMPTOTDOC")); - row.add(fp_db().sq_get("FORNITORE")); - row.add(fp_db().sq_get("RAGSOC")); - row.add(fp_db().sq_get("STATOPIVA")); - row.add(fp_db().sq_get("PIVA")); - row.add(fp_db().sq_get("KEYPRGINVIO") << ";" << fp_db().sq_get("KEYHEADERFATT") << ";" << fp_db().sq_get("KEYBODYFATT")); - } - sf.force_update(); - sf.show(); -} - -TMask& TControllo_mask::get_win_order() -{ - static TMask* m = nullptr; - - if (m == nullptr) - { - m = new TMask("Configurazione Archiviazione Sostitutiva", 1, 60, 10); - // TOOLBAR - m->add_button_tool(DLG_OK, "Conferma", TOOL_OK); - m->add_button_tool(DLG_NULL, "", 0); - m->add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); - - // Ordinatori - m->add_radio(F_ORDER, 0, "Ordina per:", 1, 0, 59, "D|N|F|R|P", "DATA|NUMDOC|FORNITORE|RAGSOC|PIVA", "Z"); - m->add_radio(F_VERSO, 0, "Verso:", 1, 3, 59, "A|D", "Crescente|Decrescente", "Z"); - - //m->set_handler(DLG_OK, save_conf_handler); - _ordin = ini_get_string(CONFIG_DITTA, PAR_MOD, "ORDINAM", "D")[0]; - _verso = ini_get_string(CONFIG_DITTA, PAR_MOD, "VERSO", "A")[0]; - m->set(F_ORDER, &_ordin); - m->set(F_VERSO, &_verso); - - /*m->set(CF_CODSOC, ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9)); - m->set(CF_ADDRDOC, ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9));*/ - } - return *m; -} - -void TControllo_mask::open_win_order() -{ - TMask& m = get_win_order(); - m.run(); - _ordin = m.get(F_ORDER)[0]; - _verso = m.get(F_VERSO)[0]; - ini_set_string(CONFIG_DITTA, PAR_MOD, "ORDINAM", &_ordin); - ini_set_string(CONFIG_DITTA, PAR_MOD, "VERSO", &_verso); -} - -TToken_string* TControllo_mask::selected_mov() -{ - TSheet_field& movs = sfield(S_CONTROLLO); - FOR_EACH_SHEET_ROW(movs, nr, row) - { - if (row->get(0)[0] == 'X') - { - _selected_mov = nr; - return row; - } - } - return nullptr; -} - -TToken_string* TControllo_mask::selected_fat() const -{ - TSheet_field& fppro = sfield(S_FPPRO); - FOR_EACH_SHEET_ROW(fppro, nr, row) - { - if (row->get(0)[0] == 'X') - return row; - } - return nullptr; -} - -void TControllo_mask::associa() // todo: levare gli ultimi residui del vecchio funzionamento del controllo errori -{ - TToken_string* mov_sel = selected_mov(); - TToken_string* fat_sel = selected_fat(); - if (mov_sel == nullptr || fat_sel == nullptr) - { - warning_box("Selezionare prima un movimento e una fattura elettronica."); - return; - } - TToken_string keys(fat_sel->get(cid2index(F_FPROKEYS)), ';'); - fppro_db().set_keys(keys); - const bool ok = fppro_db().associa_mov(mov_sel->get_int(cid2index(F_CNUMREG))); - if (ok) - { - // Tolgo il flag di in errore sul vettore in modo da rifare la fill e non venir piu' contato come da controllare - auto it = _movs.begin(); - int count = -1; - while (count < _selected_mov && it != _movs.end()) - { - if (it->get(0)[0] == 'X') // Devo saltare tutti quelli che non hanno il flag e contare solo quelli che ce l'hanno - count++; - if (count < _selected_mov) - ++it; - } - it->add(' ', 0); - TF9_dberr::del_err(_id_estr, mov_sel->get_int(cid2index(F_CNUMREG))); - } -} - -void TControllo_mask::selfatt(TOperable_field& o, const long jolly) const -{ - const TMask& mask = *this; - TSheet_field* sf; - if (jolly == 1) // Sheet controllo - sf = &mask.sfield(S_CONTROLLO); - else - sf = &mask.sfield(S_FPPRO); - sf->hide(); - FOR_EACH_SHEET_ROW(*sf, nr, row) - { - if (*row->get(0) == 'X') - row->add("", 0); - } - sf->force_update(); - sf->show(); -} - -void TControllo_mask::conferma_esclusi() const -{ - const TMask& mask = *this; - TSheet_field& sf = mask.sfield(S_CONTROLLO); - sf.hide(); - FOR_EACH_SHEET_ROW(sf, nr, row) - { - TLocalisamfile movs(LF_MOV); - movs.put(MOV_NUMREG, row->get_int(cid2index(F_CNUMREG))); - movs.read(); - if (*row->get(cid2index(F_CESCLUDI)) == 'X') - { - const TDate today(TODAY); - TToken_string stato("", ';'); - stato.add("", 0); - stato.add(today.date2ansi()); - stato.add("X"); - movs.put(MOV_ELABF9, stato); - movs.rewrite(); - row->add("Si", cid2index(F_CESCLUSO)); - TString query; - query << "UPDATE " F9_ERR " SET ESCLUSO = 'Si' WHERE IDESTR = '" << _id_estr << "' AND NUMREG = '" << row->get(cid2index(F_CNUMREG)) << "';"; - fp_db().sq_set_exec(query); - } - else - { - if (movs.get(MOV_ELABF9).full()) - { - movs.put(MOV_ELABF9, ""); - row->add("", cid2index(F_CESCLUSO)); - movs.rewrite(); - TString query; - query << "UPDATE " F9_ERR " SET ESCLUSO = NULL WHERE IDESTR = '" << _id_estr << "' AND NUMREG = '" << row->get(cid2index(F_CNUMREG)) << "';"; - fp_db().sq_set_exec(query); - } - } - } - sf.force_update(); - sf.show(); -} - -bool TControllo_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - switch (o.dlg()) - { - case DLG_USER: - if (e == fe_button && jolly > 0) - { - TSheet_field& sf = sfield(S_CONTROLLO); - TToken_string& row = sf.row(sf.selected()); - TRectype mov(LF_MOV); - mov.put(MOV_NUMREG, row.get(sf.cid2index(F_NUMREG))); - if (open_mov(mov)) - fill(); - } - break; - case B_ORDER: - if (e == fe_button) - { - open_win_order(); - fill_fppro_sheet(); - } - break; - case B_ASSOC: - if (e == fe_button) - { - associa(); - fill(); // Ricarico gli sheet - } - break; - case B_ESCL: - if (e == fe_button) - { - conferma_esclusi(); - fill(); - } - break; - case B_SELESCL: - if (e == fe_button) - { - _sel_esclusi = !_sel_esclusi; - field(B_ASSOC).enable(!_sel_esclusi); - field(B_ESCL).enable(_sel_esclusi); - field(B_ALLESCL).enable(_sel_esclusi); - sfield(S_CONTROLLO).enable_column(cid2index(F_CESCLUDI), _sel_esclusi); - sfield(S_CONTROLLO).force_update(); - } - break; - case B_ALLESCL: - if (e == fe_button) - { - TSheet_field& sf = sfield(S_CONTROLLO); - sf.hide(); - const bool active = *sf.row(0).get(cid2index(F_CESCLUDI)) == 'X'; - FOR_EACH_SHEET_ROW(sf, nr, row) - row->add(active ? " " : "X", cid2index(F_CESCLUDI)); - sf.force_update(); - sf.show(); - } - break; - case S_CONTROLLO: - if (e == fe_init) - sfield(S_CONTROLLO).enable_column(cid2index(F_CESCLUDI), false); - break; - case F_CSEL: - if (e == fe_modify) - selfatt(o, jolly); - break; - default: break; - } - return true; -} - -TControllo_mask::TControllo_mask(const char* id_estr, bool esclusi) : TAutomask("f90100b"), _ordin('D'), _verso('A'), _selected_mov(0), _sel_esclusi(false) -{ - _id_estr = id_estr; - field(B_ESCL).disable(); - field(B_ALLESCL).disable(); - get_win_order(); - _is_escluso = esclusi; - - // Fill controllo sheet - fill(); -} - -const TString& recset_get_string(const TRecordset& rec, const char* field, const int zero_filled) -{ - const TString& str = rec.get(rec.find_column(field)).as_string(); - if (zero_filled == -1) - return str; - static TString c; - c.cut(0); - const int len = str.len(); - for (int i = len; i < zero_filled; i++) // Sistemo il codcaus per via del TVariant che non restituisce la stringa esattamente come l'originale - c << "0"; - c << str; - return c; -} - -bool recset_get_bool(const TRecordset& rec, const char* field) -{ - return rec.get(rec.find_column(field)).as_bool(); -} - -real recset_get_real(const TRecordset& rec, const char* field) -{ - return rec.get(rec.find_column(field)).as_real(); -} - -int recset_get_int(const TRecordset& rec, const char* field, const int zero_filled) -{ - return rec.get(rec.find_column(field)).as_int(); -}