From 8ba2dce0f055b8e9b55224812091b3dda00d7322 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Tue, 17 Mar 2026 19:36:13 +0100 Subject: [PATCH] chore : add detailed orphaned CF diagnostic script Co-Authored-By: Claude Opus 4.6 (1M context) --- scripts/check-prod-orphaned-detail.php | 83 ++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 scripts/check-prod-orphaned-detail.php diff --git a/scripts/check-prod-orphaned-detail.php b/scripts/check-prod-orphaned-detail.php new file mode 100644 index 0000000..58ac54a --- /dev/null +++ b/scripts/check-prod-orphaned-detail.php @@ -0,0 +1,83 @@ + 'pdo_pgsql', + 'host' => 'localhost', + 'port' => 5432, + 'dbname' => 'inventory', + 'user' => 'ferme_user', + 'password' => 'fermerecette', +]); + +// Show a sample of orphaned CFValues for pieces +echo "--- Sample orphaned piece CFValues ---\n"; +$rows = $conn->fetchAllAssociative(" + SELECT cfv.id as cfv_id, cfv.value, cfv.pieceid, + cf.id as cf_id, cf.name as cf_name, + cf.typecomposantid, cf.typepieceid, cf.typeproductid, + p.name as piece_name, p.typepieceid as piece_modeltype + FROM custom_field_values cfv + JOIN custom_fields cf ON cf.id = cfv.customfieldid + JOIN pieces p ON p.id = cfv.pieceid + WHERE cfv.pieceid IS NOT NULL + AND cf.typepieceid IS NULL + ORDER BY p.name + LIMIT 10 +"); +echo sprintf("Found %d (limited to 10)\n\n", count($rows)); +foreach ($rows as $r) { + echo sprintf(" Piece '%s' | field '%s' = '%s' | CF FK: composant=%s piece=%s product=%s\n", + $r['piece_name'], $r['cf_name'], $r['value'], + $r['typecomposantid'] ?? 'NULL', + $r['typepieceid'] ?? 'NULL', + $r['typeproductid'] ?? 'NULL' + ); +} + +// Show a sample of orphaned CFValues for composants +echo "\n--- Sample orphaned composant CFValues ---\n"; +$rows = $conn->fetchAllAssociative(" + SELECT cfv.id as cfv_id, cfv.value, cfv.composantid, + cf.id as cf_id, cf.name as cf_name, + cf.typecomposantid, cf.typepieceid, cf.typeproductid, + c.name as composant_name, c.typecomposantid as composant_modeltype + FROM custom_field_values cfv + JOIN custom_fields cf ON cf.id = cfv.customfieldid + JOIN composants c ON c.id = cfv.composantid + WHERE cfv.composantid IS NOT NULL + AND cf.typecomposantid IS NULL + ORDER BY c.name + LIMIT 10 +"); +echo sprintf("Found %d (limited to 10)\n\n", count($rows)); +foreach ($rows as $r) { + echo sprintf(" Composant '%s' | field '%s' = '%s' | CF FK: composant=%s piece=%s product=%s\n", + $r['composant_name'], $r['cf_name'], $r['value'], + $r['typecomposantid'] ?? 'NULL', + $r['typepieceid'] ?? 'NULL', + $r['typeproductid'] ?? 'NULL' + ); +} + +// Check: are there CFs with ONLY typepieceid NULL but other FKs set? +echo "\n--- Orphaned CF FK patterns ---\n"; +$rows = $conn->fetchAllAssociative(" + SELECT + CASE WHEN typecomposantid IS NULL THEN 'NULL' ELSE 'SET' END as composant_fk, + CASE WHEN typepieceid IS NULL THEN 'NULL' ELSE 'SET' END as piece_fk, + CASE WHEN typeproductid IS NULL THEN 'NULL' ELSE 'SET' END as product_fk, + COUNT(*) as cnt + FROM custom_fields + GROUP BY composant_fk, piece_fk, product_fk + ORDER BY cnt DESC +"); +foreach ($rows as $r) { + echo sprintf(" composant=%s piece=%s product=%s : %d CFs\n", + $r['composant_fk'], $r['piece_fk'], $r['product_fk'], $r['cnt']); +}