709 lines
46 KiB
TypeScript
709 lines
46 KiB
TypeScript
/*
|
|
https://docs.nestjs.com/providers#services
|
|
*/
|
|
|
|
import { Injectable } from '@nestjs/common';
|
|
import { connectionOptions } from 'src/configs/typeorm.config';
|
|
import { Connection } from 'typeorm';
|
|
//import { DataSource } from 'typeorm';
|
|
//import { EntityManager } from 'typeorm';
|
|
|
|
|
|
@Injectable()
|
|
export class DashboardService {
|
|
|
|
async dashboarSale() {
|
|
const connection = new Connection(connectionOptions);
|
|
await connection.connect();
|
|
const queryRunner = connection.createQueryRunner();
|
|
await queryRunner.connect();
|
|
try {
|
|
const sqlSale = `SELECT ROUND(SUM(VLVENDA),2) as "sale",
|
|
ROUND(SUM(CUSTOFIN),2) as "cost",
|
|
ROUND(SUM(VLDEVOLUCAO),2) as "devolution",
|
|
ROUND(SUM(VLMETA),2) as "objetivo",
|
|
CASE WHEN SUM(VLVENDA) > 0 THEN
|
|
ROUND(( ( ( SUM(VLVENDA) - SUM(CUSTOFIN) ) / SUM(VLVENDA) ) * 100 ),2) ELSE 0 END as "profit",
|
|
CASE WHEN SUM(VLMETA) > 0 THEN ROUND((( SUM(VLVENDA) / SUM(VLMETA) ) * 100),2) ELSE 0 END as "percentual",
|
|
SUM(NFS) as "nfs"
|
|
FROM (
|
|
SELECT VENDAS.DTSAIDA, VENDAS.CODSUPERVISOR,
|
|
SUM(VENDAS.VLVENDA) VLVENDA,
|
|
SUM(VENDAS.VLCUSTOFIN) CUSTOFIN,
|
|
0 VLDEVOLUCAO,
|
|
0 VLMETA,
|
|
COUNT(DISTINCT VENDAS.NUMTRANSVENDA) NFS
|
|
FROM view_vendas_resumo_faturamento vendas
|
|
WHERE VENDAS.DTSAIDA = TRUNC(SYSDATE)
|
|
AND VENDAS.CONDVENDA IN (1,7)
|
|
GROUP BY VENDAS.DTSAIDA, VENDAS.CODSUPERVISOR
|
|
UNION ALL
|
|
SELECT DEVOLUCAO.DTENT DTSAIDA, PCUSUARI.CODSUPERVISOR,
|
|
ROUND(SUM(DEVOLUCAO.vldevolucao * (-1)), 2) VLVENDA,
|
|
ROUND(SUM(DEVOLUCAO.VLCUSTOFIN * (-1)), 2) VLCUSTOFIN,
|
|
ROUND(SUM(DEVOLUCAO.VLDEVOLUCAO), 2) VLDEVOLUCAO,
|
|
0 VLMETA,
|
|
0 NFS
|
|
FROM view_devol_resumo_faturamento devolucao, PCNFSAID, PCNFENT, PCUSUARI
|
|
WHERE devolucao.dtent = TRUNC(SYSDATE)
|
|
AND DEVOLUCAO.NUMTRANSVENDA = PCNFSAID.NUMTRANSVENDA (+)
|
|
AND DEVOLUCAO.NUMTRANSENT = PCNFENT.NUMTRANSENT
|
|
AND DEVOLUCAO.codusurdevol = PCUSUARI.CODUSUR
|
|
GROUP BY DEVOLUCAO.DTENT, PCUSUARI.CODSUPERVISOR
|
|
UNION ALL
|
|
SELECT PCMETARCA.DATA, PCUSUARI.CODSUPERVISOR,
|
|
0 VLVENDA,
|
|
0 VLCUSTOFIN,
|
|
0 VLDEVOLUCAO,
|
|
SUM(PCMETARCA.VLVENDAPREV) VLMETA,
|
|
0 NFS
|
|
FROM PCMETARCA, PCUSUARI
|
|
WHERE PCMETARCA.DATA = trunc(sysdate)
|
|
AND PCMETARCA.CODUSUR = PCUSUARI.CODUSUR
|
|
GROUP BY PCMETARCA.DATA, PCUSUARI.CODSUPERVISOR ) DADOS`;
|
|
|
|
const sqlSaleBySupervisor = `SELECT DADOS.CODSUPERVISOR as "supervisorId",
|
|
PCSUPERV.NOME as "name",
|
|
ROUND(SUM(VLVENDA),2) as "sale",
|
|
ROUND(SUM(CUSTOFIN),2) as "cost",
|
|
ROUND(SUM(VLDEVOLUCAO),2) as "devolution",
|
|
ROUND(SUM(VLMETA),2) as "objetivo",
|
|
CASE WHEN SUM(VLVENDA) > 0 THEN
|
|
ROUND(( ( ( SUM(VLVENDA) - SUM(CUSTOFIN) ) / SUM(VLVENDA) ) * 100 ),2) ELSE 0 END as "profit",
|
|
CASE WHEN SUM(VLMETA) > 0 THEN ROUND((( SUM(VLVENDA) / SUM(VLMETA) ) * 100),2) ELSE 0 END as "percentual",
|
|
SUM(NFS) as "nfs"
|
|
FROM (
|
|
SELECT VENDAS.DTSAIDA, VENDAS.CODSUPERVISOR,
|
|
SUM(VENDAS.VLVENDA) VLVENDA,
|
|
SUM(VENDAS.VLCUSTOFIN) CUSTOFIN,
|
|
0 VLDEVOLUCAO,
|
|
0 VLMETA,
|
|
COUNT(DISTINCT VENDAS.NUMTRANSVENDA) NFS
|
|
FROM view_vendas_resumo_faturamento vendas
|
|
WHERE VENDAS.DTSAIDA = TRUNC(SYSDATE)
|
|
AND VENDAS.CONDVENDA IN (1,7)
|
|
GROUP BY VENDAS.DTSAIDA, VENDAS.CODSUPERVISOR
|
|
UNION ALL
|
|
SELECT DEVOLUCAO.DTENT DTSAIDA, PCUSUARI.CODSUPERVISOR,
|
|
SUM(DEVOLUCAO.vldevolucao * (-1)) VLVENDA,
|
|
SUM(DEVOLUCAO.VLCUSTOFIN * (-1)) VLCUSTOFIN,
|
|
SUM(DEVOLUCAO.VLDEVOLUCAO) VLDEVOLUCAO,
|
|
0 VLMETA,
|
|
0 NFS
|
|
FROM view_devol_resumo_faturamento devolucao, PCNFSAID, PCNFENT, PCUSUARI
|
|
WHERE devolucao.dtent = TRUNC(SYSDATE)
|
|
AND DEVOLUCAO.NUMTRANSVENDA = PCNFSAID.NUMTRANSVENDA (+)
|
|
AND DEVOLUCAO.NUMTRANSENT = PCNFENT.NUMTRANSENT
|
|
AND DEVOLUCAO.codusurdevol = PCUSUARI.CODUSUR
|
|
GROUP BY DEVOLUCAO.DTENT, PCUSUARI.CODSUPERVISOR
|
|
UNION ALL
|
|
SELECT PCMETARCA.DATA, PCUSUARI.CODSUPERVISOR,
|
|
0 VLVENDA,
|
|
0 VLCUSTOFIN,
|
|
0 VLDEVOLUCAO,
|
|
SUM(PCMETARCA.VLVENDAPREV) VLMETA,
|
|
0 NFS
|
|
FROM PCMETARCA, PCUSUARI
|
|
WHERE PCMETARCA.DATA = TRUNC(SYSDATE)
|
|
AND PCMETARCA.CODUSUR = PCUSUARI.CODUSUR
|
|
GROUP BY PCMETARCA.DATA, PCUSUARI.CODSUPERVISOR ) DADOS, PCSUPERV
|
|
WHERE DADOS.CODSUPERVISOR = PCSUPERV.CODSUPERVISOR
|
|
GROUP BY DADOS.CODSUPERVISOR, PCSUPERV.NOME
|
|
ORDER BY SUM(DADOS.VLVENDA) DESC`;
|
|
|
|
const sale = await queryRunner.query(sqlSale);
|
|
const saleBySupervisor = await queryRunner.query(sqlSaleBySupervisor);
|
|
|
|
const data = { ...sale[0], saleSupervisor: [...saleBySupervisor] };
|
|
return data;
|
|
} catch (error) {
|
|
console.log(error);
|
|
throw error;
|
|
} finally {
|
|
await queryRunner.release();
|
|
await connection.close();
|
|
}
|
|
|
|
}
|
|
|
|
async dashboardSeller(supervisorId: number, supervisorIds: string) {
|
|
const connection = new Connection(connectionOptions);
|
|
await connection.connect();
|
|
const queryRunner = connection.createQueryRunner();
|
|
await queryRunner.connect();
|
|
try {
|
|
let filter = '';
|
|
if (supervisorId != null) {
|
|
filter = `CODSUPERVISOR = ${supervisorId} `;
|
|
}
|
|
if (supervisorIds != null) {
|
|
filter = `CODSUPERVISOR IN ( ${supervisorIds} )`;
|
|
}
|
|
|
|
const sqlDashboard = `SELECT PCSUPERV.CODSUPERVISOR as "supervisorId",
|
|
PCSUPERV.NOME as "store",
|
|
PCUSUARI.CODUSUR as "sellerId",
|
|
PCUSUARI.NOME as "sellerName",
|
|
MAX(DIASMES.QTDIAS) as "qtdeDaysMonth",
|
|
MAX(DIASMES.QTDIASTRANSCORRIDOS) as "qtdeDays",
|
|
SUM(DADOS.VLMETA) as "objetivo" ,
|
|
SUM(DADOS.VLVENDA) as "saleValue",
|
|
SUM(DADOS.VLDEVOLUCAO) as "devolution",
|
|
( SUM(DADOS.VLVENDA) - SUM(DADOS.VLMETA) ) as "dif",
|
|
ROUND(CASE WHEN ( SUM(DADOS.VLVENDA) - SUM(DADOS.VLMETA) ) < 0 THEN
|
|
( SUM(DADOS.VLMETA) - SUM(DADOS.VLVENDA) ) /
|
|
DECODE(( MAX(DIASMES.QTDIAS) - MAX(DIASMES.QTDIASTRANSCORRIDOS) ), 0, 1, ( MAX(DIASMES.QTDIAS) - MAX(DIASMES.QTDIASTRANSCORRIDOS) ) )
|
|
ELSE 0 END,2) as "ObjetivoSale",
|
|
( CASE WHEN SUM(DADOS.VLMETA) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDA) / SUM(DADOS.VLMETA) * 100),2)
|
|
ELSE 0 END ) as "percentualObjective",
|
|
SUM(DADOS.QTNOTAS) as "qtdeInvoice",
|
|
CASE WHEN SUM(DADOS.QTNOTAS) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDA) / SUM(DADOS.QTNOTAS) ),2)
|
|
ELSE 0 END as "ticket",
|
|
SUM(DADOS.VLTABELA) as "listPrice",
|
|
( SUM(DADOS.VLTABELA) - SUM(DADOS.VLVENDA) ) as "discountValue",
|
|
ROUND(CASE WHEN SUM(DADOS.VLTABELA) > 0 THEN
|
|
( ( SUM(DADOS.VLTABELA) - SUM(DADOS.VLVENDA) ) / SUM(DADOS.VLTABELA) * 100 )
|
|
ELSE 0 END,2) as "percentOff",
|
|
SUM(DADOS.MIX) as "mix",
|
|
SUM(DADOS.VLMETADIA) as "objetiveToday",
|
|
SUM(DADOS.VLVENDADIA) as "saleToday",
|
|
SUM(DADOS.VLORCAMENTO) as "preSaleValue",
|
|
SUM(DADOS.QTORCAMENTO) as "preSaleQtde",
|
|
SUM(DADOS.QTNOTASDIA) as "qtdeInvoiceDay",
|
|
SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORA / 100) as "objetiveHour",
|
|
( CASE WHEN SUM(DADOS.VLMETADIA) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDADIA) / SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORA / 100) * 100),2)
|
|
ELSE 0 END ) as "percentualObjectiveHour",
|
|
SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORATOTAL / 100) as "objetiveTotalHour",
|
|
( CASE WHEN SUM(DADOS.VLMETADIA) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDADIA) / SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORATOTAL / 100) * 100),2)
|
|
ELSE 0 END ) as "percentualObjectiveTotalHour"
|
|
FROM ( SELECT PCMETARCA.CODUSUR,
|
|
SUM(PCMETARCA.VLVENDAPREV) VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA
|
|
FROM PCMETARCA
|
|
WHERE PCMETARCA.DATA BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE),-1)) + 1 AND LAST_DAY(TRUNC(SYSDATE))
|
|
GROUP BY PCMETARCA.CODUSUR
|
|
UNION ALL
|
|
SELECT PCMETARCA.CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
SUM(PCMETARCA.VLVENDAPREV) VLMETADIA,
|
|
0 QTNOTASDIA
|
|
FROM PCMETARCA
|
|
WHERE PCMETARCA.DATA = TRUNC(SYSDATE)
|
|
GROUP BY PCMETARCA.CODUSUR
|
|
UNION ALL
|
|
SELECT VENDAS.CODUSUR,
|
|
0 VLMETA,
|
|
SUM(VENDAS.VLVENDA) VLVENDA,
|
|
COUNT(DISTINCT VENDAS.NUMPED) QTNOTAS,
|
|
SUM(VENDAS.VLTABELA) VLTABELA,
|
|
COUNT(DISTINCT VENDAS.CODPROD) MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA
|
|
FROM view_vendas_resumo_faturamento VENDAS
|
|
WHERE VENDAS.DTSAIDA BETWEEN LAST_DAY(ADD_MONTHS((TRUNC(SYSDATE) - 1),-1)) + 1 AND TRUNC(SYSDATE)
|
|
AND VENDAS.CONDVENDA IN (1,7)
|
|
GROUP BY VENDAS.CODUSUR
|
|
UNION ALL
|
|
SELECT DEVOLUCAO.CODUSURDEVOL CODUSUR,
|
|
0 VLMETA,
|
|
SUM(DEVOLUCAO.VLDEVOLUCAO * (-1)) VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
SUM(DEVOLUCAO.VLDEVOLUCAO) VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA
|
|
FROM view_devol_resumo_faturamento DEVOLUCAO
|
|
WHERE DEVOLUCAO.DTENT BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE)-1,-1)) + 1 AND TRUNC(SYSDATE)
|
|
GROUP BY DEVOLUCAO.CODUSURDEVOL
|
|
UNION ALL
|
|
SELECT VENDAS.CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
SUM(VENDAS.VLVENDA) VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
COUNT(DISTINCT VENDAS.NUMPED) QTNOTASDIA
|
|
FROM view_vendas_resumo_faturamento VENDAS
|
|
WHERE VENDAS.DTSAIDA = TRUNC(SYSDATE)
|
|
AND VENDAS.CONDVENDA IN (1,7)
|
|
GROUP BY VENDAS.CODUSUR
|
|
UNION ALL
|
|
SELECT DEVOLUCAO.CODUSURDEVOL CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
SUM(DEVOLUCAO.VLDEVOLUCAO * (-1)) VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA
|
|
FROM view_devol_resumo_faturamento DEVOLUCAO
|
|
WHERE DEVOLUCAO.DTENT = TRUNC(SYSDATE)
|
|
GROUP BY DEVOLUCAO.CODUSURDEVOL
|
|
UNION ALL
|
|
SELECT PCORCAVENDAC.CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
SUM(PCORCAVENDAC.VLATEND) VLORCAMENTO,
|
|
COUNT(DISTINCT PCORCAVENDAC.NUMORCA) QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA
|
|
FROM PCORCAVENDAC
|
|
WHERE NVL(PCORCAVENDAC.ORCAMENTOUTILIZADO,'N') = 'N'
|
|
AND PCORCAVENDAC.DATA BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE) - 1, -1)) + 1 AND TRUNC(SYSDATE)
|
|
GROUP BY PCORCAVENDAC.CODUSUR
|
|
,PCORCAVENDAC.CODSUPERVISOR
|
|
) DADOS,
|
|
( SELECT COUNT(1) QTDIAS
|
|
,COUNT(CASE WHEN PCDIASUTEIS.DATA < TRUNC(SYSDATE) THEN 1 ELSE NULL END) QTDIASTRANSCORRIDOS
|
|
FROM PCDIASUTEIS
|
|
WHERE PCDIASUTEIS.CODFILIAL = '4'
|
|
AND PCDIASUTEIS.DIAVENDAS = 'S'
|
|
AND PCDIASUTEIS.DATA BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE),-1)) + 1 AND LAST_DAY(TRUNC(SYSDATE)) ) DIASMES,
|
|
(SELECT ESTMETAHORA.CODSUPERVISOR,
|
|
CASE WHEN TO_CHAR(SYSDATE, 'D') = 7 THEN
|
|
ESTMETAHORA.PERCMETADOM
|
|
ELSE ESTMETAHORA.PERCMETAHORA END PERCMETAHORA
|
|
, CASE WHEN TO_CHAR(SYSDATE, 'D') = 7 THEN
|
|
ESTMETAHORA.PERCMETADOMTOTAL
|
|
ELSE ESTMETAHORA.PERCMETAHORATOTAL END PERCMETAHORATOTAL
|
|
FROM ESTMETAHORA
|
|
WHERE ESTMETAHORA.${filter}
|
|
AND TO_CHAR(HORA, 'HH24') = TO_CHAR(SYSDATE, 'HH24')) META_HORA,
|
|
PCUSUARI, PCSUPERV
|
|
WHERE PCUSUARI.CODUSUR = DADOS.CODUSUR
|
|
AND PCUSUARI.CODSUPERVISOR = PCSUPERV.CODSUPERVISOR
|
|
AND PCUSUARI.CODSUPERVISOR = META_HORA.CODSUPERVISOR
|
|
AND PCUSUARI.${filter}
|
|
-- HAVING SUM(DADOS.VLMETA) > 0
|
|
GROUP BY PCSUPERV.CODSUPERVISOR, PCSUPERV.NOME, PCUSUARI.CODUSUR, PCUSUARI.NOME
|
|
ORDER BY PCUSUARI.NOME`;
|
|
|
|
const saleByRCA = await queryRunner.query(sqlDashboard);
|
|
let initialValue = 0;
|
|
const totalSale = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.saleValue,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalObjetive = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetivo,
|
|
initialValue,
|
|
);
|
|
initialValue = 0;
|
|
const totalObjetiveDay = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetiveToday,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalDiscount = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.discountValue,
|
|
initialValue,
|
|
);
|
|
initialValue = 0;
|
|
const totalMix = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.mix,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalNFs = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.qtdeInvoice,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalSaleToday = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.saleToday,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalDevolution = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.devolution,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalQtNfsDia = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.qtdeInvoiceDay,
|
|
initialValue,
|
|
);
|
|
|
|
const percentualSale = Number.parseFloat(((totalSale / totalObjetive) * 100).toFixed(2));
|
|
|
|
initialValue = 0;
|
|
const totalObjetiveHour = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetiveHour,
|
|
initialValue,
|
|
);
|
|
|
|
const percentualObjetiveHour = Number.parseFloat(((totalSaleToday / totalObjetiveHour) * 100).toFixed(2));
|
|
|
|
|
|
initialValue = 0;
|
|
const totalObjetiveCompanyHour = saleByRCA.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetiveTotalHour,
|
|
initialValue,
|
|
);
|
|
|
|
const percentualObjetiveCompanyHour = Number.parseFloat(((totalSaleToday / totalObjetiveCompanyHour) * 100).toFixed(2));
|
|
|
|
|
|
|
|
const data = {
|
|
objetive: totalObjetive, sale: totalSale, percentualSale: percentualSale,
|
|
discount: totalDiscount, nfs: totalNFs, mix: totalMix, objetiveToday: totalObjetiveDay,
|
|
saleToday: totalSaleToday, nfsToday: totalQtNfsDia, devolution: totalDevolution,
|
|
objetiveHour: totalObjetiveHour, percentualObjetiveHour: percentualObjetiveHour,
|
|
objetiveTotalHour: totalObjetiveCompanyHour, percentualObjetiveTotalHour: percentualObjetiveCompanyHour,
|
|
saleSupervisor: [...saleByRCA]
|
|
};
|
|
return data;
|
|
} catch (error) {
|
|
console.log(error);
|
|
throw error;
|
|
} finally {
|
|
await queryRunner.release();
|
|
await connection.close();
|
|
}
|
|
}
|
|
|
|
async dashboardCompany() { //supervisorId: number, supervisorIds: string) {
|
|
const connection = new Connection(connectionOptions);
|
|
await connection.connect();
|
|
const queryRunner = connection.createQueryRunner();
|
|
await queryRunner.connect();
|
|
try {
|
|
|
|
const sqlDashboard = `SELECT PCSUPERV.CODSUPERVISOR as "supervisorId",
|
|
PCSUPERV.NOME as "store",
|
|
MAX(DIASMES.QTDIAS) as "qtdeDaysMonth",
|
|
MAX(DIASMES.QTDIASTRANSCORRIDOS) as "qtdeDays",
|
|
SUM(DADOS.VLMETA) as "objetivo" ,
|
|
SUM(DADOS.VLVENDA) as "saleValue",
|
|
SUM(DADOS.VLDEVOLUCAO) as "devolution",
|
|
( SUM(DADOS.VLVENDA) - SUM(DADOS.VLMETA) ) as "dif",
|
|
ROUND(CASE WHEN ( SUM(DADOS.VLVENDA) - SUM(DADOS.VLMETA) ) < 0 THEN
|
|
( SUM(DADOS.VLMETA) - SUM(DADOS.VLVENDA) ) /
|
|
DECODE(( MAX(DIASMES.QTDIAS) - MAX(DIASMES.QTDIASTRANSCORRIDOS) ), 0, 1, ( MAX(DIASMES.QTDIAS) - MAX(DIASMES.QTDIASTRANSCORRIDOS) ) )
|
|
ELSE 0 END,2) as "ObjetivoSale",
|
|
( CASE WHEN SUM(DADOS.VLMETA) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDA) / SUM(DADOS.VLMETA) * 100),2)
|
|
ELSE 0 END ) as "percentualObjective",
|
|
SUM(DADOS.QTNOTAS) as "qtdeInvoice",
|
|
CASE WHEN SUM(DADOS.QTNOTAS) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDA) / SUM(DADOS.QTNOTAS) ),2)
|
|
ELSE 0 END as "ticket",
|
|
SUM(DADOS.VLTABELA) as "listPrice",
|
|
( SUM(DADOS.VLTABELA) - SUM(DADOS.VLVENDA) ) as "discountValue",
|
|
ROUND(CASE WHEN SUM(DADOS.VLTABELA) > 0 THEN
|
|
( ( SUM(DADOS.VLTABELA) - SUM(DADOS.VLVENDA) ) / SUM(DADOS.VLTABELA) * 100 )
|
|
ELSE 0 END,2) as "percentOff",
|
|
SUM(DADOS.MIX) as "mix",
|
|
SUM(DADOS.VLMETADIA) as "objetiveToday",
|
|
SUM(DADOS.VLVENDADIA) as "saleToday",
|
|
SUM(DADOS.VLORCAMENTO) as "preSaleValue",
|
|
SUM(DADOS.QTORCAMENTO) as "preSaleQtde",
|
|
SUM(DADOS.QTNOTASDIA) as "qtdeInvoiceDay",
|
|
SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORA / 100) as "objetiveHour",
|
|
( CASE WHEN SUM(DADOS.VLMETADIA) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDADIA) / SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORA / 100) * 100),2)
|
|
ELSE 0 END ) as "percentualObjectiveHour",
|
|
SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORATOTAL / 100) as "objetiveTotalHour",
|
|
( CASE WHEN SUM(DADOS.VLMETADIA) > 0 THEN
|
|
ROUND(( SUM(DADOS.VLVENDADIA) / SUM(DADOS.VLMETADIA * META_HORA.PERCMETAHORATOTAL / 100) * 100),2)
|
|
ELSE 0 END ) as "percentualObjectiveTotalHour",
|
|
SUM(DADOS.VLCUSTOFIN) as "profitValue"
|
|
FROM ( SELECT PCMETARCA.CODUSUR,
|
|
SUM(PCMETARCA.VLVENDAPREV) VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA,
|
|
0 VLCUSTOFIN
|
|
FROM PCMETARCA
|
|
WHERE PCMETARCA.DATA BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE),-1)) + 1 AND TRUNC(SYSDATE) - 1
|
|
GROUP BY PCMETARCA.CODUSUR
|
|
UNION ALL
|
|
SELECT PCMETARCA.CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
SUM(PCMETARCA.VLVENDAPREV) VLMETADIA,
|
|
0 QTNOTASDIA,
|
|
0 VLCUSTOFIN
|
|
FROM PCMETARCA
|
|
WHERE PCMETARCA.DATA = TRUNC(SYSDATE)
|
|
GROUP BY PCMETARCA.CODUSUR
|
|
UNION ALL
|
|
SELECT VENDAS.CODUSUR,
|
|
0 VLMETA,
|
|
SUM(VENDAS.VLVENDA) VLVENDA,
|
|
COUNT(DISTINCT VENDAS.NUMPED) QTNOTAS,
|
|
SUM(VENDAS.VLTABELA) VLTABELA,
|
|
COUNT(DISTINCT VENDAS.CODPROD) MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA,
|
|
0 VLCUSTOFIN
|
|
FROM view_vendas_resumo_faturamento VENDAS
|
|
WHERE VENDAS.DTSAIDA BETWEEN LAST_DAY(ADD_MONTHS((TRUNC(SYSDATE) - 1),-1)) + 1 AND TRUNC(SYSDATE) - 1
|
|
AND VENDAS.CONDVENDA IN (1,7)
|
|
GROUP BY VENDAS.CODUSUR
|
|
UNION ALL
|
|
SELECT DEVOLUCAO.CODUSURDEVOL CODUSUR,
|
|
0 VLMETA,
|
|
SUM(DEVOLUCAO.VLDEVOLUCAO * (-1)) VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
SUM(DEVOLUCAO.VLDEVOLUCAO) VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA,
|
|
0 VLCUSTOFIN
|
|
FROM view_devol_resumo_faturamento DEVOLUCAO
|
|
WHERE DEVOLUCAO.DTENT BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE)-1,-1)) + 1 AND TRUNC(SYSDATE) - 1
|
|
GROUP BY DEVOLUCAO.CODUSURDEVOL
|
|
UNION ALL
|
|
SELECT VENDAS.CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
SUM(VENDAS.VLVENDA) VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
COUNT(DISTINCT VENDAS.NUMPED) QTNOTASDIA,
|
|
SUM(VENDAS.VLCUSTOFIN) VLCUSTOFIN
|
|
FROM view_vendas_resumo_faturamento VENDAS
|
|
WHERE VENDAS.DTSAIDA = TRUNC(SYSDATE)
|
|
AND VENDAS.CONDVENDA IN (1,7)
|
|
GROUP BY VENDAS.CODUSUR
|
|
UNION ALL
|
|
SELECT DEVOLUCAO.CODUSURDEVOL CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
SUM(DEVOLUCAO.VLDEVOLUCAO * (-1)) VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
0 VLORCAMENTO,
|
|
0 QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA,
|
|
SUM(DEVOLUCAO.VLCUSTOFIN * (-1)) VLCUSTOFIN
|
|
FROM view_devol_resumo_faturamento DEVOLUCAO
|
|
WHERE DEVOLUCAO.DTENT = TRUNC(SYSDATE)
|
|
GROUP BY DEVOLUCAO.CODUSURDEVOL
|
|
UNION ALL
|
|
SELECT PCORCAVENDAC.CODUSUR,
|
|
0 VLMETA,
|
|
0 VLVENDA,
|
|
0 QTNOTAS,
|
|
0 VLTABELA,
|
|
0 MIX,
|
|
0 VLVENDADIA,
|
|
0 VLDEVOLUCAO,
|
|
SUM(PCORCAVENDAC.VLATEND) VLORCAMENTO,
|
|
COUNT(DISTINCT PCORCAVENDAC.NUMORCA) QTORCAMENTO,
|
|
0 VLMETADIA,
|
|
0 QTNOTASDIA,
|
|
0 VLCUSTOFIN
|
|
FROM PCORCAVENDAC
|
|
WHERE NVL(PCORCAVENDAC.ORCAMENTOUTILIZADO,'N') = 'N'
|
|
AND PCORCAVENDAC.DATA BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE) - 1, -1)) + 1 AND TRUNC(SYSDATE)
|
|
GROUP BY PCORCAVENDAC.CODUSUR
|
|
,PCORCAVENDAC.CODSUPERVISOR
|
|
) DADOS,
|
|
( SELECT COUNT(1) QTDIAS
|
|
,COUNT(CASE WHEN PCDIASUTEIS.DATA < TRUNC(SYSDATE) THEN 1 ELSE NULL END) QTDIASTRANSCORRIDOS
|
|
FROM PCDIASUTEIS
|
|
WHERE PCDIASUTEIS.CODFILIAL = '4'
|
|
AND PCDIASUTEIS.DIAVENDAS = 'S'
|
|
AND PCDIASUTEIS.DATA BETWEEN LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE),-1)) + 1 AND LAST_DAY(TRUNC(SYSDATE)) ) DIASMES,
|
|
(SELECT ESTMETAHORA.CODSUPERVISOR,
|
|
CASE WHEN TO_CHAR(SYSDATE, 'D') = 7 THEN
|
|
ESTMETAHORA.PERCMETADOM
|
|
ELSE ESTMETAHORA.PERCMETAHORA END PERCMETAHORA
|
|
, CASE WHEN TO_CHAR(SYSDATE, 'D') = 7 THEN
|
|
ESTMETAHORA.PERCMETADOMTOTAL
|
|
ELSE ESTMETAHORA.PERCMETAHORATOTAL END PERCMETAHORATOTAL
|
|
FROM ESTMETAHORA
|
|
WHERE TO_CHAR(HORA, 'HH24') = TO_CHAR(SYSDATE, 'HH24')) META_HORA,
|
|
PCUSUARI, PCSUPERV
|
|
WHERE PCUSUARI.CODUSUR = DADOS.CODUSUR
|
|
AND PCUSUARI.CODSUPERVISOR = PCSUPERV.CODSUPERVISOR
|
|
AND PCUSUARI.CODSUPERVISOR = META_HORA.CODSUPERVISOR
|
|
-- HAVING SUM(DADOS.VLMETA) > 0
|
|
GROUP BY PCSUPERV.CODSUPERVISOR, PCSUPERV.NOME
|
|
ORDER BY PCSUPERV.NOME`;
|
|
|
|
const saleByStore = await queryRunner.query(sqlDashboard);
|
|
let initialValue = 0;
|
|
const totalSale = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.saleValue,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalObjetive = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetivo,
|
|
initialValue,
|
|
);
|
|
initialValue = 0;
|
|
const totalObjetiveDay = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetiveToday,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalDiscount = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.discountValue,
|
|
initialValue,
|
|
);
|
|
initialValue = 0;
|
|
const totalMix = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.mix,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalNFs = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.qtdeInvoice,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalSaleToday = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.saleToday,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalDevolution = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.devolution,
|
|
initialValue,
|
|
);
|
|
|
|
initialValue = 0;
|
|
const totalQtNfsDia = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.qtdeInvoiceDay,
|
|
initialValue,
|
|
);
|
|
|
|
const percentualSale = Number.parseFloat(((totalSale / totalObjetive) * 100).toFixed(2));
|
|
|
|
initialValue = 0;
|
|
const totalObjetiveHour = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetiveHour,
|
|
initialValue,
|
|
);
|
|
|
|
const percentualObjetiveHour = Number.parseFloat(((totalSaleToday / totalObjetiveHour) * 100).toFixed(2));
|
|
|
|
|
|
initialValue = 0;
|
|
const totalObjetiveCompanyHour = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.objetiveTotalHour,
|
|
initialValue,
|
|
);
|
|
|
|
const percentualObjetiveCompanyHour = Number.parseFloat(((totalSaleToday / totalObjetiveCompanyHour) * 100).toFixed(2));
|
|
|
|
initialValue = 0;
|
|
const totalProfitCompany = saleByStore.reduce(
|
|
(accumulator, currentValue) => accumulator + currentValue.profitValue,
|
|
initialValue,
|
|
);
|
|
|
|
const profitPerc = ( ( totalSaleToday - totalProfitCompany) / totalSaleToday ) * 100;
|
|
const profitValue = ( totalSaleToday - totalProfitCompany);
|
|
|
|
|
|
const data = {
|
|
objetive: totalObjetive, sale: totalSale, percentualSale: percentualSale,
|
|
discount: totalDiscount, nfs: totalNFs, mix: totalMix, objetiveToday: totalObjetiveDay,
|
|
saleToday: totalSaleToday, nfsToday: totalQtNfsDia, devolution: totalDevolution,
|
|
objetiveHour: totalObjetiveHour, percentualObjetiveHour: percentualObjetiveHour,
|
|
objetiveTotalHour: totalObjetiveCompanyHour, percentualObjetiveTotalHour: percentualObjetiveCompanyHour,
|
|
profitValue: profitValue, profitPerc: profitPerc,
|
|
saleSupervisor: [...saleByStore]
|
|
};
|
|
return data;
|
|
} catch (error) {
|
|
console.log(error);
|
|
throw error;
|
|
} finally {
|
|
await queryRunner.release();
|
|
await connection.close();
|
|
}
|
|
}
|
|
}
|