diff --git a/src/f9/f90.cpp b/src/f9/f90.cpp index 72a89c48a..4565b9822 100644 --- a/src/f9/f90.cpp +++ b/src/f9/f90.cpp @@ -8,11 +8,12 @@ int main(int argc, char** argv) switch (r) { - default: - case 0: rt = f90100(argc, argv); break; // Programma estrazione pacchetti - case 1: rt = f90200(argc, argv); break; // Tabella categorie documentali - case 2: rt = f90300(argc, argv); break; // Gestione documenti cartacei - case 3: rt = f90400(argc, argv); break; // Test classi + default: + case 0: rt = f90100(argc, argv); break; // Programma estrazione pacchetti + case 1: rt = f90200(argc, argv); break; // Tabella categorie documentali + case 2: rt = f90300(argc, argv); break; // Gestione documenti cartacei + case 3: rt = f90400(argc, argv); break; // Test classi + case 4: rt = f90500(argc, argv); break; // Ripristino archiviazioni } return rt; } diff --git a/src/f9/f90.h b/src/f9/f90.h index 0838729f2..dfe558ed3 100644 --- a/src/f9/f90.h +++ b/src/f9/f90.h @@ -5,5 +5,6 @@ int f90100(int argc, char* argv[]); int f90200(int argc, char* argv[]); int f90300(int argc, char* argv[]); int f90400(int argc, char* argv[]); +int f90500(int argc, char* argv[]); #endif // _F90_H_ diff --git a/src/f9/f90100.cpp b/src/f9/f90100.cpp index 7934f0bec..e9a53fa4d 100644 --- a/src/f9/f90100.cpp +++ b/src/f9/f90100.cpp @@ -27,48 +27,10 @@ #define TAB_BASE_VERSION 100 // Versione base delle tabelle #define SQL_VERSION 104 // Utilizzo questo per controllare la versione attuale delle tabelle e nel caso aggiornarle -//////////////////////////////////////////////////////// -// 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; -} - -TMask& esclusi_mask() -{ - static TMask * _esclusi_mask = nullptr; - if (_esclusi_mask == nullptr) - { - _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 - - 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 - - m.field(DLG_FINDREC).disable(); - } - return *_esclusi_mask; -} - //////////////////////////////////////////////////////// // TEstrai_mask //////////////////////////////////////////////////////// - int TEstrai_mask::estrai() { const TDate dataini = get_dataini(); @@ -123,11 +85,8 @@ int TEstrai_mask::estrai() // Se definitivo controllo il flag di stampato REGST if ((flagpro || stampato) && numdoc.full() && iva == tipo) { - // Creo il movimento da inserire - movimento_t t(mov, tipo, escluso); - - // Effettivo inserimento del movimento - _estrazione->add_mov(t); + // Creo il movimento da inserire e lo inserisco + _estrazione->add_mov(new TMovimento_estr(mov, tipo, escluso)); ++count; } } @@ -248,18 +207,17 @@ TEstrai_mask::TEstrai_mask() : TMask("Estrazione", 1, 60, 16), _estrazione(nullp add_groupbox(ES_DESCGROUP, 0, "Inserire descrizione estrazione:", 1, 6, 59, 3, ""); add_string (ES_DESCR, 0, "Descrizione", 2, 7, 250, "", 40); - TMask::set_handler(DLG_ELABORA, estrai_handler); - TMask::set_handler(ES_DATAINI, dataini_handler); - TMask::set_handler(ES_DATAEND, dataend_handler); + set_handler(DLG_ELABORA, estrai_handler); + set_handler(ES_DATAINI, dataini_handler); + set_handler(ES_DATAEND, dataend_handler); TDate dt(TODAY); dt.set_day(1); dt.set_month(1); + set(ES_DATAINI, dt); set(ES_DATAEND, today); } - - //////////////////////////////////////////////////////// // TMonitor_mask //////////////////////////////////////////////////////// @@ -476,14 +434,13 @@ void TMonitor_mask::open_apri_estr_win() if (last_fill_id != id) { - _inclusi_mask = new TApri_estr_msk; - _inclusi_mask->set_from_row_estrazione(*row_estrazione); + _inclusi_mask.set_from_row_estrazione(*row_estrazione); - _inclusi_mask->fill_estr(); - _inclusi_mask->fill_res (); + _inclusi_mask.fill_estr(); + _inclusi_mask.fill_res (); last_fill_id = id; } - _inclusi_mask->run(); + _inclusi_mask.run(); } void TMonitor_mask::open_win_estr() @@ -495,32 +452,27 @@ void TMonitor_mask::open_win_estr() void TMonitor_mask::open_win_conf() { - static TMask* m = nullptr; + TMask m("Configurazione Archiviazione Sostitutiva", 1, 70, 20); - if (m == nullptr) - { - m = new TMask("Configurazione Archiviazione Sostitutiva", 1, 70, 20); + 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_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, 69, 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, 69, 4, ""); + m.add_string (CF_ADDRDOC, 0, "Server ", 2, 4, 256, "", 40); + m.add_string (CF_ADDRDOCLOC, 0, "Locale ", 2, 5, 256, "", 40); + m.add_groupbox (CF_ESTRGROUP, 0, "Opzioni estrazione", 1, 7, 69, 4, ""); + m.add_boolean (CF_CARTEXP, 0, "Estrai anche documenti cartacei", 2, 8); - m->add_groupbox (CF_CODGROUP, 0, "Codice Ambiente Societa' (WEBAPP):", 1, 0, 69, 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, 69, 4, ""); - m->add_string (CF_ADDRDOC, 0, "Server", 2, 4, 256, "", 40); - m->add_string (CF_ADDRDOCLOC, 0, "Locale", 2, 5, 256, "", 40); - m->add_groupbox (CF_ESTRGROUP, 0, "Opzioni estrazione", 1, 7, 69, 4, ""); - m->add_boolean (CF_CARTEXP, 0, "Estrai anche documenti cartacei", 2, 8); + m.set_handler(DLG_OK, save_conf_handler); - m->set_handler(DLG_OK, save_conf_handler); - - m->set(CF_CODSOC, F9CONF.get_ambiente()); - m->set(CF_ADDRDOC, F9CONF.get_addr_doc()); - m->set(CF_ADDRDOCLOC, F9CONF.get_addr_doc_loc()); - m->set(CF_CARTEXP, F9CONF.get_has_cartexp()); - } - m->run(); + m.set(CF_CODSOC, F9CONF.get_ambiente()); + m.set(CF_ADDRDOC, F9CONF.get_addr_doc()); + m.set(CF_ADDRDOCLOC, F9CONF.get_addr_doc_loc()); + m.set(CF_CARTEXP, F9CONF.get_has_cartexp()); + m.run(); } void TMonitor_mask::sel() const @@ -534,7 +486,7 @@ void TMonitor_mask::sel() const sf.force_update(); } -TMonitor_mask::TMonitor_mask(): TAutomask("f90100a"), _inclusi_mask(nullptr) +TMonitor_mask::TMonitor_mask() : TAutomask("f90100a") { // Controllo che esistano delle categorie documentali. TCategorie_doc catdoc; @@ -592,7 +544,6 @@ void TControllo_mask::conferma_esclusi() const if (sf.get_bool_row_cell(row, F_CESCLUDI)) { - const TDate today(TODAY); TToken_string stato("", ';'); stato.add("", 0); @@ -643,7 +594,7 @@ void TControllo_mask::fill() if (!_is_escluso) import_error_list(); else - _controllo_mov = f9_app()._esclusi; + _controllo_mov = f9_app().esclusi(); FOR_EACH_ARRAY_ROW(_controllo_mov, r, row) { TToken_string& sfrow = sf.row(-1); @@ -879,7 +830,7 @@ TControllo_mask::TControllo_mask(const char* codsoc, const char* id_estr, const if (!_is_escluso) import_error_list(); else - _controllo_mov = f9_app()._esclusi; + _controllo_mov = f9_app().esclusi(); _datada = EOTIME; _dataa = 0L; FOR_EACH_ARRAY_ROW(_controllo_mov, r, row) @@ -972,11 +923,11 @@ void TApri_estr_msk::conferma_esclusi() const FOR_EACH_SHEET_ROW_LOOP(sf, row) { const long nreg = sf.get_long_row_cell(row, FI_NUMREG); - TRectype & movs = (TRectype&)cache().get(LF_MOV, nreg); + TRectype & movs = (TRectype&)cache().get(LF_MOV, nreg); + const TString & da_escludere = sf.get_str_row_cell(row, FI_IESCLUDI); - if (sf.get_str_row_cell(row, FI_IESCLUDI) == "S") + if (da_escludere == "S") { - const TDate today(TODAY); TToken_string stato("", ';'); stato.add("", 0); @@ -1230,74 +1181,73 @@ void TF9_app::open_esclusi() /* Prima chiedo quale mese e anno visualizzare */ // FINESTRA - static TMask* ym_msk = nullptr; - if (ym_msk == nullptr) - { - ym_msk = new TMask("Mostra esclusi", 1, 25, 16); - ym_msk->add_button_tool(DLG_OK, "Conferma", TOOL_OK); - ym_msk->add_button_tool(DLG_NULL, "", 0); - ym_msk->add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); - ym_msk->add_groupbox(507, 0, "Movimenti da visualizzare:", 0, 0, 25, 6); - ym_msk->add_number(501, 0, "Anno", 1, 1, 4); - ym_msk->add_list(502, 0, "Mese", 1, 2, 8, "", "01|02|03|04|05|06|07|08|09|10|11|12", "Gennaio|Febbraio|Marzo|Aprile|Maggio|Giugno|Luglio|Agosto|Settembre|Ottobre|Novembre|Dicembre"); - ym_msk->add_list(503, 0, "Fino al", 1, 3, 9, "", " |01|02|03|04|05|06|07|08|09|10|11|12", " |Gennaio|Febbraio|Marzo|Aprile|Maggio|Giugno|Luglio|Agosto|Settembre|Ottobre|Novembre|Dicembre"); - ym_msk->add_groupbox(506, 0, "Selezionare il tipo di estrazione", 0, 6, 25); - ym_msk->add_list(504, 0, "Flag Provvisorio", 1, 7, 1, "", "P|D", "Provvisorio|Definitivo"); - ym_msk->add_list(505, 0, "Tipo doc.", 1, 4, 1, "", "A|V", "Acquisti|Vendite"); - ym_msk->set(501, today.year()); - ym_msk->set_handler(501, year_handler); - } - ym_msk->run(); - if (ym_msk->last_key() == K_QUIT) - return; + TMask ym_msk("Mostra esclusi", 1, 25, 16);; - _flagprov_escl = ym_msk->get(504)[0]; - _tipodoc_escl = ym_msk->get(505)[0]; + ym_msk.add_button_tool(DLG_OK, "Conferma", TOOL_OK); + ym_msk.add_button_tool(DLG_NULL, "", 0); + ym_msk.add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + ym_msk.add_groupbox(507, 0, "Movimenti da visualizzare:", 0, 0, 25, 6); + ym_msk.add_number(501, 0, "Anno", 1, 1, 4); + ym_msk.add_list(502, 0, "Mese", 1, 2, 8, "", "01|02|03|04|05|06|07|08|09|10|11|12", "Gennaio|Febbraio|Marzo|Aprile|Maggio|Giugno|Luglio|Agosto|Settembre|Ottobre|Novembre|Dicembre"); + ym_msk.add_list(503, 0, "Fino al", 1, 3, 9, "", " |01|02|03|04|05|06|07|08|09|10|11|12", " |Gennaio|Febbraio|Marzo|Aprile|Maggio|Giugno|Luglio|Agosto|Settembre|Ottobre|Novembre|Dicembre"); + ym_msk.add_groupbox(506, 0, "Selezionare il tipo di estrazione", 0, 6, 25); + ym_msk.add_list(504, 0, "Flag Provvisorio", 1, 7, 1, "", "P|D", "Provvisorio|Definitivo"); + ym_msk.add_list(505, 0, "Tipo doc.", 1, 4, 1, "", "A|V", "Acquisti|Vendite"); + ym_msk.set(501, today.year()); + ym_msk.set_handler(501, year_handler); + + if (ym_msk.run() == K_ENTER) + { + _flagprov_escl = ym_msk.get(504)[0]; + _tipodoc_escl = ym_msk.get(505)[0]; - /* Caricamento esclusi - * LOADING DI QUEL MESE E ANNO */ - f9_app()._esclusi_vect.destroy(); - const int anno = ym_msk->get_int(501); - const int mese = ym_msk->get_int(502); - const int to_m = ym_msk->get_int(503); - TLocalisamfile movs(LF_MOV); - movs.setkey(2); - const TDate from(1, mese, anno); - TDate to(from); - if (to_m != 0) - to.set_month(to_m); - to.set_end_month(); + /* Caricamento esclusi + * LOADING DI QUEL MESE E ANNO */ + f9_app()._esclusi_vect.destroy(); + const int anno = ym_msk.get_int(501); + const int mese = ym_msk.get_int(502); + const int to_m = ym_msk.get_int(503); - movs.put(MOV_DATAREG, from); - movs.read(); - if (movs.get_date(MOV_DATAREG) >= from && movs.get_date(MOV_DATAREG) <= to) - { - for (bool ok = true; ok && movs.get_date(MOV_DATAREG) <= to; ok = movs.next() == NOERR) - { - TToken_string stato(movs.get(MOV_ELABF9), ';'); - if (stato.items() == 3 && stato.get(2)[0] == 'X') - { - TToken_string m("", '|'); - m.add("", 0); - m.add(movs.get_int(MOV_NUMREG)); - m.add(movs.get_date(MOV_DATAREG)); - m.add(movs.get_date(MOV_DATADOC)); - m.add(movs.get(MOV_CODCAUS)); - m.add(movs.get(MOV_MESELIQ)); - TString numdoc; numdoc << movs.get(MOV_NUMDOCEXT); - m.add(numdoc.full() ? numdoc : movs.get(MOV_NUMDOC)); - const real imptot = movs.get_real(MOV_TOTDOC) + movs.get_real(MOV_RITFIS) + movs.get_real(MOV_RITSOC); - m.add(imptot); - m.add(movs.get_int(MOV_CODCF)); - TLocalisamfile clifo(LF_CLIFO); - clifo.put(CLI_TIPOCF, movs.get(MOV_TIPO)); - clifo.put(CLI_CODCF, movs.get(MOV_CODCF)); - m.add(clifo.read() == NOERR ? clifo.get(CLI_RAGSOC) : ""); - m.add(TString(movs.get(MOV_REG)) << "/" << movs.get(MOV_PROTIVA)); - m.add(movs.get(MOV_DESCR)); - f9_app()._esclusi_vect.add(m); - } - } + TLocalisamfile movs(LF_MOV); + + movs.setkey(2); + const TDate from(1, mese, anno); + TDate to(from); + if (to_m != 0) + to.set_month(to_m); + to.set_end_month(); + + movs.put(MOV_DATAREG, from); + movs.read(); + if (movs.get_date(MOV_DATAREG) >= from && movs.get_date(MOV_DATAREG) <= to) + { + for (bool ok = true; ok && movs.get_date(MOV_DATAREG) <= to; ok = movs.next() == NOERR) + { + TToken_string stato(movs.get(MOV_ELABF9), ';'); + if (stato.items() == 3 && stato.get(2)[0] == 'X') + { + TToken_string m("", '|'); + m.add("", 0); + m.add(movs.get_int(MOV_NUMREG)); + m.add(movs.get_date(MOV_DATAREG)); + m.add(movs.get_date(MOV_DATADOC)); + m.add(movs.get(MOV_CODCAUS)); + m.add(movs.get(MOV_MESELIQ)); + TString numdoc; numdoc << movs.get(MOV_NUMDOCEXT); + m.add(numdoc.full() ? numdoc : movs.get(MOV_NUMDOC)); + const real imptot = movs.get_real(MOV_TOTDOC) + movs.get_real(MOV_RITFIS) + movs.get_real(MOV_RITSOC); + m.add(imptot); + m.add(movs.get_int(MOV_CODCF)); + TLocalisamfile clifo(LF_CLIFO); + clifo.put(CLI_TIPOCF, movs.get(MOV_TIPO)); + clifo.put(CLI_CODCF, movs.get(MOV_CODCF)); + m.add(clifo.read() == NOERR ? clifo.get(CLI_RAGSOC) : ""); + m.add(TString(movs.get(MOV_REG)) << "/" << movs.get(MOV_PROTIVA)); + m.add(movs.get(MOV_DESCR)); + f9_app()._esclusi_vect.add(m); + } + } + } } if (f9_app()._esclusi_vect.empty()) @@ -1315,9 +1265,9 @@ void TF9_app::open_esclusi() void TF9_app::fill_esclusi() { TArray & esclusi = f9_app()._esclusi_vect; - TSheet_field& sf = esclusi_mask().sfield(S_ESCL); + TSheet_field& sf = _esclusi_mask->sfield(S_ESCL); - sf.destroy(); + sf.reset(); FOR_EACH_ARRAY_ROW(esclusi, r, row) sf.row(-1) = *row; sf.force_update(); @@ -1334,7 +1284,7 @@ bool TF9_app::estrai_escl_handler(TMask_field&, KEY key) descr_mask.add_string(DES_TEXT, 0, "Descrizione", 4, 1, 250, "", 40); if (descr_mask.run() == K_ENTER) { - TMask& msk = esclusi_mask(); + TMask& msk = *f9_app()._esclusi_mask; TArray & _esclusi = f9_app()._esclusi_vect; TSheet_field& sf = msk.sfield(S_ESCL); const TString descr = descr_mask.get(DES_TEXT); @@ -1351,14 +1301,14 @@ bool TF9_app::estrai_escl_handler(TMask_field&, KEY key) { if (sf.get_bool_row_cell(row, FE_SEL)) { - const movimento_t mov = f9_app().escl2mov(sf, row); + TMovimento_estr * mov = f9_app().escl2mov(sf, row); f9_app()._estr_escluso->add_mov(mov); _stats = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int stato = f9_app()._estr_escluso->estrai(); if (stato == 1) { _esclusi.destroy(row); // Tolto il movimento estratto dal vettore e setto come estratto su elabf9 di mov - f9_app().segna_estratti(true, mov.numreg()); + f9_app().segna_estratti(true, mov->numreg()); } flag = true; break; @@ -1368,14 +1318,14 @@ bool TF9_app::estrai_escl_handler(TMask_field&, KEY key) message_box("Selezionare il movimento da estrarre"); else f9_app().print_log(); - fill_esclusi(); + f9_app().fill_esclusi(); } return true; } bool TF9_app::mov_handler_escl(TMask_field& f, KEY key) { - TSheet_field& sf = esclusi_mask().sfield(S_ESCL); + TSheet_field& sf = f9_app().esclusi_mask().sfield(S_ESCL); TToken_string& row = sf.row(sf.selected()); TRectype mov(LF_MOV); mov.put(MOV_NUMREG, row.get(sf.cid2index(FE_NUMREG))); @@ -1411,10 +1361,10 @@ bool TF9_app::is_autofattura(const TLocalisamfile& mov) bool TF9_app::segna_estratti(const bool escluso, const int numreg) { bool ok = true; - TArray escl; // + TArray escl; // if (escluso) - escl.add(movimento_t(numreg)); // todo: datareg? + escl.add(TMovimento_estr(numreg)); // todo: datareg? TArray& movs_v = escluso ? escl : _movs; TToken_string elab("X", ';'); // "[flag estratto]; @@ -1422,7 +1372,7 @@ bool TF9_app::segna_estratti(const bool escluso, const int numreg) elab.add(today.date2ansi()); elab.add(" "); // "[flag estratto];[data estrazione];[flag escluso]" FOR_EACH_ARRAY_ITEM(movs_v, r, obj) { - const movimento_t & t = (movimento_t &) *obj; + const TMovimento_estr & t = (TMovimento_estr &) *obj; TRectype& mov = (TRectype&) cache().get(LF_MOV, t.numreg()); mov.put(MOV_ELABF9, elab); @@ -1573,27 +1523,21 @@ void TF9_app::main_loop() { if (!check_table()) fatal_box("Controllo tabelle modulo fallito."); -#ifdef DBG - //pulisci_mov(); -#endif + _esclusi_mask = new TMask("f90100c.msk", 0, 1); - _msk = new TMonitor_mask; - _estr_msk = new TEstrai_mask; + _esclusi_mask->sfield(S_ESCL).set_notify(select_escl_notify); // Handler dello sheet per selezione singola + _esclusi_mask->set_handler(DLG_FINDREC, controllo_escl_handler); // Bottone per aprire maschera di controllo movimenti + _esclusi_mask->set_handler(B_ESTRAI, estrai_escl_handler); // Bottone estrai + TMask& sheet_m = _esclusi_mask->sfield(S_ESCL).sheet_mask(); // Maschera dei campi dello sheet + sheet_m.set_handler(DLG_USER, mov_handler_escl); // Bottone collega movimento + + _esclusi_mask->field(DLG_FINDREC).disable(); + _estr_msk = new TEstrai_mask; + _msk = new TMonitor_mask; while (_msk->run() != K_QUIT) { } - - /*delete _msk; - delete _estr_msk;*/ } -TF9_app::TF9_app() - : _estr_msk(nullptr), _msk(nullptr), _mov_escl("", '|'), - _tipodoc_escl('A'), _flagprov_escl('P'), _estr_escluso(nullptr) -{ } - - - - int f90100(const int argc, char* argv[]) { TF9_app app; diff --git a/src/f9/f90100.h b/src/f9/f90100.h index d48ff3a71..9debe5eed 100644 --- a/src/f9/f90100.h +++ b/src/f9/f90100.h @@ -43,22 +43,107 @@ public: ~TEstrai_mask() { safe_delete(_estrazione); }; }; +class TApri_estr_msk : public TAutomask +{ + TString _idestr; + TDate _dataestr; + bool _provv; + char _tipodoc; + TString _statoestr; + TDate _datadal; + TDate _dataal; + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; + bool inall_handler() const; + bool inescludi_handler() const; + bool inselect_handler() const; + void conferma_esclusi() const; +public: + void fill_estr() const; + void fill_res() const; + void set_from_row_estrazione(TToken_string& row_estrazione); + + TApri_estr_msk(); + ~TApri_estr_msk() {} +}; +class TMonitor_mask : public TAutomask +{ +// friend class TF9_app; + TString_array _fppro; + TApri_estr_msk _inclusi_mask; + + // Configurazione mask + static bool save_conf_handler(TMask_field& f, KEY key); + + // Metodi per la maschera 'Apri Estr.' + + void open_apri_estr_win(); + + // Controllo estr. mask + void controllo_errori() const; + static void delete_estr_fld(const TString& idestr); + void delete_pack(bool all = false) const; + + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; + static void open_win_estr(); + static void open_win_conf(); + void sel() const; + +public: + // Riempie sheet per visualizzare le estrazioni + void fill() const; + + TMonitor_mask(); + ~TMonitor_mask() {} +}; + +class TControllo_mask : public TAutomask +{ + TArray _controllo_mov; // Usare import_error_list(). + char _ordin; + char _verso; + int _selected_mov; + bool _sel_esclusi; + bool _is_escluso; + TString _cod_soc; + TString _id_estr; + char _tipo_doc_err{}; + TDate _datada; + TDate _dataa; + + void associa(); + void conferma_esclusi() const; + + TArray& import_error_list(); + void fill(); + void fill_fppro_sheet() const; + TMask& get_win_order(); + void open_win_order(); + + TToken_string* selected_mov(); + TToken_string* selected_fat() const; + + /** Gestisce la selezione multipla negli sheet di controllo movimenti */ + void selfatt(TOperable_field& o, long jolly) const; + + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; +public: + TControllo_mask(const char* codsoc, const char* id_estr, bool esclusi = false); +}; class TF9_app : public TSkeleton_application -{ - //friend class TEstrai_mask; - friend class TMonitor_mask; +{ +// friend class TMonitor_mask; friend class TEstrai_mask; - friend class TControllo_mask; - friend class TApri_estr_msk; +// friend class TControllo_mask; +// friend class TApri_estr_msk; friend class TEstrazione; - - TEstrai_mask * _estr_msk; - TMonitor_mask * _msk; - TArray _movs; // movimento_t + TMask * _esclusi_mask; + TEstrai_mask * _estr_msk; + TMonitor_mask * _msk; + TArray _movs; // TMovimento_estr TArray _esclusi; // Vettore con i movimenti esclusi TArray _esclusi_vect; TToken_string _mov_escl; @@ -69,15 +154,16 @@ class TF9_app : public TSkeleton_application char get_tipodoc_escl() const { return _tipodoc_escl; } - TipoIVA get_tipoiva_escl() const { return get_tipodoc_escl() == 'A' ? iva_acquisti : iva_vendite; } - // Dato il codice stato estrazione (es. "01") viene restituito il suo significato a parole (es. "in diagnostica"). - static const char* traduci_stato(const TString& cod); - static bool is_stato_errore(const TString& stato_etr); + TMask & esclusi_mask() { return *_esclusi_mask; } public: + TArray & esclusi() { return _esclusi; } + TipoIVA get_tipoiva_escl() const { return get_tipodoc_escl() == 'A' ? iva_acquisti : iva_vendite; } + static const char* traduci_stato(const TString& cod); + static bool is_stato_errore(const TString& stato_etr); /** Mostra la finestrella per l'inserimento delle opzioni per l'estrazione e avviarla. */ - void run_estr_msk() const { _estr_msk->run(); } + void run_estr_msk() { _estr_msk->run(); } void notify_estraction() const; // Estrazione esclusi - handlers @@ -88,9 +174,9 @@ public: static bool estrai_escl_handler(TMask_field&, KEY key); void open_esclusi(); - static void fill_esclusi(); + void fill_esclusi(); - movimento_t TF9_app::escl2mov(TSheet_field & sf, int row) { return movimento_t(sf, row); } + TMovimento_estr * TF9_app::escl2mov(TSheet_field & sf, int row) { return new TMovimento_estr(sf, row); } static bool mov_handler_escl(TMask_field&, KEY key); @@ -119,113 +205,18 @@ private: public: void main_loop() override; - TF9_app(); - ~TF9_app() { safe_delete(_estr_msk); safe_delete(_msk); } + TF9_app::TF9_app() : _mov_escl("", '|'), _tipodoc_escl('A'), _flagprov_escl('P'), _estr_escluso(nullptr) {} + ~TF9_app() { safe_delete(_esclusi_mask); safe_delete(_estr_msk); } }; inline TF9_app& f9_app() { - static TF9_app* app = nullptr; - if (app == nullptr) - app = (TF9_app*)&main_app(); - return *app; + static TF9_app* app = nullptr; + if (app == nullptr) + app = (TF9_app*)&main_app(); + return *app; } - - -class TApri_estr_msk; -class TMonitor_mask : public TAutomask -{ - friend class TF9_app; - vector _fppro; - TApri_estr_msk * _inclusi_mask; - - // Configurazione mask - static bool save_conf_handler(TMask_field& f, KEY key); - - // Metodi per la maschera 'Apri Estr.' - - void open_apri_estr_win(); - - // Controllo estr. mask - void controllo_errori() const; - static void delete_estr_fld(const TString& idestr); - void delete_pack(bool all = false) const; - - // Riempie sheet per visualizzare le estrazioni - void fill() const; - - bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; - static void open_win_estr(); - static void open_win_conf(); - void sel() const; - -public: - TMonitor_mask(); - ~TMonitor_mask() { safe_delete(_inclusi_mask); } -}; - -class TControllo_mask : public TAutomask -{ - TArray _controllo_mov; // Usare import_error_list(). - char _ordin; - char _verso; - int _selected_mov; - bool _sel_esclusi; - bool _is_escluso; - TString _cod_soc; - TString _id_estr; - char _tipo_doc_err{}; - TDate _datada; - TDate _dataa; - - void associa(); - void conferma_esclusi() const; - - TArray& import_error_list(); - void fill(); - void fill_fppro_sheet() const; - TMask& get_win_order(); - void open_win_order(); - - TToken_string* selected_mov(); - TToken_string* selected_fat() const; - - /** Gestisce la selezione multipla negli sheet di controllo movimenti */ - void selfatt(TOperable_field& o, long jolly) const; - - bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; -public: - TControllo_mask(const char* codsoc, const char* id_estr, bool esclusi = false); -}; - -class TApri_estr_msk : public TAutomask -{ - TString _idestr; - TDate _dataestr; - bool _provv; - char _tipodoc; - TString _statoestr; - TDate _datadal; - TDate _dataal; - - bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; - - bool inall_handler() const; - bool inescludi_handler() const; - bool inselect_handler() const; - void conferma_esclusi() const; -public: - void fill_estr() const; - void fill_res() const; - void set_from_row_estrazione(TToken_string& row_estrazione); - - TApri_estr_msk(); -}; - - - - inline bool open_mov(const TRectype& mov) { TFilename ininame; ininame.temp("lnk", "ini"); diff --git a/src/f9/f90200.cpp b/src/f9/f90200.cpp index 8402307c1..326f5df0f 100644 --- a/src/f9/f90200.cpp +++ b/src/f9/f90200.cpp @@ -36,7 +36,7 @@ public: class TF9_categorie_doc_msk : public TAutomask { - std::shared_ptr _annessi_sheet; + TArray_sheet * _annessi_sheet; TCategorie_doc _categorie_doc; bool _mod_precaricate; @@ -143,21 +143,21 @@ void TF9_categorie_doc_msk::check_spell() const void TF9_categorie_doc_msk::check_duplicate_tipodoc() const { TSheet_field& sf = sfield(S_CLASSDOC); - map lookup_table; - vector dup; - FOR_EACH_SHEET_ROW(sf, nr, row) + TString_array lookup_table; + TString_array dup; + + FOR_EACH_SHEET_ROW_LOOP(sf, nr) { - if(TString(row->get(5)).empty()) // Se non ha specificato una causale + const TString & caus = sf.get_str_row_cell(nr, F_CAUSCONT); + + if (caus.blank()) // Se non ha specificato una causale { - const char* tipodoc = row->get(6); - auto it = lookup_table.find({ tipodoc }); - if (it == lookup_table.end()) // Se non lo trovo vuol dire che e' il primo. - lookup_table.insert({ tipodoc, 0 }); + const TString & tipodoc = sf.get_str_row_cell(nr, F_TIPOCAUSCONT); + + if (lookup_table.find(tipodoc) < 0) // Se non lo trovo vuol dire che e' il primo. + lookup_table.add(tipodoc); else - { - ++it->second; - dup.emplace_back(it->first); - } + dup.add(tipodoc); } } if (!dup.empty() && !_mod_precaricate) @@ -186,15 +186,19 @@ void TF9_categorie_doc_msk::edit_annesso(const TString& catdoc_padre) { TString title; title << "Modifica annesso per " << catdoc_padre; TNew_annesso_msk new_ann(title); + new_ann.edit_mode(); + TToken_string& r = _annessi_sheet->row(_annessi_sheet->selected()); + new_ann.fill_field(r.get(0), r.get(1), r.get(2), r.get_bool(3)); if (new_ann.run() == K_ENTER) { const TString& catann = new_ann.get(101); const TString& descr = new_ann.get(102); const TString& tipo = new_ann.get(103); - const bool obblig = new_ann.get_bool(104); + const bool obblig = new_ann.get_bool(104); + _categorie_doc.edit_annesso(catdoc_padre, catann, descr, tipo, obblig); fill_annessi(catdoc_padre); } @@ -211,9 +215,9 @@ void TF9_categorie_doc_msk::fill_annessi(const TString& catdoc) void TF9_categorie_doc_msk::load_table() const { TSheet_field& sf = sfield(S_CLASSDOC); - sf.hide(); - sf.destroy(); - int idx = 0; + int idx = 0; + + sf.reset(); while (true) { TToken_string appo(ini_get_string(CONFIG_DITTA, "F9", "CATDOC", "", idx++)); @@ -222,9 +226,7 @@ void TF9_categorie_doc_msk::load_table() const TToken_string& row = sf.row(-1); row = appo; } - sf.show(); sf.force_update(); - check_duplicate_tipodoc(); } @@ -232,22 +234,27 @@ void TF9_categorie_doc_msk::new_annesso(const TString& catdoc_padre) { _categorie_doc.reload(); TString title; + title << "Nuovo annesso per " << catdoc_padre; + TNew_annesso_msk new_ann(title); + while (new_ann.run() == K_ENTER) { TString catann = new_ann.get(101); + if (catann.empty()) { warning_box("Inserire il nome tipo annesso"); continue; } - TCategorie_doc::annesso ann; - if (!_categorie_doc.annesso_exist(catdoc_padre,catann)) + + if (!_categorie_doc.annesso_exist(catdoc_padre,catann)) { const TString& descr = new_ann.get(102); const TString& tipo = new_ann.get(103); const bool obblig = new_ann.get_bool(104); + correct_spell_catdoc(catann); _categorie_doc.add_annesso(catdoc_padre, catann, descr, tipo, obblig); fill_annessi(catdoc_padre); @@ -270,10 +277,12 @@ void TF9_categorie_doc_msk::salva_tabella() const } idx = 0; + TSheet_field& sf = sfield(S_CLASSDOC); + FOR_EACH_SHEET_ROW(sf, nr, row) { - if(row->get(1) && TString(row->get(1)).full()) + if(row->get(1) && *row->get(1)) ini_set_string(CONFIG_DITTA, "F9", "CATDOC", *row, idx++); } ini_set_string(CONFIG_DITTA, "F9", "CATDOC", "STOP", idx); // Riga terminatrice diff --git a/src/f9/f90300.cpp b/src/f9/f90300.cpp index 9ee8ac055..0ea21d435 100644 --- a/src/f9/f90300.cpp +++ b/src/f9/f90300.cpp @@ -1,9 +1,4 @@ #include "f90.h" - -#include -#include -#include - #include "annessif9.h" // File 183 #include "applicat.h" #include "automask.h" @@ -27,7 +22,7 @@ class TImport_msk : public TAutomask { friend class TGestione_doc_cartacei_f9_msk; - map> _annessi; +// map> _annessi; bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; @@ -58,10 +53,12 @@ bool TImport_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) case F_IMPNUMREG: if(e == fe_modify) { - const TCategorie_doc::classe_doc* c = TCategorie_doc().mov2cat(o.get_int()); + TCategorie_doc cd; + TClasse_doc* c = cd.mov2cat(o.get_int()); + if (c != nullptr) { - set(F_CATANNPADRE, c->catdoc); + set(F_CATANNPADRE, c->catdoc()); set(F_CATDOCANN, ""); } else @@ -81,13 +78,15 @@ bool TImport_msk::catdocann_handler(TMask_field& field, KEY key) static const char* msg_notexist = "Non esistono tipologie di annessi per questa categoria documentale."; static const char* msg_inspadre = "Questa registrazione non e' riconosciuta in nessuna categoria documentale.\nImpossible inserire un annesso.\n" "Si prega di inserire prima una cat. documentale che comprenda questo tipo di registrazione\naggiungendo anche eventuali tipologie di annessi."; - TCategorie_doc cd; TImport_msk& msk = (TImport_msk&)field.mask(); + if (key == K_TAB && field.dirty() && field.full()) { if (msk.get(F_CATANNPADRE).full()) { + TCategorie_doc cd; const TString_array names_ann = cd.get_array_ann(msk.get(F_CATANNPADRE)); + if (names_ann.items() > 0) { bool ok = false; @@ -113,22 +112,24 @@ bool TImport_msk::catdocann_handler(TMask_field& field, KEY key) } if (key == K_F9) { - const TString & catdoc_padre = msk.get(F_CATANNPADRE); - if (catdoc_padre.full()) + const TString & catdoc_padre = msk.get(F_CATANNPADRE); + + if (catdoc_padre.full()) { - TArray_sheet* annessi = cd.get_sheet_ann(msk.get(F_CATANNPADRE)).get(); + TCategorie_doc cd; + TArray_sheet * annessi = cd.get_sheet_ann(msk.get(F_CATANNPADRE)); if (annessi && annessi->items() > 0) { if (annessi->run() == K_ENTER) { const char* s = annessi->row(annessi->selected()).get(0); - TCategorie_doc::annesso annesso; + TAnnesso * ann = cd.get_ann(catdoc_padre, s); - if (cd.get_ann(catdoc_padre,s, annesso)) + if (ann != nullptr) { - if (annesso.opcee != "RC") - msk.set(F_CATDOCANN, annesso.catdoc); + if (ann->opcee() != "RC") + msk.set(F_CATDOCANN, ann->catdoc()); else warning_box("Impossibile importare un annesso cartaceo per un prospetto integrativo per Reverse Charge."); } @@ -149,11 +150,13 @@ bool TImport_msk::catannpadre_handler(TMask_field& field, KEY key) { TCategorie_doc cd; TImport_msk& msk = (TImport_msk&)field.mask(); + if (key == K_TAB && field.dirty() && field.full()) { - std::set& name_cats = cd.get_name_catdocs(); + TString_array * name_cats = cd.get_name_catdocs(); - const bool ok = name_cats.find(field.get()) != name_cats.end(); + const bool ok = name_cats->find(field.get()) >= 0; + if (!ok) { msk.error_box("La categoria inserita e' inesistente"); @@ -176,7 +179,7 @@ bool TImport_msk::ok_handler(TMask_field& field, KEY key) const char* TImport_msk::select_catdoc() { - auto catdocs = TCategorie_doc().get_sheet_catdocs(); + TArray_sheet * catdocs = TCategorie_doc().get_sheet_catdocs(); if (catdocs->run() == K_ENTER) return catdocs->row().get(0); return ""; @@ -207,7 +210,7 @@ TImport_msk::TImport_msk(): TAutomask("f90300b") class TGestione_doc_cartacei_f9_msk : public TAutomask { - struct doc_cart_t +/* struct doc_cart_t { TString filename; TString loaddate; @@ -222,13 +225,12 @@ class TGestione_doc_cartacei_f9_msk : public TAutomask TString catdocann; TString loaddate; TString user; - }; - const TString& _addr_cart; // Indirizzo cartella doc. cartacei F9 - std::unique_ptr _config_msk; - std::unique_ptr> _extensions; // todo: controllare che con TString funzioni l'ordinamento, quindi la find - std::unique_ptr _import_msk; - std::map _list_file; - std::map _list_ann; + }; */ + const TString& _addr_cart; // Indirizzo cartella doc. cartacei F9 +// TMask * _config_msk; + TString_array _extensions; + // TAssoc_array _list_file; // doc_cart_t + // TAssoc_array _list_ann; // ann_cart_t bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; @@ -243,10 +245,11 @@ class TGestione_doc_cartacei_f9_msk : public TAutomask void fill_docs(); static TToken_string& get_valid_extensions(); void load_extensions(); - static bool load_file(const TFilename& file, const TString& numreg, bool is_annesso, const TString& catannpadre, const TString& catdocann); + bool load_file(const TFilename& file, long numreg, const bool is_annesso, const TString& catannpadre, const TString& catdocann) + { return TF9_doccart::add_cart(file, numreg, is_annesso, catannpadre, catdocann, false); } void open_config_win(); void open_import_win(); - static void remove_file_from_f9cart(const std::set& files); + static void remove_file_from_f9cart(const TString_array & files); bool verify_extension(const TFilename& file); public: @@ -414,6 +417,7 @@ void TGestione_doc_cartacei_f9_msk::edit_file() { TToken_string& row = sfield(S_IMPORTED).row(sfield(S_IMPORTED).selected()); TImport_msk win; + win.set_caption("Modifica documento cartaceo"); TLocalisamfile f9docs(LF_F9DOCS); const char* numreg = row.get(2); @@ -443,61 +447,63 @@ void TGestione_doc_cartacei_f9_msk::fill() void TGestione_doc_cartacei_f9_msk::fill_annessi() { - std::set file_err; + TString_array file_err; TSheet_field& sf = sfield(S_ANNESSI); - sf.hide(); - sf.destroy(); - TLocalisamfile ann(LF_F9ANNESSI); + TLocalisamfile ann(LF_F9ANNESSI); + + sf.reset(); if(ann.first() == NOERR) { - const TString& namefile = ann.get(F9A_FILENAME); - const bool not_exist = !check_file_exist(namefile); - if (not_exist) - file_err.insert(namefile); - TLocalisamfile mov(LF_MOV); do - { - TToken_string& row = sf.row(-1); - const TString& numreg = ann.get(F9A_NUMREG); + { + const TString& namefile = ann.get(F9A_FILENAME); + const long numreg = ann.get_long(F9A_NUMREG); + const TRectype & mov = cache().get(LF_MOV, numreg); + const bool not_exist = !check_file_exist(namefile); - mov.put(MOV_NUMREG, numreg); - mov.read(); + if (not_exist) + file_err.add(namefile, numreg); - row.add(ann.get(F9A_FILENAME), 1); // ITEM "Nome File@25" - row.add(ann.get(F9A_CATDOCPAD)); // ITEM "Categoria di\nappartenenza@7" - row.add(ann.get(F9A_CATDOCANN)); // ITEM "Classe doc.\nannesso@7" - row.add(numreg); // ITEM "Movimento\nContabile N.@7" - row.add(mov.get(MOV_DATAREG)); // ITEM "Data\nMovimento@10" - row.add(mov.get(MOV_CODCAUS)); // ITEM "Causale@7" - row.add(mov.get(MOV_NUMDOC)); // ITEM "Num. Doc.@7" - row.add(TString(mov.get(MOV_REG)) << "/" << mov.get(MOV_PROTIVA)); // ITEM "Reg./Prot. IVA@10" - row.add(mov.get(MOV_DESCR)); // ITEM "Descrizione@20" - row.add(ann.get(F9A_LOADDATE)); // ITEM "Data\nCaricamento@10" - row.add(not_exist ? "IL FILE NON E' PRESENTE IN ARCHIVIO." : ""); // ITEM "Info (Errori)@25" + const int row = sf.set_row_cell(F_AFILENAME, ann.get(F9A_FILENAME)); // ITEM "Nome File@25" - _list_ann.insert({ namefile, { numreg, namefile, ann.get(F9A_CATDOCPAD), ann.get(F9A_CATDOCANN), ann.get(F9C_LOADDATE), ann.get(F9C_USER) } }); + sf.set_row_cell(F_ACATPADRE, ann.get(F9A_CATDOCPAD), row); // ITEM "Categoria di\nappartenenza@7" + sf.set_row_cell(F_ACATANN, ann.get(F9A_CATDOCANN), row); // ITEM "Classe doc.\nannesso@7" + sf.set_row_cell(F_ANUMREG, numreg, row); // ITEM "Movimento\nContabile N.@7" + sf.set_row_cell(F_ADATAMOV, mov.get(MOV_DATAREG), row); // ITEM "Data\nMovimento@10" + sf.set_row_cell(F_ACAUS, mov.get(MOV_CODCAUS), row); // ITEM "Causale@7" + sf.set_row_cell(F_ANUMDOC, mov.get(MOV_NUMDOC), row); // ITEM "Num. Doc.@7" + + TString nprot; + + nprot << mov.get(MOV_REG) << "/" << mov.get(MOV_PROTIVA); + sf.set_row_cell(F_ANPROTOCOL, nprot, row); // ITEM "Reg./Prot. IVA@10" + sf.set_row_cell(F_ADESCRMOV, mov.get(MOV_DESCR), row); // ITEM "Descrizione@20" + sf.set_row_cell(F_ADATACARIC, ann.get(F9A_LOADDATE), row); // ITEM "Data\nCaricamento@10" + sf.set_row_cell(F_AINFO, not_exist ? "IL FILE NON E' PRESENTE IN ARCHIVIO." : "", row); // ITEM "Info (Errori)@25" + + // _list_ann.add( namefile, { numreg, namefile, ann.get(F9A_CATDOCPAD), ann.get(F9A_CATDOCANN), ann.get(F9C_LOADDATE), ann.get(F9C_USER) }); } while (ann.next() == NOERR); } sf.force_update(); - sf.show(); if (!file_err.empty()) { int count = 0; - const bool m = (int)file_err.size() == 1; + const bool m = (int)file_err.items() == 1; const char p = m ? 'o' : 'i'; + TString msg; msg << (int)file_err.size() << " file non " << (m ? "e'" : "sono") << " stat" << p << " trovat" << p << ".\nSi prega di rimuoverl" << p << " dall'elenco\n\nFile non trovat" << p << ":"; - for (auto it = file_err.begin(); it != file_err.end(); ++it) + FOR_EACH_ARRAY_ROW(file_err, nr, str) { if (count++ == 10) { msg << "\n" << "..."; break; } - msg << "\n" << *it << " [Num. Reg.: " << _list_ann.find(*it)->second.numreg << "]"; + msg << "\n" << (TString &) *str << " [Num. Reg.: " << nr << "]"; } warning_box(msg); } @@ -508,66 +514,57 @@ void TGestione_doc_cartacei_f9_msk::fill_docs() TLocalisamfile files(LF_F9DOCS); TLocalisamfile mov(LF_MOV); TSheet_field& sf = sfield(S_IMPORTED); - sf.hide(); - sf.destroy(); - _list_file.clear(); - std::set file_err; - if (files.first() == NOERR) - { - do - { - const TString& namefile = files.get(F9C_FILENAME); - const bool not_exist = !check_file_exist(namefile); - if (not_exist) - file_err.insert(namefile); - const TString& numreg = files.get(F9C_NUMREG); - TString datamov, caus, numdoc, nprot, descrmov; - mov.zero(); - mov.put(MOV_NUMREG, numreg); - if (mov.read() == NOERR) - { - datamov = mov.get(MOV_DATAREG); - caus = mov.get(MOV_CODCAUS); - numdoc = mov.get(MOV_NUMDOCEXT); - if (numdoc.empty()) numdoc = mov.get(MOV_NUMDOC); - nprot << mov.get(MOV_REG) << "/" << mov.get(MOV_PROTIVA); - descrmov = mov.get(MOV_DESCR); - } - TToken_string& r = sf.row(-1); - r.add(" ", 0); // F_SEL - r.add(namefile); // F_FILENAME - r.add(numreg); // F_NUMREG - r.add(datamov); // F_DATAMOV - r.add(caus); // F_CAUS - r.add(numdoc); // F_NUMDOC - r.add(nprot); // F_NPROTOCOL - r.add(descrmov); // F_DESCRMOV - r.add(files.get(F9C_LOADDATE)); // F_DATACARIC - r.add(not_exist ? "IL FILE NON E' PRESENTE IN ARCHIVIO." : ""); // F_INFO + TString_array file_err; - _list_file.insert({ namefile, { namefile, files.get(F9C_LOADDATE), numreg, files.get(F9C_USER) } }); - } while (files.next() == NOERR); - + sf.reset(); + for (int err = files.first(); err == NOERR; err = files.next()) + { + const TString& namefile = files.get(F9C_FILENAME); + const long numreg = files.get_long(F9C_NUMREG); + const TRectype & mov = cache().get(LF_MOV, numreg); + const bool not_exist = !check_file_exist(namefile); + + if (not_exist) + file_err.add(namefile, numreg); + + const int row = sf.set_row_cell(F_FILENAME, namefile); + + sf.set_row_cell(F_NUMREG, numreg, row); + sf.set_row_cell(F_DATAMOV, mov.get_date(MOV_DATAREG), row); + sf.set_row_cell(F_CAUS, mov.get(MOV_CODCAUS), row); + + TString nprot, numdoc = mov.get(MOV_NUMDOCEXT); + + if (numdoc.empty()) + numdoc = mov.get(MOV_NUMDOC); + sf.set_row_cell(F_NUMDOC, numdoc, row); + + + nprot << mov.get(MOV_REG) << "/" << mov.get(MOV_PROTIVA); + + sf.set_row_cell(F_NPROTOCOL, nprot, row); + sf.set_row_cell(F_DESCRMOV, mov.get(MOV_DESCR), row); + sf.set_row_cell(F_DATACARIC, files.get(F9C_LOADDATE), row); + sf.set_row_cell(F_INFO, not_exist ? "IL FILE NON E' PRESENTE IN ARCHIVIO." : "", row); } sf.force_update(); - sf.show(); if (!file_err.empty()) { int count = 0; - const bool m = (int)file_err.size() == 1; + const bool m = (int)file_err.items() == 1; const char p = m ? 'o' : 'i'; - TString msg; msg << (int)file_err.size() << " file non " << (m ? "e'" : "sono") << " stat" << p << + TString msg; msg << (int)file_err.items() << " file non " << (m ? "e'" : "sono") << " stat" << p << " trovat" << p << ".\nSi prega di rimuoverl" << p << " dall'elenco\n\nFile non trovat" << p << ":"; - for (auto it = file_err.begin(); it != file_err.end(); ++it) + FOR_EACH_ARRAY_ROW(file_err, r, str) { if (count++ == 10) { msg << "\n" << "..."; break; } - msg << "\n" << *it << " [Num. Reg.: " << _list_file.find(*it)->second.numreg << "]"; + msg << "\n" << (TString &) *str << " [Num. Reg.: " << r << "]"; } #ifndef DBG const bool del = warning_box(msg); @@ -595,10 +592,10 @@ TToken_string& TGestione_doc_cartacei_f9_msk::get_valid_extensions() void TGestione_doc_cartacei_f9_msk::load_extensions() { - if (_extensions == nullptr) + if (_extensions.empty()) { - _extensions = std::make_unique>(); TToken_string& ext = get_valid_extensions(); + for (int i = 0; i < ext.items(); ++i) { TString e = ext.get(i); @@ -606,62 +603,48 @@ void TGestione_doc_cartacei_f9_msk::load_extensions() { if (e.starts_with(".")) e.ltrim(1); - _extensions->insert(e); + _extensions.add(e); } } } } -bool TGestione_doc_cartacei_f9_msk::load_file(const TFilename& file, const TString& numreg, const bool is_annesso, - const TString& catannpadre, const TString& catdocann) -{ - return TF9_doccart::add_cart(file, numreg, is_annesso, catannpadre, catdocann, false); -} - void TGestione_doc_cartacei_f9_msk::open_config_win() { - // Creazione maschera - if(_config_msk == nullptr) - { - _config_msk = std::make_unique("Configurazione", 1, 78, 14); - _config_msk->add_button_tool(DLG_OK, "Conferma", TOOL_OK); - _config_msk->add_button_tool(DLG_NULL, "", 0); - _config_msk->add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + TMask config_msk("Configurazione", 1, 78, 14); - _config_msk->add_groupbox(DLG_NULL, 0, "@BCartella documenti cartacei", 1, 0, 76, 4); - _config_msk->add_static (DLG_NULL, 0, "@BInserire nome cartella, all'interno della area dati della ditta", 2, 1); - _config_msk->add_string (102, 0, "", 2, 2, 64, "", 30); - _config_msk->add_groupbox(DLG_NULL, 0, "", 1, 4, 76, 4, ""); - _config_msk->add_static (DLG_NULL, 0, "@BInserire estensioni file riconosciute, separate da virgola.", 2, 5); - _config_msk->add_string (101, 0, "Estensioni:", 2, 6, 255, "", 60); + config_msk.add_button_tool(DLG_OK, "Conferma", TOOL_OK); + config_msk.add_button_tool(DLG_NULL, "", 0); + config_msk.add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + + config_msk.add_groupbox(DLG_NULL, 0, "@BCartella documenti cartacei", 1, 0, 76, 4); + config_msk.add_static (DLG_NULL, 0, "@BInserire nome cartella, all'interno della area dati della ditta", 2, 1); + config_msk.add_string (102, 0, "", 2, 2, 64, "", 30); + config_msk.add_groupbox(DLG_NULL, 0, "", 1, 4, 76, 4, ""); + config_msk.add_static (DLG_NULL, 0, "@BInserire estensioni file riconosciute, separate da virgola.", 2, 5); + TMask_field & ext = config_msk.add_string (101, 0, "Estensioni:", 2, 6, 255, "", 60); + + ext.check_type(CHECK_REQUIRED); + config_msk.set(101, F9CONF.get_estensioni()); + + TString s = F9CONF.get_addr_cart(); - _config_msk->set(101, F9CONF.get_estensioni()); - TString s = F9CONF.get_addr_cart(); s.rtrim(1); s.ltrim(s.rfind('\\') + 1); - _config_msk->set(102, s); - } - + config_msk.set(102, s); + // Esecuzione maschera - while (true) + if (config_msk.run() == K_ENTER) { - if (_config_msk->run() != K_ENTER) - { - if (_config_msk->get(102).empty()) - { - warning_box("Si prega di inserire il nome della cartella per i documenti cartacei."); - continue; - } - break; - } - F9CONF.set_estensioni(_config_msk->get(101)); - TString dir = _config_msk->get(102); + TString dir = config_msk.get(102); + if (dir.empty()) { if(yesno_box("Nome cartella vuoto.\nCreare cartella con nome 'Cartacei_F9'?")) - _config_msk->set(102, dir = "Cartacei_F9"); - else continue; + config_msk.set(102, dir = "Cartacei_F9"); + else return; } + F9CONF.set_estensioni(config_msk.get(101)); TFilename path(prefix().get_studio()); path.add(dir).slash_terminate(); @@ -672,33 +655,33 @@ void TGestione_doc_cartacei_f9_msk::open_config_win() if (!make_dir(path)) { warning_box("Impossibile creare il percorso specificato."); - continue; + return; } } - else continue; + else return; } F9CONF.set_addr_cart(path); - break; } } void TGestione_doc_cartacei_f9_msk::open_import_win() { - if(_import_msk == nullptr) - _import_msk = make_unique(); - while(_import_msk->run() == K_ENTER) + TImport_msk import_msk; + + while(import_msk.run() == K_ENTER) { - const TString& file = _import_msk->get(F_IMPADDRESS); - const TString& numreg = _import_msk->get(F_IMPNUMREG); - const bool is_annesso = _import_msk->get_bool(F_ISANNESSO); - const TString& catannpadre = _import_msk->get(F_CATANNPADRE); - const TString& catdocann = _import_msk->get(F_CATDOCANN); + const TString& file = import_msk.get(F_IMPADDRESS); + const long numreg = import_msk.get_long(F_IMPNUMREG); + const bool is_annesso = import_msk.get_bool(F_ISANNESSO); + const TString& catannpadre = import_msk.get(F_CATANNPADRE); + const TString& catdocann = import_msk.get(F_CATDOCANN); + if (!file.empty()) { TFilename f(file); if (verify_extension(f)) { - if(!numreg.empty()) + if (numreg != 0) { if (!is_annesso || catannpadre.full() && catdocann.full()) { @@ -723,13 +706,13 @@ void TGestione_doc_cartacei_f9_msk::open_import_win() fill(); } -void TGestione_doc_cartacei_f9_msk::remove_file_from_f9cart(const std::set& files) +void TGestione_doc_cartacei_f9_msk::remove_file_from_f9cart(const TString_array & files) { TLocalisamfile f9cart(LF_F9DOCS); - for(auto it = files.begin(); it != files.end(); ++it) + FOR_EACH_ARRAY_ROW(files, row, str) { f9cart.zero(); - f9cart.put(F9C_FILENAME, *it); + f9cart.put(F9C_FILENAME, (const TString &) *str); f9cart.read(); f9cart.remove(); } @@ -738,7 +721,7 @@ void TGestione_doc_cartacei_f9_msk::remove_file_from_f9cart(const std::setfind(file.ext()) != _extensions->end(); + return _extensions.find(file.ext()) >= 0; } TGestione_doc_cartacei_f9_msk::TGestione_doc_cartacei_f9_msk(): TAutomask("f90300a"), _addr_cart(F9CONF.get_addr_cart()) diff --git a/src/f9/f90400.cpp b/src/f9/f90400.cpp index c6773b3e7..f55f92dae 100644 --- a/src/f9/f90400.cpp +++ b/src/f9/f90400.cpp @@ -81,42 +81,49 @@ void TF9_test_app::main_loop() preload.add_annesso("FATTACQ", "LEASING", "Annesso leasing", "DC"); CHECK(preload.get_array_rows().items() > 0, "Errore aggiunta o caricamento categorie documentali."); - TCategorie_doc::annesso annesso; - if (preload.get_ann("FATTACQ","GENACQ", annesso)) + + TAnnesso * annesso = nullptr; + + if (preload.get_ann("FATTACQ","GENACQ") != nullptr) { } - TCategorie_doc::classe_doc get_classe_doc_right{ "ACQREV", "Fattura acq. con rev. charge", "FTA", "TD01", "052", "FA" }; - const TCategorie_doc::classe_doc* get_classe_doc = preload.get_classe_doc("ACQREV"); - CHECK(get_classe_doc->catdoc == get_classe_doc_right.catdoc && - get_classe_doc->descr == get_classe_doc_right.descr && - get_classe_doc->class_sost == get_classe_doc_right.class_sost && - get_classe_doc->caus_sost == get_classe_doc_right.caus_sost && - get_classe_doc->causcont == get_classe_doc_right.causcont && - get_classe_doc->tipocaus == get_classe_doc_right.tipocaus, "get_classe_doc failed" + + TClasse_doc get_classe_doc_right{ "ACQREV", "Fattura acq. con rev. charge", "FTA", "TD01", "052", "FA" }; + + const TClasse_doc* get_classe_doc = preload.get_classe_doc("ACQREV"); + + CHECK(get_classe_doc->catdoc() == get_classe_doc_right.catdoc() && + get_classe_doc->descr() == get_classe_doc_right.descr() && + get_classe_doc->class_sost()== get_classe_doc_right.class_sost() && + get_classe_doc->caus_sost() == get_classe_doc_right.caus_sost() && + get_classe_doc->causcont() == get_classe_doc_right.causcont() && + get_classe_doc->tipocaus() == get_classe_doc_right.tipocaus(), "get_classe_doc failed" ); - std::set get_name_catdocs = preload.get_name_catdocs(); - CHECK(get_name_catdocs.find("FATTACQ") != get_name_catdocs.end() && - get_name_catdocs.find("FATTVEN") != get_name_catdocs.end() && - get_name_catdocs.find("NOTCREDACQ") != get_name_catdocs.end() && - get_name_catdocs.find("NOTDEBVEN") != get_name_catdocs.end() && - get_name_catdocs.find("FATTCORR") != get_name_catdocs.end() && - get_name_catdocs.find("ACQREV") != get_name_catdocs.end(), "Get catdocs failed" - ); - const TCategorie_doc::classe_doc* mov2cat = preload.mov2cat(95752); + + TString_array * catdocs = preload.get_name_catdocs(); + + CHECK(catdocs->find("FATTACQ") >= 0 && catdocs->find("FATTVEN") >= 0 && catdocs->find("NOTCREDACQ") >= 0 && + catdocs->find("NOTDEBVEN") >= 0 && catdocs->find("FATTCORR") >= 0 && catdocs->find("ACQREV") >= 0, "Get catdocs failed"); + + const TClasse_doc* mov2cat = preload.mov2cat(95752); + CHECK(mov2cat, "mov2cat failed: classe doc is null"); mov2cat = preload.mov2cat(96955); // Rev. charge causale 052 - CHECK(mov2cat->causcont == "052", "Error retriving cat.doc. from numreg for causale."); + CHECK(mov2cat->causcont() == "052", "Error retriving cat.doc. from numreg for causale."); const TString cat_selected = "FATTACQ"; TCategorie_doc catdoc; - std::shared_ptr annessi = catdoc.get_sheet_ann(cat_selected); + TArray_sheet * annessi = catdoc.get_sheet_ann(cat_selected); + CHECK(annessi->items() == 2, format(FR("TCategorie_doc::get_sheet_ann() failed: retrived %d elements instead of 2"), (int)annessi->items())); - std::shared_ptr sheet_catdocs = catdoc.get_sheet_catdocs(); - CHECK(sheet_catdocs->items() == 6, format(FR("TCategorie_doc::get_sheet_catdocs() failed: retrived %d elements instead of 6"), (int)sheet_catdocs->items())); + TArray_sheet * sheet_catdocs = catdoc.get_sheet_catdocs(); + + CHECK(sheet_catdocs->items() == 6, format(FR("TCategorie_doc::get_sheet_catdocs() failed: retrived %d elements instead of 6"), (int)sheet_catdocs->items())); TRecord_categorie rec(TRecord_categorie::catdocs); TRecord_categorie rec2(TRecord_categorie::annessi); + rec.put("NAME", "FATTACQ"); rec.read(); TString name = rec.get("NAME"); @@ -145,31 +152,21 @@ void TF9_test_app::main_loop() if (false) { TF9_doccart doccart; - TString old_numreg; old_numreg << 95752; + long old_numreg = 95752; TFilename doc; TString_array list_annessi; - vector vect_annessi; - //TFilename f_doc; f_doc << "asd"; - //bool annesso; - //bool doc_ae = doccart.doc_already_exists(f_doc, old_numreg, annesso); - bool movdoc = doccart.mov2doc(old_numreg, doc); + TArray vect_annessi; // TAnnesso_mov + + bool movdoc = doccart.mov2doc(old_numreg, doc); TString msg("Error retriving filename from reg n. "); msg << old_numreg; CHECK(movdoc && TString(doc.name()) == "ve1300_F01_0000000011_0002237.pdf", (const char*)msg); - old_numreg.cut(0) << 95222; // Doppio annesso + old_numreg = 95222; // Doppio annesso bool movann = doccart.mov2listann(old_numreg, list_annessi); //CHECK(movann && list_annessi.items() == 2, "Error retriving list annessi from numreg %s", (const char*)old_numreg); bool movannvect = doccart.mov2listann_vect(old_numreg, vect_annessi); //CHECK(movannvect && vect_annessi.size() == 2, "Error retriving vector annessi from numreg %s", (const char*)old_numreg); - - /*TCategorie_doc::annesso annesso; - annesso.catdoc = "INTEGREV"; - annesso.catdocpadre = "FATTREV"; - annesso.descr = "Integrazione Rev. Charge"; - annesso.opcee = "RC"; - annesso.obblig = true; - TEstrazione::make_prosp_int_revc(96951, annesso);*/ } if(false) @@ -199,10 +196,10 @@ void TF9_test_app::main_loop() TString codfisc; //TEstrazione::fill_id(clifo, statopaiv, idfisc, paiv, codfisc); - TCategorie_doc::annesso annesso; + TAnnesso *annesso = nullptr; TCategorie_doc categorie_doc; - if(categorie_doc.get_ann("FATTACQ","INTREVC", annesso)) + if(categorie_doc.get_ann("FATTACQ","INTREVC") != nullptr) TEstrazione::make_prosp_int_revc(153480, annesso); TString s = get_numdoc_exp_fp(105396); @@ -210,9 +207,6 @@ void TF9_test_app::main_loop() message_box("TESTS COMPLETELY SUCCESSFUL"); } - - - int f90400(const int argc, char* argv[]) { TF9_test_app test_app; diff --git a/src/f9/f90500.cpp b/src/f9/f90500.cpp new file mode 100644 index 000000000..ad4023d3b --- /dev/null +++ b/src/f9/f90500.cpp @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include + +#include + +#include "f90.h" +#include "f90500.h" +#include "../cg/cglib.h" + +class TRipristina_estrazione : public TSkeleton_application +{ + +protected: // TApplication + virtual void main_loop(); + +public: + bool restore(const TString & tipomov, int year, int from_month, int to_month); + + TRipristina_estrazione() {} + ~TRipristina_estrazione() {} +}; + +// Azzera flag di stampato della liquidazione mensile dal mese dato in poi +bool TRipristina_estrazione::restore(const TString & tipomov, + int year, int from_month, int to_month) +{ + TRelation rel(LF_MOV); + const TipoIVA tipo = (tipomov == "V") ? iva_vendite : iva_acquisti; + const TDate from_date(1, from_month, year); + TDate to_date(1, to_month, year); + TRectype from(LF_MOV); + TRectype to(from); + TString filter; + + to_date.set_end_month(); + from.put(MOV_DATAREG, from_date); + to.put(MOV_DATAREG, to_date); + // filter movimenti archiviati + tipomov + filter << "(" << MOV_ELABF9 << "!=\"\")"; + + TCursor c(&rel, filter, 2, &from, &to); + TRectype & mov = c.curr(); + long last_num = 0L; + const long items = c.items(); + TString msg; msg.format(FR("Ripristino estrazione %s"), tipomov == "V" ? "vendite" : "acquisti"); + TProgind p(items ? items : 1, msg , true, true); + + for (c = 0L; p.addstatus(1) && c.pos() < items; ++c) + { + const TString & codreg = mov.get(MOV_REG); + + if (codreg.full()) + { + const TRegistro & reg = cached_registro(codreg, mov.get_int(MOV_ANNOIVA)); + + if (reg.tipo() == tipo) + { + mov.zero(MOV_ELABF9); + + const int err = mov.rewrite(rel.lfile()); + + if (err != NOERR) + return error_box(FR("Errore nell'aggiornamento del movimento %ld.\n Errore n. %d"), + mov.get_long(MOV_NUMREG), err); + } + } + } + return true; +} + +void TRipristina_estrazione::main_loop() +{ + TMask msk("f90500a") ; + + while (msk.run() == K_ENTER) + { + const long old_firm = prefix().get_codditta(); + const long firm = msk.get_long(F_FIRM); + const TString4 tipomov = msk.get(F_TIPOMOV) ; + const int year = msk.get_int(F_YEAR); + const int from_month = msk.get_int(F_DAMESE); + const int to_month = msk.get_int(F_AMESE); + + if (prefix().exist(firm)) + { + if (firm != old_firm) + prefix().set_codditta(firm); + TString256 mess(TR("Attenzione ripristino dell'estrazione ")); + + mess << TR("della ditta ") << firm; + mess << " da " << itom(from_month) << " a " << itom(to_month) << ' ' << year; + if (yesno_box(mess)) + if (yesno_box(TR("\nSi desidera veramente continuare?"))) + restore(tipomov, year, from_month, to_month); + if (firm != old_firm) + prefix().set_codditta(old_firm); + } + else + error_box(TR("Ditta assente")); + msk.reset(); + } +} + +int f90500(int argc, char* argv[]) +{ + TRipristina_estrazione a ; + + a.run(argc, argv, TR("Ripristino estrazioni")); + return 0; +} diff --git a/src/f9/f90500.h b/src/f9/f90500.h new file mode 100644 index 000000000..91ed37a7a --- /dev/null +++ b/src/f9/f90500.h @@ -0,0 +1,8 @@ +#define F_FIRM 101 +#define F_DFIRM 102 +#define F_TIPOMOV 103 +#define F_YEAR 104 +#define F_DAMESE 105 +#define F_AMESE 106 + + diff --git a/src/f9/f90500a.uml b/src/f9/f90500a.uml new file mode 100644 index 000000000..b902026dd --- /dev/null +++ b/src/f9/f90500a.uml @@ -0,0 +1,64 @@ +#include "f90500.h" + +PAGE "Ripristino estarzioni" -1 -1 80 11 + +NUMBER F_FIRM 5 +BEGIN + PROMPT 2 1 "Ditta " + FLAGS "RF" + USE LF_NDITTE + INPUT CODDITTA F_FIRM + DISPLAY "Codice" CODDITTA + DISPLAY "Ragione sociale @50" RAGSOC + OUTPUT F_FIRM CODDITTA + OUTPUT F_DFIRM RAGSOC + WARNING "Ditta assente" + CHECKTYPE REQUIRED +END + +STRING F_DFIRM 50 +BEGIN + PROMPT 26 1 "" + USE LF_NDITTE KEY 2 + CHECKTYPE NORMAL + INPUT RAGSOC F_DFIRM + DISPLAY "Ragione sociale @60" RAGSOC + DISPLAY "Codice" CODDITTA + COPY OUTPUT F_FIRM + WARNING "Ditta assente" +END + +LIST F_TIPOMOV 15 +BEGIN + PROMPT 2 3 "Tipo movimento " + ITEM "A|Acquisti" + ITEM "V|Vendite" +END + +NUMBER F_YEAR 4 +BEGIN + PROMPT 2 5 "Anno " + FLAGS "AR" + CHECKTYPE REQUIRED + WARNING "L'anno deve essere specificato" + END + +LIST F_DAMESE 10 +BEGIN + PROMPT 2 7 "Da Mese " + FLAGS "M" +END + +LIST F_AMESE 10 +BEGIN + PROMPT 40 7 "A Mese " + FLAGS "M" +END + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +ENDMASK diff --git a/src/f9/f9lib.h b/src/f9/f9lib.h index 13baf246f..1fba206ef 100644 --- a/src/f9/f9lib.h +++ b/src/f9/f9lib.h @@ -1,9 +1,9 @@ #ifndef __F901001_H #define __F901001_H -#include -#include -#include +// #include +// #include +// #include #include "strings.h" #include "date.h" @@ -23,14 +23,35 @@ const char* check_str(const TString& str); const TString & get_numdoc_exp_fp(int numreg); -struct annesso_t +class TAnnesso_mov : public TObject { - TString numreg; // TString ez-pz - TString filename; - TString catdocpad; - TString catdocann; - TDate loaddate; - TString user; + long _numreg; + TString _filename; + TString _catdocpad; + TString _catdocann; + TDate _loaddate; + TString _user; + +protected: + TAnnesso_mov & copy(const TAnnesso_mov & a); + +public : + virtual TObject* TAnnesso_mov::dup() const { return new TAnnesso_mov(*this); } + TAnnesso_mov & operator = (const TAnnesso_mov & a) { return copy(a);} + const TString & numreg() const { return _numreg; } + const TString & filename() const { return _filename; } + const TString & catdocpad() const { return _catdocpad; } + const TString & catdocann() const { return _catdocann; } + const TDate & loaddate() const { return _loaddate; } + const TString & user() const { return _user; } + + void ann2row(TToken_string & row); + + TAnnesso_mov(long numreg, const char * filename, const char * catdocpad, const char * catdocann, const TDate & loaddate, const char * user) + : _numreg(numreg), _filename(filename), _catdocpad(catdocpad), _catdocann(catdocann), _loaddate(loaddate), _user(user) {} + TAnnesso_mov(TToken_string & row, int start = 0); + TAnnesso_mov(const TAnnesso_mov & a) { copy(a); } + ~TAnnesso_mov() {} }; struct statistics @@ -130,38 +151,79 @@ public: extern TF9_config F9CONF; +class TClasse_doc : public TObject +{ + TString _catdoc; // Codice cat. documentale. + TString _descr; // Descrizione documento. + TString _class_sost; // { FTA | FTV } - classe documentale sostitutiva. + TString _caus_sost; // causale per sostitutiva (TD01...). + TString _causcont; // Codice causale. + TString _tipocaus; // Usato come tipo documento (FA, FV, CR, ...). + +protected: + TClasse_doc & copy(const TClasse_doc & c); + +public: + virtual TObject* TClasse_doc::dup() const { return new TClasse_doc(*this); } + TClasse_doc & operator = (const TClasse_doc & c) { return copy(c); } + const TString & catdoc() const { return _catdoc; } + const TString & descr() const { return _descr; } + const TString & class_sost() const { return _class_sost; } + const TString & caus_sost() const { return _caus_sost; } + const TString & causcont() const { return _causcont; } + const TString & tipocaus() const { return _tipocaus; } + void ann2row(TToken_string & row); + + TClasse_doc(const char * catdoc, const char * descr, const char * class_sost, const char * caus_sost, + const char * causcont, const char * tipocaus) + : _catdoc(catdoc), _descr(descr), _class_sost(class_sost), _caus_sost(caus_sost), _causcont(causcont), + _tipocaus(tipocaus) {} + TClasse_doc(TToken_string & row, int start = 0); + TClasse_doc(const TClasse_doc & c) { copy(c); } + ~TClasse_doc() {} +}; + +class TAnnesso : public TObject +{ + TString _catdocpadre; + TString _catdoc; // Codice cat. documentale. + TString _descr; // Descrizione documento. + TString _opcee; // { RV | DC } - Usato come classificazione annesso (Reverse, ann. cartaceo). + bool _obblig; // Definisce se deve essere per forza presente l'annesso. + + TAnnesso & copy(const TAnnesso & a); + +public: + virtual TObject* TAnnesso::dup() const { return new TAnnesso(*this); } + TAnnesso & operator = (const TAnnesso & a) { return copy(a); } + const TString & catdocpadre() const { return _catdocpadre; } + const TString & catdoc() const { return _catdoc; } + const TString & descr() const { return _descr; } + const TString & opcee() const { return _opcee; } + bool obblig() const { return _obblig; } + + void ann2row(TToken_string & row); + + TAnnesso(const char * catdocpadre, const char * catdoc, const char * descr, const char * opcee, bool obblig = false) + : _catdocpadre(catdocpadre), _catdoc(catdoc), _descr(descr), _opcee(opcee), _obblig(obblig) {} + TAnnesso(TToken_string & row, int start = 0); + TAnnesso(const TAnnesso & a) { copy(a); } + ~TAnnesso() {} +}; + class TCategorie_doc { -public: - struct classe_doc - { - TString catdoc; // Codice cat. documentale. - TString descr; // Descrizione documento. - TString class_sost; // { FTA | FTV } - classe documentale sostitutiva. - TString caus_sost; // causale per sostitutiva (TD01...). - TString causcont; // Codice causale. - TString tipocaus; // Usato come tipo documento (FA, FV, CR, ...). - }; - struct annesso - { - TString catdocpadre; - TString catdoc; // Codice cat. documentale. - TString descr; // Descrizione documento. - TString opcee; // { RV | DC } - Usato come classificazione annesso (Reverse, ann. cartaceo). - bool obblig{ false }; // Definisce se deve essere per forza presente l'annesso. - }; -private: - std::vector _rows; - std::vector>> _sheets_annessi; - std::shared_ptr _sheet_catdocs; - std::shared_ptr> _name_catdocs; - int _mode_sheet; + TAssoc_array _rows; // TClasse_doc * + TAssoc_array _sheets_annessi; // TArray_sheet * + TArray_sheet * _sheet_catdocs; + TString_array * _name_catdocs; + int _mode_sheet; - TCategorie_doc::classe_doc * find_causcont(const TString& caus) const ; // OK - TCategorie_doc::classe_doc * find_tipodoc(const TString& tipodoc) const ; // OK - TCategorie_doc::classe_doc * find_tipodocsdi(const TString& tipodocsdi, const char * tipocaus) const ; // OK + TClasse_doc * find_causcont(const TString& caus); // OK + TClasse_doc * find_tipodoc(const TString& tipodoc); // OK + TClasse_doc * find_tipodocsdi(const TString& tipodocsdi, const char * tipocaus); // OK - std::vector>>::iterator find_sheet_annessi(const TString& catdoc); // OK + TArray_sheet * find_sheet_annessi(const TString& catdoc) { return (TArray_sheet *) _sheets_annessi.objptr(catdoc); } void load_all(); void save_ann(); @@ -172,9 +234,9 @@ private: static const char* traduci_class_sost(const TString& class_sost); protected: - std::map _rows_annessi; + TAssoc_array _rows_annessi; // TAnnesso - std::map::iterator find_annesso(const TString& catdoc_padre, const char* catdoc_ann); + TCategorie_doc::TAnnesso * find_annesso(const TString& catdoc_padre, const char* catdoc_ann); public: void add_annesso(const TString& catdoc_padre, const TString& catdoc_ann, const TString& descr, @@ -184,18 +246,18 @@ public: void add_categoria(const TString& catdoc, const TString& descr, const TString& class_sost, const TString& caus_sost, const TString& causcont, const TString& tipocaus); - bool annesso_exist(const TString& catdoc_padre, const char* catdoc_ann) { return find_annesso(catdoc_padre, catdoc_ann) != _rows_annessi.end();} + bool annesso_exist(const TString& catdoc_padre, const char* catdoc_ann) { return find_annesso(catdoc_padre, catdoc_ann) != nullptr; } void del_annesso(const TString& catdoc, const char* catdoc_ann); - bool get_ann(const TString & catdoc, const TString& catann, _Out_ annesso& _Annesso_out); + TAnnesso * get_ann(const TString & catdoc, const TString& catann); TString_array get_array_ann(const TString& catdoc); TString_array get_array_rows(bool traduci = false); - classe_doc* get_classe_doc(const TString& catdoc); - std::set& get_name_catdocs() { get_sheet_catdocs(); return *_name_catdocs; } - std::shared_ptr get_sheet_catdocs(); - std::shared_ptr get_sheet_ann(const TString& catdoc); - classe_doc * mov2cat(const long numreg); - const TString & tipo2caus_cont(const TString & tipodoc, const char * tipocaus) { TCategorie_doc::classe_doc * c = find_tipodocsdi(tipodoc, tipocaus); if (c != nullptr) return c->causcont; else return EMPTY_STRING; } + TClasse_doc* get_classe_doc(const TString& catdoc) { return (TClasse_doc *)_rows.objptr(catdoc); } + TString_array * get_name_catdocs() { get_sheet_catdocs(); return _name_catdocs; } + TArray_sheet * get_sheet_catdocs(); + TArray_sheet * get_sheet_ann(const TString& catdoc); + TClasse_doc * mov2cat(const long numreg); + const TString & tipo2caus_cont(const TString & tipodoc, const char * tipocaus) { TClasse_doc * c = find_tipodocsdi(tipodoc, tipocaus); if (c != nullptr) return c->causcont(); else return EMPTY_STRING; } void reload(); static void remove_all(); static void remove_all_ann(); @@ -243,7 +305,7 @@ enum err_mov mov_annesso_nexist // Un annesso obbligatorio e' mancante. }; -class movimento_t : public TObject // aggiungere metodi per TArray +class TMovimento_estr : public TObject // aggiungere metodi per TArray { @@ -263,12 +325,15 @@ class movimento_t : public TObject // aggiungere metodi per TArray TString _descr_err; // Messaggio di errore visibile dal controllo estrazione. bool _estratto; err_mov _descr_estr; // Messaggio di informazioni visibile dal 'Apri Estr.' - TCategorie_doc::classe_doc* _catdoc; bool _cartaceo; TFilename _nomefilecart; - vector _annessi; + TArray _annessi; // TAnnesso_mov + + TMovimento_estr & copy(const TMovimento_estr & m); public: + virtual TObject* TMovimento_estr::dup() const { return new TMovimento_estr(*this); } + TMovimento_estr & operator =(const TMovimento_estr& m) { return copy(m);} static const char* err_mov2name(const err_mov descr_estr); const char* get_descr_estr() const { return err_mov2name(_descr_estr); } bool err() const { return _err; } @@ -288,8 +353,8 @@ public: const TString & descr_err() const { return _descr_err; } bool estratto() const { return _estratto; } err_mov descr_estr() const { return _descr_estr; } - TCategorie_doc::classe_doc* catdoc() const { return _catdoc; } - vector annessi() const { return _annessi; } + TClasse_doc* catdoc(TCategorie_doc& catdoc) const { return catdoc.mov2cat(numreg()); } + TArray & annessi() { return _annessi; } bool cartaceo() const { return _cartaceo; } // todo const TFilename & nomefilecart() const { return _nomefilecart; } @@ -301,19 +366,20 @@ public: void set_descr_estr(err_mov descr_estr) { _descr_estr = descr_estr; } void set_numdoc(const char * numdoc) { _numdoc = numdoc; } void set_estratto(bool estratto) { _estratto = estratto; } - void set_catdoc(TCategorie_doc::classe_doc* catdoc) { _catdoc = catdoc; } void set_nomefilecart(const char * nomefilecart) { _nomefilecart = nomefilecart; } - movimento_t(TSheet_field& sf, int row); - movimento_t(const long numreg); - movimento_t(TISAM_recordset & mov, TipoIVA tipo, bool escl); - ~movimento_t() { safe_delete(_catdoc); } + TMovimento_estr(TSheet_field& sf, int row); + TMovimento_estr(const long numreg); + TMovimento_estr (const TMovimento_estr & m) { copy(m); } + + TMovimento_estr(TISAM_recordset & mov, TipoIVA tipo, bool escl); + ~TMovimento_estr() {} }; class TEstrazione : public TObject { drd _head; - vector _movs; + TArray _movs; // TMovimento_estr ofstream * _error_sql; bool _escluso; const TString _descr; @@ -325,11 +391,11 @@ class TEstrazione : public TObject */ bool update_drd_stato_estr() const; static const char* caus_sos(const TLocalisamfile& mov, TipoIVA iva); - static void check_annessi(movimento_t& mov_i, int numreg); // Controllo se ci sono tutti gli annessi obbligatori. + static void check_annessi(TMovimento_estr& mov_i, int numreg); // Controllo se ci sono tutti gli annessi obbligatori. // Controllo se esistono tutti gli annessi cartacei obbligatori e se ci sono annessi reverse charge li genero. - static bool check_annessi_oblig(const TString& catdoc, int numreg, _Out_ TToken_string& ann_nexist); - static bool check_cartaceo_acq(const movimento_t& movimento); - static bool check_documento_vendita(const TLocalisamfile& mov, _Out_ bool& exist_doc); + static bool check_annessi_oblig(const TString& catdoc, int numreg, TToken_string& ann_nexist); + static bool check_cartaceo_acq(const TMovimento_estr& movimento); + static bool check_documento_vendita(const TLocalisamfile& mov, bool& exist_doc); /** CHECK RIFERIMENTO FPPRO * Per le fatture di acquisto controllo se ho il riferimento nell'FPPRO. * Altrimenti cerco di capire se riesco a trovare il corrispondente del movimento @@ -342,18 +408,18 @@ class TEstrazione : public TObject */ static state_fppro check_fppro(int numreg); bool check_periodo_def() const; - void copy_file_to_webapp_fld(const movimento_t& movimento) const; + void copy_file_to_webapp_fld(TMovimento_estr& movimento) const; static void fill_id(const TRectype& clifo, TString& statopaiv, TString& idfisc, TString& paiv, TString& codfis); TipoIVA get_tipoiva() const { return _head.tipo_doc == 'A' ? iva_acquisti : iva_vendite; } static bool is_doc_xml(const TRectype& mov); - static bool find_movcoll(int numreg, _Out_ TString& numreg_rev_vend); - static bool load_annessi(movimento_t& movimento); + static bool find_movcoll(int numreg, TString& numreg_rev_vend); + static bool load_annessi(TMovimento_estr& movimento); // Se il movimento e' di vendita e ha i riferimenti al documento generatore provo a stamparlo con ve, e lo inserisco tra i cartacei F9. - static bool stampa_documento(const movimento_t& movimento, TFilename& file); - bool grab_pdf_from_spotlite(const movimento_t& movimento, TFilename& file) const; + static bool stampa_documento(const TMovimento_estr& movimento, TFilename& file); + bool grab_pdf_from_spotlite(const TMovimento_estr& movimento, TFilename& file) const; public: - static bool make_prosp_int_revc(int numreg, TCategorie_doc::annesso& annesso); + static bool make_prosp_int_revc(int numreg, TAnnesso * TAnnesso); private: @@ -374,7 +440,7 @@ private: public: - void add_mov(const movimento_t& movimento); + void add_mov(TMovimento_estr * movimento) { _movs.add(movimento); } /** DIAGNOSTICA GESTIONALE. * Controllo lo stato delle fatture: * Per le fatt. acquisto non collegate a fppro cerca di agganciarle. @@ -406,7 +472,7 @@ public: // Getters TString get_id_estr() const { return _head.id_estr; } TString4 get_stato_estr() const { return _head.stato_estr; } - const vector& get_movs() const { return _movs; } + const TArray & get_movs() const { return _movs; } // Setters void set_provvisorio(bool flag_prov) { _head.flag_prov = flag_prov; } @@ -447,43 +513,44 @@ public: class TIva_insert_prepared_stat { - vector> _fields; + TAssoc_array _fields; // TString bool _ok{ true }; TString _query; - void add_value(const char* field, const TString& value); + void add_value(const char* field, const TString& value) { _fields.add(field, value); } void write(); + public: + void add(const char* field, const TString& str, int len = -1); void add(const char* field, const char* str, int len = -1); void add(const char* field, const TDate& date); void add(const char* field, char c); void add(const char* field, long l); void add(const char* field, const int n) { add(field, (long)n); } - void add_getdate(const char* field); + void add_getdate(const char* field) { _fields.add(field, "GETDATE()"); } bool get(TString& query); void reset(); }; class TF9_doccart { - TLocalisamfile _tdocs; TLocalisamfile _tannessi; public: - static bool add_cart(const TFilename& file, const TString& numreg, bool is_annesso = false, + static bool add_cart(const TFilename& file, long numreg, bool is_annesso = false, const TString& catannpadre = "", const TString& catdocann = "", bool suppress_errors = true); - bool doc_already_exists(const TFilename& file, TString& numreg, bool& annesso); - bool mov2doc(const TString& numreg, TFilename& doc); - bool mov2listann(const TString& numreg, TString_array& list_annessi); - bool mov2listann_vect(const TString& numreg, vector& list_annessi); + bool doc_already_exists(const TFilename& file, long & numreg, bool& TAnnesso); + bool mov2doc(long numreg, TFilename& doc); + bool mov2listann(const TString& numreg, TString_array & list_annessi); + bool mov2listann_vect(const long numreg, TArray & list_annessi); static TString get_full_path_file_cartaceo(const TString& filename) { return TString() << TFilename(F9CONF.get_addr_cart()).slash_terminate() << filename; } - TF9_doccart() : _tdocs(LF_F9DOCS), _tannessi(LF_F9ANNESSI) { } + TF9_doccart() : _tannessi(LF_F9ANNESSI) { } }; diff --git a/src/f9/f9lib01.cpp b/src/f9/f9lib01.cpp index 3182b47d1..bce03b3ab 100644 --- a/src/f9/f9lib01.cpp +++ b/src/f9/f9lib01.cpp @@ -24,24 +24,20 @@ const TString & get_numdoc_exp_fp(const int numreg) if (mov.full()) { - const TString& dprovv = mov.get(MOV_DPROVV); - const int danno = mov.get_int(MOV_DANNO); - const TString& dcodnum = mov.get(MOV_DCODNUM); - const int dndoc = mov.get_int(MOV_DNDOC); - if (!dprovv.empty() && danno != 0 && !dcodnum.empty() && dndoc != 0) - { - const TDocumento doc(dprovv[0], danno, dcodnum, dndoc); - numdoc = complete_num_fp(doc.codice_numerazione(), doc.numero()); - } + const TString& codnum = mov.get(MOV_DCODNUM); + const int ndoc = mov.get_int(MOV_DNDOC); + + if (codnum.full() && ndoc != 0) + numdoc = complete_num_fp(cached_numerazione(codnum), ndoc); } return numdoc; } /////////////////////////////////////////////////////////////////////////////// -// movimento_t +// TMovimento_estr /////////////////////////////////////////////////////////////////////////////// -const char* movimento_t::err_mov2name(const err_mov descr_estr) +const char* TMovimento_estr::err_mov2name(const err_mov descr_estr) { switch (descr_estr) { @@ -69,8 +65,30 @@ const char* movimento_t::err_mov2name(const err_mov descr_estr) } } -movimento_t::movimento_t(TSheet_field& sf, int row) : _err(false), _state(null_state), _estratto(true), - _descr_estr(mov_no_error), _catdoc(nullptr), _cartaceo(false) +TMovimento_estr & TMovimento_estr::copy(const TMovimento_estr & m) +{ + _err = m._err; + _state = m._state; + _estratto = m._estratto; + _descr_estr = m._descr_estr; +// _catdoc = m._catdoc == nullptr ? nullptr : new TClasse_doc(*m._catdoc); + _cartaceo = m._cartaceo; + _numreg = m._numreg; + _datareg = m._datareg; + _datadoc = m._datadoc; + _codcaus = m._codcaus; + _meseliq = m._meseliq; + _numdoc = m._numdoc; + _tot = m._tot; + _codcf = m._codcf; + _ragsoc = m._ragsoc; + _reg_protiva = m._reg_protiva; + _descr = m._descr; + return *this; +} + +TMovimento_estr::TMovimento_estr(TSheet_field& sf, int row) : _err(false), _state(null_state), _estratto(true), + _descr_estr(mov_no_error), /*_catdoc(nullptr),*/ _cartaceo(false) { _numreg = sf.get_long_row_cell(row, FE_NUMREG); _datareg = sf.get_date_row_cell(row, FE_DATAREG); @@ -85,7 +103,7 @@ movimento_t::movimento_t(TSheet_field& sf, int row) : _err(false), _state(null_s _descr = sf.get_long_row_cell(row, FE_DESCR); } -void movimento_t::set_err(const char * descr, err_mov descr_estr) +void TMovimento_estr::set_err(const char * descr, err_mov descr_estr) { bool error = descr && *descr; @@ -98,8 +116,8 @@ void movimento_t::set_err(const char * descr, err_mov descr_estr) _descr_estr = error ? mov_annesso_nexist : mov_no_error; } -movimento_t::movimento_t(const long numreg) : _err(false), _state(null_state), _estratto(true), _descr_estr(mov_no_error), - _catdoc(nullptr), _cartaceo(false) +TMovimento_estr::TMovimento_estr(const long numreg) : _err(false), _state(null_state), _estratto(true), _descr_estr(mov_no_error), + /* _catdoc(nullptr),*/ _cartaceo(false) { const TRectype & mov = cache().get(LF_MOV, numreg); TToken_string key(mov.get(MOV_TIPO)); @@ -122,9 +140,9 @@ movimento_t::movimento_t(const long numreg) : _err(false), _state(null_state), _ _descr = mov.get(MOV_DESCR); } -movimento_t::movimento_t(TISAM_recordset & mov, TipoIVA tipo, bool escl) : _err(false), _state(null_state), - _estratto(true), _descr_estr(mov_no_error), - _catdoc(nullptr), _cartaceo(false) +TMovimento_estr::TMovimento_estr(TISAM_recordset & mov, TipoIVA tipo, bool escl) : _err(false), _state(null_state), + _estratto(true), _descr_estr(mov_no_error), + /* _catdoc(nullptr), */ _cartaceo(false) { _numreg = mov.get_long(MOV_NUMREG); _datareg = mov.get_date(MOV_DATAREG); @@ -173,11 +191,11 @@ const char* TEstrazione::caus_sos(const TLocalisamfile& mov, const TipoIVA iva) return ""; } -void TEstrazione::check_annessi(movimento_t& mov_i, const int numreg) +void TEstrazione::check_annessi(TMovimento_estr& mov_i, const int numreg) { TToken_string ann_nexist; - if (!check_annessi_oblig(mov_i.catdoc()->catdoc, numreg, ann_nexist)) + if (!check_annessi_oblig(mov_i.catdoc(categorie_doc())->catdoc(), numreg, ann_nexist)) { TString msg_annessi_mancanti("Annessi obligatori mancanti: "); for (int i = 0; i < ann_nexist.items(); ++i) @@ -191,26 +209,34 @@ void TEstrazione::check_annessi(movimento_t& mov_i, const int numreg) } } -bool TEstrazione::check_annessi_oblig(const TString& catdoc, const int numreg, _Out_ TToken_string& ann_nexist) +bool TEstrazione::check_annessi_oblig(const TString& catdoc, const int numreg,TToken_string& ann_nexist) { ann_nexist.destroy(-1); const TString_array lista_cat_annessi = categorie_doc().get_array_ann(catdoc); // Lista cat annessi TF9_doccart file_cart; - std::vector list_file_ann; // Lista file annessi - file_cart.mov2listann_vect(TString() << numreg, list_file_ann); + TArray list_file_ann; // Lista file annessi + + file_cart.mov2listann_vect(numreg, list_file_ann); + bool ok_ann = true; - FOR_EACH_ARRAY_ITEM(lista_cat_annessi, nr, ann) + + FOR_EACH_ARRAY_ITEM(lista_cat_annessi, nr, obj_name) { - TCategorie_doc::annesso annesso; - const bool ok_cat = categorie_doc().get_ann(catdoc,*(TToken_string*)ann, annesso); + TString & ann_name = (TString &)*obj_name; + TAnnesso * ann = categorie_doc().get_ann(catdoc, ann_name); + + const bool ok_cat = ann != nullptr; // Ignoro il flag obbligatorio per il prospetto di reverse charge - if (ok_cat && annesso.obblig && annesso.opcee != "RC") + if (ok_cat && ann->obblig() && ann->opcee() != "RC") { // Controllo che esista l'annesso per questo mov. bool exist = false; - for (auto f_ann = list_file_ann.begin(); f_ann != list_file_ann.end(); ++f_ann) + + FOR_EACH_ARRAY_ITEM(list_file_ann, r, obj) { - if (f_ann->catdocann == *(TToken_string*)ann) + TAnnesso_mov * f_ann = (TAnnesso_mov *)obj; + + if (f_ann->catdocann() == ann_name) { exist = true; break; @@ -218,26 +244,27 @@ bool TEstrazione::check_annessi_oblig(const TString& catdoc, const int numreg, _ } ok_ann &= exist; if (!exist) - ann_nexist.add(*(TToken_string*)ann); + ann_nexist.add(ann_name); } - else if(ok_cat && annesso.opcee == "RC") + else if(ok_cat && ann->opcee() == "RC") { // Generazione prospetto integrativo. - const bool ok = make_prosp_int_revc(numreg, annesso); + const bool ok = make_prosp_int_revc(numreg, ann); + if (!ok) - ann_nexist.add(TString() << "Prospetto integrativo (" << annesso.catdoc << ")"); + ann_nexist.add(TString() << "Prospetto integrativo (" << ann->catdoc() << ")"); ok_ann &= ok; } } return ok_ann; } -bool TEstrazione::check_cartaceo_acq(const movimento_t& movimento) +bool TEstrazione::check_cartaceo_acq(const TMovimento_estr& movimento) { TF9_doccart filecart; TFilename file; - TString reg; reg << movimento.numreg(); - return filecart.mov2doc(reg, file) && file.exist(); + + return filecart.mov2doc(movimento.numreg(), file) && file.exist(); } bool TEstrazione::check_documento_vendita(const TLocalisamfile& mov, _Out_ bool& exist_doc) @@ -304,25 +331,30 @@ bool TEstrazione::check_periodo_def() const return fp_db().sq_items() == 0; } -void TEstrazione::copy_file_to_webapp_fld(const movimento_t& movimento) const +void TEstrazione::copy_file_to_webapp_fld(TMovimento_estr& movimento) const { // f9pwa + ambiente + idlancio(ID drd) + categoria_documento(drt) + nome_documento TFilename base(F9CONF.get_addr_doc_loc()); base.add(_head.cod_soc).add(_head.id_estr).slash_terminate(); TToken_string categorie; TToken_string files; - - if(movimento.cartaceo() && movimento.catdoc() != nullptr) + TClasse_doc * cd = movimento.catdoc(categorie_doc()); + TFilename file = movimento.nomefilecart(); + + file.trim(); + if (movimento.cartaceo() && cd != nullptr && file.full()) { - categorie.add(movimento.catdoc()->catdoc, 0); - files.add(movimento.nomefilecart(), 0); + categorie.add(cd->catdoc(), 0); + files.add(file, 0); } - if(!movimento.annessi().empty()) + if(!movimento.annessi().empty()) //qui { - for (auto it = movimento.annessi().begin(); it != movimento.annessi().end(); ++it) + FOR_EACH_ARRAY_ITEM(movimento.annessi(), r, obj) { - categorie.add(it->catdocann); - files.add(TF9_doccart::get_full_path_file_cartaceo(it->filename)); + TAnnesso_mov & ann = (TAnnesso_mov &) *obj; + + categorie.add(ann.catdocann()); + files.add(TF9_doccart::get_full_path_file_cartaceo(ann.filename())); } } #ifdef DBG @@ -335,7 +367,9 @@ void TEstrazione::copy_file_to_webapp_fld(const movimento_t& movimento) const TFilename dest(base); dest.add(categorie.get(i)).add(file.name()); make_dir(dest.path()); - const bool f = fcopy(file, dest); + + const bool f = fcopy(file, dest); + if (!f) error_box("Errore nel copiare il file nella cartella di destinazione: %s", (const char*)dest); } @@ -429,15 +463,14 @@ bool TEstrazione::find_movcoll(const int numreg, _Out_ TString& numreg_rev_vend) return numreg_rev_vend.full(); } -bool TEstrazione::load_annessi(movimento_t& movimento) +bool TEstrazione::load_annessi(TMovimento_estr& movimento) { TF9_doccart doccart; - TString numreg; numreg << movimento.numreg(); - return doccart.mov2listann_vect(numreg, movimento.annessi()); + return doccart.mov2listann_vect(movimento.numreg(), movimento.annessi()); } -bool TEstrazione::stampa_documento(const movimento_t& movimento, TFilename& file) +bool TEstrazione::stampa_documento(const TMovimento_estr& movimento, TFilename& file) { bool ok = false; // Se il movimento e' di vendita e ha i riferimenti al documento generatore provo a stamparlo con ve, e lo inserisco tra i cartacei F9. @@ -461,14 +494,13 @@ bool TEstrazione::stampa_documento(const movimento_t& movimento, TFilename& file if (pdf.exist()) { file.cut(0) << pdf; - - TString numreg; numreg << movimento.numreg(); // Controllo anche se false perche' potrebbe esistere gia'. - if(!TF9_doccart::add_cart(file, numreg)) + if(!TF9_doccart::add_cart(file, movimento.numreg())) { TF9_doccart filecart; TFilename fdoc; - ok = filecart.mov2doc(numreg, fdoc) && fdoc.name() == file.name(); + + ok = filecart.mov2doc(movimento.numreg(), fdoc) && fdoc.name() == file.name(); } else ok = true; @@ -479,7 +511,7 @@ bool TEstrazione::stampa_documento(const movimento_t& movimento, TFilename& file return ok; } -bool TEstrazione::grab_pdf_from_spotlite(const movimento_t& movimento, TFilename& file) const +bool TEstrazione::grab_pdf_from_spotlite(const TMovimento_estr& movimento, TFilename& file) const { TLocalisamfile mov(LF_MOV); @@ -511,7 +543,7 @@ bool TEstrazione::grab_pdf_from_spotlite(const movimento_t& movimento, TFilename return false; } -bool TEstrazione::make_prosp_int_revc(const int numreg, TCategorie_doc::annesso& annesso) +bool TEstrazione::make_prosp_int_revc(const int numreg, TAnnesso * annesso) { TLocalisamfile mov(LF_MOV); mov.put(MOV_NUMREG, numreg); @@ -526,7 +558,7 @@ bool TEstrazione::make_prosp_int_revc(const int numreg, TCategorie_doc::annesso& // [ NUMREG][ CAT.ANN.].pdf // [0000000][AAAAAAAAAA].pdf TFilename tmp_file; tmp_file.tempdir(); - TString name; name << format("%07d%10s", numreg, (const char*)annesso.catdoc); + TString name; name << format("%07d%10s", numreg, (const char*)annesso->catdoc()); name.replace(' ', '_'); tmp_file.add(name); tmp_file.ext("pdf"); @@ -540,7 +572,8 @@ bool TEstrazione::make_prosp_int_revc(const int numreg, TCategorie_doc::annesso& // Controllo che non esista gia' altrimenti elimino il record TF9_doccart doccart; bool a; - TString numreg_old; + long numreg_old; + if (doccart.doc_already_exists(newfile, numreg_old, a)) { TLocalisamfile lf_ann(LF_F9ANNESSI); @@ -555,9 +588,9 @@ bool TEstrazione::make_prosp_int_revc(const int numreg, TCategorie_doc::annesso& TLocalisamfile lf_ann(LF_F9ANNESSI); lf_ann.put(F9A_NUMREG, numreg); lf_ann.put(F9A_FILENAME, newfile.name()); - lf_ann.put(F9A_CATDOCPAD, annesso.catdocpadre); - lf_ann.put(F9A_CATDOCANN, annesso.catdoc); - lf_ann.put(F9A_LOADDATE, TDate(TODAY)); + lf_ann.put(F9A_CATDOCPAD, annesso->catdocpadre()); + lf_ann.put(F9A_CATDOCANN, annesso->catdoc()); + lf_ann.put(F9A_LOADDATE, today); lf_ann.put(F9A_USER, user()); bool ok = lf_ann.write() == NOERR; ok &= lf_ann.rewrite() == NOERR; @@ -605,56 +638,61 @@ bool TEstrazione::insert_into_f9movestr() const TProgress_monitor prog(_movs.size(), "Salvataggio informazioni estrazione", false); - for(auto it = _movs.begin(); it != _movs.end(); ++it) + FOR_EACH_ARRAY_ITEM(_movs, r, obj) { - if(!prog.add_status()) - break; + if(prog.add_status()) + { + TMovimento_estr & mov = (TMovimento_estr &)*obj; - query.cut(0) << "INSERT INTO " F9_MOVESTR " (" MES_CODSOC ", IDESTR, NUMREG, DATAREG, ESTRATTO, DESCR_ERR)\nVALUES " << - " ('" << _head.cod_soc << "', '" << _head.id_estr << "', '" << it->numreg() << "', '" << it->datareg().date2ansi() << "', " << - (it->estratto() ? "1" : "0") << ", '" << check_str(it->get_descr_estr()) << "')"; - ok &= fp_db().sq_set_exec(query) && fp_db().sq_commit(); - if (!ok) - { - write_errorsql_log(query); - break; - } - } + query.cut(0) << "INSERT INTO " F9_MOVESTR " (" MES_CODSOC ", IDESTR, NUMREG, DATAREG, ESTRATTO, DESCR_ERR)\nVALUES " << + " ('" << _head.cod_soc << "', '" << _head.id_estr << "', '" << mov.numreg() << "', '" << mov.datareg().date2ansi() << "', " << + (mov.estratto() ? "1" : "0") << ", '" << check_str(mov.get_descr_estr()) << "')"; + ok &= fp_db().sq_set_exec(query) && fp_db().sq_commit(); + if (!ok) + { + write_errorsql_log(query); + break; + } + } + } return ok; } bool TEstrazione::export_error_list() const { TF9_dberr dberr; - const vector& movs = _movs; - bool ok = true; + const TArray & movs = _movs; // + bool ok = true; int count = 0; - TProgress_monitor pg(movs.size(), "Scrittura movimenti in errore"); - for (auto it = movs.begin(); it != movs.end(); ++it) + TProgress_monitor pg(movs.items(), "Scrittura movimenti in errore"); + + FOR_EACH_ARRAY_ITEM(movs, r ,obj) { - if (!pg.add_status()) - break; + TMovimento_estr & mov = (TMovimento_estr &)*obj; - if (it->err()) - { - dberr.add(_head.cod_soc); - dberr.add(_head.id_estr); - dberr.add(it->numreg()); - dberr.add(it->datareg()); - dberr.add(it->datadoc()); - dberr.add(it->codcaus()); - dberr.add(it->meseliq()); - dberr.add(it->numdoc()); - dberr.add(it->totale().stringa()); - dberr.add(it->codcf()); - dberr.add(it->ragsoc()); - dberr.add(it->protiva()); - dberr.add(it->descr()); - dberr.add(it->descr_err()); - if (!(ok &= dberr.send())) - break; - ++count; - } + if (pg.add_status()) + { + if (mov.err()) + { + dberr.add(_head.cod_soc); + dberr.add(_head.id_estr); + dberr.add(mov.numreg()); + dberr.add(mov.datareg()); + dberr.add(mov.datadoc()); + dberr.add(mov.codcaus()); + dberr.add(mov.meseliq()); + dberr.add(mov.numdoc()); + dberr.add(mov.totale().stringa()); + dberr.add(mov.codcf()); + dberr.add(mov.ragsoc()); + dberr.add(mov.protiva()); + dberr.add(mov.descr()); + dberr.add(mov.descr_err()); + if (!(ok &= dberr.send())) + break; + ++count; + } + } } return ok; } @@ -723,11 +761,6 @@ TCategorie_doc& TEstrazione::categorie_doc(const bool reload) // Public methods ///////////////////////////////////////////////////////////////////////////////////////////// -void TEstrazione::add_mov(const movimento_t& movimento) -{ - _movs.insert(_movs.end(), movimento); -} - bool TEstrazione::update_drd_stato_estr() const { bool ok; @@ -756,216 +789,214 @@ const char* TEstrazione::diagnostica_mov() if (tipo == iva_acquisti) { // Controlli per le fatture di acquisto - TProgress_monitor bar(_movs.size(), "Controllo stato movimenti di acquisto"); - for (auto it = _movs.begin(); it != _movs.end(); ++it) + TProgress_monitor bar(_movs.items(), "Controllo stato movimenti di acquisto"); + + FOR_EACH_ARRAY_ITEM(_movs, r, obj) { - if (!bar.add_status()) - break; - - movimento_t& mov_i = *it; + if (bar.add_status()) + { + TMovimento_estr & mov_i = (TMovimento_estr &)*obj; // Se gia' escluso passo avanti - if (!mov_i.estratto() && mov_i.descr_estr() == mov_escluso) - continue; + if (!mov_i.estratto() && mov_i.descr_estr() == mov_escluso) + continue; - if (mov_i.no_err() && mov_i.estratto()) - { - const long numreg = mov_i.numreg(); - const TRectype & mov =cache().get(LF_MOV, numreg); + if (mov_i.no_err() && mov_i.estratto()) + { + const long numreg = mov_i.numreg(); + const TRectype & mov =cache().get(LF_MOV, numreg); - mov_i.set_cartaceo(!is_doc_xml(mov)); + mov_i.set_cartaceo(!is_doc_xml(mov)); - const state_fppro res = check_fppro(numreg); - switch (res) - { - // OK - case guessed: - ok &= fppro_db().associa_mov(numreg); - case correct: - ok &= true; - mov_i.reset_err(); - mov_i.set_numdoc(fppro_db().get_numdoc()); - break; + const state_fppro res = check_fppro(numreg); + switch (res) + { + // OK + case guessed: + ok &= fppro_db().associa_mov(numreg); + case correct: + ok &= true; + mov_i.reset_err(); + mov_i.set_numdoc(fppro_db().get_numdoc()); + break; - // ERRORS - // Errore non bloccante (skip) - case not_fa: - ok &= true; - mov_i.set_err("", mov_no_fa); - mov_i.set_estratto(false); - ++_stats.fa_skip; - break; + // ERRORS + // Errore non bloccante (skip) + case not_fa: + ok &= true; + mov_i.set_err("", mov_no_fa); + mov_i.set_estratto(false); + ++_stats.fa_skip; + break; - // ERRORI BLOCCANTI - case reg_with_err: - ok &= false; - mov_i.set_err("Errore controllo movimento: associazione movimento con fattura elettronica passiva sbagliato."); - break; - case err_read_db: - ok &= false; - mov_i.set_err("Errore controllo movimento: errore lettura db."); - break; - case no_guessed: - // Controllo se esiste il cartaceo es. forfettari => la considero cartacea. - // Ma poi devo comunque avere il flag per l'esportazione dei cartacei - if(check_cartaceo_acq(mov_i)) - { - ok &= true; - mov_i.set_err(""); - mov_i.set_cartaceo(true); - mov_i.set_state(correct); - } - else - { - ok &= false; - mov_i.set_err("Non associato a fattura elettr. abbinamento automatico non riuscito. Abbinare manualmente, o escludere"); - } - default: break; - } - if(mov_i.state() == null_state) - mov_i.set_state(res); + // ERRORI BLOCCANTI + case reg_with_err: + ok &= false; + mov_i.set_err("Errore controllo movimento: associazione movimento con fattura elettronica passiva sbagliato."); + break; + case err_read_db: + ok &= false; + mov_i.set_err("Errore controllo movimento: errore lettura db."); + break; + case no_guessed: + // Controllo se esiste il cartaceo es. forfettari => la considero cartacea. + // Ma poi devo comunque avere il flag per l'esportazione dei cartacei + if(check_cartaceo_acq(mov_i)) + { + ok &= true; + mov_i.set_err(""); + mov_i.set_cartaceo(true); + mov_i.set_state(correct); + } + else + { + ok &= false; + mov_i.set_err("Non associato a fattura elettr. abbinamento automatico non riuscito. Abbinare manualmente, o escludere"); + } + default: break; + } + if(mov_i.state() == null_state) + mov_i.set_state(res); - if (mov_i.err()) - ++_stats.fa_err; + if (mov_i.err()) + ++_stats.fa_err; - /* Per quelli che hanno passato il primo controllo errori controllo che debba essere estratto - * secondo le categorie documentali. */ - if (mov_i.estratto()) - { - if (mov_i.no_err()) - { - // Cerco la categoria documentale - TCategorie_doc::classe_doc * cd = categorie_doc().mov2cat(mov_i.numreg()); - const bool found = cd != nullptr; + /* Per quelli che hanno passato il primo controllo errori controllo che debba essere estratto + * secondo le categorie documentali. */ + if (mov_i.estratto()) + { + if (mov_i.no_err()) + { + // Cerco la categoria documentale + TClasse_doc * cd = categorie_doc().mov2cat(mov_i.numreg()); + const bool found = cd != nullptr; - mov_i.set_estratto(found); - mov_i.set_descr_estr(cd ? mov_no_error : mov_no_catdoc); - mov_i.set_catdoc(cd); + mov_i.set_estratto(found); + mov_i.set_descr_estr(cd ? mov_no_error : mov_no_catdoc); - if (found) - check_annessi(mov_i, numreg); - } + if (found) + check_annessi(mov_i, numreg); + } - // Se cartaceo preparo il file. - if (F9CONF.get_has_cartexp()) // Se e' abilitata l'esportazione dei cartacei, altrimenti skip... - { - if (mov_i.cartaceo()) - { - TF9_doccart filecart; - TFilename file; - TString reg; reg << it->numreg(); + // Se cartaceo preparo il file. + if (F9CONF.get_has_cartexp()) // Se e' abilitata l'esportazione dei cartacei, altrimenti skip... + { + if (mov_i.cartaceo()) + { + TF9_doccart filecart; + TFilename file; - if (filecart.mov2doc(reg, file) && file.exist()) - mov_i.set_nomefilecart(file); - else - mov_i.set_err("Non e' stato possibile reperire il file del documento cartaceo per questo movimento.", mov_no_filecart); - } - else - { - ok &= true; - mov_i.set_err("", mov_no_cartaceo); - mov_i.set_estratto(false); - ++_stats.fa_skip; - } - } - copy_file_to_webapp_fld(mov_i); - } - } - ok &= mov_i.no_err(); - } - } + if (filecart.mov2doc(mov_i.numreg(), file) && file.exist()) + mov_i.set_nomefilecart(file); + else + mov_i.set_err("Non e' stato possibile reperire il file del documento cartaceo per questo movimento.", mov_no_filecart); + } + else + { + ok &= true; + mov_i.set_err("", mov_no_cartaceo); + mov_i.set_estratto(false); + ++_stats.fa_skip; + } + } + copy_file_to_webapp_fld(mov_i); + } + } + ok &= mov_i.no_err(); + } + } + } else if (tipo == iva_vendite) { // Controlli per le fatture di vendita - TProgress_monitor bar(_movs.size(), "Controllo stato movimenti di vendita"); - for (auto it = _movs.begin(); it != _movs.end(); ++it) + TProgress_monitor bar(_movs.items(), "Controllo stato movimenti di vendita"); + + FOR_EACH_ARRAY_ITEM(_movs, r, obj) { if (!bar.add_status()) - break; - //TToken_string& row = *it; - movimento_t& mov_i = *it; + { + TMovimento_estr & mov_i = (TMovimento_estr &) *obj; - // Se escluso passo avanti - if (!mov_i.estratto() && mov_i.descr_estr() == mov_escluso) - continue; + // Se escluso passo avanti + if (!mov_i.estratto() && mov_i.descr_estr() == mov_escluso) + continue; - const long numreg = mov_i.numreg(); - const TRectype & mov = cache().get(LF_MOV, numreg); - /* Controlli per vendite cambiati: - * Elettroniche solo quelle agli italiani, tutti gli altri sono cartacei - */ - if (!mov_i.err() && mov_i.estratto()) - { - mov_i.set_cartaceo(!is_doc_xml(mov)); + const long numreg = mov_i.numreg(); + const TRectype & mov = cache().get(LF_MOV, numreg); + /* Controlli per vendite cambiati: + * Elettroniche solo quelle agli italiani, tutti gli altri sono cartacei + */ + if (!mov_i.err() && mov_i.estratto()) + { + mov_i.set_cartaceo(!is_doc_xml(mov)); - unsigned short skip = 0; + unsigned short skip = 0; - if (!_has_cartacei && mov_i.cartaceo()) skip |= 0x1; - else - if (pura_iva(mov)) skip |= 0x2; - else if (mov_i.datadoc().empty() || mov_i.numdoc().empty()) skip |= 0x4; - - if(skip) - { - ++_stats.fv_cart_skip; - mov_i.reset_err(); - mov_i.set_estratto(false); - switch(skip) - { - case 0x1: mov_i.set_descr_estr(mov_no_cartaceo); break; - case 0x2: mov_i.set_descr_estr(mov_pura_iva); break; - case 0x4: mov_i.set_descr_estr(mov_no_fv); break; - default: break; - } - } - /*else if(!mov_i.cartaceo && _has_checkvend && !check_documento_vendita(mov, exist_doc)) - { - mov_i.err = true; - mov_i.estratto = false; - mov_i.descr_err = !exist_doc ? - "Il movimento non ha un documento generatore. (Escludere? o Rimuovere flag controllo vendite)" - : "Non e' stato trovato il documento elettronico nel database delle F.E. (Escludere? o Rimuovere flag controllo vendite)"; - mov_i.descr_estr = !exist_doc ? movimento_t::no_doc : movimento_t::notfound_elet; - }*/ - else - { - TCategorie_doc::classe_doc* cd = categorie_doc().mov2cat(mov_i.numreg()); - const bool found = cd != nullptr; - - if (found) - mov_i.reset_err(); + if (!_has_cartacei && mov_i.cartaceo()) skip |= 0x1; else - mov_i.set_err("Categoria assente", mov_no_catdoc); - mov_i.set_catdoc(cd); - if (mov_i.catdoc()) - check_annessi(mov_i, mov_i.numreg()); + if (pura_iva(mov)) skip |= 0x2; + else if (mov_i.datadoc().empty() || mov_i.numdoc().empty()) skip |= 0x4; - if (!mov_i.catdoc()) - ++_stats.fv_nocatdoc; - if (mov_i.err()) - ++_stats.fv_err; - else if (mov_i.estratto()) - ++_stats.fv_estr; - } - - if (mov_i.estratto()) - { - if (mov_i.cartaceo()) - { - TF9_doccart filecart; - TFilename file; - TString reg; reg << it->numreg(); - - if (filecart.mov2doc(reg, file) && file.exist() || grab_pdf_from_spotlite(mov_i, file) && file.exist()) - mov_i.set_nomefilecart(file); + if(skip) + { + ++_stats.fv_cart_skip; + mov_i.reset_err(); + mov_i.set_estratto(false); + switch(skip) + { + case 0x1: mov_i.set_descr_estr(mov_no_cartaceo); break; + case 0x2: mov_i.set_descr_estr(mov_pura_iva); break; + case 0x4: mov_i.set_descr_estr(mov_no_fv); break; + default: break; + } + } + /*else if(!mov_i.cartaceo && _has_checkvend && !check_documento_vendita(mov, exist_doc)) + { + mov_i.err = true; + mov_i.estratto = false; + mov_i.descr_err = !exist_doc ? + "Il movimento non ha un documento generatore. (Escludere? o Rimuovere flag controllo vendite)" + : "Non e' stato trovato il documento elettronico nel database delle F.E. (Escludere? o Rimuovere flag controllo vendite)"; + mov_i.descr_estr = !exist_doc ? TMovimento_estr::no_doc : TMovimento_estr::notfound_elet; + }*/ + else + { + TClasse_doc* cd = categorie_doc().mov2cat(mov_i.numreg()); + const bool found = cd != nullptr; + + if (found) + mov_i.reset_err(); else - mov_i.set_err("Non e' stato possibile reperire il file del documento cartaceo per questo movimento.", mov_no_filecart); - } - copy_file_to_webapp_fld(mov_i); - } - } - ok &= mov_i.no_err(); - } + mov_i.set_err("Categoria assente", mov_no_catdoc); + if (cd != nullptr) + check_annessi(mov_i, mov_i.numreg()); + + if (!mov_i.catdoc(categorie_doc())) + ++_stats.fv_nocatdoc; + if (mov_i.err()) + ++_stats.fv_err; + else if (mov_i.estratto()) + ++_stats.fv_estr; + } + + if (mov_i.estratto()) + { + if (mov_i.cartaceo()) + { + TF9_doccart filecart; + TFilename file; + + if (filecart.mov2doc(mov_i.numreg(), file) && file.exist() || grab_pdf_from_spotlite(mov_i, file) && file.exist()) + mov_i.set_nomefilecart(file); + else + mov_i.set_err("Non e' stato possibile reperire il file del documento cartaceo per questo movimento.", mov_no_filecart); + } + copy_file_to_webapp_fld(mov_i); + } + } + ok &= mov_i.no_err(); + } + } } _head.stato_estr = ok ? D_GEST_OK : D_GEST_ERR; return _head.stato_estr; @@ -983,7 +1014,7 @@ result_estr TEstrazione::estrai() } if (!_escluso && !_head.flag_prov) { - if (!check_periodo_def()) + /* if (!check_periodo_def()) { error_box("Attenzione e' stato inserito un periodo che si sovrappone\nad un'estrazione definitiva gia' esistente. Impossibile procedere."); return estr_stop; @@ -993,7 +1024,7 @@ result_estr TEstrazione::estrai() if (!noyes_box("Attenzione, e' stato saltato un periodo rispetto all'ultimo\n" "estratto e quello selezionato, il quale rimarrebbe vuoto.\nContinuare comunque?")) return estr_stop; - } + } */ // Avviso nel caso in cui si stia facendo un'estrazione definitiva di un periodo di cui non si e' mai fatta // una prova provvisoria. if(!exist_prov()) @@ -1052,169 +1083,166 @@ bool TEstrazione::estrazione_iva(bool escluso) TString statopaiv, idfisc, paiv, codfis; bool stato = true; - TProgress_monitor bar(_movs.size(), "Estrazione dati IVA"); - for (auto it = _movs.begin(); it != _movs.end() && stato; ++it) + TProgress_monitor bar(_movs.items(), "Estrazione dati IVA"); + + FOR_EACH_ARRAY_ITEM(_movs, r, obj) { - if (!bar.add_status()) - break; + TMovimento_estr & mov_i = (TMovimento_estr &)*obj; - if (!it->estratto()) - continue; - - const TRectype& mov = cache().get(LF_MOV, it->numreg()); - TToken_string key = mov.get(MOV_TIPO); - - key.add(mov.get(MOV_CODCF)); - - const TRectype& cli = cache().get(LF_CLIFO, key); - const char tipodoc = _head.tipo_doc; - const TString& name_registro = TRegistro(TCausale(mov.get(MOV_CODCAUS), mov.get_date(MOV_DATAREG).year()).reg()).name(); - fill_id(cli, statopaiv, idfisc, paiv, codfis); - TDate datadoc = mov.get_date(MOV_DATADOC); - TDate datareg = mov.get_date(MOV_DATAREG); - - TIva_insert_prepared_stat iva_query; /////////QUIIIIIII/// - - iva_query.add(IVA_CODSOC, _head.cod_soc, 10); - iva_query.add(IVA_IDLAN, _head.id_estr, 18); - iva_query.add(IVA_FLAG_PD, _head.flag_prov ? 'P' : 'D'); - iva_query.add(IVA_ANNOES, mov.get_int(MOV_ANNOES)); - iva_query.add(IVA_GIVA, tipodoc); - iva_query.add(IVA_TIPOG, name_registro, 10); - iva_query.add(IVA_DOCXML, it->cartaceo() ? 'N' : 'S'); - iva_query.add(IVA_TIPOCF, mov.get_char(MOV_TIPO)); - iva_query.add(IVA_CODCF, mov.get_long(MOV_CODCF)); - - iva_query.add(IVA_RAGSOC, cli.get(CLI_RAGSOC), 60); - iva_query.add(IVA_IDFISC, idfisc, 30); - iva_query.add(IVA_PIVA, paiv, 28); - iva_query.add(IVA_CODFIS, codfis, 16); - iva_query.add(IVA_CATDOC, it->catdoc()->catdoc, 10); - - const TRegistro& reg = cached_registro(mov.get(MOV_REG), mov.get_int(MOV_ANNOIVA)); - - if (reg.iva() == iva_vendite) - iva_query.add(IVA_CAUSSOS, it->catdoc()->caus_sost, 6); // - else + if (bar.add_status() && mov_i.estratto()) { - TToken_string key(mov.get((MOV_KEYFPPRO)), ';'); + const TRectype& mov = cache().get(LF_MOV, mov_i.numreg()); + TToken_string key = mov.get(MOV_TIPO); - if (key.full()) - { - TFppro fppro(key); - const TString& tipodoc = fppro.get_tipodoc(); + key.add(mov.get(MOV_CODCF)); - if(tipodoc.full()) - iva_query.add(IVA_CAUSSOS, tipodoc, 6); - else - iva_query.add(IVA_CAUSSOS, it->catdoc()->caus_sost, 6); - } + const TRectype& cli = cache().get(LF_CLIFO, key); + const char tipodoc = _head.tipo_doc; + const TString& name_registro = TRegistro(TCausale(mov.get(MOV_CODCAUS), mov.get_date(MOV_DATAREG).year()).reg()).name(); + fill_id(cli, statopaiv, idfisc, paiv, codfis); + TDate datadoc = mov.get_date(MOV_DATADOC); + TDate datareg = mov.get_date(MOV_DATAREG); + + TIva_insert_prepared_stat iva_query; /////////QUIIIIIII/// + + iva_query.add(IVA_CODSOC, _head.cod_soc, 10); + iva_query.add(IVA_IDLAN, _head.id_estr, 18); + iva_query.add(IVA_FLAG_PD, _head.flag_prov ? 'P' : 'D'); + iva_query.add(IVA_ANNOES, mov.get_int(MOV_ANNOES)); + iva_query.add(IVA_GIVA, tipodoc); + iva_query.add(IVA_TIPOG, name_registro, 10); + iva_query.add(IVA_DOCXML, mov_i.cartaceo() ? 'N' : 'S'); + iva_query.add(IVA_TIPOCF, mov.get_char(MOV_TIPO)); + iva_query.add(IVA_CODCF, mov.get_long(MOV_CODCF)); + + iva_query.add(IVA_RAGSOC, cli.get(CLI_RAGSOC), 60); + iva_query.add(IVA_IDFISC, idfisc, 30); + iva_query.add(IVA_PIVA, paiv, 28); + iva_query.add(IVA_CODFIS, codfis, 16); + iva_query.add(IVA_CATDOC, mov_i.catdoc(categorie_doc())->catdoc(), 10); + + const TRegistro& reg = cached_registro(mov.get(MOV_REG), mov.get_int(MOV_ANNOIVA)); + + if (reg.iva() == iva_vendite) + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); // else - iva_query.add(IVA_CAUSSOS, it->catdoc()->caus_sost, 6); + { + TToken_string key(mov.get((MOV_KEYFPPRO)), ';'); + + if (key.full()) + { + TFppro fppro(key); + const TString& tipodoc = fppro.get_tipodoc(); + + if(tipodoc.full()) + iva_query.add(IVA_CAUSSOS, tipodoc, 6); + else + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); + } + else + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); + } + iva_query.add(IVA_NUMDOC, mov_i.numdoc(), 20); + iva_query.add(IVA_DATADOC, datadoc); + iva_query.add(IVA_SEZIVA, mov.get(MOV_REG), 10); + iva_query.add(IVA_TIPOREG, "", 6); + iva_query.add(IVA_NPROT, mov.get(MOV_PROTIVA), 20); + iva_query.add(IVA_DATPROT, datareg); + + /*if(is_autofattura(mov)) + { + iva_query.add(IVA_FORNOR, ""); + iva_query.add(IVA_REGOR, ""); + iva_query.add(IVA_NUMOR, N ORI); + iva_query.add(IVA_DATAOR, TDate(20010101)); + }*/ + + iva_query.add(IVA_CLASDOC, mov_i.catdoc(categorie_doc())->class_sost(), 10); + iva_query.add(IVA_NOMFD, mov_i.nomefilecart().name(), 100); + + // Load annessi... + if(!mov_i.annessi().empty()) + { + TArray & ann = mov_i.annessi(); + int i = 0; + const int size = ann.items(); + + iva_query.add(IVA_CLASAN1, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF1, ((TAnnesso_mov &)ann[i++]).filename(), 100); + // HOW DID MY LIFE COME TO THIS?... + if (size > i) + { + iva_query.add(IVA_CLASAN2, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF2, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN3, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF3, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN4, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF4, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN5, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF5, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN4, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF4, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN6, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF6, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN7, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF7, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN8, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF8, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN9, ((TAnnesso_mov &)ann[i]).catdocann(), 10); + iva_query.add(IVA_NOMF9, ((TAnnesso_mov &)ann[i++]).filename(), 100); + } + } + + iva_query.add(IVA_USERELA, user(), 10); + iva_query.add_getdate(IVA_TIMEELA); + + if (_head.tipo_doc == 'A' && !mov_i.cartaceo()) + { + TToken_string keys(mov.get(MOV_KEYFPPRO), ';'); + fppro_db().set_keys(keys); + iva_query.add(IVA_TIPPROT, fppro_db().get_tipoprot(), 2); + iva_query.add(IVA_ANNPROT, TVariant(fppro_db().get_annoprot()).as_int()); + iva_query.add(IVA_NUMPROT, fppro_db().get_numprot(), 10); // Non controllo che sia in realta' un numero... + iva_query.add(IVA_TIMERIC, TDate(fppro_db().get_dataoraric())); + } + TString sql; + + bool ok = iva_query.get(sql); + + if (ok) + ok = fp_db().sq_set_exec(sql); + if (ok) + ok = fp_db().sq_commit(); + if (!ok) + write_errorsql_log(sql); + + stato &= ok; } - - - - iva_query.add(IVA_NUMDOC, it->numdoc(), 20); - iva_query.add(IVA_DATADOC, datadoc); - iva_query.add(IVA_SEZIVA, mov.get(MOV_REG), 10); - iva_query.add(IVA_TIPOREG, "", 6); - iva_query.add(IVA_NPROT, mov.get(MOV_PROTIVA), 20); - iva_query.add(IVA_DATPROT, datareg); - - /*if(is_autofattura(mov)) - { - iva_query.add(IVA_FORNOR, ""); - iva_query.add(IVA_REGOR, ""); - iva_query.add(IVA_NUMOR, N ORI); - iva_query.add(IVA_DATAOR, TDate(20010101)); - }*/ - - iva_query.add(IVA_CLASDOC, it->catdoc()->class_sost, 10); - iva_query.add(IVA_NOMFD, it->nomefilecart().name(), 100); - - // Load annessi... - if(!it->annessi().empty()) - { - vector& ann = it->annessi(); - size_t i = 0; - const size_t size = ann.size(); - - iva_query.add(IVA_CLASAN1, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF1, ann[i++].filename, 100); - // HOW DID MY LIFE COME TO THIS?... - if (size > i) - { - iva_query.add(IVA_CLASAN2, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF2, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN3, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF3, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN4, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF4, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN5, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF5, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN4, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF4, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN6, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF6, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN7, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF7, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN8, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF8, ann[i++].filename, 100); - } - if (size > i) - { - iva_query.add(IVA_CLASAN9, ann[i].catdocann, 10); - iva_query.add(IVA_NOMF9, ann[i++].filename, 100); - } - } - - iva_query.add(IVA_USERELA, user(), 10); - iva_query.add_getdate(IVA_TIMEELA); - - if (_head.tipo_doc == 'A' && !it->cartaceo()) - { - TToken_string keys(mov.get(MOV_KEYFPPRO), ';'); - fppro_db().set_keys(keys); - iva_query.add(IVA_TIPPROT, fppro_db().get_tipoprot(), 2); - iva_query.add(IVA_ANNPROT, TVariant(fppro_db().get_annoprot()).as_int()); - iva_query.add(IVA_NUMPROT, fppro_db().get_numprot(), 10); // Non controllo che sia in realta' un numero... - iva_query.add(IVA_TIMERIC, TDate(fppro_db().get_dataoraric())); - } - TString sql; - - bool ok = iva_query.get(sql); - - if (ok) - ok = fp_db().sq_set_exec(sql); - if (ok) - ok = fp_db().sq_commit(); - if (!ok) - write_errorsql_log(sql); - - stato &= ok; - } + } return stato; } @@ -1242,8 +1270,8 @@ void TEstrazione::set_dates() { if (_escluso) { - set_dataini(_movs[0].datareg()); - set_dataend(_movs[0].datareg()); + set_dataini(((TMovimento_estr &)_movs[0]).datareg()); + set_dataend(((TMovimento_estr &)_movs[0]).datareg()); } } @@ -1406,69 +1434,161 @@ TF9_dberr::TF9_dberr() _fout = new ofstream; _fout->open("f9_dberr.txt"); } +; +TString _user; +/////////////////////////////////////////////////////////////////////////////////////////// +// TAnnesso_mov +/////////////////////////////////////////////////////////////////////////////////////////// +TAnnesso_mov::TAnnesso_mov(TToken_string & row, int start) +{ + _numreg = row.get_long(start); + _filename = row.get(); + _catdocpad = row.get(); + _catdocann = row.get(); + _loaddate = row.get_date(); + _user = row.get(); +} + +TAnnesso_mov & TAnnesso_mov::copy(const TAnnesso_mov & a) +{ + _numreg = a._numreg; + _filename = a._filename; + _catdocpad = a._catdocpad; + _catdocann = a._catdocann; + _loaddate = a._loaddate; + _user = a._user; + return *this; +} + +void TAnnesso_mov::ann2row(TToken_string & row) +{ + row.cut(0); + row.add(_numreg); + row.add(_filename); + row.add(_catdocpad); + row.add(_catdocann); + row.add(_loaddate); + row.add(_user); +} + + +/////////////////////////////////////////////////////////////////////////////////////////// +// TClasse_doc +/////////////////////////////////////////////////////////////////////////////////////////// + +TClasse_doc::TClasse_doc(TToken_string & row, int start) +{ + + _catdoc = row.get(start); + _descr = row.get(); + _class_sost = row.get(); + _caus_sost = row.get(); + _causcont = row.get(); + _tipocaus = row.get(); +} + +TClasse_doc & TClasse_doc::copy(const TClasse_doc & c) +{ + _catdoc = c._catdoc; + _descr = c._descr; + _class_sost = c._class_sost; + _caus_sost = c._caus_sost; + _causcont = c._causcont; + _tipocaus = c._tipocaus; + return *this; +} + +void TClasse_doc::ann2row(TToken_string & row) +{ + row.cut(0); + row.add(_catdoc); + row.add(_descr); + row.add(_class_sost); + row.add(_caus_sost); + row.add(_causcont); + row.add(_tipocaus); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TAnnesso +/////////////////////////////////////////////////////////////////////////////////////////// + +TAnnesso::TAnnesso(TToken_string & row, int start) +{ + _catdocpadre = row.get(start); + _catdoc = row.get(); + _descr = row.get(); + _opcee = row.get(); + _obblig = row.get_bool(); +} + +TAnnesso & TAnnesso::copy(const TAnnesso & a) +{ + _catdocpadre = a._catdocpadre; + _catdoc = a._catdoc; + _descr = a._descr; + _opcee = a._opcee; + _obblig = a._obblig; + return *this; +} + +void TAnnesso::ann2row(TToken_string & row) +{ + row.cut(0); + row.add(_catdocpadre); + row.add(_catdoc); + row.add(_descr); + row.add(_opcee); + row.add(_obblig); +} /////////////////////////////////////////////////////////////////////////////////////////// // TCategorie_doc /////////////////////////////////////////////////////////////////////////////////////////// -TCategorie_doc::classe_doc * TCategorie_doc::find_causcont(const TString& caus) const +TClasse_doc * TCategorie_doc::find_causcont(const TString& caus) { - for (auto it = _rows.begin(); it != _rows.end(); ++it) + FOR_EACH_ASSOC_OBJECT(_rows, hash, key, obj) { - if ((*it)->causcont == caus) - return *it; + TClasse_doc * classe = (TClasse_doc *)obj; + + if (classe->causcont() == caus) + return classe; } return nullptr; } -TCategorie_doc::classe_doc * TCategorie_doc::find_tipodoc(const TString& tipodoc) const +TClasse_doc * TCategorie_doc::find_tipodoc(const TString& tipodoc) { - for (auto it = _rows.begin(); it != _rows.end(); ++it) - { - const classe_doc* classe = *it; // qui - if (classe->causcont.blank() && classe->tipocaus == tipodoc) - return *it; - } - return nullptr; + FOR_EACH_ASSOC_OBJECT(_rows, hash, key, obj) + { + TClasse_doc * classe = (TClasse_doc *)obj; + + if (classe->causcont().blank() && classe->tipocaus() == tipodoc) + return classe; + } + return nullptr; } -TCategorie_doc::classe_doc * TCategorie_doc::find_tipodocsdi(const TString& tipodocsdi, const char * tipocaus) const +TClasse_doc * TCategorie_doc::find_tipodocsdi(const TString& tipodocsdi, const char * tipocaus) { - for (auto it = _rows.begin(); it != _rows.end(); ++it) - { - if (((*it)->caus_sost == tipodocsdi) && ((*it)->tipocaus == tipocaus)) - return *it; - } - return nullptr; -} + FOR_EACH_ASSOC_OBJECT(_rows, hash, key, obj) + { + TClasse_doc * classe = (TClasse_doc *)obj; -std::vector>>::iterator TCategorie_doc::find_sheet_annessi(const TString& catdoc) -{ - for(auto it = _sheets_annessi.begin(); it != _sheets_annessi.end(); ++it) - { - if (it->first == catdoc) - return it; - } - return _sheets_annessi.end(); -} - -TCategorie_doc::classe_doc* TCategorie_doc::get_classe_doc(const TString& catdoc) -{ - for(auto it = _rows.begin(); it != _rows.end(); ++it) - { - if ((*it)->catdoc == catdoc) - return *it; + if ((classe->caus_sost() == tipodocsdi) && (classe->tipocaus() == tipocaus)) + return classe; } return nullptr; } void TCategorie_doc::load_all() { - _rows.clear(); - _rows_annessi.clear(); + _rows.destroy(); + _rows_annessi.destroy(); int idx = 0; while (true) { @@ -1478,22 +1598,25 @@ void TCategorie_doc::load_all() break; TToken_string row(appo); - classe_doc * cd = new classe_doc{ row.get(1), row.get(), row.get(), row.get(), row.get(), row.get() }; - - _rows.emplace_back(cd); + const TString catdoc(row.get(1)); + TClasse_doc cd(row, 1); + _rows.add(catdoc, cd); } idx = 0; while (true) { const TString& appo = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "", idx++); + if (appo == "STOP" || appo.blank()) /* STOP: Riga terminatrice */ break; + TToken_string row(appo); - annesso ann{ row.get(0), row.get(), row.get(), row.get(), row.get_bool() }; - TToken_string key = row.get(0); - key.add(row.get(1)); - _rows_annessi.insert({ key, ann }); //da sistemare + TAnnesso ann(row); + TToken_string key = row.get(0); + + key.add(row.get(1)); + _rows_annessi.add(key, ann); } } @@ -1502,22 +1625,24 @@ void TCategorie_doc::save_ann() remove_all_ann(); int idx = 0; - for (auto it = _rows_annessi.begin(); it != _rows_annessi.end(); ++it) + + FOR_EACH_ASSOC_OBJECT(_rows_annessi, hash, key, obj) { TToken_string row; - if(!it->second.catdocpadre.blank()) - row.add(it->second.catdocpadre, 0); - if (!it->second.catdoc.blank()) - row.add(it->second.catdoc, 1); - if (!it->second.descr.blank()) - row.add(it->second.descr, 2); - if (!it->second.opcee.blank()) - row.add(it->second.opcee, 3); - row.add(it->second.obblig ? "X" : "", 4); + TAnnesso & ann = (TAnnesso &) *obj; + + if(ann.catdocpadre().full()) + row.add(ann.catdocpadre(), 0); + if (ann.catdoc().full()) + row.add(ann.catdoc(), 1); + if (ann.descr().full()) + row.add(ann.descr(), 2); + if (ann.opcee().full()) + row.add(ann.opcee(), 3); + row.add(ann.obblig(), 4); ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, row, idx++); } ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "STOP", idx); // Riga terminatrice - reload(); } @@ -1526,22 +1651,24 @@ void TCategorie_doc::save_cat() remove_all_cat(); int idx = 0; - for (auto it = _rows.begin(); it != _rows.end(); ++it) - { - classe_doc& cd = **it; + + FOR_EACH_ASSOC_OBJECT(_rows, hash, key, obj) + { + TClasse_doc& cd = (TClasse_doc &) *obj; TToken_string row; - if (!cd.catdoc.blank()) - row.add(cd.catdoc, 1); - if (!cd.descr.blank()) - row.add(cd.descr, 2); - if (!cd.class_sost.blank()) - row.add(cd.class_sost, 3); - if (!cd.caus_sost.blank()) - row.add(cd.caus_sost, 4); - if (!cd.causcont.blank()) - row.add(cd.causcont, 5); - if (!cd.tipocaus.blank()) - row.add(cd.tipocaus, 6); + + if (cd.catdoc().full()) + row.add(cd.catdoc(), 1); + if (cd.descr().full()) + row.add(cd.descr(), 2); + if (cd.class_sost().full()) + row.add(cd.class_sost(), 3); + if (cd.caus_sost().full()) + row.add(cd.caus_sost(), 4); + if (cd.causcont().full()) + row.add(cd.causcont(), 5); + if (cd.tipocaus().full()) + row.add(cd.tipocaus(), 6); ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_CATDOC, row, idx++); } ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_CATDOC, "STOP", idx); // Riga terminatrice @@ -1586,14 +1713,12 @@ const char* TCategorie_doc::traduci_class_sost(const TString& class_sost) return ""; } -std::map::iterator TCategorie_doc::find_annesso(const TString& catdoc_padre, const char* catdoc_ann) +TAnnesso * TCategorie_doc::find_annesso(const TString& catdoc_padre, const char* catdoc_ann) { TToken_string key = catdoc_padre; + key.add(catdoc_ann); - auto it = _rows_annessi.find(key); - if (it != _rows_annessi.end()) - return it; - return _rows_annessi.end(); + return (TAnnesso *)_rows_annessi.objptr(key); } void TCategorie_doc::add_annesso(const TString& catdoc_padre, const TString& catdoc_ann, const TString& descr, @@ -1601,11 +1726,11 @@ void TCategorie_doc::add_annesso(const TString& catdoc_padre, const TString& cat { if(!(catdoc_padre && *catdoc_padre && catdoc_ann && *catdoc_ann && class_ann && *class_ann)) fatal_box("add_annesso failed: some parameters are NULL or keys are empty"); - annesso ann{ catdoc_padre, catdoc_ann, descr, class_ann, obblig }; - TToken_string key = catdoc_padre; - key.add(catdoc_ann); - _rows_annessi.insert({ key, ann }); + TToken_string key = catdoc_padre; + + key.add(catdoc_ann); + _rows_annessi.add(key, new TAnnesso(catdoc_padre, catdoc_ann, descr, class_ann, obblig)); save_ann(); } @@ -1614,13 +1739,13 @@ void TCategorie_doc::edit_annesso(const TString& catdoc_padre, const TString& ca { if (!(catdoc_padre && *catdoc_padre && catdoc_ann && *catdoc_ann && class_ann && *class_ann)) fatal_box("add_annesso failed: some parameters are NULL or keys are empty"); - annesso ann{ catdoc_padre, catdoc_ann, descr, class_ann, obblig }; - if (find_annesso(catdoc_padre,catdoc_ann) != _rows_annessi.end()) + if (find_annesso(catdoc_padre,catdoc_ann) != nullptr) del_annesso(catdoc_padre,catdoc_ann); - TToken_string key = catdoc_padre; - key.add(catdoc_ann); - _rows_annessi.insert({ key, ann }); + TToken_string key = catdoc_padre; + + key.add(catdoc_ann); + _rows_annessi.add( key, new TAnnesso(catdoc_padre, catdoc_ann, descr, class_ann, obblig)); save_ann(); } @@ -1629,47 +1754,45 @@ void TCategorie_doc::add_categoria(const TString& catdoc, const TString& descr, { if(!(catdoc && *catdoc && class_sost && *class_sost && caus_sost && *caus_sost)) fatal_box("add_categoria failed: some parameters are NULL or keys are empty"); - - classe_doc * cd = new classe_doc{ catdoc, descr, class_sost, caus_sost, causcont, tipocaus }; - - _rows.emplace_back(cd); + _rows.add(catdoc, TClasse_doc(catdoc, descr, class_sost, caus_sost, causcont, tipocaus)); save_cat(); } void TCategorie_doc::del_annesso(const TString& catdoc, const char* catdoc_ann) { - const auto ann = find_annesso(catdoc, catdoc_ann); - if(ann != _rows_annessi.end()) + if (find_annesso(catdoc, catdoc_ann) != nullptr) { - _rows_annessi.erase(ann); + TToken_string key = catdoc; + + key.add(catdoc_ann); + _rows_annessi.remove(key); save_ann(); } } -bool TCategorie_doc::get_ann(const TString & catdoc ,const TString& catann, _Out_ annesso& _Annesso_out) +TAnnesso * TCategorie_doc::get_ann(const TString & catdoc ,const TString& catann) { TToken_string key = catdoc; + key.add(catann); - const map::iterator it = _rows_annessi.find(key); - if (it != _rows_annessi.end() ) - { - if (it->first == catdoc) - { - _Annesso_out = it->second; - return true; - } - } - return false; + + TAnnesso * ann = (TAnnesso *) _rows_annessi.objptr(key); + + return ann; } TString_array TCategorie_doc::get_array_ann(const TString& catdoc) { TString_array sa(0); - for(auto it = _rows_annessi.begin(); it != _rows_annessi.end(); ++it) + + FOR_EACH_ASSOC_OBJECT(_rows_annessi, hash, key, obj) { - if (it->second.catdocpadre == catdoc) + TAnnesso & ann = (TAnnesso &) *obj; + + if (ann.catdocpadre() == catdoc) { - TToken_string row(it->second.catdoc); + TToken_string row(ann.catdoc()); + sa.add(row); } } @@ -1678,86 +1801,84 @@ TString_array TCategorie_doc::get_array_ann(const TString& catdoc) TString_array TCategorie_doc::get_array_rows(const bool traduci) { - TString_array sa(_rows.size()); - for(auto it = _rows.begin(); it != _rows.end(); ++it) + TString_array sa(_rows.items()); + + FOR_EACH_ASSOC_OBJECT(_rows, hash, key, obj) { - classe_doc *row = *it; // qui + TClasse_doc & row = (TClasse_doc &)*obj; TToken_string ts; - ts.add(row->catdoc); - ts.add(row->descr); - ts.add(!traduci ? row->class_sost : traduci_class_sost(row->class_sost)); - ts.add(!traduci ? row->caus_sost : traduci_caus_sost(row->caus_sost)); - ts.add(row->causcont); - ts.add(row->tipocaus); - + ts.add(row.catdoc()); + ts.add(row.descr()); + ts.add(!traduci ? row.class_sost() : traduci_class_sost(row.class_sost())); + ts.add(!traduci ? row.caus_sost() : traduci_caus_sost(row.caus_sost())); + ts.add(row.causcont()); + ts.add(row.tipocaus()); sa.add(ts); } return sa; } -std::shared_ptr TCategorie_doc::get_sheet_catdocs() +TArray_sheet * TCategorie_doc::get_sheet_catdocs() { if (_sheet_catdocs == nullptr) { - _sheet_catdocs = make_shared(-1, -1, 125, 20, "Categorie Documentali", + _sheet_catdocs = new TArray_sheet(-1, -1, 125, 20, "Categorie Documentali", "Categoria\nDocumento(Codice)@15|Descrizione\nDocumento@26|" "Classe Documentale\nSostitutiva@13|Causale per\nSostitutiva (TD01...)@13|" "Causale\nContabile@8|Tipo\nDocumento@8", MODE_SHEETS); - if (!_name_catdocs) - _name_catdocs = make_shared>(); - else - _name_catdocs->clear(); + safe_delete(_name_catdocs); + _name_catdocs = new TString_array; //_sheet_catdocs->add_button(DLG_CANCEL, "Annulla", K_ESC, TOOL_CANCEL, TOOL_CANCEL); const TString_array ar = get_array_rows(); FOR_EACH_ARRAY_ITEM(ar, nr, row) { _sheet_catdocs->add(*(TToken_string*)row); - _name_catdocs->insert(((TToken_string*)row)->get(0)); + _name_catdocs->add(((TToken_string*)row)->get(0)); } } return _sheet_catdocs; } -std::shared_ptr TCategorie_doc::get_sheet_ann(const TString& catdoc) +TArray_sheet * TCategorie_doc::get_sheet_ann(const TString& catdoc) { - auto it = find_sheet_annessi(catdoc); - if (it != _sheets_annessi.end()) - _sheets_annessi.erase(it); + TArray_sheet * sheet = find_sheet_annessi(catdoc); - it = find_sheet_annessi(catdoc); - if (it == _sheets_annessi.end()) + if (sheet != nullptr) + _sheets_annessi.remove(catdoc); + sheet = find_sheet_annessi(catdoc); + if (find_sheet_annessi(catdoc) == nullptr) { TString title; title << "Annessi della Categoria " << catdoc; - shared_ptr sheet = make_shared(-1, -1, 78, 13, title, - "Categoria\nAnnesso(Codice)@15|Descrizione\nDocumento@26|" - "Classificazione\nAnnesso@14|Obbligatorio@8", - _mode_sheet); - const auto inserted = _sheets_annessi.insert(_sheets_annessi.end(), { catdoc, sheet }); + + sheet = new TArray_sheet(-1, -1, 78, 13, title, "Categoria\nAnnesso(Codice)@15|Descrizione\nDocumento@26|" + "Classificazione\nAnnesso@14|Obbligatorio@8", _mode_sheet); + + const auto inserted = _sheets_annessi.add(catdoc, sheet); const TString_array & aann = get_array_ann(catdoc); FOR_EACH_ARRAY_ITEM(aann, nr, r) { - TToken_string& row = *(TToken_string*)r; - std::map::iterator it_ann = find_annesso(catdoc, row.get(0)); - if(it_ann != _rows_annessi.end()) + TToken_string & row = *(TToken_string*)r; + TAnnesso * ann = find_annesso(catdoc, row.get(0)); + + if(ann != nullptr) { - const annesso& ann = it_ann->second; TToken_string t; - t.add(ann.catdoc); - t.add(ann.descr); - t.add(ann.opcee); - t.add(ann.obblig ? "X" : ""); + + t.add(ann->catdoc()); + t.add(ann->descr()); + t.add(ann->opcee()); + t.add(ann->obblig()); sheet->add(t); } } - it = inserted; // Per restituirlo anche vuoto. } - return it->second; + return sheet; } -TCategorie_doc::classe_doc * TCategorie_doc::mov2cat(const long numreg) +TClasse_doc * TCategorie_doc::mov2cat(const long numreg) { // Leggo la causale e cerco la corrispondente nelle categorie documentali, se c'e'. // Guardo le colonne causale cont., tipodoc, class. cat. (opcee) @@ -1767,7 +1888,7 @@ TCategorie_doc::classe_doc * TCategorie_doc::mov2cat(const long numreg) const TString& tipodoc = c.tipo_doc(); // Cerco se ho un record che abbia specificata quella caus. contabile - classe_doc * cat = find_causcont(caus); + TClasse_doc * cat = find_causcont(caus); if (cat != nullptr) return cat; // Altrimenti cerco per tipo documento @@ -1864,20 +1985,23 @@ bool TRecord_categorie::read(bool traduci) const TString catdoc = _annessi.record.get(0); const TString name = _annessi.record.get(1); const TString_array sa = get_array_ann(catdoc); + FOR_EACH_ARRAY_ITEM(sa, nr, str) { TString n = (*(TToken_string*)str).get(0); + if (name.blank() || n == name) // Se name vuoto perche' sto cercando solo per catdoc { - auto it = find_annesso(catdoc, n); - if (it != _rows_annessi.end()) + TAnnesso * ann = find_annesso(catdoc, n); + + if (ann != nullptr) { TToken_string t; - t.add(it->second.catdocpadre); - t.add(it->second.catdoc); - t.add(it->second.descr); - t.add(it->second.opcee); - t.add(it->second.obblig); + t.add(ann->catdocpadre()); + t.add(ann->catdoc()); + t.add(ann->descr()); + t.add(ann->opcee()); + t.add(ann->obblig()); _result_set.add(t); } } diff --git a/src/f9/f9lib02.cpp b/src/f9/f9lib02.cpp index 8357f6b0d..717588227 100644 --- a/src/f9/f9lib02.cpp +++ b/src/f9/f9lib02.cpp @@ -74,18 +74,19 @@ TF9_config::TF9_config() // TF9_doccart /////////////////////////////////////////////////////////////////////////////// -bool TF9_doccart::add_cart(const TFilename& file, const TString& numreg, const bool is_annesso, +bool TF9_doccart::add_cart(const TFilename& file, long numreg, const bool is_annesso, const TString& catannpadre, const TString& catdocann, bool suppress_errors) { - TString numreg_old; - bool annesso; + long numreg_old; + bool annesso_found; TF9_doccart f9cart; TLocalisamfile f9docs(LF_F9DOCS); TLocalisamfile f9annessi(LF_F9ANNESSI); - if (f9cart.doc_already_exists(file, numreg_old, annesso)) + + if (f9cart.doc_already_exists(file, numreg_old, annesso_found)) { if(!suppress_errors) - warning_box("Attenzione: esiste gia' un %s con questo nome associato al num. di registrazione %s", annesso ? "annesso" : "documento", (const char*)numreg_old); + warning_box("Attenzione: esiste gia' un %s con questo nome associato al num. di registrazione %d", annesso_found ? "annesso" : "documento", numreg_old); return false; } @@ -111,12 +112,15 @@ bool TF9_doccart::add_cart(const TFilename& file, const TString& numreg, const b // Controllo che non sto gia' utilizzando questa categoria di annesso per questa registrazione // Prendo la lista degli annessi per questa registrazione e li controllo in cerca della categoria TF9_doccart doccart; - vector list_annessi; + TArray list_annessi; + doccart.mov2listann_vect(numreg, list_annessi); bool exist = false; - for (auto it = list_annessi.begin(); it != list_annessi.end(); ++it) + FOR_EACH_ARRAY_ITEM(list_annessi, row, obj) { - if (it->catdocann == catdocann) + TAnnesso_mov * ann_mov = (TAnnesso_mov *) obj; + + if (ann_mov->catdocann() == catdocann) exist = true; } if (exist) @@ -162,40 +166,39 @@ bool TF9_doccart::add_cart(const TFilename& file, const TString& numreg, const b return true; } -bool TF9_doccart::doc_already_exists(const TFilename& file, TString& numreg, bool& annesso) +bool TF9_doccart::doc_already_exists(const TFilename& file, long& numreg, bool& annesso) { - numreg = ""; annesso = false; - _tdocs.zero(); - _tdocs.setkey(2); - _tdocs.put(F9C_FILENAME, file.name()); - bool ok = _tdocs.read() == NOERR; + + const TRectype & tdocs = cache().get(LF_F9DOCS, file.name(), 2); + bool ok = tdocs.full(); + if (ok) - numreg = _tdocs.get(F9C_NUMREG); + numreg = tdocs.get_long(F9C_NUMREG); else { + numreg = 0L; _tannessi.zero(); _tannessi.setkey(2); _tannessi.put(F9A_FILENAME, file.name()); ok = _tannessi.read() == NOERR; if (ok) { - numreg = _tannessi.get(F9A_NUMREG); + numreg = _tannessi.get_long(F9A_NUMREG); annesso = true; } } return ok; } -bool TF9_doccart::mov2doc(const TString& numreg, _Out_ TFilename& doc) +bool TF9_doccart::mov2doc(long numreg, TFilename& doc) { - _tdocs.zero(); - _tdocs.setkey(1); // Ricerca per NUMREG - _tdocs.put(F9C_NUMREG, numreg); - const bool ok = _tdocs.read() == NOERR; + const TRectype & tdocs = cache().get(LF_F9DOCS, numreg); + const bool ok = tdocs.full(); + doc.cut(0); if (ok) - doc << TFilename(F9CONF.get_addr_cart()).slash_terminate() << _tdocs.get(F9C_FILENAME); + doc << TFilename(F9CONF.get_addr_cart()).slash_terminate() << tdocs.get(F9C_FILENAME); return ok; } @@ -228,54 +231,46 @@ bool TF9_doccart::mov2listann(const TString& numreg, _Out_ TString_array& list_a return ok; } -bool TF9_doccart::mov2listann_vect(const TString& numreg, _Out_ vector& list_annessi) +bool TF9_doccart::mov2listann_vect(const long numreg, TArray & list_annessi) { - list_annessi.clear(); + list_annessi.destroy(); _tannessi.zero(); _tannessi.setkey(1); _tannessi.put(F9A_NUMREG, numreg); - TString numreg_fetched; bool ok = false; + // Si posiziona nl primo record giusto. Poi per sapere quando terminare guardo se la chiave e' ancora quella giusta. - for (bool r = _tannessi.read(_isgteq) == NOERR; (numreg_fetched = _tannessi.get(F9A_NUMREG)) == numreg && r; r = _tannessi.next() == NOERR) + for (int err = _tannessi.read(_isgteq) == NOERR; err == NOERR; err = _tannessi.next()) { - ok = true; - TString filename = _tannessi.get(F9A_FILENAME); - annesso_t t; - t.numreg = numreg_fetched; - t.filename = _tannessi.get(F9A_FILENAME); - t.catdocpad = _tannessi.get(F9A_CATDOCPAD); - t.catdocann = _tannessi.get(F9A_CATDOCANN); - t.loaddate = _tannessi.get(F9A_LOADDATE); - t.user = _tannessi.get(F9A_USER); - list_annessi.emplace_back(t); -#ifdef DBG - CHECK(numreg_fetched == numreg_fetched, "*Maledetooo*"); -#endif + long numreg_fetched = _tannessi.get_long(F9A_NUMREG); + if (numreg_fetched == numreg) + { + ok = true; + TString filename = _tannessi.get(F9A_FILENAME); + TAnnesso_mov t(numreg_fetched, _tannessi.get(F9A_FILENAME), _tannessi.get(F9A_CATDOCPAD), + _tannessi.get(F9A_CATDOCANN), _tannessi.get_date(F9A_LOADDATE), _tannessi.get(F9A_USER)); + + list_annessi.add(t); + } + else + break; } + return ok; } - - - /////////////////////////////////////////////////////////////////////////////// // TIva_insert_prepared_stat /////////////////////////////////////////////////////////////////////////////// -void TIva_insert_prepared_stat::add_value(const char* field, const TString& value) -{ - _fields.insert(_fields.end(), { field, value }); -} - void TIva_insert_prepared_stat::write() { TString vals_appo; _query.cut(0) << "INSERT INTO " F9_IVA " (\n"; int count = 0; bool first = true; - for(auto it = _fields.begin(); it != _fields.end(); ++it) + FOR_EACH_ASSOC_OBJECT(_fields, hash, key, obj) { if (!first) { @@ -287,8 +282,8 @@ void TIva_insert_prepared_stat::write() _query << "\n"; vals_appo << "\n"; } - _query << it->first; - vals_appo << it->second; + _query << key; + vals_appo << *(TString *) obj; first = false; count = ++count % 3; } @@ -333,11 +328,6 @@ void TIva_insert_prepared_stat::add(const char* field, long l) add_value(field, v); } -void TIva_insert_prepared_stat::add_getdate(const char* field) -{ - _fields.insert(_fields.end(), { field, "GETDATE()" }); -} - bool TIva_insert_prepared_stat::get(TString& query) { if (_query.empty()) @@ -348,7 +338,7 @@ bool TIva_insert_prepared_stat::get(TString& query) void TIva_insert_prepared_stat::reset() { - _fields.clear(); + _fields.destroy(); _ok = true; _query.cut(0); }