Add Shopify delta order import

This commit is contained in:
2026-08-12 17:47:33 +02:00
parent 6e4925cdb6
commit db4168abd9
3 changed files with 585 additions and 0 deletions
@@ -0,0 +1,110 @@
BEGIN;
-- Shopify delta imports are authoritative reads from Shopify. They must not
-- enter the legacy n8n outbox path; future operational Shopify events need an
-- explicit integration contract instead.
CREATE OR REPLACE FUNCTION fn_enqueue_sales_order_events()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
v_event_key TEXT;
BEGIN
IF NEW.order_source = 'shopify' THEN
RETURN NEW;
END IF;
IF TG_OP = 'INSERT' THEN
v_event_key := format(
'order.imported:%s:%s',
NEW.external_ref,
to_char(NEW.imported_at, 'YYYYMMDDHH24MISSUS')
);
PERFORM fn_enqueue_event(
'order.imported', v_event_key, 'sales_order', NEW.id::TEXT,
jsonb_build_object(
'orderId', NEW.id, 'externalRef', NEW.external_ref,
'orderSource', NEW.order_source, 'orderStatus', NEW.order_status,
'paymentStatus', NEW.payment_status, 'occurredAt', NOW()
)
);
ELSIF TG_OP = 'UPDATE' THEN
IF OLD.imported_at IS DISTINCT FROM NEW.imported_at THEN
v_event_key := format(
'order.imported:%s:%s', NEW.external_ref,
to_char(NEW.imported_at, 'YYYYMMDDHH24MISSUS')
);
PERFORM fn_enqueue_event(
'order.imported', v_event_key, 'sales_order', NEW.id::TEXT,
jsonb_build_object(
'orderId', NEW.id, 'externalRef', NEW.external_ref,
'orderSource', NEW.order_source, 'orderStatus', NEW.order_status,
'paymentStatus', NEW.payment_status, 'occurredAt', NOW()
)
);
END IF;
IF OLD.order_status IS DISTINCT FROM NEW.order_status
AND NEW.order_status = 'cancelled' THEN
v_event_key := format(
'order.cancelled.full:%s:%s', NEW.external_ref,
COALESCE(NEW.cancelled_at, NOW())
);
PERFORM fn_enqueue_event(
'order.cancelled.full', v_event_key, 'sales_order', NEW.id::TEXT,
jsonb_build_object(
'orderId', NEW.id, 'externalRef', NEW.external_ref,
'orderSource', NEW.order_source, 'orderStatus', NEW.order_status,
'cancelledAt', COALESCE(NEW.cancelled_at, NOW()),
'cancelledReason', NEW.cancelled_reason
)
);
END IF;
END IF;
RETURN NEW;
END;
$$;
CREATE OR REPLACE FUNCTION fn_enqueue_partial_cancel_events()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
v_order_id BIGINT;
v_external_ref TEXT;
v_order_source TEXT;
v_event_key TEXT;
BEGIN
IF NEW.line_status = 'partially_cancelled'
AND OLD.line_status IS DISTINCT FROM NEW.line_status THEN
SELECT so.id, so.external_ref, so.order_source
INTO v_order_id, v_external_ref, v_order_source
FROM sales_order so
WHERE so.id = NEW.sales_order_id;
IF v_order_source = 'shopify' THEN
RETURN NEW;
END IF;
v_event_key := format(
'order.cancelled.partial:%s:%s:%s',
v_external_ref, NEW.id, NEW.qty_cancelled
);
PERFORM fn_enqueue_event(
'order.cancelled.partial', v_event_key, 'sales_order_line', NEW.id::TEXT,
jsonb_build_object(
'orderId', v_order_id, 'externalRef', v_external_ref,
'orderSource', v_order_source, 'lineId', NEW.id,
'lineNo', NEW.line_no, 'qty', NEW.qty,
'qtyCancelled', NEW.qty_cancelled, 'lineStatus', NEW.line_status,
'occurredAt', NOW()
)
);
END IF;
RETURN NEW;
END;
$$;
COMMIT;