# Task D.2 Billing Customer + Project Parties ## Scope delivered - Kept the main CRM field named `Billing Customer` on enquiry and quotation forms/detail pages. - Added a separate `Project Parties` model for enquiries and aligned quotation related customers to the same business concept. - Added `remark` support on quotation project parties and introduced enquiry project-party persistence. - Switched role sourcing to the shared master-option category `crm_project_party_role`. - Added compatibility mapping so legacy quotation roles such as `owner` and `billing` still render correctly. ## Data model - Added `crm_enquiry_customers` for enquiry project parties. - Added `remark` column to `crm_quotation_customers`. - Generated migration `drizzle/0010_calm_wendell_rand.sql`. ## Server behavior - Enquiry create/update now sync `Project Parties` transactionally. - Quotation create/update now sync `Project Parties` transactionally. - Billing customer is auto-added as a `billing_customer` project party during sync. - Duplicate `customerId + roleCode` combinations are de-duplicated during main form sync and rejected in quotation detail CRUD. - Quotation project-party reads normalize legacy role codes to current shared role options. ## UI changes - Enquiry form now has `Billing Customer` plus a `Project Parties` editor. - Enquiry detail now shows `Billing Customer` and `Project Parties` separately. - Quotation form now has `Billing Customer` plus a `Project Parties` editor. - Quotation detail overview separates `Billing Customer` and `Project Parties`. - Quotation customer tab is relabeled to `Project Parties`, shows role clearly, and supports remark editing. ## Verification - `npx tsc --noEmit` passes. - `npm run lint` still fails because of pre-existing repo issues outside this task, including: - `src/components/ui/input-group.tsx` - `src/features/chat/components/message-composer.tsx` - `src/components/forms/demo-form.tsx`