Task: Update the import so it UPSERTs rows into Supabase after parsing. Tables & keys • customer (unique: email if present else phone) → columns: first_name, last_name, email, phone • vehicle (unique: registration) → columns: registration, make, model • agreement (unique: agreement_number) → columns: agreement_number, customer_id, vehicle_id, start_date (nullable), term_months (nullable), monthly_payment, payments_left (nullable), settlement, balloon (nullable) • equity_snapshot (unique per run: agreement_id + snapshot_date) → columns: agreement_id, snapshot_date (today), settlement, balloon (nullable) Upsert rules (psycopg): • Insert or update on conflict of each table’s natural key: • customer ON CONFLICT (email) DO UPDATE SET phone=EXCLUDED.phone, first_name=EXCLUDED.first_name, last_name=EXCLUDED.last_name (if email missing, use phone as key). • vehicle ON CONFLICT (registration) DO UPDATE SET make=EXCLUDED.make, model=EXCLUDED.model. • agreement ON CONFLICT (agreement_number) DO UPDATE SET customer_id=EXCLUDED.customer_id, vehicle_id=EXCLUDED.vehicle_id, monthly_payment=EXCLUDED.monthly_payment, settlement=EXCLUDED.settlement, term_months=COALESCE(EXCLUDED.term_months, agreement.term_months), start_date=COALESCE(EXCLUDED.start_date, agreement.start_date), payments_left=COALESCE(EXCLUDED.payments_left, agreement.payments_left). • equity_snapshot ON CONFLICT (agreement_id, snapshot_date) DO UPDATE SET settlement=EXCLUDED.settlement, balloon=EXCLUDED.balloon. Field mapping from CSV • customer_first_name → customer.first_name • customer_last_name → customer.last_name • email → customer.email • phone → customer.phone • registration → vehicle.registration • make → vehicle.make • model → vehicle.model • agreement_number → agreement.agreement_number • monthly_payment → agreement.monthly_payment • settlement → agreement.settlement • balloon → agreement.balloon (nullable) • (if present) start_date, term_months, payments_left map to agreement.* After upserts, write an equity_snapshot row for each agreement in the file with snapshot_date = current_date. Keep the existing idempotency hash + import_log entries. On re-runs, import_log.status='skipped' is fine, but when file is new, we should see rows inserted/updated in the four core tables.