From 48e6f0c0006ee0dd8b4e785c86d5418ae803a870 Mon Sep 17 00:00:00 2001 From: CarlosssFlores <307100636@pcpuma.acatlan.unam.mx> Date: Tue, 21 Oct 2025 20:54:24 -0600 Subject: [PATCH 1/2] entity movimiento --- src/equipo/entities/equipo.entity.ts | 18 +++++++------- src/movimiento/entities/movimiento.entity.ts | 25 +++++++------------- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/src/equipo/entities/equipo.entity.ts b/src/equipo/entities/equipo.entity.ts index 81ef2be..d9b0a3b 100644 --- a/src/equipo/entities/equipo.entity.ts +++ b/src/equipo/entities/equipo.entity.ts @@ -5,15 +5,20 @@ import { OneToMany, PrimaryGeneratedColumn, } from 'typeorm'; -import { Adscripcion, Estado, Marca, Procesador, SistemaOperativo, TipoEquipo, Uso } from './catalogo.entities'; - - +import { + Adscripcion, + Estado, + Marca, + Procesador, + SistemaOperativo, + TipoEquipo, + Uso, +} from './catalogo.entities'; @Entity() export class Equipo { @PrimaryGeneratedColumn() id_equipo: number; - @Column({ length: 100, nullable: true }) inventario: string; @@ -57,9 +62,6 @@ export class Equipo { @ManyToOne(() => Marca, (marca) => marca.equipo) marca: Marca; - @OneToMany(() => Equipo, (equipo) => equipo.marca) + @OneToMany(() => Equipo, (equipo) => equipo.marca) equipo: Equipo; - - -} } diff --git a/src/movimiento/entities/movimiento.entity.ts b/src/movimiento/entities/movimiento.entity.ts index 5d8f329..f120904 100644 --- a/src/movimiento/entities/movimiento.entity.ts +++ b/src/movimiento/entities/movimiento.entity.ts @@ -1,27 +1,20 @@ -import { Equipo } from 'src/equipo/entities/equipo.entity'; import { Usuario } from 'src/usuarios/entities/usuario.entity'; -import { - Entity, - PrimaryGeneratedColumn, - Column, - CreateDateColumn, - ManyToOne, - OneToMany, -} 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; } From 095eac222a2ba042dce020d6429031e2614e9d8c Mon Sep 17 00:00:00 2001 From: CarlosssFlores <307100636@pcpuma.acatlan.unam.mx> Date: Thu, 23 Oct 2025 11:16:16 -0600 Subject: [PATCH 2/2] dtos --- src/equipo/entities/equipo.entity.ts | 4 + src/equipo/equipo.controller.ts | 36 ++------ src/equipo/equipo.service.ts | 92 +++++++++++++++++---- src/movimiento/dto/create-movimiento.dto.ts | 16 +++- src/movimiento/dto/update-movimiento.dto.ts | 1 + src/movimiento/movimiento.controller.ts | 38 +++------ src/movimiento/movimiento.module.ts | 5 ++ src/movimiento/movimiento.service.ts | 39 ++++++--- src/usuarios/entities/usuario.entity.ts | 2 + 9 files changed, 152 insertions(+), 81 deletions(-) diff --git a/src/equipo/entities/equipo.entity.ts b/src/equipo/entities/equipo.entity.ts index d9b0a3b..4ed7572 100644 --- a/src/equipo/entities/equipo.entity.ts +++ b/src/equipo/entities/equipo.entity.ts @@ -14,11 +14,15 @@ import { TipoEquipo, Uso, } from './catalogo.entities'; +import { Movimiento } from 'src/movimiento/entities/movimiento.entity'; @Entity() export class Equipo { @PrimaryGeneratedColumn() id_equipo: number; + //checar bien aqui si estoy bien + @OneToMany(() => Movimiento, (mov) => mov.equipo) + movimientos: Movimiento[]; @Column({ length: 100, nullable: true }) inventario: string; diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index 4f81371..e3ef67e 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -1,34 +1,16 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { Controller, Get, Query } from '@nestjs/common'; import { EquipoService } from './equipo.service'; -import { CreateEquipoDto } from './dto/create-equipo.dto'; -import { UpdateEquipoDto } from './dto/update-equipo.dto'; -@Controller('equipo') +@Controller('equipos') export class EquipoController { constructor(private readonly equipoService: EquipoService) {} - @Post() - create(@Body() createEquipoDto: CreateEquipoDto) { - return this.equipoService.create(createEquipoDto); - } - - @Get() - findAll() { - return this.equipoService.findAll(); - } - - @Get(':id') - findOne(@Param('id') id: string) { - return this.equipoService.findOne(+id); - } - - @Patch(':id') - update(@Param('id') id: string, @Body() updateEquipoDto: UpdateEquipoDto) { - return this.equipoService.update(+id, updateEquipoDto); - } - - @Delete(':id') - remove(@Param('id') id: string) { - return this.equipoService.remove(+id); + @Get('buscar') + async buscarEquipos( + @Query() filtros: any, + @Query('page') page: number = 1, + @Query('limit') limit: number = 10, + ) { + return this.equipoService.buscarEquipos(filtros, +page, +limit); } } diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index ce42f11..4727970 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -1,26 +1,86 @@ import { Injectable } from '@nestjs/common'; -import { CreateEquipoDto } from './dto/create-equipo.dto'; -import { UpdateEquipoDto } from './dto/update-equipo.dto'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Equipo } from './entities/equipo.entity'; @Injectable() export class EquipoService { - create(createEquipoDto: CreateEquipoDto) { - return 'This action adds a new equipo'; - } + constructor( + @InjectRepository(Equipo) + private readonly equipoRepository: Repository, + ) {} - findAll() { - return `This action returns all equipo`; - } + 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'); - findOne(id: number) { - return `This action returns a #${id} equipo`; - } + // Filtros dinámicos + if (filtros.inventario) { + query.andWhere('equipo.inventario LIKE :inventario', { + inventario: `%${filtros.inventario}%`, + }); + } - update(id: number, updateEquipoDto: UpdateEquipoDto) { - return `This action updates a #${id} equipo`; - } + if (filtros.tipoEquipo) { + query.andWhere('tipoEquipo.id = :tipoEquipo', { + tipoEquipo: filtros.tipoEquipo, + }); + } - remove(id: number) { - return `This action removes a #${id} equipo`; + 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, + }; } } 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/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 02015c7..eeec412 100644 --- a/src/usuarios/entities/usuario.entity.ts +++ b/src/usuarios/entities/usuario.entity.ts @@ -6,6 +6,8 @@ import { PrimaryGeneratedColumn, } from 'typeorm'; +import { Movimiento } from 'src/movimiento/entities/movimiento.entity'; + @Entity() export class Usuario { @PrimaryGeneratedColumn()