151 lines
4.1 KiB
SQL
151 lines
4.1 KiB
SQL
DELIMITER $$
|
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`indicatorsUpdate`(vDated DATE)
|
|
BEGIN
|
|
|
|
DECLARE oneYearBefore DATE DEFAULT TIMESTAMPADD(YEAR,-1, vDated);
|
|
DECLARE twoMonthsBefore DATE DEFAULT TIMESTAMPADD(DAY,-60, vDated);
|
|
DECLARE oneMonthBefore DATE DEFAULT TIMESTAMPADD(DAY,-30, vDated);
|
|
DECLARE vWeek INT;
|
|
|
|
REPLACE indicators(updated)
|
|
VALUES(vDated);
|
|
|
|
-- Ventas totales del ultimo año
|
|
UPDATE indicators
|
|
SET lastYearSales =
|
|
(SELECT SUM(importe + recargo)
|
|
FROM ventas v
|
|
JOIN vn.company c ON c.id = v.empresa_id
|
|
JOIN vn.companyGroup cg ON cg.id = c.companyGroupFk
|
|
WHERE fecha BETWEEN oneYearBefore AND vDated
|
|
AND cg.code = 'Verdnatura'
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Greuge total acumulado
|
|
UPDATE indicators
|
|
SET totalGreuge =
|
|
(SELECT SUM(amount)
|
|
FROM vn.greuge
|
|
WHERE shipped <= vDated
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Tasa de morosidad con respecto a las ventas del último mes
|
|
UPDATE indicators
|
|
SET latePaymentRate =
|
|
(SELECT SUM(amount)
|
|
FROM bi.defaulters
|
|
WHERE date = vDated AND amount > 0)
|
|
/
|
|
(SELECT SUM(importe + recargo)
|
|
FROM ventas
|
|
WHERE fecha BETWEEN oneMonthBefore AND vDated)
|
|
WHERE updated = vDated;
|
|
|
|
-- Número de trabajadores activos
|
|
UPDATE indicators
|
|
SET countEmployee =
|
|
(SELECT CAST(SUM(ct.hoursWeek) / 40 AS DECIMAL (10, 2))
|
|
FROM vn.business b
|
|
JOIN vn.calendarType ct ON ct.id = b.calendarTypeFk
|
|
WHERE vDated BETWEEN b.started AND IFNULL(b.ended, vDated)
|
|
AND b.companyCodeFk = 'VNL'
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Maná medio acumulado por comercial
|
|
UPDATE indicators
|
|
SET averageMana =
|
|
(SELECT AVG(amount)
|
|
FROM vn.workerMana
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Número de clientes que han comprado en los últimos 30 dias
|
|
UPDATE indicators
|
|
SET lastMonthActiveClients =
|
|
(SELECT COUNT(DISTINCT t.clientFk)
|
|
FROM vn.ticket t
|
|
WHERE t.shipped BETWEEN oneMonthBefore AND vDated
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Número de clientes que no han comprado en los últimos 30 dias, pero compraron en los 30 anteriores
|
|
UPDATE indicators
|
|
SET lastMonthLostClients =
|
|
(SELECT COUNT(lm.clientFk)
|
|
FROM
|
|
(SELECT DISTINCT t.clientFk
|
|
FROM vn.ticket t
|
|
WHERE t.shipped BETWEEN oneMonthBefore AND vDated
|
|
) cm
|
|
RIGHT JOIN
|
|
(SELECT DISTINCT t.clientFk
|
|
FROM vn.ticket t
|
|
WHERE t.shipped >= twoMonthsBefore
|
|
AND t.shipped < oneMonthBefore
|
|
) lm ON lm.clientFk = cm.clientFk
|
|
WHERE cm.clientFk IS NULL
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Número de clientes que han comprado en los últimos 30 dias, pero no compraron en los 30 anteriores
|
|
UPDATE indicators
|
|
SET lastMonthNewClients =
|
|
(SELECT COUNT(cm.clientFk)
|
|
FROM
|
|
(SELECT DISTINCT t.clientFk
|
|
FROM vn.ticket t
|
|
WHERE t.shipped BETWEEN oneMonthBefore AND vDated
|
|
) cm
|
|
LEFT JOIN
|
|
(SELECT DISTINCT t.clientFk
|
|
FROM vn.ticket t
|
|
WHERE t.shipped >= twoMonthsBefore
|
|
AND t.shipped < oneMonthBefore
|
|
) lm ON lm.clientFk = cm.clientFk
|
|
WHERE lm.clientFk IS NULL
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Porcentaje de autopedidos sobre los pedidos totales
|
|
UPDATE indicators
|
|
SET lastMonthWebBuyingRate =
|
|
(SELECT (SUM(source_app != '') - SUM(source_app = 'TPV')) / SUM(source_app != '')
|
|
FROM hedera.`order`
|
|
WHERE date_send BETWEEN oneMonthBefore AND vDated
|
|
)
|
|
WHERE updated = vDated;
|
|
|
|
-- Cálculo de las ventas agrupado por semanas
|
|
SELECT week INTO vWeek
|
|
FROM vn.time
|
|
WHERE dated = vDated;
|
|
|
|
TRUNCATE salesByWeek;
|
|
|
|
INSERT INTO salesByWeek (week, year, sales)
|
|
SELECT t.week, t.year, SUM(v.importe + v.recargo) sales
|
|
FROM ventas v
|
|
LEFT JOIN vn.time t ON t.dated = fecha
|
|
GROUP BY t.week, t.year
|
|
ORDER BY t.week, t.year;
|
|
|
|
-- Indicador Ventas semana actual
|
|
UPDATE indicators i
|
|
JOIN salesByWeek s ON s.week= vWeek
|
|
AND s.year = YEAR(vDated)
|
|
SET i.thisWeekSales = s.sales
|
|
WHERE updated = vDated;
|
|
|
|
-- Indicador ventas semana actual en el año pasado
|
|
UPDATE indicators i
|
|
JOIN salesByWeek s ON s.week = vWeek
|
|
AND s.year = YEAR(vDated)-1
|
|
SET i.lastYearWeekSales = s.sales
|
|
WHERE updated = vDated;
|
|
|
|
END$$
|
|
DELIMITER ;
|