# Phase 1 Database Schema (Foundation)

Tables created in this phase (`app/Database/Migrations/2026-09-18-09000*`):

| Table | Purpose |
|---|---|
| `roles` | Organizational roles (Super Admin, Finance Manager, ...). Configurable, not hard-coded. |
| `permissions` | One row per (module, action) — e.g. `finance.approve`. |
| `role_permissions` | Pivot: which permissions each role grants. |
| `membership_categories` | General / Prime / Pioneer, admin-configurable. |
| `users` | Auth identity. `role_id` nullable — NULL means no staff role (a plain member). |
| `members` | 1-1 with a user who holds a membership. Formatted `member_code` (MEM-000001), `membership_category_id`, `registration_date`, `status`. Separate from `users` because not every user is a member (e.g. pure staff accounts), and not every member need be staff. |
| `id_sequences` | Backs `App\Libraries\EntityId::next('MEM')` — atomic, row-locked counter per prefix (MEM/PROP/PROJ/DOC/TXN/INV/PAY). |
| `settings` | Key/value store, grouped (`organization.org_name`, `branding.primary_color`, ...). |
| `audit_logs` | Who did what, when, to which record — written via `App\Libraries\Audit::log()`. |

## Seeded (app/Database/Seeds)

- 14 roles from spec section 8, `super-admin` and `system-administrator` flagged `is_system`.
- 150 permissions (15 modules × 10 actions).
- Default role→permission grants (`RolePermissionsSeeder`) — a starting point, editable later via `/adm/roles`.
- 3 membership categories: General / Prime / Pioneer.
- Organization + branding settings (placeholder green/black tokens).
- One Super Admin login: `admin@barinagreencity.com` / `ChangeMe123!` — **change this before any real use.**

## Not yet designed

Properties, Projects, Finance, Content/CMS, Documents (metadata + versioning),
Communication, HR, Procurement — each needs its own ERD pass before its
migrations are written (Phases 4-7 per the spec's sequence).
