- Modifiche a ProductInfo... Continua
This commit is contained in:
34
.vscode/launch.json
vendored
34
.vscode/launch.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
|
||||
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
@@ -61,5 +61,37 @@
|
||||
"TESTING_ON": "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Debug CheckSmartBot",
|
||||
"program": "${workspaceFolder}/../checksmartbot/bot.js",
|
||||
"console": "integratedTerminal",
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/../**/*.js"
|
||||
],
|
||||
"envFile": "${workspaceFolder}/.env",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"autoAttachChildProcesses": true,
|
||||
"smartStep": true
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Avvia bot con pm2 (attach)",
|
||||
"runtimeExecutable": "pm2",
|
||||
"runtimeArgs": [
|
||||
"start",
|
||||
"bot.js",
|
||||
"--name",
|
||||
"checksmartbot"
|
||||
],
|
||||
"console": "integratedTerminal",
|
||||
"restart": true,
|
||||
"port": 9229,
|
||||
"attach": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -237,7 +237,7 @@ exports.getTableContentBase = async (options) => {
|
||||
GROUP BY IdArticolo
|
||||
) b ON T.IdArticolo = b.IdArticolo AND T.DataOra = b.data ` +
|
||||
(options.campispeciali
|
||||
? `
|
||||
? `
|
||||
RIGHT JOIN
|
||||
( SELECT
|
||||
e.IdStatoProdotto,
|
||||
@@ -302,10 +302,9 @@ ON
|
||||
GROUP BY IdArgomento
|
||||
) h ON g2.IdArgomento = h.IdArgomento AND g2.DataOra = h.data12
|
||||
) i2 ON T.ListaArgomenti = i2.IdArgomento
|
||||
`+
|
||||
(options.showQtaDisponibile
|
||||
|
||||
? ` RIGHT JOIN(
|
||||
` +
|
||||
(options.showQtaDisponibile
|
||||
? ` RIGHT JOIN(
|
||||
SELECT o.Codice, o.QtaDisponibile
|
||||
FROM T_WEB_Disponibile o
|
||||
JOIN(
|
||||
@@ -314,8 +313,8 @@ ON
|
||||
GROUP BY Codice
|
||||
) p ON o.Codice = p.Codice AND o.DataOra = p.data1
|
||||
) q ON T.IdArticolo = q.Codice`
|
||||
: ``) +
|
||||
` RIGHT JOIN(
|
||||
: ``) +
|
||||
` RIGHT JOIN(
|
||||
SELECT a3.IdMarchioEditoriale, a3.Descrizione as CasaEditrice
|
||||
FROM T_WEB_MarchiEditoriali a3
|
||||
JOIN(
|
||||
@@ -816,17 +815,17 @@ exports.viewTable = async (req, res) => {
|
||||
|
||||
exports.updateLocalDb = async (tableContent, options) => {
|
||||
try {
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const Product = require('../models/product');
|
||||
const CatProd = require('../models/catprod');
|
||||
|
||||
let recproductInfo = {
|
||||
code: tableContent.Ean13.trim(),
|
||||
};
|
||||
const code = tableContent.Ean13.trim();
|
||||
|
||||
let risrecUpdated = null;
|
||||
|
||||
const recfound = await ProductInfo.findOne({ code: recproductInfo.code }).lean();
|
||||
const recfound = await Product.findOne({ 'productInfo.code': code }).lean();
|
||||
|
||||
if (recfound) {
|
||||
const recproductInfo = recfound.productInfo;
|
||||
ListaArgomenti = tableContent.ListaArgomenti;
|
||||
|
||||
let arrayPulito = ListaArgomenti.trim() // Rimuove gli spazi all'inizio e alla fine
|
||||
@@ -835,7 +834,7 @@ exports.updateLocalDb = async (tableContent, options) => {
|
||||
|
||||
if (arrayPulito && arrayPulito.length > 0) {
|
||||
let aggiornacat = false;
|
||||
const precCatProds = recfound.idCatProds;
|
||||
const precCatProds = recfound.productInfo.idCatProds;
|
||||
let reccatprods = [];
|
||||
for (let i = 0; i < arrayPulito.length; i++) {
|
||||
const idArgomento = parseInt(arrayPulito[i]);
|
||||
@@ -882,9 +881,9 @@ exports.updateLocalDb = async (tableContent, options) => {
|
||||
}
|
||||
|
||||
if (aggiorna) {
|
||||
risrecUpdated = await ProductInfo.findOneAndUpdate(
|
||||
{ code: recproductInfo.code },
|
||||
{ $set: recproductInfo },
|
||||
risrecUpdated = await Product.findOneAndUpdate(
|
||||
{ _id: recfound._id },
|
||||
{ $set: { productInfo: recproductInfo } },
|
||||
{ new: true, upsert: true }
|
||||
);
|
||||
}
|
||||
|
||||
@@ -194,25 +194,29 @@ CatalogSchema.statics.getCatalogById = async function (id) {
|
||||
try {
|
||||
let arrrec = await Catalog.find({ _id: id })
|
||||
.populate({
|
||||
path: 'lista_prodotti', // Popola il campo lista_prodotti
|
||||
populate: {
|
||||
path: 'idProductInfo',
|
||||
model: 'ProductInfo',
|
||||
populate: [
|
||||
{
|
||||
path: 'idCatProds',
|
||||
model: 'CatProd',
|
||||
},
|
||||
{
|
||||
path: 'idSubCatProds',
|
||||
model: 'SubCatProd',
|
||||
},
|
||||
{
|
||||
path: 'idAuthors',
|
||||
model: 'Author',
|
||||
},
|
||||
],
|
||||
},
|
||||
path: 'lista_prodotti',
|
||||
populate: [
|
||||
{
|
||||
path: 'productInfo.idCatProds',
|
||||
model: 'CatProd',
|
||||
},
|
||||
{
|
||||
path: 'productInfo.idSubCatProds',
|
||||
model: 'SubCatProd',
|
||||
},
|
||||
{
|
||||
path: 'productInfo.idAuthors',
|
||||
model: 'Author',
|
||||
},
|
||||
{
|
||||
path: 'productInfo.idCollana',
|
||||
model: 'Collana',
|
||||
},
|
||||
{
|
||||
path: 'productInfo.idPublisher',
|
||||
model: 'Publisher',
|
||||
},
|
||||
],
|
||||
})
|
||||
.populate({
|
||||
path: 'lista_prodotti',
|
||||
@@ -254,11 +258,11 @@ CatalogSchema.statics.getCatalogById = async function (id) {
|
||||
const originalLength = catalog.lista_prodotti.length;
|
||||
catalog.lista_prodotti = catalog.lista_prodotti.filter(
|
||||
(product) =>
|
||||
product.idProductInfo &&
|
||||
product.idProductInfo.code &&
|
||||
product.idProductInfo.code !== '' &&
|
||||
product.idProductInfo.imagefile &&
|
||||
product.idProductInfo.imagefile !== 'noimg.jpg' &&
|
||||
product.productInfo &&
|
||||
product.productInfo.code &&
|
||||
product.productInfo.code !== '' &&
|
||||
product.productInfo.imagefile &&
|
||||
product.productInfo.imagefile !== 'noimg.jpg' &&
|
||||
!product.delete
|
||||
);
|
||||
if (catalog.lista_prodotti.length !== originalLength) {
|
||||
@@ -272,17 +276,16 @@ CatalogSchema.statics.getCatalogById = async function (id) {
|
||||
lista_prodotti: catalog.lista_prodotti.map((product) => ({
|
||||
...product.toObject(),
|
||||
productInfo: {
|
||||
...product.idProductInfo.toObject(), // Copia tutti i campi di idProductInfo
|
||||
catprods: product.idProductInfo.idCatProds, // Rinomina idCatProds in catprods
|
||||
subcatprods: product.idProductInfo.idSubCatProds,
|
||||
collana: product.idProductInfo.idCollana,
|
||||
authors: product.idProductInfo.idAuthors,
|
||||
...product.productInfo,
|
||||
catprods: product.productInfo.idCatProds,
|
||||
subcatprods: product.productInfo.idSubCatProds,
|
||||
collana: product.productInfo.idCollana,
|
||||
authors: product.productInfo.idAuthors,
|
||||
},
|
||||
producer: product.idProducer,
|
||||
storehouse: product.idStorehouses,
|
||||
scontisticas: product.idScontisticas,
|
||||
gasordine: product.idGasordine,
|
||||
idProductInfo: product.idProductInfo._id, // CHECK
|
||||
})),
|
||||
}));
|
||||
|
||||
|
||||
@@ -62,13 +62,13 @@ CatProdSchema.statics.findAllIdApp = async function (idapp) {
|
||||
return await CatProd.find(myfind).sort({ name: 1 }).lean();
|
||||
};
|
||||
|
||||
CatProdSchema.statics.updateCatDeleteEmpty = async function (idapp) {
|
||||
/*CatProdSchema.statics.updateCatDeleteEmpty = async function (idapp) {
|
||||
try {
|
||||
const toDelete = await CatProd.aggregate([
|
||||
{ $match: { idapp } },
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos',
|
||||
from: 'products',
|
||||
localField: '_id',
|
||||
foreignField: 'idCatProds',
|
||||
as: 'products'
|
||||
@@ -99,7 +99,7 @@ CatProdSchema.statics.updateCatDeleteEmpty = async function (idapp) {
|
||||
return error;
|
||||
}
|
||||
|
||||
};
|
||||
};*/
|
||||
|
||||
CatProdSchema.statics.getCatProdWithTitleCount = async function (idapp, updatedata) {
|
||||
try {
|
||||
@@ -108,9 +108,9 @@ CatProdSchema.statics.getCatProdWithTitleCount = async function (idapp, updateda
|
||||
{ $match: { idapp } },
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos', // Nome della tua collezione productInfo
|
||||
from: 'products', // Nome della tua collezione productInfo
|
||||
localField: '_id',
|
||||
foreignField: 'idCatProds',
|
||||
foreignField: 'productInfo.idCatProds',
|
||||
as: 'products'
|
||||
}
|
||||
},
|
||||
|
||||
@@ -63,9 +63,9 @@ module.exports.getCollaneWithTitleCount = async function (idapp, updatedata) {
|
||||
{ $match: { idapp } },
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos', // Nome della tua collezione productInfo
|
||||
from: 'products', // Nome della tua collezione productInfo
|
||||
localField: '_id',
|
||||
foreignField: 'idCollana',
|
||||
foreignField: 'productInfo.idCollana',
|
||||
as: 'products'
|
||||
}
|
||||
},
|
||||
|
||||
@@ -168,20 +168,6 @@ module.exports.findAllIdApp = async function (idapp) {
|
||||
as: 'product',
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos',
|
||||
localField: 'product.idProduct',
|
||||
foreignField: '_id',
|
||||
as: 'product.productInfo',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$product.productInfo',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'producers',
|
||||
@@ -358,20 +344,6 @@ module.exports.getTotalOrderById = async function (id) {
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos',
|
||||
localField: 'product.idProductInfo',
|
||||
foreignField: '_id',
|
||||
as: 'product.productInfo',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$product.productInfo',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'producers',
|
||||
@@ -637,19 +609,6 @@ module.exports.GeneraCSVOrdineProdotti = async function () {
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos',
|
||||
localField: 'product.idProductInfo',
|
||||
foreignField: '_id',
|
||||
as: 'productInfo',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$productInfo',
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'gasordines',
|
||||
@@ -682,8 +641,8 @@ module.exports.GeneraCSVOrdineProdotti = async function () {
|
||||
{
|
||||
$group: {
|
||||
_id: '$product._id',
|
||||
name: { $first: '$productInfo.name' },
|
||||
weight: { $first: '$productInfo.weight' },
|
||||
name: { $first: '$product.productInfo.name' },
|
||||
weight: { $first: '$product.productInfo.weight' },
|
||||
price_acquistato: { $first: '$product.price_acquistato' },
|
||||
totalQuantity: { $sum: { $add: ['$quantity', '$quantitypreordered'] } },
|
||||
totalPrice_acquistato: {
|
||||
|
||||
@@ -10,7 +10,6 @@ const Storehouse = require('../models/storehouse');
|
||||
const Provider = require('../models/provider');
|
||||
const Gasordine = require('../models/gasordine');
|
||||
const Product = require('../models/product');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
|
||||
const { Circuit } = require('../models/circuit');
|
||||
|
||||
@@ -225,10 +224,6 @@ module.exports.getOrdersCartByQuery = async function (query) {
|
||||
populate: {
|
||||
path: 'idProduct',
|
||||
model: 'Product',
|
||||
populate: {
|
||||
path: 'idProductInfo',
|
||||
model: 'ProductInfo'
|
||||
}
|
||||
}
|
||||
})
|
||||
.populate({
|
||||
|
||||
@@ -39,7 +39,181 @@ const productSchema = new Schema({
|
||||
isbn: {
|
||||
type: String,
|
||||
},
|
||||
idProductInfo: { type: Schema.Types.ObjectId, ref: 'ProductInfo', index: true },
|
||||
idProductInfo: { type: Schema.Types.ObjectId, ref: 'ProductInfo', index: true }, //@@@ DA CANCELLARE DOPO DELLA CONVERSIONE
|
||||
productInfo: {
|
||||
department: {
|
||||
type: String, ref: 'Department'
|
||||
},
|
||||
sku: {
|
||||
type: String,
|
||||
},
|
||||
code: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
codice: {
|
||||
type: String,
|
||||
}, // codice interno prodotto
|
||||
id_wp: {
|
||||
type: String,
|
||||
}, // id in wordpress
|
||||
codice_EAN: {
|
||||
type: String,
|
||||
},
|
||||
barcode: {
|
||||
type: String,
|
||||
},
|
||||
name: {
|
||||
type: String,
|
||||
index: true,
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
},
|
||||
short_descr: {
|
||||
type: String,
|
||||
},
|
||||
idCatProds: [{
|
||||
type: Schema.Types.ObjectId, ref: 'CatProd', index: true
|
||||
}],
|
||||
idSubCatProds: [{
|
||||
type: Schema.Types.ObjectId, ref: 'SubCatProd'
|
||||
}],
|
||||
idStatoProdotto: {
|
||||
type: Number, index: true
|
||||
},
|
||||
color: {
|
||||
type: String
|
||||
},
|
||||
size: {
|
||||
type: String // 11x4x3
|
||||
},
|
||||
weight: {
|
||||
type: Number
|
||||
},
|
||||
weight_lordo: {
|
||||
type: Number
|
||||
},
|
||||
unit: {
|
||||
type: Number,
|
||||
},
|
||||
unit_lordo: {
|
||||
type: Number,
|
||||
},
|
||||
sfuso: {
|
||||
type: Boolean
|
||||
}, // serve se moltiplicare le qta (es: 12 kg) oppure fare (2 x 20 ml)
|
||||
vegan: {
|
||||
type: Boolean
|
||||
},
|
||||
icon: {
|
||||
type: String,
|
||||
},
|
||||
img: {
|
||||
type: String,
|
||||
},
|
||||
imagefile: {
|
||||
type: String,
|
||||
},
|
||||
image_not_found: {
|
||||
type: Boolean,
|
||||
},
|
||||
vers_img: {
|
||||
type: Number,
|
||||
},
|
||||
image_link: {
|
||||
type: String,
|
||||
},
|
||||
link_scheda: {
|
||||
type: String,
|
||||
},
|
||||
link: {
|
||||
type: String,
|
||||
},
|
||||
checkout_link: {
|
||||
type: String,
|
||||
},
|
||||
versioneGM: {
|
||||
type: String,
|
||||
},
|
||||
img2: {
|
||||
type: String,
|
||||
},
|
||||
img3: {
|
||||
type: String,
|
||||
},
|
||||
img4: {
|
||||
type: String,
|
||||
},
|
||||
ingredienti: {
|
||||
type: String,
|
||||
},
|
||||
valori_nutrizionali: {
|
||||
type: String,
|
||||
},
|
||||
note: {
|
||||
type: String,
|
||||
},
|
||||
idAuthors: [{
|
||||
type: Schema.Types.ObjectId, ref: 'Author', index: true
|
||||
}],
|
||||
idCollana: {
|
||||
type: Schema.Types.ObjectId, ref: 'Collana', index: true
|
||||
},
|
||||
idPublisher: {
|
||||
type: Schema.Types.ObjectId, ref: 'Publisher', index: true
|
||||
},
|
||||
collezione: {
|
||||
type: String,
|
||||
},
|
||||
ListaArgomenti: {
|
||||
type: String,
|
||||
},
|
||||
date_pub: {
|
||||
type: Date,
|
||||
index: 1,
|
||||
},
|
||||
date_pub_ts: {
|
||||
type: Number,
|
||||
},
|
||||
productTypes: [{
|
||||
type: Number,
|
||||
}],
|
||||
|
||||
date_updated: {
|
||||
type: Date,
|
||||
},
|
||||
|
||||
date_updated_fromGM: {
|
||||
type: Date,
|
||||
},
|
||||
|
||||
totVen: Number,
|
||||
totFat: Number,
|
||||
vLast3M: Number,
|
||||
fatLast3M: Number,
|
||||
fatLast6M: Number,
|
||||
fatLast1Y: Number,
|
||||
fatLast2Y: Number,
|
||||
vLast6M: {
|
||||
type: Number,
|
||||
index: true,
|
||||
},
|
||||
vLast1Y: {
|
||||
type: Number, index: true
|
||||
},
|
||||
vLast2Y: Number,
|
||||
dataUltimoOrdine: Date,
|
||||
rank3M: Number,
|
||||
rank6M: Number,
|
||||
rank1Y: Number,
|
||||
|
||||
descrizione_breve_macro: String,
|
||||
descrizione_completa_macro: String,
|
||||
descr_trafiletto_catalogo: String,
|
||||
sottotitolo: String,
|
||||
link_macro: String,
|
||||
},
|
||||
idProducer: { type: Schema.Types.ObjectId, ref: 'Producer', index: true },
|
||||
idStorehouses: [{ type: Schema.Types.ObjectId, ref: 'Storehouse', index: true }],
|
||||
idGasordine: { type: Schema.Types.ObjectId, ref: 'Gasordine', index: true },
|
||||
@@ -367,20 +541,6 @@ module.exports.executeQueryPickup = async function (idapp, params) {
|
||||
}
|
||||
|
||||
let aggr2 = [
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos',
|
||||
localField: 'idProductInfo',
|
||||
foreignField: '_id',
|
||||
as: 'productInfo',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$productInfo',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'authors',
|
||||
@@ -606,15 +766,6 @@ module.exports.findAllIdApp = async function (idapp, code, id, all, isbn) {
|
||||
},
|
||||
{ $unwind: { path: '$producer', preserveNullAndEmptyArrays: true } },
|
||||
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos',
|
||||
localField: 'idProductInfo',
|
||||
foreignField: '_id',
|
||||
as: 'productInfo',
|
||||
},
|
||||
},
|
||||
{ $unwind: { path: '$productInfo', preserveNullAndEmptyArrays: true } },
|
||||
{
|
||||
$match: {
|
||||
'productInfo.code': { $exists: true, $ne: '' },
|
||||
@@ -1054,3 +1205,208 @@ module.exports.singlerecconvert_AfterImport_AndSave = async function (idapp, pro
|
||||
console.error('Err', e);
|
||||
}
|
||||
};
|
||||
|
||||
// ---------------------------------------------
|
||||
|
||||
module.exports.replaceProductImgToImageFile = async function (abilitaserver) {
|
||||
const Product = this;
|
||||
|
||||
if (abilitaserver) {
|
||||
// const result = await ProductInfo.updateMany({ "img": { $exists: true } }, { $rename: { 'img': 'imagefile' } });
|
||||
|
||||
// Trova tutti i documenti con il campo 'img' che esiste
|
||||
const documents = await Product.find({ "productInfo.img": { $exists: true } });
|
||||
|
||||
// Aggiorna ciascun documento
|
||||
for (let doc of documents) {
|
||||
if (doc.img && doc.img.startsWith('upload/products/')) {
|
||||
// Rimuovi il prefisso '/upload/products' dal campo `img`
|
||||
doc.imagefile = doc.img.replace(/^\upload\/products\//, '');
|
||||
doc.img = undefined; // Può anche rimuovere il campo img corrente se desiderato
|
||||
await doc.save(); // Salva il documento aggiornato
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Updated ${documents.length} document(s) with new imagefile paths.`);
|
||||
|
||||
} else {
|
||||
const documents = await Product.find({ "productInfo.imagefile": { $exists: true } });
|
||||
|
||||
// Aggiorna ciascun documento
|
||||
for (let doc of documents) {
|
||||
if (doc.imagefile && doc.imagefile.startsWith('upload/products/')) {
|
||||
// Rimuovi il prefisso '/upload/products' dal campo `img`
|
||||
doc.imagefile = doc.imagefile.replace(/^\upload\/products\//, '');
|
||||
await doc.save(); // Salva il documento aggiornato
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Updated ${documents.length} document(s) with new imagefile paths.`);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// await Product.updateMany({}, { 'vers_img': 0 });
|
||||
|
||||
console.log(`Updated ${result.modifiedCount} document(s).`);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
module.exports.correggiProductTypes = async function () {
|
||||
const Product = this;
|
||||
const bulkOps = [];
|
||||
|
||||
try {
|
||||
// Fase di aggregazione
|
||||
const cursor = Product.aggregate([
|
||||
{
|
||||
$project: {
|
||||
_id: 1,
|
||||
'productInfo.productType': 1,
|
||||
'productInfo.productTypes': [{ $ifNull: ['$productType', 10] }]
|
||||
}
|
||||
}
|
||||
]).cursor({ batchSize: 1000 }).exec();
|
||||
|
||||
// Itera attraverso ogni documento utilizzando il cursore
|
||||
for await (const doc of cursor) {
|
||||
bulkOps.push({
|
||||
updateOne: {
|
||||
filter: { _id: doc._id },
|
||||
update: {
|
||||
$set: { 'productInfo.productTypes': doc.productTypes },
|
||||
$unset: { 'productInfo.productType': "" }
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Scrivi i batch di operazioni ogni 1000 documenti
|
||||
if (bulkOps.length === 1000) {
|
||||
await Product.bulkWrite(bulkOps);
|
||||
bulkOps.length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Scrivi eventuali operazioni rimanenti
|
||||
if (bulkOps.length > 0) {
|
||||
await Produc.bulkWrite(bulkOps);
|
||||
}
|
||||
|
||||
console.log('ProductInfo.productType converted to productTypes array and saved');
|
||||
} catch (err) {
|
||||
console.error('Error converting ProductInfo.productType:', err);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.updateProductInfoByStats = async function (idapp) {
|
||||
let mylog = '';
|
||||
let mylog2 = '';
|
||||
let mylogtot = '';
|
||||
try {
|
||||
const Product = this;
|
||||
|
||||
const T_WEB_ArticoliFatturati = require('./t_web_articolifatturati');
|
||||
const T_WEB_Ordini = require('./t_web_ordini');
|
||||
|
||||
mylog = "Inizio Aggiornamento Statistiche... \n";
|
||||
mylogtot += mylog;
|
||||
console.log(mylog);
|
||||
|
||||
let countUpdate = 0;
|
||||
|
||||
countUpdate = await T_WEB_ArticoliFatturati.updateStatisticsFatt('', idapp, true);
|
||||
|
||||
// Itera sui risultati e aggiorna productInfo
|
||||
|
||||
mylog = `Aggiornati ${countUpdate} record di productInfo`;
|
||||
mylogtot += mylog;
|
||||
console.log(mylog);
|
||||
|
||||
mylog2 = "Inizio Aggiornamento Statistiche Ordini ... \n";
|
||||
mylogtot += mylog2;
|
||||
console.log(mylog2);
|
||||
|
||||
countUpdate = await T_WEB_Ordini.updateStatisticsOrders('', idapp, true);
|
||||
|
||||
mylog2 = `Aggiornati ${countUpdate} record di productInfo`;
|
||||
mylogtot += mylog2;
|
||||
|
||||
console.log(mylog2);
|
||||
|
||||
} catch (error) {
|
||||
mylog = "Errore durante l'aggiornamento di productInfo:" + error;
|
||||
console.error(mylog);
|
||||
}
|
||||
|
||||
return mylogtot;
|
||||
}
|
||||
|
||||
// crea setImgNotFound
|
||||
|
||||
module.exports.setImgNotFound = async function (id) {
|
||||
// set sul record id il flag image_not_found
|
||||
try {
|
||||
const Product = this;
|
||||
|
||||
await Product.updateOne(
|
||||
{ _id: id },
|
||||
{ $set: { 'productInfo.image_not_found': true } }
|
||||
);
|
||||
console.log(`Flag image_not_found set for record with id: ${id}`);
|
||||
} catch (error) {
|
||||
console.error(`Error setting image_not_found flag for id ${id}:`, error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// imposta tutti i record con image_not_found: false
|
||||
module.exports.resetImageNotFound = async function () {
|
||||
try {
|
||||
const Product = this;
|
||||
|
||||
await Product.updateMany(
|
||||
{ 'productInfo.image_not_found': true },
|
||||
{ $set: { image_not_found: false } }
|
||||
);
|
||||
console.log('Flag image_not_found reset to false for all records');
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('Error resetting image_not_found flag:', error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// crea una funzione che mi rimuove il record "product" che utilizza productInfo, nel caso in cui date_updated_fromGM non esista
|
||||
module.exports.removeProductInfoWithoutDateUpdatedFromGM = async function (idapp) {
|
||||
const Product = this;
|
||||
|
||||
const globalTables = require('../tools/globalTables');
|
||||
|
||||
let mylog;
|
||||
|
||||
try {
|
||||
const arrproduct = await Product.find({ idapp, 'productInfo.date_updated_fromGM': { $exists: false } });
|
||||
|
||||
if (arrproduct.length > 0 && arrproduct.length < 1000) {
|
||||
mylog = `Rimuovo ${arrproduct.length} productInfo senza date_updated_fromGM !!`
|
||||
console.log(mylog);
|
||||
|
||||
for (const product of arrproduct) {
|
||||
await Product.updateOne(
|
||||
{ _id: product._id },
|
||||
{ $set: { deleted: true } }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return mylog;
|
||||
} catch (error) {
|
||||
mylog += 'Error removing productInfo without date_updated_fromGM:' + error;
|
||||
console.error(mylog);
|
||||
}
|
||||
|
||||
return mylog;
|
||||
};
|
||||
|
||||
@@ -202,7 +202,7 @@ module.exports.executeQueryTable = function (idapp, params) {
|
||||
return tools.executeQueryTable(this, idapp, params);
|
||||
};
|
||||
|
||||
module.exports.findAllIdApp = async function (idapp, code, id) {
|
||||
/*module.exports.findAllIdApp = async function (idapp, code, id) {
|
||||
let myfind = {};
|
||||
let myqueryadd = {};
|
||||
let query = [];
|
||||
@@ -295,299 +295,9 @@ module.exports.findAllIdApp = async function (idapp, code, id) {
|
||||
console.error('E', e);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports.getProductByCode = function (idapp, code) {
|
||||
return productInfo.findAllIdApp(idapp, code);
|
||||
}
|
||||
module.exports.replaceProductImgToImageFile = async function (abilitaserver) {
|
||||
const ProductInfo = this;
|
||||
|
||||
if (abilitaserver) {
|
||||
// const result = await ProductInfo.updateMany({ "img": { $exists: true } }, { $rename: { 'img': 'imagefile' } });
|
||||
|
||||
// Trova tutti i documenti con il campo 'img' che esiste
|
||||
const documents = await ProductInfo.find({ "img": { $exists: true } });
|
||||
|
||||
// Aggiorna ciascun documento
|
||||
for (let doc of documents) {
|
||||
if (doc.img && doc.img.startsWith('upload/products/')) {
|
||||
// Rimuovi il prefisso '/upload/products' dal campo `img`
|
||||
doc.imagefile = doc.img.replace(/^\upload\/products\//, '');
|
||||
doc.img = undefined; // Può anche rimuovere il campo img corrente se desiderato
|
||||
await doc.save(); // Salva il documento aggiornato
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Updated ${documents.length} document(s) with new imagefile paths.`);
|
||||
|
||||
} else {
|
||||
const documents = await ProductInfo.find({ "imagefile": { $exists: true } });
|
||||
|
||||
// Aggiorna ciascun documento
|
||||
for (let doc of documents) {
|
||||
if (doc.imagefile && doc.imagefile.startsWith('upload/products/')) {
|
||||
// Rimuovi il prefisso '/upload/products' dal campo `img`
|
||||
doc.imagefile = doc.imagefile.replace(/^\upload\/products\//, '');
|
||||
await doc.save(); // Salva il documento aggiornato
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Updated ${documents.length} document(s) with new imagefile paths.`);
|
||||
};*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
await ProductInfo.updateMany({}, { 'vers_img': 0 });
|
||||
|
||||
console.log(`Updated ${result.modifiedCount} document(s).`);
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {Object} Article
|
||||
* @property {bigint} Id
|
||||
* @property {number} IdArticolo
|
||||
* @property {string} Ean13
|
||||
* @property {string} Titolo
|
||||
* @property {string} ListaAutori
|
||||
* @property {string} ListaArgomenti
|
||||
* @property {number} IdStatoProdotto
|
||||
* @property {number} PrezzoIvato
|
||||
* @property {number} IdMarchioEditoriale
|
||||
* @property {number} IdCollana
|
||||
* @property {Date} DataPubblicazione
|
||||
* @property {number} IdTipologia
|
||||
* @property {number} IdTipoFormato
|
||||
* @property {string} Misure
|
||||
* @property {string} Pagine
|
||||
* @property {string} Sottotitolo
|
||||
* @property {string} Durata
|
||||
* @property {string} Numero
|
||||
* @property {string} Edizione
|
||||
* @property {string} Ristampa
|
||||
* @property {Date} DataInizioCampagna
|
||||
* @property {Date} DataFineCampagna
|
||||
* @property {number} ScontoCampagna
|
||||
* @property {number} PrezzoIvatoScontatoCampagna
|
||||
* @property {Date} DataOra
|
||||
* @property {boolean} Enabled
|
||||
* @property {number} IDTagGruppo
|
||||
* @property {string} Utente
|
||||
* @property {number} PercIva
|
||||
* @property {number} IdTitoloOriginale
|
||||
* @property {boolean} EnabledAlFresco
|
||||
* @property {number} CodEdizione
|
||||
* @property {string} FasciaEta
|
||||
* @property {string} DescrizioneStatoProdotto
|
||||
* @property {string} DescrizioneTipologia
|
||||
* @property {string} DescrizioneFormato
|
||||
* @property {string} DescrizioneCollana
|
||||
* @property {string} DescrArgomento
|
||||
* @property {string} AutoriCompleti
|
||||
* @property {string} CasaEditrice
|
||||
*/
|
||||
|
||||
/**
|
||||
* Aggiorna il prodotto basandosi su un articolo
|
||||
* @param {Article} article - Dati dell'articolo da aggiornare
|
||||
* @param {boolean} creanew
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
module.exports.aggiornaProductFromGMArticle = async function (article, creanew) {
|
||||
|
||||
const ProductInfo = this;
|
||||
|
||||
try {
|
||||
if (article) {
|
||||
// cerca se esiste sul db locale
|
||||
|
||||
let findrec = this.find({ sku: article.IdArticolo }).lean();
|
||||
if (findrec) {
|
||||
// Articolo Trovato !
|
||||
} else {
|
||||
// articolo inesistente, lo vuoi creare ?
|
||||
if (creanew) {
|
||||
findrec = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (findrec) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
console.error('Error aggiornaProductFromGMArticle:', err);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports.correggiProductTypes = async function () {
|
||||
const ProductInfo = this;
|
||||
const bulkOps = [];
|
||||
|
||||
try {
|
||||
// Fase di aggregazione
|
||||
const cursor = ProductInfo.aggregate([
|
||||
{
|
||||
$project: {
|
||||
_id: 1,
|
||||
productType: 1,
|
||||
productTypes: [{ $ifNull: ['$productType', 10] }]
|
||||
}
|
||||
}
|
||||
]).cursor({ batchSize: 1000 }).exec();
|
||||
|
||||
// Itera attraverso ogni documento utilizzando il cursore
|
||||
for await (const doc of cursor) {
|
||||
bulkOps.push({
|
||||
updateOne: {
|
||||
filter: { _id: doc._id },
|
||||
update: {
|
||||
$set: { productTypes: doc.productTypes },
|
||||
$unset: { productType: "" }
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Scrivi i batch di operazioni ogni 1000 documenti
|
||||
if (bulkOps.length === 1000) {
|
||||
await ProductInfo.bulkWrite(bulkOps);
|
||||
bulkOps.length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Scrivi eventuali operazioni rimanenti
|
||||
if (bulkOps.length > 0) {
|
||||
await ProductInfo.bulkWrite(bulkOps);
|
||||
}
|
||||
|
||||
console.log('ProductInfo.productType converted to productTypes array and saved');
|
||||
} catch (err) {
|
||||
console.error('Error converting ProductInfo.productType:', err);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.updateProductInfoByStats = async function (idapp) {
|
||||
let mylog = '';
|
||||
let mylog2 = '';
|
||||
let mylogtot = '';
|
||||
try {
|
||||
const ProductInfo = this;
|
||||
|
||||
const T_WEB_ArticoliFatturati = require('./t_web_articolifatturati');
|
||||
const T_WEB_Ordini = require('./t_web_ordini');
|
||||
|
||||
mylog = "Inizio Aggiornamento Statistiche... \n";
|
||||
mylogtot += mylog;
|
||||
console.log(mylog);
|
||||
|
||||
let countUpdate = 0;
|
||||
|
||||
countUpdate = await T_WEB_ArticoliFatturati.updateStatisticsFatt('', idapp, true);
|
||||
|
||||
// Itera sui risultati e aggiorna productInfo
|
||||
|
||||
mylog = `Aggiornati ${countUpdate} record di productInfo`;
|
||||
mylogtot += mylog;
|
||||
console.log(mylog);
|
||||
|
||||
mylog2 = "Inizio Aggiornamento Statistiche Ordini ... \n";
|
||||
mylogtot += mylog2;
|
||||
console.log(mylog2);
|
||||
|
||||
countUpdate = await T_WEB_Ordini.updateStatisticsOrders('', idapp, true);
|
||||
|
||||
mylog2 = `Aggiornati ${countUpdate} record di productInfo`;
|
||||
mylogtot += mylog2;
|
||||
|
||||
console.log(mylog2);
|
||||
|
||||
} catch (error) {
|
||||
mylog = "Errore durante l'aggiornamento di productInfo:" + error;
|
||||
console.error(mylog);
|
||||
}
|
||||
|
||||
return mylogtot;
|
||||
}
|
||||
|
||||
// crea setImgNotFound
|
||||
|
||||
module.exports.setImgNotFound = async function (id) {
|
||||
// set sul record id il flag image_not_found
|
||||
try {
|
||||
const ProductInfo = this;
|
||||
|
||||
await ProductInfo.updateOne(
|
||||
{ _id: id },
|
||||
{ $set: { image_not_found: true } }
|
||||
);
|
||||
console.log(`Flag image_not_found set for record with id: ${id}`);
|
||||
} catch (error) {
|
||||
console.error(`Error setting image_not_found flag for id ${id}:`, error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// imposta tutti i record con image_not_found: false
|
||||
module.exports.resetImageNotFound = async function () {
|
||||
try {
|
||||
const ProductInfo = this;
|
||||
|
||||
await ProductInfo.updateMany(
|
||||
{ image_not_found: true },
|
||||
{ $set: { image_not_found: false } }
|
||||
);
|
||||
console.log('Flag image_not_found reset to false for all records');
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('Error resetting image_not_found flag:', error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// crea una funzione che mi rimuove il record "product" che utilizza productInfo, nel caso in cui date_updated_fromGM non esista
|
||||
module.exports.removeProductInfoWithoutDateUpdatedFromGM = async function (idapp) {
|
||||
const ProductInfo = this;
|
||||
|
||||
const globalTables = require('../tools/globalTables');
|
||||
const Product = globalTables.getTableByTableName('Product');
|
||||
|
||||
let mylog;
|
||||
|
||||
try {
|
||||
const arrproductInfo = await ProductInfo.find({ idapp, date_updated_fromGM: { $exists: false } });
|
||||
|
||||
if (arrproductInfo.length > 0 && arrproductInfo.length < 1000) {
|
||||
mylog = `Rimuovo ${arrproductInfo.length} productInfo senza date_updated_fromGM !!`
|
||||
console.log(mylog);
|
||||
|
||||
for (const productinfo of arrproductInfo) {
|
||||
// cerca nella tabella Product se esiste idProductInfo = _id e cancella tutti i record che hanno questa corrispondenza
|
||||
if (Product) {
|
||||
await Product.updateMany(
|
||||
{ idProductInfo: productinfo._id },
|
||||
{ $set: { deleted: true } }
|
||||
);
|
||||
}
|
||||
|
||||
// Ora rimuovi anche questo productInfo
|
||||
await ProductInfo.updateOne(
|
||||
{ _id: productinfo._id },
|
||||
{ $set: { deleted: true } }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return mylog;
|
||||
} catch (error) {
|
||||
mylog += 'Error removing productInfo without date_updated_fromGM:' + error;
|
||||
console.error(mylog);
|
||||
}
|
||||
|
||||
return mylog;
|
||||
};
|
||||
|
||||
module.exports.createIndexes()
|
||||
.then(() => { })
|
||||
|
||||
@@ -55,9 +55,9 @@ module.exports.getEditoriWithTitleCount = async function (idapp, updatedata) {
|
||||
{ $match: { idapp } },
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos', // Nome della tua collezione productInfo
|
||||
from: 'products', // Nome della tua collezione productInfo
|
||||
localField: '_id',
|
||||
foreignField: 'idPublisher',
|
||||
foreignField: 'productInfo.idPublisher',
|
||||
as: 'products'
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
const mongoose = require('mongoose');
|
||||
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
|
||||
// Definizione dello schema
|
||||
const articoliFatturatiSchema = new mongoose.Schema({
|
||||
@@ -166,18 +165,18 @@ module.exports.updateStatisticsFatt = async function (CodArticolo, idapp, update
|
||||
|
||||
if (update) {
|
||||
for (const stat of statistics) {
|
||||
const result = await ProductInfo.updateOne(
|
||||
const result = await Product.updateOne(
|
||||
{
|
||||
sku: stat.sku,
|
||||
idapp
|
||||
idapp,
|
||||
'productInfo.sku': stat.sku,
|
||||
}, // Cerca il documento con lo stesso sku
|
||||
{
|
||||
$set: {
|
||||
fatLast3M: stat.fatLast3M,
|
||||
fatLast6M: stat.fatLast6M,
|
||||
fatLast1Y: stat.fatLast1Y,
|
||||
fatLast2Y: stat.fatLast2Y,
|
||||
totFat: stat.totFat,
|
||||
'productInfo.fatLast3M': stat.fatLast3M,
|
||||
'productInfo.fatLast6M': stat.fatLast6M,
|
||||
'productInfo.fatLast1Y': stat.fatLast1Y,
|
||||
'productInfo.fatLast2Y': stat.fatLast2Y,
|
||||
'productInfo.totFat': stat.totFat,
|
||||
}
|
||||
},
|
||||
{ upsert: false } // Non crea il documento se non esiste
|
||||
|
||||
@@ -18,8 +18,6 @@ PrimaCopiaDaSpedire - int ()
|
||||
|
||||
const mongoose = require('mongoose');
|
||||
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
|
||||
// Definizione dello schema
|
||||
const ordiniSchema = new mongoose.Schema({
|
||||
Codice: {
|
||||
@@ -168,18 +166,18 @@ module.exports.updateStatisticsOrders = async function (CodArticoloGM, idapp, up
|
||||
if (update) {
|
||||
for (const stat of statistics) {
|
||||
|
||||
const result = await ProductInfo.updateOne(
|
||||
const result = await Product.updateOne(
|
||||
{
|
||||
sku: stat.sku,
|
||||
'productInfo.sku': stat.sku,
|
||||
idapp,
|
||||
}, // Cerca il documento con lo stesso sku
|
||||
{
|
||||
$set: {
|
||||
totVen: stat.totVen,
|
||||
vLast3M: stat.vLast3M,
|
||||
vLast6M: stat.vLast6M,
|
||||
vLast1Y: stat.vLast1Y,
|
||||
vLast2Y: stat.vLast2Y,
|
||||
'productInfo.totVen': stat.totVen,
|
||||
'productInfo.vLast3M': stat.vLast3M,
|
||||
'productInfo.vLast6M': stat.vLast6M,
|
||||
'productInfo.vLast1Y': stat.vLast1Y,
|
||||
'productInfo.vLast2Y': stat.vLast2Y,
|
||||
}
|
||||
},
|
||||
{ upsert: false } // Non crea il documento se non esiste
|
||||
|
||||
@@ -108,10 +108,10 @@ class CronMod {
|
||||
await CatProd.deleteMany({ idapp });
|
||||
await SubCatProd.deleteMany({ idapp });
|
||||
} else if (mydata.dbop === 'removeProductInfoWithoutDateUpdatedFromGM') {
|
||||
mystr = await ProductInfo.removeProductInfoWithoutDateUpdatedFromGM(idapp);
|
||||
mystr = await Product.removeProductInfoWithoutDateUpdatedFromGM(idapp);
|
||||
ris = { mystr };
|
||||
} else if (mydata.dbop === 'resetImageNotFound') {
|
||||
mystr = await ProductInfo.resetImageNotFound();
|
||||
mystr = await Product.resetImageNotFound();
|
||||
ris = { mystr };
|
||||
} else if (mydata.dbop === 'StatMacro') {
|
||||
const macro = new Macro(idapp, {});
|
||||
@@ -220,7 +220,7 @@ class CronMod {
|
||||
mystr = await CatProd.updateCatDeleteEmpty(req.body.idapp);
|
||||
ris = { mystr };
|
||||
} else if (mydata.dbop === 'UpdateStatFatturato') {
|
||||
mystr = await ProductInfo.updateProductInfoByStats(req.body.idapp);
|
||||
mystr = await Product.updateProductInfoByStats(req.body.idapp);
|
||||
ris = { mystr };
|
||||
} else if (mydata.dbop === 'MigrateMSSQLToMongoDb') {
|
||||
const { mssqlmigrateTables } = require('../controllers/articleController');
|
||||
@@ -464,11 +464,11 @@ class CronMod {
|
||||
await Circuit.createCircuitIfNotExist(req, idapp, recprov.prov);
|
||||
}
|
||||
} else if (mydata.dbop === 'correggiProductTypes') {
|
||||
await ProductInfo.correggiProductTypes();
|
||||
await Product.correggiProductTypes();
|
||||
} else if (mydata.dbop === 'replaceProductImgToImageFile') {
|
||||
await ProductInfo.replaceProductImgToImageFile(true);
|
||||
await Product.replaceProductImgToImageFile(true);
|
||||
} else if (mydata.dbop === 'removeUploadProducts_Path') {
|
||||
await ProductInfo.replaceProductImgToImageFile(false);
|
||||
await Product.replaceProductImgToImageFile(false);
|
||||
} else if (mydata.dbop === 'correggiCircuitiANull') {
|
||||
await User.updateMany({}, { $pull: { 'profile.mycircuits': { circuitname: null } } });
|
||||
} else if (mydata.dbop === 'ImpostaMinMaxPersonali') {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
const Importamacro = require('../models/importamacro'); // Assicurati di avere i modelli corretti
|
||||
const ImportaIsbn = require('../models/importaisbn');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const Product = require('../models/product');
|
||||
const CatProd = require('../models/catprod');
|
||||
const SubCatProd = require('../models/subcatprod');
|
||||
@@ -444,13 +443,13 @@ class Macro {
|
||||
let count = 0;
|
||||
if (Array.isArray(recproducts)) {
|
||||
if (recproducts.length > 10 && lavoromassivo && options.rimuovieventualiCancellati) {
|
||||
// rimuovi dalla tabella productInfo tutti i campi date_updated_fromGM
|
||||
const result = await ProductInfo.updateMany(
|
||||
// disattiva dalla tabella productInfo tutti i campi date_updated_fromGM
|
||||
const result = await Product.updateMany(
|
||||
{ idapp: options.idapp },
|
||||
{ $unset: { date_updated_fromGM: null } }
|
||||
{ $unset: { 'productInfo.date_updated_fromGM': null } }
|
||||
);
|
||||
let quanti_rimossi = result.modifiedCount;
|
||||
console.log(`Sbianca date_updated_fromGM da ProductInfo: (${quanti_rimossi} su ${result.matchedCount})`);
|
||||
console.log(`Sbianca date_updated_fromGM da Product: (${quanti_rimossi} su ${result.matchedCount})`);
|
||||
rimuoviTabellePerIniziare = true;
|
||||
}
|
||||
|
||||
@@ -634,7 +633,7 @@ class Macro {
|
||||
if (!product.title || !product.sku) importa = false;
|
||||
|
||||
if (importa) {
|
||||
const productInfo = this.preparaProductInfo(product);
|
||||
product.productInfo = this.preparaProductInfo(product);
|
||||
|
||||
if (this.localoptions?.importadaFDV) {
|
||||
const recrankingisbn = await ImportaIsbn.findOne({ sku: product.sku }).lean();
|
||||
@@ -647,12 +646,12 @@ class Macro {
|
||||
product.active = true;
|
||||
}
|
||||
|
||||
await this.gestisciCategorie(productInfo, product);
|
||||
await this.gestisciAutori(productInfo, product);
|
||||
await this.gestisciEditore(productInfo, product);
|
||||
await this.gestisciCollana(productInfo, product);
|
||||
await this.gestisciCategorie(product);
|
||||
await this.gestisciAutori(product);
|
||||
await this.gestisciEditore(product);
|
||||
await this.gestisciCollana(product);
|
||||
|
||||
const risrecInfo = await ProductInfo.findOneAndUpdate(
|
||||
const risrecInfo = await Product.findOneAndUpdate(
|
||||
{ code: productInfo.code },
|
||||
{ $set: productInfo },
|
||||
{ new: true, upsert: true, returnOriginal: false }
|
||||
@@ -705,7 +704,6 @@ class Macro {
|
||||
preparaProductInfo(product) {
|
||||
try {
|
||||
return {
|
||||
idapp: product.idapp,
|
||||
code: product.isbn,
|
||||
id_wp: product._id || undefined,
|
||||
sku: product.sku,
|
||||
@@ -869,10 +867,10 @@ class Macro {
|
||||
/**
|
||||
* Gestisce le categorie e sottocategorie del prodotto.
|
||||
*/
|
||||
async gestisciCategorie(productInfo, product) {
|
||||
async gestisciCategorie(product) {
|
||||
try {
|
||||
if (product.DescrArgomento) {
|
||||
productInfo.idCatProds = [];
|
||||
product.productInfo.idCatProds = [];
|
||||
const reccateg = await CatProd.findOne({ idapp: this.idapp, name: product.DescrArgomento });
|
||||
let nuovaCategoria = null;
|
||||
if (!reccateg) {
|
||||
@@ -892,12 +890,12 @@ class Macro {
|
||||
|
||||
|
||||
const myriscat = reccateg?._id || (nuovaCategoria ? nuovaCategoria._id : null);
|
||||
if (myriscat) productInfo.idCatProds.push(myriscat);
|
||||
if (myriscat) product.productInfo.idCatProds.push(myriscat);
|
||||
} else {
|
||||
if (product.categories) {
|
||||
// const arrcat = product.categories.trim().split(',');
|
||||
const arrcat = product.categories.trim().split(',');
|
||||
productInfo.idCatProds = [];
|
||||
product.productInfo.idCatProds = [];
|
||||
|
||||
for (const mycat of arrcat) {
|
||||
const mycatstr = mycat.trim();
|
||||
@@ -910,7 +908,7 @@ class Macro {
|
||||
}
|
||||
|
||||
const myriscat = reccateg?._id || (nuovaCategoria ? nuovaCategoria._id : null);
|
||||
if (myriscat) productInfo.idCatProds.push(myriscat);
|
||||
if (myriscat) product.productInfo.idCatProds.push(myriscat);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -922,13 +920,13 @@ class Macro {
|
||||
/**
|
||||
* Gestisce gli autori del prodotto.
|
||||
*/
|
||||
async gestisciAutori(productInfo, product) {
|
||||
async gestisciAutori(product) {
|
||||
if (product.Autore) {
|
||||
let arrAuthor = [];
|
||||
if (product.id_wp) arrAuthor = this.estraiAutori_FDV(product.Autore);
|
||||
else arrAuthor = this.estraiAutori(product.Autore);
|
||||
|
||||
productInfo.idAuthors = [];
|
||||
product.productInfo.idAuthors = [];
|
||||
|
||||
for (const author of arrAuthor) {
|
||||
const recauthor = await Author.findOne({
|
||||
@@ -944,7 +942,7 @@ class Macro {
|
||||
}
|
||||
|
||||
const myrisautore = recauthor?._id || (nuovoAutore ? nuovoAutore._id : '');
|
||||
if (myrisautore) productInfo.idAuthors.push(myrisautore);
|
||||
if (myrisautore) product.productInfo.idAuthors.push(myrisautore);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -995,9 +993,9 @@ class Macro {
|
||||
/**
|
||||
* Gestisce l'editore del prodotto.
|
||||
*/
|
||||
async gestisciEditore(productInfo, product) {
|
||||
if (productInfo.publisher) {
|
||||
const publisher = productInfo.publisher.trim();
|
||||
async gestisciEditore(product) {
|
||||
if (product.productInfo.publisher) {
|
||||
const publisher = product.productInfo.publisher.trim();
|
||||
const recpublisher = await Publisher.findOne({ idapp: this.idapp, name: publisher }).lean();
|
||||
|
||||
let nuovoEditore = null;
|
||||
@@ -1009,14 +1007,14 @@ class Macro {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (recpublisher?._id || nuovoEditore?._id) productInfo.idPublisher = recpublisher?._id || nuovoEditore._id;
|
||||
if (recpublisher?._id || nuovoEditore?._id) product.productInfo.idPublisher = recpublisher?._id || nuovoEditore._id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestisce la collana del prodotto.
|
||||
*/
|
||||
async gestisciCollana(productInfo, product) {
|
||||
async gestisciCollana(product) {
|
||||
if (product.collezione && product.numCollana) {
|
||||
const collana = product.collezione.trim();
|
||||
const reccollana = await Collana.findOne({ idapp: this.idapp, title: collana }).lean();
|
||||
@@ -1030,17 +1028,17 @@ class Macro {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (reccollana?._id || nuovaCollana?._id) productInfo.idCollana = reccollana?._id || nuovaCollana._id;
|
||||
if (reccollana?._id || nuovaCollana?._id) product.productInfo.idCollana = reccollana?._id || nuovaCollana._id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Aggiorna l'immagine se necessario.
|
||||
*/
|
||||
async aggiornaImmagineSeNecessario(productInfo) {
|
||||
const { prodInfo, aggiornatoimg } = await tools.downloadImgIfMissing(productInfo);
|
||||
async aggiornaImmagineSeNecessario(product) {
|
||||
const { prodInfo, aggiornatoimg } = await tools.downloadImgIfMissing(product);
|
||||
if (aggiornatoimg) {
|
||||
await ProductInfo.findOneAndUpdate({ code: productInfo.code }, { $set: prodInfo });
|
||||
await Product.findOneAndUpdate({ _id: product._id }, { $set: { productInfo: prodInfo } });
|
||||
}
|
||||
|
||||
return aggiornatoimg;
|
||||
|
||||
@@ -2,7 +2,6 @@ const axios = require('axios');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const Product = require('../models/product');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
|
||||
const tools = require('../tools/general');
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
@@ -96,9 +95,9 @@ class AmazonBookScraper {
|
||||
}
|
||||
}
|
||||
|
||||
getTitleByProductInfo(productInfo) {
|
||||
getTitleByProduct(product) {
|
||||
try {
|
||||
return productInfo?.name.trim();
|
||||
return product?.productInfo.name.trim();
|
||||
} catch (e) {
|
||||
return '';
|
||||
}
|
||||
@@ -107,9 +106,9 @@ class AmazonBookScraper {
|
||||
async extractData(myproduct, html, url, isbn10) {
|
||||
const $ = cheerio.load(html);
|
||||
|
||||
const productInfo = await ProductInfo.findOne({ _id: myproduct.idProductInfo }).lean();
|
||||
const product = await Product.findOne({ _id: myproduct._id }).lean();
|
||||
|
||||
const title_ondb = this.getTitleByProductInfo(productInfo);
|
||||
const title_ondb = this.getTitleByProduct(product);
|
||||
|
||||
// Titolo
|
||||
let title = $('#productTitle').text().trim() || null;
|
||||
@@ -247,6 +246,7 @@ class AmazonBookScraper {
|
||||
|
||||
async scrapeISBN(myproduct, isbn, options) {
|
||||
try {
|
||||
const product = await Product.findOne({ _id: myproduct._id }).lean();
|
||||
const datastored = await this.findRecordMyScrapingBookByIsbn(isbn);
|
||||
|
||||
let data = null;
|
||||
@@ -289,7 +289,6 @@ class AmazonBookScraper {
|
||||
if (index < 0) index = 0;
|
||||
}
|
||||
|
||||
const productInfo = {};
|
||||
let aggiornaDataPubb = false;
|
||||
|
||||
let aggiornaPages = false;
|
||||
@@ -325,17 +324,17 @@ class AmazonBookScraper {
|
||||
}
|
||||
|
||||
// Determina se aggiornare data pubblicazione
|
||||
const currentDatePub = myproduct.idProductInfo.date_pub;
|
||||
const currentDatePub = myproduct.productInfo.date_pub;
|
||||
aggiornaDataPubb =
|
||||
(!options.aggiornasoloSeVuoti || !tools.isDateValid(currentDatePub)) &&
|
||||
tools.isDateValid(data.data_pubblicazione);
|
||||
if (aggiornaDataPubb && data.data_pubblicazione) {
|
||||
productInfo.date_pub = new Date(data.data_pubblicazione);
|
||||
product.productInfo.date_pub = new Date(data.data_pubblicazione);
|
||||
}
|
||||
|
||||
aggiornaSottotitolo = (!options.aggiornasoloSeVuoti || !myproduct.idProductInfo.sottotitolo) && data.sottotitolo;
|
||||
aggiornaSottotitolo = (!options.aggiornasoloSeVuoti || !myproduct.productInfo.sottotitolo) && data.sottotitolo;
|
||||
if (aggiornaSottotitolo && data.sottotitolo) {
|
||||
productInfo.sottotitolo = data.sottotitolo;
|
||||
product.productInfo.sottotitolo = data.sottotitolo;
|
||||
}
|
||||
|
||||
aggiornaSottotitolo = false; // !! PER ORA LO DISATTIVO PERCHE' non esiste sempre il sottotitolo in un libro.
|
||||
@@ -373,9 +372,9 @@ class AmazonBookScraper {
|
||||
if (aggiornaProductInfo) {
|
||||
// Aggiorna productInfo se contiene dati
|
||||
if (!tools.isObjectEmpty(productInfo)) {
|
||||
risupdate = await ProductInfo.findOneAndUpdate(
|
||||
{ _id: myproduct.idProductInfo },
|
||||
{ $set: productInfo },
|
||||
risupdate = await Product.findOneAndUpdate(
|
||||
{ _id: myproduct._id },
|
||||
{ $set: { productInfo: product.productInfo } },
|
||||
{ new: true, upsert: true, includeResultMetadata: true }
|
||||
).lean();
|
||||
}
|
||||
@@ -384,7 +383,7 @@ class AmazonBookScraper {
|
||||
|
||||
const concatenatedProduct = {
|
||||
...recModificato,
|
||||
...productInfo,
|
||||
...product.productInfo,
|
||||
};
|
||||
|
||||
if (updated) {
|
||||
|
||||
@@ -17,7 +17,6 @@ const Inventariogm = require('../models/inventariogm');
|
||||
const Importamacro = require('../models/importamacro');
|
||||
const ImportaDescr = require('../models/importadescr');
|
||||
const ImportaIsbn = require('../models/importaisbn');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const CatProd = require('../models/catprod');
|
||||
const Collana = require('../models/collana');
|
||||
const Author = require('../models/author');
|
||||
@@ -72,7 +71,7 @@ function launchGenPdfIfNeeded() {
|
||||
}
|
||||
}
|
||||
|
||||
async function updateProductInfo(recproductInfoAttuale, product, idapp, mycatstr) {
|
||||
/*async function updateProductInfo(recproductInfoAttuale, product, idapp, mycatstr) {
|
||||
if (!recproductInfoAttuale || !mycatstr) return recproductInfoAttuale;
|
||||
|
||||
let idArgomentoNum = null;
|
||||
@@ -93,7 +92,7 @@ async function updateProductInfo(recproductInfoAttuale, product, idapp, mycatstr
|
||||
}
|
||||
|
||||
return productInfo;
|
||||
}
|
||||
}*/
|
||||
|
||||
async function findOrCreateCatProd(idapp, idArgomento, DescrArgomento) {
|
||||
let reccatprod = null;
|
||||
@@ -1240,28 +1239,28 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
code: product.code,
|
||||
};
|
||||
|
||||
const myproductInfo = await ProductInfo.findOne({ code: productInfo.code });
|
||||
const myproduct = await Product.findOne({ 'productInfo.code': productInfo.code });
|
||||
|
||||
// IMPOSTA I VALORI SOLO SE NON ESISTONO ! ALTRIMENTI LASCIA QUELLI GIA' IMPORTATI (O MODIFICATI)
|
||||
|
||||
if (getvalueByJsonText(product.url)) {
|
||||
if ((myproductInfo && !myproductInfo.link_macro) || !myproductInfo)
|
||||
if ((myproduct && !myproduct.productInfo.link_macro) || !myproduct.productInfo)
|
||||
productInfo.link_macro = getvalueByJsonText(product.url);
|
||||
}
|
||||
if (getvalueByJsonText(product.descrizione)) {
|
||||
if ((myproductInfo && !myproductInfo.descrizione_breve_macro) || !myproductInfo)
|
||||
if ((myproduct && !myproduct.productInfo.descrizione_breve_macro) || !myproduct.productInfo)
|
||||
productInfo.descrizione_breve_macro = getvalueByJsonText(product.descrizione);
|
||||
}
|
||||
if (getvalueByJsonText(product.descrizione_completa)) {
|
||||
if ((myproductInfo && !myproductInfo.descrizione_completa_macro) || !myproductInfo)
|
||||
if ((myproduct && !myproduct.productInfo.descrizione_completa_macro) || !myproduct.productInfo)
|
||||
productInfo.descrizione_completa_macro = getvalueByJsonText(product.descrizione_completa);
|
||||
}
|
||||
if (getvalueByJsonText(product.sottotitolo)) {
|
||||
if ((myproductInfo && !myproductInfo.sottotitolo) || !myproductInfo)
|
||||
if ((myproduct && !myproduct.productInfo.sottotitolo) || !myproduct.productInfo)
|
||||
productInfo.sottotitolo = getvalueByJsonText(product.sottotitolo);
|
||||
}
|
||||
if (getvalueByJsonText(product.titolo)) {
|
||||
if ((myproductInfo && !myproductInfo.name) || !myproductInfo)
|
||||
if ((myproduct && !myproduct.productInfo.name) || !myproduct.productInfo)
|
||||
productInfo.name = getvalueByJsonText(product.titolo);
|
||||
}
|
||||
|
||||
@@ -1520,27 +1519,27 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
let imported = 0;
|
||||
let errors = 0;
|
||||
|
||||
for (const product of dataObjects) {
|
||||
for (const productImported of dataObjects) {
|
||||
let isnuovo = false;
|
||||
let setta = false;
|
||||
|
||||
let productInfo = {
|
||||
idapp: product.idapp,
|
||||
code: product.code,
|
||||
name: product.name,
|
||||
link: product.link,
|
||||
idapp: productImported.idapp,
|
||||
code: productImported.code,
|
||||
name: productImported.name,
|
||||
link: productImported.link,
|
||||
idCatProds: [],
|
||||
idSubCatProds: [],
|
||||
// img: 'upload/products/' + product.code + '.jpg',
|
||||
imagefile: product.code + '.jpg',
|
||||
weight: product.weight,
|
||||
unit: tools.getIdUnitsByText(product.unit),
|
||||
imagefile: productImported.code + '.jpg',
|
||||
weight: productImported.weight,
|
||||
unit: tools.getIdUnitsByText(productImported.unit),
|
||||
productTypes: shared_consts.PRODUCTTYPE.PRODUCT,
|
||||
};
|
||||
|
||||
let reccateg = null;
|
||||
if (product.cat_name) {
|
||||
arrcat = product.cat_name.trim().split(',');
|
||||
if (productImported.cat_name) {
|
||||
arrcat = productImported.cat_name.trim().split(',');
|
||||
for (const mycat of arrcat) {
|
||||
let mycatstr = mycat.trim();
|
||||
|
||||
@@ -1559,8 +1558,8 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
}
|
||||
}
|
||||
|
||||
if (product.subcat_name) {
|
||||
arrsubcat = product.subcat_name.trim().split(',');
|
||||
if (productImported.subcat_name) {
|
||||
arrsubcat = productImported.subcat_name.trim().split(',');
|
||||
productInfo.idSubCatProds = [];
|
||||
for (const mysubcat of arrsubcat) {
|
||||
let mysubcatstr = mysubcat.trim();
|
||||
@@ -1581,24 +1580,26 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
}
|
||||
}
|
||||
|
||||
if (!product.hasOwnProperty('active')) {
|
||||
product.active = true;
|
||||
if (!productImported.hasOwnProperty('active')) {
|
||||
productImported.active = true;
|
||||
}
|
||||
|
||||
if (product.code) delete product.code;
|
||||
/*if (product.code) delete product.code;
|
||||
if (product.name) delete product.name;
|
||||
if (product.link) delete product.link;
|
||||
if (product.link) delete product.link;*/
|
||||
|
||||
let esisteindb = await ProductInfo.findOne({ code: productInfo.code }).lean();
|
||||
let esisteindb = await Product.findOne({ 'productInfo.code': productInfo.code }).lean();
|
||||
|
||||
// Update ProductInfo
|
||||
let risrecInfo = await ProductInfo.findOneAndUpdate(
|
||||
{ code: productInfo.code },
|
||||
{ $set: productInfo },
|
||||
let risrecInfo = await Product.findOneAndUpdate(
|
||||
{ 'productInfo.code': productInfo.code },
|
||||
{ $set: { productInfo: productInfo } },
|
||||
{ new: true, upsert: true }
|
||||
);
|
||||
|
||||
// .... ANDARE AVANTI DA QUI... .productInfo.... SISTEMARE!
|
||||
if (risrecInfo) {
|
||||
product.idProductInfo = risrecInfo._id;
|
||||
productImported.productInfo = risrecInfo._id;
|
||||
|
||||
recnewInfo = await ProductInfo.findOne({ code: productInfo.code }).lean();
|
||||
|
||||
@@ -1613,20 +1614,20 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
|
||||
// Cerca il GAS
|
||||
let recGas = null;
|
||||
if (product.gas_name) {
|
||||
if (productImported.gas_name) {
|
||||
// Cerca il GAS
|
||||
recGas = await Gasordine.findOne({ idapp, name: product.gas_name }).lean();
|
||||
recGas = await Gasordine.findOne({ idapp, name: productImported.gas_name }).lean();
|
||||
}
|
||||
|
||||
if (!recGas && !!product.gas_name) {
|
||||
recGas = new Gasordine({ idapp, name: product.gas_name, active: true });
|
||||
if (!recGas && !!productImported.gas_name) {
|
||||
recGas = new Gasordine({ idapp, name: productImported.gas_name, active: true });
|
||||
// Non esiste questo GAS, quindi lo creo !
|
||||
ris = await recGas.save();
|
||||
recGas = await Gasordine.findOne({ idapp, name: product.gas_name }).lean();
|
||||
recGas = await Gasordine.findOne({ idapp, name: productImported.gas_name }).lean();
|
||||
}
|
||||
|
||||
let recProductExist = null;
|
||||
let queryprod = { idProductInfo: product.idProductInfo };
|
||||
let queryprod = { idProductInfo: productImported.idProductInfo };
|
||||
|
||||
if (recGas) {
|
||||
queryprod = { ...queryprod, idGasordine: recGas._id };
|
||||
@@ -1639,22 +1640,22 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
}
|
||||
|
||||
if (!options.aggiornaStockQty && esisteindb && !isnuovo) {
|
||||
delete product.stockQty;
|
||||
delete product.maxbookableGASQty;
|
||||
delete productImported.stockQty;
|
||||
delete productImported.maxbookableGASQty;
|
||||
}
|
||||
|
||||
// AGGIORNA PRODUCT
|
||||
let risrec = await Product.findOneAndUpdate(queryprod, { $set: product }, { new: true, upsert: true });
|
||||
let risrec = await Product.findOneAndUpdate(queryprod, { $set: productImported }, { new: true, upsert: true });
|
||||
|
||||
let recnew = await Product.findOne(queryprod).lean();
|
||||
|
||||
if (risrec) {
|
||||
if (risrec._id) {
|
||||
// Record existed, so it was updated
|
||||
let arrfieldchange = tools.differentObjects(product, recnew);
|
||||
let arrfieldchange = tools.differentObjects(productImported, recnew);
|
||||
if (arrfieldchange.length > 0) {
|
||||
updated++;
|
||||
console.log('Changed:', product.idProductInfo + ': ' + arrfieldchange);
|
||||
console.log('Changed:', productImported.idProductInfo + ': ' + arrfieldchange);
|
||||
}
|
||||
} else {
|
||||
// Record didn't exist, so it was created
|
||||
@@ -1662,13 +1663,13 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
}
|
||||
} else {
|
||||
// risrec is null or undefined, indicating an error
|
||||
console.error('Error: ', product.productInfo.name);
|
||||
console.error('Error: ', productImported.productInfo.name);
|
||||
errors++;
|
||||
}
|
||||
|
||||
await Product.singlerecconvert_AfterImport_AndSave(idapp, recnew, isnuovo);
|
||||
} else {
|
||||
console.error('Error ProductInfo: ', product.code);
|
||||
console.error('Error ProductInfo: ', productImported.code);
|
||||
errors++;
|
||||
}
|
||||
}
|
||||
@@ -1871,6 +1872,7 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
return res.status(400).send();
|
||||
});
|
||||
|
||||
/*
|
||||
async function importaCatalogo(data) {
|
||||
let updated = 0;
|
||||
let imported = 0;
|
||||
@@ -2059,11 +2061,6 @@ async function importaCatalogo(data) {
|
||||
productInfo.productTypes.push(vers);
|
||||
}
|
||||
|
||||
/*if (product.Data) {
|
||||
productInfo.date_pub = new Date(product.Data * 1000);
|
||||
// convert data to timestamp
|
||||
productInfo.date_pub_ts = productInfo.date_pub.getTime();
|
||||
}*/
|
||||
|
||||
productInfo.name = productInfo.name.replace(
|
||||
/ - Usato$| - Nuovo$| - Epub$| - Ebook$| - Mobi$| - DVD$| - Streaming$| - Download$/,
|
||||
@@ -2113,7 +2110,7 @@ async function importaCatalogo(data) {
|
||||
}
|
||||
|
||||
if (reccateg) {
|
||||
productInfo.idCatProds.push(reccateg._id);
|
||||
product.productInfo.idCatProds.push(reccateg._id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2149,7 +2146,7 @@ async function importaCatalogo(data) {
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
productInfo.idAuthors = [];
|
||||
product.productInfo.idAuthors = [];
|
||||
|
||||
for (const myauthor of arrAuthor) {
|
||||
// Cerca l'Autore
|
||||
@@ -2162,7 +2159,7 @@ async function importaCatalogo(data) {
|
||||
}
|
||||
|
||||
if (recauthor) {
|
||||
productInfo.idAuthors.push(recauthor._id);
|
||||
product.productInfo.idAuthors.push(recauthor._id);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
@@ -2173,7 +2170,7 @@ async function importaCatalogo(data) {
|
||||
|
||||
if (product.subcat_name) {
|
||||
arrsubcat = product.subcat_name.trim().split(',');
|
||||
productInfo.idSubCatProds = [];
|
||||
product.productInfo.idSubCatProds = [];
|
||||
for (const mysubcat of arrsubcat) {
|
||||
let mysubcatstr = mysubcat.trim();
|
||||
|
||||
@@ -2188,13 +2185,13 @@ async function importaCatalogo(data) {
|
||||
}
|
||||
|
||||
if (recsubcateg) {
|
||||
productInfo.idSubCatProds.push(recsubcateg._id);
|
||||
product.productInfo.idSubCatProds.push(recsubcateg._id);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (productInfo.publisher) {
|
||||
if (product.productInfo.publisher) {
|
||||
try {
|
||||
publisher = productInfo.publisher.trim();
|
||||
publisher = product.productInfo.publisher.trim();
|
||||
// Cerca la Sotto Categoria
|
||||
let recpublisher = await Publisher.findOne({ idapp, name: publisher }).lean();
|
||||
if (!recpublisher) {
|
||||
@@ -2205,7 +2202,7 @@ async function importaCatalogo(data) {
|
||||
}
|
||||
|
||||
if (recpublisher) {
|
||||
productInfo.idPublisher = recpublisher._id;
|
||||
product.productInfo.idPublisher = recpublisher._id;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
@@ -2213,19 +2210,19 @@ async function importaCatalogo(data) {
|
||||
}
|
||||
// Aggiorna la collana solo se non è stata già impostata nel record attuale
|
||||
//if (recproductInfoAttuale && !recproductInfoAttuale.idCollana && product.DescrizioneCollana) {
|
||||
if (productInfo.collezione && productInfo.numCollana) {
|
||||
if (product.productInfo.collezione && product.productInfo.numCollana) {
|
||||
reccollana = await Collana.findOne({ idapp, title: collezione }).lean();
|
||||
if (!reccollana) {
|
||||
try {
|
||||
// Non esiste questa collana, quindi la creo !
|
||||
reccollana = new Collana({ idapp, idCollana: productInfo.numCollana, title: product.DescrizioneCollana });
|
||||
reccollana = new Collana({ idapp, idCollana: product.productInfo.numCollana, title: product.DescrizioneCollana });
|
||||
ris = await reccoll.save();
|
||||
} catch (e) {
|
||||
console.error('Err', e);
|
||||
}
|
||||
}
|
||||
|
||||
if (reccollana) productInfo.idCollana = reccollana._id;
|
||||
if (reccollana) product.productInfo.idCollana = reccollana._id;
|
||||
}
|
||||
|
||||
if (!product.hasOwnProperty('active')) {
|
||||
@@ -2497,7 +2494,7 @@ async function importaCatalogo(data) {
|
||||
console.log(e.message);
|
||||
return res.status(400).send(e);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
router.post('/exec', authenticate, async (req, res) => {
|
||||
try {
|
||||
|
||||
@@ -10,7 +10,6 @@ const XLSX = require('xlsx');
|
||||
const upload = multer({ dest: 'uploads/' });
|
||||
|
||||
const Product = require('../models/product');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const Author = require('../models/author');
|
||||
|
||||
const tools = require('../tools/general');
|
||||
@@ -370,8 +369,8 @@ router.post('/search-books', authenticate, async (req, res) => {
|
||||
// Cerca il primo record che corrisponde per ISBN o titolo
|
||||
if (true) {
|
||||
if (!trovatoISBN) {
|
||||
let productInfoarrISBN = await ProductInfo.find({
|
||||
code: field.toUpperCase(),
|
||||
let productInfoarrISBN = await Product.find({
|
||||
'productInfo.code': field.toUpperCase(),
|
||||
$or: [{ deleted: false }, { deleted: { $exists: false } }],
|
||||
}).exec();
|
||||
|
||||
@@ -384,33 +383,33 @@ router.post('/search-books', authenticate, async (req, res) => {
|
||||
}
|
||||
if (!trovatoISBN && !trovato) {
|
||||
// Prima cerca se è esattamente cosi
|
||||
let productInfoarrTitle = await ProductInfo.find({
|
||||
let productarrTitle = await Product.find({
|
||||
$or: [{ deleted: false }, { deleted: { $exists: false } }],
|
||||
name: field,
|
||||
'productInfo.name': field,
|
||||
}).exec();
|
||||
if (productInfoarrTitle.length === 1) {
|
||||
productInfo = productInfoarrTitle[0];
|
||||
if (productarrTitle.length === 1) {
|
||||
productInfo = productarrTitle[0];
|
||||
trovato = true;
|
||||
} else {
|
||||
if (productInfoarrTitle.length > 1) {
|
||||
if (productarrTitle.length > 1) {
|
||||
// Prendi l'Ultimo !
|
||||
productInfo = productInfoarrTitle[productInfoarrTitle.length - 1];
|
||||
productInfo = productarrTitle[productarrTitle.length - 1];
|
||||
trovato = true;
|
||||
}
|
||||
}
|
||||
if (!trovato) {
|
||||
// Altrimenti per Titolo
|
||||
productInfoarrTitle = await ProductInfo.find({
|
||||
productarrTitle = await Product.find({
|
||||
$or: [{ deleted: false }, { deleted: { $exists: false } }],
|
||||
name: new RegExp(`.*${escapeRegExp(tools.removeAccents(field.toUpperCase()))}.*`, 'i'),
|
||||
'productInfo.name': new RegExp(`.*${escapeRegExp(tools.removeAccents(field.toUpperCase()))}.*`, 'i'),
|
||||
}).exec();
|
||||
if (productInfoarrTitle.length === 1) {
|
||||
productInfo = productInfoarrTitle[0];
|
||||
if (productarrTitle.length === 1) {
|
||||
productInfo = productarrTitle[0];
|
||||
trovato = true;
|
||||
} else {
|
||||
if (productInfoarrTitle.length > 1) {
|
||||
if (productarrTitle.length > 1) {
|
||||
// Prendi l'Ultimo !
|
||||
productInfo = productInfoarrTitle[productInfoarrTitle.length - 1];
|
||||
productInfo = productarrTitle[productarrTitle.length - 1];
|
||||
trovato = true;
|
||||
}
|
||||
}
|
||||
@@ -426,15 +425,14 @@ router.post('/search-books', authenticate, async (req, res) => {
|
||||
if (product) {
|
||||
const existingResult = results.find((r) => r._id.toString() === product._id.toString());
|
||||
if (!existingResult) {
|
||||
let titolo = productInfo.name;
|
||||
let titolo = product.productInfo.name;
|
||||
results.push({
|
||||
...product,
|
||||
productInfo,
|
||||
_id: product._id,
|
||||
title: titolo,
|
||||
isbn: product.isbn,
|
||||
authors: await Promise.all(
|
||||
productInfo.idAuthors.map(async (authorId) => {
|
||||
product.productInfo.idAuthors.map(async (authorId) => {
|
||||
const author = await Author.findById(authorId).exec();
|
||||
return author ? `${author.name} ${author.surname}`.trim() : '';
|
||||
})
|
||||
|
||||
@@ -526,19 +526,6 @@ router.post('/:userId/gestord', authenticate, async function (req, res, next) {
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'productinfos',
|
||||
localField: 'product.idProductInfo',
|
||||
foreignField: '_id',
|
||||
as: 'productInfo',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$productInfo',
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'gasordines',
|
||||
@@ -588,13 +575,13 @@ router.post('/:userId/gestord', authenticate, async function (req, res, next) {
|
||||
$group: {
|
||||
_id: '$product._id',
|
||||
name: {
|
||||
$first: '$productInfo.name',
|
||||
$first: '$product.productInfo.name',
|
||||
},
|
||||
weight: {
|
||||
$first: '$productInfo.weight',
|
||||
$first: '$product.productInfo.weight',
|
||||
},
|
||||
unit: {
|
||||
$first: '$productInfo.unit',
|
||||
$first: '$product.productInfo.unit',
|
||||
},
|
||||
price_acquistato: {
|
||||
$first: '$product.price_acquistato',
|
||||
|
||||
@@ -84,7 +84,6 @@ const Collana = require('../models/collana');
|
||||
const { Catalog } = require('../models/catalog');
|
||||
const { RaccoltaCataloghi } = require('../models/raccoltacataloghi');
|
||||
const Publisher = require('../models/publisher');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const Scontistica = require('../models/scontistica');
|
||||
const Department = require('../models/department');
|
||||
const { Category } = require('../models/category');
|
||||
@@ -1953,7 +1952,6 @@ async function load(req, res, version = '0') {
|
||||
? Product.findAllIdApp(idapp, undefined, undefined, req.user ? User.isManager(req.user.perm) : false)
|
||||
: Promise.resolve([]),*/
|
||||
products: Promise.resolve([]),
|
||||
// productInfos: version >= 91 ? ProductInfo.findAllIdApp(idapp) : Promise.resolve([]),
|
||||
productInfos: Promise.resolve([]),
|
||||
catprods: version >= 91 ? Product.getArrCatProds(idapp, shared_consts.PROD.BOTTEGA) : Promise.resolve([]),
|
||||
subcatprods: version >= 91 ? SubCatProd.findAllIdApp(idapp) : Promise.resolve([]),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5935,8 +5935,7 @@ module.exports = {
|
||||
return mydate2;
|
||||
},
|
||||
|
||||
async downloadImgIfMissing(productInfo) {
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
async downloadImgIfMissing(product) {
|
||||
const Product = require('../models/product');
|
||||
|
||||
try {
|
||||
@@ -5953,33 +5952,33 @@ module.exports = {
|
||||
|
||||
const vecchiomodo = false;
|
||||
|
||||
if (productInfo.image_link && vecchiomodo) {
|
||||
const relativeimg = productInfo.image_link.split('/').pop();
|
||||
if (product.productInfo.image_link && vecchiomodo) {
|
||||
const relativeimg = product.productInfo.image_link.split('/').pop();
|
||||
const img =
|
||||
this.getdirByIdApp(productInfo.idapp) +
|
||||
this.getdirByIdApp(product.productInfo.idapp) +
|
||||
dirmain +
|
||||
server_constants.DIR_UPLOAD +
|
||||
'/products/' +
|
||||
productInfo.image_link.split('/').pop();
|
||||
product.productInfo.image_link.split('/').pop();
|
||||
const savePath = path.resolve(__dirname, img); // Sostituisci con il percorso dove salvare l'immagine
|
||||
|
||||
let scaricaimg = !productInfo.imagefile || !(await this.isFileExistsAsync(savePath));
|
||||
let scaricaimg = !product.productInfo.imagefile || !(await this.isFileExistsAsync(savePath));
|
||||
|
||||
if (!productInfo.imagefile && (await this.isFileExistsAsync(savePath))) {
|
||||
if (!product.productInfo.imagefile && (await this.isFileExistsAsync(savePath))) {
|
||||
// esiste il file, ma sul DB non è corretto
|
||||
const stats = fs.statSync(savePath); // Ottieni informazioni sul file
|
||||
|
||||
if (stats.size > 0) {
|
||||
// Controlla se la dimensione del file è maggiore di zero
|
||||
// Esiste il file ed è non vuoto, ma sul DB non è corretto
|
||||
productInfo.imagefile = relativeimg;
|
||||
return { prodInfo: productInfo, aggiornatoimg: true };
|
||||
product.productInfo.imagefile = relativeimg;
|
||||
return { prodInfo: product.productInfo, aggiornatoimg: true };
|
||||
} else {
|
||||
scaricaimg = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (productInfo.imagefile && (await this.isFileExistsAsync(savePath))) {
|
||||
if (product.productInfo.imagefile && (await this.isFileExistsAsync(savePath))) {
|
||||
// esiste il file, ma sul DB non è corretto
|
||||
const stats = fs.statSync(savePath); // Ottieni informazioni sul file
|
||||
|
||||
@@ -5991,12 +5990,12 @@ module.exports = {
|
||||
|
||||
if (scaricaimg && vecchiomodo) {
|
||||
// Download image from the URL productInfo.image_link
|
||||
productInfo.imagefile = relativeimg;
|
||||
product.productInfo.imagefile = relativeimg;
|
||||
|
||||
const downloader = new ImageDownloader();
|
||||
|
||||
const aggiornatoimg = await downloader
|
||||
.downloadImage(productInfo.image_link, savePath, {
|
||||
.downloadImage(product.productInfo.image_link, savePath, {
|
||||
maxRetries: 1,
|
||||
initialDelay: 300,
|
||||
timeout: 15000,
|
||||
@@ -6010,44 +6009,44 @@ module.exports = {
|
||||
|
||||
return result;
|
||||
});
|
||||
return { prodInfo: productInfo, aggiornatoimg: aggiornatoimg.ris };
|
||||
return { prodInfo: product.productInfo, aggiornatoimg: aggiornatoimg.ris };
|
||||
}
|
||||
}
|
||||
|
||||
let fileesistente = false;
|
||||
if (productInfo.imagefile && productInfo.imagefile !== 'noimg.jpg') {
|
||||
if (product.productInfo.imagefile && product.productInfo.imagefile !== 'noimg.jpg') {
|
||||
// controlla se esiste il file
|
||||
const img =
|
||||
this.getdirByIdApp(productInfo.idapp) +
|
||||
this.getdirByIdApp(product.productInfo.idapp) +
|
||||
dirmain +
|
||||
server_constants.DIR_UPLOAD +
|
||||
'/products/' +
|
||||
productInfo.imagefile.split('/').pop();
|
||||
product.productInfo.imagefile.split('/').pop();
|
||||
const filecompleto = path.resolve(__dirname, img); // Sostituisci con il percorso dove salvare l'immagine
|
||||
|
||||
// Se non esiste lo scarico !
|
||||
fileesistente = await this.isFileExistsAsync(filecompleto);
|
||||
}
|
||||
|
||||
if (!vecchiomodo && (!productInfo.image_link || !fileesistente)) {
|
||||
let scarica_da_sito = !productInfo.imagefile || productInfo.imagefile === 'noimg.jpg';
|
||||
if (!vecchiomodo && (!product.productInfo.image_link || !fileesistente)) {
|
||||
let scarica_da_sito = !product.productInfo.imagefile || product.productInfo.imagefile === 'noimg.jpg';
|
||||
|
||||
if (!scarica_da_sito && productInfo.imagefile) {
|
||||
if (!scarica_da_sito && product.productInfo.imagefile) {
|
||||
scarica_da_sito = !fileesistente; // Se non esiste lo scarico !
|
||||
}
|
||||
|
||||
if (scarica_da_sito && !productInfo.image_not_found) {
|
||||
if (scarica_da_sito && !product.productInfo.image_not_found) {
|
||||
// date and time
|
||||
productInfo.imagefile = 'img_' + new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '');
|
||||
product.productInfo.imagefile = 'img_' + new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '');
|
||||
const img =
|
||||
this.getdirByIdApp(productInfo.idapp) +
|
||||
this.getdirByIdApp(product.productInfo.idapp) +
|
||||
dirmain +
|
||||
server_constants.DIR_UPLOAD +
|
||||
'/products/' +
|
||||
productInfo.imagefile.split('/').pop();
|
||||
product.productInfo.imagefile.split('/').pop();
|
||||
let savePath = path.resolve(__dirname, img); // Sostituisci con il percorso dove salvare l'immagine
|
||||
|
||||
let link = 'https://www.gruppomacro.com/copertine.php?id_gm=' + productInfo.sku;
|
||||
let link = 'https://www.gruppomacro.com/copertine.php?id_gm=' + product.productInfo.sku;
|
||||
|
||||
const downloader = new ImageDownloader();
|
||||
|
||||
@@ -6067,12 +6066,12 @@ module.exports = {
|
||||
(aggiornatoimg?.filepath && aggiornatoimg?.filepath?.includes('noimg.jpg'))
|
||||
) {
|
||||
// non trovato quindi la prossima volta non richiederlo
|
||||
await ProductInfo.setImgNotFound(productInfo._id);
|
||||
await Product.setImgNotFound(product._id);
|
||||
}
|
||||
|
||||
if (aggiornatoimg?.filepath?.includes('noimg.jpg')) {
|
||||
// nascondi il prodotto se non trovo l'immagine !
|
||||
await Product.updateOne({ idProductInfo: productInfo._id }, { $set: { deleted: true } });
|
||||
await Product.updateOne({ _id: product._id }, { $set: { deleted: true } });
|
||||
|
||||
aggiornatoimg = { ris: false, deleted: true };
|
||||
}
|
||||
@@ -6080,10 +6079,10 @@ module.exports = {
|
||||
if (aggiornatoimg?.filepath) {
|
||||
const filenamebase = path.basename(aggiornatoimg.filepath);
|
||||
// const img = '/upload/products/' + filenamebase;
|
||||
productInfo.imagefile = filenamebase;
|
||||
product.productInfo.imagefile = filenamebase;
|
||||
}
|
||||
|
||||
return { prodInfo: productInfo, aggiornatoimg: aggiornatoimg.ris };
|
||||
return { prodInfo: product.productInfo, aggiornatoimg: aggiornatoimg.ris };
|
||||
} else {
|
||||
return { prodInfo: null, aggiornatoimg: false };
|
||||
}
|
||||
|
||||
@@ -66,7 +66,6 @@ const { MsgTemplate } = require('../models/msg_template');
|
||||
const { Graduatoria } = require('../models/graduatoria');
|
||||
|
||||
const Product = require('../models/product');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const Producer = require('../models/producer');
|
||||
const Cart = require('../models/cart');
|
||||
const OrdersCart = require('../models/orderscart');
|
||||
@@ -116,7 +115,6 @@ module.exports = {
|
||||
else if (tablename === 'operators') mytable = Operator;
|
||||
else if (tablename === 'products') mytable = Product;
|
||||
else if (tablename === 'arrvariazioni') mytable = Product;
|
||||
else if (tablename === 'productinfos') mytable = ProductInfo;
|
||||
else if (tablename === 'storehouses') mytable = Storehouse;
|
||||
else if (tablename === 'providers') mytable = Provider;
|
||||
else if (tablename === 'gasordines') mytable = Gasordine;
|
||||
|
||||
@@ -258,7 +258,7 @@ module.exports = {
|
||||
],
|
||||
TABLES_USER_ID: ['mygroups', 'myskills', 'mybachecas', 'myhosps', 'mygoods'],
|
||||
TABLES_CREATEDBY: ['mygroups', 'circuits', 'attivitas'],
|
||||
TABLES_UPDATE_LASTMODIFIED: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'bots', 'mygroups', 'circuits', 'attivitas', 'myelems', 'mypages', 'productinfos', 'products', 'catalogs', 'crons'],
|
||||
TABLES_UPDATE_LASTMODIFIED: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'bots', 'mygroups', 'circuits', 'attivitas', 'myelems', 'mypages', 'products', 'catalogs', 'crons'],
|
||||
|
||||
TABLES_FIELDS_DESCR_AND_CITY_AND_USER: ['myskills', 'mybachecas', 'myhosps', 'mygoods'],
|
||||
|
||||
|
||||
1
warnedUsers.json
Normal file
1
warnedUsers.json
Normal file
@@ -0,0 +1 @@
|
||||
[5356627050]
|
||||
Reference in New Issue
Block a user