← back to Kravet Sheet Sync 2026 04 20

fix_catalog_drift.sql

92 lines

-- Reconcile kravet_catalog.shopify_product_id against authoritative
-- kravet_dwkk_variant_map (from Shopify).
-- Non-destructive: no rows deleted. Only pointer fields are touched.

BEGIN;

-- Add orphaned_at column for audit (idempotent)
ALTER TABLE kravet_catalog
  ADD COLUMN IF NOT EXISTS orphaned_at timestamptz;

-- ===================================================================
-- 1) FIX wrong_product_pointer rows
-- Catalog has a shopify_product_id but it doesn't match the current
-- Shopify variant's product. Overwrite with the correct pointer.
-- ===================================================================
WITH fixable AS (
  SELECT c.id, m.product_gid AS correct_pid, m.status AS shop_status
    FROM kravet_catalog c
    JOIN kravet_dwkk_variant_map m ON m.dw_sku = c.dw_sku
   WHERE c.dw_sku LIKE 'DWKK-%'
     AND c.shopify_product_id IS NOT NULL
     AND (CASE WHEN c.shopify_product_id LIKE 'gid://%' THEN c.shopify_product_id
               ELSE 'gid://shopify/Product/' || c.shopify_product_id END) <> m.product_gid
)
UPDATE kravet_catalog c
   SET shopify_product_id = f.correct_pid,
       on_shopify          = true,
       orphaned_at         = NULL,
       status              = LOWER(f.shop_status),
       updated_at          = now()
  FROM fixable f
 WHERE c.id = f.id;

\echo === reconciled wrong_product_pointer rows ===
SELECT COUNT(*) AS updated_rows
  FROM kravet_catalog c
  JOIN kravet_dwkk_variant_map m ON m.dw_sku = c.dw_sku
 WHERE c.updated_at > now() - INTERVAL '1 minute'
   AND c.dw_sku LIKE 'DWKK-%';

-- ===================================================================
-- 2) ORPHAN rows — dw_sku pointed to a Shopify product but Shopify has
-- no DWKK-<N> variant with that SKU at all. Clear the pointer and mark.
-- ===================================================================
UPDATE kravet_catalog c
   SET shopify_product_id = NULL,
       on_shopify          = false,
       orphaned_at         = now()
 WHERE c.dw_sku LIKE 'DWKK-%'
   AND c.shopify_product_id IS NOT NULL
   AND NOT EXISTS (
         SELECT 1 FROM kravet_dwkk_variant_map m WHERE m.dw_sku = c.dw_sku
       );

\echo === orphan rows cleared ===
SELECT COUNT(*) AS orphaned_rows
  FROM kravet_catalog
 WHERE orphaned_at > now() - INTERVAL '1 minute';

-- ===================================================================
-- 3) BACKFILL previously-unlinked catalog rows that now have a variant
-- (catalog rows where shopify_product_id was NULL but dw_sku IS in variant_map)
-- ===================================================================
UPDATE kravet_catalog c
   SET shopify_product_id = m.product_gid,
       on_shopify          = true,
       orphaned_at         = NULL,
       status              = LOWER(m.status),
       updated_at          = now()
  FROM kravet_dwkk_variant_map m
 WHERE c.dw_sku = m.dw_sku
   AND c.shopify_product_id IS NULL;

\echo === backfilled previously-unlinked rows ===
SELECT COUNT(*) FROM kravet_catalog
 WHERE updated_at > now() - INTERVAL '1 minute'
   AND shopify_product_id IS NOT NULL AND orphaned_at IS NULL
   AND dw_sku LIKE 'DWKK-%';

-- ===================================================================
-- 4) FINAL SUMMARY
-- ===================================================================
\echo === final state ===
SELECT
  COUNT(*) FILTER (WHERE shopify_product_id IS NOT NULL)                         AS linked_to_shopify,
  COUNT(*) FILTER (WHERE shopify_product_id IS NULL AND orphaned_at IS NOT NULL) AS orphaned,
  COUNT(*) FILTER (WHERE shopify_product_id IS NULL AND orphaned_at IS NULL)     AS never_on_shopify,
  COUNT(*)                                                                       AS total_dwkk_in_catalog
FROM kravet_catalog WHERE dw_sku LIKE 'DWKK-%';

COMMIT;