From 2a32c54e5d52bb66df86b6bc5a90e03e8a1cedfb Mon Sep 17 00:00:00 2001 From: bonazzi Date: Tue, 31 Jan 2017 08:22:52 +0000 Subject: [PATCH] Patch level : 12.0 336 Files correlati : sc2.exe pec.frm sc2200a.msk sc2300a.msk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MODIFICA CRPA Possibilità di stampare il pagamento del cliente nella testata dell'estratti conto. Aggiunto filtro per ulteriore classificazione nello scadenziario. Possibilità di stampare le note delle scadenze nella stampa scaduto. Possibiltà di stampare il flag di rata bloccata e il dati di analitica e di filtrare per dati analitica nei solleciti. git-svn-id: svn://10.65.10.50/branches/R_10_00@23573 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- src/sc/pec.frm | 8 +- src/sc/sc2100.cpp | 36 +- src/sc/sc21pec.h | 4 + src/sc/sc2200.cpp | 24 +- src/sc/sc2200.h | 1 + src/sc/sc2200a.uml | 16 +- src/sc/sc2300.cpp | 34 +- src/sc/sc2300.h | 1 + src/sc/sc2300a.uml | 8 +- src/sc/sc2400.cpp | 63 +- src/sc/sc2401.cpp | 49 +- src/sc/sc2401.h | 12 +- src/sc/sc2402.cpp | 175 ++++++ src/sc/sc2402.h | 8 + src/sc/scselect.cpp | 1372 ++++++++++++++++++++++--------------------- 15 files changed, 1110 insertions(+), 701 deletions(-) diff --git a/src/sc/pec.frm b/src/sc/pec.frm index 7a0e884f9..314a4eda9 100755 --- a/src/sc/pec.frm +++ b/src/sc/pec.frm @@ -26,7 +26,7 @@ SECTION GRAPHICS ODD 0 END END -SECTION HEADER ODD 12 +SECTION HEADER ODD 14 STRINGA 1 BEGIN @@ -179,6 +179,12 @@ SECTION HEADER ODD 12 KEY "Dati Agente" PROMPT 2 8 "@bAgente " END + + STRINGA 106 50 + BEGIN + KEY "Dati Pagamento" + PROMPT 2 10 "@bPagamento " + END END SECTION HEADER LAST 1 diff --git a/src/sc/sc2100.cpp b/src/sc/sc2100.cpp index 593ceddad..856040514 100755 --- a/src/sc/sc2100.cpp +++ b/src/sc/sc2100.cpp @@ -133,6 +133,8 @@ public: bool exporting() const { return _recordset != NULL; } void export_total(); + void set_pagam(const TString& codpag); + TEC_recordset& recordset() const { CHECK(exporting(), "Not exporting"); return *_recordset; } TEC_form(const TEC_mask& m, bool gesval, bool excel); @@ -1364,6 +1366,29 @@ void TEC_form::init_header(const TMask& m) fink.update(); // Setta il backgroud di stampa } +void TEC_form::set_pagam(const TString& codpag) +{ + const bool good = codpag.full(); + + TPrint_section& head = section('H'); + TForm_item& pagam = head.find_field(PEC_PAGAM); + + if (pagam.shown()|| pagam.enabled()) + { + TString pag; + pag << codpag << ' ' << cache().get("%CPG", codpag, "S0"); + + if (printing()) + pagam.set(pag); + else + { + _recordset->new_rec(); + _recordset->set("Descrizione", pag); + _recordset->new_rec(); + } + } +} + void TEC_form::set_agente(const TString& codag) { const bool good = codag.full(); @@ -1827,10 +1852,12 @@ bool TStampaEC_application::print_agents() for (cur = 0L; cur.pos() < items; ++cur) { const TString& codag = cur.curr().get(AGE_CODAGE); - TEC_Game_list* games = (TEC_Game_list*)agents.objptr(codag); - if (games != NULL) + TEC_Game_list* games = (TEC_Game_list*)agents.objptr(codag); + + if (games != NULL) { form().set_agente(codag); + form().set_pagam(fc.curr().get(CLI_CODPAG)); const long items = c.items(); for (long i = 0; i < items; i++) { @@ -1995,6 +2022,11 @@ int TStampaEC_application::print_ec(TEC_Game_list* games) if (!ok) // Cliente analfabeta return -1; } + TToken_string key(clf.get(CLI_TIPOCF)); + + key.add(clf.get(CLI_CODCF)); + form().set_agente(cache().get(LF_CFVEN, key, CFV_CODAG)); + form().set_pagam(clf.get(CLI_CODPAG)); f.azzera_totali(); // Azzera totali di fine pagina diff --git a/src/sc/sc21pec.h b/src/sc/sc21pec.h index 9a2f1a2e5..c63435714 100755 --- a/src/sc/sc21pec.h +++ b/src/sc/sc21pec.h @@ -7,6 +7,7 @@ #define PEC_MEMO 103 #define PEC_NUMPROG 104 #define PEC_AGENTE 105 +#define PEC_PAGAM 106 #define PEC_CODCAUS 201 #define PEC_DESCR 202 @@ -45,6 +46,9 @@ #define PEC_TIMPEURO 404 #define PEC_TUNASSIGNED 405 +#define PEC_ANAL0 450 +#define PEC_DESANAL0 475 + #define PEC_PICTURE 500 #define RIGA_PAGAMENTO 10001 diff --git a/src/sc/sc2200.cpp b/src/sc/sc2200.cpp index 1ef0d4ca4..125a2aad7 100755 --- a/src/sc/sc2200.cpp +++ b/src/sc/sc2200.cpp @@ -1,4 +1,5 @@ #include +#include #include "../cg/cgsaldac.h" #include "sc2.h" @@ -72,6 +73,7 @@ class TStampaScadenzario : public TPrintapp int _striepilogo; // 0 = non stampa 1 = stampa il riepilogo giornaliero per pagamento 2 = stampa il riepilogo mensile per pagamento TString8 _codag; // codice agente selezionato int _tipopag; // tipo pagamento selezionato + TString4 _ultclass; // ulteriore classificazione pagamento selezionata TRecnotype _last_bank_rec; // ultimo record con banca stampato real _w_imp_pag, _w_imp_res; // Qui dentro memorizza i valori calcolati in calcola_pagamenti, // rispettivamente l'importo pagato e l'importo residuo, relativo alla rata. @@ -246,20 +248,27 @@ bool TStampaScadenzario::filter_func(const TRelation *r) } } } - if (app()._codag.full()) + + const TRectype& rec = r->curr(); + + if (app()._codag.full()) { - const TRectype& rec = r->curr(); const TString& codag = rec.get(SCAD_CODAG); if (app()._codag != codag) return false; } if (app()._tipopag != 0) { - const TRectype& rec = r->curr(); - const int tipopag = rec.get_int(SCAD_TIPOPAG); + const int tipopag = rec.get_int(SCAD_TIPOPAG); if (app()._tipopag != tipopag) return false; } + if (app()._ultclass.full()) + { + const TString4 ultclass = rec.get(SCAD_ULTCLASS); + if (app()._ultclass != ultclass) + return false; + } return true; } @@ -973,6 +982,7 @@ bool TStampaScadenzario::set_print(int) _group_ban = _m->get_bool(F_SORTBAN); // Raggruppamento per banca di presentazione _codag = _m->get(F_CODAG); // codice agente selezionato _tipopag = _m->get_int(F_TIPOPAG); // tipo pagamento selezionato + _ultclass = _m->get(F_ULTCLASS); // ulteriore classificazione pagamento selezionata _notot = _m->get_bool(F_NOTOT); // non stampare i totali intermedi _cur_data = botime; _tm.destroy(); _tp.destroy(); // Totali per i prospetti @@ -1225,8 +1235,10 @@ void TStampaScadenzario::print_header() { TList_field& fld_tipopag = (TList_field&) _m->field(F_TIPOPAG); TToken_string pagam(fld_tipopag.get_values()); - set_header (soh++,FR("@bTipo pagamento: %d %s@r"),_tipopag, (const char*)pagam.get(_tipopag)); + set_header (soh++,FR("@bTipo pagamento: %d %s@r"), _tipopag, (const char*)pagam.get(_tipopag)); } + if (_ultclass.full()) + set_header (soh++,FR("@bUlt.classific.: %s %s@r"), (const char*)_ultclass, (const char*)cache().get("%CLR" , format("%d%s", _tipopag, (const char *)_ultclass), "S0")); set_header(soh++, (const char *) rw); set_header(soh++,FR("@28gRif.@38gData@47gData@56gDescrizione@77gCod.@91g%s"),(const char*)s1); @@ -1253,6 +1265,8 @@ void TStampaScadenzario::print_header() TToken_string pagam(fld_tipopag.get_values()); set_header (soh++,FR("@bTipo pagamento: %d %s@r"),_tipopag, (const char*)pagam.get(_tipopag)); } + if (_ultclass.full()) + set_header (soh++,FR("@bUlt.classific.: %d %s@r"),_tipopag, (const char*)cache().get("%CLR" , format("%d%s", _tipopag, (const char *)_ultclass), "S0")); rw.fill('_'); set_header(soh++, (const char *) rw); diff --git a/src/sc/sc2200.h b/src/sc/sc2200.h index f2e680bbe..97f4d9976 100755 --- a/src/sc/sc2200.h +++ b/src/sc/sc2200.h @@ -23,3 +23,4 @@ #define F_SELDATAFAT 121 #define F_DATAFATTI 122 #define F_DATAFATTF 123 +#define F_ULTCLASS 124 diff --git a/src/sc/sc2200a.uml b/src/sc/sc2200a.uml index 19a305537..ea73b9c98 100755 --- a/src/sc/sc2200a.uml +++ b/src/sc/sc2200a.uml @@ -354,8 +354,20 @@ BEGIN ITEM "9|Bonifico" END - - +STRING F_ULTCLASS 1 +BEGIN + PROMPT 2 21 "Ult.classific. " + FLAGS "U" + USE %CLR + INPUT CODTAB[1,1] F_TIPOPAG SELECT + INPUT CODTAB[2,2] F_ULTCLASS + DISPLAY "Tipo pag." CODTAB[1,1] + DISPLAY "Class." CODTAB[2,2] + DISPLAY "Descrizione@50" S0 + OUTPUT F_ULTCLASS CODTAB[2,2] + CHECKTYPE NORMAL + FIELD S5 +END ENDPAGE ENDMASK diff --git a/src/sc/sc2300.cpp b/src/sc/sc2300.cpp index bf08f8fe6..71e1e0474 100755 --- a/src/sc/sc2300.cpp +++ b/src/sc/sc2300.cpp @@ -97,10 +97,12 @@ class TStampaScaduto : public TPrintapp bool _end_printed, _stvaluta, _pending_clifo, + _print_note, _ordcod; // VERO=ordine per codice, FALSO=ordine per ragione sociale TString _anno,_numdoc,_protiva,_datadoc,_codval,_residuo, _nonscad,_buonfin,_sc_1,_sc_2,_sc_3,_sc_4,_sc_5, _sc_6, _sc_7, _cod, _cod_pre, _des; + TParagraph_string _note; TDate _limop, _limscad, _datas, _limbf; // Data limite operazione, data limite scaduto e data di stampa int _gcr; // Giorni per Calcolo Rischio (valido solo per stampa clienti) real _unsnc,_uns; // Unassigned per partita. @@ -503,6 +505,24 @@ bool TStampaScaduto::preprocess_page(int file, int counter) _datadoc = (const char*) rp.get_date(PART_DATADOC); _codval = (_stvaluta ? rp.get(PART_CODVAL): ""); if (_codval.empty()) _codval = " "; + if (_print_note) + { + _note.cut(0); + for (int n = 1; n <= rp.rate(); n++) // Browse all rows (scadenze) + { + const TRiga_scadenze& rs = rp.rata(n); + const TString & row = rs.get(SCAD_DESCR); + + if (row.full()) + { + if (_note.full()) + _note << ' '; + _note << "Scad. " << n << " - " << row; + } + } + _note.replace('\n', ' '); + } + // Now performing fulkrum... compute_all(p, bill); } @@ -614,11 +634,12 @@ bool TStampaScaduto::set_print(int) _end_printed = _pending_clifo = false; _gcr = _m->get_int(F_GIORNI); _stvaluta = _m->get_bool(F_VALUTA); + _print_note = _m->get_bool(F_NOTE); _datas = (const char *)(_m->get(F_DATASTAMPA)); _limop = (const char *)(_m->get(F_DATAOPERAZIONE)); _limscad = (const char *)(_m->get(F_DATASCADUTO)); _limbf = _limscad - (long)_gcr; // Limite inferiore per le scadenze a Buon Fine. - _anno.cut(0);_numdoc.cut(0);_protiva.cut(0);_datadoc.cut(0); + _anno.cut(0);_numdoc.cut(0);_protiva.cut(0);_datadoc.cut(0); _note.cut(0); _codval.cut(0);_residuo.cut(0);_nonscad.cut(0);_buonfin.cut(0); _cod.cut(0); _des.cut(0); _cod_pre.cut(0); _sc_1.cut(0);_sc_2.cut(0);_sc_3.cut(0);_sc_4.cut(0);_sc_5.cut(0);_sc_6.cut(0);_sc_7.cut(0); @@ -866,6 +887,15 @@ void TStampaScaduto::set_page_part(int& nriga) set_row(nriga,"@174g#18t",&_sc_5); set_row(nriga,"@193g#18t",&_sc_6); set_row(nriga,"@212g#18t",&_sc_7); + if (_print_note) + { + const char * s = _note.get(0); + while (s && *s > '\0') + { + set_row(++nriga,"@12g%s", s); + s = _note.get(); + } + } } void TStampaScaduto::set_page(int file, int counter) @@ -873,7 +903,7 @@ void TStampaScaduto::set_page(int file, int counter) print_header(); } -TStampaScaduto::TStampaScaduto() +TStampaScaduto::TStampaScaduto() : _note("", 200) { _rel1=_rel2=NULL; } diff --git a/src/sc/sc2300.h b/src/sc/sc2300.h index 20f6113d3..73fec877a 100755 --- a/src/sc/sc2300.h +++ b/src/sc/sc2300.h @@ -7,4 +7,5 @@ #define F_DATASCADUTO 105 #define F_GIORNI 106 #define F_VALUTA 107 +#define F_NOTE 108 diff --git a/src/sc/sc2300a.uml b/src/sc/sc2300a.uml index 669bffded..3919b6843 100755 --- a/src/sc/sc2300a.uml +++ b/src/sc/sc2300a.uml @@ -22,7 +22,7 @@ BEGIN FLAGS "D" END -GROUPBOX DLG_NULL 68 7 +GROUPBOX DLG_NULL 68 8 BEGIN PROMPT 1 2 "" END @@ -66,6 +66,12 @@ BEGIN HELP "Selezionare se si vuole la stampa in valuta" END +BOOLEAN F_NOTE +BEGIN + PROMPT 2 8 "Stampa NOTE" + HELP "Selezionare se si vuole la stampa delle note delle scadenze" +END + RADIOBUTTON SC_CLIFO 20 BEGIN PROMPT 1 9 "Selezione" diff --git a/src/sc/sc2400.cpp b/src/sc/sc2400.cpp index 0852bbd58..08d6307a4 100755 --- a/src/sc/sc2400.cpp +++ b/src/sc/sc2400.cpp @@ -3,7 +3,11 @@ #include "sc2102.h" #include "sc2400a.h" +#include "../ca/movana.h" +#include "../ca/rmovana.h" +#include "../ca/calib01.h" #include +#include #include #include #include @@ -59,8 +63,9 @@ bool TStampaSol_application::print_selected() // Attiva la stampa del saldo partita form().stampa_saldo(mask().stampa_saldo()); + form().anal_filter(mask().get_anal_filter()); - // filtra il cursore del form in modo che diventi uguale al cursor_sheet corrente + // filtra il cursore del form in modo che diventi uguale al cursor_sheet corrente // Qui sarebbe bello copiarsi l'indice dell'altro cursore TCursor &fc = *form().cursor(); fc.setkey(key); @@ -189,6 +194,9 @@ int TStampaSol_application::print_sol() const TDate data_inizio_soll = _msk->get(F_DATAINISCAD); const TDate data_limite_soll = f.data_limite_operazione(); const TDate data_limite_scaduto = f.data_limite_scaduto(); + TToken_string anal_filter = form().get_anal_filter(); + const bool select_analitica = (dongle().active(CAAUT) || dongle().active(CMAUT)) && anal_filter.full() ; + TDecoder anal(LF_MOVANA, MOVANA_NUMREG, 3); const TDate data_rischio = f.data_inizio_rischio(); TAssoc_array games_in_range; @@ -251,7 +259,52 @@ int TStampaSol_application::print_sol() } } - if (sel_tot_saldo || (saldo > ZERO && saldo >= sel_importo ) || (saldo.is_zero() && !unreferenced.is_zero() && data_rischio < data_limite_scaduto)) + if (select_analitica) + { + bool print = false; + for (int r = game.first(); !print && r <= game.last(); r = game.succ(r)) + { + const TRiga_partite& row = game.riga(r); + const TString& numregcg = row.get(PART_NREG); + const long numreg = atol(anal.decode(numregcg)); + + if (numreg > 0) + { + TAnal_mov anal_mov(numreg); + TRecord_array & rows = anal_mov.body(); + const int nrows = rows.rows(); + TString s; + + for (int i = 1; !print && i <= nrows; i++) + { + const TRectype & row = anal_mov.body().row(i); + TString f = anal_filter.get(0); + f.trim(); + + if (f.full()) + { + s = row.get(RMOVANA_CODCMS); + print |= s.match(f); + } + f = anal_filter.get(); + if (f.full()) + { + s = row.get(RMOVANA_CODCCOSTO); + print |= s.match(f); + } + f = anal_filter.get(); + if (f.full()) + { + s = row.get(RMOVANA_CODFASE); + print |= s.match(f); + } + } + } + } + if (!print) + return 0; + } + if (sel_tot_saldo || (saldo > ZERO && saldo >= sel_importo ) || (saldo.is_zero() && !unreferenced.is_zero() && data_rischio < data_limite_scaduto)) { const bool printed = form().print_game(game); one_printed |= printed; @@ -365,6 +418,7 @@ bool TStampaSol_application::mail_selected() // Attiva la stampa del saldo partita form().stampa_saldo(mask().stampa_saldo()); + form().anal_filter(mask().get_anal_filter()); // filtra il cursore del form in modo che diventi uguale al cursor_sheet corrente // Qui sarebbe bello copiarsi l'indice dell'altro cursore @@ -492,6 +546,11 @@ bool TStampaSol_application::destroy() void TStampaSol_application::on_config_change() { + mask().reset(); + mask().set(F_STAMPSALDO, "X"); + + TApplication::on_firm_change(); + TConfig c(CONFIG_DITTA, "cg"); _lingua_ditta= c.get("CodLin"); _gesval= c.get_bool("GesVal"); diff --git a/src/sc/sc2401.cpp b/src/sc/sc2401.cpp index a538779a0..71cf6aa3d 100755 --- a/src/sc/sc2401.cpp +++ b/src/sc/sc2401.cpp @@ -3,8 +3,11 @@ #include "../cg/cgsaldac.h" #include "sc21pec.h" #include "sc2401.h" +#include "../ca/calib01.h" +#include "../ca/movana.h" #include +#include #include @@ -250,6 +253,17 @@ void TESSL_row::print_on(TPrint_section& body) TForm_item& datacambio = body.find_field(PEC_DATACAM); datacambio.set(_valuta.data().string()); + TForm_item& bloccata = body.find_field(PEC_BLOCCATA); + bloccata.set(_bloccata ? "X" : ""); + + TForm_item& analitica = body.find_field(PEC_ANALITICA); + analitica.set(_codici_analitica); + TParagraph_string p(_codici_analitica, analitica.width()); + const int h = analitica.height(); + int i = 0; + for (i = 0; p.get() != NULL && i < h; i++); + analitica.section().set_height(p.empty() ? 1 : i); + const TString old_prompt(descr.prompt()); descr.set_prompt(""); // Nasconde temporaneamente il prompt per non stampare i @@ -432,6 +446,32 @@ void TESSL_array::add_row(const TRiga_partite& row) const TDate data_op = row.get(PART_DATAREG); if (data_op <= form().data_limite_operazione()) { + TString codanal; + + if (main_app().has_module(CAAUT)) + { + const TString& numregcg = row.get(PART_NREG); + const long numreg = atol(_anal.decode(numregcg)); + + if (numreg > 0) + { + TAnal_mov anal_mov(numreg); + TRecord_array & rows = anal_mov.body(); + const int nrows = rows.rows(); + + for (int i = 1; i <= nrows; i++) + { + const TString80 s = anal_mov.row_code(i); + if (s.full() && codanal.find(s) < 0) + { + if (codanal.full()) + codanal << '\n'; + if (s.full()) + codanal << s; + } + } + } + } if (row.is_fattura()) { for (int r = 1; r <= row.rate(); r++) @@ -450,6 +490,8 @@ void TESSL_array::add_row(const TRiga_partite& row) const real s = calcola_scaduto(rata, in_valuta); rec.scaduto(s); } + rec.rata_bloccata(rata.get_bool(SCAD_BLOCCATA)); + rec.codici_analitica(codanal); } } else @@ -463,6 +505,7 @@ void TESSL_array::add_row(const TRiga_partite& row) i.normalize(sezione); riga.importo_in_euro(i.valore()); } + riga.codici_analitica(codanal); const int tipo_pag = row.get_int(PART_TIPOPAG); const tipo_movimento tipo_mov = row.tipo(); @@ -499,6 +542,7 @@ void TESSL_array::add_row(const TRiga_partite& row) } else r.importo(ritenute); + r.codici_analitica(codanal); } const TImporto abbuoni(row.importo(in_valuta, 0x2)); @@ -512,6 +556,7 @@ void TESSL_array::add_row(const TRiga_partite& row) il.normalize(sezione == 'D' ? 'A' : 'D'); r.importo_in_euro(il.valore()); } + r.codici_analitica(codanal); } TImporto diffcam(row.importo(FALSE, 0x4)); @@ -520,7 +565,7 @@ void TESSL_array::add_row(const TRiga_partite& row) TESSL_row& r = new_row(row, data_pag, TImporto('D', ZERO), RIGA_DIFFCAM); r.descrizione(form().describe(PEC_DIFFCAM)); r.importo(diffcam); - } + r.codici_analitica(codanal); } } } } @@ -566,7 +611,7 @@ void TESSL_array::arrange_scaduto(const TPartita& game) } TESSL_array::TESSL_array(const TPartita& game, const TESSL_form* f) - :_form(f) + :_form(f), _anal(LF_MOVANA, MOVANA_NUMREG, 3) { int r; for (r = game.last(); r > 0; r = game.pred(r)) diff --git a/src/sc/sc2401.h b/src/sc/sc2401.h index 9757f2a7b..be70a5c11 100755 --- a/src/sc/sc2401.h +++ b/src/sc/sc2401.h @@ -82,6 +82,8 @@ class TESSL_row : public TSortable bool _salvo_buon_fine; // Importo esposto salvo buon fine real _totale; // Totale documento TValuta _valuta; // Codice valuta, data cambio e cambio + bool _bloccata; // Rata bloccata + TString _codici_analitica; // codici analitica corrispondenti alle fatture protected: // TSortable virtual int compare(const TSortable& s) const; @@ -100,6 +102,8 @@ public: void esposto(const real& e) { _esposto = e; } void importo_in_euro(const real& imp) { _importo_euro = imp; } void salvo_buon_fine(bool sbf) { _salvo_buon_fine = sbf; } + void rata_bloccata(bool rb) { _bloccata = rb; } + void codici_analitica(const char * s) { _codici_analitica = s; } const TString& causale() const { return _causale; } const TString& descrizione() const { return _descrizione; } @@ -147,6 +151,8 @@ class TESSL_form : public TForm bool _stampa_esp; bool _stampa_saldo; // Stampa il saldo di ogni partita + TToken_string _anal_filter; + word _num_rip; // numero di righe usate per i riporti word _total_rows; // numero di righe usate per i totali @@ -187,7 +193,9 @@ public: const char sezione_normale() const { return _who == 'C' ? 'D' : 'A' ; } void stampa_saldo(bool ss = TRUE) { _stampa_saldo = ss; } - + void anal_filter(const TToken_string & f) { _anal_filter = f; } + const TToken_string &get_anal_filter() const { return _anal_filter; } + void azzera_totali(); void ultima_pagina(); virtual bool print_game(const TPartita& game); @@ -203,6 +211,8 @@ public: class TESSL_array : public TArray { TArray _scaduto; // Array di importi scaduti + TDecoder _anal; + const TESSL_form* _form; diff --git a/src/sc/sc2402.cpp b/src/sc/sc2402.cpp index 1a8534e2b..1cc9a61b9 100755 --- a/src/sc/sc2402.cpp +++ b/src/sc/sc2402.cpp @@ -3,12 +3,102 @@ #include "sc2402.h" #include "../cg/cgsaldac.h" +#include "../ca/calib01.h" #include +#include +#include + TSol_mask::TSol_mask(const char *name) :TESSL_mask(name) { + _cdc_start = 0; + _cdc_end = 0; + _cms_start = 0; + _cms_end = 0; + _fas_start = 0; + _fas_end = 0; + + if (dongle().active(CAAUT) || dongle().active(CMAUT)) + { + create_page("Selezione analitica", 1); + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + const bool use_fsc = fasinfo.levels() > 0; + TConfig& ini = ca_config(); + + int y = 3; + short dlg = PEC_ANAL0; // id del primo campo da generare + short dlgd = PEC_DESANAL0; + + for (int i = 0; i < 2; i++) + { + const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 + if (level == "CDC") // Crea centro di costo + { + _cdc_start = dlg; + _cdc_end = _cdc_start + ca_multilevel_code_info(LF_CDC).levels()-1; + if (use_fsc && fasinfo.parent() == LF_CDC) + { + _fas_start = _cdc_end + 1; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels()- ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + else + insert_anal_fields(*this, 1, LF_CDC, y, dlg, dlgd); + } + else + if (level == "CMS") // Crea commessa + { + _cms_start = dlg; + _cms_end = _cms_start + ca_multilevel_code_info(LF_COMMESSE).levels()-1; + if (use_fsc && fasinfo.parent() == LF_COMMESSE) + { + _fas_start = _cms_end + 1 ; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels()- ca_multilevel_code_info(LF_COMMESSE).levels() - 1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + else + insert_anal_fields(*this, 1, LF_COMMESSE, y, dlg, dlgd); + } + } + if (use_fsc && fasinfo.parent() <= 0) + { + _fas_start = dlg; + _fas_end = _fas_start + ca_multilevel_code_info(LF_FASI).levels()-1; + insert_anal_fields(*this, 1, LF_FASI, y, dlg, dlgd); + } + } +} + +int TSol_mask::insert_anal_fields(TMask& m, int page, int lf, int& y, + short& dlg, short& dlgd) +{ + const int h = ca_create_fields(m, page, lf, 2, y, dlg, dlgd); + + for (int i = 0; i < h; i++) + { + TEdit_field& fld = m.efield(dlg+i); + int logic = lf; + if (logic == LF_FASI) + { + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + if (fasinfo.parent() != 0) + { + const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent()); + if (i < parinfo.levels()) + logic = fasinfo.parent(); + } + } + + TEdit_field& dfld = m.efield(dlgd+i); + dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output! + + } + + y += h+1; + dlg += h; dlgd += h; + return h; } TSol_mask::~TSol_mask() {} @@ -23,6 +113,91 @@ real TSol_mask::get_sel_importo() const return real(get(F_IMPORMIN)); } +const TToken_string & TSol_mask::get_anal_filter() const +{ + TToken_string &f = get_tmp_string(100); + TString s; + TString codfase; + const TMultilevel_code_info & fasi = ca_multilevel_code_info(LF_FASI); + TConfig& cfg = ca_config(); + bool full = false; + bool empty = true; + + if (_cms_start > 0) + { + s.cut(0); + for (short dlg = _cms_start; dlg <= _cms_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (_cdc_start > 0) + { + full = false; + s.cut(0); + for (short dlg = _cdc_start; dlg <= _cdc_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (_fas_start > 0) + { + full = false; + s.cut(0); + for (short dlg = _fas_start; dlg <= _fas_end; dlg++) + { + const int len = field(dlg).size(); + TString val = get(dlg); + + full |= val.full(); + if (val.full()) + val.rpad(len); + else + val.fill('?', len); + s << val; + } + } + if (full) + { + empty = false; + f.add(s); + } + else + f.add(""); + if (empty) + f.cut(0); + return f; +} /////////////////////////////////////////////////////////// // TSol_row /////////////////////////////////////////////////////////// diff --git a/src/sc/sc2402.h b/src/sc/sc2402.h index d370a8956..028da8646 100755 --- a/src/sc/sc2402.h +++ b/src/sc/sc2402.h @@ -7,9 +7,17 @@ class TSol_mask: public TESSL_mask { + short _cdc_start, _cdc_end, + _cms_start, _cms_end, + _fas_start, _fas_end; + +protected: + int insert_anal_fields(TMask& m, int page, int lf, int& y, short& dlg, short& dlgd); + public: bool get_sel_tot_saldo() const ; real get_sel_importo() const ; + const TToken_string &get_anal_filter() const; TSol_mask(const char *name); virtual ~TSol_mask(); diff --git a/src/sc/scselect.cpp b/src/sc/scselect.cpp index a71f92f68..5f951480a 100755 --- a/src/sc/scselect.cpp +++ b/src/sc/scselect.cpp @@ -1,683 +1,689 @@ -#include -#include - -#include "../cg/cglib01.h" -#include "scselect.h" -#include - -static bool sc_filter_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TCursor_sheet& cs = (TCursor_sheet&)f.mask(); - TCursor& c = *cs.cursor(); - - TString expr; // Espressione di filtro complessiva - if (f.get().full()) // Filtro attivato! - { - const short id = f.dlg()-500; - TString e = f.mask().get(id); // Espressione regolare - e.strip("\"'"); // Tolgo caratteri che potrebbero dare problemi - if (e.full()) - { - expr = (c.file().num() == LF_CLIFO) ? CLI_RAGSOC : PCN_DESCR; - expr << "?=\"" << e << '"'; - expr.upper(); - } - if (expr.empty()) - f.reset(); - } - c.freeze(false); - c.setfilter(expr, true); - c.freeze(true); - cs.force_update(); - cs.post_select(0); - } - return true; -} - -static bool sc_ragsoc_handler(TMask_field& f, KEY k) -{ - if (k == K_TAB && f.focusdirty()) - { - TMask_field& chk = f.mask().field(f.dlg()+500); - if (f.get().starts_with("*")) - chk.set("X"); - if (chk.get().full()) - sc_filter_handler(chk, K_SPACE); - } - return true; -} - -TSelection_mask::TSelection_mask(const char* name) - : TMask(name), _who('C'), _key(1), _clifo_rel(NULL), _pdc_rel(NULL), - _cli_cur_k1(NULL), _cli_cur_k2(NULL), _for_cur_k1(NULL), _for_cur_k2(NULL), - _pdc_cur_k1(NULL), _pdc_cur_k2(NULL) -{ - // crea relazioni, cursori e cursor_sheets - _clifo_rel = new TRelation(LF_CLIFO); - - TRectype filter(LF_CLIFO); - filter.put(CLI_TIPOCF, "C"); - _cli_cur_k1 = new TCursor(_clifo_rel, "", 1, &filter, &filter); - _cli_cur_k2 = new TCursor(_clifo_rel, "", 2, &filter, &filter); - - _cli_sh_k1 = new TCursor_sheet(_cli_cur_k1, " |CODCF|RAGSOC|PAIV", TR("Selezione cliente per codice"), - HR("@1|Codice|Ragione Sociale@50|Partita IVA"),0,1); - _cli_sh_k2 = new TCursor_sheet(_cli_cur_k2, " |RAGSOC|CODCF|PAIV", TR("Selezione cliente per ragione sociale"), - "@1|Ragione Sociale@50|Codice|Partita IVA",0,1); - _cli_sh_k2->add_string(SC_CLIFO, 0, PR("Ragione sociale "), 1, 0, 50, "").set_handler(sc_ragsoc_handler); - _cli_sh_k2->add_checkbutton(SC_CLIFO+500, 0, "", 68, 0, 2, 1, "", 10112, 10113).set_handler(sc_filter_handler); - - if (id2pos(SC_CLIFO) >= 0) - { - filter.put(CLI_TIPOCF, "F"); - _for_cur_k1 = new TCursor(_clifo_rel, "", 1, &filter, &filter); - _for_cur_k2 = new TCursor(_clifo_rel, "", 2, &filter, &filter); - _for_sh_k1 = new TCursor_sheet(_for_cur_k1, " |CODCF|RAGSOC|PAIV", TR("Selezione fornitore per codice"), - HR("@1|Codice|Ragione Sociale@50|Partita IVA"),0,1); - _for_sh_k2 = new TCursor_sheet(_for_cur_k2, " |RAGSOC|CODCF|PAIV", TR("Selezione fornitore per ragione sociale"), - "@1|Ragione Sociale@50|Codice|Partita IVA",0,1); - _for_sh_k2->add_string(SC_CLIFO, 0, PR("Ragione sociale "), 1, 0, 50, "").set_handler(sc_ragsoc_handler); - _for_sh_k2->add_checkbutton(SC_CLIFO+500, 0, "", 68, 0, 2, 1, "", 10112, 10113).set_handler(sc_filter_handler); - } - else - { - _for_cur_k1 = NULL; - _for_cur_k2 = NULL; - _for_sh_k1 = NULL; - _for_sh_k2 = NULL; - } - - if (id2pos(SC_CLIFO) >= 0 && TToken_string(lfield(SC_CLIFO).get_codes()).items()>2) - { - _pdc_rel = new TRelation(LF_PCON); - TRectype& filter = _pdc_rel->curr(); - _pdc_cur_k1 = new TCursor(_pdc_rel, "", 1, &filter, &filter); - _pdc_cur_k2 = new TCursor(_pdc_rel, "", 2, &filter, &filter); - _pdc_sh_k1 = new TCursor_sheet(_pdc_cur_k1, " |GRUPPO|CONTO|SOTTOCONTO|DESCR", "Selezione conti per codice", - "@1|Gruppo|Conto|Sottoconto|Descrizione@50",0,1); - _pdc_sh_k2 = new TCursor_sheet(_pdc_cur_k2, " |DESCR|GRUPPO|CONTO|SOTTOCONTO", "Selezione conti per descrizione", - "@1|Descrizione@50|Gruppo|Conto|Sottoconto",0,1); - _pdc_sh_k2->add_string(SC_CLIFO, 0, PR("Descrizione "), 1, 0, 50, "").set_handler(sc_ragsoc_handler); - _pdc_sh_k2->add_checkbutton(SC_CLIFO+500, 0, "", 68, 0, 2, 1, "", 10112, 10113).set_handler(sc_filter_handler); - } - else - { - _pdc_rel = NULL; - _pdc_cur_k1 = NULL; - _pdc_cur_k2 = NULL; - _pdc_sh_k1 = NULL; - _pdc_sh_k2 = NULL; - } - - set_handler(SC_CLIFO, rclifo_handler); - set_handler(SC_SORTCF, rsortcf_handler); - set_handler(SC_SELECT, bselect_handler); - set_handler(SC_RESET, breset_handler); - set_handler(SC_CFCODFR, ffrom_handler); - set_handler(SC_CFCODTO, fto_handler); - set_handler(SC_CFDESFR, fdfrom_handler); - set_handler(SC_CFDESTO, fdto_handler); -} - -TSelection_mask::~TSelection_mask() -{ - if (_pdc_sh_k1 != NULL) - { - delete _pdc_sh_k2; - delete _pdc_sh_k1; - delete _pdc_cur_k2; - delete _pdc_cur_k1; - delete _pdc_rel; - } - - if (_for_sh_k1 != NULL) - { - delete _for_sh_k2; - delete _for_sh_k1; - delete _for_cur_k2; - delete _for_cur_k1; - } - - delete _cli_sh_k2; - delete _cli_sh_k1; - delete _cli_cur_k2; - delete _cli_cur_k1; - - delete _clifo_rel; -} - -bool TSelection_mask::stop_run(KEY k) -{ - const bool ok = TMask::stop_run(k); - if (ok && k != K_QUIT) - update_assoc(); - return ok; -} - -void TSelection_mask::set_handler(short fld_id, CONTROL_HANDLER handler) -{ - const int pos = id2pos(fld_id); - if (pos >= 0) - fld(pos).set_handler(handler); -} - -TCursor_sheet& TSelection_mask::cur_sheet() const -{ - TCursor_sheet* cs = NULL; - switch (get_who()) - { - case 'C': cs = get_key() == 1 ? _cli_sh_k1 : _cli_sh_k2; break; - case 'F': cs = get_key() == 1 ? _for_sh_k1 : _for_sh_k2; break; - default : cs = get_key() == 1 ? _pdc_sh_k1 : _pdc_sh_k2; break; - } - CHECK(cs, "Can't use a NULL TCursor_sheet"); - return *cs; -} - -void TSelection_mask::reset_sheets() -{ - _cli_sh_k1->uncheck(-1); - _cli_sh_k2->uncheck(-1); - if (_for_sh_k1) - { - _for_sh_k1->uncheck(-1); - _for_sh_k2->uncheck(-1); - } - if (_pdc_sh_k1) - { - _pdc_sh_k1->uncheck(-1); - _pdc_sh_k2->uncheck(-1); - } - reset(SC_CFCODFR); - reset(SC_CFCODTO); - reset(SC_CFDESFR); - reset(SC_CFDESTO); - reset(SC_NSEL); -} - - -// Seleziona tutti i clienti con codice compreso tra due estremi -void TSelection_mask::select_clifo_range(long from, long to) -{ - TWait_cursor hourglass; - TCursor_sheet& c = cur_sheet(); - const long items = c.items(); - const int key = get_key(); - - TCursor* crs = c.cursor(); - if (to == 0 && items) - to = c.row(items-1).get_long(key); - - if (from > to) // Controlla limiti - { - long tmp = to; - to = from; - from = tmp; - } - long last = 0; - long firs = 0; - - TRectype& rec = crs->file().curr(); - rec.zero(); - rec.put(CLI_TIPOCF,get_who()); - rec.put(CLI_CODCF,from); - - const TRecnotype start = crs->read(_isgteq); - firs = rec.get_long(CLI_CODCF); - rec.zero(); - rec.put(CLI_TIPOCF,get_who()); - rec.put(CLI_CODCF,to); - TRectype recx(rec); - TRecnotype end = crs->read(_isgteq); - if (rec > recx) - { - end--; - (*crs)-=1; - } - last = rec.get_long(CLI_CODCF); - c.uncheck(-1); - for (long i = start; i <= end; i++) - c.check(i); - if (get(SC_CFCODFR).not_empty()) - set(SC_CFCODFR, firs); - if (get(SC_CFCODTO).not_empty()) - set(SC_CFCODTO, last); - - set(SC_NSEL, c.checked()); -} - -void TSelection_mask::select_des_clifo_range(const TString& from, const TString & to) -{ - TWait_cursor hourglass; - TCursor_sheet& c = cur_sheet(); - const long items = c.items(); - const int key = get_key(); - CHECK(key == 2, "La chiave deve essere la 2"); - TString s_from(from), s_to(to); - - if (s_to.empty() && items) - s_to = c.row(items-1).get(1); - s_from.upper(); - s_to.upper(); - - if (s_from > s_to) // Controlla limiti - { - s_to = from; - s_from = to;// ripristina i valori originali (!upper) - set(SC_CFDESFR, to); - set(SC_CFDESTO, from); - } - else - { - if (to.not_empty()) s_to = to; - s_from = from; // ripristina i valori originali (!upper) - } - - TString last; - TString firs; - - const char who = get_who(); - TCursor* crs = c.cursor(); - TRectype& rec = crs->file().curr(); - rec.zero(); - if (who >= 'C') - { - rec.put(CLI_TIPOCF, who); - rec.put(CLI_RAGSOC, s_from); - } - else - rec.put(PCN_DESCR, s_from); - const TRecnotype start = crs->read(_isgteq); - firs = rec.get(who >= 'C' ? CLI_RAGSOC : PCN_DESCR); - rec.zero(); - if (who >= 'C') - { - rec.put(CLI_TIPOCF, who); - rec.put(CLI_RAGSOC, s_to); - } - else - rec.put(PCN_DESCR, s_to); - - TRectype recx(rec); - TRecnotype end = crs->read(_isgteq); - if (rec > recx) - { - end--; - (*crs)-=1; - } - last = rec.get(who >= 'C' ? CLI_RAGSOC : PCN_DESCR); - c.uncheck(-1); - for (long i = start; i <= end; i++) - c.check(i); - if (get(SC_CFDESFR).not_empty()) - set(SC_CFDESFR, firs); - if (get(SC_CFDESTO).not_empty()) - set(SC_CFDESTO, last); - set(SC_NSEL, c.checked()); -} - -// Cerca il primo e l'ultimo cliente selezionati -void TSelection_mask::set_clifo_limits() -{ - TWait_cursor hourglass; - long from = 0, to = 0; - - TCursor_sheet& c = cur_sheet(); - const long items = c.items(); - const int key = get_key(); - long first = -1, last = -1; - - for (long i = 0; i < items; i++) - if (c.checked(i)) - { - if (first == -1) - first = i; - } - if (first != -1) //Optimization... If nothing was found previously skip this test. - for (long j = (items-1); j >= 0 ; j--) - if (c.checked(j)) - if (last == -1) - { - last = j; - break; - } - if (first!= -1 && last != -1) // Something selected? - { - TToken_string fitem(c.row(first)); - TToken_string litem(c.row(last)); - from = fitem.get_long(key); - to = litem.get_long(key); - if (from>to) - { - long t = to; - to=from; - from=t; - } - } - set(SC_CFCODFR, from); - set(SC_CFCODTO, to); - set(SC_NSEL, c.checked()); -} - -void TSelection_mask::set_des_clifo_limits() -{ - TWait_cursor hourglass; - long first=-1, last=-1; - TString from,to; - TCursor_sheet& c = cur_sheet(); - const long items = c.items(); - const int key = get_key(); - CHECK(key == 2, "La chiave deve essere la 2"); - - for (long i = 0; i < items; i++) - if (c.checked(i)) - { - if (first == -1) - first = i; - } - if (first != -1) - for (long j = (items-1); j >= 0 ; j--) - if (c.checked(j)) - if (last == -1) - { - last = j; - break; - } - if (first!= -1 && last != -1) - { - TToken_string fitem(c.row(first)); - TToken_string litem(c.row(last)); - from = fitem.get(1); - to = litem.get(1); - if (from>to) - { - TString temp(to); - to=from; - from=temp; - } - } - set(SC_CFDESFR, from); - set(SC_CFDESTO, to); - set(SC_NSEL, c.checked()); -} - -// handlers - -bool TSelection_mask::ffrom_handler(TMask_field& f, KEY k) -{ - TSelection_mask& m = (TSelection_mask&)f.mask(); - - if (k == K_TAB && f.focusdirty()) - { - const long cod1 = atol(f.get()); - const long cod2 = m.get_long(SC_CFCODTO); - m.select_clifo_range(cod1, cod2); - } - else - if (k == K_F9) - { - TCursor_sheet& c = m.cur_sheet(); - c.cursor()->curr().put(CLI_CODCF, f.get()); - c.cursor()->read(); - c.disable_check(); - c.disable(DLG_USER); - if (c.run() == K_ENTER) - { - TToken_string& t = c.row(c.selected()); - const long cod1 = t.get_long(m.get_key()); - const long cod2 = m.get_long(SC_CFCODTO); - m.set(SC_CFCODFR, cod1); - m.select_clifo_range(cod1, cod2); - } - c.enable(DLG_USER); - c.enable_check(); - } - - - return true; -} - -bool TSelection_mask::fto_handler(TMask_field& f, KEY k) -{ - TSelection_mask& m = (TSelection_mask&)f.mask(); - - if (k == K_TAB && f.focusdirty()) - { - const long cod1 = m.get_long(SC_CFCODFR); - const long cod2 = atol(f.get()); - m.select_clifo_range(cod1, cod2); - } - else - if (k == K_F9) - { - TCursor_sheet& c = m.cur_sheet(); - c.cursor()->curr().put(CLI_CODCF, f.get()); - c.cursor()->read(); - c.disable_check(); - c.disable(DLG_USER); - if (c.run() == K_ENTER) - { - TToken_string& t = c.row(c.selected()); - const long cod2 = t.get_long(m.get_key()); - const long cod1 = m.get_long(SC_CFCODFR); - m.set(SC_CFCODTO, cod2); - m.select_clifo_range(cod1, cod2); - } - c.enable(DLG_USER); - c.enable_check(); - } - return true; -} - -bool TSelection_mask::fdfrom_handler(TMask_field& f, KEY k) -{ - TSelection_mask& m = (TSelection_mask&)f.mask(); - - if (k == K_TAB && f.focusdirty()) - { - const TString des1(f.get()); - const TString des2(m.get(SC_CFDESTO)); - m.select_des_clifo_range(des1, des2); - } - else - if (k == K_F9) - { - TCursor_sheet& c = m.cur_sheet(); - const char* fld = m.get_who() >= 'C' ? CLI_RAGSOC : PCN_DESCR; - const TString& value = f.get(); - c.cursor()->curr().put(fld, value); - c.cursor()->read(); - c.set(SC_CLIFO, value, 0x3); - c.disable_check(); - c.disable(DLG_USER); - if (c.run() == K_ENTER) - { - TToken_string& t = c.row(c.selected()); - const TString des1(t.get(1)); - const TString des2 = m.get(SC_CFDESTO); - m.set(SC_CFDESFR, des1); - m.select_des_clifo_range(des1, des2); - } - c.enable(DLG_USER); - c.enable_check(); - } - - return true; -} - -bool TSelection_mask::fdto_handler(TMask_field& f, KEY k) -{ - TSelection_mask& m = (TSelection_mask&)f.mask(); - - if (k == K_TAB && f.focusdirty()) - { - const TString des2(f.get()); - const TString des1(m.get(SC_CFDESFR)); - m.select_des_clifo_range(des1, des2); - } - else - if (k == K_F9) - { - TCursor_sheet& c = m.cur_sheet(); - const char* fld = m.get_who() >= 'C' ? CLI_RAGSOC : PCN_DESCR; - const TString& value = f.get(); - c.cursor()->curr().put(fld, value); - c.cursor()->read(); - c.set(SC_CLIFO, value, 0x3); - c.disable_check(); - c.disable(DLG_USER); - if (c.run() == K_ENTER) - { - TToken_string& t = c.row(c.selected()); - const TString des1(m.get(SC_CFDESFR)); - const TString des2(t.get(1)); - m.set(SC_CFDESTO, des2); - m.select_des_clifo_range(des1, des2); - } - c.enable(DLG_USER); - c.enable_check(); - } - return true; -} - -bool TSelection_mask::breset_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TSelection_mask& m = (TSelection_mask&)f.mask(); - m.reset_sheets(); - } - return true; -} - -bool TSelection_mask::bselect_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TSelection_mask& m = (TSelection_mask&)f.mask(); - TCursor_sheet& c = m.cur_sheet(); - c.enable_check(); - c.run(); - if (m.get_key() == 2) - m.set_des_clifo_limits(); - else - m.set_clifo_limits(); - } - return true; -} - -bool TSelection_mask::rclifo_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TSelection_mask& m = (TSelection_mask&)f.mask(); - m.set_who(f.get()[0]); - m.reset_sheets(); - } - return true; -} - -bool TSelection_mask::rsortcf_handler(TMask_field& f, KEY k) -{ - if (k == K_SPACE) - { - TSelection_mask& m = (TSelection_mask&)f.mask(); - m.set_key(atoi(f.get())); - m.reset_sheets(); - } - return true; -} - -void TSelection_mask::update_assoc() -{ - _assoc.destroy(); - _all_selected = false; - - TCursor_sheet& cs = cur_sheet(); // Sheet di selezione (CLI/FO/PCON) - const long checked = cs.checked(); - if (checked == 0L || checked == cs.items()) - _all_selected =true; - else - { - const int first = get_key(); - const char who = get_who(); - TString16 key; - - for (long i = cs.items()-1; i >= 0; i--) if (cs.checked(i)) - { - TToken_string& row = cs.row(i); - if (who == 'C' || who == 'F') - { - key.format("000000%06ld", row.get_long(first)); - } - else - { - const TBill b(row, first, 0x0); - key.format("%03d%03d%06ld", - b.gruppo(), b.conto(), b.sottoconto()); - } - _assoc.add(key, NULL); - } - } -} - -bool TSelection_mask::selected(const TBill& b) const -{ - bool ok = _all_selected; - if (!ok) - { - TString16 key; - key.format("%03d%03d%06ld", - b.gruppo(), b.conto(), b.sottoconto()); - ok = _assoc.is_key(key); - } - return ok; -} - -bool TSelection_mask::selected(int g, int c, long s) const -{ - bool ok = _all_selected; - if (!ok) - { - TString16 key; - key.format("%03d%03d%06ld", g, c, s); - ok = _assoc.is_key(key); - } - return ok; -} - -TRecnotype TSelection_mask::get_clifo_range(long& first, long& last) const -{ - first = last = 0L; - TRecnotype items = 0; - if (get_who() >= 'C') - { - if (_all_selected) - { - TCursor& c = *cur_sheet().cursor(); // Sheet di selezione (CLI/FO/PCON) - items = c.items(); - if (items > 0) - { - c = 0L; first = c.curr().get_long(CLI_CODCF); - c = c.items()-1L; last = c.curr().get_long(CLI_CODCF); - } - } - else - { - TAssoc_array& ass = (TAssoc_array&)_assoc; // Trick the compiler - FOR_EACH_ASSOC_OBJECT(ass, obj, key, item) - { - const TFixed_string gcs(key); - const long codcf = atol(gcs.right(6)); - if (first == 0 || codcf < first) - first = codcf; - if (last == 0 || codcf > last) - last = codcf; - items++; - } - } - } - return items; -} +#include +#include + +#include "../cg/cglib01.h" +#include +#include "scselect.h" +#include + +static bool sc_filter_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TCursor_sheet& cs = (TCursor_sheet&)f.mask(); + TCursor& c = *cs.cursor(); + + TString expr; // Espressione di filtro complessiva + if (f.get().full()) // Filtro attivato! + { + const short id = f.dlg()-500; + TString e = f.mask().get(id); // Espressione regolare + e.strip("\"'"); // Tolgo caratteri che potrebbero dare problemi + if (e.full()) + { + expr = (c.file().num() == LF_CLIFO) ? CLI_RAGSOC : PCN_DESCR; + expr << "?=\"" << e << '"'; + expr.upper(); + } + if (expr.empty()) + f.reset(); + } + c.freeze(false); + c.setfilter(expr, true); + c.freeze(true); + cs.force_update(); + cs.post_select(0); + } + return true; +} + +static bool sc_ragsoc_handler(TMask_field& f, KEY k) +{ + if (k == K_TAB && f.focusdirty()) + { + TMask_field& chk = f.mask().field(f.dlg()+500); + if (f.get().starts_with("*")) + chk.set("X"); + if (chk.get().full()) + sc_filter_handler(chk, K_SPACE); + } + return true; +} + +TSelection_mask::TSelection_mask(const char* name) + : TMask(name), _who('C'), _key(1), _clifo_rel(NULL), _pdc_rel(NULL), + _cli_cur_k1(NULL), _cli_cur_k2(NULL), _for_cur_k1(NULL), _for_cur_k2(NULL), + _pdc_cur_k1(NULL), _pdc_cur_k2(NULL) +{ + // crea relazioni, cursori e cursor_sheets + _clifo_rel = new TRelation(LF_CLIFO); + _clifo_rel->add(LF_CFVEN,"TIPOCF==TIPOCF|CODCF==CODCF"); + TString rf = get_user_read_filter(); + + TRectype filter(LF_CLIFO); + filter.put(CLI_TIPOCF, "C"); + _cli_cur_k1 = new TCursor(_clifo_rel, rf, 1, &filter, &filter); + _cli_cur_k2 = new TCursor(_clifo_rel, rf, 2, &filter, &filter); + + _cli_sh_k1 = new TCursor_sheet(_cli_cur_k1, " |CODCF|RAGSOC|PAIV", TR("Selezione cliente per codice"), + "@1|Codice|Ragione Sociale@50",0,1); + _cli_sh_k2 = new TCursor_sheet(_cli_cur_k2, " |RAGSOC|CODCF", "Selezione clienti per ragione sociale", + "@1|Ragione Sociale@50|Codice",0,1); + + _cli_sh_k2->add_checkbutton(SC_CLIFO+500, 0, "", 68, 0, 2, 1, "", 10112, 10113).set_handler(sc_filter_handler); + + if (id2pos(SC_CLIFO) >= 0) + { + filter.put(CLI_TIPOCF, "F"); + _for_cur_k1 = new TCursor(_clifo_rel, rf, 1, &filter, &filter); + _for_cur_k2 = new TCursor(_clifo_rel, rf, 2, &filter, &filter); + _for_sh_k1 = new TCursor_sheet(_for_cur_k1, " |CODCF|RAGSOC|PAIV", TR("Selezione fornitore per codice"), + HR("@1|Codice|Ragione Sociale@50|Partita IVA"),0,1); + _for_sh_k2 = new TCursor_sheet(_for_cur_k2, " |RAGSOC|CODCF|PAIV", TR("Selezione fornitore per ragione sociale"), + "@1|Ragione Sociale@50|Codice|Partita IVA",0,1); + _for_sh_k2->add_string(SC_CLIFO, 0, PR("Ragione sociale "), 1, 0, 50, "").set_handler(sc_ragsoc_handler); + _for_sh_k2->add_checkbutton(SC_CLIFO+500, 0, "", 68, 0, 2, 1, "", 10112, 10113).set_handler(sc_filter_handler); + } + else + { + _for_cur_k1 = NULL; + _for_cur_k2 = NULL; + _for_sh_k1 = NULL; + _for_sh_k2 = NULL; + } + + if (id2pos(SC_CLIFO) >= 0 && TToken_string(lfield(SC_CLIFO).get_codes()).items()>2) + { + _pdc_rel = new TRelation(LF_PCON); + TRectype& filter = _pdc_rel->curr(); + _pdc_cur_k1 = new TCursor(_pdc_rel, rf, 1, &filter, &filter); + _pdc_cur_k2 = new TCursor(_pdc_rel, rf, 2, &filter, &filter); + _pdc_sh_k1 = new TCursor_sheet(_pdc_cur_k1, " |GRUPPO|CONTO|SOTTOCONTO|DESCR", "Selezione conti per codice", + "@1|Gruppo|Conto|Sottoconto|Descrizione@50",0,1); + _pdc_sh_k2 = new TCursor_sheet(_pdc_cur_k2, " |DESCR|GRUPPO|CONTO|SOTTOCONTO", "Selezione conti per descrizione", + "@1|Descrizione@50|Gruppo|Conto|Sottoconto",0,1); + _pdc_sh_k2->add_string(SC_CLIFO, 0, PR("Descrizione "), 1, 0, 50, "").set_handler(sc_ragsoc_handler); + _pdc_sh_k2->add_checkbutton(SC_CLIFO+500, 0, "", 68, 0, 2, 1, "", 10112, 10113).set_handler(sc_filter_handler); + } + else + { + _pdc_rel = NULL; + _pdc_cur_k1 = NULL; + _pdc_cur_k2 = NULL; + _pdc_sh_k1 = NULL; + _pdc_sh_k2 = NULL; + } + + set_handler(SC_CLIFO, rclifo_handler); + set_handler(SC_SORTCF, rsortcf_handler); + set_handler(SC_SELECT, bselect_handler); + set_handler(SC_RESET, breset_handler); + set_handler(SC_CFCODFR, ffrom_handler); + set_handler(SC_CFCODTO, fto_handler); + set_handler(SC_CFDESFR, fdfrom_handler); + set_handler(SC_CFDESTO, fdto_handler); +} + +TSelection_mask::~TSelection_mask() +{ + if (_pdc_sh_k1 != NULL) + { + delete _pdc_sh_k2; + delete _pdc_sh_k1; + delete _pdc_cur_k2; + delete _pdc_cur_k1; + delete _pdc_rel; + } + + if (_for_sh_k1 != NULL) + { + delete _for_sh_k2; + delete _for_sh_k1; + delete _for_cur_k2; + delete _for_cur_k1; + } + + delete _cli_sh_k2; + delete _cli_sh_k1; + delete _cli_cur_k2; + delete _cli_cur_k1; + + delete _clifo_rel; +} + +bool TSelection_mask::stop_run(KEY k) +{ + const bool ok = TMask::stop_run(k); + if (ok && k != K_QUIT) + update_assoc(); + return ok; +} + +void TSelection_mask::set_handler(short fld_id, CONTROL_HANDLER handler) +{ + const int pos = id2pos(fld_id); + if (pos >= 0) + fld(pos).set_handler(handler); +} + +TCursor_sheet& TSelection_mask::cur_sheet() const +{ + TCursor_sheet* cs = NULL; + switch (get_who()) + { + case 'C': cs = get_key() == 1 ? _cli_sh_k1 : _cli_sh_k2; break; + case 'F': cs = get_key() == 1 ? _for_sh_k1 : _for_sh_k2; break; + default : cs = get_key() == 1 ? _pdc_sh_k1 : _pdc_sh_k2; break; + } + CHECK(cs, "Can't use a NULL TCursor_sheet"); + return *cs; +} + +void TSelection_mask::reset_sheets() +{ + _cli_sh_k1->uncheck(-1); + _cli_sh_k2->uncheck(-1); + if (_for_sh_k1) + { + _for_sh_k1->uncheck(-1); + _for_sh_k2->uncheck(-1); + } + if (_pdc_sh_k1) + { + _pdc_sh_k1->uncheck(-1); + _pdc_sh_k2->uncheck(-1); + } + reset(SC_CFCODFR); + reset(SC_CFCODTO); + reset(SC_CFDESFR); + reset(SC_CFDESTO); + reset(SC_NSEL); +} + + +// Seleziona tutti i clienti con codice compreso tra due estremi +void TSelection_mask::select_clifo_range(long from, long to) +{ + TWait_cursor hourglass; + TCursor_sheet& c = cur_sheet(); + const long items = c.items(); + const int key = get_key(); + + TCursor* crs = c.cursor(); + if (to == 0 && items) + to = c.row(items-1).get_long(key); + + if (from > to) // Controlla limiti + { + long tmp = to; + to = from; + from = tmp; + } + long last = 0; + long firs = 0; + + TRectype& rec = crs->file().curr(); + rec.zero(); + rec.put(CLI_TIPOCF,get_who()); + rec.put(CLI_CODCF,from); + + const TRecnotype start = crs->read(_isgteq); + firs = rec.get_long(CLI_CODCF); + rec.zero(); + rec.put(CLI_TIPOCF,get_who()); + rec.put(CLI_CODCF,to); + TRectype recx(rec); + TRecnotype end = crs->read(_isgteq); + if (rec > recx) + { + end--; + (*crs)-=1; + } + last = rec.get_long(CLI_CODCF); + c.uncheck(-1); + for (long i = start; i <= end; i++) + c.check(i); + if (get(SC_CFCODFR).not_empty()) + set(SC_CFCODFR, firs); + if (get(SC_CFCODTO).not_empty()) + set(SC_CFCODTO, last); + + set(SC_NSEL, c.checked()); +} + +void TSelection_mask::select_des_clifo_range(const TString& from, const TString & to) +{ + TWait_cursor hourglass; + TCursor_sheet& c = cur_sheet(); + const long items = c.items(); + const int key = get_key(); + CHECK(key == 2, "La chiave deve essere la 2"); + TString s_from(from), s_to(to); + + if (s_to.empty() && items) + s_to = c.row(items-1).get(1); + s_from.upper(); + s_to.upper(); + + if (s_from > s_to) // Controlla limiti + { + s_to = from; + s_from = to;// ripristina i valori originali (!upper) + set(SC_CFDESFR, to); + set(SC_CFDESTO, from); + } + else + { + if (to.not_empty()) s_to = to; + s_from = from; // ripristina i valori originali (!upper) + } + + TString last; + TString firs; + + const char who = get_who(); + TCursor* crs = c.cursor(); + TRectype& rec = crs->file().curr(); + rec.zero(); + if (who >= 'C') + { + rec.put(CLI_TIPOCF, who); + rec.put(CLI_RAGSOC, s_from); + } + else + rec.put(PCN_DESCR, s_from); + const TRecnotype start = crs->read(_isgteq); + firs = rec.get(who >= 'C' ? CLI_RAGSOC : PCN_DESCR); + rec.zero(); + rec.put(CLI_TIPOCF,get_who()); + rec.put(CLI_RAGSOC,s_to); +if (who >= 'C') + { + rec.put(CLI_TIPOCF, who); + rec.put(CLI_RAGSOC, s_to); + } + else + rec.put(PCN_DESCR, s_to); + + TRectype recx(rec); + TRecnotype end = crs->read(_isgteq); + if (rec > recx) + { + end--; + (*crs)-=1; + } + last = rec.get(who >= 'C' ? CLI_RAGSOC : PCN_DESCR); + c.uncheck(-1); + for (long i = start; i <= end; i++) + c.check(i); + if (get(SC_CFDESFR).not_empty()) + set(SC_CFDESFR, firs); + if (get(SC_CFDESTO).not_empty()) + set(SC_CFDESTO, last); + set(SC_NSEL, c.checked()); +} + +// Cerca il primo e l'ultimo cliente selezionati +void TSelection_mask::set_clifo_limits() +{ + TWait_cursor hourglass; + long from = 0, to = 0; + + TCursor_sheet& c = cur_sheet(); + const long items = c.items(); + const int key = get_key(); + long first = -1, last = -1; + + for (long i = 0; i < items; i++) + if (c.checked(i)) + { + if (first == -1) + first = i; + } + if (first != -1) //Optimization... If nothing was found previously skip this test. + for (long j = (items-1); j >= 0 ; j--) + if (c.checked(j)) + if (last == -1) + { + last = j; + break; + } + if (first!= -1 && last != -1) // Something selected? + { + TToken_string fitem(c.row(first)); + TToken_string litem(c.row(last)); + from = fitem.get_long(key); + to = litem.get_long(key); + if (from>to) + { + long t = to; + to=from; + from=t; + } + } + set(SC_CFCODFR, from); + set(SC_CFCODTO, to); + set(SC_NSEL, c.checked()); +} + +void TSelection_mask::set_des_clifo_limits() +{ + TWait_cursor hourglass; + long first=-1, last=-1; + TString from,to; + TCursor_sheet& c = cur_sheet(); + const long items = c.items(); + const int key = get_key(); + CHECK(key == 2, "La chiave deve essere la 2"); + + for (long i = 0; i < items; i++) + if (c.checked(i)) + { + if (first == -1) + first = i; + } + if (first != -1) + for (long j = (items-1); j >= 0 ; j--) + if (c.checked(j)) + if (last == -1) + { + last = j; + break; + } + if (first!= -1 && last != -1) + { + TToken_string fitem(c.row(first)); + TToken_string litem(c.row(last)); + from = fitem.get(1); + to = litem.get(1); + if (from>to) + { + TString temp(to); + to=from; + from=temp; + } + } + set(SC_CFDESFR, from); + set(SC_CFDESTO, to); + set(SC_NSEL, c.checked()); +} + +// handlers + +bool TSelection_mask::ffrom_handler(TMask_field& f, KEY k) +{ + TSelection_mask& m = (TSelection_mask&)f.mask(); + + if (k == K_TAB && f.focusdirty()) + { + const long cod1 = atol(f.get()); + const long cod2 = m.get_long(SC_CFCODTO); + m.select_clifo_range(cod1, cod2); + } + else + if (k == K_F9) + { + TCursor_sheet& c = m.cur_sheet(); + c.cursor()->curr().put(CLI_CODCF, f.get()); + c.cursor()->read(); + c.disable_check(); + c.disable(DLG_USER); + if (c.run() == K_ENTER) + { + TToken_string& t = c.row(c.selected()); + const long cod1 = t.get_long(m.get_key()); + const long cod2 = m.get_long(SC_CFCODTO); + m.set(SC_CFCODFR, cod1); + m.select_clifo_range(cod1, cod2); + } + c.enable(DLG_USER); + c.enable_check(); + } + + + return true; +} + +bool TSelection_mask::fto_handler(TMask_field& f, KEY k) +{ + TSelection_mask& m = (TSelection_mask&)f.mask(); + + if (k == K_TAB && f.focusdirty()) + { + const long cod1 = m.get_long(SC_CFCODFR); + const long cod2 = atol(f.get()); + m.select_clifo_range(cod1, cod2); + } + else + if (k == K_F9) + { + TSelection_mask& m = (TSelection_mask&)f.mask(); + TCursor_sheet& c = m.cur_sheet(); + c.cursor()->curr().put(CLI_CODCF, f.get()); + c.cursor()->read(); + c.disable_check(); + c.disable(DLG_USER); + if (c.run() == K_ENTER) + { + TToken_string& t = c.row(c.selected()); + const long cod2 = t.get_long(m.get_key()); + const long cod1 = m.get_long(SC_CFCODFR); + m.set(SC_CFCODTO, cod2); + m.select_clifo_range(cod1, cod2); + } + c.enable(DLG_USER); + c.enable_check(); + } + return true; +} + +bool TSelection_mask::fdfrom_handler(TMask_field& f, KEY k) +{ + TSelection_mask& m = (TSelection_mask&)f.mask(); + + if (k == K_TAB && f.focusdirty()) + { + const TString des1(f.get()); + const TString des2(m.get(SC_CFDESTO)); + m.select_des_clifo_range(des1, des2); + } + else + if (k == K_F9) + { + TCursor_sheet& c = m.cur_sheet(); + const char* fld = m.get_who() >= 'C' ? CLI_RAGSOC : PCN_DESCR; + const TString& value = f.get(); + c.cursor()->curr().put(fld, value); + c.cursor()->read(); + c.set(SC_CLIFO, value, 0x3); + c.disable_check(); + c.disable(DLG_USER); + if (c.run() == K_ENTER) + { + TToken_string& t = c.row(c.selected()); + const TString des1(t.get(1)); + const TString des2 = m.get(SC_CFDESTO); + m.set(SC_CFDESFR, des1); + m.select_des_clifo_range(des1, des2); + } + c.enable(DLG_USER); + c.enable_check(); + } + + return true; +} + +bool TSelection_mask::fdto_handler(TMask_field& f, KEY k) +{ + TSelection_mask& m = (TSelection_mask&)f.mask(); + + if (k == K_TAB && f.focusdirty()) + { + const TString des2(f.get()); + const TString des1(m.get(SC_CFDESFR)); + m.select_des_clifo_range(des1, des2); + } + else + if (k == K_F9) + { + TCursor_sheet& c = m.cur_sheet(); + const char* fld = m.get_who() >= 'C' ? CLI_RAGSOC : PCN_DESCR; + const TString& value = f.get(); + c.cursor()->curr().put(fld, value); + c.cursor()->read(); + c.set(SC_CLIFO, value, 0x3); + c.disable_check(); + c.disable(DLG_USER); + if (c.run() == K_ENTER) + { + TToken_string& t = c.row(c.selected()); + const TString des1(m.get(SC_CFDESFR)); + const TString des2(t.get(1)); + m.set(SC_CFDESTO, des2); + m.select_des_clifo_range(des1, des2); + } + c.enable(DLG_USER); + c.enable_check(); + } + return true; +} + +bool TSelection_mask::breset_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TSelection_mask& m = (TSelection_mask&)f.mask(); + m.reset_sheets(); + } + return true; +} + +bool TSelection_mask::bselect_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TSelection_mask& m = (TSelection_mask&)f.mask(); + TCursor_sheet& c = m.cur_sheet(); + c.enable_check(); + c.run(); + if (m.get_key() == 2) + m.set_des_clifo_limits(); + else + m.set_clifo_limits(); + } + return true; +} + +bool TSelection_mask::rclifo_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TSelection_mask& m = (TSelection_mask&)f.mask(); + m.set_who(f.get()[0]); + m.reset_sheets(); + } + return true; +} + +bool TSelection_mask::rsortcf_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TSelection_mask& m = (TSelection_mask&)f.mask(); + m.set_key(atoi(f.get())); + m.reset_sheets(); + } + return true; +} + +void TSelection_mask::update_assoc() +{ + _assoc.destroy(); + _all_selected = false; + + TCursor_sheet& cs = cur_sheet(); // Sheet di selezione (CLI/FO/PCON) + const long checked = cs.checked(); + if (checked == 0L || checked == cs.items()) + _all_selected =true; + else + { + const int first = get_key(); + const char who = get_who(); + TString16 key; + + for (long i = cs.items()-1; i >= 0; i--) if (cs.checked(i)) + { + TToken_string& row = cs.row(i); + if (who == 'C' || who == 'F') + { + key.format("000000%06ld", row.get_long(first)); + } + else + { + const TBill b(row, first, 0x0); + key.format("%03d%03d%06ld", + b.gruppo(), b.conto(), b.sottoconto()); + } + _assoc.add(key, NULL); + } + } +} + +bool TSelection_mask::selected(const TBill& b) const +{ + bool ok = _all_selected; + if (!ok) + { + TString16 key; + key.format("%03d%03d%06ld", + b.gruppo(), b.conto(), b.sottoconto()); + ok = _assoc.is_key(key); + } + return ok; +} + +bool TSelection_mask::selected(int g, int c, long s) const +{ + bool ok = _all_selected; + if (!ok) + { + TString16 key; + key.format("%03d%03d%06ld", g, c, s); + ok = _assoc.is_key(key); + } + return ok; +} + +TRecnotype TSelection_mask::get_clifo_range(long& first, long& last) const +{ + first = last = 0L; + TRecnotype items = 0; + if (get_who() >= 'C') + { + if (_all_selected) + { + TCursor& c = *cur_sheet().cursor(); // Sheet di selezione (CLI/FO/PCON) + items = c.items(); + if (items > 0) + { + c = 0L; first = c.curr().get_long(CLI_CODCF); + c = c.items()-1L; last = c.curr().get_long(CLI_CODCF); + } + } + else + { + TAssoc_array& ass = (TAssoc_array&)_assoc; // Trick the compiler + FOR_EACH_ASSOC_OBJECT(ass, obj, key, item) + { + const TFixed_string gcs(key); + const long codcf = atol(gcs.right(6)); + if (first == 0 || codcf < first) + first = codcf; + if (last == 0 || codcf > last) + last = codcf; + items++; + } + } + } + return items; +}