---
id: ADR-CRM-REG-001
title: Regions Decides Placement; Entities Stores It
product_area: crm
module: regions
revision: 2
status: proposed
design_intent: proposed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Regions computes automatic placement through Entities persistence, while Entities stores regional values and
  accepts authorized staff selection; the regional module keeps no separate placement record.
constrains:
  - DOM-CRM-REG-003
  - SVC-CRM-REG-regions
  - SVC-CRM-ENT-entities
  - RESP-CRM
  - WF-CRM-REG-001
  - WF-CRM-REG-002
  - WF-CRM-REG-003
alternatives:
  - option: Store placement in an independent regional table.
    why_not: >-
      Record reads, exports and history would need another storage boundary, and existing record-version
      checks would no longer protect the visible region directly.
  - option: Calculate geographic placement during Entities saving.
    why_not: >-
      This would bring regional matching into every record write and conflict with the recorded asynchronous
      placement choice.
consequences:
  - Regional values remain accessible with their owning records through ordinary record surfaces.
  - >-
    Persistence functions provide an in-process ownership boundary rather than a separate public placement
    endpoint.
  - Ordinary record saves cannot replace the fingerprint maintained by regional processing.
supersedes: []
evidence:
  - >-
    services-crm at a8d1364f: modules/regions/services/region-assignment/region-assignment.ts (header: every
    statement belongs to the record’s own persistence service);
    modules/entities/services/persistence/contacts.ts, organizations.ts (region functions);
    modules/entities/db/region-fingerprint.ts.
origin: >-
  Observed module boundary: services-crm:modules/regions/services/region-assignment/region-assignment.ts; no
  separate product approval record.
---

# Regions Decides Placement; Entities Stores It

## Context

A regional value belongs on a person or organization, while geographic coverage belongs to the regional module. The ownership boundary must preserve ordinary record editing and automatic decisions.

## Decision

Automatic processing calls the record owner’s persistence functions for reads and writes within its transaction. Entities owns the stored region, override and fingerprint, and ordinary saves omit the fingerprint.

## Alternatives Considered

Store placement in an independent regional table. Record reads, exports and history would need another storage boundary, and existing record-version checks would no longer protect the visible region directly.

Calculate geographic placement during Entities saving. This would bring regional matching into every record write and conflict with the recorded asynchronous placement choice.

## Consequences

Regional values remain accessible with their owning records through ordinary record surfaces. Persistence functions provide an in-process ownership boundary rather than a separate public placement endpoint. Ordinary record saves cannot replace the fingerprint maintained by regional processing.
