- Cataloghi: BestSeller, Novità
This commit is contained in:
@@ -64,6 +64,7 @@
|
|||||||
"validator": "^13.7.0",
|
"validator": "^13.7.0",
|
||||||
"vhost": "^3.0.2",
|
"vhost": "^3.0.2",
|
||||||
"web-push": "^3.6.7",
|
"web-push": "^3.6.7",
|
||||||
|
"xml2js": "^0.6.2",
|
||||||
"xoauth2": "^1.2.0"
|
"xoauth2": "^1.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.9 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.3 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 678 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.9 MiB |
@@ -59,6 +59,7 @@ const catalogo = new Schema(
|
|||||||
productTypes: [{ type: Number }],
|
productTypes: [{ type: Number }],
|
||||||
excludeproductTypes: [{ type: Number }],
|
excludeproductTypes: [{ type: Number }],
|
||||||
Editore: [{ type: String }],
|
Editore: [{ type: String }],
|
||||||
|
sort: { type: Number },
|
||||||
pdf: { type: Boolean },
|
pdf: { type: Boolean },
|
||||||
pdf_filename: { type: String },
|
pdf_filename: { type: String },
|
||||||
printable: { type: Boolean },
|
printable: { type: Boolean },
|
||||||
@@ -74,7 +75,7 @@ const catalogo = new Schema(
|
|||||||
{
|
{
|
||||||
scheda: MySchedaSchema,
|
scheda: MySchedaSchema,
|
||||||
order: { type: Number },
|
order: { type: Number },
|
||||||
numSchede: { type: Number },
|
numPagineMax: { type: Number },
|
||||||
/*arrProdToShow: {
|
/*arrProdToShow: {
|
||||||
type: [[mongoose.Schema.Types.Mixed]], // Definizione tipo
|
type: [[mongoose.Schema.Types.Mixed]], // Definizione tipo
|
||||||
select: false // Imposta il campo come non selezionabile
|
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
|
// Estrai le schede che hanno isTemplate = true
|
||||||
const schedeTemplate = ris.flatMap(elem =>
|
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) : []
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ const ISize = new Schema({
|
|||||||
const IFont = new Schema({
|
const IFont = new Schema({
|
||||||
name: { type: String },
|
name: { type: String },
|
||||||
size: { type: String },
|
size: { type: String },
|
||||||
|
line_height: { type: Number },
|
||||||
|
posiz_text: { type: Number },
|
||||||
|
perc_text: { type: String },
|
||||||
});
|
});
|
||||||
|
|
||||||
const IBorders = new Schema({
|
const IBorders = new Schema({
|
||||||
@@ -50,6 +53,11 @@ const IDimensioni = new Schema({
|
|||||||
imgsfondo: IImg,
|
imgsfondo: IImg,
|
||||||
text_html: IText,
|
text_html: IText,
|
||||||
});
|
});
|
||||||
|
const IPagina = new Schema({
|
||||||
|
dimensioni: IDimensioni,
|
||||||
|
testo_up: IText,
|
||||||
|
testo_down: IText,
|
||||||
|
});
|
||||||
|
|
||||||
const IAreaDiStampa = new Schema({
|
const IAreaDiStampa = new Schema({
|
||||||
margini: IBorders,
|
margini: IBorders,
|
||||||
@@ -61,6 +69,27 @@ const IAreaDiStampa = new Schema({
|
|||||||
scalecanvas: Number,
|
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(
|
const IBarCode = new Schema(
|
||||||
{
|
{
|
||||||
show: Boolean,
|
show: Boolean,
|
||||||
@@ -72,7 +101,7 @@ const IBarCode = new Schema(
|
|||||||
);
|
);
|
||||||
|
|
||||||
const IElementiScheda = new Schema({
|
const IElementiScheda = new Schema({
|
||||||
pagina: IDimensioni,
|
pagina: IPagina,
|
||||||
riga: IDimensioni,
|
riga: IDimensioni,
|
||||||
scheda_prodotto: IDimensioni,
|
scheda_prodotto: IDimensioni,
|
||||||
immagine_prodotto: IDimensioni,
|
immagine_prodotto: IDimensioni,
|
||||||
@@ -81,15 +110,15 @@ const IElementiScheda = new Schema({
|
|||||||
const scheletroScheda = {
|
const scheletroScheda = {
|
||||||
idapp: { type: String },
|
idapp: { type: String },
|
||||||
isTemplate: { type: Boolean },
|
isTemplate: { type: Boolean },
|
||||||
|
linkIdTemplate: { type: String },
|
||||||
name: { type: String },
|
name: { type: String },
|
||||||
line_height: { type: Number },
|
|
||||||
numschede_perRiga: { type: Number },
|
numschede_perRiga: { type: Number },
|
||||||
numschede_perCol: { type: Number },
|
numschede_perCol: { type: Number },
|
||||||
show_separatore: { type: Boolean },
|
show_separatore: { type: Boolean },
|
||||||
testo_right: IText,
|
testo_right: IText,
|
||||||
testo_bottom: IText,
|
testo_bottom: IText,
|
||||||
posiz_text: { type: Number },
|
|
||||||
barcode: IBarCode,
|
barcode: IBarCode,
|
||||||
|
etichette: IEtichette,
|
||||||
|
|
||||||
dimensioni: IElementiScheda,
|
dimensioni: IElementiScheda,
|
||||||
|
|
||||||
|
|||||||
@@ -129,6 +129,20 @@ const productInfoSchema = new Schema({
|
|||||||
productTypes: [{
|
productTypes: [{
|
||||||
type: Number,
|
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,
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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) => {
|
router.post('/import', authenticate, async (req, res) => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -339,6 +350,209 @@ router.post('/import', authenticate, async (req, res) => {
|
|||||||
let risrec = await Inventariogm.findOneAndUpdate(queryprod, { $set: inventario }, { new: true, upsert: true });
|
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) {
|
} else if (cmd === shared_consts.Cmd.MACRO_CATALOGO_JSON) {
|
||||||
let updated = 0;
|
let updated = 0;
|
||||||
let imported = 0;
|
let imported = 0;
|
||||||
@@ -420,6 +634,7 @@ router.post('/import', authenticate, async (req, res) => {
|
|||||||
idapp: product.idapp,
|
idapp: product.idapp,
|
||||||
code: product.isbn,
|
code: product.isbn,
|
||||||
id_wp: product._id,
|
id_wp: product._id,
|
||||||
|
|
||||||
name: product.title,
|
name: product.title,
|
||||||
description: product.description,
|
description: product.description,
|
||||||
short_descr: product.short_descr,
|
short_descr: product.short_descr,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
const os = require('os');
|
const os = require('os');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const xml2js = require('xml2js');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const WebSocket = require('ws');
|
const WebSocket = require('ws');
|
||||||
|
|
||||||
@@ -5824,6 +5825,20 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return myurl;
|
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
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -322,6 +322,8 @@ module.exports = {
|
|||||||
PRODUCTS_V2: 22,
|
PRODUCTS_V2: 22,
|
||||||
INVENTARIO: 30,
|
INVENTARIO: 30,
|
||||||
MACRO_CATALOGO_JSON: 40,
|
MACRO_CATALOGO_JSON: 40,
|
||||||
|
MACRO_RANKING: 50,
|
||||||
|
MACRO_DESCRELINKSITOWEB: 60,
|
||||||
},
|
},
|
||||||
|
|
||||||
WalletFinalStatusType: {
|
WalletFinalStatusType: {
|
||||||
|
|||||||
@@ -11989,6 +11989,14 @@ xml2js@^0.5.0:
|
|||||||
sax ">=0.6.0"
|
sax ">=0.6.0"
|
||||||
xmlbuilder "~11.0.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:
|
xmlbuilder@~11.0.0:
|
||||||
version "11.0.1"
|
version "11.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
|
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
|
||||||
|
|||||||
Reference in New Issue
Block a user