---
id: ATS-PFM-DJE-010
scope: CAP-PFM-DJE-010
product_area: platform
module: data-job-engine
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
scenarios:
  - id: ATS-PFM-DJE-010-01
    title: Usage prevents removing referenced catalogue items
    level: api
    proves:
      - BR-CAP-PFM-DJE-010-01
    preconditions: 'Prepare twelve contact types, two assigned across three contacts.'
    steps:
      - do: Validate and approve deletion of the selection.
        expect: Ten types are removed; the two used types remain with their contact usage counts.
        provenance: test
        source: >-
          services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#answers
          the validation’s impact: ten it would delete and two it is blocked on
    expected: Ten types are removed; the two used types remain with their contact usage counts.
    negative: true
    data_needs: Catalogue types with contact assignments.
    bound_to:
      - TST-PFM-DJE-116
      - TST-PFM-DJE-088
    provenance: test
    source: >-
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#answers
      the validation’s impact: ten it would delete and two it is blocked on
    category: rule
    binding_evidence:
      - >-
        services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#answers
        the validation’s impact: ten it would delete and two it is blocked on
      - >-
        services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#counts
        what uses them per object type: the three contacts that hold the two types
      - >-
        services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#deletes
        the ten types nothing uses and leaves the two that contacts hold
      - >-
        react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0106.spec.ts#DJE-ACC-0106
  - id: ATS-PFM-DJE-010-02
    title: Configuration refusals distinguish protected and absent input
    level: api
    proves:
      - BR-CAP-PFM-DJE-010-02
    preconditions: 'Prepare a protected role, a locked type and an unknown identifier.'
    steps:
      - do: Validate deletion for each.
        expect: The reported code distinguishes each refusal.
        provenance: proposed
        source: 'services-crm:docs/data-jobs.md#Deleting records in bulk'
    expected: The reported code distinguishes each refusal.
    negative: true
    data_needs: Catalogue fixtures with protection and locks.
    bound_to: []
    provenance: proposed
    source: 'services-crm:docs/data-jobs.md#Deleting records in bulk'
    category: validation
    binding_evidence: []
  - id: ATS-PFM-DJE-010-03
    title: Approval counts only eligible catalogue items
    level: api
    proves:
      - BR-CAP-PFM-DJE-010-03
    preconditions: Preview twelve items with two usage blocks.
    steps:
      - do: Inspect the phrase and attempt mismatched text and fingerprint.
        expect: The phrase requests ten items; invalid approvals remove nothing.
        provenance: test
        source: >-
          services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
          a person to type the number it would delete, not the number submitted
    expected: The phrase requests ten items; invalid approvals remove nothing.
    negative: true
    data_needs: No additional fixture is needed.
    bound_to:
      - TST-PFM-DJE-116
    provenance: test
    source: >-
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
      a person to type the number it would delete, not the number submitted
    category: validation
    binding_evidence:
      - >-
        services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
        a person to type the number it would delete, not the number submitted
      - >-
        services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#refuses
        an apply with the wrong phrase, naming the confirmation
      - >-
        services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#deletes
        nothing for either refused approval
  - id: ATS-PFM-DJE-010-04
    title: A status job is reviewed before application
    level: browser
    proves:
      - BR-CAP-PFM-DJE-010-04
    preconditions: Prepare twelve active contact types.
    steps:
      - do: 'Choose Deactivate, preview, apply and enable Show Inactive.'
        expect: The types appear with inactive status.
        provenance: test
        source: >-
          react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0107.spec.ts#DJE-ACC-0107
    expected: The types appear with inactive status.
    negative: false
    data_needs: Active catalogue types.
    bound_to:
      - TST-PFM-DJE-089
    provenance: test
    source: >-
      react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0107.spec.ts#DJE-ACC-0107
    category: transition
    binding_evidence:
      - >-
        react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0107.spec.ts#DJE-ACC-0107
  - id: ATS-PFM-DJE-010-05
    title: Catalogues without status expose deletion alone
    level: api
    proves:
      - BR-CAP-PFM-DJE-010-05
    preconditions: Prepare phone-number types.
    steps:
      - do: Attempt status input and inspect their bulk actions.
        expect: The proposed proof expects a status-field refusal and a Delete-only list.
        provenance: proposed
        source: 'services-platform:docs/milestones/PLAT-M20-small-bulk-operations.md#D3'
    expected: The proposed proof expects a status-field refusal and a Delete-only list.
    negative: true
    data_needs: No additional fixture is needed.
    bound_to: []
    provenance: proposed
    source: 'services-platform:docs/milestones/PLAT-M20-small-bulk-operations.md#D3'
    category: boundary
    binding_evidence: []
  - id: ATS-PFM-DJE-010-06
    title: Configuration actions require both relevant permissions
    level: browser
    proves:
      - BR-CAP-PFM-DJE-010-06
    preconditions: Use callers missing delete or bulk access.
    steps:
      - do: Inspect the type list and submit to the backend.
        expect: The action explains missing authority and backend requests receive 403.
        provenance: test
        source: >-
          react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0109.spec.ts#DJE-ACC-0109
    expected: The action explains missing authority and backend requests receive 403.
    negative: true
    data_needs: Permission personas.
    bound_to:
      - TST-PFM-DJE-091
      - TST-PFM-DJE-108
    provenance: test
    source: >-
      react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0109.spec.ts#DJE-ACC-0109
    category: permission
    binding_evidence:
      - >-
        react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0109.spec.ts#DJE-ACC-0109
      - >-
        services-crm:modules/data-jobs/tests/e2e/configuration-data-jobs.e2e.spec.js#refuses a
        caller who may change one contact type but holds no bulk key with 403
  - id: ATS-PFM-DJE-010-07
    title: Catalogue usage changes the count requiring approval
    category: interaction
    level: browser
    exercises:
      - CAP-PFM-DJE-007
      - CAP-PFM-DJE-010
    proves:
      - BR-CAP-PFM-DJE-007-03
      - BR-CAP-PFM-DJE-007-04
      - BR-CAP-PFM-DJE-010-01
      - BR-CAP-PFM-DJE-010-03
    preconditions: Select two unused contact types and one used type.
    steps:
      - do: >-
          Preview deletion, introduce usage of one previously eligible type, and approve the
          original phrase and fingerprint.
        expect: >-
          The newly used type remains as a conflict, the originally blocked type remains, and the
          still-unused type is removed.
        provenance: proposed
        source: >-
          services-crm:modules/data-jobs/tests/integration/services/jobs/contact-delete.integration.spec.js#refuses
          an apply whose confirmation names another number of contacts;
          services-crm:modules/data-jobs/tests/integration/services/jobs/organization-delete.integration.spec.js#refuses
          the one the contact now belongs to as a conflict, because the delete approved was another
          one;
          services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#says
          both are blocked because they are in use;
          services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
          a person to type the number it would delete, not the number submitted
    expected: >-
      The newly used type remains as a conflict, the originally blocked type remains, and the
      still-unused type is removed.
    negative: true
    data_needs: Select two unused contact types and one used type.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/data-jobs/tests/integration/services/jobs/contact-delete.integration.spec.js#refuses
      an apply whose confirmation names another number of contacts;
      services-crm:modules/data-jobs/tests/integration/services/jobs/organization-delete.integration.spec.js#refuses
      the one the contact now belongs to as a conflict, because the delete approved was another one;
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#says
      both are blocked because they are in use;
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
      a person to type the number it would delete, not the number submitted
  - id: ATS-PFM-DJE-010-08
    title: Reclassification makes a previously blocked type deletable
    category: interaction
    level: browser
    exercises:
      - CAP-PFM-DJE-009
      - CAP-PFM-DJE-010
    proves:
      - BR-CAP-PFM-DJE-009-02
      - BR-CAP-PFM-DJE-010-01
      - BR-CAP-PFM-DJE-010-03
      - BR-CAP-PFM-DJE-010-07
    preconditions: Create an obsolete type used by three contacts and an unused replacement type.
    steps:
      - do: >-
          Inspect the usage block, change those contacts to the replacement through a
          selected-record job, then preview and approve type deletion.
        expect: >-
          The second preview permits deletion of the obsolete type; the replacement and reclassified
          contacts remain.
        provenance: proposed
        source: >-
          react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0111.spec.ts#DJE-ACC-0111;
          services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#says
          both are blocked because they are in use;
          services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
          a person to type the number it would delete, not the number submitted;
          react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0106.spec.ts#DJE-ACC-0106
    expected: >-
      The second preview permits deletion of the obsolete type; the replacement and reclassified
      contacts remain.
    negative: false
    data_needs: Create an obsolete type used by three contacts and an unused replacement type.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0111.spec.ts#DJE-ACC-0111;
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#says
      both are blocked because they are in use;
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
      a person to type the number it would delete, not the number submitted;
      react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0106.spec.ts#DJE-ACC-0106
