diff --git a/src/server/controllers/articleController.js b/src/server/controllers/articleController.js index c63ade1..c10a86b 100644 --- a/src/server/controllers/articleController.js +++ b/src/server/controllers/articleController.js @@ -221,8 +221,8 @@ exports.getTableContentBase = async (options) => { ` + (options.campispeciali ? ` - ,f.DescrizioneStatoProdotto ,i.DescrizioneTipologia + ,f.DescrizioneStatoProdotto ,n.DescrizioneFormato ,y.DescrizioneCollana ,z.AutoriCompleti @@ -230,33 +230,51 @@ exports.getTableContentBase = async (options) => { ,z3.CasaEditrice` : ``) + (options.showQtaDisponibile ? ` ,q.QtaDisponibile ` : ``) + - ` FROM T_WEB_Articoli T - JOIN( + ` FROM T_WEB_Articoli T WITH (noLock) + RIGHT JOIN( SELECT IdArticolo, MAX(DataOra) AS data FROM T_WEB_Articoli GROUP BY IdArticolo ) b ON T.IdArticolo = b.IdArticolo AND T.DataOra = b.data ` + (options.campispeciali - ? ` LEFT JOIN( - SELECT e.IdStatoProdotto, e.Descrizione as DescrizioneStatoProdotto - FROM T_WEB_StatiProdotto e - JOIN( - SELECT IdStatoProdotto, 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 - LEFT JOIN( - SELECT g.IdTipologia, g.Descrizione as DescrizioneTipologia - FROM T_WEB_Tipologie g + ? ` + RIGHT JOIN + ( SELECT + e.IdStatoProdotto, + e.Descrizione as DescrizioneStatoProdotto + FROM + T_WEB_StatiProdotto e + JOIN + ( + SELECT + IdStatoProdotto, + 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( SELECT IdTipologia, MAX(DataOra) as data1 - FROM T_WEB_Tipologie + FROM + T_WEB_Tipologie GROUP BY IdTipologia ) h ON g.IdTipologia = h.IdTipologia AND g.DataOra = h.data1 - ) i ON T.IdTipologia = i.IdTipologia - LEFT JOIN( - SELECT l.IdTipoFormato, l.Descrizione as DescrizioneFormato + ) i ON + T.IdTipologia = i.IdTipologia + RIGHT JOIN( + SELECT l.IdTipoFormato, + l.Descrizione as DescrizioneFormato FROM T_WEB_TipiFormato l JOIN( SELECT IdTipoFormato, MAX(DataOra) as data1 @@ -264,16 +282,18 @@ exports.getTableContentBase = async (options) => { GROUP BY IdTipoFormato ) m ON l.IdTipoFormato = m.IdTipoFormato AND l.DataOra = m.data1 ) n ON T.IdTipoFormato = n.IdTipoFormato - LEFT JOIN( - SELECT v.IdCollana, v.Descrizione as DescrizioneCollana + RIGHT JOIN( + SELECT v.IdCollana, + v.Descrizione as DescrizioneCollana FROM T_WEB_Collane v INNER JOIN( - SELECT IdCollana, MAX(ID) as MaxID + SELECT IdCollana, + MAX(ID) as MaxID FROM T_WEB_Collane GROUP BY IdCollana ) x ON v.IdCollana = x.IdCollana AND v.ID = x.MaxID ) y ON T.IdCollana = y.IdCollana - LEFT JOIN( + RIGHT JOIN( SELECT g2.IdArgomento, g2.Descrizione as DescrArgomento FROM T_WEB_Argomenti g2 INNER JOIN( @@ -282,7 +302,30 @@ exports.getTableContentBase = async (options) => { GROUP BY IdArgomento ) h ON g2.IdArgomento = h.IdArgomento AND g2.DataOra = h.data12 ) 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 T1.IdArticolo, STUFF(( @@ -297,7 +340,7 @@ exports.getTableContentBase = async (options) => { JOIN( SELECT a.IdAutore, CONCAT(a.Nome, ' ', a.Cognome) AS AutoreCompleto FROM T_WEB_Autori a - JOIN( + RIGHT JOIN( SELECT IdAutore, MAX(DataOra) AS maxData FROM T_WEB_Autori GROUP BY IdAutore @@ -305,29 +348,11 @@ exports.getTableContentBase = async (options) => { ) A2 ON CA.AutoreID = A2.IdAutore FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS AutoriCompleti - FROM T_WEB_Articoli T1 - GROUP BY T1.IdArticolo, T1.ListaAutori - ) z ON T.IdArticolo = z.IdArticolo - LEFT 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 ` - : ``) + - (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` + FROM T_WEB_Articoli T1 + WHERE t1.DataOra = (select max(DataOra) AS DataOra from T_web_articoli As h WHERE h.IdArticolo = T1.IdArticolo) + + GROUP BY T1.IdArticolo, T1.ListaAutori ) z ON T.IdArticolo = z.IdArticolo +` : ``); } else { dataQuery += ` @@ -937,6 +962,7 @@ exports.mssqlmigrateTables = async (req) => { listaTabelle.push({ table: 'T_WOO_Ordini', usaDataOra: false }); listaTabelle.push({ table: 'T_WEB_Articoli', usaDataOra: true, fieldId: 'IdArticolo' }); } + if (options?.parte2 || options?.tutte) { listaTabelle.push({ table: 'T_WEB_Disponibile', usaDataOra: true, fieldId: 'Codice' }); listaTabelle.push({ table: 'T_WEB_Argomenti', usaDataOra: true, fieldId: 'IdArgomento' }); diff --git a/src/server/models/catalog.js b/src/server/models/catalog.js index fe1795a..96d0033 100755 --- a/src/server/models/catalog.js +++ b/src/server/models/catalog.js @@ -250,13 +250,14 @@ CatalogSchema.statics.getCatalogById = async function (id) { product.idProductInfo.code && product.idProductInfo.code !== '' && product.idProductInfo.imagefile && - //product.idProductInfo.imagefile !== 'noimg.jpg' && + product.idProductInfo.imagefile !== 'noimg.jpg' && !product.delete ); if (catalog.lista_prodotti.length !== originalLength) { await catalog.save(); } } + const transformedArrRec = arrrec.map((catalog) => ({ ...catalog.toObject(), // Converte il documento Mongoose in un oggetto JavaScript puro diff --git a/src/server/models/productInfo.js b/src/server/models/productInfo.js index 5431d40..fd4cc78 100755 --- a/src/server/models/productInfo.js +++ b/src/server/models/productInfo.js @@ -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 module.exports.removeProductInfoWithoutDateUpdatedFromGM = async function (idapp) { const ProductInfo = this; diff --git a/src/server/modules/CronMod.js b/src/server/modules/CronMod.js index cfbf944..c1bdd43 100644 --- a/src/server/modules/CronMod.js +++ b/src/server/modules/CronMod.js @@ -82,27 +82,24 @@ class CronMod { mystr = await AmazonBookScraper.ScraperAzzeraFlagProducts(idapp, mydata.options); ris = { mystr }; } else if (mydata.dbop === 'GeneraPdfCatalogo') { - const genPdf = new GenPdf(idapp); await genPdf.launch(); - + return await genPdf.generatePdfFromIdCatalog(mydata.options); } else if (mydata.dbop === 'GeneraPdfRaccolta') { - const genPdf = new GenPdf(idapp); await genPdf.launch(); - + return await genPdf.generatePdfFromIdRaccolta(mydata.options); } else if (mydata.dbop === 'onlinePdfRaccolta') { - const genPdf = new GenPdf(idapp); await genPdf.launch(); mydata.options.idapp = idapp; - + return await genPdf.onlinePdfFromIdRaccolta(mydata.options); } else if (mydata.dbop === 'ReplaceAllCircuits') { // ++ Replace All Circuitname with 'Circuito RIS %s' @@ -113,6 +110,9 @@ class CronMod { } else if (mydata.dbop === 'removeProductInfoWithoutDateUpdatedFromGM') { mystr = await ProductInfo.removeProductInfoWithoutDateUpdatedFromGM(idapp); ris = { mystr }; + } else if (mydata.dbop === 'resetImageNotFound') { + mystr = await ProductInfo.resetImageNotFound(); + ris = { mystr }; } else if (mydata.dbop === 'StatMacro') { const macro = new Macro(idapp, {}); mystr = await macro.getStat(); diff --git a/src/server/modules/GenPdf.js b/src/server/modules/GenPdf.js index c3fa52e..f83488d 100644 --- a/src/server/modules/GenPdf.js +++ b/src/server/modules/GenPdf.js @@ -414,12 +414,15 @@ class GenPdf { } const raccolta = await RaccoltaCataloghi.findById(options.idRaccolta); if (raccolta) { + console.log('Pubblica ONLINE la Raccolta ' + raccolta.title + ' ...'); for (const catalogo of raccolta.lista_cataloghi) { await this.onlinePdfFromIdCatalog({ ...options, id_catalog: catalogo._id, }); } + + console.log('FINE Pubblicazione ONLINE !'); } } catch (e) { console.error('err', e); @@ -594,6 +597,9 @@ class GenPdf { } const fileDest = mydir + (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 await fs.copyFile(fileOrigin, fileDest); diff --git a/src/server/modules/Macro.js b/src/server/modules/Macro.js index 6d56245..b4a43ae 100644 --- a/src/server/modules/Macro.js +++ b/src/server/modules/Macro.js @@ -134,6 +134,8 @@ class Macro { DescrizioneTipologia = 'Carte') AND (Ean13 NOT LIKE 'USATO%') + + ORDER BY T.IdArticolo DESC, Id DESC `; } } else { diff --git a/src/server/router/admin_router.js b/src/server/router/admin_router.js index b9422d6..ee9f596 100755 --- a/src/server/router/admin_router.js +++ b/src/server/router/admin_router.js @@ -635,6 +635,8 @@ async function JoinPDFCatalogs(cataloghi, options, outputFile, stampa) { const pdfDoc = await PDFDocument.create(); + let numcat = 0; + for (let id_catalog of cataloghi) { let catalog = await Catalog.findOne({ _id: id_catalog }); if (catalog) { @@ -642,6 +644,11 @@ async function JoinPDFCatalogs(cataloghi, options, outputFile, stampa) { if (filename) { let myfile = tools.fixFilePath(options.mydir + '/' + filename); 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 pdf = await PDFDocument.load(pdfBytes); const pages = pdf.getPages(); diff --git a/src/server/tools/general.js b/src/server/tools/general.js index 5fc7716..ab3b1e4 100755 --- a/src/server/tools/general.js +++ b/src/server/tools/general.js @@ -6060,13 +6060,13 @@ module.exports = { } if ( 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 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 ! await Product.updateOne({ idProductInfo: productInfo._id }, { $set: { deleted: true } }); diff --git a/src/server/version.txt b/src/server/version.txt index 7b330ae..7664e79 100644 --- a/src/server/version.txt +++ b/src/server/version.txt @@ -1 +1 @@ -1.2.56 \ No newline at end of file +1.2.57 \ No newline at end of file