Company Admin UI Audit — Production

📄 General
← Back to Documentation
# Company Admin UI Audit — Production **Date:** 2026-08-27 **Scope:** authenticated, non-Filament company-admin panel at `https://zapazime.bg/company-admin`, inspected read-only as `Hotel Manager`. ## Result The panel has a rich, well-grouped navigation and several usable receptionist screens. It is **not ready for broad production use** while three visible operational screens return 500 errors and Laravel's full debug page is publicly shown to authenticated users. ## Screens verified in the rendered UI ### Rendering successfully - Main dashboard - Booking dashboard, calendar, list and create-booking form - Pre-check-in (empty state) - Stays list and create-stay form - Front-desk dashboard, night audits and room blocks - Payments, invoices, B2B invoices, fiscal receipts and settlements - Rates, rooms/venue objects and venue-object dashboard - Maintenance, inspections, guests and guest messaging - Reporting dashboard, statistics, users, roles and staff-shift management - Settings, including ESTI, tax, check-in/out and early/late policies ### Currently broken in production | Priority | Screen | Rendered failure | Likely fix location | |---|---|---|---| | P0 | Housekeeping dashboard | `Route [company-admin.housekeeping.widgets.update] not defined` | Add/correct the named route and update the widget form/action. | | P0 | Housekeeping tasks | `HousekeepingScheduleOptimizer::getScheduleStatistics()` receives `null` instead of an `int $venueId` | `HousekeepingController@tasks` must choose/validate a venue before calling the optimizer, or the optimizer must support a company-wide view. | | P0 | Staff attendance manager | `Collection::addEagerConstraints does not exist` while loading `activeEmployees` | Correct the `activeEmployees` relation/query in `EmployeeAttendanceController@showManagerView` or its model relation. | | P0 | Front-desk operations | View `company-admin.front-desk.operations` not found | Add the view or change `FrontDeskController@operations` to the actual intended view name. | | P0 | Invalid checkout-folio-review request | 500/debug page rather than a deliberate 404/authorization response | Ensure missing/unauthorized stays use `findOrFail`/authorization and a friendly error response. | ## Security and production configuration Every tested 500 response rendered the Laravel exception page with stack trace, source location, SQL/query diagnostics and request/session diagnostics. This is a critical production exposure. Required remediation: 1. Set `APP_DEBUG=false` in production and clear/rebuild configuration cache. 2. Configure a generic production 500 page and error logging/monitoring. 3. Add a smoke test asserting no company-admin route renders debug output. 4. Treat the broken-page fixes above as a release blocker before re-enabling the affected menu entries. ## Reception UI gaps discovered from the rendered navigation ### Missing or poorly surfaced daily desk controls - The front-desk dashboard exists and includes Night Audit, Blocked Rooms, Operations and New Booking, but **there is no direct sidebar entry for it**. The sidebar's Reception section exposes only Stays, Night Audits and Room Blocks. - The Reception section does not expose an **arrivals queue**, **departures queue**, **in-house guest list**, **room-ready/dirty/out-of-order board**, **unsettled-balance exceptions**, or **cashier-shift state**. - Room assignment, room changes, stay modification and checkout-folio review are deep routes rather than clear front-desk actions. A receptionist should reach them from the stay/arrival/departure workboard. - There is no UI entry for keys/key cards, wake-up calls, guest requests, parcels, no-shows, walk-ins or group arrivals. - Housekeeping has excellent menu coverage, but two central screens are currently unusable due to 500 errors. ### Discoverability and language consistency - The visible navigation is comprehensive and sensibly grouped, but it is very long. The existing menu search helps; a compact "Today at reception" entry should be promoted near the top. - Bulgarian UI is mixed with English/internal keys: for example `Dashboard`, `Night Audits`, `Pre-Check-In Management`, `No Bookings Available`, `manage_dashboard_widgets`, `Printed`, and `No fiscal receipts found`. The active locale needs a translation-completeness pass. - Several empty states are clear (maintenance, inspections, shifts). Reporting instead shows zero metrics and placeholder chart copy; make the distinction between “no data” and “data loading/failed” explicit. - The settings screen correctly exposes hotel-relevant configuration (tax, ESTI, check-in/out times, early/late rules), but the current business type is displayed as “Not set.” A hotel onboarding/readiness banner should flag this. ## Recommended next sequence 1. **Emergency production hardening:** disable debug output and add a generic error page. 2. **Fix the four confirmed 500 screens** and add route smoke tests for them. 3. **Add a Reception workboard** reachable from the top of the sidebar, with arrivals, departures, in-house, room status, balance and exception queues. 4. **Promote deep workflows into context:** room assignment/change, folio review, check-in and checkout from each queue item. 5. **Complete localization** for the company-admin English/Bulgarian experience. 6. **Then implement the operational gaps** already prioritized in `PHPSTORM_AGENT_RECEPTION_REMEDIATION_PROMPTS.md`: keys, cashier shifts, no-shows/walk-ins/groups, wake-up/guest-service work and OTA operations. ## UI acceptance tests to add - Authenticated company manager can open each sidebar URL without a 5xx response. - No response includes Laravel debug/exception output in production. - Reception workboard has visible counts and links for arrivals, departures, in-house guests, dirty/blocked rooms and outstanding balances. - Empty states show an actionable next step, not only zero values/placeholders. - Locale smoke test asserts no untranslated key-like labels are rendered.