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: {
ejemplo: {
value: {
id_modulo: 1,
operador: '',
password: '',
id_modulo: 1,
},
},
},

View File

@ -44,9 +44,9 @@ export class AuthService {
this.validarLogin(operador, password);
const payload: JwtPayload = {
id_modulo: modulo.id_modulo,
id_operador: operador.id_operador,
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
id_modulo: modulo.id_modulo,
};
return { operador, token: this.jwtService.sign(payload) };
@ -62,7 +62,7 @@ export class AuthService {
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 {
constructor(private configService: ConfigService) {}
comparar(password: string, passwordDb: string) {
return bcrypt.compareSync(password, passwordDb);
}
encriptar(password: string) {
const salt = bcrypt.genSaltSync(
parseInt(this.configService.get<string>('SALT_ROUNDS')),
@ -13,8 +17,4 @@ export class BcryptService {
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 { Serealize } from '../interceptors/serialize.interceptor';
import { CarreraProgramaService } from './carrera-programa.service';
@ -13,9 +22,10 @@ export class CarreraProgramaController {
constructor(private carreraProgramaService: CarreraProgramaService) {}
@Post()
// @UseGuards(AuthGuard('jwt'))
@ApiOperation({
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({
description: 'Ambas variables son obligatorios.',
@ -31,6 +41,7 @@ export class CarreraProgramaController {
}
@Delete()
// @UseGuards(AuthGuard('jwt'))
@ApiOperation({
description:
'Endpoint que borra la asociación entre una carrera y un programa.',

View File

@ -50,6 +50,18 @@ export class CarritoController {
name: 'pagina',
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({
description: 'Id de la institución.',
name: 'id_institucion',
@ -68,18 +80,6 @@ export class CarritoController {
type: 'string',
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) {
return this.carritoService.findAll(query);
}
@ -93,7 +93,7 @@ export class CarritoController {
description: 'Todas las variables son obligatorias.',
examples: {
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: {
id_carrito: 1,
_activo: true,
_carrito: '',
_id_modulo: 1,
_id_tipo_carrito: 1,
_carrito: '',
_marca: '',
_modelo: '',
},
@ -129,8 +129,12 @@ export class CarritoController {
},
})
update(@Body() body: UpdateCarritoDto) {
const data = { ...body };
delete data.id_modulo;
delete data.id_tipo_carrito;
return this.carritoService.update(
body,
data,
body.id_modulo,
body.id_tipo_carrito,
);

View File

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

View File

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

View File

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

View File

@ -3,9 +3,9 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Equipo } from 'src/equipo/entity/equipo.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 { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service';
import { TipoEntrada } from 'src/institucion-tipo-entrada/entity/tipo-entrada.entity';
@Injectable()
export class EquipoTipoEntradaService {

View File

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

View File

@ -1,6 +1,6 @@
import { Body, Controller, Get, Put, Query, UseGuards } from '@nestjs/common';
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 { EquipoService } from './equipo.service';
import { EquipoDto } from './dto/input/equipo.dto';
@ -54,41 +54,49 @@ export class EquipoController {
description: 'Carrito que se quiere usar como filtro.',
name: 'carrito',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Equipo que se quiere usar como filtro.',
name: 'equipo',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Id de la institución que se quiere usar como filtro.',
name: 'id_institucion',
type: 'string',
})
@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',
required: false,
})
@ApiQuery({
description: 'Id del módulo que se quiere usar como filtro.',
name: 'id_modulo',
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({
description: 'Id del tipo de entrada que se quiere usar como filtro.',
name: 'id_tipo_entrada',
type: 'string',
required: false,
})
equipos(@Query() query: EquiposDto) {
return this.equipoService.findAll(query);
@ -96,6 +104,28 @@ export class EquipoController {
@Put()
// @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) {
const data = { ...body };

View File

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

View File

@ -9,7 +9,7 @@ import {
UseGuards,
} from '@nestjs/common';
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 { HoraExcepcionService } from './hora-excepcion.service';
import { CreateHoraExcepcionDto } from './dto/input/create.dto';
@ -68,6 +68,10 @@ export class HoraExcepcionController {
description:
'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) {
return this.horaExcepcionService.findAllByIdInstitucionDia(
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.',
examples: {
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>) {
if (!attrs.hora_inicio && !attrs.hora_fin)
throw new ConflictException('No se mandó nada para actualizar.');
return this.findById(attrs.id_hora_excepcion)
.then(async (horaExecpcion) => {
if (

View File

@ -43,14 +43,14 @@ export class InstitucionCarreraService {
id_institucion: number | Institucion,
id_carrera: number | Carrera,
) {
const institucion =
typeof id_institucion === 'number'
? await this.institucionService.findById(id_institucion)
: id_institucion;
const carrera =
typeof id_carrera === 'number'
? await this.findCarreraByIdCarrera(id_carrera)
: id_carrera;
const institucion =
typeof id_institucion === 'number'
? await this.institucionService.findById(id_institucion)
: id_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 { InstitucionDia } from './entity/institucion-dia.entity';
import { InstitucionService } from '../institucion/institucion.service';
@Injectable()
export class InstitucionDiaService {
constructor(

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -23,6 +23,11 @@ export class MotivoController {
name: 'id_equipo',
type: 'string',
})
@ApiQuery({
description: 'Página en la que se encuentra el usuario.',
name: 'pagina',
type: 'string',
})
get(@Query() query: IdEquipoPaginaDto) {
return this.motivoService.findAllByIdEquipo(
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()
retraso;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
@Expose()
@Type(() => OperadorMinOutputDto)
opeardorMulta;
@ -29,8 +33,4 @@ export class MultasEquipoOutputDto {
@Expose()
@Type(() => PrestamoEquipoMinOutputDto)
prestamo;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
}

View File

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

View File

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

View File

@ -1,10 +1,12 @@
import { Controller, Get, Query } from '@nestjs/common';
import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Body, Controller, Get, Post, Put, Query } from '@nestjs/common';
import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { MultaService } from './multa.service';
import { IdUsuarioDto } from '../dto/id-usuario.dto';
import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto';
import { MultarDto } from './dto/input/multar.dto';
import { MultasDto } from './dto/input/multas.dto';
import { QuitarMultarDto } from './dto/input/quitar.dto';
import { MultasUsuarioDto } from './dto/input/multas-usuario.dto';
import { MultasOutputDto } from './dto/output/multas.dto';
import { MultasEquipoOutputDto } from './dto/output/multas-equipo.dto';
@ -16,6 +18,31 @@ import { MultasUsuarioOutputDto } from './dto/output/multas-usuario.dto';
export class MultaController {
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)
@Get()
@ApiOperation({
@ -90,7 +117,8 @@ export class MultaController {
@Serealize(MultasMinOutputDto)
@Get('multas-usuario-activas')
@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({
description: 'Id del usuario.',
@ -101,6 +129,19 @@ export class MultaController {
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')
// reporte() {}
}

View File

@ -138,20 +138,20 @@ export class MultaService {
const query = this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.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('e.carrito', 'c')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('i.institucion')
.addOrderBy('u.usuario')
@ -178,19 +178,19 @@ export class MultaService {
this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('ii.institucion', 'i')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', {
id_equipo: equipo.id_equipo,
})
.innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25)
@ -204,19 +204,19 @@ export class MultaService {
this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('ii.institucion', 'i')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.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', {
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')
.skip((pagina - 1) * 25)
.take(25)
@ -238,4 +238,36 @@ export class MultaService {
.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:
'Todas las variables a excepción de id_operador son opcionales.',
examples: {
ejemplo: { value: { id_operador: 3, activo: true, password: '' } },
ejemplo: { value: { id_operador: 3, _activo: true, _password: '' } },
},
})
update(@Body() body: UpdateOperadorDto) {

View File

@ -1,6 +1,6 @@
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 { UsuarioInstitucionCarreraOutputDto } from '../../../institucion-usuario/dto/output/usuario-institucion-carrera.dto';
export class UsuariosOutputDto {
@Expose()