diff --git a/src/app.gateway.ts b/src/app.gateway.ts index c22d4f7..266fd7d 100644 --- a/src/app.gateway.ts +++ b/src/app.gateway.ts @@ -10,15 +10,15 @@ import { Socket, Server } from 'socket.io'; @WebSocketGateway({ cors: { origin: [ - 'http://localhost:3176', - 'http://localhost:3186', + // 'http://localhost:3176', + // 'http://localhost:3186', // 'http://132.248.80.196:3155', // 'http://132.248.80.196:3185', // 'https://pmodulospcpuma.unam.mx', // 'https://pmodulospcpuma.unam.mx:3015', - // 'https://modulospcpuma.unam.mx', - // 'https://modulospcpuma.unam.mx:3015', - // 'https://betelgeuse.acatlan.unam.mx:3180', + 'https://modulospcpuma.unam.mx', + 'https://modulospcpuma.unam.mx:3015', + 'https://betelgeuse.acatlan.unam.mx:3180', ], }, }) diff --git a/src/app.module.ts b/src/app.module.ts index 499bc8e..9d0c281 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -88,6 +88,7 @@ import { FullInformacionMultaView } from './multa/entity/views/full-informacion- import { InformacionMultaView } from './multa/entity/views/informacion-multa.view'; import { InformacionOperadorView } from './operador/entity/views/informacion-operador.view'; import { FullInformacionPrestamoView } from './prestamo/entity/views/full-informacion-prestamo.view'; +import { PrestamoInformacionView } from './prestamo/entity/views/prestamo-informacion.view'; import { InformacionPrestamoView } from './prestamo/entity/views/informacion-prestamo.view'; import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuario.view'; @@ -166,6 +167,7 @@ import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuar InformacionMultaView, InformacionOperadorView, FullInformacionPrestamoView, + PrestamoInformacionView, InformacionPrestamoView, InformacionUsuarioView, ], diff --git a/src/modulo/modulo.service.ts b/src/modulo/modulo.service.ts index 901cac9..1706d12 100644 --- a/src/modulo/modulo.service.ts +++ b/src/modulo/modulo.service.ts @@ -4,7 +4,7 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { FindOptionsWhere, Repository } from 'typeorm'; import { Institucion } from '../institucion/entity/institucion.entity'; import { Modulo } from './entity/modulo.entity'; import { InformacionModuloView } from './entity/views/informacion-modulo.view'; @@ -121,7 +121,7 @@ export class ModuloService { return this.institucionService .findInfoInstitucionById(id_institucion) .then((institucion) => { - const busqueda: { id_institucion: number; activo_modulo?: number } = { + const busqueda: FindOptionsWhere = { id_institucion: institucion.id_institucion, }; diff --git a/src/prestamo/entity/views/full-informacion-prestamo.view.ts b/src/prestamo/entity/views/full-informacion-prestamo.view.ts index 1dc4b71..4448cc7 100644 --- a/src/prestamo/entity/views/full-informacion-prestamo.view.ts +++ b/src/prestamo/entity/views/full-informacion-prestamo.view.ts @@ -2,7 +2,10 @@ import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; import { Carrito } from '../../../carrito/entity/carrito.entity'; import { Equipo } from '../../../equipo/entity/equipo.entity'; import { Institucion } from '../../../institucion/entity/institucion.entity'; +import { InstitucionCarrera } from '../../../institucion-carrera/entity/institucion-carrera.entity'; +import { InstitucionUsuario } from '../../../institucion-usuario/entity/institucion-usuario.entity'; import { Modulo } from '../../../modulo/entity/modulo.entity'; +import { Operador } from '../../../operador/entity/operador.entity'; import { Prestamo } from '../prestamo.entity'; import { TipoCarrito } from '../../../institucion-tipo-carrito/entity/tipo-carrito.entity'; import { Usuario } from '../../../usuario/entity/usuario.entity'; @@ -22,10 +25,13 @@ import { Usuario } from '../../../usuario/entity/usuario.entity'; .addSelect('p.hora_max_recoger', 'hora_max_recoger') .addSelect('p.id_equipo', 'id_equipo') .addSelect('p.id_usuario', 'id_usuario') + .addSelect('p.id_operador_entrega', 'id_operador_entrega') + .addSelect('p.id_operador_regreso', 'id_operador_regreso') .addSelect('e.equipo', 'equipo') .addSelect('e.id_carrito', 'id_carrito') - .addSelect('e.id_status', 'id_status') .addSelect('e.numero_inventario', 'numero_inventario') + .addSelect('oe.operador', 'operador_entrega') + .addSelect('or.operador', 'operador_regreso') .addSelect('u.id_tipo_usuario', 'id_tipo_usuario') .addSelect('u.nombre', 'nombre') .addSelect('u.usuario', 'usuario') @@ -38,11 +44,21 @@ import { Usuario } from '../../../usuario/entity/usuario.entity'; .addSelect('i.institucion', 'institucion') .from(Prestamo, 'p') .innerJoin(Equipo, 'e', 'e.id_equipo = p.id_equipo') + .innerJoin(Operador, 'oe', 'oe.id_operador = p.id_operador_regreso') + .innerJoin(Operador, 'or', 'or.id_operador = p.id_operador_entrega') .innerJoin(Usuario, 'u', 'u.id_usuario = p.id_usuario') .innerJoin(Carrito, 'c', 'c.id_carrito = e.id_carrito') + .innerJoin(InstitucionUsuario, 'iu', 'iu.id_usuario = u.id_usuario') + .innerJoin( + InstitucionCarrera, + 'ic', + 'ic.id_institucion_carrera = iu.id_institucion_carrera', + ) .innerJoin(Modulo, 'm', 'm.id_modulo = c.id_modulo') .innerJoin(TipoCarrito, 'tc', 'tc.id_tipo_carrito = c.id_tipo_carrito') - .innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion'), + .innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion') + .where('i.id_institucion = ic.id_institucion') + .orderBy('i.institucion'), }) export class FullInformacionPrestamoView { @ViewColumn() @@ -91,7 +107,10 @@ export class FullInformacionPrestamoView { id_modulo: number; @ViewColumn() - id_status: number; + id_operador_entrega: number; + + @ViewColumn() + id_operador_regreso: number; @ViewColumn() id_tipo_carrito: number; @@ -114,6 +133,12 @@ export class FullInformacionPrestamoView { @ViewColumn() numero_inventario: string; + @ViewColumn() + operador_entrega: string; + + @ViewColumn() + operador_regreso: string; + @ViewColumn() tipo_carrito: string; diff --git a/src/prestamo/entity/views/prestamo-informacion.view.ts b/src/prestamo/entity/views/prestamo-informacion.view.ts new file mode 100644 index 0000000..a9661b0 --- /dev/null +++ b/src/prestamo/entity/views/prestamo-informacion.view.ts @@ -0,0 +1,122 @@ +import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; +import { Carrito } from '../../../carrito/entity/carrito.entity'; +import { Equipo } from '../../../equipo/entity/equipo.entity'; +import { Institucion } from '../../../institucion/entity/institucion.entity'; +import { Modulo } from '../../../modulo/entity/modulo.entity'; +import { Prestamo } from '../prestamo.entity'; +import { TipoCarrito } from '../../../institucion-tipo-carrito/entity/tipo-carrito.entity'; +import { Usuario } from '../../../usuario/entity/usuario.entity'; + +@ViewEntity({ + expression: (dataSource: DataSource) => + dataSource + .createQueryBuilder() + .select('p.id_prestamo', 'id_prestamo') + .addSelect('p.activo', 'activo') + .addSelect('p.cancelado_operador', 'cancelado_operador') + .addSelect('p.cancelado_usuario', 'cancelado_usuario') + .addSelect('p.fecha_entrega', 'fecha_entrega') + .addSelect('p.fecha_inicio', 'fecha_inicio') + .addSelect('p.hora_fin', 'hora_fin') + .addSelect('p.hora_inicio', 'hora_inicio') + .addSelect('p.hora_max_recoger', 'hora_max_recoger') + .addSelect('p.id_equipo', 'id_equipo') + .addSelect('p.id_usuario', 'id_usuario') + .addSelect('e.equipo', 'equipo') + .addSelect('e.id_carrito', 'id_carrito') + .addSelect('e.id_status', 'id_status') + .addSelect('e.numero_inventario', 'numero_inventario') + .addSelect('u.id_tipo_usuario', 'id_tipo_usuario') + .addSelect('u.nombre', 'nombre') + .addSelect('u.usuario', 'usuario') + .addSelect('c.carrito', 'carrito') + .addSelect('c.id_modulo', 'id_modulo') + .addSelect('c.id_tipo_carrito', 'id_tipo_carrito') + .addSelect('m.id_institucion', 'id_institucion') + .addSelect('m.modulo', 'modulo') + .addSelect('tc.tipo_carrito', 'tipo_carrito') + .addSelect('i.institucion', 'institucion') + .from(Prestamo, 'p') + .innerJoin(Equipo, 'e', 'e.id_equipo = p.id_equipo') + .innerJoin(Usuario, 'u', 'u.id_usuario = p.id_usuario') + .innerJoin(Carrito, 'c', 'c.id_carrito = e.id_carrito') + .innerJoin(Modulo, 'm', 'm.id_modulo = c.id_modulo') + .innerJoin(TipoCarrito, 'tc', 'tc.id_tipo_carrito = c.id_tipo_carrito') + .innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion'), +}) +export class PrestamoInformacionView { + @ViewColumn() + id_prestamo: number; + + @ViewColumn() + activo: number; + + @ViewColumn() + cancelado_operador: number; + + @ViewColumn() + cancelado_usuario: number; + + @ViewColumn() + carrito: string; + + @ViewColumn() + equipo: string; + + @ViewColumn() + fecha_entrega: Date; + + @ViewColumn() + fecha_inicio: Date; + + @ViewColumn() + hora_fin: Date; + + @ViewColumn() + hora_inicio: Date; + + @ViewColumn() + hora_max_recoger: Date; + + @ViewColumn() + id_carrito: number; + + @ViewColumn() + id_equipo: number; + + @ViewColumn() + id_institucion: number; + + @ViewColumn() + id_modulo: number; + + @ViewColumn() + id_status: number; + + @ViewColumn() + id_tipo_carrito: number; + + @ViewColumn() + id_tipo_usuario: number; + + @ViewColumn() + id_usuario: number; + + @ViewColumn() + institucion: string; + + @ViewColumn() + modulo: string; + + @ViewColumn() + nombre: string; + + @ViewColumn() + numero_inventario: string; + + @ViewColumn() + tipo_carrito: string; + + @ViewColumn() + usuario: string; +} diff --git a/src/prestamo/prestamo.controller.ts b/src/prestamo/prestamo.controller.ts index afcf8ec..ef1180a 100644 --- a/src/prestamo/prestamo.controller.ts +++ b/src/prestamo/prestamo.controller.ts @@ -115,7 +115,8 @@ export class PrestamoController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); - return this.prestamoService.findAll(query); + // return this.prestamoService.findAll(query); + return this.prestamoService.findInfoPrestamoAll(query); } @Put('cancelar-operador') @@ -253,7 +254,8 @@ export class PrestamoController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarOperador(operador); - return this.prestamoService.findAll(query); + // return this.prestamoService.findAll(query); + return this.prestamoService.findInfoPrestamoAll(query); } @Serealize(PrestamosEquipoOutputDto) diff --git a/src/prestamo/prestamo.module.ts b/src/prestamo/prestamo.module.ts index c13b19b..2c7994f 100644 --- a/src/prestamo/prestamo.module.ts +++ b/src/prestamo/prestamo.module.ts @@ -6,6 +6,7 @@ import { PrestamoController } from './prestamo.controller'; import { PrestamoService } from './prestamo.service'; import { Prestamo } from './entity/prestamo.entity'; import { FullInformacionPrestamoView } from './entity/views/full-informacion-prestamo.view'; +import { PrestamoInformacionView } from './entity/views/prestamo-informacion.view'; import { InformacionPrestamoView } from './entity/views/informacion-prestamo.view'; import { EquipoModule } from '../equipo/equipo.module'; import { InstitucionModule } from '../institucion/institucion.module'; @@ -34,8 +35,9 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module' PassportModule.register({ defaultStrategy: 'jwt' }), TypeOrmModule.forFeature([ Prestamo, - FullInformacionPrestamoView, InformacionPrestamoView, + FullInformacionPrestamoView, + PrestamoInformacionView, ]), TipoUsuarioModule, UsuarioModule, diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index e94eb2e..db99605 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -9,7 +9,14 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { + FindManyOptions, + FindOptionsWhere, + LessThanOrEqual, + Like, + MoreThanOrEqual, + Repository, +} from 'typeorm'; import { AppGateway } from '../app.gateway'; import { Institucion } from '../institucion/entity/institucion.entity'; import { InstitucionUsuario } from '../institucion-usuario/entity/institucion-usuario.entity'; @@ -18,6 +25,7 @@ import { Operador } from '../operador/entity/operador.entity'; import { Prestamo } from './entity/prestamo.entity'; import { Usuario } from '../usuario/entity/usuario.entity'; import { FullInformacionPrestamoView } from './entity/views/full-informacion-prestamo.view'; +import { PrestamoInformacionView } from './entity/views/prestamo-informacion.view'; import { InformacionPrestamoView } from './entity/views/informacion-prestamo.view'; import { EquipoService } from '../equipo/equipo.service'; import { InstitucionService } from '../institucion/institucion.service'; @@ -35,10 +43,12 @@ import { UsuarioService } from '../usuario/usuario.service'; export class PrestamoService { constructor( @InjectRepository(Prestamo) private repository: Repository, - @InjectRepository(FullInformacionPrestamoView) - private fullInformacionPrestamoView: Repository, @InjectRepository(InformacionPrestamoView) private informacionPrestamoView: Repository, + @InjectRepository(FullInformacionPrestamoView) + private fullInformacionPrestamoView: Repository, + @InjectRepository(PrestamoInformacionView) + private prestamoInformacionView: Repository, private appGateway: AppGateway, private equipoService: EquipoService, private institucionService: InstitucionService, @@ -138,34 +148,34 @@ export class PrestamoService { ) : null; - // if (ahora.weekday() === 0) - // throw new ConflictException('No hay servicio los días domingo.'); - // this.validarInstitucionUsuario(usuario.instituciones, modulo); - // if (!institucionDia.activo) - // throw new ConflictException( - // 'El día de hoy no hay servicio de préstamo de equipos.', - // ); - // if (ahora < horaMin) - // throw new ConflictException( - // `El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`, - // ); - // if (ahora >= horaExtra) - // throw new ConflictException( - // `El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`, - // ); - // for (let i = 0; i < institucionDia.horasExcepcion.length; i++) { - // const horaFin = moment( - // `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`, - // ); - // const horaInicio = moment( - // `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`, - // ); + if (ahora.weekday() === 0) + throw new ConflictException('No hay servicio los días domingo.'); + this.validarInstitucionUsuario(usuario.instituciones, modulo); + if (!institucionDia.activo) + throw new ConflictException( + 'El día de hoy no hay servicio de préstamo de equipos.', + ); + if (ahora < horaMin) + throw new ConflictException( + `El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`, + ); + if (ahora >= horaExtra) + throw new ConflictException( + `El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`, + ); + for (let i = 0; i < institucionDia.horasExcepcion.length; i++) { + const horaFin = moment( + `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`, + ); + const horaInicio = moment( + `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`, + ); - // if (ahora > horaInicio && ahora < horaFin) - // throw new ConflictException( - // `Se suspendió temporalmente el servicio de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`, - // ); - // } + if (ahora > horaInicio && ahora < horaFin) + throw new ConflictException( + `Se suspendió temporalmente el servicio de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`, + ); + } return this.repository .findOne({ where: { activo: true, usuario } }) .then((existePrestamo) => { @@ -530,6 +540,149 @@ export class PrestamoService { }); } + async findInfoPrestamoAll(filtros: { + pagina?: string; + activo?: string | boolean; + cancelado_operador?: string; + cancelado_usuario?: string; + carrito?: string; + equipo?: string; + fechaFin?: string; + fechaInicio?: string; + id_institucion?: string; + id_modulo?: string; + id_operador_entrega?: string; + id_operador_regreso?: string; + id_prestamo?: string; + id_tipo_carrito?: string; + id_tipo_usuario?: string; + usuario?: string; + }) { + const institucion = filtros.id_institucion + ? await this.institucionService.findInfoInstitucionById( + parseInt(filtros.id_institucion), + ) + : null; + const modulo = filtros.id_modulo + ? await this.moduloService.findInfoModuloById(parseInt(filtros.id_modulo)) + : null; + const operadorEntrega = filtros.id_operador_entrega + ? await this.operadorService.findById( + parseInt(filtros.id_operador_entrega), + ) + : null; + const operadorRegreso = filtros.id_operador_regreso + ? await this.operadorService.findById( + parseInt(filtros.id_operador_regreso), + ) + : null; + const tipoCarrito = filtros.id_tipo_carrito + ? await this.institucionTipoCarritoService.findTipoCarritoById( + parseInt(filtros.id_tipo_carrito), + ) + : null; + const tipoUsuario = filtros.id_tipo_usuario + ? await this.tipoUsuarioService.findById( + parseInt(filtros.id_tipo_usuario), + ) + : null; + const options: FindManyOptions = { + order: { id_prestamo: 'DESC' }, + }; + const busqueda: FindOptionsWhere = {}; + + if (filtros.pagina) { + options.take = 25; + options.skip = (parseInt(filtros.pagina) - 1) * 25; + } + if (filtros.activo) { + if (typeof filtros.activo === 'boolean') + busqueda.activo = filtros.activo ? 1 : 0; + else busqueda.activo = filtros.activo === 'true' ? 1 : 0; + } + if (filtros.cancelado_operador) + busqueda.cancelado_operador = + filtros.cancelado_operador === 'true' ? 1 : 0; + if (filtros.cancelado_usuario) + busqueda.cancelado_usuario = filtros.cancelado_usuario === 'true' ? 1 : 0; + if (filtros.fechaInicio) + busqueda.fecha_inicio = MoreThanOrEqual(new Date(filtros.fechaInicio)); + if (filtros.fechaFin) + busqueda.fecha_inicio = LessThanOrEqual(new Date(filtros.fechaFin)); + if (filtros.id_prestamo) + busqueda.id_prestamo = parseInt(filtros.id_prestamo); + if (filtros.carrito) busqueda.carrito = Like(`%${filtros.carrito}%`); + if (filtros.equipo) busqueda.equipo = Like(`%${filtros.equipo}%`); + if (filtros.usuario) busqueda.usuario = Like(`%${filtros.usuario}%`); + if (institucion) busqueda.id_institucion = institucion.id_institucion; + if (modulo) busqueda.id_modulo = modulo.id_modulo; + if (tipoCarrito) busqueda.id_tipo_carrito = tipoCarrito.id_tipo_carrito; + if (tipoUsuario) busqueda.id_tipo_usuario = tipoUsuario.id_tipo_usuario; + if (operadorEntrega) + busqueda.id_operador_entrega = operadorEntrega.id_operador; + if (operadorRegreso) + busqueda.id_operador_regreso = operadorRegreso.id_operador; + options.where = busqueda; + return this.fullInformacionPrestamoView + .findAndCount(options) + .then((infoPrestamos) => { + const prestamos: Prestamo[] = []; + + for (let i = 0; i < infoPrestamos[0].length; i++) + prestamos.push( + this.repository.create({ + id_prestamo: infoPrestamos[0][i].id_prestamo, + activo: infoPrestamos[0][i].activo === 1, + cancelado_operador: infoPrestamos[0][i].cancelado_operador === 1, + cancelado_usuario: infoPrestamos[0][i].cancelado_usuario === 1, + fecha_entrega: infoPrestamos[0][i].fecha_entrega, + fecha_inicio: infoPrestamos[0][i].fecha_inicio, + hora_fin: infoPrestamos[0][i].hora_fin, + hora_inicio: infoPrestamos[0][i].hora_inicio, + hora_max_recoger: infoPrestamos[0][i].hora_max_recoger, + equipo: { + id_equipo: infoPrestamos[0][i].id_equipo, + equipo: infoPrestamos[0][i].equipo, + numero_inventario: infoPrestamos[0][i].numero_inventario, + carrito: { + id_carrito: infoPrestamos[0][i].id_carrito, + carrito: infoPrestamos[0][i].carrito, + modulo: { + id_modulo: infoPrestamos[0][i].id_modulo, + modulo: infoPrestamos[0][i].modulo, + institucion: { + id_institucion: infoPrestamos[0][i].id_institucion, + institucion: infoPrestamos[0][i].institucion, + }, + }, + tipoCarrito: { + id_tipo_carrito: infoPrestamos[0][i].id_tipo_carrito, + tipo_carrito: infoPrestamos[0][i].tipo_carrito, + }, + }, + }, + usuario: { + id_usuario: infoPrestamos[0][i].id_usuario, + nombre: infoPrestamos[0][i].nombre, + usuario: infoPrestamos[0][i].usuario, + tipoUsuario: { + id_tipo_usuario: infoPrestamos[0][i].id_tipo_usuario, + }, + }, + operadorEntrega: { + id_operador: infoPrestamos[0][i].id_operador_entrega, + operador: infoPrestamos[0][i].operador_entrega, + }, + operadorRegreso: { + id_operador: infoPrestamos[0][i].id_operador_regreso, + operador: infoPrestamos[0][i].operador_regreso, + }, + }), + ); + return [prestamos, infoPrestamos[1]]; + }); + } + findInfoPrestamoById(id_prestamo: number) { return this.informacionPrestamoView .findOne({ where: { id_prestamo } }) @@ -561,7 +714,7 @@ export class PrestamoService { } prestamoInfoById(id_prestamo: number) { - return this.fullInformacionPrestamoView + return this.prestamoInformacionView .findOne({ where: { id_prestamo } }) .then((infoPrestamo) => { if (!infoPrestamo) @@ -603,7 +756,7 @@ export class PrestamoService { } prestamoInfoByIdUsuario(id_usuario: number) { - return this.fullInformacionPrestamoView + return this.prestamoInformacionView .findOne({ where: { activo: 1, id_usuario } }) .then((infoPrestamo) => { if (!infoPrestamo) @@ -656,7 +809,7 @@ export class PrestamoService { ), ) .then((equipo) => - this.fullInformacionPrestamoView.findOne({ + this.prestamoInformacionView.findOne({ where: { activo: 1, id_equipo: equipo.id_equipo }, }), )