---
id: WF-MBR-MEM-021
title: Place an officer's renewal or enrolment order
trigger: An officer asks to renew an existing member or enrol a new one.
product_area: membership
module: memberships
revision: 1
status: draft
design_intent: proposed
implementation_evidence: partially-observed
inference: []
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
implements:
  - CAP-MBR-MEM-016
  - CAP-MBR-MEM-009
moves: []
crosses:
  - SVC-MBR-MEM-memberships
  - SVC-MBR-MEM-commerce-participant
idempotency: >-
  Order placement uses the caller’s actor and request identifier. Repeat
  recognition therefore requires the same request identity to reach a
  cooperating Commerce port.
concurrency: >-
  Membership reserves nothing here; Commerce placement supplies the
  authoritative reservation boundary for competing purchases.
hops:
  - 'n': 1
    actor_or_service: Officer through the API
    action: >-
      Check renewal visibility, including configured grace, or access to every
      unit of the new enrolment.
    anchor: >-
      services-membership:modules/memberships/services/access/scope-checks.ts:requireEnrolmentUnits
    seam: sync
    on_failure: >-
      Hide an inaccessible holding; report scope refusal for otherwise visible
      work.
    left_inconsistent: No partial local change remains.
    observer: Caller-visible API result
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#refuses
      an officer an enrolment of no unit, which is National’s
  - 'n': 2
    actor_or_service: Memberships service
    action: >-
      Build and prepare the selected or renewal package checkout with the
      officer as acting user.
    anchor: >-
      services-membership:modules/memberships/services/operations/officer-orders.ts:renewForMember
    seam: sync
    on_failure: Return checkout preparation’s coded refusal without placement.
    left_inconsistent: No partial local change remains.
    observer: Caller-visible API result
    provenance: test
    source: >-
      services-membership:tests/acceptance/security/MBR-ACC-0465.acceptance.ts#MBR-ACC-0465
  - 'n': 3
    actor_or_service: Commerce orders port
    action: Ask Commerce to place the order for the member as recipient.
    anchor: >-
      services-membership:modules/memberships/services/operations/officer-orders.ts:place
    seam: sync
    on_failure: The default Commerce adapter rejects placement without creating an order.
    left_inconsistent: A refused placement creates neither order nor reservation.
    observer: Caller-visible API result
    provenance: unknown
    source: FND-MBR-MEM-036
branches:
  - >-
    The enrolment preparation has a known gap validating identity-unit activity
    and type.
waits:
  - >-
    Coverage is unchanged by preparation and changes only when the later order
    obligation fulfils it.
evidence:
  - >-
    services-membership at 5994c270:
    modules/memberships/services/operations/officer-orders.ts;
    services/access/*;
    modules/commerce-participant/services/orders/purchase-checkout.ts
controls: [TC-AVL-002, TC-AVL-003, TC-AVL-004, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-006, TC-CHG-001, TC-CHG-002, TC-CHG-003, TC-CHG-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-007, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-IAM-006, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-MON-001, TC-MON-002, TC-MON-004, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-004, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-SEC-001, TC-SEC-004, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004]
---

# Place an officer's renewal or enrolment order

## What It Does

Officers place membership orders for people they can manage. Membership checks unit scope and prepares the same coverage plan used by checkout before delegating placement.

## The Flow

```mermaid
flowchart TD
  H1["Check renewal visibility, including configured grace, or access to every unit of the new enrolment"]
  H2["Build and prepare the selected or renewal package checkout with the officer as acting user"]
  H1 --> H2
  H3["Ask Commerce to place the order for the member as recipient"]
  H2 --> H3
```

## When Something Fails

Preparation and access checks write no membership changes. The Commerce port currently refuses, so the route cannot place a live order through its default wiring.
