---
id: CAP-PFM-DJE-010
title: Manage selected configuration items through recorded jobs
feature: FEAT-PFM-DJE-03
product_area: platform
module: data-job-engine
revision: 1
status: draft
product_intent: proposed
implementation_evidence: partially-observed
supersedes:
  - CAP-DJE-DLG-003
  - RUL-DJE-DLG-004
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
intent_sources: []
purpose: >-
  Administrators maintain several catalogue items in one reviewed operation while retaining items that
  other records still need.
outcomes:
  - Deletion explains which selected items are still referenced.
  - Supported status changes have previews and job records.
  - Catalogue bulk actions use a shared interaction.
concepts:
  - CON-PFM-DJE-001
actors:
  - ACT-PFM-035
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: crm.contact-types.bulk
    where_checked: api
    scope: tenant
  - key: crm.contact-types.delete
    where_checked: api
    scope: tenant
  - key: crm.contact-types.update
    where_checked: api
    scope: tenant
  - key: crm.contact-roles.bulk
    where_checked: api
    scope: tenant
  - key: crm.contact-roles.delete
    where_checked: api
    scope: tenant
  - key: crm.contact-roles.update
    where_checked: api
    scope: tenant
  - key: crm.organization-types.bulk
    where_checked: api
    scope: tenant
  - key: crm.organization-types.delete
    where_checked: api
    scope: tenant
  - key: crm.organization-types.update
    where_checked: api
    scope: tenant
  - key: crm.address-types.bulk
    where_checked: api
    scope: tenant
  - key: crm.address-types.delete
    where_checked: api
    scope: tenant
  - key: crm.address-types.update
    where_checked: api
    scope: tenant
  - key: crm.phone-number-types.bulk
    where_checked: api
    scope: tenant
  - key: crm.phone-number-types.delete
    where_checked: api
    scope: tenant
  - key: crm.phone-number-types.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-DJE-010-01
    proved_by: [ATS-PFM-DJE-007-12, ATS-PFM-DJE-009-14, ATS-PFM-DJE-010-01, ATS-PFM-DJE-010-07, ATS-PFM-DJE-010-08, TST-PFM-DJE-088, TST-PFM-DJE-116]
    statement: >-
      A referenced configuration item is blocked from deletion with usage counts by record kind, while
      eligible selected items can be removed.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    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
    origin: none
  - id: BR-CAP-PFM-DJE-010-02
    proved_by: [ATS-PFM-DJE-010-02]
    statement: >-
      Configuration deletion reports missing, system-protected and locked items with distinct refusal
      codes.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: documented
    source: 'services-crm:docs/data-jobs.md#Deleting records in bulk'
    origin: none
  - id: BR-CAP-PFM-DJE-010-03
    proved_by: [ATS-PFM-DJE-007-12, ATS-PFM-DJE-009-14, ATS-PFM-DJE-010-03, ATS-PFM-DJE-010-07, ATS-PFM-DJE-010-08, TST-PFM-DJE-116]
    statement: >-
      Typed deletion approval counts eligible items rather than the original selection, for example
      DELETE 10 contact types.
    kind: calculation
    enforced_at:
      - service
      - console
    must_prove: true
    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
    origin: none
  - id: BR-CAP-PFM-DJE-010-04
    proved_by: [ATS-PFM-DJE-010-04, TST-PFM-DJE-089]
    statement: >-
      Contact types, contact roles and organization types support previewed status jobs, treating
      satisfied changes as unchanged and intervening edits as conflicts.
    kind: lifecycle
    enforced_at:
      - service
      - console
    must_prove: true
    provenance: documented
    source: 'services-crm:docs/data-jobs.md#Deleting records in bulk'
    origin: none
  - id: BR-CAP-PFM-DJE-010-05
    proved_by: [ATS-PFM-DJE-010-05]
    statement: >-
      Address and phone-number types have no status; status input is refused and their lists expose
      deletion only.
    kind: validation
    enforced_at:
      - api
      - console
    must_prove: true
    provenance: documented
    source: 'services-platform:docs/milestones/PLAT-M20-small-bulk-operations.md#D3'
    origin: none
  - id: BR-CAP-PFM-DJE-010-06
    proved_by: [ATS-PFM-DJE-010-06, TST-PFM-DJE-091, TST-PFM-DJE-108]
    statement: >-
      Deletion requires catalogue bulk and delete permissions, while status changes require bulk and
      update permissions; unavailable actions explain missing authority.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: true
    provenance: test
    source: 'react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0109.spec.ts#DJE-ACC-0109'
    origin: none
  - id: BR-CAP-PFM-DJE-010-07
    proved_by: [ATS-PFM-DJE-009-14, ATS-PFM-DJE-010-08]
    statement: 'After deletion, the refreshed list retains the blocked selected items.'
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: test
    source: 'react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0106.spec.ts#DJE-ACC-0106'
    origin: none
  - id: BR-CAP-PFM-DJE-010-08
    proved_by: []
    statement: Configuration operations provide no rollback declaration.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: documented
    source: 'services-crm:docs/data-jobs.md#The routes'
    origin: none
scenarios:
  - id: SC-CAP-PFM-DJE-010-01
    given: Two of twelve selected contact types are assigned to contacts.
    when: The administrator reviews and applies deletion.
    then: >-
      The dialog explains the two usage blocks, requests DELETE 10 contact types and leaves the blocked
      types in the refreshed list.
    provenance: test
    source: 'react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0106.spec.ts#DJE-ACC-0106'
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-PFM-DJE-007
  - CAP-PFM-DJE-009
journeys:
  - JNY-PFM-DJE-003
open_questions:
  - OQ-PFM-DJE-002
  - OQ-PFM-DJE-003
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).
controls: [TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-CRY-004, TC-DAT-001, TC-DAT-003, TC-DAT-004, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
exercised_by: [FAS-PFM-DJE-03-01, FAS-PFM-DJE-03-02, FAS-PFM-DJE-03-03, FAS-PFM-DJE-03-04, FAS-PFM-DJE-03-05]
suites: [TST-PFM-DJE-088, TST-PFM-DJE-089, TST-PFM-DJE-091, TST-PFM-DJE-108, TST-PFM-DJE-116]
---

# Manage selected configuration items through recorded jobs

## Purpose

Administrators maintain several catalogue items in one reviewed operation while retaining items that other records still need.

## How It Works

An administrator selects catalogue items and chooses an available bulk action. Deletion preview distinguishes unused items from those still referenced by records. Usage counts help staff understand why a type remains. Approval uses the eligible count and the ordinary deletion safeguards. The list refreshes after processing. Status jobs are available only for catalogues that already have a status field. They use preview and application through the engine. Address and phone-number type lists currently offer deletion alone. Product has not yet resolved whether all status changes should use this path or whether those two catalogues should gain status. Configuration jobs cannot be restored through rollback.

## Relationships

- Counted bulk deletion provides the approval safeguards.
- List dialogs provide the shared interaction.
