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