diff --git a/src/app.module.ts b/src/app.module.ts index 2b93981..9cb6373 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -71,6 +71,8 @@ import { TipoEntrada } from './institucion-tipo-entrada/entity/tipo-entrada.enti import { TipoUsuario } from './tipo-usuario/entity/tipo-usuario.entity'; import { Usuario } from './usuario/entity/usuario.entity'; +import { InformacionCarritoView } from './carrito/entity/views/informacion-carrito.view'; +import { MinInformacionCarritoView } from './carrito/entity/views/min-informacion-carrito.view'; import { FullInformacionEquipoView } from './equipo/entity/views/full-informacion-equipo.view'; import { InformacionEquipoView } from './equipo/entity/views/informacion-equipo.view'; import { InformacionEquipoProgramaView } from './equipo-programa/entity/views/informacion-equipo-programa.view'; @@ -144,6 +146,8 @@ import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuar TipoEntrada, TipoUsuario, Usuario, + InformacionCarritoView, + MinInformacionCarritoView, FullInformacionEquipoView, InformacionEquipoView, InformacionEquipoProgramaView, diff --git a/src/carrito/carrito.controller.ts b/src/carrito/carrito.controller.ts index 0a540f1..c698720 100644 --- a/src/carrito/carrito.controller.ts +++ b/src/carrito/carrito.controller.ts @@ -53,7 +53,7 @@ export class CarritoController { this.validarUsuarioService.validarAdminOperador(operador); return this.carritoService - .findById(parseInt(query.id_carrito)) + .findFullInfoCarritoById(parseInt(query.id_carrito)) .then((carrito) => { if ( operador.tipoUsuario.id_tipo_usuario > 2 && @@ -126,7 +126,7 @@ export class CarritoController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); - return this.carritoService.findAll(operador, query); + return this.carritoService.findMinInfoCarritoAll(query); } @Post() @@ -139,7 +139,7 @@ export class CarritoController { description: 'Todas las variables son obligatorias.', examples: { ejemplo: { - value: { id_modulo: 1, id_tipo_carrito: 1, marca: '', modelo: '' }, + value: { id_modulo: 1, id_tipo_carrito: 1, id_marca: 1, id_modelo: 1 }, }, }, }) @@ -169,7 +169,8 @@ export class CarritoController { ejemplo: { value: { id_carrito: 1, - _activo: true, + activo: true, + motivo: '', }, }, }, diff --git a/src/carrito/carrito.module.ts b/src/carrito/carrito.module.ts index c2431c4..32ebfd8 100644 --- a/src/carrito/carrito.module.ts +++ b/src/carrito/carrito.module.ts @@ -4,6 +4,8 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { CarritoController } from './carrito.controller'; import { CarritoService } from './carrito.service'; import { Carrito } from './entity/carrito.entity'; +import { InformacionCarritoView } from './entity/views/informacion-carrito.view'; +import { MinInformacionCarritoView } from './entity/views/min-informacion-carrito.view'; import { CarritoMotivoModule } from '../carrito-motivo/carrito-motivo.module'; import { InstitucionModule } from '../institucion/institucion.module'; import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module'; @@ -21,7 +23,11 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module' ModeloModule, ModuloModule, PassportModule.register({ defaultStrategy: 'jwt' }), - TypeOrmModule.forFeature([Carrito]), + TypeOrmModule.forFeature([ + Carrito, + InformacionCarritoView, + MinInformacionCarritoView, + ]), ValidarUsuarioModule, ], controllers: [CarritoController], diff --git a/src/carrito/carrito.service.ts b/src/carrito/carrito.service.ts index 024c3b4..79825f1 100644 --- a/src/carrito/carrito.service.ts +++ b/src/carrito/carrito.service.ts @@ -7,8 +7,10 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { FindOperator, Like, Repository } from 'typeorm'; import { Carrito } from './entity/carrito.entity'; +import { InformacionCarritoView } from './entity/views/informacion-carrito.view'; +import { MinInformacionCarritoView } from './entity/views/min-informacion-carrito.view'; import { Modulo } from '../modulo/entity/modulo.entity'; import { Operador } from '../operador/entity/operador.entity'; import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; @@ -23,6 +25,10 @@ import { ModuloService } from '../modulo/modulo.service'; export class CarritoService { constructor( @InjectRepository(Carrito) private repository: Repository, + @InjectRepository(InformacionCarritoView) + private informacionCarritoView: Repository, + @InjectRepository(MinInformacionCarritoView) + private minInformacionCarritoView: Repository, @Inject(forwardRef(() => CarritoMotivoService)) private caritoMotivoService: CarritoMotivoService, private institucionService: InstitucionService, @@ -39,7 +45,7 @@ export class CarritoService { id_marca: number, id_modelo: number, ) { - const modulo = await this.moduloService.findById(id_modulo); + const modulo = await this.moduloService.findInfoModuloById(id_modulo); const tipoCarrito = await this.institucionTipoCarritoService.findTipoCarritoById( id_tipo_carrito, @@ -51,8 +57,13 @@ export class CarritoService { throw new ForbiddenException( 'No puedes crear un carrito para este módulo porque no pertenece a tu institución.', ); - return this.repository - .count({ where: { modulo, tipoCarrito } }) + return this.informacionCarritoView + .count({ + where: { + id_modulo: modulo.id_modulo, + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }, + }) .then((carritos) => this.repository.save( this.repository.create({ @@ -69,87 +80,6 @@ export class CarritoService { })); } - async findAll( - operador: Operador, - filtros: { - pagina: string; - activo?: string; - carrito?: string; - id_institucion?: string; - id_marca?: string; - id_modelo?: string; - id_modulo?: string; - id_tipo_carrito?: string; - }, - ) { - const institucion = filtros.id_institucion - ? await this.institucionService.findById(parseInt(filtros.id_institucion)) - : null; - const marca = filtros.id_marca - ? await this.marcaService.findById(parseInt(filtros.id_marca), 'c') - : null; - const modelo = filtros.id_modelo - ? await this.modeloService.findById(parseInt(filtros.id_modelo), 'c') - : null; - const modulo = filtros.id_modulo - ? await this.moduloService.findById(parseInt(filtros.id_modulo)) - : null; - const tipoCarrito = filtros.id_tipo_carrito - ? await this.institucionTipoCarritoService.findTipoCarritoById( - parseInt(filtros.id_tipo_carrito), - ) - : null; - const query = this.repository - .createQueryBuilder('c') - .innerJoinAndSelect('c.marca', 'ma') - .innerJoinAndSelect('c.modelo', 'mo') - .innerJoinAndSelect('c.modulo', 'm') - .innerJoinAndSelect('c.tipoCarrito', 'tc') - .innerJoinAndSelect('m.institucion', 'i') - .orderBy('i.institucion') - .addOrderBy('m.modulo') - .addOrderBy('tc.tipo_carrito') - .addOrderBy('c.carrito') - .skip((parseInt(filtros.pagina) - 1) * 25) - .take(25); - - if (modulo) { - if ( - operador.tipoUsuario.id_tipo_usuario > 2 && - operador.institucion.id_institucion != modulo.institucion.id_institucion - ) - throw new ForbiddenException( - 'No puedes acceder a esta información porque este módulo no pertenece a tu institución.', - ); - query.andWhere('m.id_modulo = :id_modulo', { - id_modulo: modulo.id_modulo, - }); - } - if (filtros.activo === 'true') query.andWhere('c.activo = 1'); - if (filtros.activo === 'false') query.andWhere('c.activo = 0'); - if (filtros.carrito) - query.andWhere('c.carrito LIKE :carrito', { - carrito: `%${filtros.carrito}%`, - }); - if (institucion) - query.andWhere('i.id_institucion = :id_institucion', { - id_institucion: institucion.id_institucion, - }); - if (marca) - query.andWhere('ma.id_marca = :id_marca', { - id_marca: marca.id_marca, - }); - if (modelo) - query.andWhere('mo.id_modelo = :id_modelo', { - id_modelo: modelo.id_modelo, - }); - if (tipoCarrito) - query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', { - id_tipo_carrito: tipoCarrito.id_tipo_carrito, - }); - return query.getManyAndCount(); - } - findById(id_carrito: number) { return this.repository .findOne({ where: { id_carrito } }) @@ -167,7 +97,7 @@ export class CarritoService { ) { const modulo = typeof id_modulo === 'number' - ? await this.moduloService.findById(id_modulo) + ? await this.moduloService.findInfoModuloById(id_modulo) : id_modulo; const tipoCarrito = typeof id_tipo_carrito === 'number' @@ -185,8 +115,149 @@ export class CarritoService { }); } + findInfoCarritoById(id_carrito: number) { + return this.informacionCarritoView + .findOne({ where: { id_carrito } }) + .then((infoCarrito) => { + if (!infoCarrito) + throw new NotFoundException('No existe este id carrito.'); + return this.repository.create({ + id_carrito: infoCarrito.id_carrito, + tipoCarrito: { + id_tipo_carrito: infoCarrito.id_tipo_carrito, + }, + modulo: { + id_modulo: infoCarrito.id_modulo, + institucion: { + id_institucion: infoCarrito.id_institucion, + }, + }, + }); + }); + } + + findFullInfoCarritoById(id_carrito: number) { + return this.minInformacionCarritoView + .findOne({ where: { id_carrito } }) + .then((infoCarrito) => { + if (!infoCarrito) + throw new NotFoundException('No existe este id carrito.'); + return this.repository.create({ + id_carrito: infoCarrito.id_carrito, + activo: infoCarrito.activo === 1, + carrito: infoCarrito.carrito, + marca: { + id_marca: infoCarrito.id_marca, + marca: infoCarrito.marca, + }, + modelo: { + id_modelo: infoCarrito.id_modelo, + modelo: infoCarrito.modelo, + }, + modulo: { + id_modulo: infoCarrito.id_modulo, + modulo: infoCarrito.modulo, + institucion: { + id_institucion: infoCarrito.id_institucion, + institucion: infoCarrito.institucion, + }, + }, + tipoCarrito: { + id_tipo_carrito: infoCarrito.id_tipo_carrito, + tipo_carrito: infoCarrito.tipo_carrito, + }, + }); + }); + } + + async findMinInfoCarritoAll(filtros: { + pagina: string; + activo?: string; + carrito?: string; + id_institucion?: string; + id_marca?: string; + id_modelo?: string; + id_modulo?: string; + id_tipo_carrito?: string; + }) { + const institucion = filtros.id_institucion + ? await this.institucionService.findInfoInstitucionById( + parseInt(filtros.id_institucion), + ) + : null; + const marca = filtros.id_marca + ? await this.marcaService.findById(parseInt(filtros.id_marca), 'c') + : null; + const modelo = filtros.id_modelo + ? await this.modeloService.findById(parseInt(filtros.id_modelo), 'c') + : null; + const modulo = filtros.id_modulo + ? await this.moduloService.findInfoModuloById(parseInt(filtros.id_modulo)) + : null; + const tipoCarrito = filtros.id_tipo_carrito + ? await this.institucionTipoCarritoService.findTipoCarritoById( + parseInt(filtros.id_tipo_carrito), + ) + : null; + const busqueda: { + activo?: number; + carrito?: FindOperator; + id_institucion?: number; + id_marca?: number; + id_modelo?: number; + id_modulo?: number; + id_tipo_carrito?: number; + } = {}; + + if (filtros.activo === 'true') busqueda.activo = 1; + if (filtros.activo === 'false') busqueda.activo = 0; + if (filtros.carrito) busqueda.carrito = Like(`%${filtros.carrito}%`); + if (institucion) busqueda.id_institucion = institucion.id_institucion; + if (modulo) busqueda.id_modulo = modulo.id_modulo; + if (marca) busqueda.id_marca = marca.id_marca; + if (modelo) busqueda.id_modelo = modelo.id_modelo; + if (tipoCarrito) busqueda.id_tipo_carrito = tipoCarrito.id_tipo_carrito; + return this.minInformacionCarritoView + .findAndCount({ + where: busqueda, + order: { + institucion: 'ASC', + modulo: 'ASC', + tipo_carrito: 'ASC', + carrito: 'ASC', + }, + take: 25, + skip: (parseInt(filtros.pagina) - 1) * 25, + }) + .then((infoCarritos) => { + const carritos: Carrito[] = []; + + for (let i = 0; i < infoCarritos[0].length; i++) + carritos.push( + this.repository.create({ + id_carrito: infoCarritos[0][i].id_carrito, + activo: infoCarritos[0][i].activo === 1, + carrito: infoCarritos[0][i].carrito, + modulo: { + id_modulo: infoCarritos[0][i].id_modulo, + modulo: infoCarritos[0][i].modulo, + institucion: { + id_institucion: infoCarritos[0][i].id_institucion, + institucion: infoCarritos[0][i].institucion, + }, + }, + tipoCarrito: { + id_tipo_carrito: infoCarritos[0][i].id_tipo_carrito, + tipo_carrito: infoCarritos[0][i].tipo_carrito, + }, + }), + ); + return [carritos, infoCarritos[1]]; + }); + } + async update(operador: Operador, attrs: Partial, motivo: string) { - return this.findById(attrs.id_carrito) + return this.findInfoCarritoById(attrs.id_carrito) .then(async (carrito) => { if ( operador.institucion.id_institucion != diff --git a/src/carrito/entity/views/informacion-carrito.view.ts b/src/carrito/entity/views/informacion-carrito.view.ts new file mode 100644 index 0000000..f85b473 --- /dev/null +++ b/src/carrito/entity/views/informacion-carrito.view.ts @@ -0,0 +1,32 @@ +import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; +import { Carrito } from '../carrito.entity'; +import { Modulo } from '../../../modulo/entity/modulo.entity'; + +@ViewEntity({ + expression: (dataSource: DataSource) => + dataSource + .createQueryBuilder() + .select('c.id_carrito', 'id_carrito') + .addSelect('c.carrito', 'carrito') + .addSelect('c.id_modulo', 'id_modulo') + .addSelect('c.id_tipo_carrito', 'id_tipo_carrito') + .addSelect('m.id_institucion', 'id_institucion') + .from(Carrito, 'c') + .innerJoin(Modulo, 'm', 'm.id_modulo = c.id_modulo'), +}) +export class InformacionCarritoView { + @ViewColumn() + id_carrito: number; + + @ViewColumn() + carrito: string; + + @ViewColumn() + id_institucion: number; + + @ViewColumn() + id_modulo: number; + + @ViewColumn() + id_tipo_carrito: number; +} diff --git a/src/carrito/entity/views/min-informacion-carrito.view.ts b/src/carrito/entity/views/min-informacion-carrito.view.ts new file mode 100644 index 0000000..74bb300 --- /dev/null +++ b/src/carrito/entity/views/min-informacion-carrito.view.ts @@ -0,0 +1,72 @@ +import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; +import { Carrito } from '../carrito.entity'; +import { Institucion } from '../../../institucion/entity/institucion.entity'; +import { Modulo } from '../../../modulo/entity/modulo.entity'; +import { Marca } from '../../../marca/entity/marca.entity'; +import { Modelo } from '../../../modelo/entity/modelo.entity'; +import { TipoCarrito } from '../../../institucion-tipo-carrito/entity/tipo-carrito.entity'; + +@ViewEntity({ + expression: (dataSource: DataSource) => + dataSource + .createQueryBuilder() + .select('c.id_carrito', 'id_carrito') + .addSelect('c.activo', 'activo') + .addSelect('c.carrito', 'carrito') + .addSelect('c.id_marca', 'id_marca') + .addSelect('c.id_modelo', 'id_modelo') + .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('ma.marca', 'marca') + .addSelect('mo.modelo', 'modelo') + .addSelect('tc.tipo_carrito', 'tipo_carrito') + .addSelect('i.institucion', 'institucion') + .from(Carrito, 'c') + .innerJoin(Marca, 'ma', 'ma.id_marca = c.id_marca') + .innerJoin(Modelo, 'mo', 'mo.id_modelo = c.id_modelo') + .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 MinInformacionCarritoView { + @ViewColumn() + id_carrito: number; + + @ViewColumn() + activo: number; + + @ViewColumn() + carrito: string; + + @ViewColumn() + id_institucion: number; + + @ViewColumn() + id_marca: number; + + @ViewColumn() + id_modelo: number; + + @ViewColumn() + id_modulo: number; + + @ViewColumn() + id_tipo_carrito: number; + + @ViewColumn() + institucion: string; + + @ViewColumn() + marca: string; + + @ViewColumn() + modelo: string; + + @ViewColumn() + modulo: string; + + @ViewColumn() + tipo_carrito: string; +} diff --git a/src/modulo/entity/views/informacion-modulo.view.ts b/src/modulo/entity/views/informacion-modulo.view.ts index 73cb0a4..b35aa6c 100644 --- a/src/modulo/entity/views/informacion-modulo.view.ts +++ b/src/modulo/entity/views/informacion-modulo.view.ts @@ -1,6 +1,5 @@ import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; import { Modulo } from '../modulo.entity'; -import { Institucion } from '../../../institucion/entity/institucion.entity'; @ViewEntity({ expression: (dataSource: DataSource) => @@ -8,8 +7,7 @@ import { Institucion } from '../../../institucion/entity/institucion.entity'; .createQueryBuilder() .select('m.id_modulo', 'id_modulo') .addSelect('m.id_institucion', 'id_institucion') - .from(Modulo, 'm') - .innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion'), + .from(Modulo, 'm'), }) export class InformacionModuloView { @ViewColumn() diff --git a/src/modulo/entity/views/min-informacion-modulo.view.ts b/src/modulo/entity/views/min-informacion-modulo.view.ts index afb6466..4f86f56 100644 --- a/src/modulo/entity/views/min-informacion-modulo.view.ts +++ b/src/modulo/entity/views/min-informacion-modulo.view.ts @@ -10,8 +10,8 @@ import { Institucion } from '../../../institucion/entity/institucion.entity'; .addSelect('m.activo', 'activo_modulo') .addSelect('m.modulo', 'modulo') .addSelect('m.id_institucion', 'id_institucion') - .addSelect('i.institucion', 'institucion') .addSelect('i.activo', 'activo_institucion') + .addSelect('i.institucion', 'institucion') .from(Modulo, 'm') .innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion'), }) @@ -20,10 +20,10 @@ export class MinInformacionModuloView { id_modulo: number; @ViewColumn() - activo_modulo: number; + activo_institucion: number; @ViewColumn() - activo_institucion: number; + activo_modulo: number; @ViewColumn() id_institucion: number; diff --git a/src/upload-file/upload-file.service.ts b/src/upload-file/upload-file.service.ts index fe410d7..4e8e011 100644 --- a/src/upload-file/upload-file.service.ts +++ b/src/upload-file/upload-file.service.ts @@ -250,20 +250,13 @@ export class UploadFileService { if (equipo) { errores.push( `${error} ya existe un equipo de cómputo con el sobrenombre: ${equipo.equipo} en el carrito: ${equipo.carrito}.`, - // `${error} ya existe un equipo de cómputo con el sobrenombre: ${equipo.equipo} en el carrito: ${equipo.carrito.carrito}.`, ); return; } else { - // equipo = await this.equipoService.findByNumeroInventario( - // institucion, - // dataEquipo.numero_inventario, - // false, - // ); equipo = await this.equipoService.informacionEquipoNumeroInventario( institucion.id_institucion, dataEquipo.numero_inventario, ); - if (equipo) { errores.push( `${error} ya existe un equipo con ese número de inventario en esta institución.`,