diff --git a/ha/ha3.cpp b/ha/ha3.cpp new file mode 100755 index 000000000..559bbc636 --- /dev/null +++ b/ha/ha3.cpp @@ -0,0 +1,19 @@ +#include +#include + +#include "ha3.h" + +#define usage "Error - usage : %s -{0|1}" + +int main(int argc,char** argv) +{ + int rt = -1 ; + const int r = (argc > 1) ? atoi(&argv[1][1]) : -1; + + switch (r) + { + case 0: rt = ha3100(argc, argv); break; //Gestione giri + default: error_box(usage, argv[0]); break; + } + return rt; +} diff --git a/ha/ha3.h b/ha/ha3.h new file mode 100755 index 000000000..968cc86fb --- /dev/null +++ b/ha/ha3.h @@ -0,0 +1 @@ +int ha3100(int argc, char* argv[]); diff --git a/ha/ha3100.cpp b/ha/ha3100.cpp new file mode 100755 index 000000000..1089dd6e8 --- /dev/null +++ b/ha/ha3100.cpp @@ -0,0 +1,381 @@ +#include +#include +#include +#include +#include + +#include "../pr/agenti.h" + +#include "ha3.h" +#include "ha3100a.h" + +const char* const APPNAME = TR("Gestione giri"); + + ///////////////////////// + //// TGIRI_KEY //// + ///////////////////////// +class TGiri_key : public TObject +{ + TString8 _agente; + int _giorno; + long _cliente; + +public: + TGiri_key& operator =(const TGiri_key& gkey) {return *this;} + + const TString8 agente() const; + const int giorno() const; + const long cliente() const; + + void set_agente (const char* codag); + void set_giorno (const int giorno); + void set_cliente (const long codcli); + + const char* key() const; + + TGiri_key(const char* codag, const int giorno, const long codcli); + TGiri_key(const TString& key); +}; + +const TString8 TGiri_key::agente() const +{ + return _agente; +} + +const int TGiri_key::giorno() const +{ + return _giorno; +} + +const long TGiri_key::cliente() const +{ + return _cliente; +} + +void TGiri_key::set_agente(const char* codag) +{ + _agente = codag; +} + +void TGiri_key::set_giorno(const int giorno) +{ + _giorno = giorno; +} + +void TGiri_key::set_cliente(const long codcli) +{ + _cliente = codcli; +} + + +const char* TGiri_key::key() const +{ + TString& str = get_tmp_string(); + str = _agente; + + TString8 tmp; + tmp.format("%01d", _giorno); + str << tmp; + + tmp.cut(0); + tmp.format("%06d", _cliente); + str << tmp; + + return str; +} + +TGiri_key::TGiri_key(const char* codag, const int giorno, const long codcli/*, const int coditi*/) +{ + set_agente(codag); + set_giorno(giorno); + set_cliente(codcli); +} + +TGiri_key::TGiri_key(const TString& key) +{ + set_agente(key.left(5)); + set_giorno(atoi(key.mid(5,1))); + set_cliente(atol(key.mid(6,6))); +} + + /////////////////////////////////////// + //// FUNZIONI DI ORDINAMENTO //// + /////////////////////////////////////// + +static int sort_by_stop(TSheet_field& sheet, int r1, int r2) +{ + TToken_string& row1 = sheet.row(r1); + TToken_string& row2 = sheet.row(r2); + + const int i1 = row1.get_int(sheet.cid2index(S_ORDPASS)); + const int i2 = row2.get_int(sheet.cid2index(S_ORDPASS)); + + int dif = i1 - i2; + if (dif == 0) + { + dif = row1.get_int(sheet.cid2index(S_CLIENTE)) - row2.get_int(sheet.cid2index(S_CLIENTE)); + + if (dif == 0) + dif = row1.get_int(sheet.cid2index(S_AGENTE)) - row2.get_int(sheet.cid2index(S_AGENTE)); + } + + return dif; +} + + ////////////////////////////////// + //// TGESTIONE_GIRI_MSK //// + ////////////////////////////////// + +class TGestione_giri_msk : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + void riempi_sheet(); + void aggiungi_riga(); + void registra(); + +public: + TGestione_giri_msk(); + virtual ~TGestione_giri_msk() {}; +}; + +//RIEMPI_SHEET: riempie lo sheet tenendo conto dei filtri impostati +void TGestione_giri_msk::riempi_sheet() +{ + TSheet_field& sheet = sfield(F_SHEET); + sheet.destroy(); + + //leggi dalla maschera i filtri + TString8 agente; agente.format("%05d", get_long(F_AGENTE)); + const long giorno = get_int(F_GIORNO); + const long cliente = get_long(F_CLIENTE); + + //prepara la query; + //ATTENZIONE: le query su tabmod non funzionano con il semplice USE &TAB, ma vogliono SEMPRE FROM e TO + TString query; + query << "USE &HGI\n" + << "SELECT STR((BETWEEN(CODTAB[6,6];" << giorno << ';' << giorno << "))&&(BETWEEN(CODTAB[7,12];" << cliente << ';' << cliente << ")))"; + + if(!field(F_AGENTE).empty()) + { + query << "\nFROM CODTAB=\"" << agente << "\"" + << "\nTO CODTAB=\"" << agente << "\""; + } + else + { + TISAM_recordset agenti(TR("USE AGENTI")); + + agenti.move_first(); + query << "\nFROM CODTAB=\"" << agenti.get(AGE_CODAGE).as_string() << "\""; + + agenti.move_last(); + query << "\nTO CODTAB=\"" << agenti.get(AGE_CODAGE).as_string() << "\""; + } + + TISAM_recordset giri(query); + + //se non ho trovato niente con i filtri impostati, lo segnalo + if(giri.items() == 0) + { + warning_box(TR("Non è stato possibile trovare giri con i filtri selezionati.")); + return; + } + + //riempio lo sheet con i dati trovati sulla tabella di modulo + for(bool ok = giri.move_first(); ok; ok = giri.move_next()) + { + TToken_string& riga = sheet.row(-1); + + TGiri_key gkey(giri.get("CODTAB").as_string()); + + riga.add(gkey.agente(), sheet.cid2index(S_AGENTE)); + riga.add(gkey.giorno(), sheet.cid2index(S_GIORNO)); + riga.add(gkey.cliente(), sheet.cid2index(S_CLIENTE)); + riga.add(giri.get("I0").as_int(), sheet.cid2index(S_ORDPASS)); + riga.add(giri.get("S0").as_string(), sheet.cid2index(S_ORAPASS)); + } + + //faccio fare gli output ai campi della riga e disabilito le celle dei campi chiave + FOR_EACH_SHEET_ROW(sheet, r, row) + { + sheet.check_row(r); + sheet.disable_cell(r, sheet.cid2index(S_AGENTE)); + sheet.disable_cell(r, sheet.cid2index(S_RAGSOC)); + sheet.disable_cell(r, sheet.cid2index(S_GIORNO)); + sheet.disable_cell(r, sheet.cid2index(S_CLIENTE)); + sheet.disable_cell(r, sheet.cid2index(S_CLIRAGSOC)); + } + sheet.force_update(); +} + +//AGGIUNGI_RIGA: aggiunge una riga allo sheet tetendo conto dei filtri impostati in testata +//(compila i campi già compilati e li disabilita) +void TGestione_giri_msk::aggiungi_riga() +{ + const long agente = get_long(F_AGENTE); + const long giorno = get_int(F_GIORNO); + const long cliente = get_long(F_CLIENTE); + TString8 codage; codage.format("%05d", agente); + + TSheet_field& sheet = sfield(F_SHEET); + + const short pos_codage = sheet.cid2index(S_AGENTE); + const short pos_giorno = sheet.cid2index(S_GIORNO); + const short pos_codcli = sheet.cid2index(S_CLIENTE); + + TToken_string& riga = sheet.row(-1); + const int r = sheet.items() - 1; + + if(agente > 0L) + riga.add(codage, pos_codage); + + if(giorno > 0L) + riga.add(giorno, pos_giorno); + else + riga.add(1L, pos_giorno); + + if(agente > 0L) + riga.add(cliente, pos_codcli); + + riga.add("00:00", sheet.cid2index(S_ORAPASS)); + + sheet.force_update(); + sheet.check_row(sheet.items() - 1); + + if(agente > 0L) + { + sheet.disable_cell(r, pos_codage); + sheet.disable_cell(r, sheet.cid2index(S_RAGSOC)); + } + + if(giorno > 0L) + sheet.disable_cell(r, pos_giorno); + + if(cliente > 0L) + { + sheet.disable_cell(r, pos_codcli); + sheet.disable_cell(r, sheet.cid2index(S_CLIRAGSOC)); + } + sheet.sort(sort_by_stop); + sheet.force_update(); +} + +//REGISTRA: registra le variazioni ai record esistenti, aggiunge quelli nuovi e cancella quelli contrasegnati +void TGestione_giri_msk::registra() +{ + TModule_table giri("&HGI"); + TSheet_field& sheet = sfield(F_SHEET); + + TAssoc_array chiavi; + + FOR_EACH_SHEET_ROW(sheet, r, riga) + { + giri.zero(); + TToken_string& row = *(TToken_string*)riga; + + const bool cancella = row.get_char(sheet.cid2index(S_CANC)) == 'X' ? true : false; + const TString8 agente = row.get(sheet.cid2index(S_AGENTE)); + const int giorno = row.get_int(sheet.cid2index(S_GIORNO)); + const long cliente = row.get_long(sheet.cid2index(S_CLIENTE)); + const long ordpass = row.get_long(sheet.cid2index(S_ORDPASS)); + const TString8 orapass = row.get(sheet.cid2index(S_ORAPASS)); + + const TGiri_key gkey(agente, giorno, cliente); + const TString80 codtab = gkey.key(); + + chiavi.add(codtab, codtab); + + //se esiste un'altra riga sullo sheet con la stessa chiave, lo segnala e chiede se sovrascrivere quella già registrata + if(chiavi.is_key(codtab)) + { + TString msg; + msg << "Attenzione: il passaggio dell'agente " << agente << " presso il cliente " << cliente << " previsto per il giorno " << itow(giorno) + << " risulta duplicato. Si desidera sovrascrivere?"; + if(!yesno_box(msg)) + continue; + } + + //cancella le righe contrassegnate e aggiorna le altre + giri.put("CODTAB", codtab); + if (!cancella) + { + giri.put("I0", ordpass); + giri.put("S0", orapass); + giri.rewrite_write(); + } + else + giri.remove(); + } + riempi_sheet(); +} + +//ON_FIELD_EVENT: gestisce i comportamenti modificati dei bottoni e dello sheet +bool TGestione_giri_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_FINDREC: + if(e == fe_button) + { + riempi_sheet(); + return false; + } + break; + case DLG_SAVEREC: + if(e == fe_button) + { + registra(); + return false; + } + break; + case F_SHEET: + if(e == se_notify_add) + aggiungi_riga(); + break; + default: break; + } + return true; +} + +TGestione_giri_msk::TGestione_giri_msk() + : TAutomask ("ha3100a") +{} + +/////////////////////////////////////// +// TSkeleton_application +/////////////////////////////////////// +class TGestione_giri_app : public TSkeleton_application +{ +protected: + virtual const char * extra_modules() const {return "ha";} + void elabora(const TMask& msk); + +public: + virtual void main_loop(); + virtual bool create(); +}; + + + +void TGestione_giri_app::elabora(const TMask& msk) +{} + +void TGestione_giri_app::main_loop() +{ + TGestione_giri_msk msk; + while (msk.run() == K_ENTER) + elabora(msk); +} + +bool TGestione_giri_app::create() +{ + return TSkeleton_application::create(); +} + +int ha3100 (int argc, char* argv[]) +{ + TGestione_giri_app elabapp; + elabapp.run(argc, argv, APPNAME); + return 0; +} \ No newline at end of file diff --git a/ha/ha3100a.h b/ha/ha3100a.h new file mode 100755 index 000000000..fb5c2393b --- /dev/null +++ b/ha/ha3100a.h @@ -0,0 +1,16 @@ +//Campi maschera ha3100 +#define F_AGENTE 201 +#define F_DESAGENTE 202 +#define F_CLIENTE 203 +#define F_DESCLIENTE 204 +#define F_GIORNO 205 +#define F_SHEET 206 + +#define S_CANC 101 +#define S_AGENTE 102 +#define S_RAGSOC 103 +#define S_GIORNO 104 +#define S_CLIENTE 105 +#define S_CLIRAGSOC 106 +#define S_ORDPASS 107 +#define S_ORAPASS 108 \ No newline at end of file diff --git a/ha/ha3100a.uml b/ha/ha3100a.uml new file mode 100755 index 000000000..e6c9e58d2 --- /dev/null +++ b/ha/ha3100a.uml @@ -0,0 +1,200 @@ +#include "ha3100a.h" + +TOOLBAR "" 0 0 0 2 + +BUTTON DLG_FINDREC 2 2 +BEGIN + PROMPT 3 1 "Ricerca" + PICTURE TOOL_FINDREC +END + +BUTTON DLG_SAVEREC 2 2 +BEGIN + PROMPT 1 1 "Salva" + PICTURE TOOL_SAVEREC +END + +#include +ENDPAGE + +PAGE "Gestione giri" 0 2 0 0 + +GROUPBOX DLG_NULL 80 5 +BEGIN + PROMPT 1 1 "@bFitri" +END + +STRING F_AGENTE 5 +BEGIN + PROMPT 2 2 "Filtra agente " + USE LF_AGENTI + INPUT CODAGE F_AGENTE + DISPLAY "Codice" CODAGE + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_AGENTE CODAGE + OUTPUT F_DESAGENTE RAGSOC + CHECKTYPE NORMAL +END + +STRING F_DESAGENTE 50 +BEGIN + PROMPT 27 2 "" + USE LF_AGENTI KEY 2 + INPUT RAGSOC F_DESAGENTE + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODAGE + COPY OUTPUT F_AGENTE + CHECKTYPE NORMAL +END + +NUMBER F_CLIENTE 6 +BEGIN + PROMPT 2 3 "Filtra cliente" + FLAGS "ZU" + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_CLIENTE + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CLIENTE CODCF + OUTPUT F_DESCLIENTE RAGSOC + CHECKTYPE NORMAL + ADD RUN cg0 -1 +END + +STRING F_DESCLIENTE 50 +BEGIN + PROMPT 27 3 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF "C" + INPUT RAGSOC F_DESCLIENTE + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODCF + COPY OUTPUT F_CLIENTE + CHECKTYPE NORMAL + ADD RUN cg0 -1 +END + +LISTBOX F_GIORNO 1 10 +BEGIN + PROMPT 2 4 "Giorno " + ITEM "0|" + ITEM "1|Lunedì" + ITEM "2|Martedì" + ITEM "3|Mercoledì" + ITEM "4|Giovedì" + ITEM "5|Venerdì" + ITEM "6|Sabato" + ITEM "7|Domenica" +END + +SPREADSHEET F_SHEET 0 -1 +BEGIN + PROMPT 1 6 "Giri" + ITEM "Canc." + ITEM "Agente@6" + ITEM "Ragione Sociale@25" + ITEM "Giorno@10" + ITEM "Cliente@6" + ITEM "Ragione Sociale@25" + ITEM "Ordine\nPassaggio@9" + ITEM "Ora\nPassaggio@9" +END + +ENDPAGE +ENDMASK + +TOOLBAR "" 0 0 0 2 + +#include + +ENDPAGE + +PAGE "Giri" 0 2 0 0 + +GROUPBOX DLG_NULL 80 8 +BEGIN + PROMPT 1 0 "@bRiga" +END + +BOOLEAN S_CANC +BEGIN + PROMPT 2 1 "Cancellare" +END + +STRING S_AGENTE 5 +BEGIN + PROMPT 2 2 "Agente " + USE LF_AGENTI + INPUT CODAGE S_AGENTE + DISPLAY "Codice" CODAGE + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT S_AGENTE CODAGE + OUTPUT S_RAGSOC RAGSOC + CHECTYPE REQUIRED +END + +STRING S_RAGSOC 50 +BEGIN + PROMPT 19 2 "" + USE LF_AGENTI KEY 2 + INPUT RAGSOC S_RAGSOC + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODAGE + COPY OUTPUT S_AGENTE + CHECTYPE NORMAL +END + +LISTBOX S_GIORNO 1 10 +BEGIN + PROMPT 2 3 "Giorno " + ITEM "1|Lunedì" + ITEM "2|Martedì" + ITEM "3|Mercoledì" + ITEM "4|Giovedì" + ITEM "5|Venerdì" + ITEM "6|Sabato" + ITEM "7|Domenica" +END + +NUMBER S_CLIENTE 6 +BEGIN + PROMPT 2 4 "Cliente " + FLAGS "ZU" + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF S_CLIENTE + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT S_CLIENTE CODCF + OUTPUT S_CLIRAGSOC RAGSOC + CHECKTYPE REQUIRED + ADD RUN cg0 -1 +END + +STRING S_CLIRAGSOC 50 +BEGIN + PROMPT 19 4 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF "C" + INPUT RAGSOC S_CLIRAGSOC + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODCF + COPY OUTPUT S_CLIENTE + CHECKTYPE NORMAL + ADD RUN cg0 -1 +END + +NUMBER S_ORDPASS 3 +BEGIN + PROMPT 2 6 "Ordine di passaggio " +END + +STRING S_ORAPASS 5 +BEGIN + PROMPT 35 6 "Ora arrivo " + PICTURE "@@:@@" +END + +ENDPAGE +ENDMASK