feat: refs #8119 itemCampaignQuantity #3117

Merged
guillermo merged 20 commits from 8119-itemCampaignQuantity into master 2024-10-23 10:40:43 +00:00
4 changed files with 72 additions and 102 deletions
Showing only changes of commit 1afb33c306 - Show all commits

View File

@ -1,8 +1,8 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `vn`.`itemCampaignQuantity_add`
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `vn`.`itemCampaig_add`
ON SCHEDULE EVERY 1 DAY
STARTS '2024-10-18 03:00:00.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL itemCampaignQuantity_add(NULL, NULL, NULL)$$
DO CALL itemCampaign_add()$$
DELIMITER ;

View File

@ -1,86 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemCampaignQuantity_add`(
vDateFrom DATE,
vDateTo DATE,
vCampaign VARCHAR(100)
)
proc: BEGIN
/**
* Añade registros a tabla itemCampaignQuantity.
*
* @param vDateFrom Fecha desde
* @param vDateTo Fecha hasta
* @param vCampaign Código de la campaña
*/
DECLARE vCurdate DATE;
DECLARE vYesterday DATE;
DECLARE vDefaultCampaign VARCHAR(100);
DECLARE vPreviousDaysToInsert INT;
DECLARE vDateSumFrom DATE;
DECLARE vDateSumTo DATE;
DECLARE vScopeDays INT;
SET vCurdate = util.VN_CURDATE();
SET vYesterday = util.yesterday();
IF vDateFrom IS NULL THEN
SET vDateFrom = vYesterday;
END IF;
IF vDateTo IS NULL THEN
SET vDateTo = vYesterday;
END IF;
IF vDateFrom > vDateTo THEN
CALL util.throw('Start date cannot be later than end date');
END IF;
SELECT defaultCampaign, previousDaysToInsert
INTO vDefaultCampaign, vPreviousDaysToInsert
FROM itemCampaignQuantityConfig;
IF vCampaign IS NULL THEN
SET vCampaign = vDefaultCampaign;
END IF;
IF vCampaign IS NULL OR vPreviousDaysToInsert IS NULL THEN
CALL util.throw('Missing values in the configuration table');
END IF;
SELECT dated, scopeDays INTO vDateSumTo, vScopeDays
FROM campaign
WHERE dated > vCurdate
AND code = vCampaign
ORDER BY dated
LIMIT 1;
IF vDateSumTo IS NULL OR vScopeDays IS NULL THEN
CALL util.throw('Missing data in campaign table');
END IF;
IF NOT vCurdate BETWEEN vDateSumTo - INTERVAL vPreviousDaysToInsert DAY
AND vDateSumTo THEN
LEAVE proc;
END IF;
SET vDateSumFrom = vDateSumTo - INTERVAL vScopeDays DAY;
REPLACE itemCampaignQuantity(dated, itemFk, quantity, total, campaign)
SELECT DATE(s.created),
s.itemFk,
SUM(CASE WHEN t.shipped BETWEEN vDateSumFrom AND vDateSumTo
THEN s.quantity
END) quantity,
SUM(CASE WHEN t.shipped BETWEEN vDateSumFrom AND vDateSumTo
THEN s.total
END) total,
vCampaign
FROM sale s
JOIN ticket t ON t.id = s.ticketFk
JOIN client c ON c.id = t.clientFk
WHERE s.created BETWEEN vDateFrom AND util.dayEnd(vDateTo)
AND c.businessTypeFk <> 'worker'
GROUP BY DATE(s.created), s.itemFk
HAVING quantity;
END$$
DELIMITER ;

View File

@ -0,0 +1,58 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemCampaign_add`()
proc: BEGIN
/**
* Añade registros a tabla itemCampaign.
*
* @param vDateFrom Fecha desde
* @param vDateTo Fecha hasta
* @param vCampaign Código de la campaña
*/
DECLARE vCurdate DATE;
DECLARE vYesterday DATE;
DECLARE vCampaign VARCHAR(100);
DECLARE vPreviousDays INT;
DECLARE vDateSumFrom DATE;
DECLARE vDateSumTo DATE;
DECLARE vScopeDays INT;
SET vCurdate = util.VN_CURDATE();
SELECT dated, code, scopeDays, previousDays
INTO vDateSumTo, vCampaign, vScopeDays, vPreviousDays
FROM campaign
WHERE dated > vCurdate
ORDER BY dated
LIMIT 1;
IF vCampaign IS NULL THEN
CALL util.throw('Missing data in campaign table');
END IF;
IF NOT vCurdate BETWEEN vDateSumTo - INTERVAL vPreviousDays DAY
AND vDateSumTo THEN
LEAVE proc;
END IF;
SET vDateSumFrom = vDateSumTo - INTERVAL vScopeDays DAY;
SET vYesterday = util.yesterday();
REPLACE itemCampaign(dated, itemFk, quantity, total, campaign)
SELECT DATE(s.created),
s.itemFk,
SUM(CASE WHEN t.shipped BETWEEN vDateSumFrom AND vDateSumTo
guillermo marked this conversation as resolved Outdated

aci es on et comentaba que el from y el tu van en el where i despues agrupem tot junt per item

aci es on et comentaba que el from y el tu van en el where i despues agrupem tot junt per item
THEN s.quantity
END) quantity,
SUM(CASE WHEN t.shipped BETWEEN vDateSumFrom AND vDateSumTo
THEN (s.quantity * s.price) * (100 - s.discount) / 100
END) total,
vCampaign
FROM sale s
JOIN ticket t ON t.id = s.ticketFk
JOIN client c ON c.id = t.clientFk
WHERE s.created BETWEEN vYesterday AND util.dayEnd(vYesterday)
guillermo marked this conversation as resolved
Review

