casi listo pedir

This commit is contained in:
xXpuma99Xx
2022-06-08 23:37:29 -05:00
parent 0c8501a50b
commit f5ac823e08
14 changed files with 343 additions and 33 deletions
+1
View File
@@ -1,3 +1,4 @@
INSERT INTO nivel(nivel, clave) VALUES('PROFESOR', 'P');
INSERT INTO nivel(nivel, clave) VALUES('INICIACION UNIVERSITARIA', 'I');
INSERT INTO nivel(nivel, clave) VALUES('BACHILLERATO', 'B');
INSERT INTO nivel(nivel, clave) VALUES('TECNICO', 'T');
+1
View File
@@ -1,3 +1,4 @@
INSERT INTO programa(programa) VALUES ("Sin programa");
INSERT INTO programa(programa) VALUES ("Programación");
INSERT INTO programa(programa) VALUES ("Adobe");
INSERT INTO programa(programa) VALUES ("Autodesk");
+2
View File
@@ -174,6 +174,7 @@ INSERT INTO tipo_entrada(tipo_entrada) VALUES('Tipo c');
INSERT INTO tipo_entrada(tipo_entrada) VALUES('VGA');
INSERT INTO tipo_entrada(tipo_entrada) VALUES('Lightning');
INSERT INTO programa(programa) VALUES ("Sin programa");
INSERT INTO programa(programa) VALUES ("Programación");
INSERT INTO programa(programa) VALUES ("Adobe");
INSERT INTO programa(programa) VALUES ("Autodesk");
@@ -2034,3 +2035,4 @@ INSERT INTO institucion_dia(id_institucion, id_dia) VALUES(1000, 3);
INSERT INTO institucion_dia(id_institucion, id_dia) VALUES(1000, 4);
INSERT INTO institucion_dia(id_institucion, id_dia) VALUES(1000, 5);
@@ -1,4 +1,4 @@
import { Module } from '@nestjs/common';
import { forwardRef, Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { EquipoProgramaController } from './equipo-programa.controller';
import { EquipoProgramaService } from './equipo-programa.service';
@@ -8,7 +8,7 @@ import { EquipoModule } from '../equipo/equipo.module';
@Module({
imports: [
EquipoModule,
forwardRef(() => EquipoModule),
InstitucionProgramaModule,
TypeOrmModule.forFeature([EquipoPrograma]),
],
+40 -7
View File
@@ -1,4 +1,9 @@
import { ConflictException, Injectable } from '@nestjs/common';
import {
ConflictException,
forwardRef,
Inject,
Injectable,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Equipo } from 'src/equipo/entity/equipo.entity';
@@ -12,10 +17,24 @@ export class EquipoProgramaService {
constructor(
@InjectRepository(EquipoPrograma)
private repository: Repository<EquipoPrograma>,
@Inject(forwardRef(() => EquipoService))
private equipoService: EquipoService,
private institucionProgramaService: InstitucionProgramaService,
) {}
buscarEliminarEquipoSinPrograma(equipo: Equipo) {
return this.repository
.findOne({ equipo, programa: { id_programa: 1 } })
.then((existeEquipoPrograma) => {
if (existeEquipoPrograma) return this.delete(existeEquipoPrograma);
return existeEquipoPrograma;
});
}
countProgramasEquipo(equipo: Equipo) {
return this.repository.count({ equipo });
}
async create(id_equipo: number | Equipo, id_programa: number | Programa) {
const equipo =
typeof id_equipo === 'number'
@@ -27,7 +46,7 @@ export class EquipoProgramaService {
: id_programa;
return this.existeEquipoPrograma(equipo, programa)
.then(() =>
.then((_) =>
this.repository.save(this.repository.create({ equipo, programa })),
)
.then((equipoPrograma) => ({
@@ -36,10 +55,21 @@ export class EquipoProgramaService {
}));
}
delete(id_equipo_programa: number) {
return this.findById(id_equipo_programa).then((equipoPrograma) =>
this.repository.remove(equipoPrograma),
);
async delete(id_equipo_programa: number | EquipoPrograma) {
const equipoPrograma =
typeof id_equipo_programa === 'number'
? await this.findById(id_equipo_programa)
: id_equipo_programa;
if (typeof id_equipo_programa === 'number')
await this.countProgramasEquipo(equipoPrograma.equipo).then((n) => {
if (n === 1) {
if (equipoPrograma.programa.id_programa === 1)
throw new ConflictException('No se puede eliminar esta opción.');
this.create(equipoPrograma.equipo, 1);
}
});
return this.repository.remove(equipoPrograma);
}
existeEquipoPrograma(
@@ -60,7 +90,10 @@ export class EquipoProgramaService {
findById(id_equipo_programa: number) {
return this.repository
.findOne({ id_equipo_programa })
.findOne({
join: { alias: 'ep', innerJoinAndSelect: { e: 'ep.equipo' } },
where: { id_equipo_programa },
})
.then((equipoPrograma) => {
if (!equipoPrograma)
throw new ConflictException('No existe este equipo programa.');
+3 -1
View File
@@ -1,10 +1,11 @@
import { Module } from '@nestjs/common';
import { forwardRef, Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { EquipoController } from './equipo.controller';
import { EquipoService } from './equipo.service';
import { Equipo } from './entity/equipo.entity';
import { CarritoModule } from '../carrito/carrito.module';
import { InstitucionModule } from '../institucion/institucion.module';
import { EquipoProgramaModule } from '../equipo-programa/equipo-programa.module';
import { InstitucionProgramaModule } from '../institucion-programa/institucion-programa.module';
import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module';
import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/institucion-tipo-entrada.module';
@@ -14,6 +15,7 @@ import { StatusModule } from '../status/status.module';
@Module({
imports: [
CarritoModule,
forwardRef(() => EquipoProgramaModule),
InstitucionModule,
InstitucionProgramaModule,
InstitucionTipoCarritoModule,
+97 -4
View File
@@ -1,10 +1,20 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import {
forwardRef,
Inject,
Injectable,
NotFoundException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Equipo } from './entity/equipo.entity';
import { Institucion } from '../institucion/entity/institucion.entity';
import { Carrito } from '../carrito/entity/carrito.entity';
import { Modulo } from '../modulo/entity/modulo.entity';
import { Programa } from '../institucion-programa/entity/programa.entity';
import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity';
import { TipoEntrada } from '../institucion-tipo-entrada/entity/tipo-entrada.entity';
import { CarritoService } from '../carrito/carrito.service';
import { EquipoProgramaService } from '../equipo-programa/equipo-programa.service';
import { InstitucionService } from '../institucion/institucion.service';
import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service';
import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service';
@@ -17,6 +27,8 @@ export class EquipoService {
constructor(
@InjectRepository(Equipo) private repository: Repository<Equipo>,
private carritoService: CarritoService,
@Inject(forwardRef(() => EquipoProgramaService))
private equipoProgramaService: EquipoProgramaService,
private institucionService: InstitucionService,
private institucionProgramaService: InstitucionProgramaService,
private institucionTipoCarritoService: InstitucionTipoCarritoService,
@@ -33,7 +45,7 @@ export class EquipoService {
numero_inventario: string,
numero_serie: string,
) {
return this.repository.save(
const e = await this.repository.save(
this.repository.create({
carrito,
equipo,
@@ -44,6 +56,9 @@ export class EquipoService {
status: { id_status: 1 },
}),
);
await this.equipoProgramaService.create(e, 1);
return e;
}
async findAll(filtros: {
@@ -158,7 +173,84 @@ export class EquipoService {
});
}
async findEquipo(
findEquipo(
modulo: Modulo,
tipoCarrito: TipoCarrito,
programa?: Programa,
tipoEntrada?: TipoEntrada,
) {
const query = this.repository
.createQueryBuilder('e')
.innerJoinAndSelect('e.carrito', 'c', 'activo = 1')
.innerJoinAndSelect(
'c.modulo',
'm',
'm.id_modulo = :id_modulo AND m.activo = 1',
{
id_modulo: modulo.id_modulo,
},
)
.innerJoinAndSelect(
'c.tipoCarrito',
'tc',
'tc.id_tipo_carrito = :id_tipo_carrito',
{ id_tipo_carrito: tipoCarrito.id_tipo_carrito },
)
.innerJoinAndSelect('e.status', 's')
.innerJoinAndSelect('e.tiposEntradas', 'tes')
.innerJoinAndSelect('tes.tipoEntrada', 'te')
.innerJoinAndSelect('e.programas', 'ps')
.innerJoinAndSelect('ps.programa', 'p')
.where('e.id_status = 1 AND e.prestado = 0');
if (programa)
query.andWhere('ps.id_programa = :id_programa', {
id_programa: programa.id_programa,
});
else query.andWhere('ps.id_programa = 1');
if (tipoEntrada)
query.andWhere('tes.id_tipo_entrada = :id_tipo_entrada', {
id_tipo_entrada: tipoEntrada.id_tipo_entrada,
});
return query;
}
reseteo(
modulo: Modulo,
tipoCarrito: TipoCarrito,
programa?: Programa,
tipoEntrada?: TipoEntrada,
) {
return this.findEquipo(modulo, tipoCarrito, programa, tipoEntrada)
.getCount()
.then((n) => {
if (n === 0) {
const query = this.repository
.createQueryBuilder('e')
.innerJoinAndSelect('e.carrito', 'c', 'activo = 1')
.innerJoinAndSelect(
'c.modulo',
'm',
'm.id_modulo = :id_modulo AND m.activo = 1',
{
id_modulo: modulo.id_modulo,
},
)
.innerJoinAndSelect(
'c.tipoCarrito',
'tc',
'tc.id_tipo_carrito = :id_tipo_carrito',
{ id_tipo_carrito: tipoCarrito.id_tipo_carrito },
)
.innerJoinAndSelect('e.status', 's')
.andWhere('id_status = 1 AND prestado = 1');
return query.update().set({ prestado: false }).execute();
}
});
}
async findEquipoByEquipo(
id_carrito: number | Carrito,
equipo: string,
validarNoExiste = true,
@@ -181,8 +273,9 @@ export class EquipoService {
Object.assign(equipo, attrs);
return this.repository.save(equipo);
})
.then((_) => ({
.then((equipo) => ({
message: 'Se actualizó correctamente la información del equipo.',
equipo,
}));
}
}
@@ -0,0 +1,35 @@
import { IsNumberString, IsOptional, IsString } from 'class-validator';
export class PrestamoActivosDto {
activo: true;
@IsNumberString()
pagina: string;
@IsNumberString()
id_modulo: string;
@IsString()
@IsOptional()
carrito?: string;
@IsString()
@IsOptional()
equipo?: string;
@IsNumberString()
@IsOptional()
id_prestamo?: string;
@IsNumberString()
@IsOptional()
id_tipo_carrito?: string;
@IsNumberString()
@IsOptional()
id_tipo_usuario?: string;
@IsString()
@IsOptional()
usuario?: string;
}
+20
View File
@@ -0,0 +1,20 @@
import { IsInt, IsNumberString, IsOptional, IsString } from 'class-validator';
export class PrestamoPedirDto {
@IsInt()
id_modulo: number;
@IsInt()
id_tipo_carrito: number;
@IsInt()
id_usuario: number;
@IsInt()
@IsOptional()
id_tipo_entrada?: number;
@IsInt()
@IsOptional()
id_programa?: number;
}
+3 -3
View File
@@ -23,16 +23,16 @@ export class Prestamo {
@Column({ type: Boolean, nullable: false, default: false })
cancelado_usuario: boolean;
@Column({ type: Date, nullable: false })
@Column({ type: Date, nullable: true, default: null })
fecha_entrega: Date;
@Column({ type: Date, nullable: false })
fecha_inicio: Date;
@Column({ type: Date, nullable: false })
@Column({ type: Date, nullable: true, default: null })
hora_fin: Date;
@Column({ type: Date, nullable: false })
@Column({ type: Date, nullable: true, default: null })
hora_inicio: Date;
@Column({ type: Date, nullable: false })
+11 -2
View File
@@ -1,6 +1,7 @@
import { Controller, Get, Post, Put } from '@nestjs/common';
import { Body, Controller, Get, Post, Put } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { PrestamoService } from './prestamo.service';
import { PrestamoPedirDto } from './dto/prestamo-pedir.dto';
@Controller('prestamo')
@ApiTags('prestamo')
@@ -29,7 +30,15 @@ export class PrestamoController {
historialUsuario() {}
@Post()
pedir() {}
pedir(@Body() body: PrestamoPedirDto) {
return this.prestamoService.create(
body.id_usuario,
body.id_modulo,
body.id_tipo_carrito,
body.id_programa,
body.id_tipo_entrada,
);
}
@Get('prestamo-id-prestamo')
prestamoIdPrestamo() {}
+8
View File
@@ -7,8 +7,12 @@ import { CarritoModule } from '../carrito/carrito.module';
import { EquipoModule } from '../equipo/equipo.module';
import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionCarreraModule } from '../institucion-carrera/institucion-carrera.module';
import { InstitucionProgramaModule } from '../institucion-programa/institucion-programa.module';
import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module';
import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/institucion-tipo-entrada.module';
import { OperadorModule } from '../operador/operador.module';
import { ModuloModule } from '../modulo/modulo.module';
import { StatusModule } from '../status/status.module';
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
import { UsuarioModule } from '../usuario/usuario.module';
@Module({
@@ -17,8 +21,12 @@ import { UsuarioModule } from '../usuario/usuario.module';
EquipoModule,
InstitucionModule,
InstitucionCarreraModule,
InstitucionProgramaModule,
InstitucionTipoCarritoModule,
InstitucionTipoEntradaModule,
ModuloModule,
OperadorModule,
StatusModule,
TypeOrmModule.forFeature([Prestamo]),
TipoUsuarioModule,
UsuarioModule,
+115 -12
View File
@@ -1,8 +1,14 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import * as moment from 'moment';
import {
ConflictException,
Injectable,
NotFoundException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { FindOperator, Like, Repository } from 'typeorm';
import { Carrera } from '../institucion-carrera/entity/carrera.entity';
import { Modulo } from '../modulo/entity/modulo.entity';
import { Operador } from '../operador/entity/operador.entity';
import { Prestamo } from './entity/prestamo.entity';
import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity';
import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity';
@@ -11,7 +17,11 @@ import { EquipoService } from '../equipo/equipo.service';
import { InstitucionService } from '../institucion/institucion.service';
import { ModuloService } from '../modulo/modulo.service';
import { InstitucionCarreraService } from '../institucion-carrera/institucion-carrera.service';
import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service';
import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service';
import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service';
import { OperadorService } from '../operador/operador.service';
import { StatusService } from '../status/status.service';
import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
import { UsuarioService } from '../usuario/usuario.service';
@@ -22,26 +32,104 @@ export class PrestamoService {
private carritoService: CarritoService,
private equipoService: EquipoService,
private institucionService: InstitucionService,
private institucionTipoCarritoService: InstitucionTipoCarritoService,
private moduloService: ModuloService,
private institucionCarreraService: InstitucionCarreraService,
private institucionProgramaService: InstitucionProgramaService,
private institucionTipoCarritoService: InstitucionTipoCarritoService,
private institucionTipoEntradaService: InstitucionTipoEntradaService,
private moduloService: ModuloService,
private operadorService: OperadorService,
private statusService: StatusService,
private tipoUsuarioService: TipoUsuarioService,
private usuarioService: UsuarioService,
) {}
async create(
id_usuario: number,
id_modulo: number,
id_tipo_carrito: number,
id_programa?: number,
id_tipo_entrada?: number,
) {
const ahora = moment();
const usuario = await this.usuarioService.findById(id_usuario, true, true);
const modulo = await this.moduloService.findById(id_modulo);
const tipoCarrito =
await this.institucionTipoCarritoService.findTipoCarritoById(
id_tipo_carrito,
);
const programa = id_programa
? await this.institucionProgramaService.findProgramaById(id_programa)
: null;
const tipoEntrada = id_tipo_entrada
? await this.institucionTipoEntradaService.findTipoEntradaById(
id_tipo_entrada,
)
: null;
console.log(modulo);
return this.repository
.findOne({ activo: true, usuario })
.then((prestamo) => {
if (prestamo)
throw new ConflictException(
'Este usuario ya tiene un prestamo activo.',
);
return this.equipoService.reseteo(
modulo,
tipoCarrito,
programa,
tipoEntrada,
);
})
.then((_) =>
this.equipoService
.findEquipo(modulo, tipoCarrito, programa, tipoEntrada)
.getOne(),
)
.then(async (equipo) => {
if (!equipo)
throw new ConflictException(
'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitasdas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las caracteríasticas.',
);
equipo.status = await this.statusService.findById(2);
return this.equipoService.update(equipo);
})
.then(({ equipo }) =>
this.repository.save(
this.repository.create({
equipo,
usuario,
fecha_inicio: ahora.format(),
hora_max_recoger: ahora
.add(modulo.institucion.tiempo_recoger, 'm')
.format(),
}),
),
);
}
async findAll(filtros: {
id_modulo: string;
pagina: string;
activo?: string | boolean;
carrito?: string;
equipo?: string;
fechaFin?: string;
fechaInicio?: string;
id_carrera?: string;
id_institucion?: string;
id_modulo?: string;
id_operador_entrega?: string;
id_operador_regreso?: string;
id_tipo_carrito?: string;
id_tipo_usuario?: string;
id_prestamo?: string;
usuario?: string;
}) {
const busqueda: {
activo?: boolean;
fechaInicio?: Date;
fechaFin?: Date;
id_prestamo?: number;
equipo: {
equipo?: FindOperator<string>;
carrito: {
@@ -55,15 +143,14 @@ export class PrestamoService {
tipoUsuario?: TipoUsuario;
institucionCarrera: { carrera?: Carrera };
};
operadorEntrega?: Operador;
operadorRegreso?: Operador;
} = { equipo: { carrito: {} }, usuario: { institucionCarrera: {} } };
const carrera = filtros.id_carrera
? await this.institucionCarreraService.findCarreraByIdCarrera(
parseInt(filtros.id_carrera),
)
: null;
const institucion = filtros.id_institucion
? await this.institucionService.findById(parseInt(filtros.id_institucion))
: null;
const modulo = filtros.id_modulo
? await this.moduloService.findById(parseInt(filtros.id_modulo))
: null;
@@ -77,15 +164,31 @@ export class PrestamoService {
parseInt(filtros.id_tipo_usuario),
)
: null;
const operadorEntrega = filtros.id_operador_entrega
? await this.operadorService.findById(
parseInt(filtros.id_operador_entrega),
)
: null;
const operadorRegreso = filtros.id_operador_regreso
? await this.operadorService.findById(
parseInt(filtros.id_operador_regreso),
)
: null;
if (filtros.usuario)
busqueda.usuario.usuario = Like(`%${filtros.usuario}%`);
if (filtros.equipo) busqueda.equipo.equipo = Like(`%${filtros.equipo}%`);
if (filtros.activo) {
if (typeof filtros.activo === 'boolean') busqueda.activo = filtros.activo;
else busqueda.activo = filtros.activo === 'true';
}
if (filtros.carrito)
busqueda.equipo.carrito.carrito = Like(`%${filtros.carrito}%`);
if (filtros.equipo) busqueda.equipo.equipo = Like(`%${filtros.equipo}%`);
if (filtros.equipo) busqueda.id_prestamo = parseInt(filtros.id_prestamo);
if (filtros.usuario)
busqueda.usuario.usuario = Like(`%${filtros.usuario}%`);
if (carrera) busqueda.usuario.institucionCarrera.carrera = carrera;
if (modulo) busqueda.equipo.carrito.modulo = modulo;
if (institucion) busqueda.equipo.carrito.modulo.institucion = institucion;
if (operadorEntrega) busqueda.operadorEntrega = operadorEntrega;
if (operadorRegreso) busqueda.operadorRegreso = operadorRegreso;
if (tipoCarrito) busqueda.equipo.carrito.tipoCarrito = tipoCarrito;
if (tipoUsuario) busqueda.usuario.tipoUsuario = tipoUsuario;
return this.repository.findAndCount({
+5 -2
View File
@@ -102,7 +102,7 @@ export class UploadFileService {
)
: null;
let equipo = carrito
? await this.equipoService.findEquipo(
? await this.equipoService.findEquipoByEquipo(
carrito,
equipos[i].equipo,
false,
@@ -222,7 +222,10 @@ export class UploadFileService {
continue;
}
await this.equipoProgramaService
.create(equipo, programa)
.buscarEliminarEquipoSinPrograma(equipo)
.then((_) =>
this.equipoProgramaService.create(equipo, programa),
)
.then((res) => {
equipo.programas.push(res.equipoPrograma);
mensajes.push(res.message);