Skip to content

CAP-CRM-ENT-010Keep dated relationships current

Markdown

CAP-CRM-ENT-010

Keep dated relationships current

Markdown
  • DocumentApproved
  • Product intentConfirmed
  • ImplementationPartially observed

KindCapabilityProduct areaCRMModuleEntitiesRevision1Approved byAndrewApproved at2026-10-22

Read atservices-crm 7ea48a41react-console da630758

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Upcoming, Current and Past never overlap, and counts, rows and the service agree.A job starting next month becomes current, with its roles and compliance, on its start day.
Surfaces
consoleapijob
Intent sources
services-crm:docs/milestones/CRM-M2-affiliations-roles-compliance.md#D-10services-crm:docs/milestones/CRM-M2-affiliations-roles-compliance.md#D-12services-crm:docs/milestones/CRM-M2-affiliations-roles-compliance.plan.md#A2services-crm:docs/milestones/CRM-M2-affiliations-roles-compliance.plan.md#A3services-crm:docs/milestones/CRM-M2-affiliations-roles-compliance.plan.md#A6services-crm:docs/milestones/CRM-M2-affiliations-roles-compliance.plan.md#A7

Controls

27 controls apply, from the corpus control catalogue.

TC-AVL-004 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-AZ-005 TC-AZ-006 TC-DAT-001 TC-DAT-002 TC-DAT-003 TC-IAM-001 TC-IAM-005 TC-IAM-006 TC-LOG-004 TC-LOG-005 TC-MON-001 TC-MON-002 TC-PI-001 TC-PI-002 TC-PI-003 TC-PI-004 TC-PI-005 TC-PRV-001 TC-PRV-002 TC-TEN-001 TC-TEN-002 TC-TEN-003

Repositories Read

RepositoryPaths
undefined:modules/entities/
undefined:docs/affiliations/README.md
undefined:modules/entities/tests/e2e/affiliation-date-reconciliation.e2e.spec.js
undefined:modules/entities/tests/integration/services/affiliations/affiliation-date-reconciliation.integration.spec.js
undefined:modules/entities/tests/integration/services/persistence/contact-affiliations.business-dates.integration.spec.js
undefined:modules/entities/tests/unit/services/affiliations/affiliation-date-window.spec.js
undefined:app/(console)/console/[tenantId]/crm/contacts/
undefined:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0186.spec.ts
undefined:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0210.spec.ts

Where It Lives

Permissions

KeyChecked atScope
crm.contacts.bulkapitenant
crm.contacts.readapitenant

Business Rules

8 rules, 8 to be proved before approval. A rule's product intent is derived from its origin: 8 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Affiliation classification, filters, primary starts, Organization command dates, compliance and automatic roles use the workspace’s local business date rather than the server or browser date.
policyservice, consoletest
services-crm:modules/entities/tests/integration/services/persistence/contact-affiliations.business-dates.integration.spec.js#refuses a primary starting on the tenant's tomorrow, though it is already UTC's and Sydney's today
02must prove
Confirmed
Affiliations are upcoming before their start, past after their inclusive end and current otherwise, including their last day.
calculationservice, databasetest
03must prove
Confirmed
Console affiliation filters, row labels and counts use the service’s effective-date classification, and new affiliations start with the workspace’s current date.
policyconsoletest
04must prove
Confirmed
Date reconciliation processes starts after the last settled day through today and ends from the last settled day up to yesterday, begins from yesterday for an unprocessed workspace and includes missed days in the next window.
calculationservicetest
services-crm:modules/entities/tests/unit/services/affiliations/affiliation-date-window.spec.js#spans every day of a skipped weekend, so the next night makes them up
05must prove
Confirmed
Reconciliation assigns roles and pending default links for starts in its window, recalculates organizations affected by affiliation or role boundaries and otherwise does not save records merely because a day passes.
lifecycleservicetest
services-crm:modules/entities/tests/integration/services/affiliations/affiliation-date-reconciliation.integration.spec.js#takes the organization out of compliance the next morning, with no save of the contact
06must prove
Confirmed
Repeating a settled day or processed window creates no further writes, and the reconciliation watermark advances only after all affected organizations settle successfully.
invariantservicetest
services-crm:modules/entities/tests/integration/services/affiliations/affiliation-date-reconciliation.integration.spec.js#finds the day settled and changes nothing, the organization’s version included
07must prove
Confirmed
On-demand reconciliation requires the contacts bulk permission; dry runs report changes without writing and may use a future day, while actual runs reject a supplied day, invalid calendar dates and unknown properties.
permissionapi, servicetest
08must prove
Confirmed
Scheduled reconciliation processes workspaces after their local midnight only when enabled by deployment; the shipped default keeps it disabled.
lifecycleservicedocumented
services-crm:docs/affiliations/README.md#5.6b The overnight date reconciliation (D-46; CRM-M2 A6 and A7)

Scenarios

IdGivenWhenThenProvenance
01Ruth's Chapter affiliation starts next month.Her 360 and the chapter's Contacts tab are opened today.It displays under Upcoming, not Current, on both.test
02A Billing Contact role ends yesterday on a current affiliation at an organization whose type needs one.The reconciliation runs this morning.The organization is out of compliance with no save of the contact.test
services-crm:modules/entities/tests/integration/services/affiliations/affiliation-date-reconciliation.integration.spec.js#takes the organization out of compliance the next morning, with no save of the contact

Edge Cases

IdGivenWhenThenProvenance
03A workspace in New York one minute before its midnight, UTC already the next day.A affiliation starting on the New York tomorrow is read.It is upcoming.test
services-crm:modules/entities/tests/unit/services/affiliations/affiliation-date-window.spec.js#is still the previous day in New York one minute before its midnight, when UTC has reached the next

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.