el rango que ha d'agafar es del 15 d'octubre al 31 d'octubre (aprox)

el rango que ha d'agafar es del 15 d'octubre al 31 d'octubre (aprox)
AND c.typeFk = 'normal'
GROUP BY DATE(s.created), s.itemFk
guillermo marked this conversation as resolved Outdated

al voler-ho tot junt el group by ha de ser per itemFk soles

al voler-ho tot junt el group by ha de ser per itemFk soles
HAVING quantity;
END$$
DELIMITER ;

View File

@ -1,27 +1,25 @@
CREATE TABLE IF NOT EXISTS `vn`.`itemCampaignQuantity` (
CREATE TABLE IF NOT EXISTS `vn`.`itemCampaign` (
guillermo marked this conversation as resolved Outdated

posali una definicio de que es guarda en esta taula

posali una definicio de que es guarda en esta taula
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
dated date NOT NULL,
itemFk int(11) NOT NULL,
quantity decimal(10,2) NOT NULL,
total decimal(10,2) NOT NULL,
guillermo marked this conversation as resolved Outdated

posali un camp id, que a salix les claus primaries dobles no les gestiona be, despues ja poses una clau unique en item,quantity

posali un camp id, que a salix les claus primaries dobles no les gestiona be, despues ja poses una clau unique en item,quantity
campaign varchar(100) NOT NULL,
UNIQUE KEY `itemCampaignQuantity_UNIQUE` (`dated`,`itemFk`),
CONSTRAINT itemCampaignQuantity_item_FK FOREIGN KEY (itemFk) REFERENCES vn.item(id) ON DELETE RESTRICT ON UPDATE CASCADE
UNIQUE KEY `itemCampaign_UNIQUE` (`dated`,`itemFk`),
CONSTRAINT itemCampaign_item_FK FOREIGN KEY (itemFk) REFERENCES vn.item(id) ON DELETE RESTRICT ON UPDATE CASCADE
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb3
COLLATE=utf8mb3_unicode_ci
COMMENT='Tallos confirmados por día en los días de más producción de una campaña. La tabla está pensada para que sea una foto.';
guillermo marked this conversation as resolved Outdated

açò deuria tindre una Fk a la taula campaing?

açò deuria tindre una Fk a la taula campaing?

No se puede, ya que en la tabla campaign hay más de 1 registro con ese dato, y además es de tipo ENUM.

No se puede, ya que en la tabla campaign hay más de 1 registro con ese dato, y además es de tipo ENUM.
CREATE TABLE IF NOT EXISTS `vn`.`itemCampaignQuantityConfig` (
id int(10) unsigned NOT NULL PRIMARY KEY,
defaultCampaign varchar(100) NOT NULL COMMENT 'Campaña por defecto si se le pasa NULL',
previousDaysToInsert int(10) unsigned NOT NULL COMMENT 'Días anteriores a la fecha de fin de campaña para insertar',
CONSTRAINT `itemCampaignQuantityConfig_check` CHECK (`id` = 1)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb3
COLLATE=utf8mb3_unicode_ci;
ALTER TABLE vn.campaign
ADD previousDays int(10) unsigned DEFAULT 30 NOT NULL COMMENT 'Días previos para calcular e insertar en la tabla itemCampaign';
INSERT IGNORE INTO `vn`.`itemCampaignQuantityConfig` (id, defaultCampaign, previousDaysToInsert)
VALUES (1, 'allSaints', 90);
UPDATE vn.campaign
SET previousDays = 90
WHERE code = 'allSaints';
UPDATE vn.campaign
SET previousDays = 60
WHERE code IN ('valentinesDay', 'mothersDay');