#include "bs0300b.h" #include #include #include #include #include #include #include #include #include #include "../mg/mglib.h" #include "../cg/cglib01.h" #include "../ve/velib.h" #include #include #include "bs0.h" #include "../fe/felib.h" #include #include #include #include #include #include "bsutility.h" #include "urldefid.h" #define BS_DTULTAGG "DtUltAgg" /////////////////////////////////////////////////////////// // Utility /////////////////////////////////////////////////////////// const TString my_origin() { static const TString my_orig = ini_get_string(CONFIG_DITTA, "BS", "Origine", "2"); return my_orig; } const TString their_origin() { static const TString their_orig(1, (ini_get_int(CONFIG_DITTA, "BS", "Origine", 1) == 1 ? 2 : 1) + '0'); return their_orig; } const TString clifo_add_note(TLocalisamfile& cfv, TString& note) { TString codnote = cfv.get(CFV_CODNOTE); // Parto da un valore altissimo! Prima di questa modifica la dimensione di questo campo era 2 TLocalisamfile tabcom(LF_TABCOM); static int cod = 0; if (cod == 0) { TRectype n(LF_TABCOM); n.put("COD", "NOT"); if (n.read(tabcom, _isgteq) == NOERR) { // Vado a prendere l'ultimo valore in NOT while (n.get("COD") == "NOT") n.next(tabcom); n.prev(tabcom); cod = n.get_int("CODTAB") + 1; } else cod = 1; } TRectype nota(LF_TABCOM); nota.put("COD", "NOT"); if (codnote.blank()) { codnote.cut(0) << cod++; } nota.put("CODTAB", codnote); for (int i = 0; i <= 12; i++) { TString field = "S"; field << i; nota.put(field, note.left(tabcom.curr().length(field))); note.ltrim(tabcom.curr().length(field)); if (note.blank()) break; } nota.write_rewrite(tabcom); return codnote; } TObject* TSknet_cache::key2obj(const char* key) { const char tipo = *key; const long codice = atol(key + 1); return new TAnagrafica(LF_CLIFO, tipo, codice); } const TAnagrafica& TSknet_cache::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; } /////////////////////////////////////////////////////////// // TSknet_mask /////////////////////////////////////////////////////////// bool TSknet_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(); } } } if (e == fe_button) { if (o.dlg() == DLG_EDIT) bss().clean(); else if(o.dlg() == DLG_RECALC) { static TMask m ("Reset data importazione", 1, 30, 5); m.add_button_tool(DLG_OK, "~Conferma", TOOL_OK); m.add_button_tool(DLG_CANCEL, "Annulla", TOOL_CANCEL); // Avevo voglia di scrivere spaghetti code stamattina int start = 101; static const int date = start++, hours = start++, minutes = start++, seconds = start++; m.add_date(date, 0, "Data", 1, 1); m.add_string(hours, 0, "Ora ", 1, 2, 2); m.add_string(minutes, 0, ":", 8, 2, 2); m.add_string(seconds, 0, ":", 12, 2, 2); time_t rt = time(NULL); struct tm * now = localtime(&rt); m.set(date, TDate(TODAY)); m.set(hours, now->tm_hour); m.set(minutes, now->tm_min); m.set(seconds, "00"); while (m.run() == K_ENTER) { if(yesno_box("Sei sicuro di voler resettare la data di importazione?")) { char new_date[50]; sprintf_s(new_date, sizeof(new_date), "%d%02d%02d %02d:%02d:%02d.999", m.get_date(date).year(), m.get_date(date).month(), m.get_date(date).day(), m.get_int(hours), m.get_int(minutes), m.get_int(seconds)); ini_set_string(CONFIG_DITTA, "BS", "LAST_IMPORT", new_date); break; } } } } return true; } void TSknet_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 TSknet_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()); } } /////////////////////////////////////////////////////////// // TSknet_sync /////////////////////////////////////////////////////////// typedef bool TFieldEvaluator(const TISAM_recordset& rec, const char* fldname, const char* expr, TVariant& var); // Carica da BeeStore i record con Origine=their_origin(), cioè generati da lui ed eventualmente aggiorna i corrispondenti in Campo void TSknet_sync::load_their_origine(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=" << their_origin() << ") AND " << where_time_import() << ";"; //_log->log(0, str); 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()) { if(!pi.add_status()) break; file.zero(); TString80 cfld, bfld, def; // Campo field, BeeStore field e cut field int ffld, tfld; FOR_EACH_ARRAY_ROW(pairs, p, row) { bfld = row->get(0); cfld = row->get(); ffld = row->get_int(); ffld--; tfld = row->get_int(); tfld--; def = row->get(); const int pos = key_fields.get_pos(cfld); if (pos >= 0) { const TVariant& var = !odbc.get(bfld).is_empty() ? odbc.get(bfld) : (def.blank() ? NULL_VARIANT : def); if (!var.is_null()) { if (tfld > 0) file.put(cfld, var.as_string().mid(ffld, tfld - ffld)); else 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(); ffld = row->get_int(); ffld--; tfld = row->get_int(); tfld--; def = 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).is_empty() ? odbc.get(bfld).as_string() : (def.blank() ? "" : def); if (nov != vec) { if (!dirty) str << ' ' << bfld << "='" << nov << '\''; if (tfld > 0) file.put(cfld, nov.mid(ffld, tfld - ffld)); else file.put(cfld, nov); dirty = true; } } } if (dirty) { TRectype& rec = file.curr(); if (rec.exist(CLI_UTENTE)) rec.put(CLI_UTENTE, ini_get_string(CONFIG_DITTA, "bs", "SKImportUser")); 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) { TString80 err; err << TR("ERRORE ") << err << TR(" aggiornando il "); str.insert(err); _log->log(2, str); } } else { file.reread(_unlock); } } else if (err == _iskeynotfound) { bool keyfull = true; file.zero(); FOR_EACH_ARRAY_ROW(pairs, r, row) { bfld = row->get(0); cfld = row->get(); ffld = row->get_int(); ffld--; tfld = row->get_int(); tfld--; def = row->get(); // Controllo che il campo sia corretto if (key_fields.get_pos(cfld) >= 0 && odbc.get(bfld).is_empty()) { keyfull = false; break; } if (cfld[0] >= 'A' && cfld.find("->")) { const TString& nov = !odbc.get(bfld).is_empty() ? odbc.get(bfld).as_string() : (def.blank() ? "" : def); if (tfld > 0) file.put(cfld, nov.mid(ffld, tfld - ffld)); else file.put(cfld, nov); } } if (keyfull && file.write() == 0) _log->log(1, str); else { TString80 msg; msg << TR("ERRORE ") << err << TR(" inserendo il "); str.insert(msg); _log->log(2, str); } } } } } void TSknet_sync::sync_table(TISAM_recordset& in_set, const char* out_table, const TString_array& fields) { load_their_origine(in_set, out_table, fields); } static TString& build_query(const char* table) { TString& q = get_tmp_string(); q << "USE " << table; return q; } static TString& build_query(const int logicnum) { const TRectype rec(logicnum); TString& q = get_tmp_string(); q << "USE " << logicnum; if (rec.exist(CLI_UTENTE)) q << " SELECT (UTENTE!=\"" << ini_get_string(CONFIG_DITTA, "bs", "SKImportUser") << "\")"; return q; } void TSknet_sync::sync_table(const char* table, const char* out_table, const TString_array& fields) { const TString& q = build_query(table); TISAM_recordset set(q); sync_table(set, out_table, fields); } void TSknet_sync::sync_table(const int logicnum, const char* out_table, const TString_array& fields) { const TString& q = build_query(logicnum); TISAM_recordset set(q); sync_table(set, out_table, fields); } void TSknet_sync::sync_ums() { TString_array fields; fields.add("CodUntMis|CODTAB"); fields.add("DSUntMis|S0"); sync_table("%UMS", "tieUntMisura", fields); } void TSknet_sync::sync_iva() { TString_array fields; fields.add("CodIva|CODTAB"); fields.add("CodIvaSt|CODTAB"); fields.add("DSIva|S0"); fields.add("Aliquota|R0"); sync_table("%IVA", "tieIva", fields); } void TSknet_sync::sync_anamag() { 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||PZ"); fields.add("CodIva|" ANAMAG_CODIVA); fields.add("CodLinea|" ANAMAG_GRMERC "|1|3"); fields.add("CodCategMerceologica|" ANAMAG_GRMERC); fields.add("ArtGruppo|" ANAMAG_GRUPPOV); fields.add("ArtConto|" ANAMAG_CONTOV); fields.add("ArtSottoconto|" ANAMAG_SOTTOCV); fields.add("Bloccato|" ANAMAG_SOSPESO); TString query = build_query(LF_ANAMAG); query << "\nJOIN " << LF_UMART << " INTO CODART==CODART"; TISAM_recordset art(query); sync_table(art, "tieArticoli", fields); // Sincronizzo le unità di misura { query.cut(0) << "SELECT * from tieArticoli where Origine=" << their_origin() << " AND " << where_time_import() << ";"; //_log->log(0, query); TODBC_recordset odbcunit(query); odbcunit.connect(_dsn, _usr, _psw); TProgress_monitor p(odbcunit.items(), "Aggiornamento unità di misura"); for (bool go = odbcunit.move_first(); go; go = odbcunit.move_next()) { if (!p.add_status()) break; // Umart TLocalisamfile umart(LF_UMART); TRectype rumart(LF_UMART); const TString& codpadre = odbcunit.get("CodPadre").as_string(); // Quel coglione mette codart blank e non è in grado di sistemarlo... // E non so se ci sono solo spazi nel codice, quindi devo farlo a mano da codice if (codpadre.blank()) continue; rumart.put("CODART", codpadre); rumart.put("NRIGA", 1); rumart.put("UM", "PZ"); rumart.put("FC", UNO); if (rumart.rewrite_write(umart) != NOERR) { // Eror! bool tolla = true; TString msg = "Errata importazione UM per l'articolo "; msg << codpadre; _log->log(1, msg); } } } { // Controllo se esistono varianti e le aggiungo query.cut(0) << "SELECT * FROM tieArtVarianti where origine=" << their_origin() << " AND " << where_time_import() << ";"; //_log->log(0, query); TODBC_recordset odbc(query); odbc.connect(_dsn, _usr, _psw); // Apro codcorr per aggiungere i codici dei clienti TLocalisamfile ccor(LF_CODCORR); TRectype rccor(LF_CODCORR); // Il primo giro svuoto CODCORR dagli articoli inseriti (sono stati importati tantissimi articoli con CODART == CODARTALT, così facendo pulisco) TProgress_monitor p(odbc.items(), "Pulizia Codici clienti"); for (bool go = odbc.move_first(); go; go = odbc.move_next()) { if (!p.add_status()) break; ccor.first(); // Useless?? rccor.zero(); const TString& codpadre = odbc.get("CodPadre").as_string(); rccor.put(CODCORR_CODART, codpadre); rccor.put(CODCORR_NRIGA, 1); if (codpadre.full() && ccor.read(rccor, _isequal) == NOERR) { while (rccor.get(CODCORR_CODART) == codpadre) { rccor.remove(ccor); rccor.next(ccor); } } } for (bool go = odbc.move_first(); go; go = odbc.move_next()) { // Lavoro sul file ISAM, più veloce // Azzero ccor.first(); // Useless?? rccor.zero(); bool add = true; int riga = 1; const TString& codpadre = odbc.get("CodPadre").as_string(); const TString& codarticolo = odbc.get("CodArticolo").as_string(); if (codpadre.blank() || codarticolo.blank()) continue; rccor.put(CODCORR_CODART, codpadre); rccor.put(CODCORR_NRIGA, riga); // E quel coglione mette sempre codart == codartalt... if (codpadre != codarticolo && ccor.read(rccor, _isequal) == NOERR) { while (add && rccor.get(CODCORR_CODART) == codpadre) { riga = rccor.get_int(CODCORR_NRIGA); add = rccor.get(CODCORR_CODARTALT) != codarticolo; rccor.next(ccor); } } if (add) { rccor.zero(); rccor.put(CODCORR_CODART, codpadre); rccor.put(CODCORR_NRIGA, riga++); rccor.put(CODCORR_CODARTALT, codarticolo); rccor.put(CODCORR_UM, ini_get_string(CONFIG_DITTA, "BS", "SKCodUmsDef")); ccor.write(rccor); } } } // Conai if (_hasConai) { // Apro anamag per aggiungere le informazioni sugli articoli TLocalisamfile art(LF_ANAMAG); TRectype rart(LF_ANAMAG); query.cut(0) << "SELECT * FROM tieArtCONAI where origine=" << their_origin() << " AND " << where_time_import() << ";"; //_log->log(0, query); TODBC_recordset odbc(query); odbc.connect(_dsn, _usr, _psw); TProgress_monitor p(odbc.items(), "Aggiornamento CONAI"); for (bool go = odbc.move_first(); go; go = odbc.move_next()) { if (!p.add_status()) break; art.first(); // Useless?? rart.zero(); rart.put(ANAMAG_CODART, odbc.get("Cod_PK").as_string()); if (odbc.get("Cod_PK").as_string().blank()) continue; if (rart.read(art, _isequal) == NOERR) { static TString catCON; // Metodo del cazzo, format crasha e non ho tempo, magari in un futuro sistemarlo (se non ho visto male funziona solo su linux) TString a = odbc.get("CatAC").as_string().left(4); a.lpad(4); TString b = odbc.get("CatAL").as_string().left(4); b.lpad(4); TString c = odbc.get("CatCA").as_string().left(4); c.lpad(4); TString d = odbc.get("CatLE").as_string().left(4); d.lpad(4); TString e = odbc.get("CatPL").as_string().left(4); e.lpad(4); TString f = odbc.get("CatVE").as_string().left(4); f.lpad(4); catCON.cut(0) << a << b << c << d << e << f; /* catCON.format("%4 s%4 s%4 s%4 s%4 s%4 s", odbc.get("CatAC").as_string().left(4), // Categoria Acciaio odbc.get("CatAL").as_string().left(4), // Categoria Alluminio odbc.get("CatCA").as_string().left(4), // Categoria Carta odbc.get("CatLE").as_string().left(4), // Categoria Legno odbc.get("CatPL").as_string().left(4), // Categoria Plastica odbc.get("CatVE").as_string().left(4) // Categoria Vetro ); */ rart.put(ANAMAG_CONAISC, catCON); rart.put(ANAMAG_CONACC, odbc.get("PesoAC").as_real()); // Peso Acciaio rart.put(ANAMAG_CONALL, odbc.get("PesoAL").as_real()); // Peso Alluminio rart.put(ANAMAG_CONCAR, odbc.get("PesoCA").as_real()); // Peso Carta rart.put(ANAMAG_CONLEG, odbc.get("PesoLE").as_real()); // Peso Legno rart.put(ANAMAG_CONPLA, odbc.get("PesoPL").as_real()); // Peso Plastica rart.put(ANAMAG_CONVET, odbc.get("PesoVE").as_real()); // Peso Vetro art.rewrite(rart); } else // EROR! EROR! { bool tolla = true; } } } } 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& TSknet_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 TSknet_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 TSknet_sync::load_clifo(const char tipocf) { TString str(255); str << "SELECT * FROM tieAnagCFP WHERE [Origine]=" << their_origin() << " AND"; str << '[' << (tipocf == 'F' ? "Fornitore" : "Cliente") << "]=1 AND " << where_time_import() << ";"; TFast_isamfile clifo(LF_CLIFO); //_log->log(0, str); 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()) { if (odbc.get("Cod_PK").as_string().len() == 1) continue; 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(); codcf = atol(cod_pk.mid(1)); } TLocalisamfile cfv(LF_CFVEN); 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 { // NON É POSSIBILE TString err = "Attenzione è prensente un cliente con codice errato: "; err << odbc.get("Cod_PK").as_string() << " Non verrà importato."; _log->log(2, err); continue; } cfv.put(CFV_TIPOCF, tipocf); cfv.put(CFV_CODCF, codcf); if (cfv.read(_isequal) != NOERR) { cfv.zero(); cfv.put(CFV_TIPOCF, tipocf); cfv.put(CFV_CODCF, codcf); TString8 codprcf; codprcf.format("C%06ld%c", codcf, tipocf); cfv.put(CFV_CODPRCF, codprcf); } clifo.put(CLI_RAGSOC, odbc.get("RagSoc").as_string()); clifo.put(CLI_PAIV, odbc.get("PartitaIva").as_string()); clifo.put(CLI_COFI, odbc.get("CodFiscale").as_string()); clifo.put(CLI_MAIL, odbc.get("EMail").as_string()); // Fatturazione Elettronica clifo.put(CLI_PEC, odbc.get("PEC").as_string()); cfv.put(CFV_PADESTIN, odbc.get("CodDest").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)); clifo.put(CLI_CIVCF, civ); clifo.put(CLI_LOCCF, loc); clifo.put(CLI_CAPCF, odbc.get("Cap").as_string()); // Stato TString statoISO = odbc.get("CodStato").as_string(), stato = ""; if (statoISO.empty()) statoISO = "IT"; clifo.put(CLI_STATOPAIV, statoISO); // Se lo stato no è Italia devo fare una ricerca scomoda e lenta in %STA if (statoISO != "IT") { TRelation relCom(LF_TABCOM); TRectype& partCom = relCom.curr(); partCom.zero(); partCom.put("COD", "STA"); TCursor cur(&relCom, "", 1, &partCom, &partCom); for (cur = 0; cur.pos() < cur.items(); ++cur) if (cur.curr().get("S10") == statoISO) { stato = cur.curr().get("CODTAB"); break; } } clifo.put(CLI_STATOCF, stato); // Comune TString comune; int errComuni; TLocalisamfile isamComuni(LF_COMUNI); comune = odbc.get("Citta").as_string(); isamComuni.put("STATO", stato); isamComuni.put("COM", comune); errComuni = isamComuni.read(_isequal); // Se non lo trovo cambio la chiave e provo a cercarlo per Descrizione if (errComuni != NOERR) { isamComuni.zero(); isamComuni.setkey(2); isamComuni.put("DENCOM", comune.upper()); errComuni = isamComuni.read(_isequal); comune = errComuni == NOERR ? isamComuni.get("COM") : ""; } if(comune.blank()) clifo.put(CLI_LOCCF, odbc.get("Citta").as_string()); else clifo.put(CLI_COMCF, comune); 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); split_phone(odbc, "Fax", clifo, CLI_PFAX, CLI_FAX); clifo.put(CLI_MAIL, odbc.get("EMail").as_string()); clifo.put(CLI_CODPAG, odbc.get(tipocf == 'F' ? "For_CodPagamento" : "Cli_CodPagamento").as_string()); if (_hasConai) { cfv.put(CFV_DATAECONAI, odbc.get("CNDataEs").as_date()); cfv.put(CFV_ESACC, odbc.get("CNEsac").as_string()); // Esenzione Acciaio cfv.put(CFV_ESALL, odbc.get("CNEsal").as_string()); // Esenzione Alluminio cfv.put(CFV_ESCAR, odbc.get("CNEsca").as_string()); // Esenzione Carta cfv.put(CFV_ESPLA, odbc.get("CNEspl").as_string()); // Esenzione Plastica cfv.put(CFV_ESLEG, odbc.get("CNEsle").as_string()); // Esenzione Legno cfv.put(CFV_ESVET, odbc.get("CNEsve").as_string()); // Esenzione Vetro // So bad is so good! TString prodConai; prodConai << (odbc.get("CNPac").as_int() == 1 ? "X" : " "); // Produttore Acciaio prodConai << (odbc.get("CNPal").as_int() == 1 ? "X" : " "); // Produttore Alluminio prodConai << (odbc.get("CNPca").as_int() == 1 ? "X" : " "); // Produttore Carta prodConai << (odbc.get("CNPpl").as_int() == 1 ? "X" : " "); // Produttore Plastica prodConai << (odbc.get("CNPle").as_int() == 1 ? "X" : " "); // Produttore Legno prodConai << (odbc.get("CNPve").as_int() == 1 ? "X" : " "); // Produttore Vetro cfv.put("PRODCONAI", prodConai); cfv.put(CFV_ADDCONAI, prodConai.blank()); //cfv.put(CFV_CONAIASS, prodConai.blank()); Non c'è modo di sapere quando metterlo } cfv.put(CFV_RAGGDOC, !odbc.get("RaggDoc").as_string().blank()); TLocalisamfile cfb(LF_CFBAN); cfb.put("TIPOCF", tipocf); cfb.put("CODCF", codcf); cfb.put("TIPOBAN", "V"); cfb.put("NRIGA", 1); if (cfb.read(_isequal) != NOERR) { cfb.zero(); cfb.put("TIPOCF", tipocf); cfb.put("CODCF", codcf); cfb.put("TIPOBAN", "V"); cfb.put("NRIGA", 1); } TString cin, abi, cab, contcor, iban; if (tipocf == 'C') { abi = odbc.get("Cli_Abi").as_string(); cab = odbc.get("Cli_Cab").as_string(); contcor = odbc.get("Cli_ContoCorr").as_string(); } else { abi = odbc.get("For_Abi").as_string(); cab = odbc.get("For_Cab").as_string(); contcor = odbc.get("For_ContoCorr").as_string(); } if (!abi.blank() && !cab.blank()) { int err = 1; // Calcolo il CIN TString msg, bban; bban << "#" << abi << cab << contcor; for (char cin = 'A'; cin <= 'Z' && err == 1; cin++) { bban[0] = cin; err = bban_check(bban, msg); if (err == 0) { cin = bban[0]; break; } } // Calcolo l'IBAN if (err == NOERR) { err = 1; iban.cut(0) << statoISO << "##" << bban; for (int pp = 0; pp <= 99 && err == 1; pp++) { msg.format("%02d", pp); iban.overwrite(msg, 2); err = iban_check(iban, msg); if (err == 0) { break; } } } // Abi e Cab sempre, posso anche avere solo il primo dei due cfb.put("ABI", abi); cfb.put("CAB", cab); // Il conto corrente ovviamente solo se è giusto if (err == NOERR) { cfb.put("NUMCC", contcor); cfb.put("IBAN", iban); } else { TString msg; msg << "L'IBAN del contatto " << tipocf << " " << codcf << "non è corretto, verranno importati solo ABI e CAB"; cfb.put("NUMCC", ""); cfb.put("IBAN", ""); _log->log(1, msg); } cfb.write_rewrite(); } // Always true cfv.put(CFV_RAGGEFF, true); cfv.put(CFV_ADDBOLLI, tipocf == 'C'); // Non ho capito se alla fine mi passa qua i dati o nel campo NOTE cfv.put(CFV_ASSFIS, cache().get("%SKI", tipocf == 'C' ? odbc.get("Cli_CodIva").as_string() : odbc.get("For_CodIva").as_string(), "S6")); // Parso il campo Note TToken_string note(odbc.get("Note").as_string()); if (!note.blank() && note[note.len() - 1] == '|') note.cut(note.len() - 1); for (int i = 0; i < note.items(); i++) { int pipe = note.find('|'); TString token = note.get(i); if (token.starts_with("PNE=")) { TToken_string pne(token.mid(4), ','); TString nonacc; TString nonscd; for (int k = 0; k < pne.items(); k++) { TToken_string pno(pne.get(k), '/'); // DA GIORNO DA MESE A GIORNO A MESE nonacc << pno.get(0) << "-" << pno.get(1) << "," << pno.get(2) << "-" << pno.get(3) << ";"; // IL GIORNO IL MESE nonscd << pno.get(4) << "-" << pno.get(5) << ";"; } nonacc.cut(nonacc.len() - 1); nonscd.cut(nonscd.len() - 1); cfv.put(CFV_NONACCEFF, nonacc); cfv.put(CFV_NONSCADEFF, nonscd); } else if (token.starts_with("RE=")) { // Disabled, always true by analysis } else if (token.starts_with("NOTE=")) { TString note = token.mid(5); if (!note.blank()) cfv.put(CFV_CODNOTE, clifo_add_note(cfv, note)); } else if (token.starts_with("ENAMAIL=")) { bool bymail = false; TString email = ""; if (token.mid(8).full()) { bymail = true; email = odbc.get("EMail").as_string(); } clifo.put(CLI_BYMAIL, bymail); clifo.put(CLI_DOCMAIL, email); } else if (token.starts_with("REF=")) { clifo.put(CLI_REFERENTE, token.mid(4)); } else if (token.starts_with("EDOC=")) { clifo.put(CLI_BYMAIL, true); clifo.put(CLI_DOCMAIL, token.mid(5)); } else if (token.starts_with("SCONTO=")) { cfv.put(CFV_SCONTO, token.mid(7)); } else if (token.starts_with("AGENT=")) { cfv.put(CFV_CODAG, token.mid(6)); } else if (token.starts_with("ASSFIS=")) { cfv.put(CFV_ASSFIS, cache().get("%SKI", token.mid(7), "S6")); } else { if (!token.blank()) { // Han chiesto di disabilitarlo //cfv.put(CFV_CODNOTE, clifo_add_note(cfv, token)); } else { TString err = "Token non riconosciuto per il c/f "; err << tipocf << codcf << ": "; err << token.left(token.find('=')) << "\nQuesto dato non verrà importato"; _log->log(2, err); } } } TString user = ini_get_string(CONFIG_DITTA, "BS", "SKImportUser"); if (user.empty()) user = "BEESTORE"; clifo.put(CLI_UTENTE, user); TDate dua = odbc.get(BS_DTULTAGG).as_date(); if (!dua.ok()) dua = TDate(TODAY); clifo.put(CLI_DATAAGG, dua); cfv.write_rewrite(); clifo.write_rewrite(); if (!pi.add_status()) break; } } void TSknet_sync::sync_clifo(int cfmask) { if (cfmask & 1) load_clifo('C'); if (cfmask & 2) load_clifo('F'); } void TSknet_sync::clean() { if (yesno_box("Vuoi svuotare il database?") == 1) { // Mi ricarico il tempo set_time(); TString str; TODBC_recordset voldemort(str); voldemort.connect(_dsn, _usr, _psw); // Clienti if (ini_get_bool(CONFIG_DITTA, "BS", "SKSyncClienti")) str << "DELETE FROM tieAnagCFP WHERE Origine=" << their_origin() << " AND Cliente=1 AND " << where_time_delete() << ";\n"; // Fornitori if (ini_get_bool(CONFIG_DITTA, "BS", "SKSyncFornitori")) str << "DELETE FROM tieAnagCFP WHERE Origine=" << their_origin() << " AND Fornitore=1 AND " << where_time_delete() << ";\n"; // Documenti if (ini_get_bool(CONFIG_DITTA, "BS", "SKSyncDoc")) { str << "DELETE FROM tieTBolFat WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; str << "DELETE FROM tieDMovMag WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; str << "DELETE FROM tieDMovMagCONAI WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; } // Articoli di Magazzino if (ini_get_bool(CONFIG_DITTA, "BS", "SKSyncAnamag")) { str << "DELETE FROM tieArticoli WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; str << "DELETE FROM tieArtVarianti WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; str << "DELETE FROM tieArtCONAI WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; } // Valute if (ini_get_bool(CONFIG_DITTA, "BS", "SKSyncVAL")) str << "DELETE FROM tieValute WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; // Codici IVA if (ini_get_bool(CONFIG_DITTA, "BS", "SKSyncIVA")) str << "DELETE FROM tieIVA WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; // UMS if (ini_get_bool(CONFIG_DITTA, "BS", "SKSyncUMS")) str << "DELETE FROM tieUntMisura WHERE Origine=" << their_origin() << " AND " << where_time_delete() << ";\n"; //_log->log(0, str); voldemort.exec(str); // Elimina tutte le anagrafiche importate da BeeStore voldemort.commit(); } } void TSknet_sync::set_time() { // Prelevo il tempo dell'ultima importazione sprintf_s(_lastUpdate, sizeof(_lastUpdate), ini_get_string(CONFIG_DITTA, "BS", "LAST_IMPORT", "19900101 00:00:00.000")); // Preparo il tempo attuale time_t rt = time(NULL); struct tm * now = localtime(&rt); sprintf_s(_thisUpdate, sizeof(_thisUpdate), "%d%02d%02d %02d:%02d:%02d.999", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); } const TString TSknet_sync::where_time_import() { TString time_import; time_import << "[DTUltAgg] > '" << _lastUpdate << "'"; return time_import; } const TString TSknet_sync::where_time_delete() { TString time_delete; time_delete << "[DTUltAgg] <= '" << _lastUpdate << "'"; return time_delete; } const bool TSknet_sync::clifo_has_conai(const TString4& tipocf, const long codcf) { TString keyCli; keyCli << tipocf << "|" << codcf; TRectype clifo = cache().get(LF_CFVEN, keyCli); return clifo.get_bool("ADDCONAI") || !clifo.get("PRODCONAI").blank(); } bool TSknet_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 TSknet_sync::save_and_delete_doc(TDocumento*& doc) const { int err = 0; if (doc != NULL) { 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; } } delete doc; doc = NULL; } return err == 0; } void TSknet_sync::sync_val() { TString_array fields; fields.add("CodValuta|CODTAB"); fields.add("DSValuta|S0"); fields.add("Simbolo|CODTAB"); sync_table("%VAL", "tieValute", fields); } void TSknet_sync::sync_doc() { 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.*, tieTBolFat.Annullato AS DOCANNULLATO, tieDMovMagCONAI.*\n"; str << "FROM tieDMovMag\nRIGHT JOIN tieTBolFat ON tieDMovMag.CodTestata = tieTBolFat.Cod_PK\n"; if (_hasConai) str << "LEFT JOIN tieDMovMagCONAI ON tieDMovMag.Cod_PK = tieDMovMagCONAI.Cod_PK\n"; str << "WHERE tieTBolFat.Origine = " << their_origin() << " AND tieTBolFat." << where_time_import(); //str << "WHERE tieDMovMag.Origine = " << their_origin() << " AND tieDMovMag.TipoTestata = 2"; // verificare str << "\nORDER BY tieTBolFat.Cod_PK,tieDMovMag.NumRiga"; //_log->log(0, str); 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(), '\\'); const TString keyDoc = docs.get("CodTestata").as_string(); nd = docs.get("NumRif").as_int(); 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" && tipocf != "F") || codcf == 0) { TString msg; msg.format("Attenzione! Per il doc n.%d è presente il tipo C/F = '%s' con cod = %d \nIl documento verrà saltato.", nd, tipocf, codcf); _log->log(1, msg); continue; } 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; TString8 tipodoc; char stato_doc = '\0'; // Controllo se ho ricevuto un codice Campo per il TipoDoc o devo prenderlo dalle impostazioni if (docs.get("TipoDocCE").is_empty()) { switch (docs.get("TipoDoc").as_int()) { case 1: // Bolla numdoc = ini_get_string(CONFIG_DITTA, "BS", "SKCODNUMBOL"); tipodoc = ini_get_string(CONFIG_DITTA, "BS", "SKTIPODOCBOL"); break; case 2: // Fattura numdoc = ini_get_string(CONFIG_DITTA, "BS", "SKCODNUMFAT"); tipodoc = ini_get_string(CONFIG_DITTA, "BS", "SKTIPODOCFAT"); break; case 6: // NC numdoc = ini_get_string(CONFIG_DITTA, "BS", "SKCODNUMNC"); tipodoc = ini_get_string(CONFIG_DITTA, "BS", "SKTIPODOCNC"); break; case 7: // Richiesta Trasferimento da Altro Magazzino numdoc = ini_get_string(CONFIG_DITTA, "BS", "SKCODNUMTAM"); tipodoc = ini_get_string(CONFIG_DITTA, "BS", "SKTIPODOCTAM"); break; case 9: // Ordine Cliente numdoc = ini_get_string(CONFIG_DITTA, "BS", "SKCODNUMORC"); tipodoc = ini_get_string(CONFIG_DITTA, "BS", "SKTIPODOCORC"); break; default: warning_box("Attenzione! Per il doc con codice: %s è presente un tipo documento non supportato.\nIl documento saltato", keyDoc); } } else { numdoc = docs.get("TipoDocCE").as_string(); tipodoc = docs.get("TipoDocCE").as_string(); } if (numdoc.blank() || tipodoc.blank()) { _log->log(2, "Configurare parametri per movimenti Bee Store"); return; } TTipo_documento tipo(tipodoc); const TString8 codcaus = tipo.caus_mov().blank() ? codcausdef : tipo.caus_mov(); // Controllo che il documento non esista già static TDocumento existDoc; if (existDoc.read('D', datadoc.year(), numdoc, nd) == NOERR) // Ha uno stato che considero bloccato { stato_doc = existDoc.stato(); if (existDoc.stato() >= '3')// && docs.get("DOCANNULLATO").as_int() == 1) { TString err; err << "Il documento " << datadoc.year() << " " << numdoc << " " << nd << " con chiave " << docs.get("Cod_PK").as_string() << " verrà sostituito ma è già stato fatturato."; _log->log(2, err); } existDoc.remove(); } /* // Salto i documenti annullati if (docs.get("tieTBolFat.Annullato").as_int() == 1) continue; */ 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(); if (stato_doc != '\0') doc->put(DOC_STATO, stato_doc); 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 TString codAg = docs.get("CodAgente").as_string(); const TString codPag = docs.get("CodPagamento").as_string(); if (!codAg.blank()) doc->put(DOC_CODAG, codAg); if (!codPag.blank()) doc->put(DOC_CODPAG, codPag); } const int tipoart = docs.get("TipoArticolo").as_int(); TString4 tiporiga; // Se la riga è customizzata evito i controlli if (tipoart >= 14) { tiporiga = docs.get("TipoArticolo").as_string(); } else { // Facciamo un po' di speculazioni switch (tipoart) { default: case 0: // Tiporiga 1 -> Merce tiporiga = "01"; break; case 1: // Se la QTA è 0 sarà una spesa a spesa a valore if (docs.get("Quantita").as_int() == 0) { tiporiga = "02"; } else { tiporiga = "03"; } break; case 2: // Se non ho QTA sarà una descrizione if (docs.get("Quantita").as_int() == 0) { tiporiga = "05"; // Descrizione } else // nel dubbio, Merce tiporiga = "01"; } } const TString80 codart = docs.get("CodArticolo").as_string(); const TString descr = docs.get("DSRiga").as_string(); if (tiporiga == "01" && ini_get_bool(CONFIG_DITTA, "BS", "SKUseCustomRiga", false)) { TLocalisamfile codcor(LF_CODCORR); codcor.setkey(2); TRectype rcodcor(LF_CODCORR); rcodcor.put(CODCORR_CODARTALT, codart); if (codcor.read(rcodcor, _isequal) == NOERR) tiporiga = ini_get_string(CONFIG_DITTA, "BS", "SKNumCustomRiga", "14"); } TRectype& rdoc = doc->new_row(tiporiga); if(codart.blank() && tiporiga == "03" && descr.starts_with("Bancal")) rdoc.put(RDOC_CODART, "B1"); else 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(); 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)); TString ums = docs.get("CodUntMis").as_string(); if (ums.blank() && cache().get("%TRI", tiporiga, "S7") == "M") ums = ini_get_string(CONFIG_DITTA, "BS", "SKCodUmsDef"); rdoc.put(RDOC_UMQTA, ums); 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()); TString codiva = docs.get("CodIva").as_string(); if (codiva.blank() || codiva == "0") { codiva = ini_get_string(CONFIG_DITTA, "BS", "SKCodIvaDef"); } else { codiva = cache().get("%SKI", codiva, "S6"); } rdoc.put(RDOC_CODIVA, codiva); 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); // Provvigione agenti rdoc.put(RDOC_PERCPROV, docs.get("PercProvv").as_real()); // "CONSCACC", "CONSCALL", "CONSCCAR", "CONSCPLA", "CONSCLEG", "CONSCVET" if (_hasConai && clifo_has_conai(tipocf, codcf)) { // In base al conai che ha abilitato controllo if (ini_get_bool(CONFIG_DITTA, "ve", "CONFACC")) // Acciaio { rdoc.put("CONSCACC", docs.get("CatAC").as_string()); rdoc.put("CONPUACC", docs.get("PesoAC").as_string()); } if (ini_get_bool(CONFIG_DITTA, "ve", "CONFALL")) // Alluminio { rdoc.put("CONSCALL", docs.get("CatAL").as_string()); rdoc.put("CONPUALL", docs.get("PesoAL").as_string()); } if (ini_get_bool(CONFIG_DITTA, "ve", "CONFCAR")) // Carta { rdoc.put("CONSCCAR", docs.get("CatCA").as_string()); rdoc.put("CONPUCAR", docs.get("PesoCA").as_string()); } if (ini_get_bool(CONFIG_DITTA, "ve", "CONFLEG")) // Legno { rdoc.put("CONSCLEG", docs.get("CatLE").as_string()); rdoc.put("CONPULEG", docs.get("PesoLE").as_string()); } if (ini_get_bool(CONFIG_DITTA, "ve", "CONFPLA")) // Plastica { rdoc.put("CONSCPLA", docs.get("CatPL").as_string()); rdoc.put("CONPUPLA", docs.get("PesoPL").as_string()); } if (ini_get_bool(CONFIG_DITTA, "ve", "CONFVET")) // Vetro { rdoc.put("CONSCVET", docs.get("CatVE").as_string()); rdoc.put("CONPUVET", docs.get("PesoVE").as_string()); } } if (!pi.add_status()) break; } save_and_delete_doc(doc); // Salva ultimo documento in sospeso } bool TSknet_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")); _hasConai = ini_get_bool(CONFIG_DITTA, "BS", "SKEnabCONAI", false); 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 TSknet_sync::main_loop() { TSknet_mask mask; while (mask.run() == K_ENTER) { mask.autosave(); // Rende definitivi tutti i paramentri in [bs] _log = new TLog_report; // Prendo la data attuale set_time(); if (mask.get_bool("SKSyncUMS")) sync_ums(); if (mask.get_bool("SKSyncIVA")) sync_iva(); if (mask.get_bool("SKSyncAnamag")) sync_anamag(); if (mask.get_bool("SKSyncVAL")) sync_val(); int cfmask = 0; if (mask.get_bool("SKSyncClienti")) cfmask |= 1; if (mask.get_bool("SKSyncFornitori")) cfmask |= 2; if (cfmask) sync_clifo(cfmask); if (mask.get_bool("SKSyncDoc")) sync_doc(); _log->log(0, "Procedura terminata!"); _log->preview(); delete _log; _log = NULL; // Aggiorno l'ultimo uppidate ini_set_string(CONFIG_DITTA, "BS", "LAST_IMPORT", _thisUpdate); if (mask.get_bool("SKEmptyOnImp")) clean(); } } TSknet_sync& bss() { static TSknet_sync* bss = new TSknet_sync(); return *bss; } int bs0300(int argc, char* argv[]) { bss().run(argc, argv, TR("SKNT Importer")); return 0; }