feat(receipt-import): add rule-based category suggestion logic for items

feat(migrations): add new categories for lactose-free products and allergy options
This commit is contained in:
Nils-Johan Gynther
2026-05-02 16:42:33 +02:00
parent 2563738fcf
commit 1604751b65
6 changed files with 214 additions and 2 deletions
@@ -0,0 +1,63 @@
-- Ensure Allergi mejeri uses "Laktosfri mjölk" as L3 node.
-- 1) Rename old node when no target node exists yet.
UPDATE `Category` c_old
JOIN `Category` c2
ON c_old.parentId = c2.id
AND c2.name = 'Allergi mejeri'
JOIN `Category` c1
ON c2.parentId = c1.id
AND c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
LEFT JOIN `Category` c_new
ON c_new.parentId = c2.id
AND c_new.name = 'Laktosfri mjölk'
SET c_old.name = 'Laktosfri mjölk'
WHERE c_old.name = 'Mjölk'
AND c_new.id IS NULL;
-- 2) Re-point product links from old node to new node if both exist.
UPDATE `Product` p
JOIN `Category` c_old
ON p.categoryId = c_old.id
AND c_old.name = 'Mjölk'
JOIN `Category` c2
ON c_old.parentId = c2.id
AND c2.name = 'Allergi mejeri'
JOIN `Category` c1
ON c2.parentId = c1.id
AND c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
JOIN `Category` c_new
ON c_new.parentId = c2.id
AND c_new.name = 'Laktosfri mjölk'
SET p.categoryId = c_new.id;
-- 3) Remove duplicate old node when both old and new exist.
DELETE c_old
FROM `Category` c_old
JOIN `Category` c2
ON c_old.parentId = c2.id
AND c2.name = 'Allergi mejeri'
JOIN `Category` c1
ON c2.parentId = c1.id
AND c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
JOIN `Category` c_new
ON c_new.parentId = c2.id
AND c_new.name = 'Laktosfri mjölk'
WHERE c_old.name = 'Mjölk';
-- 4) Create missing target node if needed.
INSERT INTO `Category` (`name`, `parentId`)
SELECT 'Laktosfri mjölk', c2.id
FROM `Category` c1
JOIN `Category` c2
ON c2.parentId = c1.id
AND c2.name = 'Allergi mejeri'
LEFT JOIN `Category` c3
ON c3.parentId = c2.id
AND c3.name = 'Laktosfri mjölk'
WHERE c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
AND c3.id IS NULL;
@@ -0,0 +1,31 @@
-- Ensure L3 "Kvarg & Cottage cheese" exists in both dairy branches:
-- 1) Mejeri, ost & ägg > Allergi mejeri
-- 2) Mejeri, ost & ägg > Kvarg & Cottage cheese
-- Branch 1: under Allergi mejeri
INSERT INTO `Category` (`name`, `parentId`)
SELECT 'Kvarg & Cottage cheese', c2.id
FROM `Category` c1
JOIN `Category` c2
ON c2.parentId = c1.id
AND c2.name = 'Allergi mejeri'
LEFT JOIN `Category` c3
ON c3.parentId = c2.id
AND c3.name = 'Kvarg & Cottage cheese'
WHERE c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
AND c3.id IS NULL;
-- Branch 2: under standard Kvarg & Cottage cheese branch
INSERT INTO `Category` (`name`, `parentId`)
SELECT 'Kvarg & Cottage cheese', c2.id
FROM `Category` c1
JOIN `Category` c2
ON c2.parentId = c1.id
AND c2.name = 'Kvarg & Cottage cheese'
LEFT JOIN `Category` c3
ON c3.parentId = c2.id
AND c3.name = 'Kvarg & Cottage cheese'
WHERE c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
AND c3.id IS NULL;
@@ -0,0 +1,15 @@
-- Ensure L3 "Matfett" exists under:
-- Mejeri, ost & ägg > Allergi mejeri
INSERT INTO `Category` (`name`, `parentId`)
SELECT 'Matfett', c2.id
FROM `Category` c1
JOIN `Category` c2
ON c2.parentId = c1.id
AND c2.name = 'Allergi mejeri'
LEFT JOIN `Category` c3
ON c3.parentId = c2.id
AND c3.name = 'Matfett'
WHERE c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
AND c3.id IS NULL;
@@ -0,0 +1,15 @@
-- Ensure L3 "Allergi matlagning" exists under:
-- Mejeri, ost & ägg > Matlagning
INSERT INTO `Category` (`name`, `parentId`)
SELECT 'Allergi matlagning', c2.id
FROM `Category` c1
JOIN `Category` c2
ON c2.parentId = c1.id
AND c2.name = 'Matlagning'
LEFT JOIN `Category` c3
ON c3.parentId = c2.id
AND c3.name = 'Allergi matlagning'
WHERE c1.name = 'Mejeri, ost & ägg'
AND c1.parentId IS NULL
AND c3.id IS NULL;