# 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.