Koovira Dev Docs
20-modules/dating/overview.md

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 dating customer_master row

(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-)

IDFeatureActorMethodTablesStatus
DATE-001Activate dating laneuseractivateDatingLane :1199customer_master (dating row), dating_profiles🟢
DATE-002Set/verify privacy PINusersetPinForCurrentUser :1425, verifyPinForCurrentUser :1486pin store🟢
DATE-003Like / matchusersetLikeStatus :2831, isMutualMatch :3154, listMutualLikes :3069dating_likes🟡
DATE-004Matrimonial detailsusersaveMatrimonialDetails :184, getMatrimonialDetails :155matrimonial_profile_details🟠
DATE-005Set profile purpose (dating/matrimonial)usersetProfilePurpose :325profile🟡

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.