evidence:
  - >-
    Reviewed evidence: services-crm (a8d1364f): docs/data-jobs.md (Deleting records in bulk; The
    operations); services/operations/configuration-deletes.ts, configuration-imports.ts;
    services/jobs/configuration-data-jobs.ts; tests configuration-data-jobs.integration.spec.js,
    configuration-data-jobs.e2e.spec.js.
  - >-
    Reviewed evidence: react-console (baf6dae3): components/configuration (bulk bar) through
    components/data-management/data-jobs/dialogs/*; acceptance DJE-ACC-0106, 0107, 0109, 0151.
  - >-
    Reviewed evidence: services-platform (ad3f6a65):
    docs/milestones/PLAT-M20-small-bulk-operations.md (D2, D3, status history: DEF-DJE-0001).
  - >-
    Testing back-fill: related capability rules, domain invariants, state transitions and crossing
    workflows at the pinned source revisions.
coverage:
  rule: covered
  transition: 'gap: FND-PFM-DJE-070'
  validation: covered
  permission: covered
  edge: 'gap: FND-PFM-DJE-070'
  failure: 'gap: FND-PFM-DJE-070'
  boundary: covered
  concurrency: 'gap: FND-PFM-DJE-070'
  invariant: 'gap: FND-PFM-DJE-070'
  interaction: covered
coverage_notes:
  transition: >-
    Selected lifecycle examples do not cover every applicable object and batch transition. The
    linked finding retains the remaining matrix.
  execution: >-
    Covered means a specification scenario exists. Proposed scenarios and registered suites with no
    run result do not establish executed conformance.
related:
  - CAP-PFM-DJE-007
  - CAP-PFM-DJE-009
workflows:
  - WF-PFM-DJE-019
coverage_evidence:
  - rule: BR-CAP-PFM-DJE-010-01
    scenarios:
      - ATS-PFM-DJE-010-01
      - ATS-PFM-DJE-010-07
      - ATS-PFM-DJE-010-08
    provenance: proposed
    source: >-
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#says
      both are blocked because they are in use
  - rule: BR-CAP-PFM-DJE-010-02
    scenarios:
      - ATS-PFM-DJE-010-02
    provenance: proposed
    source: 'services-crm:docs/data-jobs.md#Deleting records in bulk'
  - rule: BR-CAP-PFM-DJE-010-03
    scenarios:
      - ATS-PFM-DJE-010-03
      - ATS-PFM-DJE-010-07
      - ATS-PFM-DJE-010-08
    provenance: proposed
    source: >-
      services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#asks
      a person to type the number it would delete, not the number submitted
  - rule: BR-CAP-PFM-DJE-010-04
    scenarios:
      - ATS-PFM-DJE-010-04
    provenance: proposed
    source: 'services-crm:docs/data-jobs.md#Deleting records in bulk'
  - rule: BR-CAP-PFM-DJE-010-05
    scenarios:
      - ATS-PFM-DJE-010-05
    provenance: proposed
    source: 'services-platform:docs/milestones/PLAT-M20-small-bulk-operations.md#D3'
  - rule: BR-CAP-PFM-DJE-010-06
    scenarios:
      - ATS-PFM-DJE-010-06
    provenance: proposed
    source: >-
      react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0109.spec.ts#DJE-ACC-0109
---

# Manage selected configuration items through recorded jobs: Capability Test Specification

## Coverage

The structured coverage rows link required rules to their scenarios. A covered category has a defined check; executable coverage and successful execution require separate evidence. The category map keeps incomplete lifecycle matrices and other missing checks visible as findings.

## Interactions With Related Capabilities

Catalogue usage changes the count requiring approval. Reclassification makes a previously blocked type deletable. The interaction scenarios use the related capabilities' rule references and identify the shared fixture and observable outcome.
