vendaweb-api/src/Auth/services/user.service.ts

197 lines
7.5 KiB
TypeScript
Raw Normal View History

2025-01-27 20:44:27 +00:00
import { UserModel } from '../../domain/models/user.model';
import { HttpException, HttpStatus, Injectable } from "@nestjs/common";
import { User } from 'src/domain/entity/tables/estusuario.enity';
import { Connection, getConnection } from 'typeorm';
import md5 = require('md5');
import { CreateUserModel } from 'src/domain/models/create-user.model';
import { Pcempr } from '../../domain/entity/tables/pcempr.entity';
import { connectionOptions } from 'src/configs/typeorm.config';
@Injectable()
export class UserService {
async create(data: CreateUserModel): Promise<User> {
const connection = getConnection();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
try {
const user = await queryRunner.manager
.getRepository(User)
.createQueryBuilder('estusuario')
.where("\"estusuario\".email = :email", { email: data.email })
.getOne();
if (user != null) {
throw new HttpException("Já existe um usuário cadastrado no sistema com este email", HttpStatus.BAD_REQUEST);
}
} catch (err) {
throw err;
} finally {
await queryRunner.release();
}
const newUser = new User();
newUser.username = data.userName;
newUser.password = md5(data.password).toUpperCase();
newUser.email = data.email;
newUser.role = data.application;
newUser.blocked = "N";
newUser.registration = data.registration;
await getConnection()
.createQueryBuilder()
.insert()
.into(User)
.values(newUser)
.execute();
return newUser;
}
async findAll() {
const sqlUsers = `SELECT PCEMPR.MATRICULA as "userId"
,PCEMPR.NOME||' ('||PCEMPR.MATRICULA||')' as "name"
,PCEMPR.USUARIOBD as "userBD"
,PCEMPR.CODFILIAL as "storeId"
,PCEMPR.FUNCAO as "function"
,PCSETOR.DESCRICAO as "sector"
FROM PCEMPR, PCSETOR
WHERE PCEMPR.CODSETOR = PCSETOR.CODSETOR
AND PCEMPR.DTDEMISSAO IS NULL
ORDER BY PCEMPR.NOME`;
const connection = getConnection();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
try {
return await queryRunner.query(sqlUsers);
} finally {
await queryRunner.release();
}
}
async authenticate(user: UserModel): Promise<any> {
const connection = new Connection(connectionOptions);
await connection.connect();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
try {
const sql = 'SELECT PCEMPR.matricula as \"id\" ' +
' ,PCEMPR.usuariobd as \"userName\" ' +
' ,PCEMPR.codfilial as \"codigoFilial\" ' +
' ,PCFILIAL.fantasia as \"nomeFilial\" ' +
' ,PCEMPR.codusur as \"seller\" ' +
' ,NVL(PCEMPR.percdesc,0) as \"discountPercent\" ' +
' ,NVL(PCEMPR.codsetor,0) as \"sectorId\" ' +
' ,NVL(PCPARAMFILIAL.valor,0) as \"sectorManagerId\" ' +
' ,( SELECT PCUSUARI.CODSUPERVISOR FROM PCUSUARI WHERE PCUSUARI.CODUSUR = PCEMPR.CODUSUR ) as \"supervisorId\" ' +
' ,( SELECT NVL(P.valor,0) FROM PCPARAMFILIAL P WHERE P.CODFILIAL = \'99\' AND ' +
' P.NOME = \'CON_PRAZOENTREGA\' ) as \"deliveryTime\" ' +
' FROM PCEMPR, PCFILIAL, PCPARAMFILIAL ' +
' WHERE PCEMPR.CODFILIAL = PCFILIAL.CODIGO (+)' +
' AND PCPARAMFILIAL.CODFILIAL = \'99\' ' +
' AND PCPARAMFILIAL.NOME = \'CON_CODSETORGERENTELOJA\' ' +
' AND PCEMPR.EMAIL = :username AND PCEMPR.SENHABD = CRYPT(:password, USUARIOBD)';
const users = await queryRunner.manager
.query(sql, [user.email, user.password]);
if (users.length == 0) {
return null;
}
// const sqlDiasUteis = 'SELECT ( mv_prox_diautil( (TRUNC(SYSDATE) + :1) + COUNT(1), :2 ) - TRUNC(SYSDATE) ) as "days" ' +
// ' FROM MVDIASUTEIS ' +
// ' WHERE MVDIASUTEIS.CODFILIAL = :3 ' +
// ` AND MVDIASUTEIS.diaentrega = 'N' ` +
// ` AND MVDIASUTEIS.data BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + :4 `;
// const sqlDiasUteis = `SELECT CASE WHEN mv_prox_diautil(TRUNC(SYSDATE), :1) > TRUNC(SYSDATE) THEN
// ( ( mv_prox_diautil((mv_prox_diautil(TRUNC(SYSDATE), :2) + :3) + COUNT(1), :4 ) - (mv_prox_diautil(TRUNC(SYSDATE), :5)) ) - 1 )
// ELSE ( mv_prox_diautil((mv_prox_diautil(TRUNC(SYSDATE), :6) + :7) + COUNT(1), :8 ) - (mv_prox_diautil(TRUNC(SYSDATE), :9)) ) END as "days"
// FROM MVDIASUTEIS
// WHERE MVDIASUTEIS.CODFILIAL = :10
// AND MVDIASUTEIS.diaentrega = 'N'
// AND MVDIASUTEIS.data BETWEEN mv_prox_diautil(TRUNC(SYSDATE), :11) AND mv_prox_diautil(TRUNC(SYSDATE), :12) + :13`;
// const deliveryDays = await queryRunner.manager
// .query(sqlDiasUteis, ['6',
// '6', Number.parseInt(users[0].deliveryTime), '6', '6',
// '6', Number.parseInt(users[0].deliveryTime), '6', '6',
// '6',
// '6', '6', Number.parseInt(users[0].deliveryTime)
// ]);
const sqlDiasEntrega = `SELECT ( MAX(MVDIASUTEIS.DATA) - TRUNC(SYSDATE) ) as "days"
FROM MVDIASUTEIS
WHERE MVDIASUTEIS.data BETWEEN TRUNC(SYSDATE)
AND TRUNC(SYSDATE) + :dias`;
const sqlDiasSemEntrega = `SELECT GREATEST(COUNT(1) - 1,0) as "daysNoDelivery"
FROM MVDIASUTEIS
WHERE MVDIASUTEIS.data BETWEEN TRUNC(SYSDATE)
AND TRUNC(SYSDATE) + :dias
AND MVDIASUTEIS.DIAENTREGA = 'N'`;
const deliveryDays2 = await queryRunner.manager
.query(sqlDiasEntrega, [Number.parseInt(users[0].deliveryTime)]);
const noDeliveryDays = await queryRunner.manager
.query(sqlDiasSemEntrega, [Number.parseInt(users[0].deliveryTime)]);
const days = Number.parseInt(deliveryDays2[0].days) +
( noDeliveryDays.length > 0 ? Number.parseInt(noDeliveryDays[0].daysNoDelivery) : 0 );
const userDb = users[0];
console.log(userDb);
if (!isNaN(days)) {
userDb.deliveryTime = days; // deliveryDays[0].days;
}
console.log(days);
console.log(userDb);
return userDb;
} finally {
await queryRunner.release();
await connection.close();
}
}
async discountUser(userId: number): Promise<any> {
const connection = getConnection();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
try {
return await queryRunner.manager
.getRepository(Pcempr)
.createQueryBuilder('pcempr')
.select("NVL(\"pcempr\".percdesc,0) as \"discountUser\"")
.where("MATRICULA = :userId", { userId })
.getRawOne(); //...authUser,
} finally {
await queryRunner.release();
}
}
async update(email: string, newPassword: string) {
const connection = getConnection();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
try {
return await queryRunner.manager
.createQueryBuilder()
.update(User)
.set({ password: newPassword })
.where("EMAIL = :email", { email })
.execute();
} finally {
await queryRunner.release();
}
}
}