Add Shopify delta order import
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user