# Recent Quotes Status Derivation (v2)

## The Bug

In the Recent Quotes panel (`src/pages/QuoteGenerator.tsx`), the status badge was showing "Draft" even when ALL services had been decided (approved or declined) by shop staff in the QuoteGenerator.

## Root Cause

The quote's `status` field in PocketBase is only a **lifecycle** field:
- `'draft'` — set on Save (QuoteSummary.tsx:123)
- `'sent'` — set on Share (QuoteSummary.tsx:246)
- `'approved'` / `'declined'` — set by the customer via QuoteApprove.tsx:221-225

When shop staff approve/decline individual services in the QuoteGenerator, the `customerDecision` values are saved inside the services JSON blob, but the quote-level `status` field is NOT updated. It stays `'draft'`.

## The Fix

In `loadRecentQuotes()` (QuoteGenerator.tsx:196), derive the display status from individual service decisions when ALL services have been decided:

```typescript
const hasPending = servicesList.some((s: any) => !s.customerDecision || s.customerDecision === 'pending');
let derivedStatus: QuoteRecord['status'] = record.status;
if (!hasPending && servicesList.length > 0) {
  const allApproved = servicesList.every((s: any) => s.customerDecision === 'approved');
  const allDeclined = servicesList.every((s: any) => s.customerDecision === 'declined');
  if (allApproved) derivedStatus = 'approved';
  else if (allDeclined) derivedStatus = 'declined';
}
// Use derivedStatus in the returned object's `status` field
```

This overrides status to:
- `'approved'` — when ALL services have `customerDecision === 'approved'`
- `'declined'` — when ALL services have `customerDecision === 'declined'`
- Keeps original PocketBase status — when some services are still pending, or when decisions are mixed (some approved, some declined)

Because the mapped object's `status` field feeds both the `RecentStatusBadge` component and the filter/count logic (`recentCounts`, `matchesRecentStatusFilter`), this single change fixes the badge, the filter tabs, and the filter counts.

## Also Fixed

The `hasPending` check was previously `servicesList.some(s => s.customerDecision === 'pending')`. A service with no `customerDecision` field at all would NOT be counted as pending. Changed to `servicesList.some(s => !s.customerDecision || s.customerDecision === 'pending')` to handle services that don't have the field yet (edge case with legacy data).
