---
id: SCR-PFM-ELG-010
title: Product eligibility card
route: >-
  the Eligibility card in the product editor
  (/console/{tenantId}/configuration/accounting/products/{id})
surface: console
product_area: platform
module: eligibility
revision: 1
status: draft
design_intent: confirmed
origin: >-
  PLAT-M11 plan D6 (inline card on products: a shared rule or a private rule for
  this product, promotable to shared), D7 (ship with a Commerce enforcement
  notice) and D8 (card redesigned in v0), approved by Andrew 2026-10-21
implementation_evidence: inconsistent
inference: []
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
purpose: >-
  Choose a shared or private qualification rule from a saved product’s editor
  while retaining rule storage in Platform.
supports:
  - JNY-PFM-ELG-002
  - CAP-PFM-ELG-007
  - CAP-PFM-ELG-001
  - CAP-PFM-ELG-003
permission: >-
  platform.eligibility-bindings.manage to change the use;
  platform.eligibility.read to see rules; a private rule's save also publishes
  it, which needs platform.eligibility.publish; sharing it needs the same
entry_from:
  - Accounting’s saved-product editor
exits_to:
  - 'SCR-PFM-ELG-007: shared-definition inspection'
  - 'SCR-PFM-ELG-008: related full-page tester'
displays:
  - field: 'Current shared, private or unbound state of the consumer use'
    source: >-
      listEligibilityBindings for the product purpose and product reference
      (DOM-PFM-ELG-002)
  - field: Selected definition name and readable expression
    source: getEligibilityDefinition (DOM-PFM-ELG-001)
  - field: Shared definitions compatible with the product’s subject kinds
    source: listEligibilityDefinitions
actions:
  - label: Use This Rule
    operation_id: createEligibilityBinding
    permission: platform.eligibility-bindings.manage
    confirm: false
  - label: 'Change rule (remove the old use, then bind the new)'
    operation_id: deleteEligibilityBinding
    permission: platform.eligibility-bindings.manage
    confirm: false
  - label: Save a rule just for this product
    operation_id: publishEligibilityDefinition
    permission: >-
      platform.eligibility.write and platform.eligibility.publish and
      platform.eligibility-bindings.manage
    confirm: false
  - label: Save as a shared rule
    operation_id: updateEligibilityDefinition
    permission: platform.eligibility.publish
    confirm: true
  - label: Remove shared rule (private-rule removal opens a confirmation dialog)
    operation_id: deleteEligibilityBinding
    permission: platform.eligibility-bindings.manage
    confirm: false
  - label: Test
    operation_id: testEligibilityDefinition
    permission: platform.eligibility.read
    confirm: false
states:
  - empty
  - loading
  - error
  - read-only
validation:
  - BR-CAP-PFM-ELG-007-01
  - BR-CAP-PFM-ELG-007-02
  - BR-CAP-PFM-ELG-007-06
  - BR-CAP-PFM-ELG-007-14
  - BR-CAP-PFM-ELG-001-11
patterns:
  - EligibilityCard host section
  - RadioGroup option tiles for shared or private creation
  - EligibilityBuilder with stacked layout
  - RuleTestSheet
  - Private share and removal Dialog
component: >-
  components/eligibility/embeds/eligibility-card.tsx; private-rule-editor.tsx;
  shared-rule-picker.tsx; rule-test-sheet.tsx
evidence:
  - >-
    react-console at baf6dae: components/eligibility/embeds/;
    lib/eligibility/consumer-rule-actions.ts, consumer-rule.ts.
  - >-
    services-platform at ad3f6a6: docs/milestones/plans/PLAT-M11-plan.md (D6 to
    D8).
controls: [TC-AVL-004, TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-DAT-001, TC-DAT-003, TC-DAT-004, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-004, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-VEN-001, TC-VEN-002, TC-VEN-003]
---
# Product eligibility card

## What the Screen Is For

The card places qualification authoring in the product editor and uses Platform’s rule and consumer connection records.

## What It Shows and Lets People Do

An unbound product displays unrestricted status and two radio options for shared or private logic; unrestricted is not a third radio option. Shared selection binds the chosen rule. Private Save creates or edits, publishes and binds through separate calls. Sharing a private rule opens its naming dialog. Private removal confirms; shared removal and change execute directly. Test opens a sheet.

## States and Errors

Unsaved products have no consumer reference to bind. Save names missing write, publish or binding authority before submission. A failed replacement after deleting the old use leaves no rule, with an explicit card warning. The approved future-enforcement notice is absent, and this examination cannot establish Commerce enforcement.

## Patterns It Must Respect

The reusable EligibilityCard uses RadioGroup tiles, the stacked EligibilityBuilder and RuleTestSheet. The source’s private-rule dialogs differ from its immediate shared-use actions; the contract preserves that distinction.
