diff --git a/src/equipo/entities/equipo.entity.ts b/src/equipo/entities/equipo.entity.ts index 919eb01..136a857 100644 --- a/src/equipo/entities/equipo.entity.ts +++ b/src/equipo/entities/equipo.entity.ts @@ -9,12 +9,11 @@ import { Adscripcion, Estado, Marca, Procesador, SistemaOperativo, TipoEquipo, U import { Movimiento } from 'src/movimiento/entities/movimiento.entity'; - @Entity() export class Equipo { @PrimaryGeneratedColumn() id_equipo: number; - + //checar bien aqui si estoy bien @Column({ length: 100, nullable: true }) inventario: string; @@ -55,11 +54,13 @@ export class Equipo { @ManyToOne(() => Marca, (marca) => marca.equipo) marca: Marca; - @OneToMany(() => Equipo, (equipo) => equipo.marca) + @OneToMany(() => Equipo, (equipo) => equipo.marca) equipo: Equipo[]; + + @OneToMany(() => Movimiento, (mov) => mov.equipo) + movimientos: Movimiento[]; - @OneToMany(()=> Movimiento, movimiento=>movimiento.id_movimiento) - movimiento:Movimiento[]; + } diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index bc50a98..9a891e7 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -1,12 +1,21 @@ -import { Controller, Body, Patch, Param, ParseIntPipe, UseGuards } from '@nestjs/common'; + +import { Controller, Body, Patch, Param, ParseIntPipe, UseGuards,Get, Query } from '@nestjs/common'; import { EquipoService } from './equipo.service'; import { UpdateEquipoDto } from './dto/update-equipo.dto'; import { AuthGuard } from '@nestjs/passport'; -@Controller('equipo') +@Controller('equipos') export class EquipoController { constructor(private readonly equipoService: EquipoService) {} + @Get('buscar') + async buscarEquipos( + @Query() filtros: any, + @Query('page') page: number = 1, + @Query('limit') limit: number = 10, + ) { + return this.equipoService.buscarEquipos(filtros, +page, +limit); + } @UseGuards(AuthGuard("jwt")) @Patch("update/:id") update(@Param('id', ParseIntPipe) id:number, @Body() equipoNuevo: UpdateEquipoDto) { diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index 21b09a4..25e3bb4 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -1,16 +1,90 @@ import { Injectable } from '@nestjs/common'; -import { UpdateEquipoDto } from './dto/update-equipo.dto'; import { InjectRepository } from '@nestjs/typeorm'; -import { Equipo } from './entities/equipo.entity'; import { Repository } from 'typeorm'; +import { Equipo } from './entities/equipo.entity'; +import { UpdateEquipoDto } from './dto/update-equipo.dto' @Injectable() export class EquipoService { constructor( @InjectRepository(Equipo) - private readonly equipoRepository: Repository - ){} - async updateEquipo(equipoNuevo:UpdateEquipoDto,id_equipo:number){ + private readonly equipoRepository: Repository, + ) {} + + async buscarEquipos(filtros: any, page: number = 1, limit: number = 10) { + const query = this.equipoRepository + .createQueryBuilder('equipo') + .leftJoinAndSelect('equipo.marca', 'marca') + .leftJoinAndSelect('equipo.estado', 'estado') + .leftJoinAndSelect('equipo.adscripcion', 'adscripcion') + .leftJoinAndSelect('equipo.tipoEquipo', 'tipoEquipo') + .leftJoinAndSelect('equipo.sistemaOperativo', 'sistemaOperativo') + .leftJoinAndSelect('equipo.procesador', 'procesador') + .leftJoinAndSelect('equipo.tipoUso', 'tipoUso'); + + // Filtros dinámicos + if (filtros.inventario) { + query.andWhere('equipo.inventario LIKE :inventario', { + inventario: `%${filtros.inventario}%`, + }); + } + + if (filtros.tipoEquipo) { + query.andWhere('tipoEquipo.id = :tipoEquipo', { + tipoEquipo: filtros.tipoEquipo, + }); + } + + if (filtros.antiguedad) { + query.andWhere('equipo.antiguedad LIKE :antiguedad', { + antiguedad: `%${filtros.antiguedad}%`, + }); + } + + if (filtros.marca) { + query.andWhere('marca.id = :marca', { marca: filtros.marca }); + } + + if (filtros.estado) { + query.andWhere('estado.id = :estado', { estado: filtros.estado }); + } + + if (filtros.adscripcion) { + query.andWhere('adscripcion.id = :adscripcion', { + adscripcion: filtros.adscripcion, + }); + } + + if (filtros.tipoUso) { + query.andWhere('tipoUso.id = :tipoUso', { tipoUso: filtros.tipoUso }); + } + + if (filtros.procesador) { + query.andWhere('procesador.id = :procesador', { + procesador: filtros.procesador, + }); + } + + if (filtros.sistemaOperativo) { + query.andWhere('sistemaOperativo.id = :sistemaOperativo', { + sistemaOperativo: filtros.sistemaOperativo, + }); + } + + // Paginación + query.skip((page - 1) * limit).take(limit); + + // Ejecutar consulta + const [data, total] = await query.getManyAndCount(); + + return { + total, + page, + limit, + data, + }; + } + async updateEquipo(equipoNuevo:UpdateEquipoDto,id_equipo:number){ const updateData={ lugar: equipoNuevo.lugar, modelo: equipoNuevo.modelo, @@ -36,3 +110,4 @@ export class EquipoService { } } + diff --git a/src/movimiento/dto/create-movimiento.dto.ts b/src/movimiento/dto/create-movimiento.dto.ts index 646aa18..2cc0bb5 100644 --- a/src/movimiento/dto/create-movimiento.dto.ts +++ b/src/movimiento/dto/create-movimiento.dto.ts @@ -1 +1,15 @@ -export class CreateMovimientoDto {} +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator'; + +export class CreateMovimientoDto { + @IsNotEmpty() + @IsNumber() + idUsuario: number; + + @IsNotEmpty() + @IsNumber() + idEquipo: number; + + @IsOptional() + @IsString() + observaciones?: string; +} diff --git a/src/movimiento/dto/update-movimiento.dto.ts b/src/movimiento/dto/update-movimiento.dto.ts index fe319cf..36ad6f6 100644 --- a/src/movimiento/dto/update-movimiento.dto.ts +++ b/src/movimiento/dto/update-movimiento.dto.ts @@ -2,3 +2,4 @@ import { PartialType } from '@nestjs/mapped-types'; import { CreateMovimientoDto } from './create-movimiento.dto'; export class UpdateMovimientoDto extends PartialType(CreateMovimientoDto) {} +1; diff --git a/src/movimiento/entities/movimiento.entity.ts b/src/movimiento/entities/movimiento.entity.ts index 4d99d81..f120904 100644 --- a/src/movimiento/entities/movimiento.entity.ts +++ b/src/movimiento/entities/movimiento.entity.ts @@ -1,26 +1,20 @@ -import { Equipo } from 'src/equipo/entities/equipo.entity'; import { Usuario } from 'src/usuarios/entities/usuario.entity'; -import { - Entity, - PrimaryGeneratedColumn, - Column, - CreateDateColumn, - ManyToOne, -} from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm'; @Entity('movimientos') export class Movimiento { @PrimaryGeneratedColumn() id_movimiento: number; - @CreateDateColumn({ name: 'fecha_movimiento' }) + + @ManyToOne(() => Movimiento, (id_usuario) => id_usuario.id_usuario) + id_usuario: Movimiento; + + @ManyToOne(() => Movimiento, (id_equipo) => id_equipo.id_equipo) + id_equipo: Movimiento; + + @Column({ name: 'fecha_movimiento' }) fechaMovimiento: Date; @Column({ type: 'text', nullable: true }) observaciones: string; - - @ManyToOne(() => Usuario, (usuario) => usuario.movimiento) - usuario: Usuario; - - @ManyToOne(() => Equipo, (equipo) => equipo.movimiento) - equipo: Equipo; } diff --git a/src/movimiento/movimiento.controller.ts b/src/movimiento/movimiento.controller.ts index 16c9c8b..0b619b1 100644 --- a/src/movimiento/movimiento.controller.ts +++ b/src/movimiento/movimiento.controller.ts @@ -1,34 +1,18 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { + Controller, + Post, + Get, + Body, + Param, + ParseIntPipe, + Patch, + UseGuards, +} from '@nestjs/common'; import { MovimientoService } from './movimiento.service'; import { CreateMovimientoDto } from './dto/create-movimiento.dto'; import { UpdateMovimientoDto } from './dto/update-movimiento.dto'; -@Controller('movimiento') +@Controller('movimientos') export class MovimientoController { constructor(private readonly movimientoService: MovimientoService) {} - - @Post() - create(@Body() createMovimientoDto: CreateMovimientoDto) { - return this.movimientoService.create(createMovimientoDto); - } - - @Get() - findAll() { - return this.movimientoService.findAll(); - } - - @Get(':id') - findOne(@Param('id') id: string) { - return this.movimientoService.findOne(+id); - } - - @Patch(':id') - update(@Param('id') id: string, @Body() updateMovimientoDto: UpdateMovimientoDto) { - return this.movimientoService.update(+id, updateMovimientoDto); - } - - @Delete(':id') - remove(@Param('id') id: string) { - return this.movimientoService.remove(+id); - } } diff --git a/src/movimiento/movimiento.module.ts b/src/movimiento/movimiento.module.ts index 6d35e2f..54979a6 100644 --- a/src/movimiento/movimiento.module.ts +++ b/src/movimiento/movimiento.module.ts @@ -1,8 +1,13 @@ import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Movimiento } from './entities/movimiento.entity'; import { MovimientoService } from './movimiento.service'; import { MovimientoController } from './movimiento.controller'; +import { Usuario } from 'src/usuarios/entities/usuario.entity'; +import { Equipo } from 'src/equipo/entities/equipo.entity'; @Module({ + imports: [TypeOrmModule.forFeature([Movimiento, Usuario, Equipo])], controllers: [MovimientoController], providers: [MovimientoService], }) diff --git a/src/movimiento/movimiento.service.ts b/src/movimiento/movimiento.service.ts index d5241a8..995e12b 100644 --- a/src/movimiento/movimiento.service.ts +++ b/src/movimiento/movimiento.service.ts @@ -1,24 +1,43 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Movimiento } from './entities/movimiento.entity'; import { Usuario } from 'src/usuarios/entities/usuario.entity'; +import { Equipo } from 'src/equipo/entities/equipo.entity'; +import { CreateMovimientoDto } from './dto/create-movimiento.dto'; +import { UpdateMovimientoDto } from './dto/update-movimiento.dto'; @Injectable() export class MovimientoService { constructor( @InjectRepository(Movimiento) - private movimientoRepository: Repository, + private readonly movimientoRepo: Repository, + @InjectRepository(Usuario) + private readonly usuarioRepo: Repository, + + @InjectRepository(Equipo) + private readonly equipoRepo: Repository, ) {} - async crearMovimiento( - usuario: Usuario, - camposModificados: string[], - ): Promise { - const movimiento = new Movimiento(); - movimiento.usuario = usuario; - movimiento.observaciones = `Se modificaron los campos: ${camposModificados.join(', ')}`; + async crear(dto: CreateMovimientoDto) { + const usuario = await this.usuarioRepo.findOne({ + where: { id_usuario: dto.idUsuario }, + }); - return await this.movimientoRepository.save(movimiento); + const equipo = await this.equipoRepo.findOne({ + where: { id_equipo: dto.idEquipo }, + }); + + if (!usuario || !equipo) { + throw new Error('Usuario o equipo no encontrado'); + } + + const movimiento = this.movimientoRepo.create({ + usuario, + equipo, + observaciones: dto.observaciones || undefined, + }); + + return await this.movimientoRepo.save(movimiento); } } diff --git a/src/usuarios/entities/usuario.entity.ts b/src/usuarios/entities/usuario.entity.ts index 370b90a..73b9c7b 100644 --- a/src/usuarios/entities/usuario.entity.ts +++ b/src/usuarios/entities/usuario.entity.ts @@ -1,6 +1,8 @@ import { Movimiento } from 'src/movimiento/entities/movimiento.entity'; import {Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn} from 'typeorm'; +import { Movimiento } from 'src/movimiento/entities/movimiento.entity'; + @Entity() export class Usuario { @PrimaryGeneratedColumn()