Patch level : 12.0 no-patch
Files correlati : ps Commento : Import ordini export bolle Major Flexform
This commit is contained in:
		
							parent
							
								
									1085a270cd
								
							
						
					
					
						commit
						09aab17a34
					
				| @ -1,199 +1,126 @@ | ||||
| #include "flexform_xml.h" | ||||
| 
 | ||||
| #include <stack> | ||||
| #include <config.h> | ||||
| #include <date.h> | ||||
| #include <lffiles.h> | ||||
| #include <progind.h> | ||||
| #include <reputils.h> | ||||
| 
 | ||||
| #include "config.h" | ||||
| #include "date.h" | ||||
| #include "progind.h" | ||||
| #include "velib.h" | ||||
| #include "sqlset.h" | ||||
| 
 | ||||
| #define CHECK_CONDXML_OR_RETURNFALSE(cond, msg) { \ | ||||
|       TString str; \ | ||||
|       if (!(cond)) { \ | ||||
|         str << "Errore nella lettura dell'xml: " << (msg); \ | ||||
|         warning_box(str); \ | ||||
|         return false; } } | ||||
| 
 | ||||
| #define CHECK_NAMETAG_OR_RETURNFALSE(xml_element, name_tag) { \ | ||||
|       TString name; name << (name_tag); \ | ||||
|       TString msg; msg << "mi aspettavo di trovare il tag: " << name; \ | ||||
|       CHECK_CONDXML_OR_RETURNFALSE((xml_element)->get_name() == name, msg); } | ||||
|       //if ((xml_element)->get_name() != name) { \ | ||||
|       //  msg.cut(0) << "Errore nella lettura dell'xml:" << name; \ | ||||
|       //  warning_box(msg); \ | ||||
|       //  return false; } }
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // ELEMENTI DDT
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| // Testata DDT
 | ||||
| 
 | ||||
| void TDDT_testata_xml::set_testata(const char* data_doc, const char* num_doc) | ||||
| { | ||||
|   _datarow = new TXML_element("datarow", "");           add_child(*_datarow); | ||||
|   _dat_doc = new TXML_element("dat_doc", data_doc);     _datarow->add_child(*_dat_doc); | ||||
|   _des_num = new TXML_element("des_num_doc", num_doc);  _datarow->add_child(*_des_num); | ||||
| } | ||||
| 
 | ||||
| TDDT_testata_xml::~TDDT_testata_xml() | ||||
| { | ||||
|   delete _datarow; | ||||
|   delete _dat_doc; | ||||
|   delete _des_num; | ||||
| } | ||||
| 
 | ||||
| // Riga DDT
 | ||||
| 
 | ||||
| void TDDT_riga_xml::set_datarow(const char* ind_tiporiga, const char* cod_art, const char* des_articolo_riga, const char* qta_merce, const char* des_campo_libero6) | ||||
| { | ||||
|   const TString _cod_art  = cod_art;            _cod_art.left(25); | ||||
|   const TString _desc     = des_articolo_riga;  _desc.left(255); | ||||
|   const TString _libero6  = des_campo_libero6;  _libero6.left(30); | ||||
|   _datarow      = new TXML_element("datarow", "");                              add_child(*_datarow); | ||||
|   _tiporiga     = new TXML_element("ind_tiporiga", ind_tiporiga);               _datarow->add_child(*_tiporiga); | ||||
|   _art          = new TXML_element("cod_art", (const char*)_cod_art);           _datarow->add_child(*_art); | ||||
|   _des_articolo = new TXML_element("des_articolo_riga", (const char*)_desc);    _datarow->add_child(*_des_articolo); | ||||
|   _merce        = new TXML_element("qta_merce", qta_merce);                     _datarow->add_child(*_merce); | ||||
|   _libero       = new TXML_element("des_campo_libero6", (const char*)_libero6); _datarow->add_child(*_libero); | ||||
| } | ||||
| 
 | ||||
| void TDDT_riga_xml::set_datarow(const char* ind_tiporiga, const char* cod_art, const wchar_t* des_articolo_riga, const char* qta_merce, const char* des_campo_libero6) | ||||
| { | ||||
|   const TString _cod_art = cod_art;           _cod_art.left(25); | ||||
|   const TString _libero6 = des_campo_libero6; _libero6.left(30); | ||||
|   _datarow      = new TXML_element("datarow", "");                              add_child(*_datarow); | ||||
|   _tiporiga     = new TXML_element("ind_tiporiga", ind_tiporiga);               _datarow->add_child(*_tiporiga); | ||||
|   _art          = new TXML_element("cod_art", (const char*)_cod_art);           _datarow->add_child(*_art); | ||||
|   _des_articolo = new TXML_element("des_articolo_riga", des_articolo_riga);     _datarow->add_child(*_des_articolo); | ||||
|   _merce        = new TXML_element("qta_merce", qta_merce);                     _datarow->add_child(*_merce); | ||||
|   _libero       = new TXML_element("des_campo_libero6", (const char*)_libero6); _datarow->add_child(*_libero); | ||||
| } | ||||
| 
 | ||||
