Part II · System Docs
Chapter 5 - System Limitations
This document lists implementation limitations confirmed by source inspection (not stakeholder feedback). It includes file-level evidence.
Incomplete Features (Functional Incompleteness)
ExpenseReportController::export()returns{"message":"Export functionality coming soon"}while the expense management UI calls it. OnlyExpenseManagementController::exportoutputs CSV; replacement can avoid misplaced expectations.- Referral routes fully commented out in
routes/web.phplines 521–527.ReferralControllerexists andreferral/index.tsxfrontend exists. Database seeder loads referral settings? —_settingsSeederexists. Effective status: backend present, frontend present, routes disabled → feature unreachable in production. - Slack GET settings route
SlackSettingsController::getSettingsmethod is absent (update,testWebhookexist only). Telegram has equivalentshowworking. PermissionController::assign()andmanage()(routespermissions/assign,permissions/manage) are absent.Settings\ZoomSettingsControllermethod requested by routePOST zoom/test-connectionistestConnection, but implemented method istest. The route therefore fails (BadMethodCallExceptionvia Laravel).TaskController::create()absent thoughGET tasks/createroute is declared.TaskController::editexists; UI uses modal component (TaskModal) instead.BugController::create()andedit()absent despite 2GET bugs/create,bugs/{bug}/edit. UI isBugModal.WorkspaceController::edit(),update(),checkLimits(),leaveWorkspace(),getUserWorkspaceCount()absent despite routes.ProjectController::create(),edit(),assignClient()(pluralassignClientsexists) absent.TimesheetController::create(),edit()absent.PlanOrderController::create()absent despitePOST plan-ordersroute.YooKassaPaymentController::processPayment()absent despitePOST payments/yookassaroute.- Public invoice route
POST invoices/payment/{token}/processpoints toInvoiceController::processPayment, which is commented out. - Public vCard route
POST vcards/verify-passwordcommented out.
Present but Uncertain or Inconsistent
Task::$fillabledoes not includeallow_multi_assign, although the migration exposes the column andtask_memberspivot exists. Mass-assignment silently drops input for this flag at least if passed viaTask::create.Plan::$fillablelistsai_monthly_token_limitalthough migration 2026-03-04 renames toai_monthly_price_limit. Behaviour depends on service call path. Manual audit confirms potential drift; check the SaaS plan forms handling both.ZoomMeeting::$fillablereferencessync_google_calendar, butcreate_zoom_meetingsmigration does not declare column. Either a later migration exists (not found) or fillable must drop until added.User::$fillableonly includes SaaS-economics fields whenisSaasMode()is true. Self-hosted installations will havenullablecolumns with seeds (UserSeeder createscompanyin non-SaaS without SaaS attributes).CategoryandProductfactories/key references exist despite no models/tables found → leftover boilerplate.- Spatie permission teams feature (
'teams' => false) means tenant-specific role isolation is handled manually; this extends migration metadata but is not enforced through Spatie. workspacesgivenis_suspendedbut muted toggling route is external (likely admin only). Routing path not verified via routes. (Needs confirmation.)- Expense report CSV export (
ExpenseReportController::export) still placeholder, Management export exists. - Currency/Language mismatch: README claims 22 languages; 16 are enabled.
OPENAI_API_KEYdefaults to gpt-3.5-turbo, whereas inline email/agent services use Gemini exclusively. Usage of key only in demo ChatGptController. Incongruence relative to README.- Field/label typo likely:
sync_google_calendarversus migration naming. $fillablementionsprincipleforZoomMeetingtied to no key — possible no impact.- Consecutive
is_paidduplicate inPaymentSettingControllerresult set is harmless. - Email delivery requires OAuth to Google calendar but none found (Zoom only stores a settings row).
base URL.IS_DEMObypass purge through "demo-mode middleware" acts contrary to toggles; coupled restrictions.- Observer
usersuses "normal role guess" structure via RoleSeeder andcompanyas a string; standard userrolefield for first login. - Auditor log query in
app/Policies/BugPolicyandapp/Tasksrecommendations potentially too strict. - (Strikethrough/leftover.) Task
Communicationslikely suitable "TaskChat" but only one channel viamanager_approved.
Partially Verified
- Plan limits only enforce Basic rules in SaaS; non-SaaS all checks bypass with true (therefore no enforcement).
AiAgentService::chat()uses rate limit 30 per user,token limitenforcement. Not exercised (no tests).WorkspaceObserver::createddefines task stages and bug statuses, but their exact default name set wasn't read.- HTML form approval mismatch for logged Slack/Telegram is echoed only.
PerformAIExternal.Settings/LanguageControllermanages languages but translation auto-generated relies on duplicatecommonposts.tasks due tomorrowreminder command exists (tasks:check-due) but its message code omitted; noNotificationclass was found.- Scheduled monthly report runs monthly at 06:00: text fields only.
- Webhook serialization text (field
_module,'Workspace Invitations'etc.) needs formatted value and events follow ability. PaymentSettingsControllerandsettingsIndexnot defined inPaymentSettingController(core stripe setting routes might be problematic — CAUTION):InvoicePaymentControllerredirected 33getEnabledPaymentGatewaysvia different controller counts. Does not includemanuals[bank + manually];modelexcludes 1 x authorize.- Some gateway strings:
ezpand another all able to method exceptions: - 6 safe positive gateways mostly integrate through Dependency.
- FEDAPAY variable filter scans complex persistence, manufacturer/client error risk.
ExpenseReportController::exportmentioned.ImpersonateControllermay have extra stuff forgetServices.- User permanent delete [guard action dependent].
Not found / "Release Notes"
- No
tests/directory at app level and no test suite. - No
api.phproute; no versioned API available; external clients cannot integrate unless further code forging. - No SSO/OAuth, no SMS/push providers.
- No backup scripts.
- No
.env.example(setup expects it andcreate-projectscript copies it → deployment error). - no
composer create-projectcall forconfigdatabase;default mmmessages. - no
public/buildcommitted. - Health endpoint
/uptiny. - No ingress config/edge provided.
Operational Risks
- Scheduled tasks and queue workers are assumed/provisioned by user.
- Runtime storage dirs must be full.
- README runbook unknown.
- Email config contains plaintext fallback values (gap).
config/openai.phpcould be misleading.- Remaining migrations' metadata needs fresh duplication / merge tooling.>