Module: Dating & Matrimonial (dating / —)
Status: 🟡 Partially implemented (dating live at small scale; matrimonial has no product surface) · Last validated: 2026-09-06 · Priority: P2
Dating (and a matrimonial lane) built on the sub-profile identity model with a privacy PIN. Validated against classs/DatingModule.php + schema.
A. Purpose
Users opt into a dating sub-profile (separate from their social identity) and match. No commission model defined. Matrimonial is a lane toggle, not a separate product.
B. Actors
Dating user (a dating sub-profile of a person); admin/moderation. No merchant side.
C. Entry points
/matchconnect.php, /dating_search.php, /dating_verify.php. Matrimonial has no own URL — it is a profile_intent toggle inside Dating.
D. Identity model (important)
Dating is a sub-profile lane, not a standalone account:
provisionDatingSubProfileRow(masterId)(:1174) creates the datingcustomer_masterrow
(profile_type='dating', parent_user_id = the person).
activateDatingLane/deactivateDatingLane(:1199/:1238) toggle it (canonical
TOGGLE_SUB_PROFILE path — see ../../30-core/auth.md).
- Privacy PIN:
setPinForCurrentUser(:1425) /verifyPinForCurrentUser(:1486) gate entry to
dating mode; exitDatingMode (:1561) leaves it. requireActiveDatingProfile (:1578) guards every dating action (optional adult enforcement).
E. Feature registry (prefix DATE-)
| ID | Feature | Actor | Method | Tables | Status |
|---|---|---|---|---|---|
| DATE-001 | Activate dating lane | user | activateDatingLane :1199 | customer_master (dating row), dating_profiles | 🟢 |
| DATE-002 | Set/verify privacy PIN | user | setPinForCurrentUser :1425, verifyPinForCurrentUser :1486 | pin store | 🟢 |
| DATE-003 | Like / match | user | setLikeStatus :2831, isMutualMatch :3154, listMutualLikes :3069 | dating_likes | 🟡 |
| DATE-004 | Matrimonial details | user | saveMatrimonialDetails :184, getMatrimonialDetails :155 | matrimonial_profile_details | 🟠 |
| DATE-005 | Set profile purpose (dating/matrimonial) | user | setProfilePurpose :325 | profile | 🟡 |
G. Data model (2026-09-06, re-verified)
dating_profiles 3 (live count, 2026-09-06; an earlier same-day reading of this page said 4 — treat as a moving snapshot, re-run before quoting) · dating_likes 3 · matrimonial_profile_details 0. Correction: there is no separate dating_matches table at all (the earlier note guessing one "exists under a different name" was wrong). isMutualMatch (:3154) and listMutualLikes (:3069) compute a match by self-joining dating_likes for reciprocal like_value = 1 rows in both directions — a match is a derived state, not a stored row.
H. Financial impact
None defined — no commission/plan for dating or matrimonial.
K. State machine
Sub-profile: not_provisioned → provisioned(inactive) → active (PIN set) → exited. Match: liked → mutual(matched) → chatting.
L / M / N
Errors: DATE-E001 dating action blocked — no active dating profile / PIN not verified (requireActiveDatingProfile). DATE-E002 matrimonial has no surface (0 rows). Depends on identity (sub-profiles), chat. Change-impact: lane activation touches the identity model — re-test activate→PIN→exit and that dating stays isolated from the social profile.