salix/db/routines/vn/procedures/item_setGeneric.sql

57 lines
1.6 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_setGeneric`(vSelf INT)
BEGIN
/**
* Asigna el código genérico a un item, salvo que sea un código de item genérico.
*
* @param vSelf identificador de vn.item
*/
DECLARE vGenericFk INT;
SELECT itemFk INTO vGenericFk
FROM (
SELECT itemFk, SUM(matches) = maxMatches `match`
FROM (
SELECT ga.id gaid, ga.itemFk,
CASE
WHEN t.code = 'nflowers' THEN
it.value <=> ga.numFlores
WHEN t.code = 'origin' THEN
it.value <=> ga.origin
WHEN t.code = 'quality' THEN
it.value <=> ga.quality
WHEN t.code = 'color' THEN
it.value <=> ga.color
WHEN t.code = 'category' THEN
it.value <=> ga.category
WHEN t.code = 'producer' THEN
it.value <=> ga.productor
ELSE
0
END matches,
(NOT ISNULL(ga.origin))
+ (NOT ISNULL(ga.color))
+ (NOT ISNULL(ga.quality))
+ (NOT ISNULL(ga.numFlores))
+ (NOT ISNULL(ga.category))
+ (NOT ISNULL(ga.productor)) maxMatches
FROM vn.item i
JOIN vn.itemTag it ON it.itemFk = i.id
JOIN vn.tag t ON t.id = it.tagFk
JOIN vn.genericAllocation ga
ON (i.typeFk = ga.typeFk OR ga.typeFk IS NULL)
AND (i.longName = ga.longName OR ga.longName IS NULL)
AND (i.`size` = ga.`size` OR ga.`size` IS NULL)
AND i.id != ga.itemFk
WHERE i.id = vSelf
AND NOT i.isFloramondo) sub
GROUP BY gaid
HAVING `match`) sub2
LIMIT 1;
UPDATE vn.item
SET genericFk = vGenericFk
WHERE id = vSelf;
END$$
DELIMITER ;