| TDDT_riga_xml::~TDDT_riga_xml() | ||||
| { | ||||
|   delete _datarow; | ||||
|   delete _tiporiga; | ||||
|   delete _art; | ||||
|   delete _des_articolo; | ||||
|   delete _merce; | ||||
|   delete _libero; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // ELEMENTI ORDINI
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| // Testata Ordini
 | ||||
| 
 | ||||
| void TOrdini_testata_xml::set_testata(const char* data_doc, const char* num_doc, const char* str) | ||||
| { | ||||
|   _datarow    = new TXML_element("datarow", "");                add_child(*_datarow); | ||||
| 
 | ||||
|   _dat_doc    = new TXML_element("dat_doc_esterno", data_doc);  _datarow->add_child(*_dat_doc); | ||||
|   _des_num    = new TXML_element("des_num_esterno", num_doc);   _datarow->add_child(*_des_num); | ||||
|   _sig_serie  = new TXML_element("sig_serie_esterno", str);     _datarow->add_child(*_sig_serie); | ||||
| } | ||||
| 
 | ||||
| TOrdini_testata_xml::~TOrdini_testata_xml() | ||||
| { | ||||
|   delete _datarow; | ||||
|   delete _dat_doc; | ||||
|   delete _des_num; | ||||
|   delete _sig_serie; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Riga Ordini
 | ||||
| 
 | ||||
| void TOrdini_riga_xml::set_datarow(const char* ind_tiporiga, const char* cod_art, const char* des_articolo_riga, const char* qta_merce, const char* des_campo_libero6) | ||||
| { | ||||
|   _datarow      = new TXML_element("datarow", "");                          add_child(*_datarow); | ||||
| 
 | ||||
|   _tiporiga     = new TXML_element("ind_tiporiga", ind_tiporiga);           _datarow->add_child(*_tiporiga); | ||||
|   _art          = new TXML_element("cod_art", cod_art);                     _datarow->add_child(*_art); | ||||
|   _des_articolo = new TXML_element("des_articolo_riga", des_articolo_riga); _datarow->add_child(*_des_articolo); | ||||
|   _merce        = new TXML_element("qta_merce", qta_merce);                 _datarow->add_child(*_merce); | ||||
|   _libero       = new TXML_element("des_campo_libero6", des_campo_libero6); _datarow->add_child(*_libero); | ||||
| } | ||||
| 
 | ||||
| TOrdini_riga_xml::~TOrdini_riga_xml() | ||||
| { | ||||
|   delete _datarow; | ||||
|   delete _tiporiga; | ||||
|   delete _art; | ||||
|   delete _des_articolo; | ||||
|   delete _merce; | ||||
|   delete _libero; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // Flexform xml export
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| TFlexform_xml::TFlexform_xml(const char* xml_name, bool to_export) : _file_name(xml_name), _fout(nullptr), _export(to_export) | ||||
| { | ||||
|   _esa_import.set_root(); | ||||
|   if (_export) | ||||
|     _fout = new ofstream(xml_name); | ||||
|   else | ||||
|     _fin = new ifstream(xml_name); | ||||
| } | ||||
| #include "../ve/velib04.h" | ||||
| 
 | ||||
| #define RDOC_RIFFLEX "RIFFLEX" | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // Flexform DDT export
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| int TFlexform_xml_ddt::add_doc() | ||||
| { | ||||
|   const shared_ptr<TXML_element>      doc   = make_shared<TXML_element>("DOC_UNICO", ""); | ||||
|   const shared_ptr<TDDT_testata_xml>  test  = make_shared<TDDT_testata_xml>(); | ||||
|   _docs_unico.insert(_docs_unico.end(), doc); | ||||
|   _docs_unico.back()->set_parent(_esa_import); | ||||
| 
 | ||||
|   _testate.insert(_testate.end(), test); | ||||
|   _testate.back()->set_parent(*_docs_unico.back()); | ||||
|   return _docs_unico.size(); | ||||
| void TFlexform_xml_ddt::add_row(TXmlItem & outdoc, const TRiga_documento & rdoc, TLog_report * log) | ||||
| { | ||||
|   const TString cod_art = rdoc.get(RDOC_CODARTMAG); // Codice Flexform.
 | ||||
|   const TArticolo & art = cached_article(cod_art); | ||||
|   const TString cod_art_flex = art.get(ANAMAG_CODPMS); | ||||
|   TString descr = rdoc.get(RDOC_DESCR); | ||||
|   const TString num_ordine = rdoc.get(RDOC_NDOC); | ||||
|   const int nrow = rdoc.get_int(RDOC_NRIGA); | ||||
|   TToken_string refs(rdoc.get(RDOC_ORIGINAL_ROWS), ','); | ||||
|   TToken_string ref_qta(rdoc.get(RDOC_ORIGINAL_QTAROWS), ','); | ||||
|   TString_array ref_rows; | ||||
| 
 | ||||
|   ref_rows.tok2arr(refs); | ||||
|   if (rdoc.sola_descrizione()) | ||||
|   { | ||||
|     TXmlItem & row = outdoc.AddChild("MG_MOVMAGR"); | ||||
|     TXmlItem & datarow = row.AddChild("datarow"); | ||||
| 
 | ||||
|     datarow.AddEnclosedText("ind_tiporiga", rdoc.tipo().is_descrizione() ? "D" : "A"); | ||||
|     if (rdoc.get_bool(RDOC_DESCLUNGA)) | ||||
|       descr << rdoc.get(RDOC_DESCEST); | ||||
|     datarow.AddEnclosedText("des_articolo_riga", descr); | ||||
|   } | ||||
| 
 | ||||
| int TFlexform_xml_ddt::add_row(const shared_ptr<TDDT_riga_xml>& riga, const int which_doc) | ||||
| { | ||||
|   int i = which_doc < 0 ? (int)_testate.size() - 1 : which_doc; | ||||
|   if (!_testate.empty() && i < (int)_testate.size()) | ||||
|     riga->set_parent(*_testate[i]); | ||||
|   else | ||||
|     i = -1; | ||||
|   return i; | ||||
| } | ||||
| 
 | ||||
| bool TFlexform_xml_ddt::print() | ||||
|   { | ||||
|   ofstream& out = *_fout; | ||||
|   out << R"(<?xml version="1.0" encoding="UTF-8"?>)" << endl; | ||||
|   const bool ok = _esa_import.print_on_file(_fout); | ||||
|   _fout->close(); | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| int TFlexform_xml_ddt::set_testata(const char* data_doc, const char* num_doc, const int which_doc) | ||||
|     FOR_EACH_ARRAY_ROW(ref_rows, r, tok) | ||||
|     { | ||||
|   int i = which_doc < 0 ? (int)_testate.size() - 1 : which_doc; | ||||
|   if (!_testate.empty() && i < (int)_testate.size()) | ||||
|     _testate[i]->set_testata(data_doc, num_doc); | ||||
|       TXmlItem & row = outdoc.AddChild("MG_MOVMAGR"); | ||||
|       TXmlItem & datarow = row.AddChild("datarow"); | ||||
| 
 | ||||
|       datarow.AddEnclosedText("ind_tiporiga", rdoc.tipo().is_descrizione() ? "D" : "A"); | ||||
|       if (rdoc.get_bool(RDOC_DESCLUNGA)) | ||||
|         descr << rdoc.get(RDOC_DESCEST); | ||||
|       datarow.AddEnclosedText("des_articolo_riga", descr); | ||||
|       if (cod_art_flex.full()) | ||||
|       { | ||||
|         TString msg = TR("Articolo : "); | ||||
| 
 | ||||
|         msg << cod_art << TR(" codificato come : ") << cod_art_flex; | ||||
|         MSG_ARTICOLO(num_ordine, nrow, msg, false) | ||||
|       } | ||||
|       else | ||||
|     i = -1; | ||||
|   return i; | ||||
|       { | ||||
|         TString msg = TR("Codice articolo flexform non trovato per l'articolo :"); | ||||
| 
 | ||||
|         msg << cod_art; | ||||
|         MSG_ARTICOLO(num_ordine, nrow, msg, true) | ||||
|       } | ||||
|       datarow.AddEnclosedText("cod_art", cod_art_flex); | ||||
|       datarow.AddEnclosedText("qta_merce", ref_qta.get()); | ||||
|       //     datarow.AddEnclosedText("qta_merce", rdoc.get(RDOC_QTA));
 | ||||
| 
 | ||||
|       const TRectype & rdoc_ref = cache().get(LF_RIGHEDOC, *tok); //     ORC | 2020 | D | 3 | 8
 | ||||
|       TRecfield riffld((TRectype &) rdoc_ref, "RG1:" RDOC_RIFFLEX); | ||||
|       const TString riford = (const char *)riffld; | ||||
| 
 | ||||
|       datarow.AddEnclosedText("des_campo_libero6", riford); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| TFlexform_xml_ddt::TFlexform_xml_ddt(const char* xml_name) : TFlexform_xml(xml_name) | ||||
| } | ||||
| 
 | ||||
| void TFlexform_xml_ddt::add_doc(const TDocumento & doc, TLog_report * log) | ||||
| { | ||||
|   TXmlItem & ddt = AddChild("DOC_UNICO"); | ||||
|   TXmlItem & testata = ddt.AddChild("MG_MOVMAGT"); | ||||
|   TXmlItem & datarowt = testata.AddChild("datarow"); | ||||
|   TFormatted_date datadoc = doc.get_date(DOC_DATADOC); datadoc.set_format("1444/"); | ||||
|   TString msg(TR("Esportazione")); msg << doc.get_long(DOC_NDOC); | ||||
| 
 | ||||
|   XML_MSG(msg); | ||||
|   datarowt.AddEnclosedText("dat_doc", datadoc.string()); | ||||
|   datarowt.AddEnclosedText("des_num_doc", doc.get(DOC_NDOC)); | ||||
| 
 | ||||
|   FOR_EACH_RDOC(doc, i, rdoc) | ||||
|     add_row(testata, *rdoc, log); | ||||
| } | ||||
| 
 | ||||
| void TFlexform_xml_ddt::export_docs(const TString & codnum, long codcli, int year, long from, long to, TLog_report * log) | ||||
| { | ||||
|   TLista_documenti docs; | ||||
|   TString header("Esportazione ddt"); | ||||
|   TCodice_numerazione num_ddt(codnum); | ||||
|   TToken_string tipi = num_ddt.tipi_doc(); | ||||
|   TToken_string stati("1|2|3|4|5|6|7|8|9"); | ||||
|   const int ndocs = docs.read('D', 'C', codcli, year, tipi, stati, nulldate, nulldate, codnum, from, to); | ||||
|   TProgress_monitor bar(ndocs, header); | ||||
| 
 | ||||
|   for (int n = 0; n < ndocs && bar.add_status(); n++) | ||||
|   { | ||||
|     const TDocumento & doc = docs[n]; | ||||
| 
 | ||||
|     add_doc(doc, log); | ||||
|   } | ||||
|   export_doc(); | ||||
| } | ||||
| 
 | ||||
| TFlexform_xml_ddt::TFlexform_xml_ddt(const char* xml_name) : TEsa_xml(xml_name) | ||||
| { | ||||
|   // <ESA_IMPORT Source=? CreationDate=? InstanceGuid=? FileVersion="1" />
 | ||||
|   _esa_import.set_attributes(TConfig(CONFIG_DITTA, "Main").get("RAGSOC"), TDate(TODAY), generate_GUID(), "1"); | ||||
|   SetTag("ESA_IMPORT"); | ||||
|   SetAttr("Source", cache().get(LF_NDITTE, prefix().get_codditta(), "RAGSOC")); | ||||
| 
 | ||||
|   SetAttr("CreationDate", today.string(full, '/')); | ||||
|   SetAttr("InstanceGuid", xvt_GUID()); | ||||
|   SetAttr("FileVersion", 1); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -201,114 +128,109 @@ TFlexform_xml_ddt::TFlexform_xml_ddt(const char* xml_name) : TFlexform_xml(xml_n | ||||
| // Flexform Ordini export
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| void TFlexform_xml_ordini::add_doc() | ||||
| const TString & TFlexform_xml_ordini::flexart2codart(const TString& cod_art_flexform) | ||||
| { | ||||
|  /* const shared_ptr<TXML_element>      doc = make_shared<TXML_element>("DOC_UNICO", "");
 | ||||
|   const shared_ptr<TDDT_testata_xml>  test = make_shared<TDDT_testata_xml>(); | ||||
|   _docs_unico.insert(_docs_unico.end(), doc); | ||||
|   _docs_unico.back()->set_parent(_esa_import); | ||||
|   const TRectype & anamag = cache().get(LF_ANAMAG, cod_art_flexform, 4); | ||||
| 
 | ||||
|   _testate.insert(_testate.end(), test); | ||||
|   _testate.back()->set_parent(*_docs_unico.back()); | ||||
|   return _docs_unico.size();*/ | ||||
|   return anamag.get(ANAMAG_CODART); | ||||
| } | ||||
| 
 | ||||
| bool TFlexform_xml_ordini::print() | ||||
| void TFlexform_xml_ordini::add_row(long id_ordine, const int nrow,  | ||||
|                                    TDocumento & doc, const TXmlItem * row, | ||||
|                                    TLog_report * log) | ||||
| { | ||||
|   ofstream& out = *_fout; | ||||
|   out << R"(<?xml version="1.0" encoding="UTF-8"?>)" << endl; | ||||
|   const bool ok = _esa_import.print_on_file(_fout); | ||||
|   _fout->close(); | ||||
|   return ok; | ||||
| } | ||||
|   TString4 tiporiga; | ||||
|   TString des_articolo_riga; | ||||
| 
 | ||||
| //bool TFlexform_xml_ordini::parse_ordine_xml(unique_ptr<char[]>& ford, const long len)
 | ||||
| //{
 | ||||
| //  TXML_parser parser(ford.get(), len);
 | ||||
| //  TString name;
 | ||||
| //  vector<pair<TString, TString>> attributi;
 | ||||
| //  parser.get_xml_info(name, attributi);
 | ||||
| //  _info_xml = std::make_unique<TXML_element>(name, TString(""), true);
 | ||||
| //  TXML_tag tag = parser.get_xml_tag();
 | ||||
| //  // <ESA_IMPORT Source=? CreationDate=? InstanceGuid=? FileVersion="1" />
 | ||||
| //  bool ok = true;
 | ||||
| //  TString source, creation_date, instance_guid, file_version, tipo_operazione;
 | ||||
| //  ok &= tag.get_attribute(source, "Source")
 | ||||
| //    && tag.get_attribute(creation_date, "CreationDate")
 | ||||
| //    && tag.get_attribute(instance_guid, "InstanceGuid")
 | ||||
| //    && tag.get_attribute(file_version, "FileVersion");
 | ||||
| //  if (!ok)
 | ||||
| //    return false;
 | ||||
| //  _esa_import.set_attributes(source, TDate(creation_date), instance_guid, file_version);
 | ||||
| //  tag = parser.get_xml_tag();
 | ||||
| //  tag.get_name(name);
 | ||||
| //  ok = tag.get_attribute(tipo_operazione, "TipoOperazione");
 | ||||
| //  _ordine_impegno = std::make_unique<TXML_element>((const char*)name, "");
 | ||||
| //  _ordine_impegno->add_attribute("TipoOperazione", tipo_operazione);
 | ||||
| //  _ordine_impegno->set_parent(_esa_import);
 | ||||
| //  _testata.set_parent(*_ordine_impegno);
 | ||||
| //  tag = parser.get_xml_tag();
 | ||||
| //  tag.get_name(name);
 | ||||
| //  if(name != "OR_ORDINIT")
 | ||||
| //  {
 | ||||
| //    warning_box("Errore durante la lettura del tag \"OR_ORDINIT\".");
 | ||||
| //    return false;
 | ||||
| //  }
 | ||||
| //  tag = parser.get_xml_tag();
 | ||||
| //  if (name != "datarow")
 | ||||
| //  {
 | ||||
| //    warning_box("Errore durante la lettura del tag \"datarow\" della testata dell'ordine.");
 | ||||
| //    return false;
 | ||||
| //  }
 | ||||
| //  //parser.get_until_tag_close("datarow");
 | ||||
| //  return true;
 | ||||
| //}
 | ||||
|   if (!row->GetEnclosedText("ind_tiporiga", tiporiga)) | ||||
|     XML_TAG_NOT_FOUND(id_ordine, nrow, "ind_tiporiga"); | ||||
|   if (!row->GetEnclosedText("des_articolo_riga", des_articolo_riga)) | ||||
|     XML_TAG_NOT_FOUND(id_ordine, nrow, "des_articolo_riga"); | ||||
| 
 | ||||
| bool TFlexform_xml_ordini::convert() const | ||||
| { | ||||
|   const std::vector<shared_ptr<TXML_element>>& imported = _importer._imported; | ||||
|   TProgress_monitor bar(imported.size(), "Conversione XML ..."); | ||||
|   for(auto it = imported.begin(); it != imported.end(); ++it) | ||||
|   { | ||||
|     if (!bar.add_status()) | ||||
|       break; | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
|   TRiga_documento& d_row = doc.new_row(tiporiga == "D" ? "05" : "01"); | ||||
| 
 | ||||
| TString TFlexform_xml_ordini::flexart2codart(const TString& cod_art_flexform) | ||||
|   d_row.put(RDOC_DESCR, des_articolo_riga); | ||||
|   if (tiporiga != "D") | ||||
|   { | ||||
|   TSQL_recordset sql(""); | ||||
|   TString query; query << "SELECT * FROM ANAMAG WHERE COD_PMS = '" << cod_art_flexform << "'"; | ||||
|   sql.set(query); | ||||
|   if(sql.items() == 1) | ||||
|     return sql.get(sql.find_column("CODART")).as_string(); | ||||
|   return ""; | ||||
|     TString cod_art; | ||||
|     real qta_merce; | ||||
|     TDate dat_evas_riga; | ||||
|     TString des_campo_libero6; | ||||
| 
 | ||||
|     if (!row->GetEnclosedText("cod_art", cod_art)) | ||||
|       XML_TAG_NOT_FOUND(id_ordine, nrow, "cod_art"); | ||||
| 
 | ||||
|     const TString cod_art_major = flexart2codart(cod_art); | ||||
|     const bool original_art_exist = cache().get(LF_ANAMAG, cod_art).full(); | ||||
|      | ||||
|     if (cod_art_major.full() || original_art_exist) | ||||
|     { | ||||
|       TString msg = TR("Articolo flexform : "); | ||||
| 
 | ||||
|       msg << cod_art; | ||||
|       if (cod_art_major.full()) | ||||
|         msg << TR(" codificato come : ") << cod_art_major; | ||||
|       MSG_ARTICOLO(id_ordine, nrow, msg, false); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       TString msg = TR("Codice articolo flexform : "); | ||||
| 
 | ||||
|       msg << cod_art << TR(" non trovato"); | ||||
|       MSG_ARTICOLO(id_ordine, nrow, msg, true); | ||||
|     } | ||||
|     if (!row->GetEnclosedReal("qta_merce", qta_merce)) | ||||
|       XML_TAG_NOT_FOUND(id_ordine, nrow, "qta_merce"); | ||||
|     if (!row->GetEnclosedDate("dat_evas_riga", dat_evas_riga)) | ||||
|       XML_TAG_NOT_FOUND(id_ordine, nrow, "dat_evas_riga"); | ||||
|     if (!row->GetEnclosedText("des_campo_libero6", des_campo_libero6)) | ||||
|       XML_TAG_NOT_FOUND(id_ordine, nrow, "des_campo_libero6"); | ||||
|     d_row.put(RDOC_CODART, cod_art_major.full() ? cod_art_major : cod_art); | ||||
|      | ||||
|     const TArticolo & art = cached_article(d_row.get(RDOC_CODART)); | ||||
|      | ||||
|     d_row.put(RDOC_UMQTA, art.first_um()); | ||||
|     d_row.put(RDOC_QTA, qta_merce); | ||||
|     d_row.put(RDOC_DATACONS, dat_evas_riga); | ||||
|     d_row.put("RIFFLEX", des_campo_libero6); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| bool TFlexform_xml_ordini::create_doc() | ||||
| { | ||||
|   const shared_ptr<TXML_element> esa_import = _importer._imported[1]; | ||||
|   CHECK_NAMETAG_OR_RETURNFALSE(esa_import, "ESA_IMPORT"); | ||||
|   bool ok = false; | ||||
| 
 | ||||
|   TXML_element* ordine_impegno  = esa_import->get_childs()[0]; | ||||
|   CHECK_NAMETAG_OR_RETURNFALSE(ordine_impegno, "ORDINE_IMPEGNO"); | ||||
|   if (import_doc()) | ||||
|   { | ||||
|     TLog_report * log = _log; | ||||
|     const TXmlItem * first = FindFirstChild("ORDINE_IMPEGNO"); | ||||
|     long id_ordine; | ||||
| 
 | ||||
|   const auto it = ordine_impegno->find_attribute("TipoOperazione"); | ||||
|   CHECK_CONDXML_OR_RETURNFALSE(it != ordine_impegno->get_attributes().end() && it->second == "Insert", | ||||
|                                "il 'Tipo Operazione' deve essere 'Insert'."); | ||||
|     if (first != nullptr) | ||||
|     { | ||||
|       if (first->GetAttr("TipoOperazione") != "Insert") | ||||
|         XML_ERROR(TR("il Tipo Operazione deve essere Insert.")); | ||||
| 
 | ||||
|   TXML_element* or_ordinit = ordine_impegno->get_childs()[0]; | ||||
|   CHECK_NAMETAG_OR_RETURNFALSE(or_ordinit, "OR_ORDINIT"); | ||||
|       const TXmlItem * ordine = first->FindFirstChild("OR_ORDINIT"); | ||||
| 
 | ||||
|   TXML_element* datarow = or_ordinit->get_childs()[0]; | ||||
|   CHECK_NAMETAG_OR_RETURNFALSE(datarow, "datarow"); | ||||
|       if (ordine != nullptr) | ||||
|       { | ||||
|         const TXmlItem * testata = ordine->FindFirstChild("datarow"); | ||||
| 
 | ||||
|   const TDate     dat_doc_esterno = (const char*)datarow->get_val_child("dat_doc_esterno"); | ||||
|   const TString&  des_num_esterno = datarow->get_val_child("des_num_esterno"); | ||||
|   const TDate     dat_evasione    = (const char*)datarow->get_val_child("dat_evasione"); | ||||
|         if (testata->GetEnclosedLong("des_num_esterno", id_ordine)) | ||||
|         { | ||||
|           TDate dat_doc_esterno; | ||||
|           TDate dat_evasione; | ||||
| 
 | ||||
|           if (!testata->GetEnclosedDate("dat_doc_esterno", dat_doc_esterno)) | ||||
|             XML_TAG_NOT_FOUND(id_ordine, 0, "N.ro ordine"); | ||||
|           if (!testata->GetEnclosedDate("dat_evasione", dat_evasione)) | ||||
|             XML_TAG_NOT_FOUND(id_ordine, 0, "N.ro ordine"); | ||||
|           //         "sig_serie_esterno"
 | ||||
|           TDocumento doc('D', dat_doc_esterno.year(), _codnum, -1); | ||||
|           TString msg(TR("Importazione documento ")); msg << id_ordine; | ||||
| 
 | ||||
|           XML_MSG(msg); | ||||
|           doc.put(DOC_TIPODOC, _codnum); | ||||
|           doc.put(DOC_STATO, "2"); | ||||
|           doc.put(DOC_DATADOC, dat_doc_esterno); | ||||
| @ -316,51 +238,34 @@ bool TFlexform_xml_ordini::create_doc() | ||||
|           doc.put(DOC_CODCF, _codcli_flex); | ||||
|           doc.put(DOC_DATACONS, dat_evasione); | ||||
| 
 | ||||
|   vector<TXML_element*> childs_ordinit = or_ordinit->get_childs(); | ||||
|   CHECK_CONDXML_OR_RETURNFALSE(!childs_ordinit.empty(), "non e' presente alcun ordine."); | ||||
|           const int nrow = ordine->GetChildren(); | ||||
| 
 | ||||
|   auto it_child = childs_ordinit.begin(); | ||||
|   if (childs_ordinit.size() > 1)  // Ci sono effettivamente dei OR_ORDINIR (almeno 1) oltre al datarow (informazioni di testata ordine).
 | ||||
|     ++it_child; | ||||
|   for (; it_child != childs_ordinit.end(); ++it_child) | ||||
|           for (int i = 1; i < nrow; i++) | ||||
|           { | ||||
|     const TXML_element& row       = *(*it_child); | ||||
|     const TXML_element& datarow_r = *row.get_childs()[0]; | ||||
|             const TXmlItem * row = ordine->GetChild(i); | ||||
| 
 | ||||
|     const TString& ind_tiporiga       = datarow_r.get_val_child("ind_tiporiga"); | ||||
|     const TString& cod_art            = datarow_r.get_val_child("cod_art"); | ||||
|     const TString& des_articolo_riga  = datarow_r.get_val_child("des_articolo_riga"); | ||||
|     const TString& qta_merce          = datarow_r.get_val_child("qta_merce"); | ||||
|     const TDate    dat_evas_riga      = TDate(datarow_r.get_val_child("dat_evas_riga")); | ||||
|     const TString& des_campo_libero6  = datarow_r.get_val_child("des_campo_libero6"); | ||||
|             if (row->GetTag() == "OR_ORDINIR") | ||||
|             { | ||||
|               const TXmlItem * data = row->FindFirstChild("datarow"); | ||||
| 
 | ||||
|     TString cod_art_major = flexart2codart(cod_art); | ||||
|      | ||||
|     TRiga_documento& d_row = doc.new_row(ind_tiporiga == "D" ? "05" : "01"); | ||||
|     if (ind_tiporiga != "D") | ||||
|       d_row.put(RDOC_CODART, !cod_art_major.empty() ? cod_art_major : cod_art); | ||||
|     d_row.put(RDOC_DESCR, des_articolo_riga); | ||||
|     d_row.put(RDOC_QTA,   qta_merce); | ||||
|     d_row.put("DATA_EVASIONE_RIGA", dat_evas_riga);   // RG1 -> DATA_EVASIONE_RIGA
 | ||||
|     d_row.put("CODFLEX",  des_campo_libero6);         // RG1 -> CODFLEX
 | ||||
|               if (data != nullptr) | ||||
|                 add_row(id_ordine, i, doc, data, log); | ||||
|               else | ||||
|                 XML_ROW_NOT_FOUND(id_ordine, i); | ||||
|             } | ||||
|             else | ||||
|               XML_ROW_NOT_FOUND(id_ordine, i); | ||||
|           } | ||||
|           ok = doc.write() == NOERR; | ||||
|         } | ||||
|         else | ||||
|           XML_TAG_NOT_FOUND(id_ordine, 0, "N.ro ordine"); | ||||
|       } | ||||
|       else | ||||
|         XML_NOT_FOUND("Testata"); | ||||
|     } | ||||
|     else | ||||
|       XML_NOT_FOUND("ORDINE_IMPEGNO"); | ||||
|   } | ||||
| 
 | ||||
|   bool ok = doc.write() == NOERR; | ||||
|   ok = ok && doc.rewrite() == NOERR; | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| bool TFlexform_xml_ordini::parse_and_import_ordine_xml(unique_ptr<char[]>& ford, long len) | ||||
| { | ||||
|   _importer.parse(ford, len); | ||||
| 
 | ||||
|   // Convertion to my Flexformstructure
 | ||||
|   //bool ok = convert();
 | ||||
| 
 | ||||
|   // Creation of ORC in DOC
 | ||||
|   bool ok = create_doc(); | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| TFlexform_xml_ordini::TFlexform_xml_ordini(const char* xml_name, const char* codnum, int codcli_flex) : TFlexform_xml(xml_name, false), _codnum(codnum), _codcli_flex(codcli_flex) | ||||
| {  } | ||||
|  | ||||
| @ -1,313 +1,95 @@ | ||||
| #ifndef __MAJORXML_H | ||||
| #define __MAJORXML_H | ||||
| 
 | ||||
| #include <vector> | ||||
| #include <fstream> | ||||
| #include <date.h> | ||||
| #include <strings.h> | ||||
| #include <reputils.h> | ||||
| #include <xml.h> | ||||
| 
 | ||||
| #include "strings.h" | ||||
| #include "xml_element.h" | ||||
| #include "date.h" | ||||
| #include "../ve/velib.h" | ||||
| 
 | ||||
| #define XML_ESCAPE_CHAR '&' | ||||
| #define XML_MSG(str) log->log(0, str); | ||||
| #define XML_ERROR(str) log->log(2, str); | ||||
| #define XML_NOT_FOUND(tag) { \ | ||||
|           TString msg =  TR("Non ho trovato l'attributo : ");  msg << (tag); \ | ||||
|           log->log(2, msg); \ | ||||
|         } | ||||
| #define XML_TAG_NOT_FOUND(ordine, pos, tag) { \ | ||||
|           TString msg = TR("Documento : "); msg << ordine; \ | ||||
|           if (pos > 0) msg << TR(" Riga : ") << pos << " "; \ | ||||
|           msg << tag << TR(" non trovata"); \ | ||||
|           log->log(2, msg); \ | ||||
|         } | ||||
| #define XML_ROW_NOT_FOUND(ordine, pos) { \ | ||||
|           TString msg = TR("Documento : ");  msg << ordine << TR(" Riga : ") << pos << TR(" non trovata"); \ | ||||
|           log->log(2, msg); \ | ||||
|         } | ||||
| #define MSG_ARTICOLO(ordine, pos, msg, error) { \ | ||||
|           TString str; \ | ||||
|           \ | ||||
|           str << TR("Documento : ") << ordine; \ | ||||
|           if (pos > 0) str << TR(" Riga : ") << pos; \ | ||||
|           str << " - " << (msg); \ | ||||
|           log->log(error ? 2 : 0, str); \ | ||||
|         } | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // TEsa_import_xml
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief \a TXML_element Contenitore Importazione Flexform. | ||||
|  */ | ||||
| struct TEsa_import_xml : TXML_element | ||||
| 
 | ||||
| class TEsa_xml : public TXmlItem | ||||
| { | ||||
|   void set_attributes(const TString& source, const TDate& creation_date, const TString& instance_guid, const TString& file_version) | ||||
|   { | ||||
|     add_attribute("Source", source); | ||||
|     add_attribute("CreationDate", creation_date.string(full, '/')); | ||||
|     add_attribute("InstanceGuid", instance_guid); | ||||
|     add_attribute("FileVersion", file_version); | ||||
|   } | ||||
|   TEsa_import_xml() : TXML_element("ESA_IMPORT", "") {  } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // ELEMENTI DDT
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief \a TXML_element Testata DDT. | ||||
|  */ | ||||
| class TDDT_testata_xml : public TXML_element | ||||
| { | ||||
|   friend class TDDT_riga_xml; | ||||
|   TXML_element* _datarow; | ||||
| 
 | ||||
|   // Figli di _datarow: campi della testata
 | ||||
| 
 | ||||
|   TXML_element* _dat_doc; | ||||
|   TXML_element* _des_num; | ||||
| public: | ||||
|   void add_row(TDDT_riga_xml& riga) { add_child((TXML_element&)riga); } | ||||
|   void set_testata(const char* data_doc, const char* num_doc); | ||||
| 
 | ||||
|   TDDT_testata_xml() : TXML_element("MG_MOVMAGT", ""), _datarow(nullptr), _dat_doc(nullptr), _des_num(nullptr) {  } | ||||
|   ~TDDT_testata_xml(); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief \a TXML_element Riga DDT. | ||||
|  */ | ||||
| class TDDT_riga_xml : public TXML_element | ||||
| { | ||||
|   TXML_element* _datarow; // Unico figlio di OR_ORDINIR contenenti i campi campi dell'ordine
 | ||||
| 
 | ||||
|   // Figli di _datarow: campi dell'ordine
 | ||||
| 
 | ||||
|   TXML_element* _tiporiga; | ||||
|   TXML_element* _art; | ||||
|   TXML_element* _des_articolo; | ||||
|   TXML_element* _merce; | ||||
|   TXML_element* _libero; | ||||
|   TFilename _file_name; | ||||
| 
 | ||||
|   public: | ||||
|   void set_datarow(const char* ind_tiporiga, const char* cod_art, const char*     des_articolo_riga, const char* qta_merce, const char* des_campo_libero6); | ||||
|   void set_datarow(const char* ind_tiporiga, const char* cod_art, const wchar_t*  des_articolo_riga, const char* qta_merce, const char* des_campo_libero6); | ||||
|     const TFilename & name() const { return _file_name; } | ||||
|     void export_doc() const { Save(name()); } | ||||
|     bool import_doc() { return Load(name()); } | ||||
| 
 | ||||
|   TDDT_riga_xml() : TXML_element("MG_MOVMAGR", ""), _datarow(nullptr), _tiporiga(nullptr), _art(nullptr), _des_articolo(nullptr), _merce(nullptr), _libero(nullptr) { } | ||||
|   ~TDDT_riga_xml(); | ||||
|     TEsa_xml::TEsa_xml(const TString & filename) : _file_name(filename) {} | ||||
|     ~TEsa_xml() {} | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // ELEMENTI ORDINI
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief \a TXML_element Testata Ordine. | ||||
|  */ | ||||
| class TOrdini_testata_xml : public TXML_element | ||||
| { | ||||
|   friend class TOrdini_riga_xml; | ||||
| 
 | ||||
|   TXML_element* _datarow; | ||||
| 
 | ||||
|   // Figli di _datarow: campi della testata
 | ||||
| 
 | ||||
|   TXML_element* _dat_doc; | ||||
|   TXML_element* _des_num; | ||||
|   TXML_element* _sig_serie; | ||||
| public: | ||||
|   void add_row(TOrdini_riga_xml& riga) { add_child((TXML_element&)riga); } | ||||
|   void set_testata(const char* data_doc, const char* num_doc, const char* str = "CCL"); | ||||
| 
 | ||||
|   TOrdini_testata_xml() : TXML_element("OR_ORDINIT", ""), _datarow(nullptr), _dat_doc(nullptr), _des_num(nullptr), _sig_serie(nullptr) {  } | ||||
|   ~TOrdini_testata_xml(); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief \a TXML_element Riga Ordine. | ||||
|  */ | ||||
| class TOrdini_riga_xml : public TXML_element | ||||
| { | ||||
|   TXML_element* _datarow; // Unico figlio di OR_ORDINIR contenenti i campi campi dell'ordine
 | ||||
| 
 | ||||
|   // Figli di _datarow: campi dell'ordine
 | ||||
| 
 | ||||
|   TXML_element* _tiporiga; | ||||
|   TXML_element* _art; | ||||
|   TXML_element* _des_articolo; | ||||
|   TXML_element* _merce; | ||||
|   TXML_element* _libero; | ||||
| 
 | ||||
| public: | ||||
|   void set_datarow(const char* ind_tiporiga, const char* cod_art, const char* des_articolo_riga, const char* qta_merce, const char* des_campo_libero6); | ||||
|   TOrdini_riga_xml() : TXML_element("OR_ORDINIR", ""), _datarow(nullptr), _tiporiga(nullptr), _art(nullptr), _des_articolo(nullptr), _merce(nullptr), _libero(nullptr) {  } | ||||
|   ~TOrdini_riga_xml(); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // Flexform export xml
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Main FLEXFORM XML Class. | ||||
|  */ | ||||
| class TFlexform_xml | ||||
| { | ||||
| protected: | ||||
|   TString         _file_name; | ||||
|   ofstream*       _fout; | ||||
|   ifstream*       _fin; | ||||
|   TEsa_import_xml _esa_import; | ||||
|   bool            _export; | ||||
| 
 | ||||
|   void         set_indentation(const bool use_tab, const short n_spaces) { _esa_import.set_indentation(use_tab, n_spaces); } | ||||
|   virtual bool print() pure; | ||||
| 
 | ||||
| public: | ||||
|   bool ok() const { return _fout != nullptr && _fout->is_open(); } | ||||
| 
 | ||||
|   TFlexform_xml(const char* xml_name = "", bool to_export = true); | ||||
|   virtual ~TFlexform_xml() { delete _fout; } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Esportatore XML DDT Flexform. | ||||
|  */ | ||||
| class TFlexform_xml_ddt final : public TFlexform_xml | ||||
| class TFlexform_xml_ddt : public TEsa_xml | ||||
| { | ||||
|   vector<shared_ptr<TXML_element>>     _docs_unico;  // Tanti doc_unico, figli di _esa_import 
 | ||||
|   vector<shared_ptr<TDDT_testata_xml>> _testate;     // _testata contiene i dati di testata, piu' tutte gli ordini riga come figli
 | ||||
| 
 | ||||
|   vector<shared_ptr<TDDT_riga_xml>>    _rows; | ||||
| public: | ||||
|   int add_doc(); | ||||
|   /** Aggiungo la riga al documento n. \a which_riga, altrimenti se non specificato mette sull'ultimo doc presente.
 | ||||
|    * \returns indice documento in cui e' stata inserita la riga. | ||||
|    * \returns -1 se non e' mai stato inserito alcun documento o l'indice (\a which_doc) non e' corretto. | ||||
|    */ | ||||
|   int   add_row(const shared_ptr<TDDT_riga_xml>& riga, int which_doc = -1); | ||||
|   bool  print() override; | ||||
|   shared_ptr<TDDT_riga_xml> new_row() { _rows.insert(_rows.end(), make_shared<TDDT_riga_xml>()); return _rows.back(); } | ||||
| 
 | ||||
|   /** Setto testata al documento n. \a which_doc, altrimenti se non specificato setta l'ultimo doc presente.
 | ||||
|    * \returns indice documento settato. | ||||
|    * \returns -1 se non e' mai stato inserito alcun documento o l'indice (\a which_doc) non e' corretto. | ||||
|    */ | ||||
|   int set_testata(const char* data_doc, const char* num_doc, int which_doc = -1); | ||||
|  void add_row(TXmlItem & outdoc, const TRiga_documento & rdoc, TLog_report * log); | ||||
|  void add_doc(const TDocumento & doc, TLog_report * log); | ||||
|  void export_docs(const TString & codnum, long codcli, int year, long from, long to, TLog_report * log); | ||||
| 
 | ||||
|   TFlexform_xml_ddt(const char* xml_name = ""); | ||||
|   ~TFlexform_xml_ddt() = default; | ||||
|   ~TFlexform_xml_ddt() {} | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Classe dell'ordine xml importato | ||||
|  */ | ||||
| class TFlexform_xml_ordini final : public TFlexform_xml | ||||
| class TFlexform_xml_ordini  : public TEsa_xml | ||||
| { | ||||
|   unique_ptr<TXML_element>          _info_xml; | ||||
|   unique_ptr<TXML_element>          _ordine_impegno;  // Unico ordine, figlio di _esa_import
 | ||||
|   TOrdini_testata_xml               _testata;         // _testata contiene i dati di testata, piu' tutte gli ordini riga come figli, figlio di _ordine_impegno
 | ||||
|   TXML_importer                     _importer; | ||||
|   TString                           _codnum; | ||||
|   int                               _codcli_flex; | ||||
|   TLog_report *                     _log; | ||||
| 
 | ||||
| public: | ||||
|   void add_doc(); | ||||
|   void add_row(const shared_ptr<TOrdini_riga_xml>& riga) { riga->set_parent(_testata); } | ||||
|   bool print() override; | ||||
|   void set_testata(const char* data_doc, const char* num_doc, const char* str) { _testata.set_testata(data_doc, num_doc, str); } | ||||
|   bool parse_and_import_ordine_xml(unique_ptr<char[]>& ford, long len); | ||||
|   bool convert() const; | ||||
|   const TString & flexart2codart(const TString & string); | ||||
|   void add_row(long id_ordine, const int nrow,  | ||||
|                TDocumento & doc, const TXmlItem * row, | ||||
|                TLog_report * log); | ||||
|   bool create_doc(); | ||||
| 
 | ||||
|   static TString flexart2codart(const TString& string); | ||||
| 
 | ||||
|   TFlexform_xml_ordini(const char* xml_name = "", const char* codnum = "", int codcli_flex = 12); | ||||
|   TFlexform_xml_ordini(const TFilename & xml_name, TLog_report * log, const char* codnum, int codcli_flex = 12) | ||||
|                       : TEsa_xml(xml_name), _codnum(codnum), _codcli_flex(codcli_flex), _log(log) {} | ||||
|   ~TFlexform_xml_ordini() {} | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////
 | ||||
| // Utils
 | ||||
| /////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| //class TXML_parser
 | ||||
| //{
 | ||||
| //  long        _last_pos;
 | ||||
| //  const long  _len;
 | ||||
| //  const char* _xml;
 | ||||
| //public:
 | ||||
| //  bool get_xml_info(TString& name, vector<pair<TString, TString>>& attributi)
 | ||||
| //  {
 | ||||
| //    bool end = false;
 | ||||
| //    bool ok = true;
 | ||||
| //    TToken_string line("", ' ');
 | ||||
| //    if (_xml[_last_pos++] == '<' && _xml[_last_pos++] == '?')
 | ||||
| //    {
 | ||||
| //      for (int i = _last_pos; !end && i < _len; ++i)
 | ||||
| //      {
 | ||||
| //        bool text = false;
 | ||||
| //        TString tag;
 | ||||
| //        if (_xml[i] == '\"')
 | ||||
| //          text = !text;
 | ||||
| //        else if (!text && _xml[i] == '?' && i + 1 < _len && _xml[i + 1] == '>')
 | ||||
| //        {
 | ||||
| //          end = true;
 | ||||
| //          continue;
 | ||||
| //        }
 | ||||
| //        else if (!text && _xml[i] == '?' && !(i + 1 < _len && _xml[i + 1] == '>'))
 | ||||
| //        {
 | ||||
| //          warning_box("tag info XML non chiuso correttamente!");
 | ||||
| //          ok = false;
 | ||||
| //          break;
 | ||||
| //        }
 | ||||
| //        line << _xml[i];
 | ||||
| //      }
 | ||||
| //      name = line.get(0);
 | ||||
| //      TToken_string tok("", '=');
 | ||||
| //      for (int i = 1; line.get(-1, tok) && i < line.items(); ++i)
 | ||||
| //      {
 | ||||
| //        if (tok.items() != 2)
 | ||||
| //        {
 | ||||
| //          warning_box("Errore durante la lettura degli attributi delle info XML.");
 | ||||
| //          ok = false;
 | ||||
| //          break;
 | ||||
| //        }
 | ||||
| //        attributi.push_back({ tok.get(0), tok.get(1) });
 | ||||
| //      }
 | ||||
| //      return ok;
 | ||||
| //    }
 | ||||
| //    else
 | ||||
| //    {
 | ||||
| //      error_box("XML mal formattato: mi aspettavo la riga di info xml.");
 | ||||
| //      return false;
 | ||||
| //    }
 | ||||
| //  }
 | ||||
| //
 | ||||
| //  void get_single_tag(TString& str) const
 | ||||
| //  {
 | ||||
| //    str.cut(0);
 | ||||
| //    bool end = false;
 | ||||
| //    bool open = false;
 | ||||
| //    for (int i = _last_pos; !end && i < _len; ++i)
 | ||||
| //    {
 | ||||
| //      if (!open)
 | ||||
| //      {
 | ||||
| //        if (_xml[i] != '<')
 | ||||
| //          continue;
 | ||||
| //        open = true;
 | ||||
| //      }
 | ||||
| //
 | ||||
| //      bool text = false;
 | ||||
| //      TString tag;
 | ||||
| //      if (_xml[i] == '\"')
 | ||||
| //        text = !text;
 | ||||
| //      else if (!text && _xml[i] == '>')
 | ||||
| //        end = true;
 | ||||
| //      str << _xml[i];
 | ||||
| //    }
 | ||||
| //  }
 | ||||
| //
 | ||||
| //  TXML_tag get_xml_tag() const
 | ||||
| //  {
 | ||||
| //    TXML_tag xml_tag;
 | ||||
| //    TString tag;
 | ||||
| //    get_single_tag(tag);
 | ||||
| //    xml_tag.import_tag(tag);
 | ||||
| //    return xml_tag;
 | ||||
| //  }
 | ||||
| //
 | ||||
| //  TXML_parser(const char* xml, const long len) : _last_pos(0), _len(len), _xml(xml) {  }
 | ||||
| //};
 | ||||
| 
 | ||||
| #endif // __MAJORXML_H
 | ||||
| @ -13,8 +13,7 @@ | ||||
| #include "pg0069.h" | ||||
| #include "pg0069100a.h" | ||||
| 
 | ||||
| #include "../cg/cg2103.h" | ||||
| #include "../cg/cglib02.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../cg/cgsaldac.h" | ||||
| #include "../ve/velib.h" | ||||
| #include "../ve/velib04.h" | ||||
|  | ||||
| @ -8,8 +8,7 @@ | ||||
| #include <reputils.h>  | ||||
| #include <textset.h> | ||||
| 
 | ||||
| #include "../cg/cg2103.h" | ||||
| #include "../cg/cglib02.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../cg/cgsaldac.h" | ||||
| #include "../ve/velib.h" | ||||
| 
 | ||||
|  | ||||
| @ -13,8 +13,7 @@ | ||||
| #include "pg0214.h" | ||||
| #include "pg0214200a.h" | ||||
| 
 | ||||
| #include "../cg/cg2103.h" | ||||
| #include "../cg/cglib02.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../cg/cgpagame.h" | ||||
| #include "../cg/cgsaldac.h" | ||||
| #include "../ve/velib.h" | ||||
|  | ||||
| @ -8,9 +8,7 @@ | ||||
| #include <sheet.h> | ||||
| 
 | ||||
| 
 | ||||
| #include "../cg/cglib01.h" | ||||
| #include "../cg/cg2103.h" | ||||
| 
 | ||||
| #include "../cg/cglib.h" | ||||
| 
 | ||||
| #include "pi0001.h" | ||||
| #include "pi0001100.h" | ||||
|  | ||||
| @ -9,8 +9,7 @@ | ||||
| #include <tabutil.h> | ||||
| #include <sheet.h> | ||||
| 
 | ||||
| #include "../cg/cglib01.h" | ||||
| #include "../cg/cg2103.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../cg/cgsaldac.h" | ||||
| #include "../cg/cgpagame.h" | ||||
| 
 | ||||
|  | ||||
| @ -12,7 +12,7 @@ | ||||
| #include <tabutil.h> | ||||
| 
 | ||||
| #include <clifo.h> | ||||
| #include <..\cg\cglib01.h> | ||||
| #include <..\cg\cglib.h> | ||||
| #include <..\lv\lvcondv.h> | ||||
| #include <..\lv\lvrcondv.h> | ||||
| #include <..\mg\clifogiac.h> | ||||
|  | ||||
| @ -29,10 +29,6 @@ class TProgind; | ||||
| #include <reputils.h> | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __CLIFOR_H | ||||
| #include "../ve/clifor.h" | ||||
| #endif | ||||
| 
 | ||||
| #include "../ve/velib.h" | ||||
| 
 | ||||
| class TCache_th; | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
| #include <reprint.h> | ||||
| #include <textset.h> | ||||
| 
 | ||||
| #include "../cg/cglib01.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../ve/velib07.h" | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
|  | ||||
| @ -358,7 +358,6 @@ void TDichiarazione_CONAI::scrivi_csv(const TRectype& prima_riga, TDichiarazione | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   if (n_riga_generata > 0) | ||||
|     scrivi_csv_doc_con_riga_generata(doc, n_riga_generata, csv, conai_specie); | ||||
|   else | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| #include <utility.h> | ||||
| 
 | ||||
| #include "../or/orlib.h" | ||||
| #include "../cg/cglib01.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../mg/anamag.h" | ||||
| #include "../ve/velib07.h" | ||||
| 
 | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
| #include <textset.h> | ||||
| #include <utility.h> | ||||
| 
 | ||||
| #include "../cg/cglib01.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "ps0430400a.h" | ||||
| 
 | ||||
| #include "../ve/velib.h" | ||||
|  | ||||
| @ -4,8 +4,7 @@ | ||||
| #include <reputils.h> | ||||
| 
 | ||||
| 
 | ||||
| #include "../cg/cg2101.h" | ||||
| #include "../cg/cglib02.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../mg/mglib.h" | ||||
| #include "ps0430500a.h" | ||||
| 
 | ||||
|  | ||||
| @ -13,8 +13,7 @@ | ||||
| #include <config.h> | ||||
| 
 | ||||
| 
 | ||||
| #include "../cg/cg2101.h" | ||||
| #include "../cg/cglib02.h" | ||||
| #include "../cg/cglib.h" | ||||
| #include "../mg/mglib.h" | ||||
| #include "ps0430600a.h" | ||||
| 
 | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
| #include <reputils.h> | ||||
| #include <textset.h> | ||||
| 
 | ||||
| #include "../cg/cg2101.h" | ||||
| #include "../cg/cglib.h" | ||||
| 
 | ||||
| #include "ps0431.h" | ||||
| #include "ps0431100a.h" | ||||
|  | ||||
| @ -6,7 +6,6 @@ | ||||
| #include <recset.h> | ||||
| 
 | ||||
| #include <cfven.h> | ||||
| #include "../ve/clifor.h" | ||||
| #include "../ve/condv.h" | ||||
| #include "../ve/rcondv.h" | ||||
| #include "../ve/velib.h" | ||||
|  | ||||
| @ -1,151 +1,73 @@ | ||||
| #include <Shlobj_core.h>  // KnownFolder di Windows
 | ||||
| //#include <strings.h>
 | ||||
| #include <applicat.h>     // TSkeleton_application
 | ||||
| #include <automask.h>     // TAutomask
 | ||||
| #include <config.h> | ||||
| #include <isam.h> | ||||
| #include <lffiles.h> | ||||
| #include <progind.h>      // TProgress_monitor
 | ||||
| #include <recarray.h> | ||||
| #include <tabutil.h>      // TTable
 | ||||
| #include <sqlset.h>       // TSQL_recordset
 | ||||
| #include <utility.h>      // list_files
 | ||||
| 
 | ||||
| #include <clifo.h> | ||||
| #include "../mg/anamag.h" | ||||
| #include "../ve/velib.h" | ||||
| 
 | ||||
| #include "ps6362.h" | ||||
| #include "ps6362100a.h" | ||||
| 
 | ||||
| #include "applicat.h"     // TSkeleton_application
 | ||||
| #include "automask.h"     // TAutomask
 | ||||
| #include "config.h" | ||||
| #include "lffiles.h" | ||||
| #include "clifo.h" | ||||
| #include "isam.h" | ||||
| #include "tabutil.h"      // TTable
 | ||||
| #include "sqlset.h"       // TSQL_recordset
 | ||||
| #include "utility.h"      // list_files
 | ||||
| #include "progind.h"      // TProgress_monitor
 | ||||
| 
 | ||||
| #include "flexform_xml.h" | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // Main Mask
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| class TMajor_export_mask final : public TAutomask | ||||
| class TMajor_export_mask:public TAutomask | ||||
| { | ||||
| protected: | ||||
|   bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; | ||||
|   void load_all(); | ||||
| 
 | ||||
| public: | ||||
|   void save_all() const; | ||||
|   TMajor_export_mask(); | ||||
|   ~TMajor_export_mask() { save_all(); } | ||||
|   void load_all(); | ||||
|   TMajor_export_mask() : TAutomask("ps6362100a") {} | ||||
| //  ~TMajor_export_mask() {}
 | ||||
| }; | ||||
| 
 | ||||
| bool TMajor_export_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) | ||||
| { | ||||
|   switch(o.dlg()) | ||||
|   { | ||||
|   case F_TIPODOC: | ||||
|     if(e == fe_modify || e == fe_init) | ||||
|     { | ||||
|       const TString& c = get(F_TIPODOC); | ||||
|       const bool en = c == "D"; | ||||
|       field(F_FLDDEST).enable(en); | ||||
|       field(F_SUBFLD).enable(en); | ||||
|       field(F_FLDSOURCE).enable(!en); | ||||
|       field(F_ANNO_ELAB).enable(en); | ||||
|       field(F_NUMDDT).enable(en); | ||||
|       field(F_NUMORD).enable(!en); | ||||
|       field(F_NUMDDT_DA).enable(en); | ||||
|       field(F_NUMDDT_A).enable(en); | ||||
|     } | ||||
|     default: | ||||
|       break; | ||||
|   default: break; | ||||
|   } | ||||
|   return true; | ||||
| }  | ||||
| 
 | ||||
| TMajor_export_mask::TMajor_export_mask() : TAutomask("ps6362100a") | ||||
| {  | ||||
|   load_all(); | ||||
| } | ||||
| 
 | ||||
| void TMajor_export_mask::save_all() const | ||||
| { | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "flddest",   get(F_FLDDEST)); | ||||
|   ini_set_bool  (CONFIG_DITTA, "ps6362", "fldroot_b", get_bool(F_SUBFLD)); | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "fldsource", get(F_FLDSOURCE)); | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "fldyear",   get(F_ANNO_ELAB)); | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "tipodoc",   get(F_TIPODOC)); | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "numddt",    get(F_NUMDDT)); | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "codcf",     get(F_CODCF)); | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "num_da",    get(F_NUMDDT_DA)); | ||||
|   ini_set_string(CONFIG_DITTA, "ps6362", "num_a",     get(F_NUMDDT_A)); | ||||
| } | ||||
| 
 | ||||
| void TMajor_export_mask::load_all() | ||||
| { | ||||
|   TFilename dir = ini_get_string(CONFIG_DITTA, "ps6362", "flddest", ""); | ||||
|   if (dir.empty()) | ||||
|   { | ||||
|     PWSTR     szPath[MAX_PATH]; | ||||
|     char      dest[MAX_PATH]; | ||||
|     if ((HRESULT)SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, szPath) >= 0) | ||||
|     { | ||||
|       size_t size; | ||||
|       wcstombs_s(&size, dest, MAX_PATH, szPath[0], MAX_PATH); | ||||
|       dir = dest; | ||||
|     } | ||||
|     else | ||||
|       dir.tempdir(); | ||||
|   } | ||||
|   load(); | ||||
| 
 | ||||
|   TString y; y << TDate(TODAY).year(); | ||||
|   TFilename dir = get(F_FLDDEST); | ||||
| 
 | ||||
|   TString cod_flexform(ini_get_string(CONFIG_DITTA, "ps6362", "codcf", "")); | ||||
|   if (cod_flexform.empty()) | ||||
|   if (dir.blank()) | ||||
|   { | ||||
|     TLocalisamfile clifo(LF_CLIFO); | ||||
|     clifo.setkey(2); | ||||
|     clifo.put(CLI_TIPOCF, "C"); | ||||
|     clifo.put(CLI_RAGSOC, "FLEXFORM"); | ||||
|     if (clifo.read(_isgteq) == NOERR && clifo.get(CLI_RAGSOC).starts_with("FLEXFORM")) | ||||
|       cod_flexform = clifo.get(CLI_CODCF); | ||||
|     else | ||||
|       cod_flexform = "12"; | ||||
|   } | ||||
| 
 | ||||
|   TString dir2 = ini_get_string(CONFIG_DITTA, "ps6362", "fldsource", ""); | ||||
|   if(dir2.empty()) | ||||
|   { | ||||
|     dir2 << dir; | ||||
|     dir2 << "\\upload"; | ||||
|   } | ||||
| 
 | ||||
|     dir = get_system_dir(desktop_dir); | ||||
|     set(F_FLDDEST, dir); | ||||
|   set(F_FLDSOURCE,  dir2); | ||||
|   set(F_SUBFLD,     ini_get_bool  (CONFIG_DITTA, "ps6362", "fldroot_b", true)); | ||||
|   set(F_ANNO_ELAB,  ini_get_string(CONFIG_DITTA, "ps6362", "fldyear",   y)); | ||||
|   set(F_NUMDDT,     ini_get_string(CONFIG_DITTA, "ps6362", "numddt",    "")); | ||||
|   set(F_NUMORD,     ini_get_string(CONFIG_DITTA, "ps6362", "numord",    "")); | ||||
|   set(F_TIPODOC,    ini_get_string(CONFIG_DITTA, "ps6362", "tipodoc",   "D")); | ||||
|   set(F_CODCF,      cod_flexform); | ||||
|   set(F_NUMDDT_DA,  ini_get_string(CONFIG_DITTA, "ps6362", "num_da",    "")); | ||||
|   set(F_NUMDDT_A,   ini_get_string(CONFIG_DITTA, "ps6362", "num_a",     "")); | ||||
|   if(get(F_NUMDDT).empty() || get(F_NUMORD).empty()) | ||||
|     set(F_SUBFLD, true); | ||||
|   } | ||||
|   set(F_ANNO_ELAB, today.year()); | ||||
|   dir = get(F_FLDSOURCE); | ||||
|   if (dir.blank()) | ||||
|   { | ||||
|     TTable num("%NUM"); | ||||
|     TString ord, ddt; | ||||
|     for (num.first(); num.good(); num.next()) | ||||
|     { | ||||
|       if (ddt.empty() && num.get("CODTAB").starts_with("B0")) | ||||
|         ddt = num.get("CODTAB"); | ||||
|       else if (ord.empty() && num.get("CODTAB").starts_with("ORC")) | ||||
|         ord = num.get("CODTAB"); | ||||
|       if (ord.full() && ddt.full()) | ||||
|         break; | ||||
|     dir = get_system_dir(desktop_dir); | ||||
|     dir.add("upload"); | ||||
|     set(F_FLDSOURCE, dir); | ||||
|   } | ||||
|     if (get(F_NUMDDT).empty()) | ||||
|       set(F_NUMDDT, ddt); | ||||
|     if (get(F_NUMORD).empty()) | ||||
|       set(F_NUMORD, ord); | ||||
|   if(get(F_NUMDDT).blank()) | ||||
|     set(F_NUMDDT, "B01"); | ||||
|   if (get(F_NUMORD).blank()) | ||||
|    set(F_NUMORD, "ORC"); | ||||
| } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // Main Program
 | ||||
| @ -155,137 +77,67 @@ class TMajor_flexform_boll_app : public TSkeleton_application | ||||
| { | ||||
|   TString _fld_dest; | ||||
|    | ||||
|   bool                create() override; | ||||
|   static TFilename    check_name_file(const TString& dir, bool sub_fld, int from, int to, bool ddt = true); | ||||
|   static TString      get_riferimento_flexform(const TSQL_recordset& righe_doc); | ||||
|   static bool         export_ddt(TMask& msk); | ||||
|   static bool         import_ordini(TMask& msk); | ||||
|   void                main_loop() override; | ||||
|   bool create(); | ||||
|   bool check_name_file(const TString & dir, TFilename & xml, bool sub_fld, int from, int to, bool ddt = true); | ||||
|   bool export_ddt(TMask& msk); | ||||
|   bool import_ordini(TMask& msk); | ||||
|   void main_loop(); | ||||
| 
 | ||||
| public: | ||||
|   TMajor_flexform_boll_app() = default; | ||||
|   TMajor_flexform_boll_app() {} | ||||
| }; | ||||
| 
 | ||||
| bool TMajor_flexform_boll_app::create() | ||||
| { | ||||
|   open_files(LF_DOC, LF_RIGHEDOC); | ||||
|   open_files(LF_DOC, LF_RIGHEDOC, LF_CLIFO, 0); | ||||
|   return TSkeleton_application::create(); | ||||
| } | ||||
| 
 | ||||
| TFilename TMajor_flexform_boll_app::check_name_file(const TString& dir, const bool sub_fld, const int from, const int to, bool ddt) | ||||
| bool TMajor_flexform_boll_app::check_name_file(const TString & dir, TFilename & xml, const bool sub_fld, const int from, const int to, bool ddt) | ||||
| { | ||||
|   TString cartella = dir; cartella << "/"; | ||||
|   TString da, a; | ||||
|   TString   name; | ||||
| 
 | ||||
|   if (sub_fld) | ||||
|     cartella << "CAMPO_" << TDate(TODAY).date2ansi() << "/"; | ||||
|   TString da, a; | ||||
|   da.format("%07d", from); | ||||
|   a.format("%07d", to); | ||||
|   name << (ddt ? "ddt" : "ord") << TDate(TODAY).year() << da << a; | ||||
| 
 | ||||
|   TString   name; name << (ddt ? "ddt" : "ord") << TDate(TODAY).year() << da << a; | ||||
|   TFilename xml(cartella); | ||||
|   if (!xvt_fsys_dir_exists(xml)) | ||||
|     xvt_fsys_mkdir(xml); | ||||
|   xml << name << ".xml"; | ||||
|   if (xml.exist()) | ||||
|   { | ||||
|     const int key = yesnocancel_box("Esiste gia' un file per questa esportazione. Creare duplicato?\nCliccare 'No' se si vuole sostituire il file."); | ||||
|     if (key == K_YES) | ||||
|     { | ||||
|       int i = 1; | ||||
|       do | ||||
|       { | ||||
|   xml = cartella; | ||||
|         xml << name << "_" << i++ << ".xml"; | ||||
|       } while (xml.exist() && i < 128); | ||||
|       if (i == 128) | ||||
|         fatal_box("Attenzione si sta cercando di generare troppi file per questa esportazione."); | ||||
|     } | ||||
|     else if (key != K_NO) | ||||
|       xml = ""; | ||||
|   } | ||||
|   return xml; | ||||
| 
 | ||||
|   if (!xml.exist()) | ||||
|     make_dir(xml); | ||||
|   xml << name << ".xml"; | ||||
|   TString msg(TR("Il file "));  msg << xml << TR(" esiste.Devo rigenerarlo ? "); | ||||
|    | ||||
|   return !xml.exist() || yesnocancel_box(msg) == K_YES; | ||||
| } | ||||
| 
 | ||||
| TString TMajor_flexform_boll_app::get_riferimento_flexform(const TSQL_recordset& righe_doc) | ||||
| { | ||||
|   const TString&      rg1 = righe_doc.get(3).as_string(); | ||||
|   const TToken_string t(rg1, char(0xB6));   // Simbolo paragrafo ¶
 | ||||
|   TString line; | ||||
|   for(int i = 0; i < t.items(); ++i) | ||||
|   { | ||||
|     t.get(i, line); | ||||
|     if (line.starts_with("CODFLEX")) | ||||
|       break; | ||||
|     line.cut(0); | ||||
|   } | ||||
|   if(line.full()) | ||||
|   { | ||||
|     TString rif(line.sub(line.find('=') + 1)); | ||||
|     rif.trim(); | ||||
|     return rif; | ||||
|   } | ||||
|   return ""; | ||||
| } | ||||
| 
 | ||||
| bool TMajor_flexform_boll_app::export_ddt(TMask& msk) | ||||
| { | ||||
|   const TString & dir = msk.get(F_FLDDEST); | ||||
|   const bool sub_fld = msk.get_bool(F_SUBFLD); | ||||
|   const int year = msk.get_int(F_ANNO_ELAB); | ||||
|   const int       codcli  = msk.get_int(F_CODCF); | ||||
|   const int       from    = msk.get_int(F_NUMDDT_DA); | ||||
|   const int       to      = msk.get_int(F_NUMDDT_A); | ||||
|   const long codcli = msk.get_long(F_CODCF); | ||||
|   const long from = msk.get_long(F_NUMDDT_DA); | ||||
|   const long to = msk.get_int(F_NUMDDT_A); | ||||
|   const TString & codnum  = msk.get(F_NUMDDT); | ||||
|   TLog_report log; | ||||
|   TFilename path_xml; | ||||
|   bool ok = check_name_file(dir, path_xml, sub_fld, from, to); | ||||
| 
 | ||||
|   TFilename path_xml = check_name_file(dir, sub_fld, from, to); | ||||
|   if (path_xml.empty()) | ||||
|     return false; | ||||
|   if (ok) | ||||
|   { | ||||
|     TFlexform_xml_ddt xml_ddts(path_xml); | ||||
|   TString           query_doc; | ||||
|   query_doc << "SELECT DATADOC, NDOC FROM doc WHERE CODNUM = '" << codnum << "' AND ANNO = " << year << | ||||
|     " AND PROVV = 'D' AND TIPOCF = 'C' AND CODCF = " << codcli << " AND NDOC >= " << from << " AND NDOC <= " << to; | ||||
|   TSQL_recordset    doc(query_doc); | ||||
|   TProgress_monitor bar(doc.items(), "Esportazione ddt"); | ||||
| 
 | ||||
|   for(bool ok_d = doc.move_first(); ok_d; ok_d = doc.move_next()) | ||||
|   { | ||||
|     if (!bar.add_status()) | ||||
|       break; | ||||
|     xml_ddts.add_doc(); | ||||
|     TFormatted_date day(doc.get(0).as_date()); day.set_format("1444/"); | ||||
|     const TString&  n_doc = doc.get(1).as_string(); | ||||
|     xml_ddts.set_testata(day.string(), n_doc); | ||||
|     // Righe documento
 | ||||
|     TString         query_righe; | ||||
|     query_righe << "SELECT rdoc.CODART, rdoc.DESCR, rdoc.QTA, rdoc.RG1, rdoc.DESCLUNGA, rdoc.DESCEST, COD_PMS\n" | ||||
|       "FROM rdoc\n" | ||||
|       "LEFT JOIN anamag ON rdoc.CODART = anamag.CODART\n" | ||||
|       "WHERE CODNUM = '" << codnum << "' AND ANNO = " << year << " AND PROVV = 'D' AND NDOC=" << n_doc; | ||||
|     TSQL_recordset  righe_doc(query_righe); | ||||
|     for (bool ok_r = righe_doc.move_first(); ok_r; ok_r = righe_doc.move_next()) | ||||
|     { | ||||
|       shared_ptr<TDDT_riga_xml> riga    = xml_ddts.new_row(); | ||||
|        | ||||
|       TString cod_art = righe_doc.get(6).as_string(); // Codice Flexform.
 | ||||
|       if(cod_art.empty()) | ||||
|         cod_art = righe_doc.get(0).as_string();       // Codice interno.
 | ||||
| 
 | ||||
|       TString         descr             = righe_doc.get(1).as_string(); | ||||
|       const TString&  qta               = righe_doc.get(2).as_string(); | ||||
|       const TString&  desccampolibero6  = get_riferimento_flexform(righe_doc);  // get(3) RG1
 | ||||
|       if (righe_doc.get(4).as_bool()) | ||||
|         descr << righe_doc.get(5).as_string(); | ||||
| 
 | ||||
|       if(!desccampolibero6.empty()) | ||||
|         riga->set_datarow("A", cod_art, descr, qta, desccampolibero6); | ||||
|       else | ||||
|         riga->set_datarow("C", "", descr, "0", ""); | ||||
|       xml_ddts.add_row(riga); | ||||
|     xml_ddts.export_docs(codnum, codcli, year, from,to, &log); | ||||
| #ifdef DBG | ||||
|     log.print_or_preview(); | ||||
| #endif | ||||
|   } | ||||
|   } | ||||
|   bool ok = true; | ||||
|   if (ok &= xml_ddts.ok()) | ||||
|     ok &= xml_ddts.print(); | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| @ -293,53 +145,57 @@ bool TMajor_flexform_boll_app::import_ordini(TMask& msk) | ||||
| { | ||||
|   bool ok = false; | ||||
|   const TString& dir_in     = msk.get(F_FLDSOURCE); | ||||
| 
 | ||||
|   TFilename     path(dir_in); | ||||
|   TString_array flist; | ||||
|   TBit_array lookup_t; | ||||
|   TString header("Importazione ordini"); | ||||
|   TLog_report log(header); | ||||
| 
 | ||||
|   path.add("*.xml"); | ||||
|   list_files(path, flist); | ||||
|   bool* lookup_t = new bool[flist.items()]; | ||||
|   for (int i = 0; i < flist.items(); ++i) | ||||
|     lookup_t[i] = false; | ||||
|   TProgress_monitor prog(flist.items(), "Importazione ordini"); | ||||
|   FOR_EACH_ARRAY_ROW(flist, nr, ford_name) | ||||
|   { | ||||
|     if (!prog.add_status()) | ||||
|       break; | ||||
| 
 | ||||
|     TFilename ford_filename(ford_name->operator const char*()); | ||||
|     FILE* fin; | ||||
|     if (!fopen_s(&fin, ford_filename, "rb") && fin) // Read-Binary mode
 | ||||
|   { | ||||
|       lookup_t[nr] = true; | ||||
|       std::fseek(fin, 0, SEEK_END); | ||||
|       const long len = std::ftell(fin); | ||||
|       std::unique_ptr<char[]> ford = std::make_unique<char[]>(len + 1); | ||||
|       std::fseek(fin, 0, 0); | ||||
|       fread_s(ford.get(), len + 1, 1, len, fin); | ||||
|       ford[len] = '\0'; | ||||
|       fclose(fin); | ||||
|     TProgress_monitor prog(flist.items(), header); | ||||
| 
 | ||||
|       TFlexform_xml_ordini order((const char*)ford_filename, msk.get(F_NUMORD), msk.get_int(F_CODCF)); | ||||
|       ok = order.parse_and_import_ordine_xml(ford, len); | ||||
|     FOR_EACH_ARRAY_ROW(flist, nr, str) | ||||
|     { | ||||
|       if (prog.add_status()) | ||||
|       { | ||||
|         TFilename ford_filename(*str); | ||||
| 
 | ||||
|         if (ford_filename.exist()) | ||||
|         { | ||||
|           TFlexform_xml_ordini order(ford_filename, &log, msk.get(F_NUMORD), msk.get_int(F_CODCF)); | ||||
| 
 | ||||
|           ok = order.create_doc(); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|       TString msg; msg << "Impossibile aprire il file " << ford_filename << "\nProcedura terminata."; | ||||
|       warning_box(msg); | ||||
|       return false; | ||||
|           TString msg; | ||||
| 
 | ||||
|           msg << TR("Il file ") << ford_filename << TR("non esiste\nProcedura terminata."); | ||||
|           log.log(2, msg); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| #ifdef DBG | ||||
|  // log.print_or_preview();
 | ||||
| #endif | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| void TMajor_flexform_boll_app::main_loop() | ||||
| { | ||||
|   TMajor_export_mask msk; | ||||
| 
 | ||||
|   msk.load_all(); | ||||
|   while (msk.run() == K_ENTER) | ||||
|   { | ||||
|     bool ok = true; | ||||
|     TString msg; | ||||
| 
 | ||||
|     msk.save(); | ||||
|     if (msk.get(F_TIPODOC) == "D") | ||||
|     { | ||||
|       msg << "Esportazione "; | ||||
|  | ||||
| @ -10,13 +10,13 @@ END | ||||
| #include <helpbar.h> | ||||
| ENDPAGE | ||||
| 
 | ||||
| PAGE "Configurazione Esportazione Major-Flexform" 0 2 0 0 | ||||
| PAGE "Import/Export Major-Flexform" 0 2 0 0 | ||||
| 
 | ||||
| RADIOBUTTON F_TIPODOC 64 | ||||
| BEGIN | ||||
|   PROMPT 6 1 "@bSelezionare la funzione" | ||||
|   ITEM "O|Importazione Ordini" | ||||
|   ITEM "D|Esportazione Bolle" | ||||
|   ITEM "O|Importazione Ordini" MESSAGE DISABLE,1@|ENABLE,2@ | ||||
|   ITEM "D|Esportazione Bolle" MESSAGE ENABLE,1@|DISABLE,2@ | ||||
|   FLAG "" | ||||
| END | ||||
| 
 | ||||
| @ -29,21 +29,21 @@ STRING F_FLDDEST 250 50 | ||||
| BEGIN | ||||
|   PROMPT 2 6 "Cartella di destinazione" | ||||
|   DSELECT | ||||
|   FLAGS "" | ||||
|   GROUP 1 | ||||
|   CHECKTYPE REQUIRED | ||||
| END | ||||
| 
 | ||||
| BOOLEAN F_SUBFLD | ||||
| BEGIN | ||||
|   PROMPT 2 7 "Crea sottocartella con data odierna" | ||||
|   FLAGS "" | ||||
|   GROUP 1 | ||||
| END | ||||
| 
 | ||||
| STRING F_FLDSOURCE 250 50 | ||||
| BEGIN | ||||
|   PROMPT 2 8 "Cartella caricamento    " | ||||
|   DSELECT | ||||
|   FLAGS "" | ||||
|   GROUP 2 | ||||
|   CHECKTYPE REQUIRED | ||||
| END | ||||
| 
 | ||||
| @ -60,30 +60,33 @@ END | ||||
| STRING F_NUMDDT 4 | ||||
| BEGIN | ||||
|   PROMPT 7 12 "DDT   " | ||||
|   FLAG "UZ" | ||||
|   FLAG "U" | ||||
|   USE %NUM | ||||
|   INPUT CODTAB F_NUMDDT | ||||
|   DISPLAY "Codice" CODTAB | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|   OUTPUT F_NUMDDT CODTAB | ||||
|   CHECKTYPE NORMAL | ||||
|   GROUP 1 | ||||
| END | ||||
| 
 | ||||
| STRING F_NUMORD 4 | ||||
| BEGIN | ||||
|   PROMPT 7 13 "ORDINI" | ||||
|   FLAG "UZD" | ||||
|   FLAG "Z" | ||||
|   USE %NUM | ||||
|   INPUT CODTAB F_NUMORD | ||||
|   DISPLAY "Codice" CODTAB | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|   OUTPUT F_NUMORD CODTAB | ||||
|   CHECKTYPE NORMAL | ||||
|   GROUP 2 | ||||
| END | ||||
| 
 | ||||
| STRING F_ANNO_ELAB 4 | ||||
| BEGIN | ||||
|   PROMPT 32 11 "Anno elaborazione" | ||||
|   FLAGS "D" | ||||
| END | ||||
| 
 | ||||
| NUMBER F_CODCF 6 | ||||
| @ -113,6 +116,7 @@ BEGIN | ||||
|   DISPLAY "Ragione sociale@50" LF_CLIFO->RAGSOC | ||||
|   OUTPUT F_NUMDDT_DA NDOC | ||||
|   ADD RUN ve0 -0 | ||||
|   GROUP 1 | ||||
| END | ||||
| 
 | ||||
| NUMBER F_NUMDDT_A 7 | ||||
| @ -128,6 +132,7 @@ BEGIN | ||||
|   NUM_EXPR (#THIS_FIELD==0)||(#THIS_FIELD>=#F_NUMDDT_DA) | ||||
|   WARNING "Specificare un numero documento superiore a quello di partenza" | ||||
|   ADD RUN ve0 -0 | ||||
|   GROUP 1 | ||||
| END | ||||
| 
 | ||||
| ENDPAGE | ||||
| @ -1,400 +0,0 @@ | ||||
| #include <rpc.h> | ||||
| #include <rpcdce.h> | ||||
| 
 | ||||
| #include <stack> | ||||
| 
 | ||||
| #include "xml_element.h" | ||||
| #include "strings.h" | ||||
| #include "progind.h" | ||||
| 
 | ||||
| 
 | ||||
| #define XML_ESCAPE_CHAR '&' | ||||
| 
 | ||||
| // Utils 
 | ||||
| 
 | ||||
| const char* wchar_to_char(const wchar_t* str); | ||||
| TString     escape_chars (const TString& str); | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // TXML_element
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| bool TXML_element::print_on_file(ofstream* fout, const int deep, const char* indent) | ||||
| { | ||||
|   const TString ind     = indent; | ||||
|   const TString _indent = this->_parent == XML_ROOT_TAG ? this->_indent : ind; | ||||
| 
 | ||||
|   if (fout == nullptr || !fout->is_open() || _name.empty()) | ||||
|     return false; | ||||
| 
 | ||||
|   ofstream& out = *fout; | ||||
|   bool      ok  = true; | ||||
| 
 | ||||
|   // Stampo prima la riga con tag e attributi
 | ||||
|   for (int i = 0; i < deep; ++i)  // Indentazione
 | ||||
|     out << _indent; | ||||
|   // Apro riga del tag
 | ||||
|   out << "<" << (_info_xml ? "?" : "") << _name; | ||||
|   for (auto& it : _attributes)  // Aggiungo eventuali attributi
 | ||||
|     out << " " << it.first << "=\"" << it.second << "\""; | ||||
| 
 | ||||
|   // Stampo figli
 | ||||
|   if (!_info_xml && !_childs.empty()) // O ha figli o ha tag con valore
 | ||||
|   { | ||||
|     out << ">"; | ||||
|     // Fine riga del tag
 | ||||
| 
 | ||||
|     out << endl; | ||||
|     for (auto& child : _childs) | ||||
|       ok &= child->print_on_file(fout, deep + 1, _indent); | ||||
|     for (int i = 0; i < deep; ++i) | ||||
|       out << _indent; | ||||
|     out << "</" << _name << ">" << endl; | ||||
|   } | ||||
|   else if (!_info_xml)  // Se non ho figli o ha il valore o e' solo attributi
 | ||||
|   { | ||||
|     if (!_value.empty() || _wvalue)  // Ho il valore
 | ||||
|     { | ||||
|       out << ">"; | ||||
|       // Fine riga del tag
 | ||||
| 
 | ||||
|       if (!_value.empty()) | ||||
|         out << escape_chars(_value); | ||||
|       else if (_wvalue) | ||||
|         out << wchar_to_char(_wvalue); | ||||
|       // Chiudo tag
 | ||||
|       out << "</" << _name << ">" << endl; | ||||
|     } | ||||
|     else // Ho gli attributi (forse non e' detto, al massimo ho un tag vuoto)
 | ||||
|       out << " />" << endl; // Chiudo tag singolo
 | ||||
|   } | ||||
|   else | ||||
|     out << "?>" << endl; | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| void TXML_element::set_indentation(bool use_tab, short n_spaces) | ||||
| { | ||||
|   if (use_tab) | ||||
|     _indent = "\t"; | ||||
|   else | ||||
|   { | ||||
|     const short to = n_spaces > 0 && n_spaces <= 8 ? n_spaces : (short)4; | ||||
|     _indent.cut(0); | ||||
|     for (short i = 0; i < to; ++i) | ||||
|       _indent << " "; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void TXML_element::set_value(const TString& _Val) | ||||
| { | ||||
|   if (_value.empty()) | ||||
|     _value = _Val; | ||||
| } | ||||
| 
 | ||||
| const TString& TXML_element::get_val_child(const char* name_child) const | ||||
| { | ||||
|   static TString appo = ""; | ||||
|   const auto it = find_child(_childs, name_child); | ||||
|   if (it != _childs.end()) | ||||
|     return (*it)->get_val(); | ||||
|   return appo; | ||||
| } | ||||
| 
 | ||||
| const wchar_t* TXML_element::get_wval_child(const char* name_child) const | ||||
| { | ||||
|   static wchar_t* appo = L""; | ||||
|   const auto it = find_child(_childs, name_child); | ||||
|   if (it != _childs.end()) | ||||
|     return (*it)->get_wval(); | ||||
|   return appo; | ||||
| } | ||||
| 
 | ||||
| vector<pair<TString, TString>>::const_iterator TXML_element::find_attribute(const char* str) | ||||
| { | ||||
|   vector<pair<TString, TString>>::const_iterator a = _attributes.end(); | ||||
|   for (auto it = _attributes.begin(); it != _attributes.end(); ++it) | ||||
|     if (it->first == str) | ||||
|       a = it; | ||||
|   return a; | ||||
| } | ||||
| 
 | ||||
| vector<TXML_element*>::const_iterator TXML_element::find_child(const vector<TXML_element*>& childs, const char* str) | ||||
| { | ||||
|   vector<TXML_element*>::const_iterator a = childs.end(); | ||||
|   for (auto it = childs.begin(); it != childs.end(); ++it) if ((*it)->get_name() == str) a = it; | ||||
|   return a; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| // TXML_importer
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| bool TXML_importer::parse(std::unique_ptr<char[]>& ford, long len) | ||||
| { | ||||
|   char* xml = ford.get(); | ||||
|   std::stack<TXML_tag>      s_tags; | ||||
|   std::stack<TXML_element*> s_elems; | ||||
|   bool    tag_open   = false; | ||||
|   bool    text_open  = false; | ||||
|   TString token; | ||||
|   TString value_pending; | ||||
|   TProgress_monitor bar(len, "Parsing XML Flexform Ordini"); | ||||
|   for (int i = 0; i < len; ++i) | ||||
|   { | ||||
|     if (!bar.add_status()) | ||||
|       break; | ||||
|     if (!text_open && !tag_open && xml[i] == '<') | ||||
|     { | ||||
|       tag_open = true; | ||||
|       if (!token.empty()) | ||||
|       { | ||||
|         if (s_tags.empty()) | ||||
|         { | ||||
|           TString msg; msg << "Trovato testo fuori dai tag ma senza alcun tag? " << token; | ||||
|           warning_box(msg); | ||||
|           return false; | ||||
|         } | ||||
|         // Se al giro dopo becco lo stesso tag ma di chiusura vuol dire che questo e' un valore e lo aggiungo
 | ||||
|         value_pending.cut(0) << token; | ||||
|       } | ||||
|       token.cut(0) << xml[i]; | ||||
|     } | ||||
|     else if (xml[i] == '"') | ||||
|     { | ||||
|       text_open = !text_open; | ||||
|       token << xml[i]; | ||||
|     } | ||||
|     else if (!text_open && tag_open && xml[i] == '>') | ||||
|     { | ||||
|       tag_open = false; | ||||
|       token << xml[i]; | ||||
|       TXML_tag tag; | ||||
|       tag.import_tag(token); | ||||
|       if (tag._opener) | ||||
|       { | ||||
|         _imported.push_back(make_shared<TXML_element>((const char*)tag._name, "", tag._info)); | ||||
|         if (s_tags.empty()) | ||||
|           _imported.back()->set_root(); | ||||
|         else | ||||
|           _imported.back()->set_parent(*s_elems.top()); | ||||
|         // Aggiungo gli attributi, se ce ne sono
 | ||||
|         for (auto& attribute : tag._attributes) | ||||
|           _imported.back()->add_attribute(attribute.first, attribute.second); | ||||
|         // Aggiungo allo stack solo se non si tratta di tag singoli (<xxxxx />) o del tag info xml (<?xml xxxxx?>)
 | ||||
|         // Poiche' questi non determinano nessuna apertura
 | ||||
|         if (!tag._closed && !tag._info) | ||||
|         { | ||||
|           s_tags.push(tag); | ||||
|           s_elems.push(_imported.back().get()); | ||||
|         } | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         TXML_tag t = s_tags.top(); | ||||
|         if (t._name != tag._name) | ||||
|         { | ||||
|           TString msg; msg << "Chiuso tag sbagliato. Mi aspettavo: " << tag._name << " trovato: " << t._name; | ||||
|           warning_box(msg); | ||||
|           return false; | ||||
|         } | ||||
| 
 | ||||
|         if (!value_pending.trim().empty()) | ||||
|         { | ||||
|           TXML_element* last = s_elems.top(); | ||||
|           last->set_value(value_pending); | ||||
|           value_pending.cut(0); | ||||
|         } | ||||
|         s_tags.pop(); | ||||
|         s_elems.pop(); | ||||
|       } | ||||
|       token.cut(0); | ||||
|     } | ||||
|     else if (!tag_open && !s_tags.empty() || tag_open) // Se sto fetchando roba dentro il tag o i valori dei tag
 | ||||
|       token << xml[i]; | ||||
|   } | ||||
|   if (!s_tags.empty()) | ||||
|     return false; | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////
 | ||||
| // TXML_tag
 | ||||
| ////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| vector<pair<TString, TString>>::const_iterator TXML_tag::find_attribute( | ||||
|   const vector<pair<TString, TString>>& attributes, const char* str) | ||||
| { | ||||
|   vector<pair<TString, TString>>::const_iterator a = attributes.end(); | ||||
|   for (auto it = attributes.begin(); it != attributes.end(); ++it) | ||||
|     if (it->first == str) | ||||
|       a = it; | ||||
|   return a; | ||||
| } | ||||
| 
 | ||||
| bool TXML_tag::get_attribute(TString& out, const char* str) | ||||
| { | ||||
|   const auto p = find_attribute(_attributes, str); | ||||
|   if (p == _attributes.end()) | ||||
|   { | ||||
|     TString msg; | ||||
|     msg << "Impossibile trovare l'attributo " << str << " nel tag " << _name; | ||||
|     warning_box(msg); | ||||
|     out = ""; | ||||
|     return false; | ||||
|   } | ||||
|   out = p->second; | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| bool TXML_tag::import_tag(const TString& tag) | ||||
| { | ||||
|   bool ok = true; | ||||
|   if (tag[0] == '<' && tag[tag.len() - 1] == '>') | ||||
|   { | ||||
|     _opener = tag[1] != '/'; | ||||
|     _info = tag[1] == '?'; | ||||
|     _closed = tag[tag.len() - 2] == '/'; | ||||
|     TString tok(tag.sub(1 + (_info || !_opener ? 1 : 0), tag.len() - 1 - (_info || _closed ? 1 : 0))); | ||||
|     if (tok.empty()) | ||||
|     { | ||||
|       warning_box("Error reading tag."); | ||||
|       ok = false; | ||||
|     } | ||||
|     int i = tok.find(' '); | ||||
|     _name = tok.sub(0, i); | ||||
|     bool end = i == -1; | ||||
|     for (++i; !end;) | ||||
|     { | ||||
|       TString tok_; | ||||
|       bool end_2 = false; | ||||
|       bool text = false; | ||||
|       for (; !end_2 && i < tok.len(); ++i) | ||||
|       { | ||||
|         if (tok[i] == '\"') | ||||
|           text = !text; | ||||
|         else if (!text && tok[i] == ' ') | ||||
|         { | ||||
|           end_2 = true; | ||||
|           continue; | ||||
|         } | ||||
|         tok_ << tok[i]; | ||||
|       } | ||||
|       if (i == tok.len()) | ||||
|         end = true; | ||||
|       TToken_string att(tok_, '='); | ||||
|       if (att.items() == 2) | ||||
|       { | ||||
|         TString key, val; | ||||
|         key = att.get(0); | ||||
|         key.trim(); | ||||
|         val = att.get(1); | ||||
|         val = *att.get(1) == '\"' ? val.sub(1, val.len() - 1) : att.get(1); | ||||
|         val.trim(); | ||||
|         _attributes.insert(_attributes.end(), {key, val}); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         TString msg; | ||||
|         msg << "Error parsing attributes of tag " << _name; | ||||
|         warning_box(msg); | ||||
|         ok = false; | ||||
|       } | ||||
|     } | ||||
|     return ok; | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| const char* generate_GUID() | ||||
| { | ||||
|   static TString _guid; | ||||
|   if (_guid.empty()) | ||||
|   { | ||||
|     char    cstr[39]; | ||||
|     size_t  chars; | ||||
|     GUID    uuid; | ||||
|     if (UuidCreate(&uuid) == RPC_S_OK) | ||||
|     { | ||||
|       LPOLESTR lpsz; | ||||
|       StringFromCLSID(uuid, &lpsz); | ||||
|       wcstombs_s(&chars, cstr, lpsz, wcslen(lpsz)); | ||||
|       _guid = cstr; | ||||
|     } | ||||
|     else | ||||
|       _guid = ""; | ||||
|   } | ||||
|   return _guid; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| ///////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| const char* wchar_to_char(const wchar_t* str) | ||||
| { | ||||
|   static TString text; | ||||
|   text = ""; | ||||
|   char cod[5]; | ||||
|   for (int i = 0; i < (int)wcslen(str); ++i) | ||||
|   { | ||||
|     if (str[i] != XML_ESCAPE_CHAR) | ||||
|     { | ||||
|       if (str[i] >= 0x00 && str[i] <= 0x7F) | ||||
|         text << (char)str[i]; | ||||
|       else | ||||
|       { | ||||
|         text << "&#x"; | ||||
|         sprintf_s(cod, "%X", (int)str[i]); | ||||
|         text << cod << ";"; | ||||
|       } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       if ((int)wcslen(str) > i + 4) | ||||
|       { | ||||
|         char _Buffer[6]; | ||||
|         for (int j = i; j < i + 5; ++j) | ||||
|           _Buffer[j - i] = (char)str[j]; | ||||
|         _Buffer[5] = '\0'; | ||||
|         TString a = _Buffer;  // Son certo che sono caratteri normali
 | ||||
|         if (a == "&") | ||||
|           i += 4; | ||||
|       } | ||||
|       text << "&"; | ||||
|     } | ||||
|   } | ||||
|   return text; | ||||
| } | ||||
| 
 | ||||
| TString escape_chars(const TString& str) | ||||
| { | ||||
|   static TString text; | ||||
|   text = ""; | ||||
|   for (int i = 0; i < str.size(); ++i) | ||||
|   { | ||||
|     if (str[i] != XML_ESCAPE_CHAR) | ||||
|     { | ||||
|       if (str[i] >= 0x00 && str[i] <= 0x7F) // ASCII
 | ||||
|         text << str[i]; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       if (str.mid(i, 5) == "&") | ||||
|         i += 4; | ||||
|       text << "&"; | ||||
|     } | ||||
|   } | ||||
|   return text; | ||||
| } | ||||
| @ -1,114 +0,0 @@ | ||||
| #ifndef __XMLELEMENT_H | ||||
| #define __XMLELEMENT_H | ||||
| 
 | ||||
| #include <vector> | ||||
| 
 | ||||
| #include "strings.h" | ||||
| 
 | ||||
| #define XML_ROOT_TAG nullptr | ||||
| 
 | ||||
| const char*  generate_GUID(); | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Elemento base xml. | ||||
|  */ | ||||
| class TXML_element | ||||
| { | ||||
|   vector<pair<TString, TString>>  _attributes{}; | ||||
|   vector<TXML_element*>           _childs{}; | ||||
|   TString                         _indent; | ||||
|   bool                            _info_xml; | ||||
|   TString                         _name; | ||||
|   TXML_element*                   _parent; | ||||
|   TString                         _value; | ||||
|   const wchar_t*                  _wvalue; | ||||
| 
 | ||||
| 
 | ||||
| public: | ||||
|   void add_attribute(const char* _Tag, const char*    _Val) { _attributes.insert(_attributes.end(), { _Tag, _Val }); } | ||||
|   void add_attribute(const char* _Tag, const TString& _Val) { _attributes.insert(_attributes.end(), { _Tag, _Val }); } | ||||
|   void add_attribute(const char* _Tag, const TDate&   _Val) { _attributes.insert(_attributes.end(), { _Tag, TString((const TString&)_Val) }); } | ||||
|   void add_child(TXML_element& child) { child._parent = this; _childs.insert(_childs.end(), &child); } | ||||
| 
 | ||||
|   bool print_on_file(ofstream* fout, int deep = 0, const char* indent = ""); | ||||
| 
 | ||||
|   /** Imposta tab (use_tab = true) o spazi (false). Se spazi indicare n_spazi (1 - 8): se non specificato o troppo grande sara' di 4; */ | ||||
|   void set_indentation(bool use_tab, short n_spaces = -1); | ||||
|   void set_parent(TXML_element& parent) { parent.add_child(*this); } | ||||
|   void set_root() { _parent = XML_ROOT_TAG; } | ||||
| 
 | ||||
|   void set_value(const TString& _Val); | ||||
|   bool is_root() const { return _parent == nullptr; } | ||||
| 
 | ||||
|   const TString&                        get_name()        const { return _name; } | ||||
|   const TXML_element&                   get_parent()      const { return *_parent; } | ||||
|   const vector<TXML_element*>&          get_childs()      const { return _childs; } | ||||
|   const vector<pair<TString, TString>>& get_attributes()  const { return _attributes; } | ||||
|   const TString&                        get_val()         const { return _value; } | ||||
|   const wchar_t*                        get_wval()        const { return _wvalue; } | ||||
|   const TString& get_val_child(const char* name_child) const; | ||||
| 
 | ||||
|   const wchar_t* get_wval_child(const char* name_child) const; | ||||
| 
 | ||||
|   /*static vector<pair<TString, TString>>::const_iterator find_attribute(const vector<pair<TString, TString>>& attributes, const char* str)
 | ||||
|   { | ||||
|     vector<pair<TString, TString>>::const_iterator a = attributes.end(); | ||||
|     for (auto it = attributes.begin(); it != attributes.end(); ++it) | ||||
|       if (it->first == str) | ||||
|         a = it; | ||||
|     return a; | ||||
|   }*/ | ||||
|   vector<pair<TString, TString>>::const_iterator find_attribute(const char* str); | ||||
| 
 | ||||
|   TXML_element& operator<<(const char* _Val) { _value = _Val; return *this; } | ||||
|   vector<TXML_element*>::const_iterator         find_child(const char* str) const { return find_child(_childs, str); } | ||||
|   static vector<TXML_element*>::const_iterator find_child(const vector<TXML_element*>& childs, const char* str); | ||||
| 
 | ||||
|   explicit TXML_element(const char*     name, const char*    value = "",  bool info_file = false) : _indent("\t"), _info_xml(info_file), _name(name), _parent(nullptr), _value(value), _wvalue(nullptr) {  } | ||||
|   explicit TXML_element(const char*     name, const wchar_t* value = L"", bool info_file = false) : _indent("\t"), _info_xml(info_file), _name(name), _parent(nullptr), _value(""), _wvalue(value) {  } | ||||
|   explicit TXML_element(const TString&  name, const TString& value = "",  bool info_file = false) : _indent("\t"), _info_xml(info_file), _name(name), _parent(nullptr), _value(value), _wvalue(nullptr) {  } | ||||
|   explicit TXML_element(const char*     name, bool info_file) : TXML_element(name, "", info_file) {  } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class TXML_importer | ||||
| { | ||||
| public: | ||||
|   std::vector<shared_ptr<TXML_element>> _imported; | ||||
|   bool parse(std::unique_ptr<char[]>& ford, long len); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Classe di supporto con info singolo tag. | ||||
|  */ | ||||
| class TXML_tag | ||||
| { | ||||
| public: | ||||
|   TString                         _name; | ||||
|   bool                            _opener; | ||||
|   bool                            _closed;      // Tag singoli (<xxxxx />).
 | ||||
|   vector<pair<TString, TString>>  _attributes;  // Vector perche' ho bisogno di mantenere l'ordine.
 | ||||
|   TString                         _val;         // Tutto cio' che c'e' all'interno del tag.
 | ||||
|   bool                            _info = false; | ||||
| 
 | ||||
|   void add_attribute(const char* key, const char* val) { _attributes.insert(_attributes.end(), { key, val }); } | ||||
|   void set_name(const char* name) { _name = name; } | ||||
|   void set_opener(bool tag_di_apertura) { _opener = tag_di_apertura; } | ||||
|   void set_single_tag(bool closed) { _closed = closed; } | ||||
|   void get_name(TString& name) const { name = _name; } | ||||
| 
 | ||||
|   static vector<pair<TString, TString>>::const_iterator find_attribute(const vector<pair<TString, TString>>& attributes, | ||||
|                                                                        const char* str); | ||||
|   bool get_attribute(_Out_ TString& out, const char* str); | ||||
|   bool import_tag(const TString& tag); | ||||
| 
 | ||||
|   TXML_tag() : _opener(false), _closed(false) {  } | ||||
|   TXML_tag(const char* name, bool tag_di_apertura = false, bool single = false) : _name(name), _opener(tag_di_apertura), _closed(single) {  } | ||||
|   TXML_tag(const char* name, vector<pair<TString, TString>>& attributes, bool tag_di_apertura = false, bool single = false) | ||||
|     : _name(name), _opener(tag_di_apertura), _closed(single), _attributes(attributes) {  } | ||||
| }; | ||||
| 
 | ||||
| #endif // __XMLELEMENT_H
 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user