Federated from workspace ·
PRD-001·Dental Clinic Revenue Operating System/docs/deployment/CUSTOMER_1_MANUAL_TEST_SETUP.mdDo not edit canonical truth here — update the source repo, then re-runnpm run docs:sync.
Customer #1 — Manual Test Setup Guide
Repository: Dental Clinic Revenue Operating System (PRD-001)
Audience: Developer / QA / product owner
Scope: Local and staging manual testing — setup, auth, cron, mail, keys
Authority: CUSTOMER_1_GO_LIVE_RUNBOOK.md · CUSTOMER_1_MANUAL_SMOKE_RESULTS.md · LOCAL_DEVELOPMENT_RUNTIME.md
Related portal pages (after npm run docs:deploy):
1. One-time local setup
cd "/path/to/Dental Clinic Revenue Operating System"
composer install
npm install
cp .env.example .env
php artisan key:generate
php artisan migrate --seed
php artisan db:seed --class=PilotProductionSeeder
php artisan zaixos:setup-local --install
php artisan zaixos:validate-env
php artisan zaixos:doctorStart the dev stack (server + queue + logs + Vite):
composer run dev
# equivalent: bin/zaixos devStart the scheduler (second terminal — replaces production cron locally):
php artisan schedule:work2. Minimum .env for local manual testing
For composer run dev (port 8000):
APP_URL=http://zaixos.com:8000
TENANCY_BASE_DOMAIN=zaixos.com
SESSION_DOMAIN=.zaixos.com
VITE_ZAIXOS_HMR_HOST=zaixos.com
# Database (sqlite or local pgsql)
DB_CONNECTION=sqlite
# Mail — Mailpit (no real SMTP)
MAIL_MAILER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=1025
MAIL_FROM_ADDRESS=noreply@zaixos.com
MAIL_FROM_NAME="ZAIXOS"
# Tenancy
TENANCY_ENABLED=true
TENANCY_PUBLIC_DEFAULT_CLINIC_FALLBACK=true
# SaaS (easier local testing)
SAAS_REQUIRE_EMAIL_VERIFICATION=false
SAAS_BILLING_PROVIDER=manual
# AI Copilot — works without API keys (stub + rule fallback)
AI_DEFAULT_PROVIDER=stub
CLINIC_COPILOT_FALLBACK_RULES=true
# Safe pilot automation flags
CLINIC_ORCHESTRATION_EXECUTE=false
CLINIC_DAILY_REPORT_SEND_EMAIL=falseRequired secrets
| Variable | Required? | How to get it |
|---|---|---|
APP_KEY | Yes | php artisan key:generate |
DB_* | Yes | Your local database |
MAIL_* | Yes (for email tests) | Mailpit defaults above |
Optional keys (live features only)
| Feature | Variables | Needed for manual GO? |
|---|---|---|
| AI Copilot (live LLM) | GROQ_API_KEY, AI_GROQ_MODE=live | No — fallback works |
| Stripe billing | STRIPE_KEY, STRIPE_SECRET, STRIPE_WEBHOOK_SECRET | No — use SAAS_BILLING_PROVIDER=manual |
| AWS S3 | AWS_* | No — FILESYSTEM_DISK=local |
| OpenAI / Anthropic | OPENAI_API_KEY, ANTHROPIC_API_KEY | No |
3. Panels and URLs
Local (composer run dev)
| Surface | URL | Purpose |
|---|---|---|
| Identity / admin login | http://account.zaixos.com:8000/admin/login | Main CRM login |
| Admin dashboard | http://account.zaixos.com:8000/admin | Command center |
| Pilot tenant public | http://pilot-dental.clinic.zaixos.com:8000/en | Public site |
| Pilot tenant admin | http://pilot-dental.clinic.zaixos.com:8000/admin | Tenant-scoped admin |
| Clinic showcase | http://clinic.zaixos.com:8000/en | Demo public site |
| Platform marketing | http://platform.zaixos.com:8000/platform/en | Platform pages |
| Health | http://account.zaixos.com:8000/up | Must return 200 |
| Mailpit UI | http://127.0.0.1:8025 | Read test emails |
| Vite HMR | http://zaixos.com:5173 | Frontend assets |
Production / staging
- Account:
https://account.YOURBASEDOMAIN.com/admin - Tenant:
https://pilot-dental.YOURBASEDOMAIN.com/en
4. Auth data — all test accounts
Default password for all seeded users: password
Customer #1 pilot clinic (primary)
| Role | Access | |
|---|---|---|
| Clinic Owner | owner@pilot.dental | Full admin |
| Receptionist | reception@pilot.dental | Leads, bookings, appointments |
| Doctor | doctor@pilot.dental | Today view, treatment plans |
Tenant slug: pilot-dental · Seeder: PilotProductionSeeder
Generic dev accounts
| Role | |
|---|---|
| Super Admin | superadmin@clinic.test |
| Clinic Owner | admin@clinic.test |
Change all passwords before production go-live.
5. Services that must be running
| Service | Local command | Why |
|---|---|---|
| Web + queue + Vite | composer run dev | Pages and async jobs |
| Scheduler | php artisan schedule:work | Cron jobs locally |
| Mailpit | Herd / local install | Catch emails at :8025 |
Verify:
bin/zaixos status
php artisan zaixos:doctor
php artisan queue:failed
php artisan schedule:list6. Scheduled jobs (cron)
Production cron:
* * * * * cd /var/www/dental-clinic-ros && php artisan schedule:run >> /dev/null 2>&1Local: php artisan schedule:work
| Schedule | Command | Manual test |
|---|---|---|
| Every minute | workflow:process-schedules | php artisan workflow:process-schedules |
| Every 5 min | realtime:cleanup-presence | php artisan realtime:cleanup-presence |
| Every 10 min | clinic-ai:run | php artisan clinic-ai:run |
| Every 10 min | growth:analyze | php artisan growth:analyze |
| Every 10 min | clinic:orchestrate --execute | php artisan clinic:orchestrate --execute |
| Every 15 min | reminders:process | php artisan reminders:process |
| Every 15 min | notifications:smart-scan | php artisan notifications:smart-scan |
| Every 15 min | revenue-leak:scan | php artisan revenue-leak:scan |
| Hourly | autopilot:run | php artisan autopilot:run |
| Daily 01:00 | revenue:aggregate-daily | php artisan revenue:aggregate-daily |
| Daily 02:00 | backup:run | php artisan backup:run |
| Daily 02:30 | saas:billing | php artisan saas:billing |
| Daily 06:00 | no-show:predict | php artisan no-show:predict |
| Daily 07:00 | clinic:daily-report --send | php artisan clinic:daily-report --send |
| Daily 08:00 | workspace:digest-notifications | php artisan workspace:digest-notifications |
7. Email testing
Local (Mailpit)
MAIL_MAILER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=1025Open http://127.0.0.1:8025 for all captured mail.
| Scenario | Trigger | Verify |
|---|---|---|
| Signup verification | /signup (if SAAS_REQUIRE_EMAIL_VERIFICATION=true) | Mailpit |
| Password reset | /admin/password-reset/request | Mailpit |
| Contact form | /en/contact submit | Lead + Mailpit |
| Appointment reminder | Appointment +24h → php artisan reminders:process | Mailpit + /admin/crm/reminder-logs |
| Invoice notification | Issue invoice → resend in Filament | Mailpit |
| Daily report | php artisan clinic:daily-report --send | Mailpit |
Quick mail smoke
curl -f http://127.0.0.1:8025
php artisan reminders:process
grep -i "reminder\|mail" storage/logs/laravel.log | tail -20Production
Real SMTP required — see CUSTOMER_1_GO_LIVE_RUNBOOK.md Section 2.
8. Pre-test commands
composer test:first-customer-pack
php artisan pilot:validate-deployment --strict
php artisan pilot:run-manual-smoke \
--verify-tests \
--report=docs/deployment/CUSTOMER_1_MANUAL_SMOKE_RESULTS.md \
--environment=localRe-publish smoke results to the portal after each run:
cd ../zaixos-engineering-platform
npm run docs:deploy9. Browser manual test map
Login: owner@pilot.dental / password at http://account.zaixos.com:8000/admin/login
| Area | Path |
|---|---|
| Dashboard | /admin |
| Leads | /admin/leads |
| Lead pipeline | /admin/lead-pipeline-page |
| Bookings | /admin/crm/bookings |
| Appointments | /admin/crm/appointments |
| Calendar | /admin/appointment-calendar-page |
| Invoices | /admin/invoices |
| Payments | /admin/payments |
| P&L | /admin/profit-loss-report |
| Outstanding | /admin/outstanding-invoices-page |
| AI Copilot | /admin/ai/clinic-agent |
| Compliance | /admin/compliance/violations |
| Website | /admin/website |
| Reminders | /admin/crm/reminder-settings |
Public (incognito): http://pilot-dental.clinic.zaixos.com:8000/en
10. Production-only checklist
APP_ENV=production
APP_DEBUG=false
DB_CONNECTION=pgsql
CACHE_STORE=redis
QUEUE_CONNECTION=redis
TENANCY_PUBLIC_DEFAULT_CLINIC_FALLBACK=false
BACKUP_ENABLED=truePlus: Nginx + SSL, Supervisor queue worker, system cron, real SMTP, changed passwords.
php artisan pilot:validate-deployment --strict && echo "CUSTOMER_1_GO"Complements CUSTOMER_1_GO_LIVE_RUNBOOK.md · v1.1.0-first-customer-pack.md