Files
Vendaweb-api/src/sales/dashboard/dashboard.service.ts
2025-03-14 15:22:40 -03:00

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