From e18e56c484b1bb2f0fe89c0ed6e454c9a2d807d4 Mon Sep 17 00:00:00 2001 From: MsShawnP Date: Mon, 3 Aug 2026 13:17:35 -0400 Subject: [PATCH 1/5] Engagement scaffold: gitignore + deploy guard --- .dockerignore | 6 ++++++ .gitignore | 8 ++++++++ scripts/engagement_guard.py | 25 +++++++++++++++++++++++++ scripts/git-hooks/pre-push | 24 ++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 scripts/engagement_guard.py create mode 100755 scripts/git-hooks/pre-push diff --git a/.dockerignore b/.dockerignore index 48efdde..1f3bb1b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,3 +6,9 @@ docs tests __pycache__ *.pyc + +# --- lailara engagement scaffold --- +client-data/ +client-output/ +engagement.yml +engagement.yaml diff --git a/.gitignore b/.gitignore index b701a09..221e332 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,11 @@ htmlcov/ .env.* *.pem secrets.* + +# --- lailara engagement scaffold --- +# Client engagement data is runtime-only: never commit it, never deploy it. +client-data/ +client-output/ +/engagement.yml +/engagement.yaml +# (engagement.demo.yml and engagement.example.yml stay committable) diff --git a/scripts/engagement_guard.py b/scripts/engagement_guard.py new file mode 100644 index 0000000..ec77677 --- /dev/null +++ b/scripts/engagement_guard.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +"""Lailara engagement deploy guard (Python, stdlib-only). + +Exit 2 if an ACTIVE (non-demo) client engagement.yml is present in the current +directory. No-op otherwise, so demo builds and clean CI checkouts are unaffected. +Self-contained (no dependency on the installed lailara_engagement package) so it can +run in any repo's deploy/build environment. +""" +import os +import re +import sys + +for _f in ("engagement.yml", "engagement.yaml"): + if os.path.isfile(_f): + with open(_f, encoding="utf-8-sig") as _fh: + _txt = _fh.read() + if re.search(r"^\s*demo:\s*true\s*$", _txt, re.M): + continue # demo config -> safe + sys.stderr.write( + f"ENGAGEMENT GUARD: active client engagement config present ({_f}). " + "Client mode is runtime-only and must never deploy. Deactivate it " + "(set 'demo: true', or use engagement.demo.yml) before deploying.\n" + ) + raise SystemExit(2) +raise SystemExit(0) diff --git a/scripts/git-hooks/pre-push b/scripts/git-hooks/pre-push new file mode 100755 index 0000000..9be9de9 --- /dev/null +++ b/scripts/git-hooks/pre-push @@ -0,0 +1,24 @@ +#!/bin/sh +# Lailara engagement deploy guard (git pre-push hook). +# +# Refuses to push while an ACTIVE (non-demo) client engagement.yml is present in +# the working tree. Every tool repo auto-deploys on push, so blocking the push +# blocks the deploy — client mode is runtime-only and must never ship. +# +# No-op when no engagement.yml exists (demo builds and clean CI checkouts push +# normally), so demo behavior is unchanged. +# +# Activated per repo with: git config core.hooksPath scripts/git-hooks +set -e +for f in engagement.yml engagement.yaml; do + if [ -f "$f" ]; then + if grep -Eq '^[[:space:]]*demo:[[:space:]]*true[[:space:]]*$' "$f"; then + continue # demo config -> safe + fi + echo "ENGAGEMENT GUARD: active client engagement config present ($f)." >&2 + echo "Client mode is runtime-only and must never deploy. Deactivate it" >&2 + echo "(set 'demo: true', or remove/rename to engagement.demo.yml) before pushing." >&2 + exit 2 + fi +done +exit 0 From e0c9fa17abf6a44486369c1cab32a189b8d56636 Mon Sep 17 00:00:00 2001 From: MsShawnP Date: Mon, 3 Aug 2026 14:41:33 -0400 Subject: [PATCH 2/5] Lock demo golden + P1 regression (item-setup-form-preflight) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add tests_golden.py: locks the 50-SKU Cinderhaven demo bounce counts (walmart 29, costco/unfi/kehe 26) via the real audit pipeline, plus P1 regression tests for the 07-31 INFO-counting bug. Verified by reproduction that the fix is already on disk: an INFO-only row (valid UPC-A carrying the UPC_NOT_GTIN13 advisory) stays PASS in the per-row engine and clean in both orchestrator aggregates (do_validate and do_validate_rows) — errorTypeCounts and topFailingFields exclude INFO. A negative-control test confirms real CRITICAL failures still register. Regenerate scripts/results/*.json with the current single-count engine (they footed and no longer double-count GTIN) and update their README. Add pytest config so bare `pytest` collects the root tests_*.py surface alongside tests/test_*.py. Co-Authored-By: Claude Opus 4.8 --- pyproject.toml | 5 + scripts/results/README.md | 39 +- scripts/results/costco.json | 894 ++++++++++++++++++++++------------- scripts/results/kehe.json | 686 ++++++++++++++++++--------- scripts/results/unfi.json | 686 ++++++++++++++++++--------- scripts/results/walmart.json | 685 ++++++++++++++++++--------- tests_golden.py | 165 +++++++ 7 files changed, 2176 insertions(+), 984 deletions(-) create mode 100644 tests_golden.py diff --git a/pyproject.toml b/pyproject.toml index ccc0010..a2eaab3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,11 @@ dev = [ [project.scripts] item-preflight = "src.cli.audit:cli" +[tool.pytest.ini_options] +# Collect both the mirrored tests/ suite (test_*.py) and the root-level +# client-mode surface (tests_golden.py, tests_client_mode.py). +python_files = ["test_*.py", "tests_*.py"] + [tool.ruff] line-length = 88 diff --git a/scripts/results/README.md b/scripts/results/README.md index 1d3080b..9038668 100644 --- a/scripts/results/README.md +++ b/scripts/results/README.md @@ -1,22 +1,27 @@ -# Archived validation results — regenerate before citing +# Archived validation results These per-partner JSON files (`walmart.json`, `costco.json`, `unfi.json`, -`kehe.json`) were generated by an earlier build of the validation engine and -**predate the GTIN single-count fix**. They contain two artifacts of that -older engine: +`kehe.json`) are the audit-CLI output for the 50-SKU Cinderhaven demo master +(`data/cinderhaven/product_master.csv`), one file per partner schema. -- Rows with an invalid GTIN carry **two** CRITICAL `GTIN_HIERARCHY_WRONG` - entries for the same field (the advisory was stamped CRITICAL alongside the - real failure), so raw error-entry counts over-count GTIN failures - (walmart: 10 of 50 rows affected; costco/unfi/kehe: 8 of 50 each). -- On those rows, `pass_count + fail_count != fields_checked` (the per-row - counts do not foot). The current engine foots by construction. +**Regenerated 2026-08-03 with the current single-count engine.** They no longer +carry the two artifacts of the pre-fix engine: -**Do not cite raw error-entry counts from these files.** Regenerate with the -current engine (`src/cli/audit.py`) before deriving any new figures. +- Rows with an invalid GTIN now carry exactly **one** CRITICAL + `GTIN_HIERARCHY_WRONG` entry (the INFO advisory is no longer stamped CRITICAL + alongside the real failure), so raw error-entry counts are accurate. +- On every row, `pass_count + fail_count == fields_checked` (the counts foot by + construction). -Row-level verdicts and per-row failed-field identities are unaffected. The -case-study figures derived from these files (29/26/26/26 bounce counts, the -identical-26 overlap claim, and the field-gap table: 18/18/10/8/2/2/2 of 50) -were recomputed per-row against the current engine's semantics and re-verified -2026-07-31 — they remain correct. +Bounce counts: walmart 29/50, costco 26/50, unfi 26/50, kehe 26/50 — locked by +`tests_golden.py`. + +## Regenerate + +```bash +for p in walmart costco unfi kehe; do + python -c "from src.cli.audit import cli; cli()" audit \ + data/cinderhaven/product_master.csv -p $p -f json --accept-mapping \ + > scripts/results/$p.json +done +``` diff --git a/scripts/results/costco.json b/scripts/results/costco.json index 003c5ee..6bda85b 100644 --- a/scripts/results/costco.json +++ b/scripts/results/costco.json @@ -9,36 +9,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -52,36 +59,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -95,9 +109,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 5, @@ -109,15 +131,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -131,9 +160,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 7, @@ -145,9 +182,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 8, @@ -159,36 +204,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -202,9 +254,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 10, @@ -216,36 +276,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -253,56 +320,49 @@ "row": 11, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 12, - "fail_count": 6, + "pass_count": 11, + "fail_count": 5, "tier_summary": { "presence": 4, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 1, but should be 9. Corrected GTIN would be 00614140000099." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 1, but should be 9. Corrected GTIN would be 00614140000099.", + "trigger": null } ] }, @@ -316,9 +376,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 13, @@ -330,9 +398,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 14, @@ -344,36 +420,37 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 15, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 16, - "fail_count": 2, + "pass_count": 15, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 0, but should be 6. Corrected GTIN would be 00614140000136." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 0, but should be 6. Corrected GTIN would be 00614140000136.", + "trigger": null } ] }, @@ -387,15 +464,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -403,28 +487,21 @@ "row": 17, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 16, - "fail_count": 2, + "pass_count": 15, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 4, but should be 0. Corrected GTIN would be 00614140000150." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 4, but should be 0. Corrected GTIN would be 00614140000150.", + "trigger": null } ] }, @@ -432,56 +509,49 @@ "row": 18, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 12, - "fail_count": 6, + "pass_count": 11, + "fail_count": 5, "tier_summary": { "presence": 4, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, - "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 4, but should be 7. Corrected GTIN would be 00614140000167." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 4, but should be 7. Corrected GTIN would be 00614140000167.", + "trigger": null } ] }, @@ -495,9 +565,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 20, @@ -509,36 +587,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -552,64 +637,65 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 22, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 12, - "fail_count": 6, + "pass_count": 11, + "fail_count": 5, "tier_summary": { "presence": 4, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 5, but should be 4. Corrected GTIN would be 00614140000204." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 5, but should be 4. Corrected GTIN would be 00614140000204.", + "trigger": null } ] }, @@ -623,36 +709,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -666,9 +759,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 25, @@ -680,9 +781,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 26, @@ -694,9 +803,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 27, @@ -708,9 +825,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 28, @@ -722,9 +847,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 29, @@ -736,15 +869,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -752,28 +892,21 @@ "row": 30, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 16, - "fail_count": 2, + "pass_count": 15, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 9, but should be 0. Corrected GTIN would be 00614140000280." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 9, but should be 0. Corrected GTIN would be 00614140000280.", + "trigger": null } ] }, @@ -787,43 +920,44 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 32, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 15, - "fail_count": 3, + "pass_count": 14, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 7, but should be 3. Corrected GTIN would be 00614140000303." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 7, but should be 3. Corrected GTIN would be 00614140000303.", + "trigger": null } ] }, @@ -831,28 +965,21 @@ "row": 33, "verdict": "FAIL", "fields_checked": 16, - "pass_count": 16, - "fail_count": 2, + "pass_count": 15, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 7, but should be 0. Corrected GTIN would be 00614140000310." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 7, but should be 0. Corrected GTIN would be 00614140000310.", + "trigger": null } ] }, @@ -866,43 +993,50 @@ "presence": 5, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -916,9 +1050,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 36, @@ -930,9 +1072,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 37, @@ -944,9 +1094,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 38, @@ -958,9 +1116,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 39, @@ -972,9 +1138,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 40, @@ -986,36 +1160,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1029,36 +1210,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1072,9 +1260,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 43, @@ -1086,36 +1282,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1129,36 +1332,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1172,36 +1382,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1215,36 +1432,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1258,36 +1482,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1301,9 +1532,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 49, @@ -1315,36 +1554,43 @@ "presence": 4, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_length_in' is required but missing or empty." + "message": "'club_pack_length_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_width_in' is required but missing or empty." + "message": "'club_pack_width_in' is required but missing or empty.", + "trigger": null }, { "field": "club_pack_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'club_pack_height_in' is required but missing or empty." + "message": "'club_pack_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -1358,9 +1604,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 51, @@ -1372,8 +1626,16 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] } ] diff --git a/scripts/results/kehe.json b/scripts/results/kehe.json index cd41e21..5675b96 100644 --- a/scripts/results/kehe.json +++ b/scripts/results/kehe.json @@ -9,15 +9,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -31,15 +38,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -53,9 +67,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 5, @@ -67,22 +89,29 @@ "presence": 2, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null }, { "field": "pallet_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'pallet_weight_lb' is required but missing or empty." + "message": "'pallet_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -96,9 +125,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 7, @@ -110,9 +147,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 8, @@ -124,15 +169,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -146,9 +198,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 10, @@ -160,15 +220,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -176,35 +243,28 @@ "row": 11, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 16, - "fail_count": 3, + "pass_count": 15, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 1, but should be 9. Corrected GTIN would be 00614140000099." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 1, but should be 9. Corrected GTIN would be 00614140000099.", + "trigger": null } ] }, @@ -218,9 +278,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 13, @@ -232,9 +300,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 14, @@ -246,36 +322,37 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 15, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 17, - "fail_count": 2, + "pass_count": 16, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 0, but should be 6. Corrected GTIN would be 00614140000136." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 0, but should be 6. Corrected GTIN would be 00614140000136.", + "trigger": null } ] }, @@ -289,22 +366,29 @@ "presence": 2, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null }, { "field": "pallet_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'pallet_weight_lb' is required but missing or empty." + "message": "'pallet_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -312,28 +396,21 @@ "row": 17, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 17, - "fail_count": 2, + "pass_count": 16, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 4, but should be 0. Corrected GTIN would be 00614140000150." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 4, but should be 0. Corrected GTIN would be 00614140000150.", + "trigger": null } ] }, @@ -341,35 +418,28 @@ "row": 18, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 16, - "fail_count": 3, + "pass_count": 15, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, - "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 4, but should be 7. Corrected GTIN would be 00614140000167." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 4, but should be 7. Corrected GTIN would be 00614140000167.", + "trigger": null } ] }, @@ -383,9 +453,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 20, @@ -397,15 +475,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -419,43 +504,44 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 22, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 16, - "fail_count": 3, + "pass_count": 15, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 5, but should be 4. Corrected GTIN would be 00614140000204." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 5, but should be 4. Corrected GTIN would be 00614140000204.", + "trigger": null } ] }, @@ -469,15 +555,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -491,9 +584,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 25, @@ -505,9 +606,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 26, @@ -519,9 +628,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 27, @@ -533,9 +650,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 28, @@ -547,9 +672,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 29, @@ -561,15 +694,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -577,28 +717,21 @@ "row": 30, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 17, - "fail_count": 2, + "pass_count": 16, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 9, but should be 0. Corrected GTIN would be 00614140000280." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 9, but should be 0. Corrected GTIN would be 00614140000280.", + "trigger": null } ] }, @@ -612,43 +745,44 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 32, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 16, - "fail_count": 3, + "pass_count": 15, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 7, but should be 3. Corrected GTIN would be 00614140000303." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 7, but should be 3. Corrected GTIN would be 00614140000303.", + "trigger": null } ] }, @@ -656,28 +790,21 @@ "row": 33, "verdict": "FAIL", "fields_checked": 17, - "pass_count": 17, - "fail_count": 2, + "pass_count": 16, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 7, but should be 0. Corrected GTIN would be 00614140000310." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 7, but should be 0. Corrected GTIN would be 00614140000310.", + "trigger": null } ] }, @@ -691,22 +818,29 @@ "presence": 2, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -720,9 +854,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 36, @@ -734,9 +876,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 37, @@ -748,9 +898,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 38, @@ -762,9 +920,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 39, @@ -776,9 +942,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 40, @@ -790,15 +964,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -812,15 +993,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -834,9 +1022,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 43, @@ -848,15 +1044,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -870,15 +1073,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -892,15 +1102,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -914,15 +1131,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -936,15 +1160,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -958,9 +1189,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 49, @@ -972,15 +1211,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -994,9 +1240,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 51, @@ -1008,8 +1262,16 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] } ] diff --git a/scripts/results/unfi.json b/scripts/results/unfi.json index 59d662e..d9f9cc8 100644 --- a/scripts/results/unfi.json +++ b/scripts/results/unfi.json @@ -9,15 +9,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -31,15 +38,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -53,9 +67,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 5, @@ -67,22 +89,29 @@ "presence": 2, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null }, { "field": "pallet_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'pallet_weight_lb' is required but missing or empty." + "message": "'pallet_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -96,9 +125,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 7, @@ -110,9 +147,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 8, @@ -124,15 +169,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -146,9 +198,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 10, @@ -160,15 +220,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -176,35 +243,28 @@ "row": 11, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 17, - "fail_count": 3, + "pass_count": 16, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 1, but should be 9. Corrected GTIN would be 00614140000099." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 1, but should be 9. Corrected GTIN would be 00614140000099.", + "trigger": null } ] }, @@ -218,9 +278,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 13, @@ -232,9 +300,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 14, @@ -246,36 +322,37 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 15, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 18, - "fail_count": 2, + "pass_count": 17, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 0, but should be 6. Corrected GTIN would be 00614140000136." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 0, but should be 6. Corrected GTIN would be 00614140000136.", + "trigger": null } ] }, @@ -289,22 +366,29 @@ "presence": 2, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null }, { "field": "pallet_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'pallet_weight_lb' is required but missing or empty." + "message": "'pallet_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -312,28 +396,21 @@ "row": 17, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 18, - "fail_count": 2, + "pass_count": 17, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 4, but should be 0. Corrected GTIN would be 00614140000150." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 4, but should be 0. Corrected GTIN would be 00614140000150.", + "trigger": null } ] }, @@ -341,35 +418,28 @@ "row": 18, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 17, - "fail_count": 3, + "pass_count": 16, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, - "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 4, but should be 7. Corrected GTIN would be 00614140000167." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 4, but should be 7. Corrected GTIN would be 00614140000167.", + "trigger": null } ] }, @@ -383,9 +453,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 20, @@ -397,15 +475,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -419,43 +504,44 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 22, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 17, - "fail_count": 3, + "pass_count": 16, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 5, but should be 4. Corrected GTIN would be 00614140000204." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 5, but should be 4. Corrected GTIN would be 00614140000204.", + "trigger": null } ] }, @@ -469,15 +555,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -491,9 +584,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 25, @@ -505,9 +606,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 26, @@ -519,9 +628,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 27, @@ -533,9 +650,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 28, @@ -547,9 +672,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 29, @@ -561,15 +694,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -577,28 +717,21 @@ "row": 30, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 18, - "fail_count": 2, + "pass_count": 17, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 9, but should be 0. Corrected GTIN would be 00614140000280." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 9, but should be 0. Corrected GTIN would be 00614140000280.", + "trigger": null } ] }, @@ -612,43 +745,44 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 32, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 17, - "fail_count": 3, + "pass_count": 16, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 7, but should be 3. Corrected GTIN would be 00614140000303." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 7, but should be 3. Corrected GTIN would be 00614140000303.", + "trigger": null } ] }, @@ -656,28 +790,21 @@ "row": 33, "verdict": "FAIL", "fields_checked": 18, - "pass_count": 18, - "fail_count": 2, + "pass_count": 17, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 7, but should be 0. Corrected GTIN would be 00614140000310." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format." + "message": "GTIN check failed: Check digit is 7, but should be 0. Corrected GTIN would be 00614140000310.", + "trigger": null } ] }, @@ -691,22 +818,29 @@ "presence": 2, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -720,9 +854,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 36, @@ -734,9 +876,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 37, @@ -748,9 +898,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 38, @@ -762,9 +920,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 39, @@ -776,9 +942,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 40, @@ -790,15 +964,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -812,15 +993,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -834,9 +1022,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 43, @@ -848,15 +1044,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -870,15 +1073,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -892,15 +1102,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -914,15 +1131,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -936,15 +1160,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -958,9 +1189,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 49, @@ -972,15 +1211,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null } ] }, @@ -994,9 +1240,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] }, { "row": 51, @@ -1008,8 +1262,16 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: GTIN-14 has indicator digit 0, which means this is a base unit (each) expressed in 14-digit format.", + "trigger": null + } + ] } ] diff --git a/scripts/results/walmart.json b/scripts/results/walmart.json index d45a6b5..3862847 100644 --- a/scripts/results/walmart.json +++ b/scripts/results/walmart.json @@ -9,15 +9,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000006.", + "trigger": null } ] }, @@ -31,15 +38,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000013.", + "trigger": null } ] }, @@ -53,9 +67,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000020.", + "trigger": null + } + ] }, { "row": 5, @@ -67,15 +89,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000037.", + "trigger": null } ] }, @@ -89,9 +118,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000044.", + "trigger": null + } + ] }, { "row": 7, @@ -103,9 +140,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000051.", + "trigger": null + } + ] }, { "row": 8, @@ -117,15 +162,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000068.", + "trigger": null } ] }, @@ -139,9 +191,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000075.", + "trigger": null + } + ] }, { "row": 10, @@ -153,15 +213,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000082.", + "trigger": null } ] }, @@ -175,15 +242,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000099.", + "trigger": null } ] }, @@ -191,28 +265,21 @@ "row": 12, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 15, - "fail_count": 2, + "pass_count": 14, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 3, but should be 5. Corrected GTIN would be 614140000105." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000103." + "message": "GTIN check failed: Check digit is 3, but should be 5. Corrected GTIN would be 614140000105.", + "trigger": null } ] }, @@ -226,9 +293,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000112.", + "trigger": null + } + ] }, { "row": 14, @@ -240,9 +315,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000129.", + "trigger": null + } + ] }, { "row": 15, @@ -254,9 +337,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000136.", + "trigger": null + } + ] }, { "row": 16, @@ -268,15 +359,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_gross_weight_lb", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_gross_weight_lb' is required but missing or empty." + "message": "'case_gross_weight_lb' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000143.", + "trigger": null } ] }, @@ -284,28 +382,21 @@ "row": 17, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 15, - "fail_count": 2, + "pass_count": 14, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 3, but should be 0. Corrected GTIN would be 614140000150." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000153." + "message": "GTIN check failed: Check digit is 3, but should be 0. Corrected GTIN would be 614140000150.", + "trigger": null } ] }, @@ -319,15 +410,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000167.", + "trigger": null } ] }, @@ -341,9 +439,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000174.", + "trigger": null + } + ] }, { "row": 20, @@ -355,15 +461,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000181.", + "trigger": null } ] }, @@ -377,9 +490,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000198.", + "trigger": null + } + ] }, { "row": 22, @@ -391,15 +512,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000204.", + "trigger": null } ] }, @@ -413,15 +541,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000211.", + "trigger": null } ] }, @@ -435,36 +570,37 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000228.", + "trigger": null + } + ] }, { "row": 25, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 15, - "fail_count": 2, + "pass_count": 14, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 6, but should be 5. Corrected GTIN would be 614140000235." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000236." + "message": "GTIN check failed: Check digit is 6, but should be 5. Corrected GTIN would be 614140000235.", + "trigger": null } ] }, @@ -478,36 +614,37 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000242.", + "trigger": null + } + ] }, { "row": 27, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 15, - "fail_count": 2, + "pass_count": 14, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 7, but should be 9. Corrected GTIN would be 614140000259." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000257." + "message": "GTIN check failed: Check digit is 7, but should be 9. Corrected GTIN would be 614140000259.", + "trigger": null } ] }, @@ -521,9 +658,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000266.", + "trigger": null + } + ] }, { "row": 29, @@ -535,15 +680,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000273.", + "trigger": null } ] }, @@ -551,28 +703,21 @@ "row": 30, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 15, - "fail_count": 2, + "pass_count": 14, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 1, but should be 0. Corrected GTIN would be 614140000280." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000281." + "message": "GTIN check failed: Check digit is 1, but should be 0. Corrected GTIN would be 614140000280.", + "trigger": null } ] }, @@ -586,9 +731,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000297.", + "trigger": null + } + ] }, { "row": 32, @@ -600,15 +753,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "country_of_origin", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'country_of_origin' is required but missing or empty." + "message": "'country_of_origin' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000303.", + "trigger": null } ] }, @@ -616,28 +776,21 @@ "row": 33, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 15, - "fail_count": 2, + "pass_count": 14, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 6, but should be 0. Corrected GTIN would be 614140000310." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000316." + "message": "GTIN check failed: Check digit is 6, but should be 0. Corrected GTIN would be 614140000310.", + "trigger": null } ] }, @@ -645,42 +798,35 @@ "row": 34, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 13, - "fail_count": 4, + "pass_count": 12, + "fail_count": 3, "tier_summary": { "presence": 2, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_length_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_length_in' is required but missing or empty." + "message": "'case_length_in' is required but missing or empty.", + "trigger": null }, { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, - "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 9, but should be 7. Corrected GTIN would be 614140000327." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000329." + "message": "GTIN check failed: Check digit is 9, but should be 7. Corrected GTIN would be 614140000327.", + "trigger": null } ] }, @@ -688,28 +834,21 @@ "row": 35, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 15, - "fail_count": 2, + "pass_count": 14, + "fail_count": 1, "tier_summary": { "presence": 0, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 9, but should be 4. Corrected GTIN would be 614140000334." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000339." + "message": "GTIN check failed: Check digit is 9, but should be 4. Corrected GTIN would be 614140000334.", + "trigger": null } ] }, @@ -723,9 +862,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000341.", + "trigger": null + } + ] }, { "row": 37, @@ -737,9 +884,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000358.", + "trigger": null + } + ] }, { "row": 38, @@ -751,9 +906,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000365.", + "trigger": null + } + ] }, { "row": 39, @@ -765,9 +928,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000372.", + "trigger": null + } + ] }, { "row": 40, @@ -779,15 +950,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000389.", + "trigger": null } ] }, @@ -801,15 +979,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000396.", + "trigger": null } ] }, @@ -823,9 +1008,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000402.", + "trigger": null + } + ] }, { "row": 43, @@ -837,15 +1030,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_width_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_width_in' is required but missing or empty." + "message": "'case_width_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000419.", + "trigger": null } ] }, @@ -853,35 +1053,28 @@ "row": 44, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 14, - "fail_count": 3, + "pass_count": 13, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 1, but should be 6. Corrected GTIN would be 614140000426." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000421." + "message": "GTIN check failed: Check digit is 1, but should be 6. Corrected GTIN would be 614140000426.", + "trigger": null } ] }, @@ -895,15 +1088,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000433.", + "trigger": null } ] }, @@ -917,15 +1117,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000440.", + "trigger": null } ] }, @@ -939,15 +1146,22 @@ "presence": 1, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null + }, + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000457.", + "trigger": null } ] }, @@ -961,43 +1175,44 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000464.", + "trigger": null + } + ] }, { "row": 49, "verdict": "FAIL", "fields_checked": 15, - "pass_count": 14, - "fail_count": 3, + "pass_count": 13, + "fail_count": 2, "tier_summary": { "presence": 1, "format": 0, "conditional": 0, - "gtin": 2 + "gtin": 1 }, "errors": [ { "field": "case_height_in", "error_type": "PRESENCE_MISSING", - "trigger": null, "severity": "CRITICAL", - "message": "'case_height_in' is required but missing or empty." + "message": "'case_height_in' is required but missing or empty.", + "trigger": null }, { "field": "upc", "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, "severity": "CRITICAL", - "message": "GTIN check failed: Check digit is 4, but should be 1. Corrected GTIN would be 614140000471." - }, - { - "field": "upc", - "error_type": "GTIN_HIERARCHY_WRONG", - "trigger": null, - "severity": "CRITICAL", - "message": "GTIN check failed: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000474." + "message": "GTIN check failed: Check digit is 4, but should be 1. Corrected GTIN would be 614140000471.", + "trigger": null } ] }, @@ -1011,9 +1226,17 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000488.", + "trigger": null + } + ] }, { "row": 51, @@ -1025,8 +1248,16 @@ "presence": 0, "format": 0, "conditional": 0, - "gtin": 0 + "gtin": 1 }, - "errors": [] + "errors": [ + { + "field": "upc", + "error_type": "GTIN_HIERARCHY_WRONG", + "severity": "INFO", + "message": "GTIN advisory: This is a 12-digit UPC-A. Some systems require the 13-digit GTIN-13 format (with a leading zero). Your GTIN-13 equivalent would be 0614140000495.", + "trigger": null + } + ] } ] diff --git a/tests_golden.py b/tests_golden.py new file mode 100644 index 0000000..baba6f0 --- /dev/null +++ b/tests_golden.py @@ -0,0 +1,165 @@ +"""Demo golden-file lock + P1 regression tests for item-setup-form-preflight. + +The golden test pins the shipped Cinderhaven demo dataset's per-partner bounce +counts so the deployed demo experience and the case-study figures (29/26/26/26) +cannot drift during the client-mode conversion. It runs the real audit pipeline +(parse_file -> match_columns -> validate_product), the same engine the browser +tool and CLI use. + +The regression tests lock the 07-31 P1: INFO advisories are surfaced per row but +must NEVER flip a clean file to failing — neither the per-row verdict nor the +aggregate summary (both orchestrator blocks: do_validate and do_validate_rows). +""" + +import json +import pathlib +import sys + +REPO = pathlib.Path(__file__).parent +# The Pyodide orchestrator imports `engine.*` (no `src.` prefix); make that +# resolvable without disturbing the `src.engine.*` imports the rest use. +sys.path.insert(0, str(REPO / "src")) + +from src.engine.column_matcher import MatchStatus, match_columns # noqa: E402 +from src.engine.file_parser import parse_file # noqa: E402 +from src.engine.schema_loader import load_schema # noqa: E402 +from src.engine.validators import validate_product # noqa: E402 + +_MASTER = REPO / "data" / "cinderhaven" / "product_master.csv" +_PARTNERS = ("walmart", "costco", "unfi", "kehe") + + +def _schema(partner): + return load_schema(str(REPO / "src" / "schemas" / f"{partner}.yaml")) + + +def _remap(row, mapping): + remapped = {} + for m in mapping.matches: + if m.status == MatchStatus.MATCHED and m.uploaded_header is not None: + remapped[m.schema_field] = row.get(m.uploaded_header) + return remapped + + +def _partner_counts(partner): + schema = _schema(partner) + parsed = parse_file(_MASTER.read_bytes(), "product_master.csv") + mapping = match_columns(parsed.headers, schema, parsed.rows) + verdicts = [validate_product(_remap(r, mapping), schema).verdict for r in parsed.rows] + passing = sum(1 for v in verdicts if v == "PASS") + return passing, len(verdicts) - passing + + +class TestDemoGolden: + """Locks the shipped demo output. If this changes, the case-study numbers change.""" + + def test_partner_bounce_counts_are_locked(self): + # Regenerated against the current single-count engine (scripts/results/). + # These are the published case-study figures. + expected = { + "walmart": (21, 29), + "costco": (24, 26), + "unfi": (24, 26), + "kehe": (24, 26), + } + got = {p: _partner_counts(p) for p in _PARTNERS} + assert got == expected + + def test_master_has_fifty_skus(self): + parsed = parse_file(_MASTER.read_bytes(), "product_master.csv") + assert parsed.row_count == 50 + + +# --- P1 regression: INFO advisories must not flip clean -> failing -------------- + +# A fully-populated Walmart row with a VALID 12-digit UPC-A. It passes all four +# tiers but carries one INFO UPC_NOT_GTIN13 advisory (a 12-digit UPC that some +# systems prefer expressed as GTIN-13). This is the exact clean-file-with-INFO +# shape that the 07-31 bug rendered as failing. +_VALID_UPCS = ["614141000012", "614141000029", "614141000036"] + + +def _clean_walmart_row(upc): + return { + "product_name": "Habanero Hot Sauce", + "brand": "Cinderhaven", + "upc": upc, + "case_gross_weight_lb": "12.5", + "case_length_in": "10", + "case_width_in": "8", + "case_height_in": "6", + "case_pack_qty": "12", + "country_of_origin": "USA", + "category": "Condiments", + "product_description": "A small-batch hot sauce", + "serving_size": "1 tbsp", + "calories": "10", + "total_fat_g": "0", + "sodium_mg": "120", + } + + +class TestCleanCountRegression: + """07-31 P1: an INFO-only row is clean, in the engine and in both aggregates.""" + + def test_valid_upc_row_passes_with_info_advisory_only(self): + schema = _schema("walmart") + for upc in _VALID_UPCS: + result = validate_product(_clean_walmart_row(upc), schema) + assert result.verdict == "PASS", f"{upc} wrongly failed" + assert result.errors, "expected the INFO advisory to be surfaced" + assert all(e.severity.value == "INFO" for e in result.errors) + + def test_do_validate_rows_aggregate_ignores_info(self): + # The JS-side worker entry point. A file of clean-but-INFO rows must + # aggregate as all-pass with no issue-type counts and no red bar. + import engine.orchestrator as orch + + orch.load_schema = lambda _path: _schema("walmart") + rows = [_clean_walmart_row(u) for u in _VALID_UPCS] + mapping = {k: k for k in rows[0]} + out = json.loads( + orch.do_validate_rows(json.dumps(rows), json.dumps(mapping), "walmart") + ) + s = out["summary"] + assert s["totalRows"] == 3 + assert s["passing"] == 3 + assert s["failing"] == 0 + assert s["errorTypeCounts"] == {} + assert s["topFailingFields"] == [] + + def test_do_validate_aggregate_ignores_info(self): + # The Pyodide-FS entry point (do_validate) has a duplicate aggregate + # block; lock it too via the module-level parse cache. + import types + + import engine.orchestrator as orch + + orch.load_schema = lambda _path: _schema("walmart") + rows = [_clean_walmart_row(u) for u in _VALID_UPCS] + orch._cached_parse = types.SimpleNamespace(rows=rows) + mapping = {k: k for k in rows[0]} + out = json.loads(orch.do_validate(json.dumps(mapping), "walmart")) + s = out["summary"] + assert s["passing"] == 3 + assert s["failing"] == 0 + assert s["errorTypeCounts"] == {} + assert s["topFailingFields"] == [] + + def test_real_failures_still_count_in_aggregate(self): + # Negative control: a genuine CRITICAL (missing required field) must + # still register, so the INFO skip is severity-specific, not a blanket + # "drop all errors from the aggregate". + import engine.orchestrator as orch + + orch.load_schema = lambda _path: _schema("walmart") + bad = _clean_walmart_row("614141000012") + bad["brand"] = "" # a required field -> CRITICAL presence error + rows = [bad] + mapping = {k: k for k in rows[0]} + out = json.loads( + orch.do_validate_rows(json.dumps(rows), json.dumps(mapping), "walmart") + ) + s = out["summary"] + assert s["failing"] == 1 + assert s["errorTypeCounts"].get("PRESENCE_MISSING") == 1 From 83f369136997f45ae0374eb7cd333452e1c3e4a2 Mon Sep 17 00:00:00 2001 From: MsShawnP Date: Mon, 3 Aug 2026 14:46:08 -0400 Subject: [PATCH 3/5] Add item-setup-form-preflight client mode (engagement.yml + provenance report) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit client_mode.py wraps the four-tier engine with the shared lailara_engagement scaffold: tolerant CSV/XLSX intake (UPC/GTIN read as text), engagement.yml column mapping + a preflight that names the identifier column (branded Data Readiness Report if absent), the engine run per SKU, and a branded, provenance-footed, draft-watermarked readiness summary + per-SKU CSV written to client-output/ only. Column mapping is config-driven, never fuzzy-guessed. Add engagement.demo.yml (demo: true, Walmart) and INPUT-SPEC.md documenting the per-partner required fields and GTIN levels the engine consumes. tests_client_mode.py covers the §6 adversarial fixtures — clean file renders clean (the 07-31 INFO P1), missing identifier blocks, empty/headers-only, duplicate headers, BOM+semicolon with identifier kept as text, and the --final watermark drop. Skipped if lailara_engagement is absent. Demo runtime (engine, browser) untouched; demo golden unchanged. Co-Authored-By: Claude Opus 4.8 --- INPUT-SPEC.md | 99 ++++++++++++ client_mode.py | 377 +++++++++++++++++++++++++++++++++++++++++++ engagement.demo.yml | 18 +++ tests_client_mode.py | 139 ++++++++++++++++ 4 files changed, 633 insertions(+) create mode 100644 INPUT-SPEC.md create mode 100644 client_mode.py create mode 100644 engagement.demo.yml create mode 100644 tests_client_mode.py diff --git a/INPUT-SPEC.md b/INPUT-SPEC.md new file mode 100644 index 0000000..adfd5f6 --- /dev/null +++ b/INPUT-SPEC.md @@ -0,0 +1,99 @@ +# INPUT-SPEC — item-setup-form-preflight (client mode) + +What to hand the pre-flight engine in a client engagement. Written so a client's IT +person can produce the file without a call. The tool checks a product master against +one retailer/distributor item-setup schema (Walmart, Costco, UNFI, or KeHE) and reports +which SKUs would bounce and why. + +## The file + +- **CSV or XLSX.** Read via `lailara_engagement`'s tolerant reader: UTF-8 / UTF-8-BOM / + latin-1; comma / semicolon / tab; leading blank rows and trailing junk dropped; header + whitespace trimmed; Excel dates rendered as ISO text; Excel float-widened numbers + recovered as integer text. Nothing is silently coerced — any assumption is disclosed. +- One row per SKU (product/pack). Extra columns are ignored. + +## §1 One partner per run + +Pick the target partner: `walmart`, `costco`, `unfi`, or `kehe` — on the CLI (`--partner`) +or as `partner:` in `engagement.yml`. Each partner has its own required-field set and GTIN +expectation (below). Run the tool once per partner you are submitting to. + +## §2 Required identifier column + +| Canonical | Type | Required | Used for | +|---|---|---|---| +| `upc` | identifier (text) | yes | The barcode the engine keys each SKU on and runs GTIN-hierarchy checks against. | + +- **Read as text.** Leading zeros survive; `0614141000012` is never parsed to a number. +- **What `upc` points at depends on the partner's GTIN level:** + - Walmart — the **consumer unit** UPC-A / GTIN-12 (12 digits). Map `upc: ""`. + - Costco / UNFI / KeHE — the **case** GTIN-14 / ITF-14 (14 digits). Map `upc: ""`. +- If no column resolves to `upc`, the run produces a **Data Readiness Report** naming the + missing column instead of results. + +## §3 Partner-required fields + +The engine validates presence, then format, then conditional requirements, then the GTIN. +Fields below are **required** for that partner; a missing or empty one bounces the SKU +(CRITICAL). A present-but-malformed value bounces on format (WARNING). Fields your file +does not carry are reported per-SKU as missing — that is the deliverable, not an error. + +**All partners require:** `product_name`, `brand`, `upc`, `case_gross_weight_lb`, +`case_length_in`, `case_width_in`, `case_height_in`, `case_pack_qty`, `country_of_origin`, +`category`, `product_description`. + +**Additionally by partner:** + +| Partner | Extra required fields | GTIN expected | +|---|---|---| +| Walmart | `serving_size`, `calories`, `total_fat_g`, `sodium_mg` | GTIN-12 / UPC-A (consumer unit) | +| Costco | `inner_pack_count`, `club_pack_length_in`, `club_pack_width_in`, `club_pack_height_in`, `shelf_life_days` | GTIN-14 / ITF-14 (case) | +| UNFI | `wholesale_price`, `list_price`, `map_price`, `ti`, `hi`, `pallet_weight_lb`, `shelf_life_days` | GTIN-14 / ITF-14 (case) | +| KeHE | `wholesale_price`, `list_price`, `cases_per_layer`, `layers_per_pallet`, `pallet_weight_lb`, `shelf_life_days` | GTIN-14 / ITF-14 (case) | + +**Formats.** Weights and dimensions are numeric (`^\d+\.?\d*$`); `case_pack_qty` is a whole +number; `upc` must be a valid GTIN of the expected length with a correct check digit. A +12-digit UPC-A also raises an INFO advisory (`UPC_NOT_GTIN13`) — informational only, it +never bounces a SKU. + +**Conditional rules** (Tier 3) fire only when a trigger field is present, e.g. Walmart +requires `temp_min`/`temp_max` when `storage_type` is `Refrigerated` or `Frozen`, and +`hazmat_class`/`un_number` when `is_hazmat` is `true`. + +## Column mapping (engagement.yml) + +Map each client header that differs from the canonical field name; identity matches +(header already equal to the canonical name) are implicit. + +```yaml +client: + name: "Meridian Farms" +engagement: + id: "MER-2026-08" +as_of_date: "2026-07-31" +partner: "walmart" +columns: + upc: "UPC / Barcode" # client header -> canonical + brand: "Brand Owner" + case_gross_weight_lb: "Case Wt (lb)" + calories: "Calories per serving" +``` + +Mapping is confirmed via config, never fuzzy-guessed silently. A case/whitespace- +insensitive exact match on a canonical name is auto-applied and disclosed. + +## Run + +```bash +# with lailara_engagement installed: pip install -e ../engagement-template/lib +python client_mode.py --config engagement.yml --partner walmart \ + --input client-data/master.csv --out client-output [--final] +``` + +Outputs to `client-output/` (gitignored): +- `item-setup-readiness-summary.html` — branded, provenance-footed (input SHA-256, row + counts, `as_of_date`, config hash), DRAFT-watermarked until `--final`. +- `item-setup-preflight.csv` — the full per-SKU report (row, sku, verdict, field, severity, + error type, message). +- or `data-readiness-report.html` if the `upc` identifier column is missing. diff --git a/client_mode.py b/client_mode.py new file mode 100644 index 0000000..191ef66 --- /dev/null +++ b/client_mode.py @@ -0,0 +1,377 @@ +"""Client-mode CLI for the item-setup form pre-flight engine. + +Wraps the existing four-tier validation engine (``src.engine``) with the shared +``lailara_engagement`` scaffold so a client's product master can be checked +locally against a retailer/distributor item-setup schema: tolerant CSV/XLSX +intake (UPC/GTIN read as text), a preflight that names the identifier column via +``engagement.yml`` (Data Readiness Report if it is missing), the engine run per +SKU, and a branded, provenance-footed, draft-watermarked readiness summary plus +a per-SKU CSV — all written to ``client-output/`` only. + +Column mapping is driven entirely by ``engagement.yml`` (canonical field -> +client header); nothing is fuzzy-guessed. A client header that already equals a +canonical field name maps to itself. Any schema field with no column is reported +by the engine as a missing field on each SKU — that is the deliverable, not a +crash. + +Usage: + python client_mode.py --config engagement.yml --partner walmart \\ + --input client-data/master.csv --out client-output [--final] +""" + +from __future__ import annotations + +import argparse +import csv +import html +import io +from collections import Counter +from pathlib import Path + +from lailara_engagement import ( + ColumnSpec, + PreflightSpec, + build_provenance, + load_config, + read_table, + run_preflight, + validation_status_label, + write_report, +) +from lailara_engagement import palette as P +from lailara_engagement.provenance import Provenance + +from src.engine.schema_loader import load_schema +from src.engine.validators import validate_product + +TOOL = "item-setup-form-preflight" +TOOL_VERSION = "1.0" +PARTNERS = ("walmart", "costco", "unfi", "kehe") + + +def _schema_path(partner: str) -> Path: + return Path(__file__).parent / "src" / "schemas" / f"{partner}.yaml" + + +def _preflight_spec() -> PreflightSpec: + # Intake gate: require the identifier the engine keys each SKU on. Everything + # else the schema validates is reported per-SKU by the engine, not gated here + # (a raw client file missing dimensions must still produce a report, not a + # block). The identifier is read as text so leading zeros survive. + return PreflightSpec( + tool=TOOL, + version=TOOL_VERSION, + columns=[ + ColumnSpec( + name="upc", + dtype="identifier", + required=True, + description="the product UPC/GTIN identifier each SKU is keyed on", + spec_ref="INPUT-SPEC §2", + ) + ], + ) + + +def _header_to_canonical(config, upc_col: str | None) -> dict[str, str]: + """Client header -> canonical field, from engagement.yml columns. + + Identity (header already equals a canonical name) is handled at remap time as + a fallback, so only explicit renames need to appear in the config. + """ + mapping: dict[str, str] = {} + for canon, client in (config.columns or {}).items(): + if isinstance(client, str): + mapping[client] = canon + elif isinstance(client, (list, tuple)): + for c in client: + mapping[str(c)] = canon + if upc_col: + mapping[upc_col] = "upc" + return mapping + + +def _remap_rows(read, header_to_canon: dict[str, str]) -> list[dict]: + frame = read.frame + cols = list(frame.columns) + remapped: list[dict] = [] + for _, row in frame.iterrows(): + d: dict[str, str] = {} + for header in cols: + canon = header_to_canon.get(header, header) # identity fallback + d[canon] = row[header] + remapped.append(d) + return remapped + + +def _sku_label(row: dict, idx: int) -> str: + for candidate in ("product_name", "product_description", "upc", "brand"): + val = row.get(candidate) + if val is not None and str(val).strip(): + label = str(val).strip() + return label if len(label) <= 60 else label[:57] + "..." + return f"Row {idx + 1}" + + +def _run_engine(rows: list[dict], schema) -> dict: + """Run the four-tier engine per SKU and aggregate. + + INFO advisories are surfaced per-SKU but never counted in the aggregate and + never flip the verdict (the 07-31 clean-renders-clean rule). + """ + per_row = [] + for idx, row in enumerate(rows): + result = validate_product(row, schema) + per_row.append({ + "label": _sku_label(row, idx), + "verdict": result.verdict, + "errors": [ + {"field": e.field, "error_type": e.error_type.value, + "severity": e.severity.value, "message": e.message} + for e in result.errors + ], + }) + + total = len(per_row) + passing = sum(1 for r in per_row if r["verdict"] == "PASS") + + error_type_counts: Counter = Counter() + field_counts: Counter = Counter() + for r in per_row: + for e in r["errors"]: + if e["severity"] == "INFO": + continue + error_type_counts[e["error_type"]] += 1 + field_counts[e["field"]] += 1 + + return { + "per_row": per_row, + "total": total, + "passing": passing, + "failing": total - passing, + "error_type_counts": error_type_counts, + "top_failing_fields": field_counts.most_common(10), + } + + +def _csv_report(batch: dict, partner: str) -> str: + buf = io.StringIO() + w = csv.writer(buf) + w.writerow(["row", "sku", "verdict", "field", "severity", "error_type", "message"]) + for i, r in enumerate(batch["per_row"], start=1): + if not r["errors"]: + w.writerow([i, r["label"], r["verdict"], "", "", "", "ready to submit"]) + continue + for e in r["errors"]: + w.writerow([i, r["label"], r["verdict"], e["field"], + e["severity"], e["error_type"], e["message"]]) + return buf.getvalue() + + +def _summary_html(config, partner: str, schema, batch: dict, report, + provenance: Provenance, *, draft: bool) -> str: + esc = html.escape + draft_class = " ll-draft" if draft else "" + all_clean = batch["failing"] == 0 + + fill = P.LL_HK_SURFACE if all_clean else P.LL_SG_SURFACE + text = P.LL_HK_DARK if all_clean else P.LL_SG_DARK + banner_msg = ( + f"All {batch['total']} SKUs are submission-ready for {esc(schema.display_name)}." + if all_clean else + f"{batch['failing']} of {batch['total']} SKUs would bounce at " + f"{esc(schema.display_name)} item setup." + ) + + type_rows = "".join( + f"{esc(code)}{n}" + for code, n in batch["error_type_counts"].most_common(10) + ) or "No blocking issues." + + field_rows = "".join( + f"{esc(field)}{n}" + for field, n in batch["top_failing_fields"] + ) or "No failing fields." + + # Intake notes: preflight warnings/disclosures (blanks, coercions disclosed). + intake_items = [f.message for f in report.findings if f.severity != "info"] + intake_items += list(report.disclosures) + intake_html = "" + if intake_items: + lis = "".join(f"
  • {esc(x)}
  • " for x in intake_items) + intake_html = ( + '

    Intake notes

    ' + f'
      {lis}
    ' + ) + + gtin = schema.gtin_hierarchy + basis = (f"{esc(gtin.expected_level)} — {esc(', '.join(gtin.expected_formats))}") + + return f""" + +Item-Setup Readiness — {esc(config.client_name)} + +
    +
    +
    Lailara LLC · Item-Setup Pre-flight
    +

    Item-Setup Readiness Summary

    +
    +
    Client {esc(config.client_name)}
    +
    Engagement {esc(config.engagement_id)}
    +
    Partner {esc(schema.display_name)}
    +
    As of {esc(config.as_of_date.isoformat())}
    +
    Prepared by {esc(config.prepared_by)}
    +
    +
    +
    +
    {batch['passing']}/{batch['total']} SKUs ready
    +
    {banner_msg}
    +
    +
    +

    Batch summary

    + + + + + +
    Total SKUs{batch['total']:,}
    Submission-ready{batch['passing']:,}
    Would bounce{batch['failing']:,}
    GTIN basis{basis}
    +
    +
    +

    Bounce reasons by type

    + + {type_rows}
    Error typeCount
    +
    +
    +

    Top failing fields

    + + {field_rows}
    FieldSKUs
    +
    +{intake_html} +{provenance.to_html()} +
    """ + + +def _css(draft: bool) -> str: + draft_css = ( + ".ll-draft::before{content:'DRAFT';position:fixed;top:50%;left:50%;" + "transform:translate(-50%,-50%) rotate(-32deg);font-family:var(--s);" + "font-size:22vw;font-weight:700;color:rgba(204,16,10,.06);z-index:0;" + "pointer-events:none;white-space:nowrap}" if draft else "" + ) + return f""" +:root{{--s:{P.LL_SERIF};--f:{P.LL_SANS}}} +*{{box-sizing:border-box}} +body{{margin:0;background:{P.LL_CANVAS};color:{P.LL_TEXT};font-family:var(--f);line-height:1.6}} +.ll-page{{position:relative;z-index:1;max-width:{P.LL_MAX_WIDTH};margin:0 auto;padding:48px 24px}} +.ll-header{{border-bottom:1px solid {P.LL_GRIDLINE};padding-bottom:24px;margin-bottom:24px}} +.ll-eyebrow{{font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:{P.LL_RED};font-weight:600}} +.ll-title{{font-family:var(--s);font-weight:700;color:{P.LL_INK};font-size:34px;margin:8px 0 16px}} +.ll-client{{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px 24px;font-size:14px}} +.ll-k{{display:block;color:{P.LL_TEXT_SEC};font-size:11px;text-transform:uppercase;letter-spacing:.04em}} +.ll-banner{{border-radius:2px;padding:16px 20px;margin-bottom:32px}} +.ll-score{{font-family:var(--s);font-weight:700;font-size:22px}} +.ll-h2{{font-family:var(--s);font-weight:700;color:{P.LL_INK};font-size:22px;margin:0 0 12px;padding-bottom:6px;border-bottom:1px solid {P.LL_GRIDLINE}}} +.ll-table{{width:100%;border-collapse:collapse;font-size:14px}} +.ll-table th{{text-align:left;background:{P.LL_CHICAGO};color:#fff;padding:8px 12px}} +.ll-table td{{padding:8px 12px;border-bottom:1px solid {P.LL_GRIDLINE}}} +.ll-section{{margin:0 0 32px}} +.ll-limitations{{margin:0;padding-left:20px}} +.ll-limitations li{{margin-bottom:6px}} +.mono{{font-family:ui-monospace,Consolas,monospace;font-size:12px}} +.num{{text-align:right;font-variant-numeric:tabular-nums}} +.ll-provenance{{margin-top:40px;background:{P.LL_CARD_BG};color:{P.LL_CARD_TEXT};padding:20px 24px;border-radius:2px;font-size:13px}} +.ll-prov-title{{font-family:var(--s);font-weight:700;font-size:16px;margin-bottom:8px}} +.ll-provenance div{{margin-bottom:4px;color:{P.LL_CARD_SUBTITLE}}} +.ll-provenance strong{{color:{P.LL_CARD_TEXT}}} +.ll-prov-inputs{{width:100%;border-collapse:collapse;margin-top:8px}} +.ll-prov-inputs th{{text-align:left;border-bottom:1px solid rgba(255,255,255,.12);padding:4px 8px;color:{P.LL_CARD_MUTED}}} +.ll-prov-inputs td{{padding:4px 8px;border-bottom:1px solid rgba(255,255,255,.08);color:{P.LL_CARD_SUBTITLE}}} +.ll-prov-brand{{margin-top:12px;font-family:var(--s);color:{P.LL_CARD_MUTED}}} +{draft_css} +@media print{{body{{background:#fff}}}} +""" + + +def _resolve_partner(config, partner_arg: str | None) -> str: + partner = (partner_arg or config.raw.get("partner") or "").strip().lower() + if partner not in PARTNERS: + raise SystemExit( + f"--partner is required and must be one of {', '.join(PARTNERS)} " + f"(got {partner!r}; set it on the CLI or as `partner:` in the config)" + ) + return partner + + +def run(config_path: str, input_path: str, out_dir: str, *, + partner: str | None = None, final: bool = False) -> dict: + config = load_config(config_path) + partner = _resolve_partner(config, partner) + read = read_table(input_path) + spec = _preflight_spec() + report = run_preflight(read, spec, config) + + out = Path(out_dir) + out.mkdir(parents=True, exist_ok=True) + + provenance = build_provenance( + tool=TOOL, tool_version=TOOL_VERSION, inputs=[read], config=config, + validation_status=validation_status_label(report.status, report.n_warnings), + ) + + # Preflight gate: no identifier column -> Data Readiness Report, no results. + if not report.passed: + paths = write_report(report, config, str(out), provenance=provenance, + draft=not final, basename="data-readiness-report", + title="Item-Setup Data Readiness Report") + return {"status": "blocked", "readiness_report": paths["html"], + "report": paths["html"]} + + schema = load_schema(str(_schema_path(partner))) + upc_col = report.column_mapping.get("upc") + rows = _remap_rows(read, _header_to_canonical(config, upc_col)) + batch = _run_engine(rows, schema) + + csv_path = out / "item-setup-preflight.csv" + csv_path.write_text(_csv_report(batch, partner), encoding="utf-8") + + summary_path = out / "item-setup-readiness-summary.html" + summary_path.write_text( + _summary_html(config, partner, schema, batch, report, provenance, + draft=not final), + encoding="utf-8", + ) + + return { + "status": "ok", + "partner": partner, + "passing": batch["passing"], + "failing": batch["failing"], + "total": batch["total"], + "csv": str(csv_path), + "report": str(summary_path), + } + + +def main(argv=None) -> int: + ap = argparse.ArgumentParser( + prog="item-setup client mode", + description="Pre-flight a client product master against a partner schema.") + ap.add_argument("--config", required=True) + ap.add_argument("--partner", choices=PARTNERS) + ap.add_argument("--input", required=True) + ap.add_argument("--out", default="client-output") + ap.add_argument("--final", action="store_true") + args = ap.parse_args(argv) + result = run(args.config, args.input, args.out, partner=args.partner, + final=args.final) + if result["status"] == "blocked": + print(f"BLOCKED — data not ready. See {result['readiness_report']}") + return 3 + print(f"{result['partner']}: {result['passing']}/{result['total']} SKUs ready, " + f"{result['failing']} would bounce") + print(f"report -> {result['report']}\ncsv -> {result['csv']}") + return 0 + + +if __name__ == "__main__": # pragma: no cover + raise SystemExit(main()) diff --git a/engagement.demo.yml b/engagement.demo.yml new file mode 100644 index 0000000..c8e3b1f --- /dev/null +++ b/engagement.demo.yml @@ -0,0 +1,18 @@ +# Demo engagement config (safe to deploy: demo: true). +# Maps the Cinderhaven demo master headers onto the Walmart Item 360 schema. +# For a club/distributor partner (costco/unfi/kehe) the `upc` field is the +# case-level GTIN-14 — map `upc: "gtin14"` instead. +client: + name: "Cinderhaven Foods (demo)" +engagement: + id: "DEMO-ITEMSETUP-001" +as_of_date: "2026-01-31" +prepared_by: "Lailara LLC" +partner: "walmart" +demo: true +columns: + # canonical field -> client header (identity matches are implicit) + upc: "upc" + brand: "brand_owner" + case_gross_weight_lb: "case_weight_lbs" + calories: "calories_per_serving" diff --git a/tests_client_mode.py b/tests_client_mode.py new file mode 100644 index 0000000..5c16dba --- /dev/null +++ b/tests_client_mode.py @@ -0,0 +1,139 @@ +"""Client-mode tests for item-setup-form-preflight: intake, preflight, report. + +Adversarial fixtures per checklist §6: a clean file (which must render clean — +the 07-31 INFO-counting P1), missing identifier column (blocked path), empty +file, headers-only, duplicate headers, BOM+semicolon with the identifier kept as +text, and the --final watermark drop. Skipped if lailara_engagement isn't +installed. +""" + +import pytest + +pytest.importorskip("lailara_engagement") + +import client_mode # noqa: E402 +from lailara_engagement.errors import ReadError # noqa: E402 + +# Headers that already equal the canonical Walmart field names, so only `upc` +# needs an explicit mapping (identity handles the rest). +_CLEAN_HEADERS = ( + "product_name,brand,upc,case_gross_weight_lb,case_length_in,case_width_in," + "case_height_in,case_pack_qty,country_of_origin,category,product_description," + "serving_size,calories,total_fat_g,sodium_mg" +) + + +def _clean_row(upc): + return (f"Hot Sauce,Cinderhaven,{upc},12.5,10,8,6,12,USA,Condiments," + f"A sauce,1 tbsp,10,0,120") + + +_CONFIG = """ +client: {name: Meridian Farms} +engagement: {id: MER-2026-08} +as_of_date: 2026-07-31 +partner: walmart +demo: true +columns: {upc: "upc"} +""" + + +@pytest.fixture +def cfg(tmp_path): + p = tmp_path / "engagement.demo.yml" + p.write_text(_CONFIG, encoding="utf-8") + return str(p) + + +def _write(tmp_path, name, text, encoding="utf-8"): + p = tmp_path / name + p.write_bytes(text.encode(encoding) if isinstance(text, str) else text) + return str(p) + + +def test_clean_file_renders_clean(cfg, tmp_path): + # Every valid UPC-A carries an INFO UPC_NOT_GTIN13 advisory; the file must + # still read as all-ready — no bounces, no issue-by-type counts, no red bar. + body = "\n".join([_CLEAN_HEADERS, + _clean_row("614141000012"), + _clean_row("614141000029"), + _clean_row("614141000036")]) + "\n" + src = _write(tmp_path, "master.csv", body) + out = str(tmp_path / "client-output") + result = client_mode.run(cfg, src, out) + assert result["status"] == "ok" + assert result["total"] == 3 + assert result["passing"] == 3 + assert result["failing"] == 0 # INFO advisories do NOT bounce a SKU + html = open(result["report"], encoding="utf-8").read() + assert "Meridian Farms" in html + assert "#f5f3ee" in html # branded canvas + assert "SHA-256" in html # provenance footer + assert "DRAFT" in html + assert "submission-ready" in html # clean banner, not a bounce banner + assert "No blocking issues." in html # aggregate carries no INFO-as-failure + + +def test_missing_identifier_column_is_blocked(cfg, tmp_path): + # No column maps to upc -> Data Readiness Report, no results. + src = _write(tmp_path, "bad.csv", "product,price\nA,1\nB,2\n") + out = str(tmp_path / "out") + result = client_mode.run(cfg, src, out) + assert result["status"] == "blocked" + html = open(result["readiness_report"], encoding="utf-8").read() + assert "upc" in html.lower() + + +def test_bom_semicolon_and_identifier_as_text(cfg, tmp_path): + # BOM + semicolon delimiter; leading-zero identifier kept as text. + body = "upc;product_name\n0614141000012;A\n614141000029;B\n" + src = _write(tmp_path, "bom.csv", body) + out = str(tmp_path / "out") + result = client_mode.run(cfg, src, out) + assert result["status"] == "ok" + assert result["total"] == 2 # semicolon parsed, 2 SKUs + csv_text = open(result["csv"], encoding="utf-8").read() + assert "0614141000012" in csv_text # leading zero survived (not coerced) + + +def test_empty_file_raises(cfg, tmp_path): + src = _write(tmp_path, "empty.csv", "") + out = str(tmp_path / "out") + with pytest.raises(ReadError): + client_mode.run(cfg, src, out) + + +def test_headers_only_reports_zero_skus(cfg, tmp_path): + src = _write(tmp_path, "headers.csv", _CLEAN_HEADERS + "\n") + out = str(tmp_path / "out") + result = client_mode.run(cfg, src, out) + assert result["status"] == "ok" + assert result["total"] == 0 + +def test_duplicate_headers_still_runs(cfg, tmp_path): + # Duplicate columns are de-duplicated by the reader; the run still produces + # a report rather than crashing. + body = "upc,upc,product_name\n614141000012,614141000012,A\n" + src = _write(tmp_path, "dup.csv", body) + out = str(tmp_path / "out") + result = client_mode.run(cfg, src, out) + assert result["status"] == "ok" + assert result["total"] == 1 + + +def test_final_flag_drops_watermark(cfg, tmp_path): + body = _CLEAN_HEADERS + "\n" + _clean_row("614141000012") + "\n" + src = _write(tmp_path, "master.csv", body) + out = str(tmp_path / "out") + result = client_mode.run(cfg, src, out, final=True) + html = open(result["report"], encoding="utf-8").read() + assert "ll-draft" not in html + + +def test_partner_from_config_used(cfg, tmp_path): + # partner is read from the config when not passed on the CLI. + body = _CLEAN_HEADERS + "\n" + _clean_row("614141000012") + "\n" + src = _write(tmp_path, "master.csv", body) + out = str(tmp_path / "out") + result = client_mode.run(cfg, src, out) + assert result["partner"] == "walmart" From 91d198e843dea55674068c824a4f0198e55ca8d1 Mon Sep 17 00:00:00 2001 From: MsShawnP Date: Mon, 3 Aug 2026 14:48:30 -0400 Subject: [PATCH 4/5] Wrap long lines + sort imports for ruff (line-length 88) The client-mode files were mirrored from gtin-validator (ruff line-length 120); item-setup pins 88. Wrap the readiness-summary CSS f-string across source lines (CSS is newline-tolerant; output unchanged in effect), split one long banner string, and let ruff sort the tests_client_mode imports. No behavior change. Co-Authored-By: Claude Opus 4.8 --- client_mode.py | 36 ++++++++++++++++++++++++------------ tests_client_mode.py | 3 ++- tests_golden.py | 4 +++- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/client_mode.py b/client_mode.py index 191ef66..21fdef2 100644 --- a/client_mode.py +++ b/client_mode.py @@ -177,7 +177,8 @@ def _summary_html(config, partner: str, schema, batch: dict, report, fill = P.LL_HK_SURFACE if all_clean else P.LL_SG_SURFACE text = P.LL_HK_DARK if all_clean else P.LL_SG_DARK banner_msg = ( - f"All {batch['total']} SKUs are submission-ready for {esc(schema.display_name)}." + f"All {batch['total']} SKUs are submission-ready " + f"for {esc(schema.display_name)}." if all_clean else f"{batch['failing']} of {batch['total']} SKUs would bounce at " f"{esc(schema.display_name)} item setup." @@ -261,16 +262,24 @@ def _css(draft: bool) -> str: return f""" :root{{--s:{P.LL_SERIF};--f:{P.LL_SANS}}} *{{box-sizing:border-box}} -body{{margin:0;background:{P.LL_CANVAS};color:{P.LL_TEXT};font-family:var(--f);line-height:1.6}} -.ll-page{{position:relative;z-index:1;max-width:{P.LL_MAX_WIDTH};margin:0 auto;padding:48px 24px}} -.ll-header{{border-bottom:1px solid {P.LL_GRIDLINE};padding-bottom:24px;margin-bottom:24px}} -.ll-eyebrow{{font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:{P.LL_RED};font-weight:600}} -.ll-title{{font-family:var(--s);font-weight:700;color:{P.LL_INK};font-size:34px;margin:8px 0 16px}} -.ll-client{{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px 24px;font-size:14px}} -.ll-k{{display:block;color:{P.LL_TEXT_SEC};font-size:11px;text-transform:uppercase;letter-spacing:.04em}} +body{{margin:0;background:{P.LL_CANVAS};color:{P.LL_TEXT}; +font-family:var(--f);line-height:1.6}} +.ll-page{{position:relative;z-index:1;max-width:{P.LL_MAX_WIDTH}; +margin:0 auto;padding:48px 24px}} +.ll-header{{border-bottom:1px solid {P.LL_GRIDLINE}; +padding-bottom:24px;margin-bottom:24px}} +.ll-eyebrow{{font-size:12px;letter-spacing:.04em;text-transform:uppercase; +color:{P.LL_RED};font-weight:600}} +.ll-title{{font-family:var(--s);font-weight:700;color:{P.LL_INK}; +font-size:34px;margin:8px 0 16px}} +.ll-client{{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); +gap:8px 24px;font-size:14px}} +.ll-k{{display:block;color:{P.LL_TEXT_SEC};font-size:11px; +text-transform:uppercase;letter-spacing:.04em}} .ll-banner{{border-radius:2px;padding:16px 20px;margin-bottom:32px}} .ll-score{{font-family:var(--s);font-weight:700;font-size:22px}} -.ll-h2{{font-family:var(--s);font-weight:700;color:{P.LL_INK};font-size:22px;margin:0 0 12px;padding-bottom:6px;border-bottom:1px solid {P.LL_GRIDLINE}}} +.ll-h2{{font-family:var(--s);font-weight:700;color:{P.LL_INK};font-size:22px; +margin:0 0 12px;padding-bottom:6px;border-bottom:1px solid {P.LL_GRIDLINE}}} .ll-table{{width:100%;border-collapse:collapse;font-size:14px}} .ll-table th{{text-align:left;background:{P.LL_CHICAGO};color:#fff;padding:8px 12px}} .ll-table td{{padding:8px 12px;border-bottom:1px solid {P.LL_GRIDLINE}}} @@ -279,13 +288,16 @@ def _css(draft: bool) -> str: .ll-limitations li{{margin-bottom:6px}} .mono{{font-family:ui-monospace,Consolas,monospace;font-size:12px}} .num{{text-align:right;font-variant-numeric:tabular-nums}} -.ll-provenance{{margin-top:40px;background:{P.LL_CARD_BG};color:{P.LL_CARD_TEXT};padding:20px 24px;border-radius:2px;font-size:13px}} +.ll-provenance{{margin-top:40px;background:{P.LL_CARD_BG};color:{P.LL_CARD_TEXT}; +padding:20px 24px;border-radius:2px;font-size:13px}} .ll-prov-title{{font-family:var(--s);font-weight:700;font-size:16px;margin-bottom:8px}} .ll-provenance div{{margin-bottom:4px;color:{P.LL_CARD_SUBTITLE}}} .ll-provenance strong{{color:{P.LL_CARD_TEXT}}} .ll-prov-inputs{{width:100%;border-collapse:collapse;margin-top:8px}} -.ll-prov-inputs th{{text-align:left;border-bottom:1px solid rgba(255,255,255,.12);padding:4px 8px;color:{P.LL_CARD_MUTED}}} -.ll-prov-inputs td{{padding:4px 8px;border-bottom:1px solid rgba(255,255,255,.08);color:{P.LL_CARD_SUBTITLE}}} +.ll-prov-inputs th{{text-align:left;border-bottom:1px solid rgba(255,255,255,.12); +padding:4px 8px;color:{P.LL_CARD_MUTED}}} +.ll-prov-inputs td{{padding:4px 8px;border-bottom:1px solid rgba(255,255,255,.08); +color:{P.LL_CARD_SUBTITLE}}} .ll-prov-brand{{margin-top:12px;font-family:var(--s);color:{P.LL_CARD_MUTED}}} {draft_css} @media print{{body{{background:#fff}}}} diff --git a/tests_client_mode.py b/tests_client_mode.py index 5c16dba..ebbc669 100644 --- a/tests_client_mode.py +++ b/tests_client_mode.py @@ -11,9 +11,10 @@ pytest.importorskip("lailara_engagement") -import client_mode # noqa: E402 from lailara_engagement.errors import ReadError # noqa: E402 +import client_mode # noqa: E402 + # Headers that already equal the canonical Walmart field names, so only `upc` # needs an explicit mapping (identity handles the rest). _CLEAN_HEADERS = ( diff --git a/tests_golden.py b/tests_golden.py index baba6f0..72918fb 100644 --- a/tests_golden.py +++ b/tests_golden.py @@ -45,7 +45,9 @@ def _partner_counts(partner): schema = _schema(partner) parsed = parse_file(_MASTER.read_bytes(), "product_master.csv") mapping = match_columns(parsed.headers, schema, parsed.rows) - verdicts = [validate_product(_remap(r, mapping), schema).verdict for r in parsed.rows] + verdicts = [ + validate_product(_remap(r, mapping), schema).verdict for r in parsed.rows + ] passing = sum(1 for v in verdicts if v == "PASS") return passing, len(verdicts) - passing From ba34dae50c871f2d43ca4a99eedfbd480f7b8374 Mon Sep 17 00:00:00 2001 From: MsShawnP Date: Tue, 4 Aug 2026 12:27:14 -0400 Subject: [PATCH 5/5] Rename demo client name to canonical "Cinderhaven Provisions" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit engagement.demo.yml carried "Cinderhaven Foods (demo)" — a retired brand-name error (canonical is Cinderhaven Provisions). The canonical-drift gate correctly blocked it. Deployed demo golden is unaffected — client mode reads this config, the deployed app does not; golden suite unchanged. Co-Authored-By: Claude Opus 4.8 --- engagement.demo.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engagement.demo.yml b/engagement.demo.yml index c8e3b1f..d7aa17c 100644 --- a/engagement.demo.yml +++ b/engagement.demo.yml @@ -3,7 +3,7 @@ # For a club/distributor partner (costco/unfi/kehe) the `upc` field is the # case-level GTIN-14 — map `upc: "gtin14"` instead. client: - name: "Cinderhaven Foods (demo)" + name: "Cinderhaven Provisions (demo)" engagement: id: "DEMO-ITEMSETUP-001" as_of_date: "2026-01-31"