diff --git a/prova_generato-stampabile.pdf b/prova_generato-stampabile.pdf new file mode 100644 index 0000000..af484c7 Binary files /dev/null and b/prova_generato-stampabile.pdf differ diff --git a/src/server/models/catalog.js b/src/server/models/catalog.js index 23a8890..335c73b 100755 --- a/src/server/models/catalog.js +++ b/src/server/models/catalog.js @@ -251,6 +251,28 @@ CatalogSchema.statics.findAllIdApp = async function (idapp) { } }; +CatalogSchema.statics.executeQueryPickup = async function (idapp, params) { + const strfind = params.search; + + if (strfind === '') { + return []; + } + + // Cerca title + const reg = new RegExp(strfind, 'i'); + const arrrec = await this.find({ + idapp, + title: reg, + }) + .sort({ title: 1 }) + .limit(10) + .select('title _id') + .lean(); + + return arrrec; +}; + + const Catalog = mongoose.model('Catalog', CatalogSchema); Catalog.createIndexes() diff --git a/src/server/models/raccoltacataloghi.js b/src/server/models/raccoltacataloghi.js new file mode 100755 index 0000000..a2dd826 --- /dev/null +++ b/src/server/models/raccoltacataloghi.js @@ -0,0 +1,94 @@ +const mongoose = require('mongoose').set('debug', false); +const Schema = mongoose.Schema; + +const tools = require('../tools/general'); +const { ObjectId } = require('mongodb'); + +const { IImg } = require('../models/myscheda'); + +mongoose.Promise = global.Promise; +mongoose.level = 'F'; + +// Resolving error Unknown modifier: $pushAll +mongoose.plugin((schema) => { + schema.options.usePushEach = true; +}); + +const RaccoltaCataloghiSchema = new Schema({ + idapp: { + type: String, + }, + active: { + type: Boolean, + default: false, + }, + title: { + type: String, + index: true, + }, + foto_raccolta: IImg, + + idPageAssigned: { + type: String, + }, + idPageAssigned_stampa: { + type: String, + }, + + nomefile_da_generare: String, + + pdf_generato: String, + pdf_generato_stampa: String, + data_generato: { + type: Date, + }, + data_generato_stampa: { + type: Date, + }, + pdf_online: String, + data_online: { + type: Date, + }, + pdf_online_stampa: String, + data_online_stampa: { + type: Date, + }, + + lista_cataloghi: [ + { + type: Schema.Types.ObjectId, + ref: 'Catalog', + }, + ], +}); + +RaccoltaCataloghiSchema.statics.getFieldsForSearch = function () { + return [{ field: 'title', type: tools.FieldType.string }]; +}; + +RaccoltaCataloghiSchema.statics.executeQueryTable = function (idapp, params, user) { + params.fieldsearch = this.getFieldsForSearch(); + return tools.executeQueryTable(this, idapp, params, user); +}; + +RaccoltaCataloghiSchema.statics.findAllIdApp = async function (idapp) { + const RaccoltaCataloghi = this; + + try { + let arrrec = await RaccoltaCataloghi.find({ idapp }).sort({ title: 1 }).populate('lista_cataloghi').lean(); + + return arrrec; + } catch (err) { + console.error('Errore: ', err); + } +}; + +const RaccoltaCataloghi = mongoose.model('RaccoltaCataloghi', RaccoltaCataloghiSchema); + +RaccoltaCataloghi.createIndexes() + .then(() => {}) + .catch((err) => { + throw err; + }); + +module.exports = { RaccoltaCataloghi }; diff --git a/src/server/router/admin_router.js b/src/server/router/admin_router.js index 831cbd7..fdb9142 100755 --- a/src/server/router/admin_router.js +++ b/src/server/router/admin_router.js @@ -28,6 +28,7 @@ const Gasordine = require('../models/gasordine'); const { User } = require('../models/user'); const { Catalog } = require('../models/catalog'); +const { RaccoltaCataloghi } = require('../models/raccoltacataloghi'); const server_constants = require('../tools/server_constants'); @@ -420,41 +421,47 @@ router.post('/online-pdf', authenticate, async (req, res) => { idapp = req.body.idapp; id_catalog = req.body.id_catalog; + id_raccolta = req.body.id_raccolta; stampa = req.body.stampa; let mydir = ''; let risout = {}; try { + let myrec = null; // Aggiorna il PDF OnLine, copiando il file da Generato a OnLine - let catalog = await Catalog.findOne({ _id: id_catalog }); + if (id_catalog) { + myrec = await Catalog.findOne({ _id: id_catalog }); + } else if (id_raccolta) { + myrec = await RaccoltaCataloghi.findOne({ _id: id_raccolta }); + } - if (catalog) { + if (myrec) { mydir = tools.getdirByIdApp(idapp); // const baseurl = this.getHostByIdApp(idapp); if (stampa) { - catalog.pdf_online_stampa = catalog.pdf_generato_stampa.replace('_generato', ''); + myrec.pdf_online_stampa = myrec.pdf_generato_stampa.replace('_generato', ''); } else { - catalog.pdf_online = catalog.pdf_generato.replace('_generato', ''); + myrec.pdf_online = myrec.pdf_generato.replace('_generato', ''); } // Aggiorna il PDF OnLine, copiando il file da Generato a OnLine - const fileOrigin = mydir + (stampa ? catalog.pdf_generato_stampa : catalog.pdf_generato); - const fileDest = mydir + (stampa ? catalog.pdf_online_stampa : catalog.pdf_online); - const fileDestNoDir = (stampa ? catalog.pdf_online_stampa : catalog.pdf_online); + const fileOrigin = mydir + (stampa ? myrec.pdf_generato_stampa : myrec.pdf_generato); + const fileDest = mydir + (stampa ? myrec.pdf_online_stampa : myrec.pdf_online); + const fileDestNoDir = stampa ? myrec.pdf_online_stampa : myrec.pdf_online; // copia il file await fs.promises.copyFile(fileOrigin, fileDest); if (stampa) { - catalog.data_online_stampa = catalog.data_generato_stampa; + myrec.data_online_stampa = myrec.data_generato_stampa; } else { - catalog.data_online = catalog.data_generato; + myrec.data_online = myrec.data_generato; } // Aggiorna il record - await catalog.save(); + await myrec.save(); - risout = {catalog: catalog._doc}; + risout = { record: myrec._doc }; } // risout @@ -465,6 +472,114 @@ router.post('/online-pdf', authenticate, async (req, res) => { } }); +async function JoinPDFCatalogs(cataloghi, options, outputFile, stampa) { + try { + // Per ogni catalogo prendi il suo PDF Generato + + const pdfDoc = await PDFDocument.create(); + + for (let id_catalog of cataloghi) { + let catalog = await Catalog.findOne({ _id: id_catalog }); + if (catalog) { + let filename = stampa ? catalog.pdf_generato_stampa : catalog.pdf_generato; + if (filename) { + const pdfBytes = await fs.promises.readFile(options.mydir + filename); + const pdf = await PDFDocument.load(pdfBytes); + const pages = pdf.getPages(); + const copiedPages = await pdfDoc.copyPages( + pdf, + pages.map((p, i) => i) + ); + for (let page of copiedPages) { + pdfDoc.addPage(page); + } + } else { + console.log('ATTENZIONE! Catalogo non ancora Generato ! ', catalog.title); + } + } + } + + // Raccolta salvata ! + const pdfBytes = await pdfDoc.save(); + await fs.promises.writeFile(outputFile, pdfBytes); + // scrivi il percorso relativo e nomefile sul DB + + const outputFilename = path.basename(outputFile); + const outputPath = path.join(options.dir_out, outputFilename); + + const ris = { + outputPath, + }; + + return ris; + } catch (e) { + console.error('Error: ', e); + } + + return {}; +} + +router.post('/join-pdf', authenticate, async (req, res) => { + console.log('/join-pdf'); + + idapp = req.body.idapp; + options = req.body.options; + options.idapp = idapp; + options.mydir = tools.getdirByIdApp(idapp); + + try { + const full_dir_out = tools.getdirByIdApp(options.idapp) + '/' + options.dir_out; + await fs.promises.mkdir(full_dir_out, { recursive: true }); + + // Aggiorna il PDF OnLine, copiando il file da Generato a OnLine + let raccolta = await RaccoltaCataloghi.findOne({ _id: options.id_raccolta }); + + if (raccolta) { + cataloghi = raccolta.lista_cataloghi; + + let outputFile = path.join( + full_dir_out, + tools.removeFileExtension(raccolta.nomefile_da_generare) + '_generato.pdf' + ); + + if (options.stampa) { + outputFileStampa = path.join(full_dir_out, path.basename(tools.removeFileExtension(outputFile))) + '-stampabile.pdf'; + // Creazione file per STAMPA + const ris_stampa = await JoinPDFCatalogs(cataloghi, options, outputFileStampa, true); + if (ris_stampa) { + raccolta.pdf_generato_stampa = ris_stampa.outputPath; + } + } else { + // Creazione file per WEB + const ris = await JoinPDFCatalogs(cataloghi, options, outputFile, false); + if (ris) { + raccolta.pdf_generato = ris.outputPath; + } + } + + if (options.metti_online) { + if (options.stampa) { + raccolta.pdf_online_stampa = raccolta.pdf_generato_stampa.replace('_generato', ''); + } else { + raccolta.pdf_online = raccolta.pdf_generato.replace('_generato', ''); + } + const fileDest = options.mydir + raccolta.pdf_online; + await fs.promises.writeFile(fileDest, pdfBytes); + } + + raccolta.save(); + + risout = { raccolta: raccolta._doc }; + } + + // risout + + return res.status(200).send(risout); + } catch (e) { + console.error('Err join-pdf', e.message); + } +}); + // Endpoint POST per la conversione del PDF router.post('/convert-pdf', upload.single('pdf'), async (req, res) => { if (!req.file) { diff --git a/src/server/router/index_router.js b/src/server/router/index_router.js index 7a6c9bc..4c68e81 100755 --- a/src/server/router/index_router.js +++ b/src/server/router/index_router.js @@ -78,6 +78,7 @@ const Product = require('../models/product'); const Author = require('../models/author'); 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'); @@ -2030,6 +2031,7 @@ async function load(req, res, version = '0') { tipologie: version >= 91 ? T_WEB_Tipologie.findAllIdApp() : Promise.resolve([]), tipoformato: version >= 91 ? T_WEB_TipiFormato.findAllIdApp() : Promise.resolve([]), crons: version >= 91 ? Cron.findAllIdApp() : Promise.resolve([]), + raccoltacataloghis: version >= 91 ? RaccoltaCataloghi.findAllIdApp(idapp) : Promise.resolve([]), myuserextra: req.user ? User.addExtraInfo(idapp, req.user, version) : Promise.resolve(null) @@ -2147,6 +2149,7 @@ async function load(req, res, version = '0') { tipologie: data.tipologie, tipoformato: data.tipoformato, crons: data.crons, + raccoltacataloghis: data.raccoltacataloghis, }; } diff --git a/src/server/tools/globalTables.js b/src/server/tools/globalTables.js index cf00835..36bd266 100755 --- a/src/server/tools/globalTables.js +++ b/src/server/tools/globalTables.js @@ -24,6 +24,7 @@ const { PaymentType } = require('../models/paymenttype'); const { Discipline } = require('../models/discipline'); const { Skill } = require('../models/skill'); const { Catalog } = require('../models/catalog'); +const { RaccoltaCataloghi } = require('../models/raccoltacataloghi'); const { Good } = require('../models/good'); const { SubSkill } = require('../models/subskill'); const { MySkill } = require('../models/myskill'); @@ -233,6 +234,8 @@ module.exports = { mytable = Skill; else if (tablename === 'catalogs') mytable = Catalog; + else if (tablename === 'raccoltacataloghis') + mytable = RaccoltaCataloghi; else if (tablename === 'goods') mytable = Good; else if (tablename === 'subskills') diff --git a/src/server/tools/shared_nodejs.js b/src/server/tools/shared_nodejs.js index f416e58..54c35ac 100755 --- a/src/server/tools/shared_nodejs.js +++ b/src/server/tools/shared_nodejs.js @@ -163,6 +163,8 @@ module.exports = { TABLES_MYGROUPS: 'mygroups', TABLES_ATTIVITAS: 'attivitas', TABLES_CATALOG: 'catalogs', + TABLES_LISTA_EDITORI: 'lista_editori', + TABLES_RACCOLTACATALOGHIS: 'raccoltacataloghis', MYTABS: [{ id: 0, table: 'none' }, { id: 1, table: this.TABLES_MYSKILLS }, @@ -210,7 +212,7 @@ module.exports = { TABLES_GETCOMPLETEREC: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'attivitas'], //++Todo: per abilitare gli utenti ad inserire un Circuito aggiungere 'circuits' alla lista TABLES_PERM_NEWREC - TABLES_PERM_NEWREC: ['skills', 'goods', 'subskills', 'mygroups', 'myhosps', 'catalogs'], + TABLES_PERM_NEWREC: ['skills', 'goods', 'subskills', 'mygroups', 'myhosps', 'catalogs', 'raccoltacataloghis'], TABLES_REACTIONS: ['mybachecas', 'myhosps', 'myskills', 'mygoods', 'attivitas'], @@ -223,7 +225,7 @@ module.exports = { TABLES_GROUPS_NOTIFICATION: ['mygroups'], TABLES_CIRCUITS_NOTIFICATION: ['circuits'], - TABLES_ENABLE_GETTABLE_FOR_NOT_LOGGED: ['attivitas', 'catalogs'], + TABLES_ENABLE_GETTABLE_FOR_NOT_LOGGED: ['attivitas', 'catalogs', 'raccoltacataloghis'], TABLES_NUM_AS_ID_NUMBER: [],