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 { 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 { 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 { 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(); } } }