algos crm.
CRM Documentation
The same product docs available in the dashboard—guides for setup, architecture, modules, and day-to-day use.
RBAC (roles & permissions)
Custom role-based access control. Permissions are defined in config and synced to the database — Spatie Permission is not used.
Model
flowchart LR
Config[config/permissions.php] -->|permissions:sync| Perms[(permissions)]
Roles[(roles per company)] --> RP[(role_permission)]
Perms --> RP
Users[(users)] --> UR[(role_user)]
Roles --> UR
Gates[Laravel Gates] --> Perms
- Permission slug format:
{action}.{module}
Examples:view.leads,manage.channels,reply.inbox - Roles are per company (after migrations that added
roles.company_id). - System role
adminreceives all permissions (*). - Default role
salesreceives an explicit allow-list.
Modules & actions
Source: config/permissions.php.
| Module | Actions |
|---|---|
| customers | view, create, import, update, delete |
| leads | view (own), view_all, create, import, update, delete, assign, convert, log |
| tasks | view (own), view_all, create, change_status, update, delete, assign |
| users | view, create, import, update, delete |
| roles | view, create, update, delete |
| activity_logs | view, view_own |
| notifications | view |
| company_settings | update |
| reports | view, export |
| demo | website_lead |
| channels | view, manage |
| inbox | view, reply, assign |
Default sales grants
Exact list from database/seeders/RbacSeeder.php:
view/create/import/update/delete.customersview/create/import/update/delete/convert/log.leads(noview_all.leads, noassign.leads)view/change_status/update/delete.tasks(nocreate.tasks,view_all.tasks,assign.tasks)view_own.activity_logs,view.notificationsview/export.reportsview.channels(nomanage.channels)view.inbox,reply.inbox(noassign.inbox)
Admin (*) receives every synced permission. After custom Role UI edits, the database is source of truth.
Syncing permissions
Whenever you change config/permissions.php:
php artisan permissions:sync
This will:
- Upsert permission rows for every
{action}.{module}. - Delete stale permissions (and detach them from roles).
- Sync default roles via
RbacRoleSynchronizer. - Refresh gates.
Authorization in code
| Mechanism | Usage |
|---|---|
$user->hasPermission('view.inbox') |
Direct check |
$this->authorize('view', $model) |
Policy |
@can('manage', $channel) |
Blade |
middleware('permission:view.notifications') |
Route |
Gates are registered from DB permissions by PermissionRegistrar.
AdminLTE menu
Sidebar entries use 'can' => 'view.channels'-style gate abilities (config/adminlte.php). Missing menu after deploy usually means permissions were not synced.
Adding a permission
- Add module/action in
config/permissions.php. - Run
php artisan permissions:sync. - Grant on roles (UI or update
RbacSeederdefaults). - Enforce via policy / middleware /
@can. - Add Feature tests for allow/deny.