181 lines
6.1 KiB
TypeScript
181 lines
6.1 KiB
TypeScript
import {
|
|
ConflictException,
|
|
forwardRef,
|
|
Inject,
|
|
Injectable,
|
|
NotFoundException,
|
|
} from '@nestjs/common';
|
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
import { Repository } from 'typeorm';
|
|
import { Institucion } from '../institucion/entity/institucion.entity';
|
|
import { Modulo } from './entity/modulo.entity';
|
|
import { Operador } from '../operador/entity/operador.entity';
|
|
import { InformacionModuloView } from './entity/views/informacion-modulo.view';
|
|
import { FullInformacionModuloView } from './entity/views/full-informacion-modulo.view';
|
|
import { InstitucionService } from '../institucion/institucion.service';
|
|
import { ModuloMotivoService } from '../modulo-motivo/modulo-motivo.service';
|
|
|
|
@Injectable()
|
|
export class ModuloService {
|
|
constructor(
|
|
@InjectRepository(Modulo) private repository: Repository<Modulo>,
|
|
@InjectRepository(InformacionModuloView)
|
|
private informacionModuloView: Repository<InformacionModuloView>,
|
|
@InjectRepository(FullInformacionModuloView)
|
|
private fullInformacionModuloView: Repository<FullInformacionModuloView>,
|
|
private institucionService: InstitucionService,
|
|
@Inject(forwardRef(() => ModuloMotivoService))
|
|
private moduloMotivoService: ModuloMotivoService,
|
|
) {}
|
|
|
|
create(admin: Operador, modulo: string): Promise<{ message: string }> {
|
|
// Buscamos un registro con ese nombre en la institución del admin
|
|
return this.findModulo(admin.institucion, modulo, true)
|
|
.then((_) =>
|
|
// Creamos y guardamos un registro
|
|
this.repository.save(
|
|
this.repository.create({
|
|
institucion: admin.institucion,
|
|
modulo,
|
|
}),
|
|
),
|
|
)
|
|
.then((_) => ({ message: 'Se creó correctamente un nuevo módulo.' }));
|
|
}
|
|
|
|
findAllActivo(id_institucion: number): Promise<Modulo[]> {
|
|
return this.institucionService
|
|
.findById(id_institucion)
|
|
.then((institucion) =>
|
|
this.fullInformacionModuloView.find({
|
|
where: {
|
|
activo_modulo: 1,
|
|
id_institucion: institucion.id_institucion,
|
|
},
|
|
}),
|
|
)
|
|
.then((infoModulos) => {
|
|
const modulos: Modulo[] = [];
|
|
|
|
for (let i = 0; i < infoModulos.length; i++)
|
|
modulos.push(this.fullViewToModulo(infoModulos[i]));
|
|
return modulos;
|
|
});
|
|
}
|
|
|
|
findAllAdmin(operador: Operador): Promise<Modulo[]> {
|
|
return this.fullInformacionModuloView
|
|
.find({ where: { id_institucion: operador.institucion.id_institucion } })
|
|
.then((infoModulos) => {
|
|
const modulos: Modulo[] = [];
|
|
|
|
for (let i = 0; i < infoModulos.length; i++)
|
|
modulos.push(this.fullViewToModulo(infoModulos[i]));
|
|
return modulos;
|
|
});
|
|
}
|
|
|
|
findById(id_modulo: number): Promise<Modulo> {
|
|
return this.informacionModuloView
|
|
.findOne({ where: { id_modulo } })
|
|
.then((infoModulo) => {
|
|
if (!infoModulo)
|
|
throw new NotFoundException('No existe este id módulo.');
|
|
return this.repository.create({
|
|
id_modulo: infoModulo.id_modulo,
|
|
institucion: { id_institucion: infoModulo.id_institucion },
|
|
});
|
|
});
|
|
}
|
|
|
|
findFullInfoById(id_modulo: number): Promise<Modulo> {
|
|
return this.repository.findOne({ where: { id_modulo } }).then((modulo) => {
|
|
if (!modulo) throw new NotFoundException('No existe este id módulo.');
|
|
return modulo;
|
|
});
|
|
}
|
|
|
|
findMinInfoById(id_modulo: number): Promise<Modulo> {
|
|
return this.fullInformacionModuloView
|
|
.findOne({ where: { id_modulo } })
|
|
.then((infoModulo) => {
|
|
if (!infoModulo)
|
|
throw new NotFoundException('No existe este id módulo.');
|
|
return this.fullViewToModulo(infoModulo);
|
|
});
|
|
}
|
|
|
|
findModulo(
|
|
institucion: Institucion,
|
|
modulo: string,
|
|
validarExiste = false,
|
|
): Promise<Modulo> {
|
|
return this.fullInformacionModuloView
|
|
.findOne({
|
|
where: { id_institucion: institucion.id_institucion, modulo },
|
|
})
|
|
.then((infoModulo) => {
|
|
if (infoModulo && validarExiste)
|
|
throw new ConflictException(
|
|
'Ya existe un módulo en esta institución con este nombre, intente con otro.',
|
|
);
|
|
return this.fullViewToModulo(infoModulo);
|
|
});
|
|
}
|
|
|
|
private fullViewToModulo(infoModulo: FullInformacionModuloView): Modulo {
|
|
if (!infoModulo) return null;
|
|
return this.repository.create({
|
|
id_modulo: infoModulo.id_modulo,
|
|
activo: infoModulo.activo_modulo === 1,
|
|
modulo: infoModulo.modulo,
|
|
institucion: {
|
|
id_institucion: infoModulo.id_institucion,
|
|
institucion: infoModulo.institucion,
|
|
},
|
|
});
|
|
}
|
|
|
|
update(
|
|
admin: Operador,
|
|
attrs: Partial<Modulo>,
|
|
motivo?: string,
|
|
numero_alumnos?: number,
|
|
fecha_creacion?: string,
|
|
): Promise<{ message: string }> {
|
|
// Validamos que si se manda uno solo de esos campos, se deba mandar todos los demas
|
|
if (
|
|
(motivo || numero_alumnos || fecha_creacion) &&
|
|
(!motivo || !numero_alumnos || !fecha_creacion)
|
|
)
|
|
throw new ConflictException('No se mandó toda la información necesaria.');
|
|
return this.findById(attrs.id_modulo)
|
|
.then(async (modulo) => {
|
|
// Validamos que el módulo pertenezca a la institución del admin
|
|
if (
|
|
admin.institucion.id_institucion != modulo.institucion.id_institucion
|
|
)
|
|
throw new ConflictException(
|
|
'No puedes modificar la información este módulo porque no pertenece a tu institución.',
|
|
);
|
|
// Si se quiere cambiar el nombre del módulo validamos que no exista uno con el mismo nombre
|
|
if (attrs.modulo)
|
|
await this.findModulo(modulo.institucion, attrs.modulo, true);
|
|
// Asignamos valores enviados al objeto
|
|
Object.assign(modulo, attrs);
|
|
// Se crea un registro del cambio de status de este módulo
|
|
if (motivo)
|
|
await this.moduloMotivoService.create(
|
|
admin,
|
|
modulo,
|
|
motivo,
|
|
numero_alumnos,
|
|
fecha_creacion,
|
|
);
|
|
// Guardamos cambios
|
|
return this.repository.save(modulo);
|
|
})
|
|
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
|
|
}
|
|
}
|