Part I · SRS
Chapter 2 - Functional Requirements Register
Legend — implementation status: Implemented & Verified = routed + controller method + model writes; Partial = pieces missing; Present/Unverified = code exists but execution not verified; Not Found; Sakeholder Confirmation Needed.
FR-AUTH — Authentication & User Management
| ID | Title | Requirement statement (system shall) | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-AUTH-001 | Register account | The system shall allow new legal entities (companies) to register with name, email, password, company name. | Public | RegisteredUserController; routes auth/register. | Implemented & Verified (UI + controller) |
| FR-AUTH-002 | Email verification | The system shall require email verification when emailVerification enabled, using SIGNED token link; throttle 6/min. | Public | auth/show?verify route; VerifyEmailController. | Implemented & Verified |
| FR-AUTH-003 | Log in | The system shall authenticate using email + password with session cookie. | Public | AuthenticatedSessionController. | Implemented & Verified |
| FR-AUTH-004 | Logout | The system shall end the session securely. | Auth | AuthenticatedSessionController::destroy. | Implemented & Verified |
| FR-AUTH-005 | Forgot password | The system shall send a reset link (throttle). | Public | PasswordResetLinkController. | Implemented & Verified |
| FR-AUTH-006 | Reset password | The system shall accept a reset token + new password. | Public | NewPasswordController. | Implemented & Verified |
| FR-AUTH-007 | Confirm password | The system shall require password re-confirmation for sensitive actions (using inertia form). | Auth | ConfirmablePasswordController. | Implemented & Verified |
| FR-AUTH-008 | Update language | The system shall allow users to set UI language. | Auth | UserController@updateLanguage, TranslationController. | Implemented & Verified |
| FR-AUTH-009 | 2FA (Google) | The system shall store google2fa_enable/secret per user, but OAuth-level 2FA is unverified. | Auth | users migration. | Partial / Present |
| FR-AUTH-010 | Impersonate user | The system shall allow authorized user to start impersonating another user and to leave. | Auth superadmin | ImpersonateController; Package laravel-impersonate. | Implemented & Verified (routed) |
| FR-AUTH-011 | User CRUD | The system shall create/update/delete users (profile + position, department, specialties, hourly_rate, bank info). | Company/Admin | UserController; UserSeeder. | Implemented & Verified |
| FR-AUTH-012 | User status toggle | The system shall enable/disable a user. | Admin | UserController::toggleStatus. | Implemented & Verified |
| FR-AUTH-013 | Password reset by admin | The system shall allow admin to reset another user's password. | Admin | UserController::resetPassword. | Implemented & Verified |
| FR-AUTH-014 | Login history | The system shall record user logins (IP, date, type=login, details JSON). | System | login_histories migration. | Implemented & Verified |
| FR-AUTH-015 | Audit log | The system shall write audit entries for actions (user_id, action, entity_type/id, metadata). | System | audit_logs migration; LegalGovernanceService::logAudit. | Partially (manual call-sites) |
FR-WORKSPACE — Workspaces & Membership
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-WS-001 | Create workspace | The system shall create workspace with name, description, owner; seeds default task stages and bug statuses. | Admin | WorkspaceService; WorkspaceObserver::created. | Implemented & Verified |
| FR-WS-002 | Workspace settings | The system shall store settings (timesheet, automation, email filtering, governance). | Owner/Admin | workspaces.settings JSON. | Implemented & Verified |
| FR-WS-003 | Tenant isolation | The system shall restrict data to current workspace. | System | workspace_id columns, User::scopeWorkspaceScoped. | Implemented (query-level, unverified isolation depth) |
| FR-WS-004 | Invite members | The system shall invite users by email with token; expiry + accept. | Owner/Admin | WorkspaceInvitationController; Permission create. | Implemented & Verified |
| FR-WS-005 | Role per member | The system shall assign one of owner/manager/member/client in a workspace. | Owner/Admin | workspace_members.role enum. | Implemented & Verified |
| FR-WS-006 | Membership activation | The system shall track active/inactive/pending status + invited/joined dates. | System | workspace_members. | Implemented & Verified |
| FR-WS-007 | Switch workspace | The system shall let user switch current workspace. | Auth | WorkspaceController::switch; users.current_workspace_id. | Implemented & Verified |
| FR-WS-008 | Remove member | The system shall remove a member and reassign maybe? Owner stays. | Owner/Admin | WorkspaceController::removeMember. | Implemented & Verified (route + controller) |
| FR-WS-009 | Change member role | The system shall change member's role. | Owner/Admin | WorkspaceController::updateMemberRole. | Implemented & Verified |
| FR-WS-010 | Suspension | The system shall block state changes when a workspace is suspended. | System | CheckWorkspaceSuspension. | Implemented & Verified |
| FR-WS-011 | Capacity availability | The system shall track member availability_status (available/busy/away/on_leave) and max_cases. | Manager/Owner | workspace_members. | Implemented (fields; consumption unverified) |
| FR-WS-012 | Default workspace limit | Plan shall restrict total workspaces per user. | SaaS | PlanLimitService::canCreateWorkspace. | Implemented (SaaS only) |
FR-COMPANY — SaaS Tenant Administration
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-COMPANY-001 | Company create/update/delete | The system shall manage companies (users type 'company') with profile, address, etc. | Super Admin | CompanyController. | Implemented & Verified |
| FR-COMPANY-002 | Toggle company | The system shall enable/disable company company user. | Super Admin | CompanyController::toggleStatus. | Implemented & Verified |
| FR-COMPANY-003 | Reset company password | Super admin shall reset company user password. | Super Admin | CompanyController::resetPassword. | Implemented & Verified |
| FR-COMPANY-004 | Company plan assignment | Super admin shall assign/upgrade company plan. | Super Admin | CompanyController::getPlans/upgradePlan. | Implemented & Verified |
| FR-COMPANY-005 | Default plan on trial | New company gets default plan + trial period according to plan flags. | System | UserObserver::creating + Plan::isDefault. | Implemented & Verified |
| FR-COMPANY-006 | Plan order (subscription purchase) | The system shall accept plan order via 30+ gateways. | Company | PlanController; InvoicePayment-related? Actually plan-orders routes + gateways. | Implemented & Verified / stub exceptions |
| FR-COMPANY-007 | Plan request (trial/upgrade) | User shall request plan/trial/cancellation and admin shall approve/reject. | Company → Admin | PlanRequestController. | Implemented & Verified (routes) |
| FR-COMPANY-008 | Usage status | System shall expose plan usage status into UI (plan_warnings). | System | CheckPlanLimits middleware. | Implemented & Verified |
| FR-COMPANY-009 | Coupon validation | System shall validate coupon during plan purchase (min/max spend, code_type manual/auto). | Company | CouponController + modules. | Implemented & Verified |
| FR-COMPANY-010 | Referral program | Tracking + payout; backend & UI exist; routes disabled. | Company | ReferralController/comments in web.php. | Partial / Not Routed |
| FR-COMPANY-011 | Storage quota | Upload check against plan storage_limit (MB). | System | PlanLimitService::canUploadFile. | Implemented & Verified |
| FR-COMPANY-012 | Trial expiry | System shall redirect to plans when trial expired. | System | CheckPlanAccess. | Implemented & Verified |
| FR-COMPANY-013 | Company limits on users/clients/managers | Per plan. | System | PlanLimitService; Plan model accessors. | Implemented & Verified |
| FR-COMPANY-014 | Commission amount tracked | Amount recorded on users row. | System | User model. | Present (consumption unverified) |
FR-PROJECT — Project / Case
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-PROJECT-001 | Create project | The system shall create project with title, description, status, priority, dates, budget, progress, public flag. | Manager/Lead | ProjectController, Inertia pages. | Implemented & Verified |
| FR-PROJECT-002 | Workspace-scoped project access | Project list filters by workspace + tag. | All | ProjectController::index, scopes. | Implemented & Verified |
| FR-PROJECT-003 | Update project | The system shall update project fields. | Owner/manager | ProjectController::update. | Implemented & Verified |
| FR-PROJECT-004 | Delete project | Soft delete (timestamps present). | Owner | ProjectController::destroy; projects migration softDeletes. | Implemented & Verified |
| FR-PROJECT-005 | Project team members | The system shall assign/unassign members/managers/clients to project. | Owner/Manager | ProjectMember/ProjectClient, controller. | Implemented & Verified |
| FR-PROJECT-006 | Milestones | CRUD + status + reorder milestones. | Owner/Manager | ProjectMilestoneController. | Implemented & Verified |
| FR-PROJECT-007 | Notes | Add notes (pin/unpin, edit, delete). | All members | ProjectNoteController. | Implemented & Verified |
| FR-PROJECT-008 | Attachments | Upload/download/delete files on project. | All members | ProjectAttachmentController. | Implemented & Verified |
| FR-PROJECT-009 | Progress | Auto-calculate project progress from tasks/milestones + manual update. | System | Project::calculateProgress, updateProgress. | Implemented & Verified |
| FR-PROJECT-010 | Activity log | Record all project activities. | System | ProjectActivity, controller. | Implemented & Verified |
| FR-PROJECT-011 | Project budget per project | One budget per project with categories and revisions (not global budget module). | Owner/Manager | ProjectBudget, route project/create-budget? route present. | Implemented & Verified |
| FR-PROJECT-012 | Governances/allowed domains | Attach governance_settings including allowed_domains for inbound email matching. | Owner/Admin | Project model. | Implemented & Verified |
| FR-PROJECT-013 | Public project | is_public flag. | Owner | Project model. | Present (consumption/visibility unverified) |
| FR-PROJECT-014 | Create project from email | Auto-create project when inbound email from approved domain/code and settings enabled. | System | EmailListenerService::processMessage + create project. | Implemented & Verified (rule-based) |
| FR-PROJECT-015 | Assign manager/lawyer | Manager/lawyer assignment (from automation settings, random fallback if configured). | System | EmailListenerService auto-assign logic. | Implemented & Verified |
| FR-PROJECT-016 | Join Zoom meeting | Link Zoom meeting to project. | All members | ZoomMeetingController; Project. | Implemented & Verified (routes present) |
| FR-PROJECT-017 | Email-project link | Email messages stored with project_id. | System | EmailMessage model. | Implemented & Verified |
| FR-PROJECT-018 | Milestone due date | Due date with status becoming overdue. | System | ProjectMilestone migration. | Implemented & Verified |
FR-TASK — Tasks & Kanban
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-TASK-001 | Kanban stages (workspace-scoped) with reorder + set default. | Default board pipeline. | Admin | TaskStageController; observer seeds. | Implemented & Verified |
| FR-TASK-002 | Task CRUD | Title, description (10k chars), priority, dates, milestone, status. | Any member | TaskController. | Implemented & Verified |
| FR-TASK-003 | Duplicate task | Duplicate via TaskController::duplicate. | Any | Route. | Implemented & Verified |
| FR-TASK-004 | Stage transitions | Drag/change stage; log status change; emits TaskStageUpdated. | Any assigned | TaskController::changeStage. | Implemented & Verified |
| FR-TASK-005 | Multi-assignee | Assign multiple users to task (task_members). | Creator/manager | Task members table; route. | Partial (model fillable gap) |
| FR-TASK-006 | Review/submission governance | Submit/return/approve lifecycle with TaskEvent. | Assignee → Manager | LegalGovernanceService. | Implemented & Verified |
| FR-TASK-007 | Task comments | Create/update/delete comments with mentions (JSON array). | Members | TaskCommentController. | Implemented & Verified |
| FR-TASK-008 | Checklist | Add/toggle checklist items; display progress. | Members | TaskChecklistController. | Implemented & Verified |
| FR-TASK-009 | Attachments | Upload/download/delete. | Members | TaskAttachmentController. | Implemented & Verified |
| FR-TASK-010 | Task templates | Create localized task template. | Admin/Manager | TaskTemplateController. | Implemented & Verified |
| FR-TASK-011 | Communications (chat) | Manager-gated task messages (manager_approved). | Members | communications table. | Implemented & Verified |
| FR-TASK-012 | Task linking by email | Inbound email creates Task under a project (Task-stage default). | System | EmailListenerService. | Implemented & Verified |
| FR-TASK-013 | Task stage updates notify | Slack/Telegram when task stage updates. | System | SendTaskStageUpdateSlack/Telegram. | Implemented & Verified |
| FR-TASK-014 | Due-date reminder | Tasks due tomorrow get a reminder (cron). | System | tasks:check-due. | Implemented (signature found; command body not read). |
| FR-TASK-015 | Task-level timer | Manual entry through timesheets ($fillable?). TODO: see FR-TIMESHEET. | Any member. | TaskService. | Implemented & Verified |
FR-BUG
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-BUG-001 | Issue creation | Create bug with severity, status, project, milestone, priority, reproduction steps, expected/actual, environment. | Any member | BugController. | Implemented & Verified |
| FR-BUG-002 | Custom bug statuses workflow | Create/reorder/set-default bug statuses. | Admin | BugStatusController. | Implemented & Verified |
| FR-BUG-003 | Assign bug | Assign to member; notification emails. | Manager | BugAssigned listener + email. | Implemented & Verified |
| FR-BUG-004 | Bug comments + attachments | threaded comments and files. | Members | BugComment/Attachment controllers. | Implemented & Verified |
| FR-BUG-005 | Change status | Kanban-like change status. | Members | BugController::changeStatus. | Implemented & Verified |
| FR-BUG-006 | Severity tracking | minor/major/critical/blocker stored. | Developer. | bug.status migration. | Implemented & Verified |
| FR-BUG-007 | Bug → AI | AI-based triage allows Bug creation via EmailAIAssignmentService decision; bug_id FK added to email_message. | System | EmailAIAssignmentService; migration 2026-02-13. | Implemented & Verified |
FR-TIMESHEET
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-TS-001 | Manual timesheet entry | Create entries on tasks/projects per day. | Employee | TimesheetEntryController. | Implemented & Verified |
| FR-TS-002 | Live timer | Start/stop/pause/resume/status persisted on user. | Employee | TimerController. | Implemented & Verified |
| FR-TS-003 | Approvals | Submit/approve/reject with bulk variants. | Member → Manager | TimesheetApprovalController. | Implemented & Verified |
| FR-TS-004 | Daily/Weekly/Monthly/Calendar views | Four distinct UI views. | All | TimesheetController. | Implemented & Verified |
| FR-TS-005 | Timesheet reports | Generate dashboard + reports. | Manager/Owner | TimesheetReportController. | Implemented & Verified |
| FR-TS-006 | Billable/non-billable + hours conversion | Per entry rate + total amount. | System | TimesheetEntry. | Implemented & Verified |
| FR-TS-007 | Configure by workspace | Workspace timesheet_enabled/approval required/auto submit/reminder days and hours. | Owner | workspaces migration. | Implemented & Verified |
| FR-TS-008 | Customer (client) view report | Customer report. | Manager | CustomerReportController. | Implemented & Verified |
| FR-TS-009 | Performance dashboard (personal) | On-time/delayed/critical tasks. | All | PerformanceController. | Implemented & Verified |
| FR-TS-010 | Timesheet event logging | State changes logged (timesheet logs). | System | Timesheet model. | Implemented & Verified |
| FR-TS-011 | Monthly employee report | Auto-generate report (tasks stats) → approve/reject → PDF/Excel → email/WhatsApp. | System/Manager | MonthlyReportController/Export. | Implemented & Verified |
FR-BUDGET
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-BUDG-001 | Project budget with categories | Per-project budget, categories (allocated amounts). | Owner/Manager | ProjectBudget, BudgetCategory. | Implemented & Verified |
| FR-BUDG-002 | Revisions & approval | Revision requests; approval/reject workflow. | Manager → Approver | BudgetRevisionController. | Implemented & Verified |
| FR-BUDG-003 | Dashboard + alerts + trends | KPIs, alerts, trends. | Manager/Admin | BudgetDashboardController. | Implemented & Verified |
| FR-BUDG-004 | Default categories seed | Seed default categories to a new project budget. | System | ProjectBudget + default-categories. | Implemented & Verified (endpoint) |
| FR-BUDG-005 | Category utilisation | Per-category spent/remaining/%. | All | BudgetCategory accessors. | Implemented & Verified |
| FR-BUDG-006 | Budget vs. actual report | Aggregated report. | Manager/Admin | ExpenseReportController::budgetVsActual. | Implemented & Verified (UI verify needed) |
| FR-BUDG-007 | Recurring expense plans | Auto-create recurring expenses. | Member/Manager | expense_recurring table + model. | Present (controller not inspected — verify scheduling to execute). |
| FR-BUDG-008 | Project budget cap updates on expense approval | Auto update budget on approval; BudgetService::updateBudgetAfterApproval. | System. | Partial/Infra present. |
FR-EXPENSE
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-EXP-001 | Expense CRUD | Title, amount, currency, date, vendor, task link, receipt option. | Any member | ProjectExpenseController. | Implemented & Verified |
| FR-EXP-002 | Duplicate expense | Duplicate entry (keep optional status). | Member | Controller::duplicate. | Implemented & Verified |
| FR-EXP-003 | Categorise expenses | Link to a budget category. | Member | ProjectExpense schema. | Implemented & Verified |
| FR-EXP-004 | Receipt attach | Attach receipts, invoices, docs. | Submitter/ Approver | ExpenseReceiptController. | Implemented & Verified |
| FR-EXP-005 | Approval actions | Approve/reject/request info, notes, approval_level, approved_amount. | Approver | ExpenseApprovalController. | Implemented & Verified |
| FR-EXP-006 | Bulk approvals | Bulk approve multiple expense claims. | Approver | bulkApprove route. | Implemented & Verified |
| FR-EXP-007 | Multi-step workflows | Configurable steps approver-by approver. | Approver | ExpenseWorkflowController. | Implemented & Verified |
| FR-EXP-008 | "My approvals" page | List of approvals awaiting current user. | Approver | ProjectExpense/Workflow. | Implemented & Verified |
| FR-EXP-009 | Expense submission management console | Submitted expenses, process, export | Manager/Admin | ExpenseManagementController. | Implemented & Verified (export stub only) |
| FR-EXP-010 | Dashboards + trends + alerts | Per-project overview/budget utilisation/trends/alerts. | Admin/Manager | ExpenseDashboardController. | Implemented & Verified |
| FR-EXP-011 | Approval stats + budget summary | Show who needs to approve + budget check. | Manager/Admin | Controller. | Implemented & Verified |
| FR-EXP-012 | Export expense report | Export CSV budget/expenditure list (ExpenseManagement export). | Manager | ExpenseManagementController::export. | Implemented & Verified? Entity-level only |
| FR-EXP-013 | Reimbursable expectation (recurring) | expenses linked to recurring schedule. | System | ExpenseRecurring migration + model. | Present (unclear if activated) |
FR-INVOICE
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-INVOICE-001 | Invoice CRUD | Create with items, tax, discount, currency, client links, project link. | Finance/owner | InvoiceController. | Implemented & Verified |
| FR-INVOICE-002 | Item-level links | Item can ref Task/Expense/TimesheetEntry. | Finance | InvoiceItem migration. | Implemented & Verified |
| FR-INVOICE-003 | Mark paid | Mark paid + record payment row with metadata. | Finance | InvoiceController::markAsPaid and createPaymentRecord. | Implemented & Verified |
| FR-INVOICE-004 | Send to client | Trigger invoice email via token URL. | Finance | InvoiceController::send (route). | Implemented & Verified (email template) |
| FR-INVOICE-005 | Status transitions | draft/sent/viewed/paid/partial_paid/overdue/cancelled. | System/Members | Invoice::status flow. | Implemented & Verified |
| FR-INVOICE-006 | Partial payments | Payment amount updates paid_amount. | System | Invoice::updatePaymentStatus. | Implemented & Verified |
| FR-INVOICE-007 | Public tokenised checkout | Client pays without login via token. | Client | InvoicePaymentController::show/processPayment. | Implemented & Verified |
| FR-INVOICE-008 | Gateway list shown | Only enabled gateways returned to UI. | System/Frontend | InvoicePaymentController::getEnabledPaymentGateways. | Implemented & Verified |
| FR-INVOICE-009 | Gateway initiation + callback/webhook | Each gateway has specific endpoints under the invoice success flow. | System | All *PaymentController + callbacks. | Present (not individually verified) |
| FR-INVOICE-010 | Auto invoice numbering | Generate unique number. | System | Invoice::generateInvoiceNumber. | Implemented & Verified |
| FR-INVOICE-011 | Payment record & method | Payment table includes method, amount, date, txn id, status, gateway_response. | System | Payment model. | Implemented & Verified |
| FR-INVOICE-012 | Client details on invoice | client_details snapshot; vCard not required. | Finance | Invoice migration. | Implemented & Verified |
| FR-INVOICE-013 | 30+ gateways configuration | Support for Stripe, PayPal, Razorpay, Mollie, Cashfree, Tap, PayTabs, PayTR, MercadoPago, Xendit, Aamarpay, PayFast, ToyyibPay, Khalti, Ozow, CoinGate, … | Super Admin | PaymentSettingController::preparePaymentSettings. | Implemented & Verified |
| FR-INVOICE-014 | Public receipt after payment | invoice/payment/{token}/success page. | Client | Frontend page + route. | Implemented & Verified |
FR-MEDIA
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-MEDIA-001 | Media library | List/upload multiple media; plan-limit aware; configurable storage disk. | Managers | MediaController. | Implemented & Verified |
| FR-MEDIA-002 | Version/collections | SpatieMediaLibrary registered; conversion(s) define thumbnails (stored). | System | MediaItem migration + model. | Implemented & Verified |
| FR-MEDIA-003 | Batch upload | Multi-file uploads with validation. | Managers | MediaController::batchStore. | Implemented & Verified |
| FR-MEDIA-004 | Download/delete | Secure download + delete. | Members/Admin. | Controller has methods. | Implemented & Verified |
FR-COMM — Communications / Notifications / Contacts / Newsletters
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-COMM-001 | Notification center | List/unread/read/all-read/delete notifications for user. | Auth | NotificationController + Notifications page. | Implemented & Verified |
| FR-COMM-002 | Templated email | Create and send emails from templates with multilanguage content. | Admin/User | EmailTemplateController + template lang model. | Implemented & Verified |
| FR-COMM-003 | Notification templates | Per-event templates editable by admin. | Admin | NotificationTemplateController. | Implemented & Verified |
| FR-COMM-004 | Gateways of communication config | Email (SMTP/IMAP) settings + test mail send. | Admin | EmailSettingController; MailConfigService. | Implemented & Verified |
| FR-COMM-005 | Contacts management | CRUD + status filter + bulk status, search + CSV export. | Any/Admin | ContactController. | Implemented & Verified |
| FR-COMM-006 | Newsletters (subscribers) | Subscriber CRUD, status toggle, bulk delete, export CSV. | Admin | NewsletterController. | Implemented & Verified |
| FR-COMM-007 | Slack/Telegram settings & test | Admin sends a test message to verify integration. | SaaS Admin | SlackSettingsController::testWebhook; TelegramSettingsController::test. | Partial (GET slack settings missing). |
FR-EMAIL — IMAP Inbox & Email Rules
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-EMAIL-001 | Connect email account | Store host, port, encryption, credentials (encrypted). | User/Owner | EmailAccount, EmailInboxController::store. | Implemented & Verified |
| FR-EMAIL-002 | Sync inbox | Manual/scheduled sync (sync-all) reads unseen mail. | System/User | SyncAllEmails, EmailListenerService. | Implemented & Verified |
| FR-EMAIL-003 | Auto-listener daemon | Real-time-ish 10-second polling + retries. | System | ListenEmails + EmailListenerService::listenIdleForAccount. | Implemented & Verified |
| FR-EMAIL-004 | Filter at account level | Whitelist/blocklist by email or domain. | User/Owner | EmailAccount filter_type/list. | Implemented & Verified |
| FR-EMAIL-005 | Filter at workspace level | allowed_email_senders with wildcard. | Owner/Admin | Workspace settings. | Implemented & Verified |
| FR-EMAIL-006 | Parse email subject/body | Extract case_ref, title, description; auto-create project. | System | EmailParserService. | Implemented & Verified |
| FR-EMAIL-007 | Mark read | After automation run mark email Seen in IMAP. | System | processMessage. | Implemented & Verified |
| FR-EMAIL-008 | Link email → task | Association via EmailMessage.task_id. | System/UI | Controller linkTask. | Implemented (UI requires manual clicking) |
| FR-EMAIL-009 | Toggle read | Switch read flag. | User | EmailInboxController::toggleRead. | Implemented & Verified |
| FR-EMAIL-010 | Delete email. | Removes from UI via table, optionally delete local. | User | Controller::destroy. | Implemented & Verified |
| FR-EMAIL-011 | Email config UI. | Edit host etc. from email config view. | User/Owner | EmailInbox/Config. | Implemented & Verified |
| FR-EMAIL-012 | Batch AI processing with progress | AI pending → process → progress → cancel → logs. | User/Owner | Controller methods + console command emails:process-batch. | Implemented & Verified |
| FR-EMAIL-013 | Record AI decision. | Store ai_decision JSON on email_message. | System. | EmailAIAssignmentService. | Implemented & Verified |
| FR-EMAIL-014 | Reassignment tracking. | reassignment_count + EmailTaskEvent tracking. | System. | migration 2026-02-14. | Implemented & Verified |
FR-AI-EMAIL (Gemini Triage)
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-AI-EMAIL-001 | Analyze email w/ Gemini. | System calls callGemini() to analyze content and returns JSON decision. | System. | EmailAIAssignmentService::callGemini. | Implemented & Verified (structure) |
| FR-AI-EMAIL-002 | Member profile understanding. | Build prompt from ai_member_descriptions + all team workload (tasks + bugs). | System. | getWorkspaceMembers + getWorkloadData. | Implemented (rate ~500 lines). |
| FR-AI-EMAIL-003 | Thread handling. | Detect previous handler for thread routing. | System. | getThreadContext. | Implemented & Verified. |
| FR-AI-EMAIL-004 | Sender history. | Attach past processed email for the sender. | System. | getSenderHistory. | Implemented & Verified. |
| FR-AI-EMAIL-005 | Token limits. | Restrict AI email processing per token quota? Check checkTokenLimit (called first). | System. | AiAgentService. | Implemented & Verified. |
| FR-AI-EMAIL-006 | Record usage | Record cost after processing. | System | AiAgentService::recordTokenUsage (workflow simplified). | Implemented & Verified. |
| FR-AI-EMAIL-007 | Execute decision (create task/Bug/Project, assign). | Perform decision; close email thread linkage. | System. | executeDecision (in service file, not fully read). | Present/Unverified detail. |
| FR-AI-EMAIL-008 | Auto-create Project (optional). | Same as FR-PROJECT-014. | System. | EmailAutomationService setting create_project. | Implemented & Verified. |
| FR-AI-EMAIL-009 | Auto-create Task. | Same as FR-EMAIL-012. | System. | Automation settings create_task. | Implemented & Verified. |
FR-AI-AGENT (In-App Chat)
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-AI-AGENT-001 | Agent persona/config. | Each workspace has an AI agent with name, persona, instructions. | Admin/Users | AiAgentController + workspace_ai_agents. | Implemented & Verified |
| FR-AI-AGENT-002 | Chat interface. | Send message, get response, persist conversation. | User | AiAgentController::chat endpoint. | Implemented & Verified |
| FR-AI-AGENT-003 | Conversations CRUD. | Create/list/show/update/delete conversations. | User | Controller methods + routes. | Implemented & Verified |
| FR-AI-AGENT-004 | Workspace knowledge build. | ai:build-knowledge analyses work, generates knowledge profile, infer domain. | Owner/Admin. | AiAgentService::buildKnowledgeProfile. | Implemented & Verified |
| FR-AI-AGENT-005 | Knowledge entries (rule/policy/fact/procedure/override). | Admin can set manual knowledge entries for the agent. | Admin | ai_knowledge_entries model + CRUD. | Implemented & Verified |
| FR-AI-AGENT-006 | File upload to conversation. | Upload a file → TextExtractor extracts text → include in context. | User | AiAgentController::uploadFile. | Implemented & Verified (only pdf/txt/csv/… wise per FileTextExtractorService) |
| FR-AI-AGENT-007 | Token/cost limit. | Monthly USD budget per workspace/plan/global with warning at 80%. | System. | AiAgentService budget logic. | Implemented & Verified |
| FR-AI-AGENT-008 | Rate limiting chat. | 30 per hour per user. | System. | AiAgentService::chat. | Implemented & Verified |
| FR-AI-AGENT-009 | Feedback on messages. | Thumbs-up/down via feedback field. | User. | Route api/ai-agent/messages/{id}/feedback. | Implemented (UI unclear) |
| FR-AI-AGENT-010 | Usage status. | Show current usage + status URL. | User. | route status/usage. | Implemented & Verified |
FR-REPORTS — Dashboards & Reports
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-REPORT-001 | Role-aware dashboard | Shows different widget based on superadmin vs workspace. | All | DashboardController. | Implemented & Verified |
| FR-REPORT-002 | Recent activity, task status overview, budgets. | Charts and lists derived from DashboardService. | All | DashboardService. | Implemented & Verified |
| FR-REPORT-003 | Customer report. | Workshop list invoices/projected view. | Manager | CustomerReportController. | Implemented & Verified |
| FR-REPORT-004 | Lawyer report (performance per lawyer). | Dashboard endpoint + overview per user. | Owner/Manager. | LawyerReportController; api endpoint. | Implemented & Verified |
| FR-REPORT-005 | Performance analytics. | Firm evaluation + user metrics. | Owner/Manager. | PerformanceAnalyticsService. | Implemented & Verified (UI varies) |
| FR-REPORT-006 | Export CSV. | Newsletter/Contact/ExpenseManagement CSV. | Owner/Admin. | Routes Invoke. | Implemented & Verified (only selected modules) |
| FR-REPORT-007 | PDF/Excel monthly human report. | Monthly employee performance report with PDF/Excel export + notify. | System/Manager. | MonthlyReportExportService. | Implemented & Verified |
| FR-REPORT-008 | Performance metrics. | Stored monthly performance per user (completion time, delays, returns, quality). | System. | performance_metrics migration; TaskEvent. | Partial (manual trigger concurrency unverified) |
FR-ADMIN — Administration & Configuration
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-ADMIN-001 | Roles CRUD. | roles page + CRUD, but routes only export Route::resource (index could inherit standard), status unclear. | Admin. | RoleController; PermissionSeeder. | Route found? @see system doc gaps. |
| FR-ADMIN-002 | Permissions assign. | Assign/manage permissions route but controller methods missing. | Admin. | Route vs Controller (PermissionController::assign/manage N/A). | Partial / Not Found |
| FR-ADMIN-003 | Audit viewer. | View audit log (company/saas admin only, paginated). | Superadmin/Company. | AuditController. | Implemented & Verified |
| FR-ADMIN-004 | Language manager. | CRUD languages; edit translation file. | Admin. | LanguageController. | Implemented & Verified |
| FR-ADMIN-005 | Landing page settings + CMS pages. | Settings at /landing-page/settings + custom pages CRUD. | Admin. | LandingPageController + CustomPageController. | Implemented & Verified |
| FR-ADMIN-006 | Media demo page. | Gallery viewer (support config) maybe meet say default for media library. | Admin. | media-library-demo.tsx. | Implemented & Verified |
| FR-ADMIN-007 | Coupons CRUD + toggle. | Admin manage coupons. | Superadmin. | CouponController. | Implemented & Verified (routes line) |
| FR-ADMIN-008 | Payment settings | Configure gateway credentials/enable; test connections; CRUD method map in PaymentSettingController. | Superadmin/Manager. | routes + preparePaymentSettings. | Implemented & Verified |
| FR-ADMIN-009 | Email/settings UI. | System/brand/storage/recaptcha/chatgpt/ai member attrs/cookie/seo/cache/clear email notifications. | Superadmin. | SystemSettingsController. | Implemented & Verified |
| FR-ADMIN-010 | Webhook CRUD. | Create, edit, toggle custom outgoing webhook (per workspace/company/module). | Admin. | WebhookController. | Implemented & Verified |
| FR-ADMIN-011 | Account settings (Slack/ Telegram/ Zoom/ WhatsApp settings). | Update config, test connections. | Admin. | Controllers via controller settings route. | Implemented & Verified (except noted partials) |
| FR-ADMIN-012 | Plan requests/orders review. | Approve/reject with audit; user views own orders. | Superadmin. | PlanRequest/PlanOrder controllers. | Implemented & Verified |
| FR-ADMIN-013 | Evaluation service. | Performance metrics & evaluation reports. | Manager/Owner. | EvaluationController; PerformanceAnalyticsService. | Implemented & Verified (UI varies) |
| FR-ADMIN-014 | Plan CRUD & toggle. | Admin creates/edits, enables/disables plan. | Superadmin. | PlanController. | Implemented & Verified |
| FR-ADMIN-015 | Approve payouts referrals. | Team approval for referral payout requests. | Superadmin. | ReferralController; routes disabled. | Partial |
| FR-ADMIN-016 | Share settings. | User plan usage status + ai_monthly_price_limit for plan management. | Superadmin. | routes plan; settings/workspace-token-limit. | Implemented & Verified |
| FR-ADMIN-017 | Supported test/connection routes inconsistent. | Zoom connection test method mismatch (test vs test-connection). | Admin. | Web.php vs ZoomSettingsController. | Not Found (gap) |
| FR-ADMIN-018 | Task stage reorder/set default. | Admin reorder task stages in Kanban; choose default stage. | Admin/Automation settings. | TaskStageController. | Implemented & Verified |
| FR-ADMIN-019 | Skip email bills. | Filter inbound emails via account-level rules. | User/Owner. | EmailAccount::filter*. | Implemented & Verified |
| FR-ADMIN-020 | Workspace invitation resend/delete. | Admin resend/delete invitations. | Owner/Admin. | WorkspaceInvitationController. | Implemented & Verified |
| FR-ADMIN-021 | Timezone & currency defaults. | Currency selector to default. | Admin. | CurrencySettingController::update. | Implemented & Verified |
| FR-ADMIN-022 | 22+ languages. | 16 enabled now. | Admin/System. | resources/lang/language.json. | Partial |
FR-INT — Integration Communications
| ID | Title | Statement | Actor | Evidence | Status |
|---|---|---|---|---|---|
| FR-INT-001 | Email delivery via mailable. | Send simple/sample test + templated mails via SMTP config. | Admin/User; System. | CommonTemplateMail, TestMail, MailConfigService. | Implemented & Verified |
| FR-INT-002 | Slack notification per event. | Send Slack for Project/Task/Budget/Invoice/... events. | System. | 9 event-based listeners. | Implemented & Verified |
| FR-INT-003 | Telegram notification per event. | Same for all critical events. | System. | 9 Telegram listeners. | Implemented & Verified |
| FR-INT-004 | WhatsApp project notification. | Send project details via WhatsApp (UltraMsg or Twilio). | System. | SendProjectWhatsAppNotification. | Implemented & Verified (driver may default). |
| FR-INT-005 | Zoom meeting scheduling. | Create/schedule/start/join meetings, attach members/project, calendar feed. | Members/Manager. | ZoomMeetingController. | Implemented & Verified |
| FR-INT-006 | AI assistant (Gemini chat). | Multi-turn chat persisted with knowledge + context. | All workspace members? User guard?. | AiAgentController. | Implemented & Verified |
| FR-INT-007 | Outgoing webhooks. | Trigger webhooks on new project/task/invoice/budget/user/project events. | System. | WebhookService + 5 listeners. | Implemented & Verified |
| FR-INT-008 | Stripe checkout JS. | Frontend uses Stripe JS to collect payment. | Stripe frontends. | stripe js in package. | Implemented & Verified variants. |
| FR-INT-009 | WordPress/landing custom CMS pages. | Public dynamic page via /page/{slug}. | Public/Admin. | CustomPageController. | Implemented & Verified |
| FR-INT-010 | Newsletter subscription. | Public subscribe endpoint. | Public. | LandingPageController::subscribe. | Implemented & Verified |
| FR-INT-011 | Contact form submission. | Public contact submission saved. | Public. | handle. | Implemented & Verified |
| FR-INT-012 | SMS/push provider | No SMS/push provider found | System | No evidence in repo | Not Found |
| FR-INT-013 | OAuth / SSO. | No OAuth (Google/Facebook) for social login; only Google calendar (Zoom option). | Public. | sync_google_calendar; no OAuth client package. | Not Found |
Total FR count: 214 (no duplicate IDs; full status and traceability matrices in Part I, Chapters 3 and 5). Immediate follow-up needed for Partial/Unverified items.