# MokoSuiteRealty Real estate management for Joomla 6 — listings, showings, offers, commissions, open houses, property search. ## Quick Reference | Field | Value | |---|---| | **Package** | `pkg_mokosuiterealty` | | **Layer** | 2 (requires: Client → CRM) | | **Language** | PHP 8.3+ | | **Branch** | develop on `dev`, merge to `main` (protected) | | **Wiki** | [MokoSuiteRealty Wiki](https://git.mokoconsulting.tech/MokoConsulting/MokoSuiteRealty/wiki) | ## Architecture Joomla **package** (`pkg_mokosuiterealty`) — Layer 2 add-on extending MokoSuiteCRM. ### Dependencies - MokoSuiteClient (Layer 0) — base platform - MokoSuiteCRM (Layer 1) — contacts, deals, invoicing ### Helpers (6) - `ListingHelper` — filtered search, dashboard stats, price history (transactional) - `CommissionHelper` — split calculations, agent YTD, pending payouts - `ShowingHelper` — scheduling, agent calendar, buyer feedback - `OfferHelper` — submit, accept (atomic FOR UPDATE), competing rejection - `OpenHouseHelper` — event scheduling, visitor sign-in, lead capture - `PropertySearchHelper` — Haversine geo proximity, saved searches ### Database Tables (9) `listings`, `listing_photos`, `showings`, `offers`, `commissions`, `open_houses`, `open_house_visitors`, `price_history`, `saved_searches` ## Source Directory - `source/pkg_mokosuiterealty.xml` — package manifest - `source/packages/` — sub-extensions ## Rules - **Never commit** `.claude/`, `.mcp.json`, `TODO.md`, `*.min.css`/`*.min.js` - **Attribution**: `Authored-by: Moko Consulting` - **Workflow directory**: `.mokogitea/` - **Wiki**: documentation lives in the Gitea wiki, not `docs/` files - **Standards**: [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoCLI/wiki) - **Changelog**: `[Unreleased]` only — release system assigns versions - **No upstream references**: never reference competitor products ## Coding Standards - PHP 8.3+ / Joomla 6 patterns - `$this->getDatabase()` in models, `Factory::getContainer()->get(DatabaseInterface::class)` in helpers - `Factory::getApplication()->getIdentity()` for user - `FOR UPDATE` inside transactions for race-condition-prone operations - `quoteName()` for columns, `(int)` cast for IDs, `quote()` for strings