---
id: ATS-CRM-ACT-003
scope: CAP-CRM-ACT-003
product_area: crm
module: activities-tasks
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CRM-ACT-003-01
    title: Reject stale edits and missing versions
    level: api
    proves:
      - BR-CAP-CRM-ACT-003-01
    preconditions: An activity has advanced to its second version.
    steps: 'Replace and patch using the first version, then omit the patch version.'
    expected: >-
      Stale requests conflict, the missing version fails validation, and the
      saved record remains.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses
        a replace of a version it has moved on from: 409
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses
        a patch at a version the activity has moved on from: 409
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses
        a patch that names no version: 400 naming sys_version
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#refuses
        a version the activity has moved on from
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a
      replace of a version it has moved on from: 409
  - id: ATS-CRM-ACT-003-02
    title: Preserve unnamed fields in a partial edit
    level: api
    proves:
      - BR-CAP-CRM-ACT-003-02
    preconditions: A meeting contains all optional details.
    steps: 'Change only its subject, then explicitly clear its end.'
    expected: The first patch changes only subject and the next clears only end.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#leaves
        every property the patch omits as it was: duration, end, body, external
        id, owner and links
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#clears
        a property the patch sets to null, and only that one
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#leaves
      every property the patch omits as it was: duration, end, body, external
      id, owner and links
  - id: ATS-CRM-ACT-003-03
    title: Reject incomplete replacement before writing
    level: api
    proves:
      - BR-CAP-CRM-ACT-003-03
    preconditions: The saved meeting includes duration.
    steps: 'Replace without duration, then with complete replacement content.'
    expected: >-
      The incomplete request identifies duration without changing the record;
      the complete request succeeds.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses
        a replacement missing a property: 400 naming it
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#changes
        nothing when it refuses the incomplete replacement
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#accepts
        a complete replacement, where null clears: 200, the end is gone
      - >-
        react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0692.spec.ts#CRM-ACC-0692
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a
      replacement missing a property: 400 naming it
  - id: ATS-CRM-ACT-003-04
    title: Match replacement links to retained records
    level: api
    proves:
      - BR-CAP-CRM-ACT-003-04
    preconditions: An activity links two contacts.
    steps: Retain one contact and replace the other with an organization.
    expected: >-
      The retained link survives, the removed link disappears and the new link
      is created.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#replaces
        the links as a set on update, keeping the row of a record still linked
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#replaces
      the links as a set on update, keeping the row of a record still linked
  - id: ATS-CRM-ACT-003-05
    title: Keep deactivated selections while correcting history
    level: api
    proves:
      - BR-CAP-CRM-ACT-003-05
    preconditions: A saved activity’s type and outcome are deactivated.
    steps: >-
      Correct its subject and attempt to move another activity to the inactive
      type.
    expected: Correction retains the earlier selections; the new selection fails.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#keeps
        an inactive type on an activity that already has it
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#keeps
        a deactivated outcome on an activity that already has it
      - >-
        react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0700.spec.ts#CRM-ACC-0700
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#keeps
      an inactive type on an activity that already has it
  - id: ATS-CRM-ACT-003-06
    title: Enforce an activity full lock
    level: api
    proves:
      - BR-CAP-CRM-ACT-003-06
    preconditions: The activity is locked against updates and deletes.
    steps: Try replacement and deletion.
    expected: Both operations conflict without changing the activity.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#refuses
        a locked activity
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#refuses
      a locked activity
  - id: ATS-CRM-ACT-003-07
    title: Delete an activity and its local relationships
    level: api
    proves:
      - BR-CAP-CRM-ACT-003-07
    preconditions: An activity links two records.
    steps: 'Delete it, read it and delete it again.'
    expected: >-
      The activity and links are absent; later read and deletion return Not
      Found.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#removes
        the activity and its links
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#deletes
        it: 200, and a read afterwards is 404, as is a second delete
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#writes
        a deletion revision
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#removes
      the activity and its links
  - id: ATS-CRM-ACT-003-08
    title: Allow activity deletion at user tier
    level: browser
    proves:
      - BR-CAP-CRM-ACT-003-08
    preconditions: A Standard User can access a colleague’s activity.
    steps: Delete the activity and attempt contact deletion.
    expected: Activity deletion succeeds and contact deletion lacks authority.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0717.spec.ts#CRM-ACC-0717
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0717.spec.ts#CRM-ACC-0717
evidence:
  - >-
    Pinned service assertions and proposed proof cases are identified in the
    scenario sources and bindings.
  - >-
    Pinned console assertions and proposed proof cases are identified in the
    scenario sources and bindings.
---

# Correct or delete an activity with protection against stale edits: Acceptance Test Set

## Coverage

Bound scenarios identify existing assertions; unbound scenarios remain proposed proof. Static inspection does not establish a passing execution.

| Rule | Proof Scenario Or Gap |
|---|---|
| `BR-CAP-CRM-ACT-003-01` | `ATS-CRM-ACT-003-01` |
| `BR-CAP-CRM-ACT-003-02` | `ATS-CRM-ACT-003-02` |
| `BR-CAP-CRM-ACT-003-03` | `ATS-CRM-ACT-003-03` |
| `BR-CAP-CRM-ACT-003-04` | `ATS-CRM-ACT-003-04` |
| `BR-CAP-CRM-ACT-003-05` | `ATS-CRM-ACT-003-05` |
| `BR-CAP-CRM-ACT-003-06` | `ATS-CRM-ACT-003-06` |
| `BR-CAP-CRM-ACT-003-07` | `ATS-CRM-ACT-003-07` |
| `BR-CAP-CRM-ACT-003-08` | `ATS-CRM-ACT-003-08` |
| `BR-CAP-CRM-ACT-003-09` | no scenario: `FND-CRM-ACT-028` |
| `BR-CAP-CRM-ACT-003-11` | no scenario: `FND-CRM-ACT-028` |
