diff --git a/src/app.module.ts b/src/app.module.ts index 1d590fe..499bc8e 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -71,9 +71,10 @@ 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 { FullInformacionCarritoView } from './carrito/entity/views/full-informacion-carrito.view'; +import { InformacionCarritoView } from './carrito/entity/views/informacion-carrito.view'; import { FullInformacionEquipoView } from './equipo/entity/views/full-informacion-equipo.view'; +import { InformacionEquipoPrestamoView } from './equipo/entity/views/informacion-equipo-prestamo.view'; import { InformacionEquipoView } from './equipo/entity/views/informacion-equipo.view'; import { FullInformacionEquipoProgramaView } from './equipo-programa/entity/views/full-informacion-equipo-programa.view'; import { InformacionEquipoProgramaView } from './equipo-programa/entity/views/informacion-equipo-programa.view'; @@ -151,6 +152,7 @@ import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuar InformacionCarritoView, FullInformacionCarritoView, FullInformacionEquipoView, + InformacionEquipoPrestamoView, InformacionEquipoView, FullInformacionEquipoProgramaView, InformacionEquipoProgramaView, diff --git a/src/equipo/entity/views/informacion-equipo-prestamo.view.ts b/src/equipo/entity/views/informacion-equipo-prestamo.view.ts new file mode 100644 index 0000000..486ed17 --- /dev/null +++ b/src/equipo/entity/views/informacion-equipo-prestamo.view.ts @@ -0,0 +1,70 @@ +import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; +import { Carrito } from '../../../carrito/entity/carrito.entity'; +import { Equipo } from '../equipo.entity'; +import { Institucion } from '../../../institucion/entity/institucion.entity'; +import { EquipoPrograma } from '../../../equipo-programa/entity/equipo-programa.entity'; +import { EquipoTipoEntrada } from '../../../equipo-tipo-entrada/entity/equipo-tipo-entrada.entity'; +import { Modulo } from '../../../modulo/entity/modulo.entity'; + +@ViewEntity({ + expression: (dataSource: DataSource) => + dataSource + .createQueryBuilder() + .select('e.id_equipo', 'id_equipo') + .addSelect('e.id_carrito', 'id_carrito') + .addSelect('e.id_status', 'id_status') + .addSelect('e.prestado', 'prestado') + .addSelect('c.id_modulo', 'id_modulo') + .addSelect('c.id_tipo_carrito', 'id_tipo_carrito') + .addSelect('ps.id_equipo_programa', 'id_equipo_programa') + .addSelect('ps.id_programa', 'id_programa') + .addSelect('tes.id_equipo_tipo_entrada', 'id_equipo_tipo_entrada') + .addSelect('tes.id_tipo_entrada', 'id_tipo_entrada') + .addSelect('m.id_institucion', 'id_institucion') + .from(Equipo, 'e') + .innerJoin(Carrito, 'c', 'c.id_carrito = e.id_carrito') + .innerJoin(EquipoPrograma, 'ps', 'ps.id_equipo = e.id_equipo') + .innerJoin(EquipoTipoEntrada, 'tes', 'tes.id_equipo = e.id_equipo') + .innerJoin(Modulo, 'm', 'm.id_modulo = c.id_modulo') + .innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion') + .where('c.activo = 1') + .andWhere('m.activo = 1') + .andWhere('i.activo = 1') + .andWhere('e.id_status = 1') + .orderBy('c.carrito', 'ASC') + .addOrderBy('e.equipo', 'ASC'), +}) +export class InformacionEquipoPrestamoView { + @ViewColumn() + id_equipo: number; + + @ViewColumn() + id_carrito: number; + + @ViewColumn() + id_equipo_programa: number; + + @ViewColumn() + id_equipo_tipo_entrada: number; + + @ViewColumn() + id_institucion: number; + + @ViewColumn() + id_modulo: number; + + @ViewColumn() + id_programa: number; + + @ViewColumn() + id_status: number; + + @ViewColumn() + id_tipo_carrito: number; + + @ViewColumn() + id_tipo_entrada: number; + + @ViewColumn() + prestado: number; +} diff --git a/src/equipo/equipo.module.ts b/src/equipo/equipo.module.ts index 964fa8f..d8a784d 100644 --- a/src/equipo/equipo.module.ts +++ b/src/equipo/equipo.module.ts @@ -5,6 +5,7 @@ import { EquipoController } from './equipo.controller'; import { EquipoService } from './equipo.service'; import { Equipo } from './entity/equipo.entity'; import { FullInformacionEquipoView } from './entity/views/full-informacion-equipo.view'; +import { InformacionEquipoPrestamoView } from './entity/views/informacion-equipo-prestamo.view'; import { InformacionEquipoView } from './entity/views/informacion-equipo.view'; import { CarritoModule } from '../carrito/carrito.module'; import { EquipoProgramaModule } from '../equipo-programa/equipo-programa.module'; @@ -40,6 +41,7 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module' TypeOrmModule.forFeature([ Equipo, FullInformacionEquipoView, + InformacionEquipoPrestamoView, InformacionEquipoView, ]), ValidarUsuarioModule, diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index dbd945f..e135420 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -7,7 +7,7 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { FindOptionsWhere, Repository } from 'typeorm'; import { Carrito } from '../carrito/entity/carrito.entity'; import { Equipo } from './entity/equipo.entity'; import { Institucion } from '../institucion/entity/institucion.entity'; @@ -18,8 +18,9 @@ import { Operador } from '../operador/entity/operador.entity'; import { Programa } from '../institucion-programa/entity/programa.entity'; import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; import { TipoEntrada } from '../institucion-tipo-entrada/entity/tipo-entrada.entity'; -import { InformacionEquipoView } from './entity/views/informacion-equipo.view'; import { FullInformacionEquipoView } from './entity/views/full-informacion-equipo.view'; +import { InformacionEquipoPrestamoView } from './entity/views/informacion-equipo-prestamo.view'; +import { InformacionEquipoView } from './entity/views/informacion-equipo.view'; import { CarritoService } from '../carrito/carrito.service'; import { EquipoProgramaService } from '../equipo-programa/equipo-programa.service'; import { EquipoTipoEntradaService } from '../equipo-tipo-entrada/equipo-tipo-entrada.service'; @@ -38,10 +39,12 @@ import { StatusService } from '../status/status.service'; export class EquipoService { constructor( @InjectRepository(Equipo) private repository: Repository, - @InjectRepository(InformacionEquipoView) - private informacionEquipoView: Repository, @InjectRepository(FullInformacionEquipoView) private fullInformacionEquipoView: Repository, + @InjectRepository(InformacionEquipoPrestamoView) + private informacionEquipoPrestamoView: Repository, + @InjectRepository(InformacionEquipoView) + private informacionEquipoView: Repository, private carritoService: CarritoService, @Inject(forwardRef(() => EquipoProgramaService)) private equipoProgramaService: EquipoProgramaService, @@ -254,78 +257,53 @@ export class EquipoService { programa?: Programa, tipoEntrada?: TipoEntrada, ) { - const queryReseteo = this.repository - .createQueryBuilder('e') - .innerJoin('e.carrito', 'c', 'c.activo = 1') - .innerJoin('e.programas', 'ps') - .innerJoin('e.status', 's', 's.id_status = 1') - .innerJoin('e.tiposEntradas', 'tes') - .innerJoin('c.modulo', 'm', 'm.id_modulo = :id_modulo AND m.activo = 1', { - id_modulo: modulo.id_modulo, - }) - .innerJoin( - 'c.tipoCarrito', - 'tc', - 'tc.id_tipo_carrito = :id_tipo_carrito', - { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, - ) - .innerJoin('m.institucion', 'i', 'i.activo = 1') - .where('e.prestado = 1'); - const query = this.repository - .createQueryBuilder('e') - .innerJoinAndSelect('e.carrito', 'c', 'c.activo = 1') - .innerJoinAndSelect('e.programas', 'ps') - .innerJoinAndSelect('e.status', 's', 's.id_status = 1') - .innerJoinAndSelect('e.tiposEntradas', 'tes') - .innerJoinAndSelect( - 'c.modulo', - 'm', - 'm.id_modulo = :id_modulo AND m.activo = 1', - { id_modulo: modulo.id_modulo }, - ) - .innerJoinAndSelect( - 'c.tipoCarrito', - 'tc', - 'tc.id_tipo_carrito = :id_tipo_carrito', - { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, - ) - .innerJoinAndSelect('m.institucion', 'i', 'i.activo = 1') - .innerJoinAndSelect('ps.programa', 'p') - .innerJoinAndSelect('tes.tipoEntrada', 'te') - .where('e.prestado = 0') - .orderBy('c.carrito') - .addOrderBy('e.equipo'); + const busquedaReseteo: FindOptionsWhere = { + prestado: 1, + id_modulo: modulo.id_modulo, + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }; + const busqueda: FindOptionsWhere = { + prestado: 0, + id_modulo: modulo.id_modulo, + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }; if (programa) { - query.andWhere('ps.id_programa = :id_programa', { - id_programa: programa.id_programa, - }); - queryReseteo.andWhere('ps.id_programa = :id_programa', { - id_programa: programa.id_programa, - }); + busqueda.id_programa = programa.id_programa; + busquedaReseteo.id_programa = programa.id_programa; } else { - query.andWhere('ps.id_programa = 1'); - queryReseteo.andWhere('id_programa = 1'); + busqueda.id_programa = 1; + busquedaReseteo.id_programa = 1; } if (tipoEntrada) { - query.andWhere('tes.id_tipo_entrada = :id_tipo_entrada', { - id_tipo_entrada: tipoEntrada.id_tipo_entrada, - }); - queryReseteo.andWhere('tes.id_tipo_entrada = :id_tipo_entrada', { - id_tipo_entrada: tipoEntrada.id_tipo_entrada, - }); + busqueda.id_tipo_entrada = tipoEntrada.id_tipo_entrada; + busquedaReseteo.id_tipo_entrada = tipoEntrada.id_tipo_entrada; } - return query.getCount().then(async (n) => { - if (n === 0) - await queryReseteo.getMany().then(async (equipos) => { - for (let i = 0; i < equipos.length; i++) { - equipos[i].prestado = false; - await this.repository.save(equipos[i]); - } - }); - return query.getOne(); - }); + return this.informacionEquipoPrestamoView + .count({ where: busqueda }) + .then(async (n) => { + if (n === 0) + await this.informacionEquipoPrestamoView + .find({ where: busquedaReseteo }) + .then(async (infoEquipos) => { + for (let i = 0; i < infoEquipos.length; i++) + await this.repository.save( + this.repository.create({ + id_equipo: infoEquipos[i].id_equipo, + prestado: false, + }), + ); + }); + return this.informacionEquipoPrestamoView.findOne({ where: busqueda }); + }) + .then((equipo) => { + if (!equipo) + throw new ConflictException( + 'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.', + ); + return this.repository.create({ id_equipo: equipo.id_equipo }); + }); } findInfoEquipoById(id_equipo: number) { diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index f6f2a30..6431020 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -137,34 +137,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) => { @@ -179,13 +179,7 @@ export class PrestamoService { tipoEntrada, ); }) - .then(async (equipo) => { - if (!equipo) - throw new ConflictException( - 'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.', - ); - return this.equipoService.update(equipo, null, 2); - }) + .then((equipo) => this.equipoService.update(equipo, null, 2)) .then(({ equipo }) => this.repository.save( this.repository.create({