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]