diff --git a/src/carrito/carrito.service.ts b/src/carrito/carrito.service.ts index a4d90a3..a07f196 100644 --- a/src/carrito/carrito.service.ts +++ b/src/carrito/carrito.service.ts @@ -27,7 +27,7 @@ export class CarritoService { ) { const modulo = await this.moduloService.findById(id_modulo); const tipoCarrito = - await this.institucionTipoCarritoService.findTipoCaritoById( + await this.institucionTipoCarritoService.findTipoCarritoById( id_tipo_carrito, ); @@ -49,6 +49,22 @@ export class CarritoService { })); } + async existeCarrito(id_modulo: number | Modulo, carrito: string) { + const modulo = + typeof id_modulo === 'number' + ? await this.moduloService.findById(id_modulo) + : id_modulo; + + return this.repository + .findOne({ modulo, carrito }) + .then((existeCarrito) => { + if (existeCarrito) + throw new ConflictException( + 'Ya existe un carrito con este nombre, intenta con otro.', + ); + }); + } + findById(id_carrito: number) { return this.repository.findOne({ id_carrito }).then((carrito) => { if (!carrito) throw new NotFoundException('No existe este carrito.'); @@ -88,19 +104,29 @@ export class CarritoService { }); } - async existeCarrito(id_modulo: number | Modulo, carrito: string) { + async findCarrito( + id_modulo: number | Modulo, + id_tipo_carrito: number | TipoCarrito, + carrito: string, + validarNoExiste = true, + ) { const modulo = typeof id_modulo === 'number' ? await this.moduloService.findById(id_modulo) : id_modulo; + const tipoCarrito = + typeof id_tipo_carrito === 'number' + ? await this.institucionTipoCarritoService.findTipoCarritoById( + id_tipo_carrito, + ) + : id_tipo_carrito; return this.repository - .findOne({ modulo, carrito }) - .then((existeCarrito) => { - if (existeCarrito) - throw new ConflictException( - 'Ya existe un carrito con este nombre, intenta con otro.', - ); + .findOne({ modulo, carrito, tipoCarrito }) + .then((carrito) => { + if (validarNoExiste && !carrito) + throw new ConflictException('No existe este carrito.'); + return carrito; }); } @@ -119,7 +145,7 @@ export class CarritoService { ? await this.moduloService.findById(attrs.id_modulo) : null; const tipoCarrito = attrs.id_modulo - ? await this.institucionTipoCarritoService.findTipoCaritoById( + ? await this.institucionTipoCarritoService.findTipoCarritoById( attrs.id_tipo_carrito, ) : null; diff --git a/src/equipo/equipo.module.ts b/src/equipo/equipo.module.ts index 80cb537..fc08967 100644 --- a/src/equipo/equipo.module.ts +++ b/src/equipo/equipo.module.ts @@ -5,6 +5,8 @@ import { EquipoService } from './equipo.service'; import { Equipo } from './entity/equipo.entity'; import { EquipoPrograma } from './entity/equipo-programa.entity'; import { EquipoTipoEntrada } from './entity/equipo-tipo-entrada.entity'; +import { CarritoModule } from '../carrito/carrito.module'; +import { InstitucionModule } from '../institucion/institucion.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'; @@ -13,6 +15,8 @@ import { StatusModule } from '../status/status.module'; @Module({ imports: [ + CarritoModule, + InstitucionModule, InstitucionProgramaModule, InstitucionTipoCarritoModule, InstitucionTipoEntradaModule, diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index c3aea77..3c5c535 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -4,11 +4,15 @@ import { Repository } from 'typeorm'; import { Equipo } from './entity/equipo.entity'; import { EquipoPrograma } from '../equipo/entity/equipo-programa.entity'; import { EquipoTipoEntrada } from '../equipo/entity/equipo-tipo-entrada.entity'; -import { InstitucionProgramaService } from 'src/institucion-programa/institucion-programa.service'; +import { CarritoService } from '../carrito/carrito.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'; -import { InstitucionTipoEntradaService } from 'src/institucion-tipo-entrada/institucion-tipo-entrada.service'; +import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service'; import { ModuloService } from '../modulo/modulo.service'; -import { StatusService } from 'src/status/status.service'; +import { StatusService } from '../status/status.service'; +import { Institucion } from '../institucion/entity/institucion.entity'; +import { Carrito } from '../carrito/entity/carrito.entity'; @Injectable() export class EquipoService { @@ -18,6 +22,8 @@ export class EquipoService { private equipoProgramaRepository: Repository, @InjectRepository(EquipoTipoEntrada) private equipoTipoEntradaRepository: Repository, + private carritoService: CarritoService, + private institucionService: InstitucionService, private institucionProgramaService: InstitucionProgramaService, private institucionTipoCarritoService: InstitucionTipoCarritoService, private institucionTipoEntradaService: InstitucionTipoEntradaService, @@ -25,7 +31,25 @@ export class EquipoService { private statusService: StatusService, ) {} - async create() {} + async create( + carrito: Carrito, + equipo: string, + marca: string, + modelo: string, + numero_inventario: string, + numero_serie: string, + ) { + return this.equipoRepository.save( + this.equipoRepository.create({ + carrito, + equipo, + marca, + modelo, + numero_inventario, + numero_serie, + }), + ); + } async findAll(filtros: { pagina: string; @@ -46,7 +70,7 @@ export class EquipoService { ) : null; const tipoCarrito = filtros.id_tipo_carrito - ? await this.institucionTipoCarritoService.findTipoCaritoById( + ? await this.institucionTipoCarritoService.findTipoCarritoById( parseInt(filtros.id_tipo_carrito), ) : null; @@ -110,6 +134,52 @@ export class EquipoService { }); } + async findByNumeroInventario( + id_institucion: number | Institucion, + numero_inventario: string, + validarNoExiste = true, + ) { + const institucion = + typeof id_institucion === 'number' + ? await this.institucionService.findById(id_institucion) + : id_institucion; + + return this.equipoRepository + .findOne({ + join: { + alias: 'e', + innerJoinAndSelect: { + c: 'e.carrito', + m: 'c.modulo', + i: 'm.institucion', + }, + }, + where: { numero_inventario, carrito: { modulo: { institucion } } }, + }) + .then((equipo) => { + if (validarNoExiste && !equipo) + throw new NotFoundException('No existe este equipo.'); + return equipo; + }); + } + + async findEquipo( + id_carrito: number | Carrito, + equipo: string, + validarNoExiste = true, + ) { + const carrito = + typeof id_carrito === 'number' + ? await this.carritoService.findById(id_carrito) + : id_carrito; + + return this.equipoRepository.findOne({ carrito, equipo }).then((equipo) => { + if (validarNoExiste && !equipo) + throw new NotFoundException('No existe este equipo.'); + return equipo; + }); + } + update(attrs: Partial) { return this.findById(attrs.id_equipo) .then((equipo) => { diff --git a/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts b/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts index caa7c8b..249945e 100644 --- a/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts +++ b/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts @@ -72,20 +72,6 @@ export class InstitucionTipoCarritoService { return this.findAllByIdInstitucion(id_institucion, true); } - findTipoCarritoById(id_tipo_carrito) { - return this.repositoryTipoCarrito - .findOne({ - id_tipo_carrito, - }) - .then((institucionTipoCarrito) => { - if (!institucionTipoCarrito) - throw new NotFoundException( - 'No existe esta institucion tipo carrito.', - ); - return institucionTipoCarrito; - }); - } - findInstitucionTipoCarritoById(id_institucion_tipo_carrito) { return this.repositoryInstitucionTipoCarrito .findOne({ @@ -100,7 +86,7 @@ export class InstitucionTipoCarritoService { }); } - findTipoCaritoById(id_tipo_carrito: number) { + findTipoCarritoById(id_tipo_carrito: number) { return this.repositoryTipoCarrito .findOne({ id_tipo_carrito }) .then((tipoCarrito) => { @@ -110,6 +96,16 @@ export class InstitucionTipoCarritoService { }); } + findTipoCarritoByTipoCarrito(tipo_carrito: string, validarNoExiste = true) { + return this.repositoryTipoCarrito + .findOne({ tipo_carrito }) + .then((tipoCarrito) => { + if (validarNoExiste && !tipoCarrito) + throw new NotFoundException('No existe este tipo carrito.'); + return tipoCarrito; + }); + } + update(attrs: Partial) { return this.findInstitucionTipoCarritoById( attrs.id_institucion_tipo_carrito, diff --git a/src/modulo/modulo.service.ts b/src/modulo/modulo.service.ts index 40d07a1..1bf5c9a 100644 --- a/src/modulo/modulo.service.ts +++ b/src/modulo/modulo.service.ts @@ -60,6 +60,23 @@ export class ModuloService { }); } + async findModulo( + id_institucion: number | Institucion, + modulo: string, + validarNoExiste = true, + ) { + const institucion = + typeof id_institucion === 'number' + ? await this.institucionService.findById(id_institucion) + : id_institucion; + + return this.repository.findOne({ institucion, modulo }).then((modulo) => { + if (validarNoExiste && !modulo) + throw new ConflictException('No existe este módulo.'); + return modulo; + }); + } + update(attrs: Partial) { return this.findById(attrs.id_modulo) .then(async (modulo) => { diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 67d5a76..af240ac 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -68,7 +68,7 @@ export class PrestamoService { ? await this.moduloService.findById(parseInt(filtros.id_modulo)) : null; const tipoCarrito = filtros.id_tipo_carrito - ? await this.institucionTipoCarritoService.findTipoCaritoById( + ? await this.institucionTipoCarritoService.findTipoCarritoById( parseInt(filtros.id_tipo_carrito), ) : null; diff --git a/src/upload-file/dto/upload-file-carga-masiva-equipo.dto.ts b/src/upload-file/dto/upload-file-carga-masiva-equipo.dto.ts index 34f768b..a222d2a 100644 --- a/src/upload-file/dto/upload-file-carga-masiva-equipo.dto.ts +++ b/src/upload-file/dto/upload-file-carga-masiva-equipo.dto.ts @@ -1,10 +1,21 @@ export class UploadFileCargaMasivaEquipoDto { - modulo: number; - carrito: number; - tipo: string; - equipo: string; - numero_inventario: string; - numero_serie: string; - entradas: string; - programas?: string + carrito: string; + + entradas: string; + + equipo: string; + + marca: string; + + modelo: string; + + modulo: string; + + numero_inventario: string; + + numero_serie: string; + + tipo: string; + + programas?: string; } diff --git a/src/upload-file/dto/upload-file-equipo.ts b/src/upload-file/dto/upload-file-equipo.ts deleted file mode 100644 index 5fd494d..0000000 --- a/src/upload-file/dto/upload-file-equipo.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IsNumber, IsNumberString } from 'class-validator'; - -export class UploadFileEquipo { - @IsNumberString() - id_carrito: string; - - @IsNumberString() - id_programa: string; - - @IsNumberString() - id_status: string; -} diff --git a/src/upload-file/upload-file.controller.ts b/src/upload-file/upload-file.controller.ts index d5d891f..5b3e85d 100644 --- a/src/upload-file/upload-file.controller.ts +++ b/src/upload-file/upload-file.controller.ts @@ -12,7 +12,6 @@ import { FileInterceptor } from '@nestjs/platform-express'; import { ApiTags } from '@nestjs/swagger'; import { UploadFileService } from './upload-file.service'; import { IdInstitucionDto } from '../dto/id-institucion.dto'; -import { UploadFileEquipo } from './dto/upload-file-equipo'; @Controller('upload-file') @ApiTags('upload-file') @@ -23,13 +22,11 @@ export class UploadFileController { @UseInterceptors(FileInterceptor('csv')) cargaMasivaEquipos( @UploadedFile() file: Express.Multer.File, - @Query() query: UploadFileEquipo, + @Query() query: IdInstitucionDto, ) { return this.uploadFileService.createEquipos( file, - parseInt(query.id_carrito), - parseInt(query.id_programa), - parseInt(query.id_status), + parseInt(query.id_institucion), ); } diff --git a/src/upload-file/upload-file.module.ts b/src/upload-file/upload-file.module.ts index 6c0a8de..e33469b 100644 --- a/src/upload-file/upload-file.module.ts +++ b/src/upload-file/upload-file.module.ts @@ -7,6 +7,8 @@ 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 { ModuloModule } from 'src/modulo/modulo.module'; import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module'; import { UsuarioModule } from '../usuario/usuario.module'; @@ -17,6 +19,8 @@ import { UsuarioModule } from '../usuario/usuario.module'; InstitucionModule, InstitucionCarreraModule, InstitucionProgramaModule, + InstitucionTipoCarritoModule, + ModuloModule, MulterModule.register({ dest: './upload', fileFilter: (req, file, cb) => { diff --git a/src/upload-file/upload-file.service.ts b/src/upload-file/upload-file.service.ts index 6d425ff..03e1cc8 100644 --- a/src/upload-file/upload-file.service.ts +++ b/src/upload-file/upload-file.service.ts @@ -4,41 +4,42 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { Institucion } from '../institucion/entity/institucion.entity'; import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity'; import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity'; +import { Usuario } from '../usuario/entity/usuario.entity'; +import { CarritoService } from '../carrito/carrito.service'; import { EquipoService } from '../equipo/equipo.service'; import { InstitucionService } from '../institucion/institucion.service'; import { InstitucionCarreraService } from '../institucion-carrera/institucion-carrera.service'; -import { CarritoService } from '../carrito/carrito.service'; +import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service'; +import { InstitucionTipoCarritoService } from 'src/institucion-tipo-carrito/institucion-tipo-carrito.service'; +import { ModuloService } from 'src/modulo/modulo.service'; import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service'; import { UsuarioService } from '../usuario/usuario.service'; -import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service'; import { UploadFileCargaMasivaUsuarioDto } from './dto/upload-file-carga-masiva-usuario.dto'; import { UploadFileCargaMasivaEquipoDto } from './dto/upload-file-carga-masiva-equipo.dto'; -import { Usuario } from 'src/usuario/entity/usuario.entity'; +import { Equipo } from '../equipo/entity/equipo.entity'; @Injectable() export class UploadFileService { constructor( + private carritoService: CarritoService, private equipoService: EquipoService, private institucionService: InstitucionService, private institucionCarreraService: InstitucionCarreraService, - private carritoService: CarritoService, + private institucionProgramaService: InstitucionProgramaService, + private institucionTipoCarritoService: InstitucionTipoCarritoService, + private moduloService: ModuloService, private tipoUsuarioService: TipoUsuarioService, private usuarioService: UsuarioService, - private institucionProgramaService: InstitucionProgramaService, ) {} - //programa y status - async createEquipos( - file: Express.Multer.File, - id_carrito: number, - id_programa: number, - id_status: number, - ) { - const path = `${file.destination}/${file.fieldname}`; - const carrito = await this.carritoService.findById(id_carrito); - const errores: string[] = []; - if (!file) - throw new BadRequestException('No se mando el archivo de equipos.'); + async createEquipos(file: Express.Multer.File, id_institucion: number) { + const path = `${file.destination}/${file.filename}`; + const institucion = await this.institucionService.findById(id_institucion); + const errores: string[] = []; + const mensajes: string[] = []; + const equiposNuevos: Equipo[] = []; + + if (!file) throw new BadRequestException('No se mando ningún archivo.'); return csvtojson() .fromFile(path) .then(async (equipos: [UploadFileCargaMasivaEquipoDto]) => { @@ -46,40 +47,118 @@ export class UploadFileService { let error = this.errorBase(i); if ( - !equipos[i].modulo || !equipos[i].carrito || - !equipos[i].tipo || + !equipos[i].entradas || !equipos[i].equipo || + !equipos[i].marca || + !equipos[i].modelo || + !equipos[i].modulo || !equipos[i].numero_inventario || !equipos[i].numero_serie || - !equipos[i].entradas || - !equipos[i].programas + !equipos[i].tipo ) { - if (!equipos[i].modulo) error += 'falta el campo de modulo'; - if (error != this.errorBase(i)) error += ','; if (!equipos[i].carrito) error += ' falta del campo carrito'; if (error != this.errorBase(i)) error += ','; - if (!equipos[i].tipo) - error += ' falta del campo tipo (tipo de equipo)'; + if (!equipos[i].entradas) error += ' falta del campo entradas'; if (error != this.errorBase(i)) error += ','; if (!equipos[i].equipo) error += ' falta del campo equipo'; if (error != this.errorBase(i)) error += ','; + if (!equipos[i].marca) error += ' falta del campo marca'; + if (error != this.errorBase(i)) error += ','; + if (!equipos[i].modelo) error += ' falta del campo modelo'; + if (error != this.errorBase(i)) error += ','; + if (!equipos[i].modulo) error += ' falta del campo modulo'; + if (error != this.errorBase(i)) error += ','; if (!equipos[i].numero_inventario) - error += ' falta del campo número de inventario'; + error += ' falta del campo numero_inventario'; if (error != this.errorBase(i)) error += ','; if (!equipos[i].numero_serie) - error += ' falta del campo número de serie'; + error += ' falta del campo numero_serie'; if (error != this.errorBase(i)) error += ','; - if (!equipos[i].entradas) error += ' falta del campo entradas'; - errores.push(`${error}.`); + if (!equipos[i].tipo) error += ' falta del campo tipo'; + errores.push(error + '.'); continue; } - const programa = - await this.institucionProgramaService.findProgramaByPrograma( - equipos[i].programas, + const tipoCarrito = + await this.institucionTipoCarritoService.findTipoCarritoByTipoCarrito( + equipos[i].tipo, + false, ); + const modulo = await this.moduloService.findModulo( + institucion, + equipos[i].modulo, + false, + ); + const carrito = + tipoCarrito && modulo + ? await this.carritoService.findCarrito( + modulo, + tipoCarrito, + equipos[i].modulo, + false, + ) + : null; + let equipo = carrito + ? await this.equipoService.findEquipo( + carrito, + equipos[i].equipo, + false, + ) + : null; + + if (!tipoCarrito || !modulo || !carrito) { + if (!tipoCarrito) error += ' no existe este tipo de carrito.'; + if (!modulo) error += ' no existe este módulo.'; + if (!carrito) error += ' no existe este carrito.'; + continue; + } + + if (equipo) { + // if ( + // equipo.numero_inventario != equipos[i].numero_inventario || + // equipo.numero_serie != equipos[i].numero_serie + // ) { + // if (equipo.numero_inventario != equipos[i].numero_inventario) + // error += ' '; + // if (error != this.errorBase(i)) error += ','; + // if (equipo.numero_serie != equipos[i].numero_serie) + // errores.push(error + '.'); + // continue; + // } + } else { + equipo = await this.equipoService.findByNumeroInventario( + institucion, + equipos[i].numero_inventario, + false, + ); + if (equipo) { + error += ' ya existe un equipo con ese número de inventario.'; + continue; + } + await this.equipoService + .create( + carrito, + equipos[i].equipo, + equipos[i].marca, + equipos[i].modelo, + equipos[i].numero_inventario, + equipos[i].numero_serie, + ) + .then((equipo) => { + equiposNuevos.push(equipo); + }); + } } + return { + response: { + message: 'Se subió y cargó correctamente tu archivo csv.', + mensajes, + equiposNuevos, + errores, + }, + path, + }; }); }