{
  "ursId": "URS-043",
  "title": "Link shipments to orders with LOT numbers",
  "timestamp": "2026-04-23T03:42:21.536Z",
  "durationMs": 45174,
  "config": {
    "inboxUrl": "http://localhost:64529",
    "dbHost": "localhost",
    "dbPort": 64530,
    "dbName": "cc_repinbox_dev"
  },
  "setup": {
    "status": "pass"
  },
  "scenarios": [
    {
      "name": "Step 1: Orders list shows ZBO-2025-001",
      "status": "pass",
      "description": "Step 1: Orders list shows ZBO-2025-001",
      "screenshots": [
        "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/screenshots/step-01-orders-list.png"
      ],
      "explanation": "Logs in as alex.admin@zurimed.com and navigates to /billing with the \"All Orders\" filter. Confirms ZBO-2025-001 (the Bill-Only Order that carries the seeded LOT numbers) is visible in the table. This is the entry point of the traceability chain.",
      "startedAt": "2026-04-23T03:42:27.362Z",
      "finishedAt": "2026-04-23T03:42:27.362Z",
      "videoPath": "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/videos/step-01-orders-list.webm"
    },
    {
      "name": "Step 2: BO detail shows both LOT numbers",
      "status": "pass",
      "description": "Step 2: BO detail shows both LOT numbers",
      "screenshots": [
        "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/screenshots/step-02-bo-detail-lots.png"
      ],
      "explanation": "Opens the ZBO-2025-001 detail page and verifies a \"LOT/Serial\" column header is rendered. Both seeded LOT numbers (LOT-SP-2024-0891 on line 1 and LOT-FL-2024-0334 on line 2) must appear on separate rows. This proves the order-to-LOT link in the chain.",
      "startedAt": "2026-04-23T03:42:37.898Z",
      "finishedAt": "2026-04-23T03:42:37.898Z",
      "videoPath": "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/videos/step-02-bo-detail-lots.webm"
    },
    {
      "name": "Step 3: Packages list",
      "status": "pass",
      "description": "Step 3: Packages list",
      "screenshots": [
        "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/screenshots/step-03-packages-list.png"
      ],
      "explanation": "Navigates to /packages and confirms both seeded Shipping Packages are visible: MAN-2025-0156 (the \"linked\" package whose items reference ZBO-2025-001) and MAN-2025-0147 (the \"tracking\" package used to validate carrier/tracking evidence).",
      "startedAt": "2026-04-23T03:42:42.741Z",
      "finishedAt": "2026-04-23T03:42:42.741Z",
      "videoPath": "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/videos/step-03-packages-list.webm"
    },
    {
      "name": "Step 4: Package items reference source BO",
      "status": "pass",
      "description": "Step 4: Package items reference source BO",
      "screenshots": [
        "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/screenshots/step-04-package-detail-order-linkage.png"
      ],
      "explanation": "Opens MAN-2025-0156 detail page and confirms the items table includes \"Order Number\" and \"Line Number\" columns. Both rows must show ZBO-2025-001 as the order number and line numbers 1 and 2 respectively. This proves the shipment-to-order linkage required by URS-043.",
      "startedAt": "2026-04-23T03:42:49.484Z",
      "finishedAt": "2026-04-23T03:42:49.484Z",
      "videoPath": "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/videos/step-04-package-linked-to-order.webm"
    },
    {
      "name": "Step 5: Tracking + carrier visible on shipment",
      "status": "pass",
      "description": "Step 5: Tracking + carrier visible on shipment",
      "screenshots": [
        "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/screenshots/step-05-tracking-visible.png"
      ],
      "explanation": "Opens MAN-2025-0147 detail page and confirms that both the carrier (FedEx) and the tracking number (775899342290) are rendered on the shipment entity. This validates the URS requirement that shipments surface tracking metadata.",
      "startedAt": "2026-04-23T03:42:55.995Z",
      "finishedAt": "2026-04-23T03:42:55.995Z",
      "videoPath": "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/videos/step-05-tracking-visible.webm"
    },
    {
      "name": "Step 6: Package → Order reference",
      "status": "pass",
      "description": "Step 6: Package → Order reference",
      "screenshots": [
        "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/screenshots/step-06a-package-shows-order-number.png"
      ],
      "explanation": "Starting from the MAN-2025-0156 package detail page, reads the ZBO-2025-001 order number from the items table. This is Part A of the end-to-end traceability walk: confirming the text reference exists so the user can look up the originating order.",
      "startedAt": "2026-04-23T03:43:02.726Z",
      "finishedAt": "2026-04-23T03:43:02.726Z",
      "videoPath": "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/videos/step-06-traceability-walk.webm"
    },
    {
      "name": "Step 6: BO detail LOTs re-confirmed",
      "status": "pass",
      "description": "Step 6: BO detail LOTs re-confirmed",
      "screenshots": [
        "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z/screenshots/step-06b-bo-detail-lots-reconfirmed.png"
      ],
      "explanation": "Follows the order number reference from the package detail back to the ZBO-2025-001 Bill-Only Order and re-confirms both LOT numbers are still present. This closes the full chain: Package → Order Number → LOT numbers, completing the traceability walk.",
      "startedAt": "2026-04-23T03:43:04.241Z",
      "finishedAt": "2026-04-23T03:43:04.241Z"
    }
  ],
  "dbValidations": [
    {
      "name": "Bill-Only Order carries the expected LOT numbers",
      "query": "\n    SELECT bo.order_number, bo.manufacturer_organization_id, boi.lot_number, op.sku AS product_sku\n      FROM billing_orders bo\n      JOIN billing_order_items boi ON boi.billing_order_id = bo.id\n      JOIN org_products op ON op.id = boi.product_id\n     WHERE bo.id = $1\n     ORDER BY boi.created_at, boi.id",
      "status": "pass",
      "rows": [
        {
          "order_number": "ZBO-2025-001",
          "manufacturer_organization_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "lot_number": "LOT-SP-2024-0891",
          "product_sku": "SP019N1A"
        },
        {
          "order_number": "ZBO-2025-001",
          "manufacturer_organization_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "lot_number": "LOT-FL-2024-0334",
          "product_sku": "FL516SNA"
        }
      ],
      "assertion": "ZBO-2025-001 should own 2 line items with LOTs LOT-FL-2024-0334, LOT-SP-2024-0891, owned by the ZuriMED manufacturer org."
    },
    {
      "name": "Shipping Package items reference the Bill-Only Order by text linkage",
      "query": "\n    SELECT sp.manifest_id, spi.order_number, spi.order_line_number, spi.quantity\n      FROM shipping_packages sp\n      JOIN shipping_package_items spi ON spi.package_id = sp.id\n     WHERE sp.id = $1\n     ORDER BY spi.order_line_number",
      "status": "pass",
      "rows": [
        {
          "manifest_id": "MAN-2025-0156",
          "order_number": "ZBO-2025-001",
          "order_line_number": "1",
          "quantity": 5
        },
        {
          "manifest_id": "MAN-2025-0156",
          "order_number": "ZBO-2025-001",
          "order_line_number": "2",
          "quantity": 3
        }
      ],
      "assertion": "MAN-2025-0156 should have 2 items with order_number=ZBO-2025-001 and order_line_number ∈ (1, 2)."
    },
    {
      "name": "Shipping Package surfaces carrier + tracking number",
      "query": "\n    SELECT manifest_id, tracking_number, carrier, status\n      FROM shipping_packages\n     WHERE id = $1",
      "status": "pass",
      "rows": [
        {
          "manifest_id": "MAN-2025-0147",
          "tracking_number": "775899342290",
          "carrier": "FedEx",
          "status": "in_transit"
        }
      ],
      "assertion": "MAN-2025-0147 should report tracking_number=775899342290, carrier=FedEx, status=in_transit."
    },
    {
      "name": "Traceability join: BO ↔ Shipping Package links resolve to LOT-bearing rows",
      "query": "\n    SELECT bo.order_number,\n           boi.lot_number,\n           sp.manifest_id,\n           spi.order_line_number,\n           spi.quantity\n      FROM billing_orders bo\n      JOIN billing_order_items boi\n        ON boi.billing_order_id = bo.id\n      JOIN shipping_package_items spi\n        ON spi.order_number = bo.order_number\n      JOIN shipping_packages sp\n        ON sp.id = spi.package_id\n     WHERE bo.id = $1\n       AND sp.id = $2\n     ORDER BY spi.order_line_number, boi.created_at, boi.id",
      "status": "pass",
      "rows": [
        {
          "order_number": "ZBO-2025-001",
          "lot_number": "LOT-SP-2024-0891",
          "manifest_id": "MAN-2025-0156",
          "order_line_number": "1",
          "quantity": 5
        },
        {
          "order_number": "ZBO-2025-001",
          "lot_number": "LOT-FL-2024-0334",
          "manifest_id": "MAN-2025-0156",
          "order_line_number": "1",
          "quantity": 5
        },
        {
          "order_number": "ZBO-2025-001",
          "lot_number": "LOT-SP-2024-0891",
          "manifest_id": "MAN-2025-0156",
          "order_line_number": "2",
          "quantity": 3
        },
        {
          "order_number": "ZBO-2025-001",
          "lot_number": "LOT-FL-2024-0334",
          "manifest_id": "MAN-2025-0156",
          "order_line_number": "2",
          "quantity": 3
        }
      ],
      "assertion": "Joining billing_order_items ↔ shipping_package_items on order_number should yield 4 rows (2 BO lines × 2 package lines for ZBO-2025-001), every row carrying a LOT, covering LOT-SP-2024-0891, LOT-FL-2024-0334."
    }
  ],
  "overallStatus": "pass",
  "outputDir": "/Users/jason/projects/casecohort/code/validation_test_results/urs-043-link-shipments-to-orders-with-lot-numbers/2026-04-23T03-42-21-534Z",
  "auditStartTime": "2026-04-23T03:42:19.640Z",
  "auditEventEvidence": [
    {
      "createdAt": "2026-04-23T03:42:23.948Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@zurimed.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "ZuriMED",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@zurimed.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-04-23T03:42:30.468Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@zurimed.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "ZuriMED",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@zurimed.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-04-23T03:42:39.181Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@zurimed.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "ZuriMED",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@zurimed.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-04-23T03:42:45.690Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@zurimed.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "ZuriMED",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@zurimed.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-04-23T03:42:52.627Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@zurimed.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "ZuriMED",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@zurimed.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-04-23T03:42:59.019Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@zurimed.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "ZuriMED",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@zurimed.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    }
  ],
  "auditQuery": "SELECT\n    ae.created_at,\n    ae.event_type,\n    ae.action,\n    ae.user_id,\n    u.email AS user_email,\n    ae.organization_id,\n    o.name AS organization_name,\n    ae.object_id,\n    ae.secondary_object_id,\n    ae.payload,\n    ae.route,\n    ae.trace_id\n  FROM audit_events ae\n  LEFT JOIN users u ON u.id = ae.user_id\n  LEFT JOIN organizations o ON o.id = ae.organization_id\n  WHERE ae.created_at >= $1\n    AND ae.organization_id = ANY($2::uuid[])\n  ORDER BY ae.created_at ASC",
  "auditAssertions": [],
  "emailAssertions": []
}