mejoras
This commit is contained in:
parent
755db28c93
commit
ae98fde192
@ -43,9 +43,9 @@ export class AuthController {
|
||||
examples: {
|
||||
ejemplo: {
|
||||
value: {
|
||||
id_modulo: 1,
|
||||
operador: '',
|
||||
password: '',
|
||||
id_modulo: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -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 };
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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.',
|
||||
|
@ -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,
|
||||
);
|
||||
|
@ -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,
|
||||
|
@ -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,17 +172,17 @@ export class CarritoService {
|
||||
id_modulo?: 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)
|
||||
.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)
|
||||
await this.existeCarrito(
|
||||
modulo ? modulo : carrito.modulo,
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 };
|
||||
|
||||
|
@ -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,
|
||||
) {
|
||||
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)
|
||||
.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)
|
||||
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);
|
||||
|
@ -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: '' },
|
||||
},
|
||||
},
|
||||
})
|
||||
|
@ -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 (
|
||||
|
@ -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 });
|
||||
}
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
})
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
import {
|
||||
UseInterceptors,
|
||||
NestInterceptor,
|
||||
ExecutionContext,
|
||||
CallHandler,
|
||||
ExecutionContext,
|
||||
NestInterceptor,
|
||||
UseInterceptors,
|
||||
} from '@nestjs/common';
|
||||
import { Observable } from 'rxjs';
|
||||
import { map } from 'rxjs/operators';
|
||||
|
@ -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) {
|
||||
|
@ -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),
|
||||
|
15
src/multa/dto/input/multar.dto.ts
Normal file
15
src/multa/dto/input/multar.dto.ts
Normal 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;
|
||||
}
|
6
src/multa/dto/input/quitar.dto.ts
Normal file
6
src/multa/dto/input/quitar.dto.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { IsInt } from 'class-validator';
|
||||
|
||||
export class QuitarMultarDto {
|
||||
@IsInt()
|
||||
id_institucion_usuario: number;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {}
|
||||
}
|
||||
|
@ -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.' }));
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user