---
id: JNY-ACC-PRD-002
title: 'Finance withdraws, restores and removes catalogue products'
feature: FEAT-ACC-PRD-01
product_area: accounting
module: products
revision: 3
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - ACT-ACC-0107
  - ACT-ACC-0143
  - ACT-ACC-0131
  - ACT-ACC-0132
  - ACT-ACC-0137
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
actor: ACT-ACC-006
goal: >-
  Withdraw a workshop without discarding its identity, restore it for later use and remove an unreferenced
  mistake.
capabilities:
  - CAP-ACC-PRD-005
  - CAP-ACC-PRD-004
  - CAP-ACC-PRD-002
  - CAP-ACC-PRD-006
screens:
  - '/console/{tenantId}/configuration/accounting/products'
  - '/console/{tenantId}/configuration/accounting/products/{id}'
steps:
  - 'n': 1
    surface: '/console/{tenantId}/configuration/accounting/products'
    action: Confirm Deactivate and then Activate from the workshop row.
    capability: CAP-ACC-PRD-005
    expected: The row leaves the default active view and returns after activation.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts#ACT-ACC-0107'
  - 'n': 2
    surface: '/console/{tenantId}/configuration/accounting/products'
    action: Confirm retirement from the row menu.
    capability: CAP-ACC-PRD-005
    expected: The retired row offers restoration and no ordinary edit action.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts#ACT-ACC-0107'
  - 'n': 3
    surface: updateProduct
    action: Submit a name correction while retired.
    capability: CAP-ACC-PRD-004
    expected: The refusal instructs reactivation before correction.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts#ACT-ACC-0107'
  - 'n': 4
    surface: '/console/{tenantId}/configuration/accounting/products'
    action: Confirm Reactivate from the list.
    capability: CAP-ACC-PRD-005
    expected: Active status and correction access return.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts#ACT-ACC-0107'
  - 'n': 5
    surface: updateProduct
    action: Attempt to change product kind or business unit.
    capability: CAP-ACC-PRD-002
    expected: The API rejects the change and the unit remains fixed in the editor.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0143.spec.ts#ACT-ACC-0143'
  - 'n': 6
    surface: '/console/{tenantId}/configuration/accounting/products'
    action: Confirm deletion of an unreferenced duplicate.
    capability: CAP-ACC-PRD-006
    expected: The product and owned pricing and setup disappear.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts#ACT-ACC-0107'
alternates:
  - from_step: 6
    condition: An invoice still refers to the product.
    path: Observe the deletion refusal and preserve the product.
    outcome: Its continuing identity remains available.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0121.spec.ts#ACT-ACC-0121'
failures:
  - from_step: 2
    condition: The product has an update lock.
    path: Explain the refusal and required lock release.
    outcome: Retirement leaves its status unchanged.
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#names
      the lock when a locked product is retired
  - from_step: 6
    condition: The accounting setup has a delete lock.
    path: Reject product removal.
    outcome: Product and setup remain intact.
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
      a product whose accounting setup is locked against deletes, leaving the product and its setup
      (DEF-ACT-0101)
rules_in_play:
  - BR-CAP-ACC-PRD-005-01
  - BR-CAP-ACC-PRD-005-02
  - BR-CAP-ACC-PRD-005-03
  - BR-CAP-ACC-PRD-005-05
  - BR-CAP-ACC-PRD-004-04
  - BR-CAP-ACC-PRD-002-06
  - BR-CAP-ACC-PRD-006-02
  - BR-CAP-ACC-PRD-006-03
  - BR-CAP-ACC-PRD-006-05
assertions:
  - id: AS-JNY-ACC-PRD-002-01
    statement: Retired replacement attempts preserve the existing version and data.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts#ACT-ACC-0107'
  - id: AS-JNY-ACC-PRD-002-02
    statement: 'Attempted ownership-coordinate changes preserve identity, kind and unit.'
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0143.spec.ts#ACT-ACC-0143'
  - id: AS-JNY-ACC-PRD-002-03
    statement: Successful removal cascades to the product’s price and setup rows.
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#takes
      its prices, components, accounting setup and the setup’s collections with it
e2e_policy: required
e2e_reason: Confirmed row actions and disabled editing need a browser proof.
evidence:
  - 'react-console:acceptance/accounting/journeys/products/ACT-ACC-0107.json'
  - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts'
  - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0121.spec.ts'
  - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0143.spec.ts'
  - 'react-console:components/accounting-config/products/product-row-actions.tsx'
  - 'services-accounting:modules/products/services/persistence/products.ts'
  - 'services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js'
proved_by: []
---

# Finance withdraws, restores and removes catalogue products

## Story

Finance temporarily withdraws a workshop, restores it, then retires it when it closes. A correction attempt demonstrates the restriction during retirement. Reactivation restores ordinary use. Staff finally remove a separate unreferenced mistake while preserving records with dependencies.
