This commit is contained in:
2025-10-23 11:16:16 -06:00
parent 48e6f0c000
commit 095eac222a
9 changed files with 152 additions and 81 deletions
+4
View File
@@ -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;
+9 -27
View File
@@ -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);
}
}
+76 -16
View File
@@ -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<Equipo>,
) {}
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,
};
}
}
+15 -1
View File
@@ -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;
}
@@ -2,3 +2,4 @@ import { PartialType } from '@nestjs/mapped-types';
import { CreateMovimientoDto } from './create-movimiento.dto';
export class UpdateMovimientoDto extends PartialType(CreateMovimientoDto) {}
1;
+11 -27
View File
@@ -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);
}
}
+5
View File
@@ -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],
})
+29 -10
View File
@@ -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<Movimiento>,
private readonly movimientoRepo: Repository<Movimiento>,
@InjectRepository(Usuario)
private readonly usuarioRepo: Repository<Usuario>,
@InjectRepository(Equipo)
private readonly equipoRepo: Repository<Equipo>,
) {}
async crearMovimiento(
usuario: Usuario,
camposModificados: string[],
): Promise<Movimiento> {
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);
}
}
+2
View File
@@ -6,6 +6,8 @@ import {
PrimaryGeneratedColumn,
} from 'typeorm';
import { Movimiento } from 'src/movimiento/entities/movimiento.entity';
@Entity()
export class Usuario {
@PrimaryGeneratedColumn()