diff --git a/src/include/odbcrset.h b/src/include/odbcrset.h index 675547b9d..3b39ed5a9 100755 --- a/src/include/odbcrset.h +++ b/src/include/odbcrset.h @@ -71,7 +71,7 @@ public: const TString& dsn() const { return _dsn; } const char * table_name(); - TODBC_recordset(const char* sql, const bool freezed = false); + TODBC_recordset(const char* sql = "", const bool freezed = false); virtual ~TODBC_recordset(); }; diff --git a/src/include/postman.cpp b/src/include/postman.cpp index a65f467ad..4e91d7a45 100755 --- a/src/include/postman.cpp +++ b/src/include/postman.cpp @@ -3,9 +3,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -20,12 +22,15 @@ class TRecipient : public TObject TString _address; TString _group; TString _expr; + TString _files; public: const TString& address() const { return _address; } - const TString& group() const { return _group; } + const TString& group() const { return _group; } + const TString& files() const { return _files; } void add_expr(char op, const TString& expr); bool can_receive(const TRectype& rec) const; + void add_files(const TString& files) { _files = files; } virtual bool ok() const { return _address.not_empty() && _expr.not_empty(); } @@ -49,6 +54,7 @@ void TRecipient::add_expr(char op, const TString& expr) _expr << 1; else _expr << '(' << expr << ')'; + } bool TRecipient::can_receive(const TRectype& rec) const @@ -109,7 +115,7 @@ protected: void add_expr(const TString& addr, char op, const TString& expr); - + void add_files(const TString& addr, const TString& files); void load_filters(); public: @@ -137,22 +143,40 @@ void TPostman::test_firm() } void TPostman::add_expr(const TString& addr, - char op, const TString& expr) + char op, const TString& expr) { - for (int r = _recipient.last(); r >= 0; r--) - { - TRecipient& rec = recipient(r); - if (rec.address() == addr) - { - rec.add_expr(op, expr); - break; - } - else - { - if (rec.group() == addr) - rec.add_expr(op, expr); - } - } + for (int r = _recipient.last(); r >= 0; r--) + { + TRecipient& rec = recipient(r); + if (rec.address() == addr) + { + rec.add_expr(op, expr); + break; + } + else + { + if (rec.group() == addr) + rec.add_expr(op, expr); + } + } +} + +void TPostman::add_files(const TString& addr, const TString& files) +{ + for (int r = _recipient.last(); r >= 0; r--) + { + TRecipient& rec = recipient(r); + if (rec.address() == addr) + { + rec.add_files(files); + break; + } + else + { + if (rec.group() == addr) + rec.add_files(files); + } + } } bool TPostman::can_dispatch_transaction(const TRectype& rec) @@ -165,8 +189,8 @@ bool TPostman::can_dispatch_transaction(const TRectype& rec) _recipient.destroy(); TConfig cfg(CONFIG_DITTA, "MailTransactions"); - TAuto_token_string str; - TString addr, opr, expr; + TToken_string str("", '¦'); + TString addr, opr, expr, files; // Costruisce la lista dei destinatari for (int r = 0; cfg.exist("Recipient", r); r++) @@ -180,16 +204,20 @@ bool TPostman::can_dispatch_transaction(const TRectype& rec) // Costruisce i filtri per i destinatari for (int f = 0; cfg.exist("Filter", f); f++) { + str = cfg.get("Filter", NULL, f); expand_sys_vars(str); + str.get(0, addr); const int num = str.get_int(1); - if (num != lognum) continue; - str.get(0, addr); + if (num != lognum) + continue; str.get(2, opr); - str.get(3, expr); - add_expr(addr, opr[0], expr); + str.get(3, expr); + str.get(4, files); + add_expr(addr, opr[0], expr); + add_files(addr, files); } // Elimina destinatari inutili @@ -265,6 +293,227 @@ static int write_xml(TConfig& cfg, void* jolly) return 0; } +typedef enum { db_add, db_update, db_remove } db_op; + +HIDDEN const TString & build_statement(const db_op op, int logicnum, const TString_array & keys, const TString_array & values) +{ + TString & statement = get_tmp_string(); + TString table_name; + const int firm = prefix().get_codditta(); + + if (firm > 0) + table_name << format("%05lda", firm) << '_'; + table_name << logic2table(logicnum); + if (op == db_add) + { + statement << "INSERT INTO [" << table_name << "] ("; + FOR_EACH_ARRAY_ROW(values, r, row) + { + if (r > 0) + statement << ", "; + statement << row->get(0); + } + statement << ") VALUES ("; + FOR_EACH_ARRAY_ROW(values, rk, rowk) + { + if (rk > 0) + statement << ", "; + statement << rowk->get(1); + } + statement << ')'; + } + else + if (op == db_update) + { + statement << "UPDATE [" << table_name << "] SET "; + FOR_EACH_ARRAY_ROW(values, r, row) + { + if (r > 0) + statement << ", "; + statement << *row; + } + statement << " WHERE"; + FOR_EACH_ARRAY_ROW(keys, rk, rowk) + { + if (rk > 0) + statement << " AND"; + statement << ' ' << *rowk; + } + } + else + if (op == db_remove) + { + statement << "DELETE FROM [" << table_name << "] WHERE "; + FOR_EACH_ARRAY_ROW(keys, rk, rowk) + { + if (rk > 0) + statement << " AND"; + statement << ' ' << *rowk; + } + } + statement << ';'; + return statement; +} + +HIDDEN void odbc_send(const TString & dsn, int num, TAuto_token_string & elab_files, const TFilename & name) +{ + TODBC_recordset recset; + TToken_string odbc_str(dsn.mid(5), ','); + TString_array files; + TString_array keys; + TString_array values; + TConfig ini(name); ini.set_paragraph("Transaction"); + TString tr_type = ini.get("Action"); tr_type.upper(); + TString main_file; + + main_file << num; + db_op op = db_add; + + odbc_str.rtrim(1); + if (tr_type == TRANSACTION_INSERT) + op = db_add; + else + if (tr_type == TRANSACTION_MODIFY) + op = db_update; + else + if (tr_type == TRANSACTION_DELETE) + op = db_remove; + if (!recset.connect(odbc_str.get(0), odbc_str.get(1), odbc_str.get(2))) + { + error_box(FR("Non posso connettermi a (%s)"), (const char *)odbc_str); + return; + } + ini.list_paragraphs(files); + FOR_EACH_ARRAY_ROW(files, i, row) + { + TString curr_file = *row; + const int pos = curr_file.find(","); + TToken_string rowkey("", ','); + + if (pos > 0) + { + rowkey = curr_file.mid(pos + 1); + curr_file = curr_file.left(pos); + } + + int curr_file_num = atoi(curr_file); + const bool to_elab = (curr_file_num > 0) && (elab_files.blank() || elab_files.find(curr_file) >= 0); + + if (to_elab) + { + keys.destroy(); + values.destroy(); + ini.set_paragraph(*row); + TTrec wrk(curr_file_num); + int nfields = wrk.fields(); + + for (int i = 0; i < nfields; i++) + { + TToken_string def = wrk.fielddef(i); + TString field(def.get(0)); + TFieldtypes t = (TFieldtypes)def.get_int(1); + TToken_string row(field, '='); + + TString str = ini.get(field); + TString val; + + str.strip("\""); + switch (t) + { + case _alfafld: + case _charfld: + case _datefld: + case _memofld: + val << '\'' << str << '\''; + break; + case _intfld: + case _longfld: + case _realfld: + case _wordfld: + case _intzerofld: + case _longzerofld: + val = str.blank() ? "0" : str; + break; + case _boolfld: + val = str.blank() ? "'FALSE'" : "'TRUE'"; + break; + default: + val = str; + break; + } + row.add(val); + values.add(row); + } + + TToken_string key(wrk.keydef(), '+'); + int pos = key.find("|"); + + if (pos > 0) + key = key.left(pos); + FOR_EACH_STR_TOKEN(key, field) + { + TToken_string row(field, '='); + int pos = field.find("["); + + if (pos > 0) + field = field.left(pos); + + TString str = ini.get(field); + + if (str.blank()) + { + ini.set_paragraph(main_file); + str = ini.get(field); + if (str.blank()) + str << rowkey.get(); + ini.set_paragraph(*row); + } + + TToken_string def = wrk.fielddef(wrk.field(field)); + TFieldtypes t = (TFieldtypes)def.get_int(1); + TString val; + + str.strip("\""); + switch (t) + { + case _alfafld: + case _charfld: + case _datefld: + case _memofld: + val << '\'' << str << '\''; + break; + case _intfld: + case _longfld: + case _realfld: + case _wordfld: + case _intzerofld: + case _longzerofld: + val = str.blank() ? "0" : str; + break; + case _boolfld: + val = str.blank() ? "'FALSE'" : "'TRUE'"; + break; + default: + val = str; + break; + } + row.add(val); + keys.add(row); + } + const TString & statement = build_statement(op, curr_file_num, keys, values); + int err = recset.exec(statement); + + if (op < db_remove && err <= 0) + { + const TString & statement = build_statement(op == db_add ? db_update : db_add, curr_file_num, keys, values); + + err = recset.exec(statement); + } + if (err <= 0) + error_box(FR("Errore file %d invio n. %d"), curr_file_num, err); + } + } +} bool TPostman::dispatch_transaction(const TRectype& rec, const TFilename& name) { @@ -274,6 +523,8 @@ bool TPostman::dispatch_transaction(const TRectype& rec, TToken_string dest; TToken_string file_dest; TToken_string soap_dest; + TToken_string odbc_dest; + TToken_string odbc_files; TString last_error; for (int r = 0; r < _recipient.items(); r++) @@ -281,7 +532,7 @@ bool TPostman::dispatch_transaction(const TRectype& rec, const TRecipient& a = recipient(r); if (a.can_receive(rec)) { - const TString& addr = a.address(); + TString addr = a.address(); if (addr.starts_with("http")) // Indirizzo http soap_dest.add(addr); else if (addr.find('@') > 0) // Indirizzo posta @@ -291,17 +542,26 @@ bool TPostman::dispatch_transaction(const TRectype& rec, if (fexist(addr)) file_dest.add(addr); else - { - if (addr != last_error) - { - ok = error_box(FR("Non esiste la cartella di destinazione %s"), (const char*)addr); - last_error = addr; - } - } + if (addr.starts_with("ODBC")) + { + if (addr.mid(4).blank()) + addr << '(' << ini_get_string(CONFIG_DITTA, "MailTransactions", "ODBCDSN") + << ',' << ini_get_string(CONFIG_DITTA, "MailTransactions", "ODBCUser") + << ',' << decode(ini_get_string(CONFIG_DITTA, "MailTransactions", "ODBCPassword")) << ')'; + odbc_dest.add(addr); + odbc_files.add(a.files()); + } + else + { + if (addr != last_error) + { + ok = error_box(FR("Non esiste la cartella di destinazione %s"), (const char*)addr); + last_error = addr; + } + } } } } - if (dest.items() > 0) { TMail_message msg(dest.get(0)); @@ -413,6 +673,19 @@ bool TPostman::dispatch_transaction(const TRectype& rec, socket.HttpSoap(id, buf); } } + + if (odbc_dest.items() > 0) + { + odbc_files.restart(); + FOR_EACH_TOKEN(odbc_dest, r) + { + const TString & dsn = r; + TAuto_token_string files = odbc_files.get(); + + ::odbc_send(dsn, rec.num(), files, name); + } + remove_file(name); + } } return ok; } diff --git a/src/ps/Diana2000/LaundryInstall.7z b/src/ps/Diana2000/LaundryInstall.7z new file mode 100644 index 000000000..1d9a1df80 Binary files /dev/null and b/src/ps/Diana2000/LaundryInstall.7z differ diff --git a/src/ps/Dinamica/CUSTOM/orf_trasp.msk b/src/ps/Dinamica/CUSTOM/orf_trasp.msk new file mode 100644 index 000000000..95697ee59 --- /dev/null +++ b/src/ps/Dinamica/CUSTOM/orf_trasp.msk @@ -0,0 +1,136 @@ +PA "Stampa Ordini per Fornitore " -1 -1 80 12 + +ST 30 70 50 +BE +PR 2 -2 "Profilo " +PSELECT +GR 1 +EN + +GR -1 27 5 +BE +PR 1 1 "Seleziona date limite" +FL "" +EN + +DA 503 +BE +PR 2 2 "Da Data " +FI S_DADATA +GR 1 +EN +DA 504 +BE +PR 3 4 "A Data " +FI S_ADATA +GR 2 +EN + +ST 108 6 +BE +PR 2 6 "Da Fornitore " +WA "Fornitore assente" +HE "Codice del Fornitore del documento" +FL "R" +FI S_DACLI +US 20 KEY 1 +IN TIPOCF "F" +IN CODCF 108 +DI "Codice" CODCF +DI "Ragione Sociale@70" RAGSOC +OU 108 CODCF +OU 301 RAGSOC +CH NORMAL +ADD RU cg0 -1 F +EN +ST 301 50 +BE +WA "Fornitore assente" +HE "Ragione sociale del Fornitore del documento" +PR 26 6 "" +GR 1 +US 20 KEY 2 +IN TIPOCF "F" +IN RAGSOC 301 +DI "Ragione Sociale@70" RAGSOC +DI "Codice" CODCF +OU 108 CODCF +OU 301 RAGSOC +CH NORMAL +ADD RU cg0 -1 F +EN + +ST 109 6 +BE +PR 3 8 "A Fornitore " +WA "Fornitore assente" +HE "Codice del Fornitore del documento" +FL "R" +FI S_ACLI +US 20 KEY 1 +IN TIPOCF "F" +IN CODCF 109 +DI "Codice" CODCF +DI "Ragione Sociale@70" RAGSOC +OU 109 CODCF +OU 302 RAGSOC +CH NORMAL +ADD RU cg0 -1 F +EN + +ST 302 50 +BE +WA "Fornitore assente" +HE "Ragione sociale del Fornitore del documento" +PR 26 8 "" +GR 1 +US 20 KEY 2 +IN TIPOCF "F" +IN RAGSOC 302 +DI "Ragione Sociale@70" RAGSOC +DI "Codice" CODCF +OU 109 CODCF +OU 302 RAGSOC +CH NORMAL +ADD RU cg0 -1 F +EN + +EN + +TOOLBAR "" 0 0 0 2 +BU 1 2 2 +BE +PR 1 1 "Conferma" +PI 101 +EN +BU -1 2 2 +BE +PR -1 1 "" +PI 0 +EN +BU 33 2 2 +BE +PR 1 1 "Info" +ME EXIT,332 +PI 162 +EN +BU 34 2 2 +BE +PR 2 1 "Help" +ME EXIT,331 +PI 163 +EN +BU -1 2 2 +BE +PR -1 0 "" +PI 0 +EN +BU 9 2 2 +BE +PR 3 1 "Fine" +ME EXIT,20334 +PI 114 +EN +EN + +ENDMASK diff --git a/src/ps/Dinamica/CUSTOM/orf_trasp.rep b/src/ps/Dinamica/CUSTOM/orf_trasp.rep new file mode 100644 index 000000000..17f8bcb24 --- /dev/null +++ b/src/ps/Dinamica/CUSTOM/orf_trasp.rep @@ -0,0 +1,246 @@ + + + Controllo Ordini Fornitore + + +