- Corretta query di estrapolazione libri su GM (Marco)

- aggiornato bestseller su fatlast1Y
- non mostrare piu i libri che non hanno l'immagine (sul catalogo).
- metti online i compressi
This commit is contained in:
Surya Paolo
2025-06-16 19:36:57 +02:00
parent 5668c620da
commit 8c0619992b
9 changed files with 117 additions and 58 deletions

View File

@@ -221,8 +221,8 @@ exports.getTableContentBase = async (options) => {
` + ` +
(options.campispeciali (options.campispeciali
? ` ? `
,f.DescrizioneStatoProdotto
,i.DescrizioneTipologia ,i.DescrizioneTipologia
,f.DescrizioneStatoProdotto
,n.DescrizioneFormato ,n.DescrizioneFormato
,y.DescrizioneCollana ,y.DescrizioneCollana
,z.AutoriCompleti ,z.AutoriCompleti
@@ -230,33 +230,51 @@ exports.getTableContentBase = async (options) => {
,z3.CasaEditrice` ,z3.CasaEditrice`
: ``) + : ``) +
(options.showQtaDisponibile ? ` ,q.QtaDisponibile ` : ``) + (options.showQtaDisponibile ? ` ,q.QtaDisponibile ` : ``) +
` FROM T_WEB_Articoli T ` FROM T_WEB_Articoli T WITH (noLock)
JOIN( RIGHT JOIN(
SELECT IdArticolo, MAX(DataOra) AS data SELECT IdArticolo, MAX(DataOra) AS data
FROM T_WEB_Articoli FROM T_WEB_Articoli
GROUP BY IdArticolo GROUP BY IdArticolo
) b ON T.IdArticolo = b.IdArticolo AND T.DataOra = b.data ` + ) b ON T.IdArticolo = b.IdArticolo AND T.DataOra = b.data ` +
(options.campispeciali (options.campispeciali
? ` LEFT JOIN( ? `
SELECT e.IdStatoProdotto, e.Descrizione as DescrizioneStatoProdotto RIGHT JOIN
FROM T_WEB_StatiProdotto e ( SELECT
JOIN( e.IdStatoProdotto,
SELECT IdStatoProdotto, MAX(DataOra) as data1 e.Descrizione as DescrizioneStatoProdotto
FROM T_WEB_StatiProdotto FROM
GROUP BY IdStatoProdotto T_WEB_StatiProdotto e
) c ON e.IdStatoProdotto = c.IdStatoProdotto AND e.DataOra = c.data1 JOIN
) f ON T.IdStatoProdotto = f.IdStatoProdotto (
LEFT JOIN( SELECT
SELECT g.IdTipologia, g.Descrizione as DescrizioneTipologia IdStatoProdotto,
FROM T_WEB_Tipologie g MAX(DataOra) as data1
FROM
T_WEB_StatiProdotto
GROUP BY
IdStatoProdotto ) c
ON
e.IdStatoProdotto = c.IdStatoProdotto
AND e.DataOra = c.data1 ) f
ON
T.IdStatoProdotto = f.IdStatoProdotto
RIGHT JOIN(
SELECT g.IdTipologia,
g.Descrizione as DescrizioneTipologia
FROM
T_WEB_Tipologie g
JOIN( JOIN(
SELECT IdTipologia, MAX(DataOra) as data1 SELECT IdTipologia, MAX(DataOra) as data1
FROM T_WEB_Tipologie FROM
T_WEB_Tipologie
GROUP BY IdTipologia GROUP BY IdTipologia
) h ON g.IdTipologia = h.IdTipologia AND g.DataOra = h.data1 ) h ON g.IdTipologia = h.IdTipologia AND g.DataOra = h.data1
) i ON T.IdTipologia = i.IdTipologia ) i ON
LEFT JOIN( T.IdTipologia = i.IdTipologia
SELECT l.IdTipoFormato, l.Descrizione as DescrizioneFormato RIGHT JOIN(
SELECT l.IdTipoFormato,
l.Descrizione as DescrizioneFormato
FROM T_WEB_TipiFormato l FROM T_WEB_TipiFormato l
JOIN( JOIN(
SELECT IdTipoFormato, MAX(DataOra) as data1 SELECT IdTipoFormato, MAX(DataOra) as data1
@@ -264,16 +282,18 @@ exports.getTableContentBase = async (options) => {
GROUP BY IdTipoFormato GROUP BY IdTipoFormato
) m ON l.IdTipoFormato = m.IdTipoFormato AND l.DataOra = m.data1 ) m ON l.IdTipoFormato = m.IdTipoFormato AND l.DataOra = m.data1
) n ON T.IdTipoFormato = n.IdTipoFormato ) n ON T.IdTipoFormato = n.IdTipoFormato
LEFT JOIN( RIGHT JOIN(
SELECT v.IdCollana, v.Descrizione as DescrizioneCollana SELECT v.IdCollana,
v.Descrizione as DescrizioneCollana
FROM T_WEB_Collane v FROM T_WEB_Collane v
INNER JOIN( INNER JOIN(
SELECT IdCollana, MAX(ID) as MaxID SELECT IdCollana,
MAX(ID) as MaxID
FROM T_WEB_Collane FROM T_WEB_Collane
GROUP BY IdCollana GROUP BY IdCollana
) x ON v.IdCollana = x.IdCollana AND v.ID = x.MaxID ) x ON v.IdCollana = x.IdCollana AND v.ID = x.MaxID
) y ON T.IdCollana = y.IdCollana ) y ON T.IdCollana = y.IdCollana
LEFT JOIN( RIGHT JOIN(
SELECT g2.IdArgomento, g2.Descrizione as DescrArgomento SELECT g2.IdArgomento, g2.Descrizione as DescrArgomento
FROM T_WEB_Argomenti g2 FROM T_WEB_Argomenti g2
INNER JOIN( INNER JOIN(
@@ -282,7 +302,30 @@ exports.getTableContentBase = async (options) => {
GROUP BY IdArgomento GROUP BY IdArgomento
) h ON g2.IdArgomento = h.IdArgomento AND g2.DataOra = h.data12 ) h ON g2.IdArgomento = h.IdArgomento AND g2.DataOra = h.data12
) i2 ON T.ListaArgomenti = i2.IdArgomento ) i2 ON T.ListaArgomenti = i2.IdArgomento
LEFT JOIN( `+
(options.showQtaDisponibile
? ` RIGHT JOIN(
SELECT o.Codice, o.QtaDisponibile
FROM T_WEB_Disponibile o
JOIN(
SELECT Codice, MAX(DataOra) as data1
FROM T_WEB_Disponibile
GROUP BY Codice
) p ON o.Codice = p.Codice AND o.DataOra = p.data1
) q ON T.IdArticolo = q.Codice`
: ``) +
` RIGHT JOIN(
SELECT a3.IdMarchioEditoriale, a3.Descrizione as CasaEditrice
FROM T_WEB_MarchiEditoriali a3
JOIN(
SELECT IdMarchioEditoriale, MAX(DataOra) as maxData
FROM T_WEB_MarchiEditoriali
GROUP BY IdMarchioEditoriale
) aa3 ON a3.IdMarchioEditoriale = aa3.IdMarchioEditoriale AND a3.DataOra = aa3.maxData
) z3 ON T.IdMarchioEditoriale = z3.IdMarchioEditoriale
RIGHT JOIN(
SELECT SELECT
T1.IdArticolo, T1.IdArticolo,
STUFF(( STUFF((
@@ -297,7 +340,7 @@ exports.getTableContentBase = async (options) => {
JOIN( JOIN(
SELECT a.IdAutore, CONCAT(a.Nome, ' ', a.Cognome) AS AutoreCompleto SELECT a.IdAutore, CONCAT(a.Nome, ' ', a.Cognome) AS AutoreCompleto
FROM T_WEB_Autori a FROM T_WEB_Autori a
JOIN( RIGHT JOIN(
SELECT IdAutore, MAX(DataOra) AS maxData SELECT IdAutore, MAX(DataOra) AS maxData
FROM T_WEB_Autori FROM T_WEB_Autori
GROUP BY IdAutore GROUP BY IdAutore
@@ -306,28 +349,10 @@ exports.getTableContentBase = async (options) => {
FOR XML PATH(''), TYPE FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS AutoriCompleti ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS AutoriCompleti
FROM T_WEB_Articoli T1 FROM T_WEB_Articoli T1
GROUP BY T1.IdArticolo, T1.ListaAutori WHERE t1.DataOra = (select max(DataOra) AS DataOra from T_web_articoli As h WHERE h.IdArticolo = T1.IdArticolo)
) z ON T.IdArticolo = z.IdArticolo
LEFT JOIN( GROUP BY T1.IdArticolo, T1.ListaAutori ) z ON T.IdArticolo = z.IdArticolo
SELECT a3.IdMarchioEditoriale, a3.Descrizione as CasaEditrice `
FROM T_WEB_MarchiEditoriali a3
JOIN(
SELECT IdMarchioEditoriale, MAX(DataOra) as maxData
FROM T_WEB_MarchiEditoriali
GROUP BY IdMarchioEditoriale
) aa3 ON a3.IdMarchioEditoriale = aa3.IdMarchioEditoriale AND a3.DataOra = aa3.maxData
) z3 ON T.IdMarchioEditoriale = z3.IdMarchioEditoriale `
: ``) +
(options.showQtaDisponibile
? ` LEFT JOIN(
SELECT o.Codice, o.QtaDisponibile
FROM T_WEB_Disponibile o
JOIN(
SELECT Codice, MAX(DataOra) as data1
FROM T_WEB_Disponibile
GROUP BY Codice
) p ON o.Codice = p.Codice AND o.DataOra = p.data1
) q ON T.IdArticolo = q.Codice`
: ``); : ``);
} else { } else {
dataQuery += ` dataQuery += `
@@ -937,6 +962,7 @@ exports.mssqlmigrateTables = async (req) => {
listaTabelle.push({ table: 'T_WOO_Ordini', usaDataOra: false }); listaTabelle.push({ table: 'T_WOO_Ordini', usaDataOra: false });
listaTabelle.push({ table: 'T_WEB_Articoli', usaDataOra: true, fieldId: 'IdArticolo' }); listaTabelle.push({ table: 'T_WEB_Articoli', usaDataOra: true, fieldId: 'IdArticolo' });
} }
if (options?.parte2 || options?.tutte) { if (options?.parte2 || options?.tutte) {
listaTabelle.push({ table: 'T_WEB_Disponibile', usaDataOra: true, fieldId: 'Codice' }); listaTabelle.push({ table: 'T_WEB_Disponibile', usaDataOra: true, fieldId: 'Codice' });
listaTabelle.push({ table: 'T_WEB_Argomenti', usaDataOra: true, fieldId: 'IdArgomento' }); listaTabelle.push({ table: 'T_WEB_Argomenti', usaDataOra: true, fieldId: 'IdArgomento' });

View File

@@ -250,7 +250,7 @@ CatalogSchema.statics.getCatalogById = async function (id) {
product.idProductInfo.code && product.idProductInfo.code &&
product.idProductInfo.code !== '' && product.idProductInfo.code !== '' &&
product.idProductInfo.imagefile && product.idProductInfo.imagefile &&
//product.idProductInfo.imagefile !== 'noimg.jpg' && product.idProductInfo.imagefile !== 'noimg.jpg' &&
!product.delete !product.delete
); );
if (catalog.lista_prodotti.length !== originalLength) { if (catalog.lista_prodotti.length !== originalLength) {
@@ -258,6 +258,7 @@ CatalogSchema.statics.getCatalogById = async function (id) {
} }
} }
const transformedArrRec = arrrec.map((catalog) => ({ const transformedArrRec = arrrec.map((catalog) => ({
...catalog.toObject(), // Converte il documento Mongoose in un oggetto JavaScript puro ...catalog.toObject(), // Converte il documento Mongoose in un oggetto JavaScript puro
lista_prodotti: catalog.lista_prodotti.map((product) => ({ lista_prodotti: catalog.lista_prodotti.map((product) => ({

View File

@@ -529,6 +529,23 @@ module.exports.setImgNotFound = async function (id) {
} }
// 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 // 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) { module.exports.removeProductInfoWithoutDateUpdatedFromGM = async function (idapp) {
const ProductInfo = this; const ProductInfo = this;

View File

@@ -82,21 +82,18 @@ class CronMod {
mystr = await AmazonBookScraper.ScraperAzzeraFlagProducts(idapp, mydata.options); mystr = await AmazonBookScraper.ScraperAzzeraFlagProducts(idapp, mydata.options);
ris = { mystr }; ris = { mystr };
} else if (mydata.dbop === 'GeneraPdfCatalogo') { } else if (mydata.dbop === 'GeneraPdfCatalogo') {
const genPdf = new GenPdf(idapp); const genPdf = new GenPdf(idapp);
await genPdf.launch(); await genPdf.launch();
return await genPdf.generatePdfFromIdCatalog(mydata.options); return await genPdf.generatePdfFromIdCatalog(mydata.options);
} else if (mydata.dbop === 'GeneraPdfRaccolta') { } else if (mydata.dbop === 'GeneraPdfRaccolta') {
const genPdf = new GenPdf(idapp); const genPdf = new GenPdf(idapp);
await genPdf.launch(); await genPdf.launch();
return await genPdf.generatePdfFromIdRaccolta(mydata.options); return await genPdf.generatePdfFromIdRaccolta(mydata.options);
} else if (mydata.dbop === 'onlinePdfRaccolta') { } else if (mydata.dbop === 'onlinePdfRaccolta') {
const genPdf = new GenPdf(idapp); const genPdf = new GenPdf(idapp);
await genPdf.launch(); await genPdf.launch();
@@ -113,6 +110,9 @@ class CronMod {
} else if (mydata.dbop === 'removeProductInfoWithoutDateUpdatedFromGM') { } else if (mydata.dbop === 'removeProductInfoWithoutDateUpdatedFromGM') {
mystr = await ProductInfo.removeProductInfoWithoutDateUpdatedFromGM(idapp); mystr = await ProductInfo.removeProductInfoWithoutDateUpdatedFromGM(idapp);
ris = { mystr }; ris = { mystr };
} else if (mydata.dbop === 'resetImageNotFound') {
mystr = await ProductInfo.resetImageNotFound();
ris = { mystr };
} else if (mydata.dbop === 'StatMacro') { } else if (mydata.dbop === 'StatMacro') {
const macro = new Macro(idapp, {}); const macro = new Macro(idapp, {});
mystr = await macro.getStat(); mystr = await macro.getStat();

View File

@@ -414,12 +414,15 @@ class GenPdf {
} }
const raccolta = await RaccoltaCataloghi.findById(options.idRaccolta); const raccolta = await RaccoltaCataloghi.findById(options.idRaccolta);
if (raccolta) { if (raccolta) {
console.log('Pubblica ONLINE la Raccolta ' + raccolta.title + ' ...');
for (const catalogo of raccolta.lista_cataloghi) { for (const catalogo of raccolta.lista_cataloghi) {
await this.onlinePdfFromIdCatalog({ await this.onlinePdfFromIdCatalog({
...options, ...options,
id_catalog: catalogo._id, id_catalog: catalogo._id,
}); });
} }
console.log('FINE Pubblicazione ONLINE !');
} }
} catch (e) { } catch (e) {
console.error('err', e); console.error('err', e);
@@ -594,6 +597,9 @@ class GenPdf {
} }
const fileDest = mydir + (stampa ? myrec.pdf_online_stampa : myrec.pdf_online); const fileDest = mydir + (stampa ? myrec.pdf_online_stampa : myrec.pdf_online);
const fileDestNoDir = stampa ? myrec.pdf_online_stampa : myrec.pdf_online; const fileDestNoDir = stampa ? myrec.pdf_online_stampa : myrec.pdf_online;
console.log(' Metti online il file ' + fileOrigin);
// copia il file // copia il file
await fs.copyFile(fileOrigin, fileDest); await fs.copyFile(fileOrigin, fileDest);

View File

@@ -134,6 +134,8 @@ class Macro {
DescrizioneTipologia = 'Carte') DescrizioneTipologia = 'Carte')
AND AND
(Ean13 NOT LIKE 'USATO%') (Ean13 NOT LIKE 'USATO%')
ORDER BY T.IdArticolo DESC, Id DESC
`; `;
} }
} else { } else {

View File

@@ -635,6 +635,8 @@ async function JoinPDFCatalogs(cataloghi, options, outputFile, stampa) {
const pdfDoc = await PDFDocument.create(); const pdfDoc = await PDFDocument.create();
let numcat = 0;
for (let id_catalog of cataloghi) { for (let id_catalog of cataloghi) {
let catalog = await Catalog.findOne({ _id: id_catalog }); let catalog = await Catalog.findOne({ _id: id_catalog });
if (catalog) { if (catalog) {
@@ -642,6 +644,11 @@ async function JoinPDFCatalogs(cataloghi, options, outputFile, stampa) {
if (filename) { if (filename) {
let myfile = tools.fixFilePath(options.mydir + '/' + filename); let myfile = tools.fixFilePath(options.mydir + '/' + filename);
if (await tools.isFileExistsAsync(myfile)) { if (await tools.isFileExistsAsync(myfile)) {
const filenameOnly = path.parse(myfile).base;
numcat++;
console.log(' Aggiungo il catalogo [' + numcat + '] ' + filenameOnly + ' ...');
const pdfBytes = await fs.promises.readFile(myfile); const pdfBytes = await fs.promises.readFile(myfile);
const pdf = await PDFDocument.load(pdfBytes); const pdf = await PDFDocument.load(pdfBytes);
const pages = pdf.getPages(); const pages = pdf.getPages();

View File

@@ -6060,13 +6060,13 @@ module.exports = {
} }
if ( if (
aggiornatoimg?.code === 404 || aggiornatoimg?.code === 404 ||
(aggiornatoimg?.filepath && aggiornatoimg.filepath.includes('noimg.jpg')) (aggiornatoimg?.filepath && aggiornatoimg?.filepath?.includes('noimg.jpg'))
) { ) {
// non trovato quindi la prossima volta non richiederlo // non trovato quindi la prossima volta non richiederlo
await ProductInfo.setImgNotFound(productInfo._id); await ProductInfo.setImgNotFound(productInfo._id);
} }
if (aggiornatoimg?.filepath.includes('noimg.jpg')) { if (aggiornatoimg?.filepath?.includes('noimg.jpg')) {
// nascondi il prodotto se non trovo l'immagine ! // nascondi il prodotto se non trovo l'immagine !
await Product.updateOne({ idProductInfo: productInfo._id }, { $set: { deleted: true } }); await Product.updateOne({ idProductInfo: productInfo._id }, { $set: { deleted: true } });

View File

@@ -1 +1 @@
1.2.56 1.2.57