Tabs appear below stats. All four stat cards + both task columns filter
to the selected company. Stats recompute client-side from fetched data.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tabs match projects page style, sorted alphabetically. Stats (Outstanding,
Paid, Overdue) update to reflect the selected company only.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two-column layout below stats: Awaiting Your Review (left) + In Progress (right).
Each row links to the request detail page. Project name shown as subtitle.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Line 1: invoice name + issued date / item count
Line 2: status badge + overdue flag + price
Right: Download PDF button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shows company name headers when client belongs to multiple companies.
Single-company clients see no change.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Storage policies for submissions read/insert and deliveries read were using
get_my_company_id() (single company) instead of has_company_access() — blocked
multi-company clients from uploading or viewing files.
NewRequest: delete task+submission if any file upload fails so no orphaned
records are left behind.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Route /new-project: name + company selector → creates project, redirects
to project detail. My Projects buttons now link there instead of new-request.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Was 10 MB — blocked zip files at or near that size. Supabase storage
supports up to 50 MB; mime-type restrictions were already removed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- RequestDetail: remove auto-project-delete when last task deleted
- MyCompany: support multiple companies with selector dropdown
- MyCompany: fetch members from both profiles and company_members
- ProjectDetail/MyProjectDetail/InvoiceDetail: check Supabase errors before updating state
- Migration: drop client project-delete RLS policy (no longer valid)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Store stripe_fee on invoices when webhook receives checkout.session.completed
- Display Stripe fee and net received in InvoiceDetail when paid via Stripe
- Add backfill-stripe-fees edge function to populate fee on existing paid invoices
- Migration: add stripe_fee column to invoices table
- Includes all pending portal changes (brand book, sign survey, task/project/company updates, etc.)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add + New User form on Companies page (name, email, password, company)
- Create-user Supabase edge function with role verification
- Remove public signup route and login page link
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>