This commit is contained in:
xXpuma99Xx 2022-07-05 21:53:47 -05:00
parent 755db28c93
commit ae98fde192
31 changed files with 300 additions and 157 deletions

View File

@ -43,9 +43,9 @@ export class AuthController {
examples: { examples: {
ejemplo: { ejemplo: {
value: { value: {
id_modulo: 1,
operador: '', operador: '',
password: '', password: '',
id_modulo: 1,
}, },
}, },
}, },

View File

@ -44,9 +44,9 @@ export class AuthService {
this.validarLogin(operador, password); this.validarLogin(operador, password);
const payload: JwtPayload = { const payload: JwtPayload = {
id_modulo: modulo.id_modulo,
id_operador: operador.id_operador, id_operador: operador.id_operador,
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario, id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
id_modulo: modulo.id_modulo,
}; };
return { operador, token: this.jwtService.sign(payload) }; return { operador, token: this.jwtService.sign(payload) };
@ -62,7 +62,7 @@ export class AuthService {
id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario, id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario,
}; };
return { usuario, token: this.jwtService.sign(payload) }; return { token: this.jwtService.sign(payload), usuario };
}); });
} }

View File

@ -6,6 +6,10 @@ import { ConfigService } from '@nestjs/config';
export class BcryptService { export class BcryptService {
constructor(private configService: ConfigService) {} constructor(private configService: ConfigService) {}
comparar(password: string, passwordDb: string) {
return bcrypt.compareSync(password, passwordDb);
}
encriptar(password: string) { encriptar(password: string) {
const salt = bcrypt.genSaltSync( const salt = bcrypt.genSaltSync(
parseInt(this.configService.get<string>('SALT_ROUNDS')), parseInt(this.configService.get<string>('SALT_ROUNDS')),
@ -13,8 +17,4 @@ export class BcryptService {
return bcrypt.hashSync(password, salt); return bcrypt.hashSync(password, salt);
} }
comparar(password: string, passwordDb: string) {
return bcrypt.compareSync(password, passwordDb);
}
} }

View File

@ -1,4 +1,13 @@
import { Body, Controller, Delete, Get, Post, Query } from '@nestjs/common'; import {
Body,
Controller,
Delete,
Get,
Post,
Query,
UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor'; import { Serealize } from '../interceptors/serialize.interceptor';
import { CarreraProgramaService } from './carrera-programa.service'; import { CarreraProgramaService } from './carrera-programa.service';
@ -13,9 +22,10 @@ export class CarreraProgramaController {
constructor(private carreraProgramaService: CarreraProgramaService) {} constructor(private carreraProgramaService: CarreraProgramaService) {}
@Post() @Post()
// @UseGuards(AuthGuard('jwt'))
@ApiOperation({ @ApiOperation({
description: description:
'Endpoint que crea una asociación entra una carrera y un programa.', 'Endpoint que crea una asociación entre una carrera y un programa.',
}) })
@ApiBody({ @ApiBody({
description: 'Ambas variables son obligatorios.', description: 'Ambas variables son obligatorios.',
@ -31,6 +41,7 @@ export class CarreraProgramaController {
} }
@Delete() @Delete()
// @UseGuards(AuthGuard('jwt'))
@ApiOperation({ @ApiOperation({
description: description:
'Endpoint que borra la asociación entre una carrera y un programa.', 'Endpoint que borra la asociación entre una carrera y un programa.',

View File

@ -50,6 +50,18 @@ export class CarritoController {
name: 'pagina', name: 'pagina',
type: 'string', type: 'string',
}) })
@ApiQuery({
description: 'Booleano en forma de string que se usará como filtro.',
name: 'activo',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Carrito que se esta buscando.',
name: 'carrito',
type: 'string',
required: false,
})
@ApiQuery({ @ApiQuery({
description: 'Id de la institución.', description: 'Id de la institución.',
name: 'id_institucion', name: 'id_institucion',
@ -68,18 +80,6 @@ export class CarritoController {
type: 'string', type: 'string',
required: false, required: false,
}) })
@ApiQuery({
description: 'Booleano en forma de string que se usará como filtro.',
name: 'activo',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Carrito que se esta buscando.',
name: 'carrito',
type: 'string',
required: false,
})
carritos(@Query() query: CarritosDto) { carritos(@Query() query: CarritosDto) {
return this.carritoService.findAll(query); return this.carritoService.findAll(query);
} }
@ -93,7 +93,7 @@ export class CarritoController {
description: 'Todas las variables son obligatorias.', description: 'Todas las variables son obligatorias.',
examples: { examples: {
ejemplo: { ejemplo: {
value: { id_tipo_carrito: 1, id_modulo: 1, marca: '', modelo: '' }, value: { id_modulo: 1, id_tipo_carrito: 1, marca: '', modelo: '' },
}, },
}, },
}) })
@ -119,9 +119,9 @@ export class CarritoController {
value: { value: {
id_carrito: 1, id_carrito: 1,
_activo: true, _activo: true,
_carrito: '',
_id_modulo: 1, _id_modulo: 1,
_id_tipo_carrito: 1, _id_tipo_carrito: 1,
_carrito: '',
_marca: '', _marca: '',
_modelo: '', _modelo: '',
}, },
@ -129,8 +129,12 @@ export class CarritoController {
}, },
}) })
update(@Body() body: UpdateCarritoDto) { update(@Body() body: UpdateCarritoDto) {
const data = { ...body };
delete data.id_modulo;
delete data.id_tipo_carrito;
return this.carritoService.update( return this.carritoService.update(
body, data,
body.id_modulo, body.id_modulo,
body.id_tipo_carrito, body.id_tipo_carrito,
); );

View File

@ -6,6 +6,7 @@ import { Carrito } from './entity/carrito.entity';
import { InstitucionModule } from '../institucion/institucion.module'; import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module'; import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module';
import { ModuloModule } from '../modulo/modulo.module'; import { ModuloModule } from '../modulo/modulo.module';
@Module({ @Module({
imports: [ imports: [
InstitucionModule, InstitucionModule,

View File

@ -4,9 +4,8 @@ import {
NotFoundException, NotFoundException,
} from '@nestjs/common'; } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { FindOperator, Like, Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { Carrito } from './entity/carrito.entity'; import { Carrito } from './entity/carrito.entity';
import { Institucion } from '../institucion/entity/institucion.entity';
import { Modulo } from '../modulo/entity/modulo.entity'; import { Modulo } from '../modulo/entity/modulo.entity';
import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity';
import { InstitucionService } from '../institucion/institucion.service'; import { InstitucionService } from '../institucion/institucion.service';
@ -120,10 +119,6 @@ export class CarritoService {
query.andWhere('c.carrito LIKE :carrito', { query.andWhere('c.carrito LIKE :carrito', {
carrito: `%${filtros.carrito}%`, carrito: `%${filtros.carrito}%`,
}); });
if (tipoCarrito)
query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', {
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
});
if (institucion) if (institucion)
query.andWhere('i.id_institucion = :id_institucion', { query.andWhere('i.id_institucion = :id_institucion', {
id_institucion: institucion.id_institucion, id_institucion: institucion.id_institucion,
@ -132,6 +127,10 @@ export class CarritoService {
query.andWhere('m.id_modulo = :id_modulo', { query.andWhere('m.id_modulo = :id_modulo', {
id_modulo: modulo.id_modulo, id_modulo: modulo.id_modulo,
}); });
if (tipoCarrito)
query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', {
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
});
return query.getManyAndCount(); return query.getManyAndCount();
} }
@ -173,17 +172,17 @@ export class CarritoService {
id_modulo?: number, id_modulo?: number,
id_tipo_carrito?: number, id_tipo_carrito?: number,
) { ) {
const modulo = id_modulo
? await this.moduloService.findById(id_modulo)
: null;
const tipoCarrito = id_modulo
? await this.institucionTipoCarritoService.findTipoCarritoById(
id_tipo_carrito,
)
: null;
return this.findById(attrs.id_carrito) return this.findById(attrs.id_carrito)
.then(async (carrito) => { .then(async (carrito) => {
const modulo = id_modulo
? await this.moduloService.findById(id_modulo)
: null;
const tipoCarrito = id_modulo
? await this.institucionTipoCarritoService.findTipoCarritoById(
id_tipo_carrito,
)
: null;
if (attrs.carrito || modulo || tipoCarrito) if (attrs.carrito || modulo || tipoCarrito)
await this.existeCarrito( await this.existeCarrito(
modulo ? modulo : carrito.modulo, modulo ? modulo : carrito.modulo,

View File

@ -4,6 +4,7 @@ import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { EquipoProgramaService } from './equipo-programa.service'; import { EquipoProgramaService } from './equipo-programa.service';
import { CreateEquipoProgramaDto } from './dto/input/create.dto'; import { CreateEquipoProgramaDto } from './dto/input/create.dto';
import { DeleteEquipoProgramaDto } from './dto/input/delete.dto'; import { DeleteEquipoProgramaDto } from './dto/input/delete.dto';
@Controller('equipo-programa') @Controller('equipo-programa')
@ApiTags('equipo-programa') @ApiTags('equipo-programa')
export class EquipoProgramaController { export class EquipoProgramaController {

View File

@ -3,9 +3,9 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { Equipo } from 'src/equipo/entity/equipo.entity'; import { Equipo } from 'src/equipo/entity/equipo.entity';
import { EquipoTipoEntrada } from './entity/equipo-tipo-entrada.entity'; import { EquipoTipoEntrada } from './entity/equipo-tipo-entrada.entity';
import { TipoEntrada } from 'src/institucion-tipo-entrada/entity/tipo-entrada.entity';
import { EquipoService } from '../equipo/equipo.service'; import { EquipoService } from '../equipo/equipo.service';
import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service'; import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service';
import { TipoEntrada } from 'src/institucion-tipo-entrada/entity/tipo-entrada.entity';
@Injectable() @Injectable()
export class EquipoTipoEntradaService { export class EquipoTipoEntradaService {

View File

@ -1,39 +1,38 @@
import { Optional } from '@nestjs/common'; import { IsInt, IsOptional, IsString } from 'class-validator';
import { IsInt, IsString } from 'class-validator';
export class UpdateEquipoDto { export class UpdateEquipoDto {
@IsInt() @IsInt()
id_equipo: number; id_equipo: number;
@IsString() @IsString()
@Optional() @IsOptional()
equipo?: string; equipo?: string;
@IsInt() @IsInt()
@Optional() @IsOptional()
id_carrito?: number; id_carrito?: number;
@IsInt() @IsInt()
@Optional() @IsOptional()
id_operador?: number; id_operador?: number;
@IsInt() @IsInt()
@Optional() @IsOptional()
id_status?: number; id_status?: number;
@IsString() @IsString()
@Optional() @IsOptional()
marca?: string; marca?: string;
@IsString() @IsString()
@Optional() @IsOptional()
modelo?: string; modelo?: string;
@IsString() @IsString()
@Optional() @IsOptional()
motivo?: string; motivo?: string;
@IsString() @IsString()
@Optional() @IsOptional()
numero_serie?: string; numero_serie?: string;
} }

View File

@ -1,6 +1,6 @@
import { Body, Controller, Get, Put, Query, UseGuards } from '@nestjs/common'; import { Body, Controller, Get, Put, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor'; import { Serealize } from '../interceptors/serialize.interceptor';
import { EquipoService } from './equipo.service'; import { EquipoService } from './equipo.service';
import { EquipoDto } from './dto/input/equipo.dto'; import { EquipoDto } from './dto/input/equipo.dto';
@ -54,41 +54,49 @@ export class EquipoController {
description: 'Carrito que se quiere usar como filtro.', description: 'Carrito que se quiere usar como filtro.',
name: 'carrito', name: 'carrito',
type: 'string', type: 'string',
required: false,
}) })
@ApiQuery({ @ApiQuery({
description: 'Equipo que se quiere usar como filtro.', description: 'Equipo que se quiere usar como filtro.',
name: 'equipo', name: 'equipo',
type: 'string', type: 'string',
required: false,
}) })
@ApiQuery({ @ApiQuery({
description: 'Id de la institución que se quiere usar como filtro.', description: 'Id de la institución que se quiere usar como filtro.',
name: 'id_institucion', name: 'id_institucion',
type: 'string', type: 'string',
}) required: false,
@ApiQuery({
description: 'Id del tipo de carrito que se quiere usar como filtro.',
name: 'id_tipo_carrito',
type: 'string',
})
@ApiQuery({
description: 'Id del status que se quiere usar como filtro.',
name: 'id_status',
type: 'string',
})
@ApiQuery({
description: 'Id del programa que se quiere usar como filtro.',
name: 'id_programa',
type: 'string',
}) })
@ApiQuery({ @ApiQuery({
description: 'Id del módulo que se quiere usar como filtro.', description: 'Id del módulo que se quiere usar como filtro.',
name: 'id_modulo', name: 'id_modulo',
type: 'string', type: 'string',
required: false,
})
@ApiQuery({
description: 'Id del programa que se quiere usar como filtro.',
name: 'id_programa',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Id del status que se quiere usar como filtro.',
name: 'id_status',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Id del tipo de carrito que se quiere usar como filtro.',
name: 'id_tipo_carrito',
type: 'string',
required: false,
}) })
@ApiQuery({ @ApiQuery({
description: 'Id del tipo de entrada que se quiere usar como filtro.', description: 'Id del tipo de entrada que se quiere usar como filtro.',
name: 'id_tipo_entrada', name: 'id_tipo_entrada',
type: 'string', type: 'string',
required: false,
}) })
equipos(@Query() query: EquiposDto) { equipos(@Query() query: EquiposDto) {
return this.equipoService.findAll(query); return this.equipoService.findAll(query);
@ -96,6 +104,28 @@ export class EquipoController {
@Put() @Put()
// @UseGuards(AuthGuard('jwt')) // @UseGuards(AuthGuard('jwt'))
@ApiOperation({
description: 'Endpoint que actualiza lan información de un equipo.',
})
@ApiBody({
description:
'Todas las variables a excepción de id_carrito son opcionales.',
examples: {
ejemplo: {
value: {
id_equipo: 1,
_equipo: true,
_id_carrito: '',
_id_operador: 1,
_id_status: 1,
_marca: '',
_modelo: '',
_motivo: '',
_numero_serie: '',
},
},
},
})
update(@Body() body: UpdateEquipoDto) { update(@Body() body: UpdateEquipoDto) {
const data = { ...body }; const data = { ...body };

View File

@ -92,9 +92,9 @@ export class EquipoService {
id_institucion?: string; id_institucion?: string;
id_modulo?: string; id_modulo?: string;
id_programa?: string; id_programa?: string;
id_status?: string;
id_tipo_carrito?: string; id_tipo_carrito?: string;
id_tipo_entrada?: string; id_tipo_entrada?: string;
id_status?: string;
}) { }) {
const carrito = filtros.id_carrito const carrito = filtros.id_carrito
? await this.carritoService.findById(parseInt(filtros.id_carrito)) ? await this.carritoService.findById(parseInt(filtros.id_carrito))
@ -115,24 +115,24 @@ export class EquipoService {
parseInt(filtros.id_tipo_carrito), parseInt(filtros.id_tipo_carrito),
) )
: null; : null;
const status = filtros.id_status
? await this.statusService.findById(parseInt(filtros.id_status))
: null;
const tipoEntrada = filtros.id_tipo_entrada const tipoEntrada = filtros.id_tipo_entrada
? await this.institucionTipoEntradaService.findTipoEntradaById( ? await this.institucionTipoEntradaService.findTipoEntradaById(
parseInt(filtros.id_tipo_entrada), parseInt(filtros.id_tipo_entrada),
) )
: null; : null;
const status = filtros.id_status
? await this.statusService.findById(parseInt(filtros.id_status))
: null;
const query = this.repository const query = this.repository
.createQueryBuilder('e') .createQueryBuilder('e')
.innerJoinAndSelect('e.carrito', 'c') .innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('e.programas', 'ps')
.innerJoinAndSelect('e.status', 's') .innerJoinAndSelect('e.status', 's')
.innerJoinAndSelect('e.tiposEntradas', 'tes')
.innerJoinAndSelect('c.modulo', 'm') .innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('c.tipoCarrito', 'tc') .innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('e.tiposEntradas', 'tes')
.innerJoinAndSelect('tes.tipoEntrada', 'te')
.innerJoinAndSelect('e.programas', 'ps')
.innerJoinAndSelect('ps.programa', 'p') .innerJoinAndSelect('ps.programa', 'p')
.innerJoinAndSelect('tes.tipoEntrada', 'te')
.innerJoinAndSelect('m.institucion', 'i') .innerJoinAndSelect('m.institucion', 'i')
.orderBy('i.institucion') .orderBy('i.institucion')
.addOrderBy('m.modulo') .addOrderBy('m.modulo')
@ -183,7 +183,7 @@ export class EquipoService {
findById(id_equipo: number) { findById(id_equipo: number) {
return this.repository.findOne({ id_equipo }).then((equipo) => { return this.repository.findOne({ id_equipo }).then((equipo) => {
if (!equipo) throw new NotFoundException('No existe este equipo.'); if (!equipo) throw new NotFoundException('No existe este id equipo.');
return equipo; return equipo;
}); });
} }
@ -212,7 +212,9 @@ export class EquipoService {
}) })
.then((equipo) => { .then((equipo) => {
if (validarNoExiste && !equipo) if (validarNoExiste && !equipo)
throw new NotFoundException('No existe este equipo.'); throw new NotFoundException(
'No existe este un equipo de cómputo con este número de inventario.',
);
return equipo; return equipo;
}); });
} }
@ -226,24 +228,25 @@ export class EquipoService {
const queryReseteo = this.repository const queryReseteo = this.repository
.createQueryBuilder('e') .createQueryBuilder('e')
.innerJoin('e.carrito', 'c', 'c.activo = 1') .innerJoin('e.carrito', 'c', 'c.activo = 1')
.innerJoin('e.programas', 'ps')
.innerJoin('e.tiposEntradas', 'tes')
.innerJoin('c.modulo', 'm', 'm.id_modulo = :id_modulo AND m.activo = 1', { .innerJoin('c.modulo', 'm', 'm.id_modulo = :id_modulo AND m.activo = 1', {
id_modulo: modulo.id_modulo, id_modulo: modulo.id_modulo,
}) })
.innerJoin('m.institucion', 'i', 'i.activo = 1')
.innerJoin( .innerJoin(
'c.tipoCarrito', 'c.tipoCarrito',
'tc', 'tc',
'tc.id_tipo_carrito = :id_tipo_carrito', 'tc.id_tipo_carrito = :id_tipo_carrito',
{ id_tipo_carrito: tipoCarrito.id_tipo_carrito }, { id_tipo_carrito: tipoCarrito.id_tipo_carrito },
) )
.innerJoin('e.programas', 'ps') .innerJoin('m.institucion', 'i', 'i.activo = 1')
.innerJoin('e.tiposEntradas', 'tes') .andWhere('e.prestado = 1 AND e.id_status = 1');
.andWhere('e.prestado = 1 AND e.id_status = 1')
.update()
.set({ prestado: false });
const query = this.repository const query = this.repository
.createQueryBuilder('e') .createQueryBuilder('e')
.innerJoinAndSelect('e.carrito', 'c', 'c.activo = 1') .innerJoinAndSelect('e.carrito', 'c', 'c.activo = 1')
.innerJoinAndSelect('e.programas', 'ps')
.innerJoinAndSelect('e.status', 's', 's.id_status = 1')
.innerJoinAndSelect('e.tiposEntradas', 'tes')
.innerJoinAndSelect( .innerJoinAndSelect(
'c.modulo', 'c.modulo',
'm', 'm',
@ -252,19 +255,16 @@ export class EquipoService {
id_modulo: modulo.id_modulo, id_modulo: modulo.id_modulo,
}, },
) )
.innerJoinAndSelect('m.institucion', 'i', 'i.activo = 1')
.innerJoinAndSelect( .innerJoinAndSelect(
'c.tipoCarrito', 'c.tipoCarrito',
'tc', 'tc',
'tc.id_tipo_carrito = :id_tipo_carrito', 'tc.id_tipo_carrito = :id_tipo_carrito',
{ id_tipo_carrito: tipoCarrito.id_tipo_carrito }, { id_tipo_carrito: tipoCarrito.id_tipo_carrito },
) )
.innerJoinAndSelect('e.status', 's') .innerJoinAndSelect('m.institucion', 'i', 'i.activo = 1')
.innerJoinAndSelect('e.tiposEntradas', 'tes')
.innerJoinAndSelect('tes.tipoEntrada', 'te')
.innerJoinAndSelect('e.programas', 'ps')
.innerJoinAndSelect('ps.programa', 'p') .innerJoinAndSelect('ps.programa', 'p')
.where('e.prestado = 0 AND e.id_status = 1') .innerJoinAndSelect('tes.tipoEntrada', 'te')
.where('e.prestado = 0')
.orderBy('c.carrito') .orderBy('c.carrito')
.addOrderBy('e.equipo'); .addOrderBy('e.equipo');
@ -288,7 +288,8 @@ export class EquipoService {
}); });
} }
return query.getCount().then(async (n) => { return query.getCount().then(async (n) => {
if (n === 0) await queryReseteo.execute(); if (n === 0)
await queryReseteo.update().set({ prestado: false }).execute();
return query.getOne(); return query.getOne();
}); });
} }
@ -318,27 +319,27 @@ export class EquipoService {
}); });
} }
update( async update(
attrs: Partial<Equipo>, attrs: Partial<Equipo>,
id_carrito?: number, id_carrito?: number,
id_status?: number, id_status?: number,
id_operador?: number | Operador, id_operador?: number | Operador,
motivo?: string, motivo?: string,
) { ) {
const carrito = id_carrito
? await this.carritoService.findById(id_carrito)
: null;
const operador = id_operador
? typeof id_operador === 'number'
? await this.operadorService.findById(id_operador)
: id_operador
: null;
const status = id_status
? await this.statusService.findById(id_status)
: null;
return this.findById(attrs.id_equipo) return this.findById(attrs.id_equipo)
.then(async (equipo) => { .then(async (equipo) => {
const carrito = id_carrito
? await this.carritoService.findById(id_carrito)
: null;
const status = id_status
? await this.statusService.findById(id_status)
: null;
const operador = id_operador
? typeof id_operador === 'number'
? await this.operadorService.findById(id_operador)
: id_operador
: null;
if ((attrs.equipo && attrs.equipo != equipo.equipo) || carrito) if ((attrs.equipo && attrs.equipo != equipo.equipo) || carrito)
await this.existeEquipo( await this.existeEquipo(
carrito ? carrito : equipo.carrito, carrito ? carrito : equipo.carrito,
@ -353,7 +354,7 @@ export class EquipoService {
throw new ConflictException('No se mandó el id operador.'); throw new ConflictException('No se mandó el id operador.');
if (!motivo) if (!motivo)
throw new ConflictException( throw new ConflictException(
'No se mandó el motivo por el cambio de status', 'No se mandó el motivo para el cambio de status.',
); );
} }
Object.assign(equipo, attrs); Object.assign(equipo, attrs);

View File

@ -9,7 +9,7 @@ import {
UseGuards, UseGuards,
} from '@nestjs/common'; } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger'; import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor'; import { Serealize } from '../interceptors/serialize.interceptor';
import { HoraExcepcionService } from './hora-excepcion.service'; import { HoraExcepcionService } from './hora-excepcion.service';
import { CreateHoraExcepcionDto } from './dto/input/create.dto'; import { CreateHoraExcepcionDto } from './dto/input/create.dto';
@ -68,6 +68,10 @@ export class HoraExcepcionController {
description: description:
'Endpoint que retorna las horas excepcion de un día de una institución.', 'Endpoint que retorna las horas excepcion de un día de una institución.',
}) })
@ApiQuery({
description: 'Id de la institucion día',
name: 'id_institucion_dia',
})
get(@Query() query: GetHoraExcepcionDto) { get(@Query() query: GetHoraExcepcionDto) {
return this.horaExcepcionService.findAllByIdInstitucionDia( return this.horaExcepcionService.findAllByIdInstitucionDia(
parseInt(query.id_institucion_dia), parseInt(query.id_institucion_dia),
@ -85,7 +89,7 @@ export class HoraExcepcionController {
'Todoas las variables a excepción de id_hora_excepcion son opcionales pero se tiene que mandar forzosamente una hora.', 'Todoas las variables a excepción de id_hora_excepcion son opcionales pero se tiene que mandar forzosamente una hora.',
examples: { examples: {
ejemplo: { ejemplo: {
value: { id_hora_excepcion: 1, hora_inicio: '', hora_fin: '' }, value: { id_hora_excepcion: 1, _hora_fin: '', _hora_inicio: '' },
}, },
}, },
}) })

View File

@ -69,8 +69,6 @@ export class HoraExcepcionService {
} }
update(attrs: Partial<HoraExcepcion>) { update(attrs: Partial<HoraExcepcion>) {
if (!attrs.hora_inicio && !attrs.hora_fin)
throw new ConflictException('No se mandó nada para actualizar.');
return this.findById(attrs.id_hora_excepcion) return this.findById(attrs.id_hora_excepcion)
.then(async (horaExecpcion) => { .then(async (horaExecpcion) => {
if ( if (

View File

@ -43,14 +43,14 @@ export class InstitucionCarreraService {
id_institucion: number | Institucion, id_institucion: number | Institucion,
id_carrera: number | Carrera, id_carrera: number | Carrera,
) { ) {
const institucion =
typeof id_institucion === 'number'
? await this.institucionService.findById(id_institucion)
: id_institucion;
const carrera = const carrera =
typeof id_carrera === 'number' typeof id_carrera === 'number'
? await this.findCarreraByIdCarrera(id_carrera) ? await this.findCarreraByIdCarrera(id_carrera)
: id_carrera; : id_carrera;
const institucion =
typeof id_institucion === 'number'
? await this.institucionService.findById(id_institucion)
: id_institucion;
return this.institucionCarreraRepository.findOne({ carrera, institucion }); return this.institucionCarreraRepository.findOne({ carrera, institucion });
} }

View File

@ -9,6 +9,7 @@ import { Repository } from 'typeorm';
import { Institucion } from '../institucion/entity/institucion.entity'; import { Institucion } from '../institucion/entity/institucion.entity';
import { InstitucionDia } from './entity/institucion-dia.entity'; import { InstitucionDia } from './entity/institucion-dia.entity';
import { InstitucionService } from '../institucion/institucion.service'; import { InstitucionService } from '../institucion/institucion.service';
@Injectable() @Injectable()
export class InstitucionDiaService { export class InstitucionDiaService {
constructor( constructor(

View File

@ -53,8 +53,8 @@ export class InstitucionInfraccionService {
.then((institucion) => .then((institucion) =>
this.institucionInfraccionRepository this.institucionInfraccionRepository
.createQueryBuilder('ii') .createQueryBuilder('ii')
.innerJoinAndSelect('ii.institucion', 'in')
.innerJoinAndSelect('ii.infraccion', 'i') .innerJoinAndSelect('ii.infraccion', 'i')
.innerJoinAndSelect('ii.institucion', 'in')
.where('in.id_institucion = :id_institucion', { .where('in.id_institucion = :id_institucion', {
id_institucion: institucion.id_institucion, id_institucion: institucion.id_institucion,
}) })

View File

@ -68,14 +68,9 @@ export class InstitucionTipoCarritoService {
) )
.innerJoinAndSelect('itc.tipoCarrito', 'tc') .innerJoinAndSelect('itc.tipoCarrito', 'tc')
.orderBy('tc.tipo_carrito'); .orderBy('tc.tipo_carrito');
const busqueda: { institucion: Institucion; mostrar?: boolean } = {
institucion,
};
if (mostrar) busqueda.mostrar = mostrar;
if (mostrar) query.andWhere('itc.mostrar = 1'); if (mostrar) query.andWhere('itc.mostrar = 1');
return query.getMany(); return query.getMany();
return this.institucionTipoCarritoRepository.find(busqueda);
} }
findInstitucionTipoCarritoById(id_institucion_tipo_carrito) { findInstitucionTipoCarritoById(id_institucion_tipo_carrito) {

View File

@ -16,13 +16,13 @@ export class InstitucionTipoEntrada {
@Column({ type: Boolean, nullable: false, default: false }) @Column({ type: Boolean, nullable: false, default: false })
mostrar: boolean; mostrar: boolean;
@ManyToOne(() => Institucion, (institucion) => institucion.tiposEntrada)
@JoinColumn({ name: 'id_institucion' })
institucion: Institucion;
@ManyToOne(() => TipoEntrada, (tipoEntrada) => tipoEntrada.instituciones, { @ManyToOne(() => TipoEntrada, (tipoEntrada) => tipoEntrada.instituciones, {
eager: true, eager: true,
}) })
@JoinColumn({ name: 'id_tipo_entrada' }) @JoinColumn({ name: 'id_tipo_entrada' })
tipoEntrada: TipoEntrada; tipoEntrada: TipoEntrada;
@ManyToOne(() => Institucion, (institucion) => institucion.tiposEntrada)
@JoinColumn({ name: 'id_institucion' })
institucion: Institucion;
} }

View File

@ -1,8 +1,8 @@
import { import {
UseInterceptors,
NestInterceptor,
ExecutionContext,
CallHandler, CallHandler,
ExecutionContext,
NestInterceptor,
UseInterceptors,
} from '@nestjs/common'; } from '@nestjs/common';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';

View File

@ -72,7 +72,7 @@ export class ModuloController {
@ApiBody({ @ApiBody({
description: 'Todas las variables a excepción de id_modulo son opcionales.', description: 'Todas las variables a excepción de id_modulo son opcionales.',
examples: { examples: {
ejemplo: { value: { id_modulo: 1, activo: true, modulo: '' } }, ejemplo: { value: { id_modulo: 1, _activo: true, _modulo: '' } },
}, },
}) })
update(@Body() body: UpdateModuloDto) { update(@Body() body: UpdateModuloDto) {

View File

@ -23,6 +23,11 @@ export class MotivoController {
name: 'id_equipo', name: 'id_equipo',
type: 'string', type: 'string',
}) })
@ApiQuery({
description: 'Página en la que se encuentra el usuario.',
name: 'pagina',
type: 'string',
})
get(@Query() query: IdEquipoPaginaDto) { get(@Query() query: IdEquipoPaginaDto) {
return this.motivoService.findAllByIdEquipo( return this.motivoService.findAllByIdEquipo(
parseInt(query.id_equipo), parseInt(query.id_equipo),

View File

@ -0,0 +1,15 @@
import { IsInt, IsString } from 'class-validator';
export class MultarDto {
@IsString()
descripcion: string;
@IsInt()
id_institucion_infraccion: number;
@IsInt()
id_operador: number;
@IsInt()
id_prestamo: number;
}

View File

@ -0,0 +1,6 @@
import { IsInt } from 'class-validator';
export class QuitarMultarDto {
@IsInt()
id_institucion_usuario: number;
}

View File

@ -22,6 +22,10 @@ export class MultasEquipoOutputDto {
@Expose() @Expose()
retraso; retraso;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
@Expose() @Expose()
@Type(() => OperadorMinOutputDto) @Type(() => OperadorMinOutputDto)
opeardorMulta; opeardorMulta;
@ -29,8 +33,4 @@ export class MultasEquipoOutputDto {
@Expose() @Expose()
@Type(() => PrestamoEquipoMinOutputDto) @Type(() => PrestamoEquipoMinOutputDto)
prestamo; prestamo;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
} }

View File

@ -22,6 +22,10 @@ export class MultasUsuarioOutputDto {
@Expose() @Expose()
retraso; retraso;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
@Expose() @Expose()
@Type(() => OperadorMinOutputDto) @Type(() => OperadorMinOutputDto)
opeardorMulta; opeardorMulta;
@ -29,8 +33,4 @@ export class MultasUsuarioOutputDto {
@Expose() @Expose()
@Type(() => PrestamoUsuarioMinOutputDto) @Type(() => PrestamoUsuarioMinOutputDto)
prestamo; prestamo;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
} }

View File

@ -22,6 +22,10 @@ export class MultasOutputDto {
@Expose() @Expose()
retraso; retraso;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
@Expose() @Expose()
@Type(() => OperadorMinOutputDto) @Type(() => OperadorMinOutputDto)
opeardorMulta; opeardorMulta;
@ -29,8 +33,4 @@ export class MultasOutputDto {
@Expose() @Expose()
@Type(() => PrestamoMinOutputDto) @Type(() => PrestamoMinOutputDto)
prestamo; prestamo;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
} }

View File

@ -1,10 +1,12 @@
import { Controller, Get, Query } from '@nestjs/common'; import { Body, Controller, Get, Post, Put, Query } from '@nestjs/common';
import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor'; import { Serealize } from '../interceptors/serialize.interceptor';
import { MultaService } from './multa.service'; import { MultaService } from './multa.service';
import { IdUsuarioDto } from '../dto/id-usuario.dto'; import { IdUsuarioDto } from '../dto/id-usuario.dto';
import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto'; import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto';
import { MultarDto } from './dto/input/multar.dto';
import { MultasDto } from './dto/input/multas.dto'; import { MultasDto } from './dto/input/multas.dto';
import { QuitarMultarDto } from './dto/input/quitar.dto';
import { MultasUsuarioDto } from './dto/input/multas-usuario.dto'; import { MultasUsuarioDto } from './dto/input/multas-usuario.dto';
import { MultasOutputDto } from './dto/output/multas.dto'; import { MultasOutputDto } from './dto/output/multas.dto';
import { MultasEquipoOutputDto } from './dto/output/multas-equipo.dto'; import { MultasEquipoOutputDto } from './dto/output/multas-equipo.dto';
@ -16,6 +18,31 @@ import { MultasUsuarioOutputDto } from './dto/output/multas-usuario.dto';
export class MultaController { export class MultaController {
constructor(private multaService: MultaService) {} constructor(private multaService: MultaService) {}
@Post()
@ApiOperation({ description: 'Endpoint utilizado para multar a un usuario.' })
@ApiBody({
description: 'Todas las vairales son obligatorias.',
examples: {
ejemplo: {
value: {
id_institucion_infraccion: 1,
id_operador: 1,
id_prestamo: 1,
descripcion: '',
},
},
},
})
multar(@Body() body: MultarDto) {
return this.multaService.create(
body.id_prestamo,
body.id_operador,
body.descripcion,
null,
body.id_institucion_infraccion,
);
}
@Serealize(MultasOutputDto) @Serealize(MultasOutputDto)
@Get() @Get()
@ApiOperation({ @ApiOperation({
@ -90,7 +117,8 @@ export class MultaController {
@Serealize(MultasMinOutputDto) @Serealize(MultasMinOutputDto)
@Get('multas-usuario-activas') @Get('multas-usuario-activas')
@ApiOperation({ @ApiOperation({
description: 'Endpoint que retorna todas las multas de un usuario que esten activas.', description:
'Endpoint que retorna todas las multas de un usuario que esten activas.',
}) })
@ApiQuery({ @ApiQuery({
description: 'Id del usuario.', description: 'Id del usuario.',
@ -101,6 +129,19 @@ export class MultaController {
return this.multaService.findMultasActivas(parseInt(query.id_usuario)); return this.multaService.findMultasActivas(parseInt(query.id_usuario));
} }
@Put()
@ApiOperation({
description:
'Endpoint que se encarga de quitar la multa de un alumno de cierta una.',
})
@ApiBody({
description: 'La variable id_institucion_usuario es obligatoria.',
examples: { example: { value: { id_institucion_usuario: 1 } } },
})
quitarMulta(@Body() body: QuitarMultarDto) {
return this.multaService.quitarMulta(body.id_institucion_usuario);
}
// @Get('reporte') // @Get('reporte')
// reporte() {} // reporte() {}
} }

View File

@ -138,20 +138,20 @@ export class MultaService {
const query = this.repository const query = this.repository
.createQueryBuilder('mu') .createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii') .innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('mu.opeardorMulta', 'om') .innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p') .innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('p.equipo', 'e') .innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('p.usuario', 'u') .innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('u.instituciones', 'is') .innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('is.institucionCarrera', 'ic') .innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.institucion', 'in') .innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('ic.carrera', 'ca') .innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n') .innerJoinAndSelect('ca.nivel', 'n')
.orderBy('i.institucion') .orderBy('i.institucion')
.addOrderBy('u.usuario') .addOrderBy('u.usuario')
@ -178,19 +178,19 @@ export class MultaService {
this.repository this.repository
.createQueryBuilder('mu') .createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii') .innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf') .innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('ii.institucion', 'i') .innerJoinAndSelect('ii.institucion', 'i')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu') .innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', { .innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', {
id_equipo: equipo.id_equipo, id_equipo: equipo.id_equipo,
}) })
.innerJoinAndSelect('p.usuario', 'u') .innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('u.instituciones', 'is') .innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('is.institucionCarrera', 'ic') .innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ic.carrera', 'ca') .innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n') .innerJoinAndSelect('ca.nivel', 'n')
.orderBy('mu.id_multa', 'DESC') .orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25) .skip((pagina - 1) * 25)
@ -204,19 +204,19 @@ export class MultaService {
this.repository this.repository
.createQueryBuilder('mu') .createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii') .innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf') .innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('ii.institucion', 'i') .innerJoinAndSelect('ii.institucion', 'i')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu') .innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.equipo', 'e') .innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('m.institucion', 'in')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', { .innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', {
id_usuario: usuario.id_usuario, id_usuario: usuario.id_usuario,
}) })
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('m.institucion', 'in')
.orderBy('mu.id_multa', 'DESC') .orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25) .skip((pagina - 1) * 25)
.take(25) .take(25)
@ -238,4 +238,36 @@ export class MultaService {
.getMany(), .getMany(),
); );
} }
async quitarMulta(id_institucion_usuario: number) {
const institucionUsuario = await this.institucionUsuarioService.findById(
id_institucion_usuario,
);
return this.repository
.createQueryBuilder('mu')
.innerJoin('mu.prestamo', 'p')
.innerJoin('p.usuario', 'u')
.innerJoin(
'u.instituciones',
'is',
'is.id_institucion_usuario = :id_institucion_usuario',
{
id_institucion_usuario: institucionUsuario.id_institucion_usuario,
},
)
.where('activo = 1')
.getOne()
.then((multa) => {
if (!multa)
throw new ConflictException(
'Este usuario no tiene una multa activa en esta institución.',
);
multa.activo = false;
institucionUsuario.multa = false;
return this.repository.save(multa);
})
.then((_) => this.institucionUsuarioService.update(institucionUsuario))
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
} }

View File

@ -109,7 +109,7 @@ export class OperadorController {
description: description:
'Todas las variables a excepción de id_operador son opcionales.', 'Todas las variables a excepción de id_operador son opcionales.',
examples: { examples: {
ejemplo: { value: { id_operador: 3, activo: true, password: '' } }, ejemplo: { value: { id_operador: 3, _activo: true, _password: '' } },
}, },
}) })
update(@Body() body: UpdateOperadorDto) { update(@Body() body: UpdateOperadorDto) {

View File

@ -1,6 +1,6 @@
import { Expose, Type } from 'class-transformer'; import { Expose, Type } from 'class-transformer';
import { UsuarioInstitucionCarreraOutputDto } from '../../../institucion-usuario/dto/output/usuario-institucion-carrera.dto';
import { TipoUsuarioOutputDto } from '../../../tipo-usuario/dto/output/tipo-usuario.dto'; import { TipoUsuarioOutputDto } from '../../../tipo-usuario/dto/output/tipo-usuario.dto';
import { UsuarioInstitucionCarreraOutputDto } from '../../../institucion-usuario/dto/output/usuario-institucion-carrera.dto';
export class UsuariosOutputDto { export class UsuariosOutputDto {
@Expose() @Expose()