add folder operation and use createQueryRunner

This commit is contained in:
IO420
2025-09-16 22:37:25 -06:00
parent 7024bfdeac
commit 3e4b3b1b18
15 changed files with 150 additions and 76 deletions
+18
View File
@@ -0,0 +1,18 @@
import { IsInt, IsNotEmpty, Min } from "class-validator";
export class chargePrintDto {
@IsInt()
@IsNotEmpty()
@Min(1)
monto:number
@IsInt()
@Min(1)
@IsNotEmpty()
numero_hojas: number;
@IsInt()
@IsNotEmpty()
id_cuenta: number;
}
+9
View File
@@ -0,0 +1,9 @@
import { Controller } from "@nestjs/common";
import { OperationsService } from "./operations.services";
@Controller('operations')
export class OperationsController{
constructor(private readonly operationsService:OperationsService){}
}
+15
View File
@@ -0,0 +1,15 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Student } from 'src/alumno/entities/student.entity';
import { DetalleServicio } from 'src/detalle_servicio/entities/detalle_servicio.entity';
import { OperationsController } from './operations.controller';
import { OperationsService } from './operations.services';
@Module({
imports: [
TypeOrmModule.forFeature([Student, DetalleServicio]), // entidades que usarán las transacciones
],
controllers: [OperationsController],
providers: [OperationsService],
})
export class OperationsModule {}
+54
View File
@@ -0,0 +1,54 @@
import { BadRequestException, Injectable } from '@nestjs/common';
import { StudentService } from 'src/alumno/student.service';
import { DetalleServicioService } from 'src/detalle_servicio/detalle_servicio.service';
import { DataSource } from 'typeorm';
import { chargePrintDto } from './dto/operations.dto';
import { CreateDetalleServicioDto } from 'src/detalle_servicio/dto/create-detalle_servicio.dto';
@Injectable()
export class OperationsService {
constructor(
private readonly dataSource: DataSource,
private readonly studentService: StudentService,
private readonly detalleServicioService: DetalleServicioService,
) {}
async chargePrint(data: chargePrintDto, userId: number) {
const { monto, id_cuenta } = data;
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const credit = await this.studentService.GetCredit(id_cuenta);
if (credit < monto) {
throw new BadRequestException('Crédito insuficiente');
}
const detalleData: CreateDetalleServicioDto = {
...data,
id_servicio: 1,
id_usuario: userId,
fecha_operacion: new Date(),
};
await this.detalleServicioService.Create(detalleData, queryRunner.manager);
await this.studentService.UpdateCredit(
id_cuenta,
monto,
queryRunner.manager,
);
await queryRunner.commitTransaction();
return { message: 'correct' };
} catch (error) {
await queryRunner.rollbackTransaction();
return { message: 'error', error: error.message };
} finally {
await queryRunner.release();
}
}
}
+3 -2
View File
@@ -1,5 +1,5 @@
import { Type } from 'class-transformer';
import { IsDate, IsNotEmpty, IsNumber, IsString } from 'class-validator'; import { IsEmail, IsNotEmpty, IsNumber, IsString } from 'class-validator';
export class CreateStudentDto { export class CreateStudentDto {
@IsNotEmpty() @IsNotEmpty()
@@ -17,6 +17,7 @@ export class CreateStudentDto {
@IsNumber() @IsNumber()
id_carrera: number; id_carrera: number;
@IsEmail()
@IsString() @IsString()
correo: string; correo: string;
} }
+1 -1
View File
@@ -26,7 +26,7 @@ export class Student {
scale: 2, scale: 2,
default: 0.0, default: 0.0,
}) })
credito: string; credito: number;
@Column({ @Column({
name: 'fecha_actualizacion_credito', name: 'fecha_actualizacion_credito',
+1 -11
View File
@@ -27,17 +27,7 @@ export class StudentController {
} }
@Get(':id') @Get(':id')
findOne(@Param('id') id: string) { findOne(@Param('id') id: number) {
return this.studentService.findOne(+id); return this.studentService.findOne(+id);
} }
@Patch(':id')
update(@Param('id') id: string, @Body() updateStudentDto: UpdateStudentDto) {
return this.studentService.update(+id, updateStudentDto);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.studentService.remove(+id);
}
} }
+16 -5
View File
@@ -2,7 +2,7 @@ import { Injectable, NotFoundException } from '@nestjs/common';
import { CreateStudentDto } from './dto/create-student.dto'; import { CreateStudentDto } from './dto/create-student.dto';
import { UpdateStudentDto } from './dto/update-student.dto'; import { UpdateStudentDto } from './dto/update-student.dto';
import { Student } from './entities/student.entity'; import { Student } from './entities/student.entity';
import { Repository } from 'typeorm'; import { EntityManager, Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
@Injectable() @Injectable()
@@ -31,11 +31,22 @@ export class StudentService {
return student; return student;
} }
update(id: number, updateStudentDto: UpdateStudentDto) { async GetCredit(id_cuenta: number): Promise<Student['credito']> {
return `This action updates a #${id} student`; const student = await this.findOne(id_cuenta);
return student.credito;
} }
remove(id: number) { async UpdateCredit(
return `This action removes a #${id} student`; id_cuenta: number,
credit: number,
manager: EntityManager,
) {
const repo = manager.getRepository(Student);
return await repo
.createQueryBuilder()
.update()
.set({ credito: () => `credito - ${credit}` })
.where({ id_cuenta })
.execute();
} }
} }
@@ -1,26 +1,13 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { DetalleServicio } from './entities/detalle_servicio.entity';
import { EntityManager } from 'typeorm';
import { CreateDetalleServicioDto } from './dto/create-detalle_servicio.dto'; import { CreateDetalleServicioDto } from './dto/create-detalle_servicio.dto';
import { UpdateDetalleServicioDto } from './dto/update-detalle_servicio.dto';
@Injectable() @Injectable()
export class DetalleServicioService { export class DetalleServicioService {
create(createDetalleServicioDto: CreateDetalleServicioDto) { async Create(data: CreateDetalleServicioDto, manager: EntityManager) {
return 'This action adds a new detalleServicio'; const repo = manager.getRepository(DetalleServicio);
} const details = repo.create(data);
return await repo.save(details);
findAll() {
return `This action returns all detalleServicio`;
}
findOne(id: number) {
return `This action returns a #${id} detalleServicio`;
}
update(id: number, updateDetalleServicioDto: UpdateDetalleServicioDto) {
return `This action updates a #${id} detalleServicio`;
}
remove(id: number) {
return `This action removes a #${id} detalleServicio`;
} }
} }
@@ -1,9 +1,15 @@
import { Type } from 'class-transformer'; import { Type } from 'class-transformer';
import { IsDate, IsInt, IsNotEmpty, IsOptional, Min } from 'class-validator'; import { IsDate, IsIn, IsInt, IsNotEmpty, IsOptional, Min } from 'class-validator';
export class CreateDetalleServicioDto { export class CreateDetalleServicioDto {
@IsInt() @IsInt()
@Min(0) @IsNotEmpty()
@Min(1)
monto:number
@IsInt()
@Min(1)
@IsNotEmpty() @IsNotEmpty()
numero_hojas: number; numero_hojas: number;
@@ -23,8 +29,4 @@ export class CreateDetalleServicioDto {
@IsInt() @IsInt()
@IsNotEmpty() @IsNotEmpty()
id_usuario: number; id_usuario: number;
@IsOptional()
@IsInt()
id_periodo?: number;
} }
@@ -1,9 +0,0 @@
export class DetalleServicioDto {
id_detalle_servicio: number;
numero_hojas: number;
fecha_operacion: Date;
id_cuenta: number;
id_servicio: number;
id_usuario: number;
id_periodo: number | null;
}
@@ -15,7 +15,7 @@ export class DetalleServicio {
scale: 2, scale: 2,
nullable: false, nullable: false,
}) })
monto: string; monto: number;
@Column({ name: 'numero_hojas', type: 'int', nullable: false, default: 0 }) @Column({ name: 'numero_hojas', type: 'int', nullable: false, default: 0 })
numero_hojas: number; numero_hojas: number;
@@ -39,13 +39,4 @@ export class DetalleServicio {
@Column({ name: 'id_perido', type: 'int', default: null }) @Column({ name: 'id_perido', type: 'int', default: null })
id_periodo: number; id_periodo: number;
} }
/* `id_detalle_servicio` int(11) NOT NULL AUTO_INCREMENT,
`monto` decimal(10,2) NOT NULL,
`numero_hojas` int(11) NOT NULL DEFAULT 0,
`fecha_operacion` timestamp NOT NULL DEFAULT current_timestamp(),
`id_cuenta` int(9) unsigned zerofill NOT NULL,
`id_servicio` int(11) NOT NULL,
`id_usuario` int(11) NOT NULL,
`id_periodo` int(11) DEFAULT NULL,*/
-1
View File
@@ -49,7 +49,6 @@ export class Perfil {
@Column({ name: 'perfil', type: 'varchar', length: 45, nullable: false }) @Column({ name: 'perfil', type: 'varchar', length: 45, nullable: false })
perfil: string; perfil: string;
// Relación uno a muchos con usuario
@OneToMany(() => User, (user) => user.perfil) @OneToMany(() => User, (user) => user.perfil)
usuarios: User[]; usuarios: User[];
} }
+16 -10
View File
@@ -1,4 +1,12 @@
import { Controller, Get, Post, Body, UseGuards, Request, Res } from '@nestjs/common'; import {
Controller,
Get,
Post,
Body,
UseGuards,
Request,
Res,
} from '@nestjs/common';
import type { Response } from 'express'; import type { Response } from 'express';
import { UserService } from './user.service'; import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto'; import { CreateUserDto } from './dto/create-user.dto';
@@ -6,19 +14,17 @@ import { AuthGuard } from '@nestjs/passport';
@Controller('user') @Controller('user')
export class UserController { export class UserController {
constructor(private readonly userService: UserService) { } constructor(private readonly userService: UserService) {}
@Post()
async Login(@Body() data: CreateUserDto, @Res() res: Response) {
return this.userService.Login(data, res);
}
@Post()
async Login(@Body() data: CreateUserDto, @Res() res: Response) {
return this.userService.Login(data, res);
}
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@Get('/validate-token') @Get('/validate-token')
getProfile(@Request() req) { getProfile(@Request() req) {
return req.user; return req.user;
} }
} }
//IO //IO
+1 -1
View File
@@ -10,7 +10,7 @@ import { JwtService } from '@nestjs/jwt';
export class UserService { export class UserService {
constructor( constructor(
@InjectRepository(User) @InjectRepository(User)
private userRepository: Repository<User>, private readonly userRepository: Repository<User>,
private jwtService: JwtService private jwtService: JwtService
) { } ) { }