From 51f32393e7baa7193d1bf51a199f78484c3b3174 Mon Sep 17 00:00:00 2001 From: Francesco_Fucarino Date: Wed, 21 Apr 2021 10:11:23 +0200 Subject: [PATCH] Patch level : 12.0 1056 Files correlati : bs.exe bs0200.uml/cpp creazione bs0500a.h bs0500a.uml bs0500.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ora separata completamente con ripristino per clienti usanti old version (chiastra). Aggiunte nuove unit necessarie e punto di menĂ¹ --- build/bs0.vcxproj | 3 + build/bs0.vcxproj.filters | 9 + src/bs/bs0.cpp | 3 +- src/bs/bs0.h | 1 + src/bs/bs0200.cpp | 200 ----- src/bs/bs0200a.h | 6 - src/bs/bs0200a.uml | 49 -- src/bs/bs0500.cpp | 1722 +++++++++++++++++++++++++++++++++++++ src/bs/bs0500a.h | 36 + src/bs/bs0500a.uml | 298 +++++++ src/bs/bsmenu.men | 2 +- 11 files changed, 2072 insertions(+), 257 deletions(-) create mode 100644 src/bs/bs0500.cpp create mode 100644 src/bs/bs0500a.h create mode 100644 src/bs/bs0500a.uml diff --git a/build/bs0.vcxproj b/build/bs0.vcxproj index 5e358600e..28ab32587 100644 --- a/build/bs0.vcxproj +++ b/build/bs0.vcxproj @@ -182,6 +182,7 @@ + @@ -193,6 +194,7 @@ false + @@ -204,6 +206,7 @@ + diff --git a/build/bs0.vcxproj.filters b/build/bs0.vcxproj.filters index 2e9567ba3..09acf3595 100644 --- a/build/bs0.vcxproj.filters +++ b/build/bs0.vcxproj.filters @@ -50,6 +50,9 @@ Sources + + Sources + @@ -69,6 +72,9 @@ Masks + + Masks + @@ -95,6 +101,9 @@ Headers + + Headers + diff --git a/src/bs/bs0.cpp b/src/bs/bs0.cpp index b6d68dcce..fd86ae6e5 100644 --- a/src/bs/bs0.cpp +++ b/src/bs/bs0.cpp @@ -8,7 +8,8 @@ int main(int argc, char** argv) { case 1: bs0200(argc, argv); break; // Importazioni Beestore case 2: bs0300(argc, argv); break; // Importazione da SKNET - case 3: bs0400(argc, argv); break; // Tabelle di transazione + case 3: bs0400(argc, argv); break; // Tabelle di transazione + case 4: bs0500(argc, argv); break; // Importazioni BeeStore Inmaven default: bs0100(argc, argv); break; // Trasferimento Beestore Impostazione } return 0; diff --git a/src/bs/bs0.h b/src/bs/bs0.h index b0da9e284..ace0c542f 100644 --- a/src/bs/bs0.h +++ b/src/bs/bs0.h @@ -2,3 +2,4 @@ int bs0100(int argc, char* argv[]); int bs0200(int argc, char* argv[]); int bs0300(int argc, char* argv[]); int bs0400(int argc, char* argv[]); +int bs0500(int argc, char* argv[]); diff --git a/src/bs/bs0200.cpp b/src/bs/bs0200.cpp index deb9e6f7d..029963756 100644 --- a/src/bs/bs0200.cpp +++ b/src/bs/bs0200.cpp @@ -191,7 +191,6 @@ protected: void sync_generici (const TDate& dal , const TDate& al) { sync_mov(4, dal, al);} void sync_clifo (int cfmask, const TDate& dal, const TDate& al); void sync_listino (const TString& listino); - void sync_fatbol(const TDate& dal, const TDate& al); public: virtual bool create(); @@ -1409,199 +1408,6 @@ void TBeeStore_sync::sync_corrisp(const TDate&, const TDate&) } } -void TBeeStore_sync::sync_fatbol(const TDate& dal, const TDate& al) -{ - - const TString8 codcausdef = ini_get_string(CONFIG_DITTA, "bs", MOVMAG_CODCAUS, "", 2); - /* - if (codcausdef.blank()) - { - _log->log(2, "Configurare parametri per movimenti Bee Store"); - return; - } - */ - - TString str(255); - str << "SELECT tieDMovMag.*,tieTBolFat.* FROM tieDMovMag,tieTBolFat WHERE tieDMovMag.Origine=1 AND tieDMovMag.TipoTestata=2 AND tieDMovMag.CodTestata=tieTBolFat.Cod_PK"; // verificare - if (dal.ok() || al.ok()) - { - str << " AND DataMov"; - if (dal.ok() && al.ok()) - str << " BETWEEN " << date2sql(dal) << " AND " << date2sql(al); - else - { - if (dal.ok()) - str << ">=" << date2sql(dal); - else - str << "<=" << date2sql(al); - } - } - str << "\nORDER BY CodTestata,NumRiga"; - - TODBC_recordset docs(str); - docs.connect(_dsn, _usr, _psw); - TProgress_monitor pi(docs.items(), str); - - long num_doc = -1, nd, codcf; - TString test_doc = "", test_nd; - TString4 tipocf; - TDocumento* doc = nullptr; - int contatore = 0; - int eccezioni_errori = 0; - TString codpk = ""; - for (bool ok = docs.move_first(); ok; ok = docs.move_next()) - { - TToken_string test(docs.get("CodTestata").as_string(), '\\'); - - test_nd = (docs.get("CodTestata").as_string()); - - nd = atol(test.get()); - TString wrk = docs.get("CodCliente").as_string(); - - while (wrk[0] >= 'A') - wrk.ltrim(1); - - codcf = atol(wrk); - tipocf = docs.get("TipoIntestatario").as_string(); - - if (tipocf != "C") // verificare - tipocf = "F"; - - if (test_nd != test_doc) - // if (nd != num_doc) - { - if (num_doc > 0 && !save_and_delete_doc(doc)) - break; - /* - if (test_doc != "") - if (test_doc != test_nd) - save_and_delete_doc(doc); - */ - num_doc = nd; - test_doc = test_nd; - - TString tre = test_doc.right(3); - const TDate datadoc = docs.get("DataMov").as_date(); - TString cod_pk= docs.get("Cod_PK").as_string(); - TString8 numdoc = docs.get("NumDoc").as_string(); - TString8 tipodoc = docs.get("TipoDocCE").as_string(); - TString origine_dc = docs.get("Origine").as_string(); - - if (tipodoc.not_empty() && (tipodoc!=" ")) { - - TTipo_documento tipo(tipodoc); - const TString8 codcaus = tipo.caus_mov().blank() ? codcausdef : tipo.caus_mov(); - - //doc = new TDocumento('D', datadoc.year(), numdoc, nd); //meglio usare TDocumento(char provv, int anno, const char* codnum, long numdoc); - doc = new TDocumento('D', datadoc.year(), tipodoc, strtol(numdoc, nullptr, 0)); - - doc->put(DOC_DATADOC, datadoc); - doc->put(DOC_TIPODOC, tipodoc); - doc->put(DOC_TIPOCF, tipocf); - doc->put(DOC_CODCF, codcf); - doc->cli2doc(); - - const TString8 codval = docs.get("CodValuta").as_string(); - const real cambio = docs.get("CambioValuta").as_real(); - const TString asp = docs.get("AspettoBeni").as_string(); - const int ncolli = docs.get("NumeroColli").as_int(); - // inserire codice pagamento Es. BB02 - doc->put(DOC_CODVAL, codval); - doc->put(DOC_CAMBIO, cambio); - doc->put(DOC_ASPBENI1, asp.sleft(50)); - doc->put(DOC_ASPBENI2, asp.smid(50)); - doc->put(DOC_NCOLLI, ncolli); - doc->put(DOC_CAUSMAG, codcaus); - contatore++; - } - else - { - eccezioni_errori++; - codpk = cod_pk; - TString dserrore = docs.get("DSErrore").as_string(); - dserrore << " TipoDocCe assente o invalido"; - TString update_str = ""; - update_str << "UPDATE tieTBolFat \n SET Errore=1, DSErrore = '" << dserrore << "' \n WHERE cod_pk= '" << codpk << "' "; - TODBC_recordset docs(update_str); - docs.connect(_dsn, _usr, _psw); - docs.exec(update_str); - } - } - TString8 tipodoc = docs.get("TipoDocCE").as_string(); - if (tipodoc.not_empty() && (tipodoc != " ")) { - const int tipoart = docs.get("TipoArticolo").as_int(); - // inutile per noi TString4 tiporiga = tipoart == 2 ? "04" : "02"; - TRectype& rdoc = doc->new_row("01"); - const TString80 codart = docs.get("CodArticolo").as_string(); - - rdoc.put(RDOC_CODART, codart); - if (tipoart == 2) //righe libere - { - if (cache().get("SPP", codart).not_empty()) - rdoc.put(RDOC_CODARTMAG, codart); - } - else //spese servizi e articoli - { - if (cache().get(LF_ANAMAG, codart).not_empty()) - rdoc.put(RDOC_CODARTMAG, codart); - } - - rdoc.put(RDOC_CODARTMAG, codart); - //rdoc.check_row(); - - const TString descr = docs.get("DSRiga").as_string(); - rdoc.put(RDOC_DESCR, descr.sleft(50)); - if (descr.len() > 50) - { - rdoc.put(RDOC_DESCLUNGA, "X"); - rdoc.put(RDOC_DESCEST, descr.smid(50)); - } - rdoc.put(RDOC_CODMAG, docs.get("CodMagazzino").as_string().left(5)); - rdoc.put(RDOC_CODMAGC, docs.get("CodMagazDest").as_string().left(5)); - rdoc.put(RDOC_UMQTA, docs.get("CodUntMis").as_string()); - rdoc.put(RDOC_QTA, docs.get("Quantita").as_real()); - rdoc.put(RDOC_PREZZO, docs.get("PrzNettoNeg").as_real()); // o PrzNettoValuta ?? - - /* - real valsconto1(docs.get("Sconto1").as_real()); - real valsconto2(docs.get("Sconto2").as_real()); - real valsconto3(docs.get("Sconto3").as_real()); - TString80 sconto; - - if (valsconto1 != ZERO) - sconto << valsconto1.stringa(6, 2); - if (valsconto2 != ZERO) - { - if (sconto.full()) - sconto << "+"; - sconto << valsconto2.stringa(6, 2); - } - if (valsconto3 != ZERO) - { - if (sconto.full()) - sconto << "+"; - sconto << valsconto3.stringa(6, 2); - } - rdoc.put(RDOC_SCONTO, sconto); - */ - rdoc.put(RDOC_CODIVA, docs.get("CodIva").as_string()); - } - if (!pi.add_status()) - break; - - } - save_and_delete_doc(doc); // Salva ultimo documento in sospeso - str.cut(0); - str.format(TR("Documenti importati %ld record in %s"), contatore, "tieTBolFat"); - _log->log(0, ""); - _log->log(0, str); - if (eccezioni_errori > 0) - { - str.cut(0); - str.format(TR("Errori in importazione %ld record in %s"), eccezioni_errori, "tieTBolFat"); - _log->log(0, str); - } -} bool TBeeStore_sync::create() { @@ -1676,12 +1482,6 @@ void TBeeStore_sync::main_loop() if (mask.get_bool("SyncGenerici")) sync_generici(dal, al); - const TDate dalfat = mask.get_date("SyncDateFromF"); - const TDate alfat = mask.get_date("SyncDateToF"); - - if (mask.get_bool("SyncFatBol")) - sync_fatbol(dalfat, alfat); - _log->preview(); delete _log; _log = NULL; diff --git a/src/bs/bs0200a.h b/src/bs/bs0200a.h index be575eeb7..878b97e53 100644 --- a/src/bs/bs0200a.h +++ b/src/bs/bs0200a.h @@ -17,12 +17,6 @@ #define F_FORNITORI 116 #define F_BARCODE 117 -#define F_BBDAL 121 -#define F_BBAL 122 -#define F_FATBOL 123 -#define F_FFDAL 124 -#define F_FFAL 125 - #define F_C_CARSCAR 201 #define F_D_CARSCAR 202 #define F_C_DOCUMENTI 203 diff --git a/src/bs/bs0200a.uml b/src/bs/bs0200a.uml index 1bcf848b5..b871bbb75 100644 --- a/src/bs/bs0200a.uml +++ b/src/bs/bs0200a.uml @@ -132,55 +132,6 @@ END ENDPAGE -PAGE "Import: Bolle/Fatture/Scontr." 0 2 0 0 - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 1 "@bBolle" -END - -DATE F_BBDAL -BEGIN - PROMPT 2 3 "Dalla data di modifica " - FIELD SyncDateFromB -END - -DATE F_BBAL -BEGIN - PROMPT 42 3 " al " - FIELD SyncDateToB -END - -BOOLEAN F_FATBOL -BEGIN - PROMPT 2 7 "Importa da BeeStore le Fatture" - FIELD SyncFatBol -END - -DATE F_FFDAL -BEGIN - PROMPT 2 8 "Dalla data di modifica " - FIELD SyncDateFromF -END - -DATE F_FFAL -BEGIN - PROMPT 42 8 " al " - FIELD SyncDateToF -END - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 6 "@bFatture" -END - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 11 "@bOrdini" -END - -ENDPAGE - PAGE "Parametri" 0 2 0 0 GROUPBOX DLG_NULL 78 7 diff --git a/src/bs/bs0500.cpp b/src/bs/bs0500.cpp new file mode 100644 index 000000000..9f799ae2c --- /dev/null +++ b/src/bs/bs0500.cpp @@ -0,0 +1,1722 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../mg/mglib.h" +#include "../cg/cglib.h" +#include "../ve/velib.h" +#include +#include + +#include "bs0.h" + +#include "../fe/felib.h" +#include "../ve/condv.h" +#include "../ve/rcondv.h" + +#include +#include +#include +#include + +#include "bsutility.h" + +#define BS_DTULTAGG "DtUltAgg" + +/////////////////////////////////////////////////////////// +// TImporta_cache +/////////////////////////////////////////////////////////// + +class TImporta_cache : TCache +{ +protected: + virtual TObject* key2obj(const char* key) + { + const char tipo = *key; + const long codice = atol(key + 1); + return new TAnagrafica(LF_CLIFO, tipo, codice); + } + +public: + const TAnagrafica& anag(char tipo, long codice) + { + CHECKD((tipo == 'C' || tipo == 'F') && codice > 0L, "Codice cli/for non valido", codice); + TString8 key; key.format("%c%06ld", tipo, codice); + const TAnagrafica* a = (const TAnagrafica*)objptr(key); + return *a; + } + const TAnagrafica& anag(const TRectype& rec) + { + const char tipo = rec.get_char(CLI_TIPOCF); + const long codice = rec.get_long(CLI_CODCF); + return anag(tipo, codice); + } + const TAnagrafica& anag(const TISAM_recordset& rec) + { + return anag(rec.cursor()->curr()); + } +}; + +static TImporta_cache _anagr; + +/////////////////////////////////////////////////////////// +// TImporta_mask +/////////////////////////////////////////////////////////// + +class TImporta_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + void autoload(); + void autosave() const; + + bool get_bool(const char* fld) + { + TMask_field* f = find_by_fieldname(fld); return f ? f->get().full() : false; + } + + TDate get_date(const char* fld) + { + TMask_field* f = find_by_fieldname(fld); return TDate(f ? f->get() : EMPTY_STRING); + } + + TImporta_mask() : TAutomask("bs0500a") { autoload(); } + ~TImporta_mask() { autosave(); } +}; + +bool TImporta_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + if (e == fe_modify && !o.empty()) + { + const TFieldref* fr = o.field(); + if (fr && fr->name() == "CODCAUSC") + { + // Configura righe aggiuntive causale corrispettivi + TRecord_array rcaus(o.get(), LF_RCAUSALI); + if (!rcaus.exist(15) && yesno_box(TR("Si desidera configurare la causale per il collegamento a BeeStore?"))) + { + const char* codice[] = { "BEECN", "BEEBM", "BEECC", "BEEAS", "BEEAL", NULL }; + const char* descr[] = { "Contanti", "Bancomat", "Carta di credito", "Assegni", "Altro", NULL }; + + TTable dpn("%DPN"); + for (int i = 0; codice[i]; i++) + { + dpn.put("CODTAB", codice[i]); + dpn.put("S0", descr[i]); + dpn.write(); + TRectype& row = rcaus.row(15 + i, true); + row.put(RCA_CODDESC, codice[i]); + row.put(RCA_DESC, descr[i]); + } + rcaus.rewrite(); + TRectype caus(LF_CAUSALI); + caus.put(RCA_CODCAUS, o.get()); + caus.edit(); + } + } + } + return true; +} + +void TImporta_mask::autoload() +{ + // Carica i valori default dei parametri dal [bs] in ditta,ini + FOR_EACH_MASK_FIELD(*this, i, f) + { + const TFieldref* fr = f->field(); + if (fr != NULL) + f->set(ini_get_string(CONFIG_DITTA, "bs", fr->name())); + } +} + +void TImporta_mask::autosave() const +{ + // Salva i valori dei parametri in [bs] in ditta,ini + FOR_EACH_MASK_FIELD(*this, i, f) + { + const TFieldref* fr = f->field(); + if (fr != NULL) + ini_set_string(CONFIG_DITTA, "bs", fr->name(), f->get()); + } +} + +/////////////////////////////////////////////////////////// +// TImporta_sync +/////////////////////////////////////////////////////////// + +typedef bool TFieldEvaluator(const TISAM_recordset& rec, const char* fldname, const char* expr, TVariant& var); + +class TImporta_sync : public TSkeleton_application +{ + TString _dsn; + TString _usr; + TString _psw; + TFilename _sqlog; + TLog_report* _log; + +private: + const TString& comune(const TRecordset& recset, const char* fld_cap, const char* fld_den) const; + bool split_phone(const TRecordset& odbc, const char* number, TIsamfile& clifo, const char* pre, const char* num) const; + void load_clifo(char tipocf); + void save_clifo(int cfmask, const TDate& dal, const TDate& al); + void add_rmov(TMovimentoPN& mov, const real& importo, const TCausale& caus, const char* cod) const; + +protected: + bool save_and_delete_movmag(TMov_mag*& doc) const; + bool save_and_delete_doc(TDocumento*& doc) const; + + void load_origine_1(TISAM_recordset& out_set, const char* in_table, const TString_array& pairs); + void save_origine_2(TISAM_recordset& in_set, const char* out_table, const TString_array& pairs, TFieldEvaluator* feval = NULL); + + void sync_table(TISAM_recordset& in_set, const char* out_table, + const TString_array& pairs); + void sync_table(const char* in_table, const char* out_table, + const TString_array& fields, const TDate& dal, const TDate& al); + void sync_table(const int logicnum, const char* out_table, + const TString_array& fields, const TDate& dal, const TDate& al); + + void sync_iva(const TDate& dal, const TDate& al); + void sync_ums(const TDate& dal, const TDate& al); + void sync_lines(const TDate& dal, const TDate& al); + void sync_catmer(const TDate& dal, const TDate& al); + void sync_val(const TDate& dal, const TDate& al); + void sync_anamag(const TDate& dal, const TDate& al); + void sync_barcode(const TDate& dal, const TDate& al); + void sync_corrisp(const TDate& dal, const TDate& al); + void sync_mov(int tipotestata, const TDate& dal, const TDate& al); + void sync_scontrini(const TDate& dal, const TDate& al) { sync_mov(3, dal, al); } + void sync_doc(const TDate& dal, const TDate& al); + void sync_carscar(const TDate& dal, const TDate& al) { sync_mov(1, dal, al); } + void sync_generici(const TDate& dal, const TDate& al) { sync_mov(4, dal, al); } + void sync_clifo(int cfmask, const TDate& dal, const TDate& al); + void sync_listino(const TString& listino); + void sync_fatbol(const TDate& dal, const TDate& al); + +public: + virtual bool create(); + virtual void main_loop(); +}; + +// Carica da BeeStore i record con Origine=1, cioè generati da lui ed eventualmente aggiorna i corrispondenti in Campo +void TImporta_sync::load_origine_1(TISAM_recordset& out_set, const char* in_table, const TString_array& pairs) +{ + TString str(255); + str << "SELECT "; + FOR_EACH_ARRAY_ROW(pairs, f, row) + str << row->get(0) << ','; + str.rtrim(1); // toglie ultima virgola + str << "\nFROM " << in_table << " WHERE (Origine=1);"; + + TODBC_recordset odbc(str); + odbc.connect(_dsn, _usr, _psw); + const TRecnotype n = odbc.items(); + if (n > 0) + { + TLocalisamfile& file = out_set.cursor()->file(); + const RecDes& rd = file.curr().rec_des(); + TToken_string key_fields; + for (int i = 0; i < rd.Ky->NkFields; i++) + { + const int nf = rd.Ky[0].FieldSeq[i] % MaxFields; + key_fields.add(rd.Fd[nf].Name); + } + + str.format(TR("Importazione %ld record dalla tabella %s"), n, in_table); + _log->log(0, ""); + _log->log(0, str); + + TProgress_monitor pi(n, str); + for (bool ok = odbc.move_first(); ok; ok = odbc.move_next()) + { + file.zero(); + TString80 cfld, bfld; // Campo field e BeeStore field + FOR_EACH_ARRAY_ROW(pairs, p, row) + { + bfld = row->get(0); + cfld = row->get(); + const int pos = key_fields.get_pos(cfld); + if (pos >= 0) + { + const TVariant& var = odbc.get(bfld); + if (!var.is_null()) + file.put(cfld, var.as_string()); + if (pos == key_fields.items() - 1) + break; + } + } + + int err = file.read(_isequal, _lock); + if (err == NOERR) + { + bool dirty = false; + const TDate dataagg = file.get(CLI_DATAAGG); + TDate dtultagg = odbc.get(BS_DTULTAGG).as_date(); + if (!dtultagg.ok()) dtultagg = TODAY; + + str = "record"; + FOR_EACH_TOKEN(key_fields, f) + str << ' ' << file.get(f); + + if (dtultagg >= dataagg) + { + FOR_EACH_ARRAY_ROW(pairs, r, row) + { + bfld = row->get(0); + cfld = row->get(); + if (cfld[0] >= 'A' && cfld.find("->") < 0 && key_fields.get_pos(cfld) < 0) // Aggiorno solo i campi NON chiave + { + const TString& vec = file.get(cfld); + const TString& nov = odbc.get(bfld).as_string(); + if (nov != vec) + { + if (!dirty) + str << ' ' << bfld << "='" << nov << '\''; + file.put(cfld, nov); + dirty = true; + } + } + } + if (dirty) + { + TRectype& rec = file.curr(); + if (rec.exist(CLI_UTENTE)) + rec.put(CLI_UTENTE, "BEESTORE"); + if (rec.exist(CLI_DATAAGG)) + rec.put(CLI_DATAAGG, dtultagg); + } + else + str << " Nessuna variazione pertinente"; + } + else + str << " Data di ultimo aggiornamento obsoleta"; + if (dirty) + { + if (file.rewrite() == 0) + _log->log(1, str); + else + { + TString80 err; err << TR("ERRORE ") << err << TR(" aggiornando il "); + str.insert(err); + _log->log(2, str); + } + } + else + { + _log->log(0, str); + file.reread(_unlock); + } + } + else + if (err == _iskeynotfound) + { + file.zero(); + FOR_EACH_ARRAY_ROW(pairs, r, row) + { + bfld = row->get(0); + cfld = row->get(); + if (cfld[0] >= 'A' && cfld.find("->")) + { + const TString& nov = odbc.get(bfld).as_string(); + file.put(cfld, nov); + } + } + if (file.write() == 0) + _log->log(1, str); + else + { + TString80 msg; msg << TR("ERRORE ") << err << TR(" inserendo il "); + str.insert(msg); + _log->log(2, str); + } + } + } + + str.cut(0) << "DELETE FROM " << in_table << " WHERE Origine=1;"; + odbc.exec(str); + } +} + +void TImporta_sync::save_origine_2(TISAM_recordset& in_set, const char* out_table, const TString_array& fields, TFieldEvaluator* fval) +{ + const TRecnotype n = in_set.items(); + TString str(255); + TODBC_recordset odbc(str); + odbc.connect(_dsn, _usr, _psw); + str.cut(0) << "DELETE FROM " << out_table << " WHERE Origine=2;"; + odbc.exec(str); + + str.format(TR("Esportazione %ld record in %s"), n, out_table); + _log->log(0, ""); + _log->log(0, str); + + const TRectype& curr = in_set.cursor()->curr(); + + TProgress_monitor pi(n, str); + for (bool ok = in_set.move_first(); ok; ok = in_set.move_next()) + { + + str.cut(0) << "INSERT INTO " << out_table << "\n("; + FOR_EACH_ARRAY_ROW(fields, sr, srow) + str << (sr ? ", " : "") << srow->get(0); + str << ", Origine, Errore, " BS_DTULTAGG; + str << ")\nVALUES ("; + + FOR_EACH_ARRAY_ROW(fields, ir, irow) + { + if (ir) str << ", "; + if (fval) + { + const char* fname = irow->get(0); // BeeStore field name + const char* fexpr = irow->get(); // Campo expression + TVariant var; + if (fval(in_set, fname, fexpr, var)) + { + str << var2sql(var); + continue; + } + } + + const TFixed_string cfld = irow->get(1); + if (cfld.find("SCONTO") >= 0) + { + real sconto; + const TString& exp = curr.get(cfld); + if (exp.full()) + { + if (real::is_natural(exp)) + sconto = real(exp); + else + { + TString80 goodexp; real val_perc; + if (scontoexpr2perc(exp, false, goodexp, val_perc) && val_perc != UNO) + { + sconto = CENTO - CENTO * val_perc; + sconto.round(5); + } + } + } + str << var2sql(sconto); + } + else + if ((cfld[0] >= 'A' && cfld[0] <= 'Z') || cfld.find("->") > 0) + str << expr2sql(in_set, cfld); + else + str << cfld; + } + + str << ", 2, 0, GETDATE()"; + str << ");"; + + const long err = odbc.exec(str); + if (err <= 0) + { + TParagraph_string par(str, 75); + if (par.items() > 4) + { + str.cut(0); + bool values = false; + FOR_EACH_TOKEN(par, s) + { + if (str.full() && !values) + { + values = _strnicmp(s, "VALUES", 6) == 0; + if (!values) + continue; + } + str << s << '\n'; + } + str.trim(); + } + _log->log(1, str); + str.format("SQL error %d", abs(err)); + _log->log(2, str); + } + + if (!pi.add_status()) + break; + } + + odbc.exec("COMMIT;"); +} + +void TImporta_sync::sync_table(TISAM_recordset& in_set, const char* out_table, const TString_array& fields) +{ + load_origine_1(in_set, out_table, fields); + //save_origine_2(in_set, out_table, fields); +} + +static TString& build_query(const char* table, const TDate& dal, const TDate& al) +{ + TString& q = get_tmp_string(); + q << "USE " << table; + if (dal.ok() || al.ok()) + q << " SELECT BETWEEN(DATAAGG," << dal.date2ansi() << ',' << al.date2ansi() << ")"; + return q; +} + +static TString& build_query(const int logicnum, const TDate& dal, const TDate& al) +{ + const TRectype rec(logicnum); + TString& q = get_tmp_string(); + q << "USE " << logicnum; + + if (rec.exist(CLI_UTENTE)) + q << " SELECT (UTENTE!=\"BEESTORE\")"; + + if ((dal.ok() || al.ok()) && rec.exist(CLI_DATAAGG)) + { + if (q.find(" SELECT ") < 0) + q << " SELECT "; + else + q << "&&"; + q << "(BETWEEN(DATAAGG," << dal.date2ansi() << ',' << al.date2ansi() << "))"; + } + return q; +} + + +void TImporta_sync::sync_table(const char* table, const char* out_table, + const TString_array& fields, const TDate& dal, const TDate& al) +{ + const TString& q = build_query(table, dal, al); + TISAM_recordset set(q); + sync_table(set, out_table, fields); +} + +void TImporta_sync::sync_table(const int logicnum, const char* out_table, + const TString_array& fields, const TDate& dal, const TDate& al) +{ + const TString& q = build_query(logicnum, dal, al); + TISAM_recordset set(q); + sync_table(set, out_table, fields); +} + +void TImporta_sync::sync_ums(const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("CodUntMis|CODTAB"); + fields.add("DSUntMis|S0"); + sync_table("%UMS", "tieUntMisura", fields, dal, al); +} + +void TImporta_sync::sync_iva(const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("CodIva|CODTAB"); + fields.add("CodIvaSt|CODTAB"); + fields.add("DSIva|S0"); + fields.add("Aliquota|R0"); + + sync_table("%IVA", "tieIva", fields, dal, al); +} + +void TImporta_sync::sync_lines(const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("CodLinea|CODTAB"); + fields.add("DSLinea|S0"); + + TString query = build_query("GMC", dal, al); + if (query.find(" SELECT") < 0) + query << " SELECT "; + else + query << "&&"; + query << "(CODTAB?='???')"; + + TISAM_recordset lin(query); + sync_table(lin, "tieLineeArt", fields); +} + +void TImporta_sync::sync_catmer(const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("CodCategoriaMerceologica|CODTAB"); + fields.add("DSCategoriaMerceologica|S0"); + fields.add("CodTipoEtichetta|''"); + + sync_table("GMC", "tieCategorieMerceologiche", fields, dal, al); +} + +void TImporta_sync::sync_anamag(const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("CodPadre|" ANAMAG_CODART); + fields.add("DSArticolo|" ANAMAG_DESCR); + fields.add("DSArticoloAgg|" ANAMAG_DESCRAGG"[1,70]"); + fields.add("CodUntMagazzino|49->UM"); + fields.add("CodIva|" ANAMAG_CODIVA); + + fields.add("CodCategMerceologica|" ANAMAG_GRMERC); + fields.add("Bloccato|" ANAMAG_SOSPESO); + + TString query = build_query(LF_ANAMAG, dal, al); + query << "\nJOIN " << LF_UMART << " INTO CODART==CODART"; + + TISAM_recordset art(query); + sync_table(art, "tieArticoli", fields); + + /* + fields.destroy(); + fields.add("CodArticolo|" ANAMAG_CODART); + fields.add("CodPadre|" ANAMAG_CODART); + save_origine_2(art, "tieArtVarianti", fields); + */ +} + +void TImporta_sync::sync_barcode(const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("CodArticolo|" ANAMAG_CODART); + fields.add("BarCode|" ANAMAG_DESCR); + + TString str(255); + str << "SELECT "; + FOR_EACH_ARRAY_ROW(fields, f, row) + str << row->get(0) << ','; + str.rtrim(1); // toglie ultima virgola + str << "\nFROM tieArtBarCode WHERE (Origine=1);"; + + TODBC_recordset odbc(str); + odbc.connect(_dsn, _usr, _psw); + const TRecnotype n = odbc.items(); + if (n > 0) + { + TProgress_monitor pi(n, "Importazione codici a barre"); + for (bool go = odbc.move_first(); go; go = odbc.move_next()) + { + const TCodice_articolo ca = odbc.get("CodArticolo").as_string(); + const TCodice_articolo bc = odbc.get("BarCode").as_string(); + int tipo = 0; + switch (bc.len()) + { + case 8: tipo = 8; break; + case 13: tipo = 1; break; + default: break; + } + if (tipo) + { + TRecord_array codcor(ca, LF_CODCORR); + int n = 0; + for (n = codcor.last_row(); n > 0; n = codcor.pred_row(n)) + { + const TRectype& row = codcor.row(n); + if (row.get("CODARTALT") == bc && row.get_int("TIPO") == tipo) + break; // trovato! + } + if (n <= 0) + { + TRectype& row = codcor.row(-1, true); // Add new row + row.put("CODARTALT", bc); + row.put("TIPO", tipo); + codcor.rewrite(); + } + } + if (!pi.add_status()) + break; + } + } +} + + +static bool ClifoEvaluator(const TISAM_recordset& rec, const char* fldname, const char* expr, TVariant& var) +{ + const TAnagrafica& a = _anagr.anag(rec); + + if (xvt_str_same(fldname, "Cod_PK")) + { + TLocalisamfile& cfv = rec.cursor()->file(LF_CFVEN); + TString80 codprcf = cfv.get(CFV_CODPRCF); + if (codprcf.blank() || codprcf[0] == 'C') // Anagrafica gestita da Campo + { + const char t = rec.get(CLI_TIPOCF).as_string()[0]; + const long c = rec.get(CLI_CODCF).as_int(); + TString8 cod_pk; cod_pk.format("C%06ld%c", c, t); + if (cod_pk != codprcf) + { + cfv.put(CFV_CODPRCF, codprcf = cod_pk); + cfv.rewrite(); + } + } + var = codprcf; + return true; + } + if (xvt_str_same(fldname, "Cognome")) + { + if (a.fisica()) + var = a.cognome(); + return true; + } + if (xvt_str_same(fldname, "Nome")) + { + if (a.fisica()) + var = a.nome(); + return true; + } + if (xvt_str_same(fldname, "Indirizzo")) + { + TString ind; + ind = a.via_residenza(); + if (ind.full()) + { + const TString& civ = a.civico_residenza(); + if (civ.full()) ind << ',' << civ; + } + const TString& loc = a.localita_residenza(); + if (loc.full()) ind << ',' << loc; + ind.strip_double_spaces(); + var = ind; + return true; + } + if (xvt_str_same(fldname, "Citta")) + { + var = a.comune_residenza(); + return true; + } + if (xvt_str_same(fldname, "Provincia")) + { + var = a.provincia_residenza(); + return true; + } + if (xvt_str_same(fldname, "ComuneNascita")) + { + var = a.comune_nascita(); + return true; + } + if (xvt_str_same(fldname, "PVNascita")) + { + var = a.provincia_nascita(); + return true; + } + if (xvt_str_same(fldname, "Telefono") || xvt_str_same(fldname, "Cellulare") || xvt_str_same(fldname, "CellulareSMS")) + { + const char* suff = (*fldname == 'C') ? (strlen(fldname) > 9 ? "3" : "2") : ""; + TString8 pref; pref << "PTEL" << suff; + TString80 tele; tele << "TEL" << suff; + TString80 str; rec.get(pref).as_string(str); str << ' ' << rec.get(tele).as_string(); + str.strip_double_spaces(); + char* s = str.get_buffer(); + for (const char* f = s; *f; f++) + { + if (*f == ' ' || (*f >= '0' && *f <= '9')) + { + if (f > s) *s = *f; + s++; + } + } + *s = '\0'; + } + + if (xvt_str_same(fldname, "Tipo")) + { + var = a.fisica() ? 1 : 2; + return true; + } + if (xvt_str_same(fldname, " CLIente")) + { + const char tipocf = rec.get(CLI_TIPOCF).as_string()[0]; + var = tipocf == 'C'; + return true; + } + if (xvt_str_same(fldname, "Fornitore")) + { + const char tipocf = rec.get(CLI_TIPOCF).as_string()[0]; + var = tipocf == 'F'; + return true; + } + if (_strnicmp(fldname, " CLI_", 4) == 0) + { + const char tipocf = rec.get(CLI_TIPOCF).as_string()[0]; + return tipocf != 'C'; + } + if (_strnicmp(fldname, "For_", 4) == 0) + { + const char tipocf = rec.get(CLI_TIPOCF).as_string()[0]; + return tipocf != 'F'; + } + + return false; +} + +const TString& TImporta_sync::comune(const TRecordset& recset, const char* fld_cap, const char* fld_den) const +{ + TString8 cap; if (fld_cap && *fld_cap) cap = recset.get(fld_cap).as_string().left(5); + TString80 den; if (fld_den && *fld_den) den = recset.get(fld_den).as_string(); + return ::cap2comune(cap, den); +} + +bool TImporta_sync::split_phone(const TRecordset& odbc, const char* number, TIsamfile& clifo, const char* pre, const char* num) const +{ + TString pn = odbc.get(number).as_string(); + if (pn.full()) + { + pn.strip_double_spaces(); + const int maxpref = clifo.curr().length(pre); + int split = -1; + for (int i = 0; pn[i] && i <= maxpref; i++) + { + if (!isdigit(pn[i])) + { + split = i; + break; + } + } + + if (split > 1) + { + clifo.put(pre, pn.left(split)); + clifo.put(num, pn.mid(split + 1)); + } + else + { + clifo.put(pre, ""); + clifo.put(num, pn); + } + } + return pn.full(); +} + +void TImporta_sync::load_clifo(char tipocf) +{ + TString str(255); + str << "SELECT * FROM tieAnagCFP WHERE (Origine=1)AND"; + str << '(' << (tipocf == 'F' ? "Fornitore" : " CLIente") << "=1);"; + + TFast_isamfile clifo(LF_CLIFO); + + TODBC_recordset odbc(str); + odbc.connect(_dsn, _usr, _psw); + const TRecnotype n = odbc.items(); + + str.cut(0) << TR("Importazione ") << (tipocf == 'F' ? TR("Fornitori") : TR(" CLIenti")); + TProgress_monitor pi(n, str); + for (bool ok = odbc.move_first(); ok; ok = odbc.move_next()) + { + long codcf = odbc.get(tipocf == 'F' ? "For_CodFor" : " CLI_CodCG").as_int(); + if (codcf <= 0) + { + const TString& cod_pk = odbc.get("Cod_PK").as_string(); + if (cod_pk[0] == 'C' && cod_pk.len() == 8 && cod_pk[7] == tipocf) + codcf = atol(cod_pk.mid(1, 6)); + } + + if (codcf > 0) + { + clifo.put(CLI_TIPOCF, tipocf); + clifo.put(CLI_CODCF, codcf); + if (clifo.read(_isequal) != NOERR) + { + clifo.zero(); + clifo.put(CLI_TIPOCF, tipocf); + clifo.put(CLI_CODCF, codcf); + } + } + else + { + codcf = 1L; + if (tipocf == 'F') + { + if (clifo.last() == NOERR && clifo.get_char(CLI_TIPOCF) == 'F') + codcf += clifo.get_long(CLI_CODCF); + } + else + { + clifo.put(CLI_TIPOCF, 'F'); + clifo.put(CLI_CODCF, 0); + if (clifo.read(_isgteq) == NOERR) + { + if (clifo.prev() == NOERR && clifo.get_char(CLI_TIPOCF) == 'C') + codcf += clifo.get_long(CLI_CODCF); + } + } + clifo.zero(); + clifo.put(CLI_TIPOCF, tipocf); + clifo.put(CLI_CODCF, codcf); + clifo.write(); + + TLocalisamfile cfv(LF_CFVEN); + cfv.put(CFV_TIPOCF, tipocf); + cfv.put(CFV_CODCF, codcf); + TString8 codprcf; codprcf.format("C%06ld%c", codcf, tipocf); + cfv.put(CFV_CODPRCF, codprcf); + cfv.write(); + } + clifo.put(CLI_RAGSOC, odbc.get("RagSoc").as_string()); + + const int tipo = odbc.get("Tipo").as_int(); // 1=Fisica; 2=Giuridica; 3=Altro + if (tipo == 1) + { + clifo.put(CLI_SESSO, odbc.get("Sesso").as_string()); + clifo.put(CLI_DATANASC, odbc.get("DTNascita").as_date()); + clifo.put(CLI_COMNASC, comune(odbc, "", "ComuneNascita")); + clifo.put(CLI_TIPOPERS, 'F'); + } + else + clifo.put(CLI_TIPOPERS, 'G'); + + TToken_string indirizzo(odbc.get("Indirizzo").as_string(), ','); + TString ind = indirizzo.get(0); + TString civ = indirizzo.get(); + TString loc = indirizzo.get(); + if (civ.len() > 10) + { + if (loc.full()) + ind << ' ' << civ; + else + loc = civ; + civ.cut(0); + } + clifo.put(CLI_INDCF, ind.left(50)); + + split_phone(odbc, "Telefono", clifo, CLI_PTEL, CLI_TEL); + split_phone(odbc, "Cellulare", clifo, CLI_PTEL2, CLI_TEL2); + split_phone(odbc, "CellulareSMS", clifo, CLI_PTEL3, CLI_TEL3); + clifo.put(CLI_MAIL, odbc.get("EMail").as_string()); + + clifo.put(CLI_UTENTE, "BEESTORE"); + TDate dua = odbc.get(BS_DTULTAGG).as_date(); + if (!dua.ok()) dua = TDate(TODAY); + clifo.put(CLI_DATAAGG, dua); + + clifo.rewrite(); + + if (!pi.add_status()) + break; + } +} + +void TImporta_sync::save_clifo(int cfmask, const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("Cod_PK|" CLI_CODCF); + fields.add("RagSoc|" CLI_RAGSOC); + fields.add("Cognome|" CLI_RAGSOC); + fields.add("Nome|" CLI_RAGSOC); + fields.add("Indirizzo|" CLI_INDCF); + fields.add("Citta|" CLI_COMCF); + fields.add("Cap|" CLI_CAPCF); + fields.add("Provincia|"); + fields.add("Telefono|PTEL+TEL"); + fields.add("Cellulare|PTEL2+TEL2"); + fields.add("CellulareSMS|PTEL3+TEL3"); + fields.add("EMail|" CLI_MAIL); + fields.add("PartitaIva|" CLI_PAIV); + fields.add("CodFiscale|" CLI_COFI); + fields.add("Tipo|1"); + fields.add("Sesso|" CLI_SESSO); + fields.add("DTNascita|" CLI_DATANASC); + fields.add("ComuneNascita|" CLI_COMNASC); + fields.add("PVNascita|"); + fields.add(" CLIente|"); + fields.add("Fornitore|"); + fields.add("For_CodFor|" CLI_CODCF); + fields.add("For_Blocco|" CLI_SOSPESO); + fields.add(" CLI_CodCG|" CLI_CODCF); + fields.add(" CLI_Blocco|" CLI_SOSPESO); + fields.add("MagInserAnagrafica|1"); + fields.add("CodStato|" CLI_STATOCF); + fields.add("Annullato|0"); + + TString query = build_query(LF_CLIFO, dal, al); + query << "\nJOIN " << LF_CFVEN << " INTO TIPOCF==TIPOCF CODCF==CODCF"; + if (cfmask == 1) + query << "\nFROM TIPOCF=C\nTO TIPOCF=C"; else + if (cfmask == 2) + query << "\nFROM TIPOCF=F\nTO TIPOCF=F"; + + TISAM_recordset clifo(query); + //save_origine_2(clifo, "tieAnagCFP", fields, ClifoEvaluator); +} + +void TImporta_sync::sync_clifo(int cfmask, const TDate& dal, const TDate& al) +{ + if (cfmask & 1) load_clifo('C'); + if (cfmask & 2) load_clifo('F'); + + TString str(255); + TODBC_recordset clifo(str); + clifo.connect(_dsn, _usr, _psw); + str << "DELETE FROM tieAnagCFP WHERE Origine=1;"; + clifo.exec(str); // Elimina tutte le anagrafiche importate da BeeStore + + save_clifo(cfmask, dal, al); +} + +bool TImporta_sync::save_and_delete_movmag(TMov_mag*& doc) const +{ + int err = 0; + if (doc != NULL) + { + if (doc->rows() > 0) + { + TLocalisamfile mm(LF_MOVMAG); + err = doc->write(mm); + if (err != NOERR) + { + TString msg; + msg.format(FR("Errore %d in registrazione scontrino %ld del %s"), err, + doc->get_long(MOVMAG_NUMREG), (const char*)doc->get(MOVMAG_DATAREG)); + _log->log(2, msg); + msg << TR("\nSi desidera proseguire ugualmente?"); + if (noyes_box(msg)) + err = 0; + } + } + delete doc; + doc = NULL; + } + return err == 0; +} + +bool TImporta_sync::save_and_delete_doc(TDocumento*& doc) const +{ + int err = 0; + if (doc != nullptr) + { + if (doc->rows() > 0) + { + err = doc->write(); + if (err != NOERR) + { + TString msg; + + msg.format(FR("Errore %d in registrazione dcoumento %s/%ld del %s"), err, + (const char *)doc->get(DOC_CODNUM), doc->get_long(DOC_NDOC), (const char*)doc->get(DOC_DATADOC)); + _log->log(2, msg); + msg << TR("\nSi desidera proseguire ugualmente?"); + if (noyes_box(msg)) + err = 0; + } + } + safe_delete(doc); + } + return err == 0; +} + +void TImporta_sync::sync_val(const TDate& dal, const TDate& al) +{ + TString_array fields; + fields.add("CodValuta|CODTAB"); + fields.add("DSValuta|S0"); + fields.add("Simbolo|CODTAB"); + sync_table("%VAL", "tieValute", fields, dal, al); +} + +void TImporta_sync::sync_listino(const TString& listino) +{ + TString str(255); + TODBC_recordset prz(str); + prz.connect(_dsn, _usr, _psw); + str = "DELETE FROM tiePrzVendita WHERE Origine=1"; + prz.exec(str); // Ignora tutti i listini di BeeStore + + str.cut(0) << "USE " << LF_RCONDV << " SELECT " << LF_ANAMAG << ".CODART!=\"\"" + << "\nJOIN " << LF_ANAMAG << " INTO CODART==CODRIGA" + << "\nFROM TIPO=L TIPORIGA=A COD=" << listino + << "\nTO TIPO=L TIPORIGA=A COD=" << listino; + TISAM_recordset lis(str); + if (lis.move_first()) + { + TString16 eur; eur << "CodValuta|'" << TCurrency::get_euro_val() << "'"; + + TString16 key; key << "L||||" << listino; + const TRectype& condv = cache().get(LF_CONDV, key); + + TDate dt_inizio = condv.get(CONDV_VALIN); + if (!dt_inizio.ok()) dt_inizio = TDate(1, 1, 2000); + TDate dt_fine = condv.get(CONDV_VALFIN); + if (dt_fine < dt_inizio) dt_fine = TDate(31, 12, 2100); + + TString descr; descr << "DSListino|'" << condv.get(CONDV_DESCR) << '\''; + TString dtini; dtini << "DTInizio|'" << dt_inizio.string() << '\''; + TString dtfin; dtfin << "DTFine|'" << dt_fine.string() << '\''; + + TString_array fields; + fields.add("Cod_PK|" RCONDV_CODRIGA); + fields.add("CodPadre|" RCONDV_CODRIGA); + //fields.add("CodArticolo|"RCONDV_CODRIGA); // NON metterlo! + fields.add("TipoPrezzo|'1'"); // 1=Listino + fields.add(eur); + fields.add("Prezzo|" RCONDV_PREZZO); + fields.add("Prezzo2|0"); + fields.add("Sconto|" RCONDV_SCONTO); + if (real::is_natural(listino)) + fields.add("NumListino|" RCONDV_COD); + fields.add(descr); + fields.add(dtini); + fields.add(dtfin); + + //save_origine_2(lis, "tiePrzVendita", fields); + } +} + +void TImporta_sync::sync_mov(int tipotestata, const TDate& dal, const TDate& al) +{ + const TString8 codcaus = ini_get_string(CONFIG_DITTA, "bs", MOVMAG_CODCAUS, "", tipotestata); + + if (codcaus.blank()) + { + _log->log(2, "Configurare parametri per movimenti Bee Store"); + return; + } + + TString str(255); + str << "SELECT * FROM tieDMovMag WHERE Origine=1 AND TipoTestata=" << tipotestata; + if (dal.ok() || al.ok()) + { + str << " AND DataMov"; + if (dal.ok() && al.ok()) + str << " BETWEEN " << date2sql(dal) << " AND " << date2sql(al); + else + { + if (dal.ok()) + str << ">=" << date2sql(dal); + else + str << "<=" << date2sql(al); + } + } + str << "\nORDER BY NumMov,NumRiga"; + + TODBC_recordset mov(str); + mov.connect(_dsn, _usr, _psw); + TProgress_monitor pi(mov.items(), str); + + TString num_mov, nm; + TMov_mag* doc = NULL; + + for (bool ok = mov.move_first(); ok; ok = mov.move_next()) + { + nm = mov.get("NumMov").as_string(); + if (nm != num_mov) + { + if (!save_and_delete_movmag(doc)) + break; + num_mov = nm; + const TDate datadoc = mov.get("DataMov").as_date(); + doc = new TMov_mag; + doc->put(MOVMAG_CODCAUS, codcaus); + doc->put(MOVMAG_DATAREG, datadoc); + } + TRectype& rdoc = doc->new_row(); + rdoc.put(RMOVMAG_CODART, mov.get("CodArticolo").as_string()); + rdoc.put(RMOVMAG_UM, mov.get("CodUntMis").as_string()); + rdoc.put(RMOVMAG_PREZZO, mov.get("PrzCassaValuta").as_real()); + if (!pi.add_status()) + break; + } + save_and_delete_movmag(doc); // Salva ultimo documento in sospeso +} + +void TImporta_sync::add_rmov(TMovimentoPN& mov, const real& importo, const TCausale& caus, const char* cod_da) const +{ + if (!importo.is_zero()) + { + TRectype& rmov = mov.cg(-1); + rmov.put(RMV_SEZIONE, caus.sezione_clifo()); + rmov.put(RMV_IMPORTO, importo); + int i = caus.last(); + for (; i > 15; i--) + { + const char* cod = caus.cod_desc_agg(i); + if (xvt_str_same(cod, cod_da)) + break; + } + TBill zio1; caus.bill(1, zio1); + TBill zio2; caus.bill(i, zio2); + zio2.put(rmov); + zio1.put(rmov, true); + } +} + +void TImporta_sync::sync_doc(const TDate& dal, const TDate& al) +{ + const TString8 codcausdef = ini_get_string(CONFIG_DITTA, "bs", MOVMAG_CODCAUS, "", 2); + + if (codcausdef.blank()) + { + _log->log(2, "Configurare parametri per movimenti Bee Store"); + return; + } + + TString str(255); + str << "SELECT tieDMovMag.*,tieTBolFat.* FROM tieDMovMag,tieTBolFat WHERE tieDMovMag.Origine=1 AND tieDMovMag.TipoTestata=2 AND tieDMovMag.CodTestata=tieTBolFat.Cod_PK"; // verificare + if (dal.ok() || al.ok()) + { + str << " AND DataMov"; + if (dal.ok() && al.ok()) + str << " BETWEEN " << date2sql(dal) << " AND " << date2sql(al); + else + { + if (dal.ok()) + str << ">=" << date2sql(dal); + else + str << "<=" << date2sql(al); + } + } + str << "\nORDER BY NumMov,NumRiga"; + + TODBC_recordset docs(str); + docs.connect(_dsn, _usr, _psw); + TProgress_monitor pi(docs.items(), str); + + long num_doc = -1, nd, codcf; + TString4 tipocf; + TDocumento* doc = NULL; + + for (bool ok = docs.move_first(); ok; ok = docs.move_next()) + { + TToken_string test(docs.get("CodTestata").as_string(), '\\'); + + nd = atol(test.get()); + TString wrk = docs.get("CodCliente").as_string(); + + while (wrk[0] >= 'A') + wrk.ltrim(1); + + codcf = atol(wrk); + tipocf = docs.get("TipoIntestatario").as_string(); + if (tipocf != "C") // verificare + tipocf = "F"; + + if (nd != num_doc) + { + if (num_doc > 0 && !save_and_delete_doc(doc)) + break; + num_doc = nd; + const TDate datadoc = docs.get("DataMov").as_date(); + TString8 numdoc = docs.get("TipoDocCE").as_string(); + TString8 tipodoc = docs.get("TipoDocCE").as_string(); + + TTipo_documento tipo(tipodoc); + const TString8 codcaus = tipo.caus_mov().blank() ? codcausdef : tipo.caus_mov(); + + doc = new TDocumento(); + doc->put(DOC_ANNO, datadoc.year()); + doc->put(DOC_DATADOC, datadoc); + doc->put(DOC_NDOC, nd); + doc->put(DOC_PROVV, "D"); + doc->put(DOC_CODNUM, numdoc); + doc->put(DOC_TIPODOC, tipodoc); + doc->put(DOC_TIPOCF, tipocf); + doc->put(DOC_CODCF, codcf); + doc->cli2doc(); + + const TString8 codval = docs.get("CodValuta").as_string(); + const real cambio = docs.get("CambioValuta").as_real(); + const TString asp = docs.get("AspettoBeni").as_string(); + const int ncolli = docs.get("NumeroColli").as_int(); + + doc->put(DOC_CODVAL, codval); + doc->put(DOC_CAMBIO, cambio); + doc->put(DOC_ASPBENI1, asp.sleft(50)); + doc->put(DOC_ASPBENI2, asp.smid(50)); + doc->put(DOC_NCOLLI, ncolli); + doc->put(DOC_CAUSMAG, codcaus); + } + const int tipoart = docs.get("TipoArticolo").as_int(); + TString4 tiporiga = tipoart == 2 ? "04" : "02"; + TRectype& rdoc = doc->new_row("01"); + const TString80 codart = docs.get("CodArticolo").as_string(); + + rdoc.put(RDOC_CODART, codart); + + if (tipoart == 2) + { + if (cache().get("SPP", codart).not_empty()) + rdoc.put(RDOC_CODARTMAG, codart); + } + else + { + if (cache().get(LF_ANAMAG, codart).not_empty()) + rdoc.put(RDOC_CODARTMAG, codart); + } + + rdoc.put(RDOC_CODARTMAG, codart); + // rdoc.check_row(); + + const TString descr = docs.get("DSRiga").as_string(); + + rdoc.put(RDOC_DESCR, descr.sleft(50)); + if (descr.len() > 50) + { + rdoc.put(RDOC_DESCLUNGA, "X"); + rdoc.put(RDOC_DESCEST, descr.smid(50)); + } + rdoc.put(RDOC_CODMAG, docs.get("CodMagazzino").as_string().left(5)); + rdoc.put(RDOC_CODMAGC, docs.get("CodMagazDest").as_string().left(5)); + rdoc.put(RDOC_UMQTA, docs.get("CodUntMis").as_string()); + rdoc.put(RDOC_QTA, docs.get("Quantita").as_real()); + rdoc.put(RDOC_PREZZO, docs.get("PrzNettoSede").as_real()); // o PrzNettoValuta ?? + + real valsconto1(docs.get("Sconto1").as_real()); + real valsconto2(docs.get("Sconto2").as_real()); + real valsconto3(docs.get("Sconto3").as_real()); + TString80 sconto; + + if (valsconto1 != ZERO) + sconto << valsconto1.stringa(6, 2); + if (valsconto2 != ZERO) + { + if (sconto.full()) + sconto << "+"; + sconto << valsconto2.stringa(6, 2); + } + if (valsconto3 != ZERO) + { + if (sconto.full()) + sconto << "+"; + sconto << valsconto3.stringa(6, 2); + } + rdoc.put(RDOC_SCONTO, sconto); + rdoc.put(RDOC_CODIVA, docs.get("CodIva").as_string()); + + if (!pi.add_status()) + break; + } + save_and_delete_doc(doc); // Salva ultimo documento in sospeso +} + +void TImporta_sync::sync_corrisp(const TDate&, const TDate&) +{ + const TString8 codcaus = ini_get_string(CONFIG_DITTA, "bs", "CODCAUSC"); + if (codcaus.blank()) + { + _log->log(2, "Configurare la causale corrispettivi Bee Store"); + return; + } + + TString str(255); + str << "SELECT * FROM tieCorrispettivi WHERE Origine=1"; + str << "\nORDER BY DataCorr,CodCorrispettivo"; + + TODBC_recordset corr(str); + corr.connect(_dsn, _usr, _psw); + TProgress_monitor pi(corr.items(), str); + + TString num_mov, nm; + TMov_mag* doc = NULL; + + TMovimentoPN mov; + mov.read(_islast); + long numreg = mov.curr().get_long(MOV_NUMREG) + 1; + + for (bool ok = corr.move_first(); ok; ok = corr.move_next()) + { + TRectype& mrec = mov.curr(); + mov.destroy_rows(numreg); + + const TDate datareg = corr.get("DataCorr").as_date(); + mrec.put(MOV_NUMREG, numreg); + mrec.put(MOV_DATAREG, datareg); + mrec.put(MOV_ANNOIVA, datareg.year()); + + mrec.put(MOV_DATADOC, datareg); + TString80 desc; desc.format(FR("Corrispettivi %s"), datareg.stringa()); + mrec.put(MOV_DESCR, desc); + + TEsercizi_contabili esc; + mrec.put(MOV_DATACOMP, datareg); + mrec.put(MOV_ANNOES, esc.date2esc(datareg)); + + const TCausale caus(codcaus, datareg.year()); + mrec.put(MOV_CODCAUS, codcaus); + mrec.put(MOV_REG, caus.reg().name()); + + const real totdoc = corr.get("Valore").as_real(); + mrec.put(MOV_TOTDOC, totdoc); + + str << "SELECT * FROM tieDCorrispettivi WHERE (Origine=1)"; + str << "AND(CodCorrispettivo='" << corr.get("CodCorrispettivo") << "')"; + TODBC_recordset dett(str); + dett.connect(_dsn, _usr, _psw); + + TBill zio1; caus.bill(1, zio1); + TBill zio2; caus.bill(2, zio2); + TBill zio3; caus.bill(3, zio3); + + int nriga = 0; + real imponibile, imposta; + for (bool dok = dett.move_first(); dok; dok = dett.move_next()) + { + const real imp = dett.get("ImportoReparto").as_real(); + const real iva = dett.get("ImportoIva").as_real(); + TRectype& irec = mov.iva(nriga++); + irec.put(RMI_IMPONIBILE, imp); + irec.put(RMI_CODIVA, dett.get("CodIva").as_string()); + irec.put(RMI_IMPOSTA, iva); + zio2.put(irec); + imponibile += imp; + imposta += iva; + } + + const char sez1 = caus.sezione_clifo(); + TRectype& r1 = mov.cg(0); + r1.put(RMV_SEZIONE, sez1); + r1.put(RMV_IMPORTO, totdoc); + zio1.put(r1); + zio2.put(r1, true); + r1.put(RMV_ROWTYPE, 'T'); + + const char sez2 = sez1 == 'D' ? 'A' : 'D'; + TRectype& r2 = mov.cg(1); + r2.put(RMV_SEZIONE, sez2); + r2.put(RMV_IMPORTO, imponibile); + zio2.put(r2); + zio1.put(r2, true); + r2.put(RMV_ROWTYPE, 'I'); + + TRectype& r3 = mov.cg(2); + r3.put(RMV_SEZIONE, sez2); + r3.put(RMV_IMPORTO, imposta); + zio3.put(r3); + zio1.put(r3, true); + r3.put(RMV_ROWTYPE, 'D'); + + TRectype& r4 = mov.cg(3); + r4.put(RMV_SEZIONE, sez2); + r4.put(RMV_IMPORTO, totdoc); + zio1.put(r4); + zio1.put(r4, true); + + const real contanti = corr.get("IncContanti").as_real(); + const real bancomat = corr.get("IncBancomat").as_real(); + const real credcard = corr.get("IncCarteCredito").as_real(); + const real assegni = corr.get("IncAssegni").as_real(); + real altro = corr.get("IncFinanziato").as_real(); + altro += corr.get("IncCrediti").as_real(); + altro += corr.get("IncBonifici").as_real(); + altro += corr.get("IncAltro").as_real(); + + add_rmov(mov, contanti, caus, "BEECN"); + add_rmov(mov, bancomat, caus, "BEEBM"); + add_rmov(mov, credcard, caus, "BEECC"); + add_rmov(mov, assegni, caus, "BEEAS"); + add_rmov(mov, altro, caus, "BEEAL"); + + while (mov.write() == _isreinsert) + mrec.put(MOV_NUMREG, numreg++); + + if (!pi.add_status()) + break; + } + + if (!pi.is_cancelled()) + { + TString str(255); + TODBC_recordset sco(str); + sco.connect(_dsn, _usr, _psw); + str = "DELETE FROM tieCorrispettivi WHERE Origine=1"; + sco.exec(str); + + str = "DELETE FROM tieDCorrispettivi WHERE Origine=1"; + sco.exec(str); + } +} + +void TImporta_sync::sync_fatbol(const TDate& dal, const TDate& al) +{ + + const TString8 codcausdef = ini_get_string(CONFIG_DITTA, "bs", MOVMAG_CODCAUS, "", 2); + /* + if (codcausdef.blank()) + { + _log->log(2, "Configurare parametri per movimenti Bee Store"); + return; + } + */ + + TString str(255); + str << "SELECT tieDMovMag.*,tieTBolFat.* FROM tieDMovMag,tieTBolFat WHERE tieDMovMag.Origine=1 AND tieDMovMag.TipoTestata=2 AND tieDMovMag.CodTestata=tieTBolFat.Cod_PK"; // verificare + if (dal.ok() || al.ok()) + { + str << " AND DataMov"; + if (dal.ok() && al.ok()) + str << " BETWEEN " << date2sql(dal) << " AND " << date2sql(al); + else + { + if (dal.ok()) + str << ">=" << date2sql(dal); + else + str << "<=" << date2sql(al); + } + } + str << "\nORDER BY CodTestata,NumRiga"; + + TODBC_recordset docs(str); + docs.connect(_dsn, _usr, _psw); + TProgress_monitor pi(docs.items(), str); + + long num_doc = -1, nd, codcf; + TString test_doc = "", test_nd; + TString4 tipocf; + TDocumento* doc = nullptr; + int contatore = 0; + int eccezioni_errori = 0; + TString codpk = ""; + for (bool ok = docs.move_first(); ok; ok = docs.move_next()) + { + TString CodTesta = docs.get("CodTestata").as_string(); + TToken_string test(docs.get("CodTestata").as_string(), '\\'); + + test_nd = (docs.get("CodTestata").as_string()); + + nd = atol(test.get()); + TString wrk = docs.get("CodCliente").as_string(); + + while (wrk[0] >= 'A') + wrk.ltrim(1); + + codcf = atol(wrk); + tipocf = docs.get("TipoIntestatario").as_string(); + + if (tipocf != "C") // verificare + tipocf = "F"; + + if (test_nd != test_doc) + // if (nd != num_doc) + { + if (num_doc > 0 && !save_and_delete_doc(doc)) + break; + /* + if (test_doc != "") + if (test_doc != test_nd) + save_and_delete_doc(doc); + */ + num_doc = nd; + test_doc = test_nd; + + TString tre = test_doc.right(3); + const TDate datadoc = docs.get("DataMov").as_date(); + TString cod_pk = docs.get("Cod_PK").as_string(); + TString8 numdoc = docs.get("NumDoc").as_string(); + TString8 tipodoc = docs.get("TipoDocCE").as_string(); + TString origine_dc = docs.get("Origine").as_string(); + + if (tipodoc.not_empty() && (tipodoc != " ")) { + + TTipo_documento tipo(tipodoc); + const TString8 codcaus = tipo.caus_mov().blank() ? codcausdef : tipo.caus_mov(); + + //doc = new TDocumento('D', datadoc.year(), numdoc, nd); //meglio usare TDocumento(char provv, int anno, const char* codnum, long numdoc); + doc = new TDocumento('D', datadoc.year(), tipodoc, strtol(numdoc, nullptr, 0)); + doc->destroy_rows(); + doc->put(DOC_DATADOC, datadoc); + doc->put(DOC_TIPODOC, tipodoc); + doc->put(DOC_TIPOCF, tipocf); + doc->put(DOC_CODCF, codcf); + doc->cli2doc(); + + const TString8 codval = docs.get("CodValuta").as_string(); + const real cambio = docs.get("CambioValuta").as_real(); + const TString asp = docs.get("AspettoBeni").as_string(); + const int ncolli = docs.get("NumeroColli").as_int(); + // inserire codice pagamento Es. BB02 + doc->put(DOC_CODVAL, codval); + doc->put(DOC_CAMBIO, cambio); + doc->put(DOC_ASPBENI1, asp.sleft(50)); + doc->put(DOC_ASPBENI2, asp.smid(50)); + doc->put(DOC_NCOLLI, ncolli); + doc->put(DOC_CAUSMAG, codcaus); + contatore++; + } + else + { + eccezioni_errori++; + codpk = cod_pk; + TString dserrore = docs.get("DSErrore").as_string(); + dserrore.sleft(50); + dserrore << " TipoDocCe assente o invalido"; + TString update_str = ""; + update_str << "UPDATE tieTBolFat \n SET Errore = 1 , DSErrore = '" << dserrore << "' \n WHERE cod_pk= '" << codpk << "' "; + TODBC_recordset docs(update_str); + docs.connect(_dsn, _usr, _psw); + docs.exec(update_str); + } + } + TString8 tipodoc = docs.get("TipoDocCE").as_string(); + if (tipodoc.not_empty() && (tipodoc != " ")) + { + + const int tipoart = docs.get("TipoArticolo").as_int(); + // inutile per noi TString4 tiporiga = tipoart == 2 ? "04" : "02"; + TRectype& rdoc = doc->new_row("01"); + const TString80 codart = docs.get("CodArticolo").as_string(); + + rdoc.put(RDOC_CODART, codart); + if (tipoart == 2) //righe libere + { + if (cache().get("SPP", codart).not_empty()) + rdoc.put(RDOC_CODARTMAG, codart); + } + else //spese servizi e articoli + { + if (cache().get(LF_ANAMAG, codart).not_empty()) + rdoc.put(RDOC_CODARTMAG, codart); + } + + rdoc.put(RDOC_CODARTMAG, codart); + //rdoc.check_row(); + + const TString descr = docs.get("DSRiga").as_string(); + rdoc.put(RDOC_DESCR, descr.sleft(50)); + if (descr.len() > 50) + { + rdoc.put(RDOC_DESCLUNGA, "X"); + rdoc.put(RDOC_DESCEST, descr.smid(50)); + } + rdoc.put(RDOC_CODMAG, docs.get("CodMagazzino").as_string().left(5)); + rdoc.put(RDOC_CODMAGC, docs.get("CodMagazDest").as_string().left(5)); + rdoc.put(RDOC_UMQTA, docs.get("CodUntMis").as_string()); + rdoc.put(RDOC_QTA, docs.get("Quantita").as_real()); + rdoc.put(RDOC_PREZZO, docs.get("PrzNettoNeg").as_real()); // o PrzNettoValuta ?? + + /* + real valsconto1(docs.get("Sconto1").as_real()); + real valsconto2(docs.get("Sconto2").as_real()); + real valsconto3(docs.get("Sconto3").as_real()); + TString80 sconto; + + if (valsconto1 != ZERO) + sconto << valsconto1.stringa(6, 2); + if (valsconto2 != ZERO) + { + if (sconto.full()) + sconto << "+"; + sconto << valsconto2.stringa(6, 2); + } + if (valsconto3 != ZERO) + { + if (sconto.full()) + sconto << "+"; + sconto << valsconto3.stringa(6, 2); + } + rdoc.put(RDOC_SCONTO, sconto); + */ + rdoc.put(RDOC_CODIVA, docs.get("CodIva").as_string()); + } + else + { + TString dserrore = docs.get("DSErrore").as_string(); + dserrore.sleft(50); + dserrore << " TipoDocCe assente o invalido"; + TString update_str = ""; + update_str << "UPDATE tieDMovMag \n SET Errore = 1 , DSErrore = '" << dserrore << "' \n WHERE CodTestata= '" << codpk << "' "; + TODBC_recordset docs(update_str); + docs.connect(_dsn, _usr, _psw); + docs.exec(update_str); + } + if (!pi.add_status()) + break; + + } + save_and_delete_doc(doc); // Salva ultimo documento in sospeso + str.cut(0); + str.format(TR("Documenti importati %ld record in %s"), contatore, "tieTBolFat"); + _log->log(0, ""); + _log->log(0, str); + if (eccezioni_errori > 0) + { + str.cut(0); + str.format(TR("Errori in importazione %ld record in %s"), eccezioni_errori, "tieTBolFat"); + _log->log(0, str); + } +} + +bool TImporta_sync::create() +{ + _dsn = ini_get_string(CONFIG_DITTA, "bs", "DSN", "BEESTORE"); + _sqlog = ini_get_string(CONFIG_DITTA, "bs", "Log", ""); + _usr = ini_get_string(CONFIG_DITTA, "bs", "USR", "BEESTORE"); + _psw = decode(ini_get_string(CONFIG_DITTA, "bs", "PSW", "BEESTORE")); + + if (_dsn.full()) + { + TProgress_monitor ti(1, TR("Connessione a SQL Server"), false); + TString query; query << "SELECT * FROM tieValute;";//"ODBC(" << _dsn << ")\nSELECT * FROM tieValute;"; + TODBC_recordset recset(query); + recset.connect(_dsn, _usr, _psw); // Dovrebbe connettersi anche con solo _dsn valorizzato + recset.move_first(); + if (_sqlog.full() && _sqlog.is_relative_path()) + { + TFilename n; n.tempdir(); + n.add(_sqlog.name()); + _sqlog = n; + } + recset.set_log_file(_sqlog); + return TSkeleton_application::create(); + } + return error_box(FR("Impossibile connettersi al DSN '%s'"), (const char*)_dsn); + +} + +void TImporta_sync::main_loop() +{ + TImporta_mask mask; + + while (mask.run() == K_ENTER) + { + mask.autosave(); // Rende definitivi tutti i paramentri in [bs] + _log = new TLog_report; + + const TDate dal = mask.get_date("SyncDateFrom"); + const TDate al = mask.get_date("SyncDateTo"); + + if (mask.get_bool("SyncUMS")) + sync_ums(dal, al); + if (mask.get_bool("SyncIVA")) + sync_iva(dal, al); + if (mask.get_bool("SyncLinee")) + sync_lines(dal, al); + if (mask.get_bool("SyncCatMer")) + sync_catmer(dal, al); + if (mask.get_bool("SyncAnamag")) + sync_anamag(dal, al); + if (mask.get_bool("SyncBarCode")) + sync_barcode(dal, al); + if (mask.get_bool("SyncVAL")) + sync_val(dal, al); + + int cfmask = 0; + if (mask.get_bool("SyncClienti")) cfmask |= 1; + if (mask.get_bool("SyncFornitori")) cfmask |= 2; + if (cfmask) + sync_clifo(cfmask, dal, al); + + if (mask.get("SyncListino").full()) + sync_listino(mask.get("SyncListino")); + if (mask.get_bool("SyncScontr")) + sync_scontrini(dal, al); + if (mask.get_bool("SyncCorr")) + sync_corrisp(dal, al); + if (mask.get_bool("SyncDoc")) + sync_doc(dal, al); + if (mask.get_bool("SyncCarScar")) + sync_carscar(dal, al); + if (mask.get_bool("SyncGenerici")) + sync_generici(dal, al); + if (mask.get_bool("SyncFatBol")) + { + const TDate dalfat = mask.get_date("SyncDateFromF"); + const TDate alfat = mask.get_date("SyncDateToF"); + sync_fatbol(dalfat, alfat); + } + + _log->preview(); + delete _log; + _log = NULL; + } + +} + +int bs0500(int argc, char* argv[]) +{ + TImporta_sync impf; + impf.run(argc, argv, TR("Import F/B/S")); + return 0; +} diff --git a/src/bs/bs0500a.h b/src/bs/bs0500a.h new file mode 100644 index 000000000..dcebb071e --- /dev/null +++ b/src/bs/bs0500a.h @@ -0,0 +1,36 @@ +#define F_DAL 101 +#define F_AL 102 + +#define F_UMS 103 +#define F_IVA 104 +#define F_LINEART 105 +#define F_CATMER 106 +#define F_ART 107 +#define F_LIST 108 +#define F_SCONTRINI 109 +#define F_CORRISPETTIVI 110 +#define F_DOCUMENTI 111 +#define F_CARSCAR 112 +#define F_GENERICI 113 +#define F_VALUTE 114 +#define F_CLIENTI 115 +#define F_FORNITORI 116 +#define F_BARCODE 117 + +#define F_BBDAL 121 +#define F_BBAL 122 +#define F_FATBOL 123 +#define F_FFDAL 124 +#define F_FFAL 125 + +#define F_C_CARSCAR 201 +#define F_D_CARSCAR 202 +#define F_C_DOCUMENTI 203 +#define F_D_DOCUMENTI 204 +#define F_C_SCONTRINI 205 +#define F_D_SCONTRINI 206 +#define F_C_GENERICI 207 +#define F_D_GENERICI 208 + +#define F_C_CORRISPETTIVI 301 +#define F_D_CORRISPETTIVI 302 \ No newline at end of file diff --git a/src/bs/bs0500a.uml b/src/bs/bs0500a.uml new file mode 100644 index 000000000..b5490710f --- /dev/null +++ b/src/bs/bs0500a.uml @@ -0,0 +1,298 @@ +#include "bs0500a.h" + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +PAGE "Sincronizzazione Bee Store" 0 2 0 0 + +GROUPBOX DLG_NULL 78 13 +BEGIN + PROMPT 1 1 "@bArchivi" +END + +BOOLEAN F_UMS +BEGIN + PROMPT 2 2 "Unità di misura " + FIELD SyncUMS +END + +BOOLEAN F_IVA +BEGIN + PROMPT 2 3 "Codici IVA " + FIELD SyncIVA +END + +BOOLEAN F_LINEART +BEGIN + PROMPT 2 4 "Linee Articolo " + FIELD SyncLinee +END + +BOOLEAN F_CATMER +BEGIN + PROMPT 2 5 "Categorie Merceologiche" + FIELD SyncCatMer +END + +BOOLEAN F_ART +BEGIN + PROMPT 2 6 "Articoli " + FIELD SyncAnamag +END + +STRING F_LIST 3 +BEGIN + PROMPT 40 6 "Listino " + USE LF_CONDV + INPUT TIPO "L" + INPUT CATVEN "" + INPUT TIPOCF "" + INPUT CODCF "" + INPUT COD 148 + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + DISPLAY "Valuta@5" CODVAL + DISPLAY "Inizio@10" VALIN + DISPLAY "Fine@10" VALFIN + OUTPUT 148 COD + FIELD SyncListino +END + +BOOLEAN F_SCONTRINI +BEGIN + PROMPT 2 7 "Scontrini " + FIELD SyncScontr +END + +BOOLEAN F_CORRISPETTIVI +BEGIN + PROMPT 2 8 "Corrispettivi " + FIELD SyncCorr +END + +BOOLEAN F_DOCUMENTI +BEGIN + PROMPT 2 9 "Documenti " + FIELD SyncDoc +END + +BOOLEAN F_CARSCAR +BEGIN + PROMPT 2 10 "Carichi/scarichi " + FIELD SyncCarScar +END + +BOOLEAN F_GENERICI +BEGIN + PROMPT 2 11 "Mov.generici " + FIELD SyncGenerici +END + +BOOLEAN F_VALUTE +BEGIN + PROMPT 40 2 "Valute" + FIELD SyncVAL +END + +BOOLEAN F_CLIENTI +BEGIN + PROMPT 40 3 "Clienti" + FIELD SyncClienti +END + +BOOLEAN F_FORNITORI +BEGIN + PROMPT 40 4 "Fornitori " + FIELD SyncFornitori +END + +BOOLEAN F_BARCODE +BEGIN + PROMPT 40 5 "Codici a barre" + FIELD SyncBarCode +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 14 "@bFiltri" +END + +DATE F_DAL +BEGIN + PROMPT 2 15 "Dalla data di modifica " + FIELD SyncDateFrom +END + +DATE F_AL +BEGIN + PROMPT 42 15 " al " + FIELD SyncDateTo +END + +ENDPAGE + +PAGE "Import: Bolle/Fatture/Scontr." 0 2 0 0 + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 1 "@bBolle" +END + +DATE F_BBDAL +BEGIN + PROMPT 2 3 "Dalla data di modifica " + FIELD SyncDateFromB +END + +DATE F_BBAL +BEGIN + PROMPT 42 3 " al " + FIELD SyncDateToB +END + +BOOLEAN F_FATBOL +BEGIN + PROMPT 2 7 "Importa da BeeStore le Fatture" + FIELD SyncFatBol +END + +DATE F_FFDAL +BEGIN + PROMPT 2 8 "Dalla data di modifica " + FIELD SyncDateFromF +END + +DATE F_FFAL +BEGIN + PROMPT 42 8 " al " + FIELD SyncDateToF +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 6 "@bFatture" +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 11 "@bOrdini" +END + +ENDPAGE + +PAGE "Parametri" 0 2 0 0 + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 1 "@bMovimenti" +END + +STRING F_C_CARSCAR 4 +BEGIN + PROMPT 2 2 "Causale magazzino car./scar. " + USE %CAU SELECT (S2[8,8]=1)&&(S6="P") + INPUT CODTAB F_C_CARSCAR + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_C_CARSCAR CODTAB + OUTPUT F_D_CARSCAR S0 + CHECKTYPE NORMAL + FIELD CODCAUS(1) + ADD RUN mg0 -0 %CAU +END + +STRING F_D_CARSCAR 50 36 +BEGIN + PROMPT 40 2 "" + FLAGS "D" +END + +STRING F_C_DOCUMENTI 4 +BEGIN + PROMPT 2 3 "Causale magazzino documenti " + USE %CAU SELECT (S2[8,8]=1)&&(S6="P") + INPUT CODTAB F_C_DOCUMENTI + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_C_DOCUMENTI CODTAB + OUTPUT F_D_DOCUMENTI S0 + CHECKTYPE NORMAL + FIELD CODCAUS(2) + ADD RUN mg0 -0 %CAU +END + +STRING F_D_DOCUMENTI 50 36 +BEGIN + PROMPT 40 3 "" + FLAGS "D" +END + +STRING F_C_SCONTRINI 4 +BEGIN + PROMPT 2 4 "Causale magazzino scontrini " + USE %CAU SELECT (S2[8,8]=1)&&(S6="P") + INPUT CODTAB F_C_SCONTRINI + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_C_SCONTRINI CODTAB + OUTPUT F_D_SCONTRINI S0 + CHECKTYPE NORMAL + FIELD CODCAUS(3) + ADD RUN mg0 -0 %CAU +END + +STRING F_D_SCONTRINI 50 36 +BEGIN + PROMPT 40 4 "" + FLAGS "D" +END + +STRING F_C_GENERICI 4 +BEGIN + PROMPT 2 5 "Causale magazzino mov.generici " + USE %CAU SELECT (S2[8,8]=1)&&(S6="P") + INPUT CODTAB F_C_GENERICI + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_C_GENERICI CODTAB + OUTPUT F_D_GENERICI S0 + CHECKTYPE NORMAL + FIELD CODCAUS(4) + ADD RUN mg0 -0 %CAU +END + +STRING F_D_GENERICI 50 36 +BEGIN + PROMPT 40 5 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 8 "@bCorrispettivi" +END + +STRING F_C_CORRISPETTIVI 4 +BEGIN + PROMPT 2 9 "Causale contabile " + USE LF_CAUSALI SELECT TIPODOC="CR" + INPUT CODCAUS F_C_CORRISPETTIVI + DISPLAY "Codice" CODCAUS + DISPLAY "Descrizione@50" DESCR + OUTPUT F_C_CORRISPETTIVI CODCAUS + OUTPUT F_D_CORRISPETTIVI DESCR + CHECKTYPE NORMAL + FIELD CODCAUSC + ADD RUN cg0 -4 +END + +STRING F_D_CORRISPETTIVI 50 36 +BEGIN + PROMPT 40 9 "" + FLAGS "D" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/src/bs/bsmenu.men b/src/bs/bsmenu.men index f0d2aeeab..534cc65aa 100644 --- a/src/bs/bsmenu.men +++ b/src/bs/bsmenu.men @@ -5,7 +5,7 @@ Module = bs Flags = "F" Item_01 = "Configurazione", "bs0 -0", "F", 9015 Item_02 = "Sincronizzazione", "bs0 -1", "F", 9015 -Item_03 = "BeeStore Importazione Fatture", "bs0 -1", "F", 9015 +Item_03 = "Importazione Fatture", "bs0 -4", "F", 9015 Item_04 = "SKNET Importer", "bs0 -2", "F", 9015 Item_05 = "Tabelle di conversione", [BSMENU_002]