Verlange menschliche Aktivierung echter Chargen

This commit is contained in:
gitea_admin committed 2026-09-06 08:09:21 +02:00
1 parent ed8927b37d
commit ee03fd70b9
3 files changed
+89

No files matched your search

+1
View File
@@ -11,6 +11,7 @@
7. `db/migrations/0007_phase1_excel_webhook.sql` 7. `db/migrations/0007_phase1_excel_webhook.sql`
8. `db/migrations/0008_shopify_sync_technical.sql` 8. `db/migrations/0008_shopify_sync_technical.sql`
9. `db/migrations/0013_virtual_shortage_lot_allocations.sql` 9. `db/migrations/0013_virtual_shortage_lot_allocations.sql`
10. `db/migrations/0014_require_human_lot_activation.sql`
## Beispielausfuehrung ## Beispielausfuehrung
@@ -0,0 +1,87 @@
-- Never promote an unnamed placeholder lot automatically.
CREATE OR REPLACE FUNCTION fn_auto_switch_lot_when_depleted()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
v_product_id BIGINT;
v_open_lot_id BIGINT;
v_current_net NUMERIC;
v_event_key TEXT;
BEGIN
SELECT product_id
INTO v_product_id
FROM stock_lot
WHERE id = NEW.lot_id;
IF NOT EXISTS (
SELECT 1 FROM stock_lot WHERE id = NEW.lot_id AND status = 'current'
) THEN
RETURN NEW;
END IF;
SELECT qty_net
INTO v_current_net
FROM v_stock_lot_balance
WHERE stock_lot_id = NEW.lot_id;
IF COALESCE(v_current_net, 0) > 0 THEN
RETURN NEW;
END IF;
PERFORM 1
FROM stock_lot
WHERE product_id = v_product_id
FOR UPDATE;
IF NOT EXISTS (
SELECT 1 FROM stock_lot WHERE id = NEW.lot_id AND status = 'current'
) THEN
RETURN NEW;
END IF;
SELECT id
INTO v_open_lot_id
FROM stock_lot
WHERE product_id = v_product_id
AND status = 'open'
AND lot_number IS NOT NULL
ORDER BY id
LIMIT 1
FOR UPDATE;
-- A real lot must be activated by a human through the lot-management flow.
IF v_open_lot_id IS NULL THEN
RETURN NEW;
END IF;
UPDATE stock_lot
SET status = 'closed', updated_at = NOW()
WHERE id = NEW.lot_id;
UPDATE stock_lot
SET status = 'current', updated_at = NOW()
WHERE id = v_open_lot_id;
INSERT INTO stock_lot (product_id, lot_number, status)
VALUES (v_product_id, NULL, 'open');
v_event_key := format('lot.auto_switched:%s:%s', v_product_id, txid_current());
PERFORM fn_enqueue_event(
'lot.auto_switched',
v_event_key,
'stock_lot',
NEW.lot_id::TEXT,
jsonb_build_object(
'productId', v_product_id,
'closedLotId', NEW.lot_id,
'newCurrentLotId', v_open_lot_id,
'occurredAt', NOW()
)
);
RETURN NEW;
END;
$$;
+1
View File
@@ -193,6 +193,7 @@ function switch_current_lot(PDO $pdo, int $productId, int $oldCurrentLotId, int
FROM stock_lot FROM stock_lot
WHERE product_id = :product_id WHERE product_id = :product_id
AND status = 'open' AND status = 'open'
AND lot_number IS NOT NULL
ORDER BY id ORDER BY id
LIMIT 1 LIMIT 1
FOR UPDATE" FOR UPDATE"