listo motivos carrito

This commit is contained in:
xXpuma99Xx
2022-08-14 22:11:44 -05:00
parent 69d880be84
commit 38aafecdf1
26 changed files with 318 additions and 72 deletions
+8 -4
View File
@@ -10,8 +10,10 @@ import { AuthModule } from './auth/auth.module';
import { BcryptModule } from './bcrypt/bcrypt.module';
import { CarreraProgramaModule } from './carrera-programa/carrera-programa.module';
import { CarritoModule } from './carrito/carrito.module';
import { CarritoMotivoModule } from './carrito-motivo/carrito-motivo.module';
import { CronModule } from './cron/cron.module';
import { EquipoModule } from './equipo/equipo.module';
import { EquipoMotivoModule } from './equipo-motivo/equipo-motivo.module';
import { EquipoProgramaModule } from './equipo-programa/equipo-programa.module';
import { EquipoTipoEntradaModule } from './equipo-tipo-entrada/equipo-tipo-entrada.module';
import { HoraExcepcionModule } from './hora-excepcion/hora-excepcion.module';
@@ -26,7 +28,6 @@ import { InstitucionUsuarioModule } from './institucion-usuario/institucion-usua
import { MarcaModule } from './marca/marca.module';
import { ModeloModule } from './modelo/modelo.module';
import { ModuloModule } from './modulo/modulo.module';
import { MotivoModule } from './motivo/motivo.module';
import { MultaModule } from './multa/multa.module';
import { NodemailerModule } from './nodemailer/nodemailer.module';
import { OperadorModule } from './operador/operador.module';
@@ -40,8 +41,10 @@ import { UsuarioModule } from './usuario/usuario.module';
import { Carrera } from './institucion-carrera/entity/carrera.entity';
import { CarreraPrograma } from './carrera-programa/entity/carrera-programa.entity';
import { Carrito } from './carrito/entity/carrito.entity';
import { CarritoMotivo } from './carrito-motivo/entity/carrito-motivo.entity';
import { Dia } from './institucion-dia/entity/dia.entity';
import { Equipo } from './equipo/entity/equipo.entity';
import { EquipoMotivo } from './equipo-motivo/entity/equipo-motivo.entity';
import { EquipoPrograma } from './equipo-programa/entity/equipo-programa.entity';
import { EquipoTipoEntrada } from './equipo-tipo-entrada/entity/equipo-tipo-entrada.entity';
import { HoraExcepcion } from './hora-excepcion/entity/hora-excepcion.entity';
@@ -57,7 +60,6 @@ import { InstitucionUsuario } from './institucion-usuario/entity/institucion-usu
import { Marca } from './marca/entity/marca.entity';
import { Modelo } from './modelo/entity/modelo.entity';
import { Modulo } from './modulo/entity/modulo.entity';
import { Motivo } from './motivo/entity/motivo.entity';
import { Multa } from './multa/entity/multa.entity';
import { Nivel } from './institucion-carrera/entity/nivel.entity';
import { Operador } from './operador/entity/operador.entity';
@@ -98,8 +100,10 @@ import { Usuario } from './usuario/entity/usuario.entity';
Carrera,
CarreraPrograma,
Carrito,
CarritoMotivo,
Dia,
Equipo,
EquipoMotivo,
EquipoPrograma,
EquipoTipoEntrada,
HoraExcepcion,
@@ -115,7 +119,6 @@ import { Usuario } from './usuario/entity/usuario.entity';
Marca,
Modelo,
Modulo,
Motivo,
Multa,
Nivel,
Operador,
@@ -134,6 +137,7 @@ import { Usuario } from './usuario/entity/usuario.entity';
BcryptModule,
CarreraProgramaModule,
CarritoModule,
CarritoMotivoModule,
CronModule,
EquipoProgramaModule,
EquipoTipoEntradaModule,
@@ -150,7 +154,7 @@ import { Usuario } from './usuario/entity/usuario.entity';
MarcaModule,
ModeloModule,
ModuloModule,
MotivoModule,
EquipoMotivoModule,
MultaModule,
NodemailerModule,
OperadorModule,
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { CarritoMotivoController } from './carrito-motivo.controller';
describe('CarritoMotivoController', () => {
let controller: CarritoMotivoController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [CarritoMotivoController],
}).compile();
controller = module.get<CarritoMotivoController>(CarritoMotivoController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});
@@ -0,0 +1,64 @@
import {
Controller,
ForbiddenException,
Get,
Query,
Request,
UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import {
ApiBearerAuth,
ApiOperation,
ApiQuery,
ApiTags,
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { CaritoMotivoService } from './carrito-motivo.service';
import { Operador } from '../operador/entity/operador.entity';
import { GetDto } from './dto/input/get.dto';
import { CarritoMotivoOutputDto } from './dto/output/carrito-motivo.dto';
@Controller('carrito-motivo')
@ApiTags('carrito-motivo')
export class CarritoMotivoController {
constructor(private carritoMotivoService: CaritoMotivoService) {}
@Serealize(CarritoMotivoOutputDto)
@Get()
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
description:
'Endpoint que retorna 25 cambios de status que ha tenido un carrito dependiendo de la página en la que se encuentra el alumno.',
})
@ApiBearerAuth('jwt')
@ApiQuery({
description: 'Id del carrito.',
name: 'id_carrito',
type: 'string',
})
@ApiQuery({
description: 'Página en la que se encuentra el usuario.',
name: 'pagina',
type: 'string',
})
get(@Request() req, @Query() query: GetDto) {
const operador: Operador = req.user.operador;
if (
!operador ||
(operador.tipoUsuario.id_tipo_usuario != 3 &&
operador.tipoUsuario.id_tipo_usuario != 4)
)
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
return this.carritoMotivoService.findAllByIdCarrito(
parseInt(query.id_carrito),
parseInt(query.pagina),
);
}
// @Get('reporte')
// reporte() {}
}
@@ -0,0 +1,23 @@
import { forwardRef, Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CarritoMotivoController } from './carrito-motivo.controller';
import { CaritoMotivoService } from './carrito-motivo.service';
import { CarritoMotivo } from './entity/carrito-motivo.entity';
import { CarritoModule } from '../carrito/carrito.module';
import { OperadorModule } from '../operador/operador.module';
import { StatusModule } from '../status/status.module';
@Module({
imports: [
forwardRef(() => CarritoModule),
OperadorModule,
StatusModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([CarritoMotivo]),
],
controllers: [CarritoMotivoController],
providers: [CaritoMotivoService],
exports: [CaritoMotivoService],
})
export class CarritoMotivoModule {}
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { CaritoMotivoService } from './carrito-motivo.service';
describe('CaritoMotivoService', () => {
let service: CaritoMotivoService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [CaritoMotivoService],
}).compile();
service = module.get<CaritoMotivoService>(CaritoMotivoService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});
@@ -0,0 +1,49 @@
import * as moment from 'moment';
import { forwardRef, Inject, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Carrito } from 'src/carrito/entity/carrito.entity';
import { CarritoMotivo } from './entity/carrito-motivo.entity';
import { Operador } from '../operador/entity/operador.entity';
import { CarritoService } from '../carrito/carrito.service';
import { OperadorService } from '../operador/operador.service';
@Injectable()
export class CaritoMotivoService {
constructor(
@InjectRepository(CarritoMotivo)
private repository: Repository<CarritoMotivo>,
@Inject(forwardRef(() => CarritoService))
private carritoService: CarritoService,
private operadorService: OperadorService,
) {}
async create(
carrito: Carrito,
operador: Operador,
status: boolean,
motivo: string,
) {
const ahora = moment();
return this.repository.save(
this.repository.create({
carrito,
fecha_creacion: ahora.toDate(),
motivo,
operador,
status,
}),
);
}
findAllByIdCarrito(id_carrito: number, pagina: number) {
return this.carritoService.findById(id_carrito).then((carrito) =>
this.repository.findAndCount({
where: { carrito },
skip: (pagina - 1) * 25,
take: 25,
}),
);
}
}
+9
View File
@@ -0,0 +1,9 @@
import { IsNumberString } from 'class-validator';
export class GetDto {
@IsNumberString()
id_carrito: string;
@IsNumberString()
pagina: string;
}
@@ -0,0 +1,20 @@
import { Expose, Type } from 'class-transformer';
import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto';
export class CarritoMotivoOutputDto {
@Expose()
id_motivo;
@Expose()
fecha_creacion;
@Expose()
motivo;
@Expose()
status;
@Expose()
@Type(() => OperadorMinOutputDto)
operador;
}
@@ -0,0 +1,32 @@
import {
Column,
Entity,
JoinColumn,
ManyToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { Carrito } from '../../carrito/entity/carrito.entity';
import { Operador } from '../../operador/entity/operador.entity';
@Entity()
export class CarritoMotivo {
@PrimaryGeneratedColumn()
id_motivo: number;
@Column({ type: Date, nullable: false })
fecha_creacion: Date;
@Column({ type: String, nullable: false, length: 250 })
motivo: string;
@Column({ type: Boolean, nullable: false })
status: boolean;
@ManyToOne(() => Carrito, (carrito) => carrito.motivos)
@JoinColumn({ name: 'id_carrito' })
carrito: Carrito;
@ManyToOne(() => Operador, (operador) => operador.motivos, { eager: true })
@JoinColumn({ name: 'id_operador' })
operador: Operador;
}
+3 -1
View File
@@ -1,9 +1,10 @@
import { Module } from '@nestjs/common';
import { forwardRef, Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CarritoController } from './carrito.controller';
import { CarritoService } from './carrito.service';
import { Carrito } from './entity/carrito.entity';
import { CarritoMotivoModule } from '../carrito-motivo/carrito-motivo.module';
import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module';
import { MarcaModule } from '../marca/marca.module';
@@ -12,6 +13,7 @@ import { ModuloModule } from '../modulo/modulo.module';
@Module({
imports: [
forwardRef(() => CarritoMotivoModule),
InstitucionModule,
InstitucionTipoCarritoModule,
MarcaModule,
+1 -1
View File
@@ -1,4 +1,4 @@
import { IsBoolean, IsInt, IsOptional, IsString } from 'class-validator';
import { IsBoolean, IsInt, IsOptional } from 'class-validator';
export class UpdateCarritoDto {
@IsInt()
+4
View File
@@ -6,6 +6,7 @@ import {
OneToMany,
PrimaryGeneratedColumn,
} from 'typeorm';
import { CarritoMotivo } from '../../carrito-motivo/entity/carrito-motivo.entity';
import { Equipo } from '../../equipo/entity/equipo.entity';
import { Marca } from '../../marca/entity/marca.entity';
import { Modelo } from '../../modelo/entity/modelo.entity';
@@ -41,6 +42,9 @@ export class Carrito {
@JoinColumn({ name: 'id_tipo_carrito' })
tipoCarrito: TipoCarrito;
@OneToMany(() => CarritoMotivo, (motivo) => motivo.carrito)
motivos: CarritoMotivo[];
@OneToMany(() => Equipo, (equipo) => equipo.carrito)
equipos: Equipo[];
}
@@ -2,7 +2,7 @@ import { Expose, Type } from 'class-transformer';
import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto';
import { StatusOutputDto } from '../../../status/dto/output/status.dto';
export class MotivoOutputDto {
export class EquipoMotivoOutputDto {
@Expose()
id_motivo;
@@ -10,7 +10,7 @@ import { Operador } from '../../operador/entity/operador.entity';
import { Status } from '../../status/entity/status.entity';
@Entity()
export class Motivo {
export class EquipoMotivo {
@PrimaryGeneratedColumn()
id_motivo: number;
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { EquipoMotivoController } from './equipo-motivo.controller';
describe('EquipoMotivoController', () => {
let controller: EquipoMotivoController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [EquipoMotivoController],
}).compile();
controller = module.get<EquipoMotivoController>(EquipoMotivoController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});
@@ -14,17 +14,17 @@ import {
ApiTags,
} from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { MotivoService } from './motivo.service';
import { EquipoMotivoService } from './equipo-motivo.service';
import { Operador } from 'src/operador/entity/operador.entity';
import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto';
import { MotivoOutputDto } from './dto/output/motivo.dto';
import { EquipoMotivoOutputDto } from './dto/output/equipo-motivo.dto';
@Controller('motivo')
@ApiTags('motivo')
export class MotivoController {
constructor(private motivoService: MotivoService) {}
@Controller('equipo-motivo')
@ApiTags('equipo-motivo')
export class EquipoMotivoController {
constructor(private equipoMotivoService: EquipoMotivoService) {}
@Serealize(MotivoOutputDto)
@Serealize(EquipoMotivoOutputDto)
@Get()
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
@@ -53,7 +53,7 @@ export class MotivoController {
throw new ForbiddenException(
'No tienes los permisos necesarios para acceder a esta información.',
);
return this.motivoService.findAllByIdEquipo(
return this.equipoMotivoService.findAllByIdEquipo(
parseInt(query.id_equipo),
parseInt(query.pagina),
);
@@ -1,9 +1,9 @@
import { forwardRef, Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { MotivoController } from './motivo.controller';
import { MotivoService } from './motivo.service';
import { Motivo } from './entity/motivo.entity';
import { EquipoMotivoController } from './equipo-motivo.controller';
import { EquipoMotivoService } from './equipo-motivo.service';
import { EquipoMotivo } from './entity/equipo-motivo.entity';
import { EquipoModule } from '../equipo/equipo.module';
import { OperadorModule } from '../operador/operador.module';
import { StatusModule } from '../status/status.module';
@@ -14,10 +14,10 @@ import { StatusModule } from '../status/status.module';
OperadorModule,
StatusModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmModule.forFeature([Motivo]),
TypeOrmModule.forFeature([EquipoMotivo]),
],
controllers: [MotivoController],
providers: [MotivoService],
exports: [MotivoService],
controllers: [EquipoMotivoController],
providers: [EquipoMotivoService],
exports: [EquipoMotivoService],
})
export class MotivoModule {}
export class EquipoMotivoModule {}
@@ -1,15 +1,15 @@
import { Test, TestingModule } from '@nestjs/testing';
import { MotivoService } from './motivo.service';
import { EquipoMotivoService } from './equipo-motivo.service';
describe('MotivoService', () => {
let service: MotivoService;
describe('EquipoMotivoService', () => {
let service: EquipoMotivoService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [MotivoService],
providers: [EquipoMotivoService],
}).compile();
service = module.get<MotivoService>(MotivoService);
service = module.get<EquipoMotivoService>(EquipoMotivoService);
});
it('should be defined', () => {
@@ -3,7 +3,7 @@ import { forwardRef, Inject, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Equipo } from '../equipo/entity/equipo.entity';
import { Motivo } from './entity/motivo.entity';
import { EquipoMotivo } from './entity/equipo-motivo.entity';
import { Operador } from '../operador/entity/operador.entity';
import { Status } from '../status/entity/status.entity';
import { EquipoService } from '../equipo/equipo.service';
@@ -11,9 +11,10 @@ import { OperadorService } from '../operador/operador.service';
import { StatusService } from '../status/status.service';
@Injectable()
export class MotivoService {
export class EquipoMotivoService {
constructor(
@InjectRepository(Motivo) private repository: Repository<Motivo>,
@InjectRepository(EquipoMotivo)
private repository: Repository<EquipoMotivo>,
@Inject(forwardRef(() => EquipoService))
private equipoService: EquipoService,
private operadorService: OperadorService,
+3 -3
View File
@@ -11,7 +11,7 @@ import { EquipoPrograma } from '../../equipo-programa/entity/equipo-programa.ent
import { EquipoTipoEntrada } from '../../equipo-tipo-entrada/entity/equipo-tipo-entrada.entity';
import { Marca } from '../../marca/entity/marca.entity';
import { Modelo } from '../../modelo/entity/modelo.entity';
import { Motivo } from '../../motivo/entity/motivo.entity';
import { EquipoMotivo } from '../../equipo-motivo/entity/equipo-motivo.entity';
import { Prestamo } from '../../prestamo/entity/prestamo.entity';
import { Status } from '../../status/entity/status.entity';
@@ -48,8 +48,8 @@ export class Equipo {
@JoinColumn({ name: 'id_status' })
status: Status;
@OneToMany(() => Motivo, (motivo) => motivo.equipo)
motivos: Motivo[];
@OneToMany(() => EquipoMotivo, (motivo) => motivo.equipo)
motivos: EquipoMotivo[];
@OneToMany(() => Prestamo, (prestamo) => prestamo.equipo)
prestamos: Prestamo[];
+2 -2
View File
@@ -13,7 +13,7 @@ import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/instit
import { MarcaModule } from '../marca/marca.module';
import { ModeloModule } from '../modelo/modelo.module';
import { ModuloModule } from '../modulo/modulo.module';
import { MotivoModule } from '../motivo/motivo.module';
import { EquipoMotivoModule } from '../equipo-motivo/equipo-motivo.module';
import { OperadorModule } from '../operador/operador.module';
import { StatusModule } from '../status/status.module';
@@ -28,7 +28,7 @@ import { StatusModule } from '../status/status.module';
MarcaModule,
ModeloModule,
ModuloModule,
forwardRef(() => MotivoModule),
forwardRef(() => EquipoMotivoModule),
OperadorModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
StatusModule,
+9 -4
View File
@@ -27,7 +27,7 @@ import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/insti
import { MarcaService } from '../marca/marca.service';
import { ModeloService } from '../modelo/modelo.service';
import { ModuloService } from '../modulo/modulo.service';
import { MotivoService } from '../motivo/motivo.service';
import { EquipoMotivoService } from '../equipo-motivo/equipo-motivo.service';
import { OperadorService } from '../operador/operador.service';
import { StatusService } from '../status/status.service';
@@ -45,8 +45,8 @@ export class EquipoService {
private marcaService: MarcaService,
private modeloService: ModeloService,
private moduloService: ModuloService,
@Inject(forwardRef(() => MotivoService))
private motivoService: MotivoService,
@Inject(forwardRef(() => EquipoMotivoService))
private equipoMotivoService: EquipoMotivoService,
private operadorService: OperadorService,
private statusService: StatusService,
) {}
@@ -408,7 +408,12 @@ export class EquipoService {
status.id_status >= 4 ||
(equipo.status.id_status >= 4 && status.id_status === 1)
)
await this.motivoService.create(equipo, operador, status, motivo);
await this.equipoMotivoService.create(
equipo,
operador,
status,
motivo,
);
equipo.status = status;
}
if (carrito) equipo.carrito = carrito;
-18
View File
@@ -1,18 +0,0 @@
import { Test, TestingModule } from '@nestjs/testing';
import { MotivoController } from './motivo.controller';
describe('MotivoController', () => {
let controller: MotivoController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [MotivoController],
}).compile();
controller = module.get<MotivoController>(MotivoController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});
+3 -3
View File
@@ -7,7 +7,7 @@ import {
PrimaryGeneratedColumn,
} from 'typeorm';
import { Institucion } from '../../institucion/entity/institucion.entity';
import { Motivo } from '../../motivo/entity/motivo.entity';
import { EquipoMotivo } from '../../equipo-motivo/entity/equipo-motivo.entity';
import { Multa } from '../../multa/entity/multa.entity';
import { Prestamo } from '../../prestamo/entity/prestamo.entity';
import { TipoUsuario } from '../../tipo-usuario/entity/tipo-usuario.entity';
@@ -44,8 +44,8 @@ export class Operador {
@JoinColumn({ name: 'id_tipo_usuario' })
tipoUsuario: TipoUsuario;
@OneToMany(() => Motivo, (motivo) => motivo.operador)
motivos: Motivo[];
@OneToMany(() => EquipoMotivo, (motivo) => motivo.operador)
motivos: EquipoMotivo[];
@OneToMany(() => Multa, (multa) => multa.opeardorMulta)
multas: Multa[];
+3 -3
View File
@@ -1,6 +1,6 @@
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm';
import { Equipo } from '../../equipo/entity/equipo.entity';
import { Motivo } from '../../motivo/entity/motivo.entity';
import { EquipoMotivo } from '../../equipo-motivo/entity/equipo-motivo.entity';
@Entity()
export class Status {
@@ -13,6 +13,6 @@ export class Status {
@OneToMany(() => Equipo, (equipo) => equipo.status)
equipos: Equipo[];
@OneToMany(() => Motivo, (motivo) => motivo.status)
motivos: Motivo[];
@OneToMany(() => EquipoMotivo, (motivo) => motivo.status)
motivos: EquipoMotivo[];
}
+4 -7
View File
@@ -1,4 +1,3 @@
import * as fs from 'fs';
import {
BadRequestException,
Controller,
@@ -43,12 +42,10 @@ export class UploadFileController {
const path = file ? `${file.destination}/${file.filename}` : null;
if (!file) throw new BadRequestException('No se mandó ningún archivo.');
return this.uploadFileService
.createUsuarios(path, parseInt(query.id_institucion))
.then((res) => {
fs.unlink(path, (err) => {});
return res;
});
return this.uploadFileService.createUsuarios(
path,
parseInt(query.id_institucion),
);
}
@Get('download-logo')