From 815c60628cfafb88b819c5b1e1e8c12f6b769ee4 Mon Sep 17 00:00:00 2001 From: Fabio-Ramirez Date: Thu, 18 Jul 2024 08:26:43 -0300 Subject: [PATCH] =?UTF-8?q?AM=20-=20Renovaci=C3=B3n=20de=20matricula=20Fot?= =?UTF-8?q?o=20y=20Firma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/tm/controller/profesional.ts | 141 ++++++++++++++++-- core/tm/routes/profesional.ts | 95 +++++++----- core/tm/schemas/firmaAdminRenovacionOnline.ts | 13 ++ core/tm/schemas/firmaRenovacionOnline.ts | 12 ++ core/tm/schemas/imagenRenovacionOnline.ts | 12 ++ 5 files changed, 229 insertions(+), 44 deletions(-) create mode 100644 core/tm/schemas/firmaAdminRenovacionOnline.ts create mode 100644 core/tm/schemas/firmaRenovacionOnline.ts create mode 100644 core/tm/schemas/imagenRenovacionOnline.ts diff --git a/core/tm/controller/profesional.ts b/core/tm/controller/profesional.ts index d7773febc2..50a04e2e22 100644 --- a/core/tm/controller/profesional.ts +++ b/core/tm/controller/profesional.ts @@ -5,8 +5,12 @@ import * as stream from 'stream'; import { userScheduler } from '../../../config.private'; import * as turno from '../../../modules/matriculaciones/schemas/turno'; import { turnoSolicitado } from '../../../modules/matriculaciones/schemas/turnoSolicitado'; +import { makeFs } from '../schemas/imagenes'; import { makeFsFirmaAdmin } from '../schemas/firmaAdmin'; import { makeFsFirma } from '../schemas/firmaProf'; +import { makeFsFirmaOnline } from '../schemas/firmaRenovacionOnline'; +import { makeFsFirmaAdminOnline } from '../schemas/firmaAdminRenovacionOnline'; +import { makeFsImagenOnline } from '../schemas/imagenRenovacionOnline'; import { Profesional } from '../schemas/profesional'; import { Auth } from './../../../auth/auth.class'; import { findUsersByUsername } from './../../../auth/auth.controller'; @@ -192,23 +196,49 @@ export async function saveFirma(data, admin = false) { const input = new stream.PassThrough(); let firma; let metadataFind; + let metadataFindOnline; let metadataWrite; - if (admin) { - firma = makeFsFirmaAdmin(); - metadataFind = { 'metadata.idSupervisor': data.idSupervisor }; - metadataWrite = { - idSupervisor: data.idSupervisor, - administracion: data.nombreCompleto - }; + if (data.option === 'renovacionOnline') { + if (admin) { + firma = makeFsFirmaAdminOnline(); + metadataFind = { + 'metadata.idProfesional': data.idProfesional, + 'metadata.matricula': data.matricula + }; + metadataWrite = { + idProfesional: data.idProfesional, + matricula: data.matricula + }; + } else { + firma = makeFsFirmaOnline(); + + metadataFind = { + 'metadata.idProfesional': data.idProfesional, + 'metadata.matricula': data.matricula + }; + metadataWrite = { + idProfesional: data.idProfesional, + matricula: data.matricula + }; + } } else { - firma = makeFsFirma(); + + metadataFindOnline = { + 'metadata.idProfesional': data.idProfesional, + 'metadata.matricula': data.matricula + }; metadataFind = { 'metadata.idProfesional': data.idProfesional }; metadataWrite = { idProfesional: data.idProfesional }; + if (admin) { + firma = makeFsFirmaAdmin(); + } else { + firma = makeFsFirma(); + } } - // Remueve la firma anterior antes de insertar la nueva const fileFirma = await firma.findOne(metadataFind); + if (fileFirma?._id) { await firma.unlink(fileFirma._id, (error) => { }); } @@ -231,6 +261,99 @@ export async function saveFirma(data, admin = false) { }); } +export async function deleteFirmaFotoTemporal(idProfesional, matricula, next) { + + const metadataFind = { + 'metadata.idProfesional': idProfesional, + 'metadata.matricula': matricula + }; + + try { + const firma = makeFsFirmaOnline(); + + // Remueve la firma anterior antes de insertar la nueva + const fileFirma = await firma.findOne(metadataFind); + if (fileFirma?._id) { + await new Promise((resolve, reject) => { + firma.unlink(fileFirma._id, (error) => { + if (error) { + return reject(error); + } + resolve(); + }); + }); + } + + const imagen = makeFsImagenOnline(); + // Remueve la imagen anterior antes de insertar la nueva + const fileImagen = await imagen.findOne(metadataFind); + if (fileImagen?._id) { + await new Promise((resolve, reject) => { + imagen.unlink(fileImagen._id, (error) => { + if (error) { + return reject(error); + } + resolve(); + }); + }); + } + } catch (error) { + return next(error); + } + +} + +export async function saveImage(data) { + + const _base64 = data.img; + const decoder = base64.decode(); + const input = new stream.PassThrough(); + let fotoProf; + let metadataFind; + let metadataFindOnline; + let metadataWrite; + + if (data.option === 'renovacionOnline') { + fotoProf = makeFsImagenOnline(); + + metadataFind = { + 'metadata.idProfesional': data.idProfesional, + 'metadata.matricula': data.matricula + }; + metadataWrite = { + idProfesional: data.idProfesional, + matricula: data.matricula + }; + } else { + metadataFind = { 'metadata.idProfesional': data.idProfesional }; + metadataWrite = { idProfesional: data.idProfesional }; + fotoProf = makeFs(); + } + + const file = await fotoProf.findOne(metadataFind); + + if (file?._id) { + await fotoProf.unlink(file._id, (error) => { }); + } + // Inserta en la bd en files y chunks + return new Promise((resolve, reject) => { + fotoProf.writeFile( + { + filename: 'foto.png', + contentType: 'image/png', + metadata: metadataWrite + }, input.pipe(decoder), + (error, createdFile) => { + if (error) { + reject(error); + } + resolve(createdFile); + } + ); + input.end(_base64); + }); +} + export async function filtrarProfesionalesPorPrestacion(profesionales, prestaciones, organizacionId) { const usuarios = await findUsersByUsername(profesionales.map(p => p.documento)); diff --git a/core/tm/routes/profesional.ts b/core/tm/routes/profesional.ts index efecb71feb..8ab83d99b5 100644 --- a/core/tm/routes/profesional.ts +++ b/core/tm/routes/profesional.ts @@ -4,16 +4,17 @@ import { log } from '@andes/log'; import * as express from 'express'; import * as fs from 'fs'; import { Types } from 'mongoose'; -import * as stream from 'stream'; import { Auth } from '../../../auth/auth.class'; import { findUser, updateEmailUser } from '../../../auth/auth.controller'; import { PacienteApp } from '../../../modules/mobileApp/schemas/pacienteApp'; import { sendSms } from '../../../utils/roboSender/sendSms'; import { makePattern, toArray } from '../../../utils/utils'; import { streamToBase64 } from '../controller/file-storage'; -import { formacionCero, matriculaCero, migrarTurnos, saveFirma, filtrarProfesionalesPorPrestacion } from '../controller/profesional'; +import { formacionCero, matriculaCero, migrarTurnos, saveFirma, filtrarProfesionalesPorPrestacion, saveImage, deleteFirmaFotoTemporal } from '../controller/profesional'; import { makeFsFirmaAdmin } from '../schemas/firmaAdmin'; import { makeFsFirma } from '../schemas/firmaProf'; +import { makeFsFirmaOnline } from '../schemas/firmaRenovacionOnline'; +import { makeFsImagenOnline } from '../schemas/imagenRenovacionOnline'; import { makeFs } from '../schemas/imagenes'; import { Organizacion } from '../schemas/organizacion'; import { Profesional } from '../schemas/profesional'; @@ -247,26 +248,59 @@ router.get('/profesionales/foto/:id*?', Auth.authenticate(), async (req: any, re const img = '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'; try { - const fotoProf = makeFs(); - const file = await fotoProf.findOne({ 'metadata.idProfesional': id }); - if (file) { - const readStream = await fotoProf.readFile({ _id: file._id }); - const _img = await streamToBase64(readStream); - return res.json(_img); + if (req.query.id) { + const idProf = req.query.id; + let fotoProf; + let metadataFind; + + if (req.query.matricula) { + const matricula = parseInt(req.query.matricula, 10); + fotoProf = makeFsImagenOnline(); + metadataFind = { + 'metadata.idProfesional': idProf, + 'metadata.matricula': matricula + }; + } else { + fotoProf = makeFs(); + metadataFind = { + 'metadata.idProfesional': idProf + }; + } + + const file = await fotoProf.findOne(metadataFind); + if (file) { + const readStream = await fotoProf.readFile({ _id: file._id }); + const _img = await streamToBase64(readStream); + return res.json(_img); + } + return res.json(img); } - return res.json(img); + } catch (ex) { return next(ex); } - }); router.get('/profesionales/firma', Auth.authenticate(), async (req: any, res, next) => { - try { if (req.query.id) { const id = req.query.id; - const fotoProf = makeFsFirma(); - const file = await fotoProf.findOne({ 'metadata.idProfesional': id }); + let fotoProf; + let metadataFind; + + if (req.query.matricula) { + const matricula = parseInt(req.query.matricula, 10); + fotoProf = makeFsFirmaOnline(); + metadataFind = { + 'metadata.idProfesional': id, + 'metadata.matricula': matricula + }; + } else { + fotoProf = makeFsFirma(); + metadataFind = { + 'metadata.idProfesional': id + }; + } + const file = await fotoProf.findOne(metadataFind); if (file) { const readStream = await fotoProf.readFile({ _id: file._id }); const firma = await streamToBase64(readStream); @@ -876,28 +910,8 @@ router.patch('/profesionales/update/:id?', Auth.authenticate(), async (req, res, try { if (req.body.imagen) { - const _base64 = req.body.imagen.img; - const decoder = _base64.decode(); - const input = new stream.PassThrough(); - const fotoProf = makeFs(); - // remove la foto vieja antes de insertar la nueva - const file = await fotoProf.findOne({ - 'metadata.idProfesional': req.body.imagen.idProfesional - }); - if (file?._id) { - await fotoProf.unlink(file._id, (error) => { }); - } - // inserta en la bd en files y chucks - fotoProf.writeFile({ - filename: 'foto.png', - contentType: 'image/png', - metadata: { - idProfesional: req.body.imagen.idProfesional, - } - }, input.pipe(decoder), (error, createdFile) => { - res.json(createdFile); - }); - input.end(_base64); + const response = await saveImage(req.body.imagen); + res.json(response); } if (req.body.firma) { const response = await saveFirma(req.body.firma); @@ -1113,6 +1127,17 @@ router.patch('/profesionales/:id?', Auth.authenticate(), async (req, res, next) if (req.body.foto) { resultado.foto = req.body.foto; } + if (req.body.matricula) { + + if (req.body.firmaP) { + await saveFirma(req.body); + } + if (req.body.img) { + await saveImage(req.body); + } + await deleteFirmaFotoTemporal(req.params.id, req.body.matricula, next); + + } } for (const key in req.body) { resultado[key] = req.body[key]; diff --git a/core/tm/schemas/firmaAdminRenovacionOnline.ts b/core/tm/schemas/firmaAdminRenovacionOnline.ts new file mode 100644 index 0000000000..5b1fc4a124 --- /dev/null +++ b/core/tm/schemas/firmaAdminRenovacionOnline.ts @@ -0,0 +1,13 @@ + +import * as mongoose from 'mongoose'; +const { createBucket } = require('mongoose-gridfs'); + +export function makeFsFirmaAdminOnline() { + const ProfesionalesFirmaAdminRenovacionOnlineSchema = createBucket({ + bucketName: 'ProfesionalesAdminFirmaRenovacionOnline', + collectionName: 'ProfesionalesAdminFirmaRenovacionOnline', + mongooseConnection: mongoose.connection + }); + // obtain a model + return ProfesionalesFirmaAdminRenovacionOnlineSchema; +} diff --git a/core/tm/schemas/firmaRenovacionOnline.ts b/core/tm/schemas/firmaRenovacionOnline.ts new file mode 100644 index 0000000000..40a65b4124 --- /dev/null +++ b/core/tm/schemas/firmaRenovacionOnline.ts @@ -0,0 +1,12 @@ + +import * as mongoose from 'mongoose'; +const { createBucket } = require('mongoose-gridfs'); + +export function makeFsFirmaOnline() { + const ProfesionalesFirmaRenovacionOnlineSchema = createBucket({ + bucketName: 'ProfesionalesFirmaRenovacionOnline', + collectionName: 'ProfesionalesFirmaRenovacionOnline', + mongooseConnection: mongoose.connection + }); + return ProfesionalesFirmaRenovacionOnlineSchema; +} diff --git a/core/tm/schemas/imagenRenovacionOnline.ts b/core/tm/schemas/imagenRenovacionOnline.ts new file mode 100644 index 0000000000..f7be61515b --- /dev/null +++ b/core/tm/schemas/imagenRenovacionOnline.ts @@ -0,0 +1,12 @@ + +import * as mongoose from 'mongoose'; +const { createBucket } = require('mongoose-gridfs'); + +export function makeFsImagenOnline() { + const ProfesionalesImagenRenovacionOnlineSchema = createBucket({ + bucketName: 'ProfesionalesImagenRenovacionOnline', + collectionName: 'ProfesionalesImagenRenovacionOnline', + mongooseConnection: mongoose.connection + }); + return ProfesionalesImagenRenovacionOnlineSchema; +}