diff --git a/package.json b/package.json index 68eb923..050a19f 100755 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "validator": "^13.7.0", "vhost": "^3.0.2", "web-push": "^3.6.7", + "xml2js": "^0.6.2", "xoauth2": "^1.2.0" }, "devDependencies": { diff --git a/public/upload/catalogo/PrimaPagina.png b/public/upload/catalogo/PrimaPagina.png deleted file mode 100644 index 882628a..0000000 Binary files a/public/upload/catalogo/PrimaPagina.png and /dev/null differ diff --git a/public/upload/scheda/Catalogo_Macro_ARIANNA_Introduzione_Stampa.jpg b/public/upload/scheda/Catalogo_Macro_ARIANNA_Introduzione_Stampa.jpg new file mode 100644 index 0000000..8d4121b Binary files /dev/null and b/public/upload/scheda/Catalogo_Macro_ARIANNA_Introduzione_Stampa.jpg differ diff --git a/public/upload/scheda/Catalogo_Macro_ARIANNA_Introduzione_Stampa_B-1.jpg b/public/upload/scheda/Catalogo_Macro_ARIANNA_Introduzione_Stampa_B-1.jpg new file mode 100644 index 0000000..2dcabb1 Binary files /dev/null and b/public/upload/scheda/Catalogo_Macro_ARIANNA_Introduzione_Stampa_B-1.jpg differ diff --git a/public/upload/scheda/PrimaPagina.png b/public/upload/scheda/PrimaPagina.png deleted file mode 100644 index 882628a..0000000 Binary files a/public/upload/scheda/PrimaPagina.png and /dev/null differ diff --git a/src/server/models/myelem.js b/src/server/models/myelem.js index ee25a60..b501942 100755 --- a/src/server/models/myelem.js +++ b/src/server/models/myelem.js @@ -59,6 +59,7 @@ const catalogo = new Schema( productTypes: [{ type: Number }], excludeproductTypes: [{ type: Number }], Editore: [{ type: String }], + sort: { type: Number }, pdf: { type: Boolean }, pdf_filename: { type: String }, printable: { type: Boolean }, @@ -74,7 +75,7 @@ const catalogo = new Schema( { scheda: MySchedaSchema, order: { type: Number }, - numSchede: { type: Number }, + numPagineMax: { type: Number }, /*arrProdToShow: { type: [[mongoose.Schema.Types.Mixed]], // Definizione tipo select: false // Imposta il campo come non selezionabile @@ -343,7 +344,7 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) { // Estrai le schede che hanno isTemplate = true const schedeTemplate = ris.flatMap(elem => - elem.catalogo && elem.catalogo.arrSchede ? elem.catalogo.arrSchede.filter(scheda => scheda.scheda.isTemplate) : [] + elem.catalogo && elem.catalogo.arrSchede ? elem.catalogo.arrSchede.filter(scheda => scheda.scheda?.isTemplate) : [] ); /* diff --git a/src/server/models/myscheda.js b/src/server/models/myscheda.js index caf1e3d..5ab29ae 100755 --- a/src/server/models/myscheda.js +++ b/src/server/models/myscheda.js @@ -22,6 +22,9 @@ const ISize = new Schema({ const IFont = new Schema({ name: { type: String }, size: { type: String }, + line_height: { type: Number }, + posiz_text: { type: Number }, + perc_text: { type: String }, }); const IBorders = new Schema({ @@ -50,6 +53,11 @@ const IDimensioni = new Schema({ imgsfondo: IImg, text_html: IText, }); +const IPagina = new Schema({ + dimensioni: IDimensioni, + testo_up: IText, + testo_down: IText, +}); const IAreaDiStampa = new Schema({ margini: IBorders, @@ -61,6 +69,27 @@ const IAreaDiStampa = new Schema({ scalecanvas: Number, }); +const INovita = new Schema( + { + show: Boolean, + months: Number, + } +); + +const IBestseller = new Schema( + { + show: Boolean, + primiNInClassifica: Number, + } +); + +const IEtichette = new Schema( + { + novita: INovita, + bestseller: IBestseller, + } +); + const IBarCode = new Schema( { show: Boolean, @@ -72,7 +101,7 @@ const IBarCode = new Schema( ); const IElementiScheda = new Schema({ - pagina: IDimensioni, + pagina: IPagina, riga: IDimensioni, scheda_prodotto: IDimensioni, immagine_prodotto: IDimensioni, @@ -81,15 +110,15 @@ const IElementiScheda = new Schema({ const scheletroScheda = { idapp: { type: String }, isTemplate: { type: Boolean }, + linkIdTemplate: { type: String }, name: { type: String }, - line_height: { type: Number }, numschede_perRiga: { type: Number }, numschede_perCol: { type: Number }, show_separatore: { type: Boolean }, testo_right: IText, testo_bottom: IText, - posiz_text: { type: Number }, barcode: IBarCode, + etichette: IEtichette, dimensioni: IElementiScheda, diff --git a/src/server/models/productInfo.js b/src/server/models/productInfo.js index a4ebc12..483309f 100755 --- a/src/server/models/productInfo.js +++ b/src/server/models/productInfo.js @@ -129,6 +129,20 @@ const productInfoSchema = new Schema({ productTypes: [{ type: Number, }], + totaleVenduti: Number, + venditeLastM: Number, + venditeLast6M: Number, + venditeLastY: Number, + venditeLast2Y: Number, + dataUltimoOrdine: Date, + rank3M: Number, + rank6M: Number, + rank1Y: Number, + + descrizione_breve_macro: String, + descrizione_completa_macro: String, + sottotitolo: String, + link_macro: String, }); diff --git a/src/server/router/admin_router.js b/src/server/router/admin_router.js index 066613d..5e61e4e 100755 --- a/src/server/router/admin_router.js +++ b/src/server/router/admin_router.js @@ -307,6 +307,17 @@ function extractNameAndSurnameByComplete(name_complete) { } } +function getvalueByJsonText(valore) { + if (valore && valore['#text']) { + if (valore['#text']) + return valore['#text']; + else + return value; + } + + return null; +} + router.post('/import', authenticate, async (req, res) => { try { @@ -339,6 +350,209 @@ router.post('/import', authenticate, async (req, res) => { let risrec = await Inventariogm.findOneAndUpdate(queryprod, { $set: inventario }, { new: true, upsert: true }); } + } else if (cmd === shared_consts.Cmd.MACRO_DESCRELINKSITOWEB) { + let updated = 0; + let imported = 0; + let errors = 0; + + dataObjects = null; + + let myarr = null; + + try { + dataObjects = JSON.parse(`[${data.arrdata}]`); + + myarr = dataObjects[0].item_list.item; + } catch (e) { + dataObjects = null; + } + + + + if (myarr) { + + // Cancella la collection ImportaMacros + await Importamacro.deleteMany({ idapp }); + + // Aggiungi i record su ImportaMacros + for (const recinv of myarr) { + let isnuovo = false + let setta = false + + let recmacro = recinv; + + recmacro.idapp = idapp; + + if (recmacro.ean && recmacro.ean['#text']) { + recmacro._id = recmacro.ean['#text']; + recmacro.code = recmacro._id; + + let queryprod = { idapp, code: recmacro._id }; + + + try { + let risrec = await Importamacro.findOneAndUpdate(queryprod, { $set: recmacro }, { new: true, upsert: true, strict: false }); + if (risrec) { + imported++; + // if (imported > 1000) + // break; + console.log('importato ', imported, 'su ', myarr.length); + } + + } catch (e) { + console.error(e); + errors++; + } + } + } + } + + // Rileggi tutti i record di ImportaMacros + dataObjects = await Importamacro.find({ idapp }).lean(); + + console.log('*** INIZIO IMPORT PRODOTTI ... '); + + let indprod = 0; + let newprod = 0; + + let numprod = dataObjects.length; + + + for (const product of dataObjects) { + let isnuovo = false + let setta = false + + let importa = true; + + if (!product.code) + importa = false; + + if (importa) { + let productInfo = { + idapp: product.idapp, + code: product.code, + } + + if (getvalueByJsonText(product.url)) { + productInfo.link_macro = getvalueByJsonText(product.url); + } + if (getvalueByJsonText(product.descrizione)) { + productInfo.descrizione_breve_macro = getvalueByJsonText(product.descrizione); + } + if (getvalueByJsonText(product.descrizione_completa)) { + productInfo.descrizione_completa_macro = getvalueByJsonText(product.descrizione_completa) + } + if (getvalueByJsonText(product.sottotitolo)) { + productInfo.sottotitolo = getvalueByJsonText(product.sottotitolo); + } + + + // Update ProductInfo + let risrecInfo = await ProductInfo.findOneAndUpdate({ code: productInfo.code }, { $set: productInfo }, { new: true, upsert: true }); + + indprod++; + console.log(indprod + '/' + numprod); + } + } + + } else if (cmd === shared_consts.Cmd.MACRO_RANKING) { + let updated = 0; + let imported = 0; + let errors = 0; + + dataObjects = null; + + try { + dataObjects = JSON.parse(`[${data.arrdata}]`); + } catch (e) { + dataObjects = null; + } + + if (dataObjects && dataObjects[0]) { + // Cancella la collection ImportaMacros + await Importamacro.deleteMany({ idapp }); + + // Aggiungi i record su ImportaMacros + for (const recinv of dataObjects[0]) { + let isnuovo = false + let setta = false + + let recmacro = recinv; + + recmacro.idapp = idapp; + + recmacro._id = recmacro.id; + + delete recmacro.id; + + let queryprod = { idapp, _id: recmacro._id }; + + try { + let risrec = await Importamacro.findOneAndUpdate(queryprod, { $set: recmacro }, { new: true, upsert: true, strict: false }); + if (risrec) { + imported++; + } + + } catch (e) { + console.error(e); + errors++; + } + } + } + + // Rileggi tutti i record di ImportaMacros + dataObjects = await Importamacro.find({ idapp }).lean(); + + console.log('*** INIZIO IMPORT PRODOTTI ... '); + + let indprod = 0; + let newprod = 0; + + let numprod = dataObjects.length; + + + for (const product of dataObjects) { + let isnuovo = false + let setta = false + + let importa = true; + + if (!product.title || !product.isbn) + importa = false; + + if (importa) { + let versGM = product.Versione ? product.Versione : ''; + + // split versioneGM in array with separated "," + let arrversGM = versGM.split(",").map(x => x.trim()); + + let productInfo = { + idapp: product.idapp, + code: product.isbn, + id_wp: product._id, + + // name: product.title, + totaleVenduti: product.totaleVenduti, + venditeLastM: product.venditeLastM, + venditeLast6M: product.venditeLast6M, + venditeLastY: product.venditeLastY, + venditeLast2Y: product.venditeLast2Y, + dataUltimoOrdine: product.dataUltimoOrdine, + rank3M: product.rank3M, + rank6M: product.rank6M, + rank1Y: product.rank1Y, + + } + + console.log(indprod + '/' + numprod); + + // Update ProductInfo + let risrecInfo = await ProductInfo.findOneAndUpdate({ code: productInfo.code }, { $set: productInfo }, { new: true, upsert: true }); + + indprod++; + } + } + } else if (cmd === shared_consts.Cmd.MACRO_CATALOGO_JSON) { let updated = 0; let imported = 0; @@ -420,6 +634,7 @@ router.post('/import', authenticate, async (req, res) => { idapp: product.idapp, code: product.isbn, id_wp: product._id, + name: product.title, description: product.description, short_descr: product.short_descr, diff --git a/src/server/tools/general.js b/src/server/tools/general.js index f5cf1d4..e8f5294 100755 --- a/src/server/tools/general.js +++ b/src/server/tools/general.js @@ -1,5 +1,6 @@ const os = require('os'); const fs = require('fs'); +const xml2js = require('xml2js'); const path = require('path'); const WebSocket = require('ws'); @@ -5824,6 +5825,20 @@ module.exports = { } return myurl; + }, + + // Funzione per convertire XML in JSON + convertXMLToJSON(xml) { + const parser = new xml2js.Parser(); + + parser.parseString(xml, (err, result) => { + if (err) { + console.error('Error parsing XML:', err); + } else { + console.log(JSON.stringify(result, null, 2)); // Stampa il risultato in formato JSON + } + }); } + }; diff --git a/src/server/tools/shared_nodejs.js b/src/server/tools/shared_nodejs.js index e4de41e..5b203be 100755 --- a/src/server/tools/shared_nodejs.js +++ b/src/server/tools/shared_nodejs.js @@ -322,6 +322,8 @@ module.exports = { PRODUCTS_V2: 22, INVENTARIO: 30, MACRO_CATALOGO_JSON: 40, + MACRO_RANKING: 50, + MACRO_DESCRELINKSITOWEB: 60, }, WalletFinalStatusType: { diff --git a/yarn.lock b/yarn.lock index 7c8836b..4dcb9ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11989,6 +11989,14 @@ xml2js@^0.5.0: sax ">=0.6.0" xmlbuilder "~11.0.0" +xml2js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + xmlbuilder@~11.0.0: version "11.0.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"