Files
alla-allaos-fullstack/docs/implementation/task-e-quotation-production.md
phaichayon eae0dee1f2 task-e
2026-06-15 16:34:41 +07:00

154 lines
6.8 KiB
Markdown

# Task E: Quotation Production Module
## 1. Files Added
- `src/app/api/crm/quotations/route.ts`
- `src/app/api/crm/quotations/[id]/route.ts`
- `src/app/api/crm/quotations/[id]/items/route.ts`
- `src/app/api/crm/quotations/[id]/items/[itemId]/route.ts`
- `src/app/api/crm/quotations/[id]/customers/route.ts`
- `src/app/api/crm/quotations/[id]/topics/route.ts`
- `src/app/api/crm/quotations/[id]/followups/route.ts`
- `src/app/api/crm/quotations/[id]/attachments/route.ts`
- `src/app/api/crm/quotations/[id]/revisions/route.ts`
- `src/features/crm/quotations/api/types.ts`
- `src/features/crm/quotations/api/service.ts`
- `src/features/crm/quotations/api/queries.ts`
- `src/features/crm/quotations/api/mutations.ts`
- `src/features/crm/quotations/schemas/quotation.schema.ts`
- `src/features/crm/quotations/server/service.ts`
- `src/features/crm/quotations/components/quotation-status-badge.tsx`
- `src/features/crm/quotations/components/quotation-form-sheet.tsx`
- `src/features/crm/quotations/components/quotation-cell-action.tsx`
- `src/features/crm/quotations/components/quotation-columns.tsx`
- `src/features/crm/quotations/components/quotations-table.tsx`
- `src/features/crm/quotations/components/quotation-listing.tsx`
- `src/features/crm/quotations/components/quotation-detail.tsx`
- `drizzle/0004_worthless_ender_wiggin.sql`
- `drizzle/meta/0004_snapshot.json`
## 2. Files Modified
- `src/app/dashboard/crm/quotations/page.tsx`
- `src/app/dashboard/crm/quotations/[id]/page.tsx`
- `src/app/dashboard/crm/enquiries/[id]/page.tsx`
- `src/app/dashboard/crm/customers/[id]/page.tsx`
- `src/features/crm/enquiries/components/enquiry-detail.tsx`
- `src/features/crm/customers/components/customer-detail.tsx`
- `src/db/schema.ts`
- `src/db/seeds/foundation.seed.ts`
- `src/lib/auth/rbac.ts`
- `src/lib/searchparams.ts`
- `drizzle/meta/_journal.json`
## 3. Schema Added
- `crm_quotations`
- organization-scoped quotation master with document code, customer/contact/enquiry linkage, pricing header, status, revision metadata, and soft-delete columns
- `crm_quotation_items`
- server-calculated line items under quotation
- `crm_quotation_customers`
- related parties such as owner, consultant, contractor, and billing
- `crm_quotation_topics`
- quotation document sections such as scope, exclusions, and payment
- `crm_quotation_topic_items`
- topic bullet items stored under each section
- `crm_quotation_followups`
- post-send follow-up timeline under quotation
- `crm_quotation_attachments`
- metadata-only attachment registry for future file-storage integration
## 4. API Routes Added
- `GET /api/crm/quotations`
- `POST /api/crm/quotations`
- `GET /api/crm/quotations/[id]`
- `PATCH /api/crm/quotations/[id]`
- `DELETE /api/crm/quotations/[id]`
- `GET /api/crm/quotations/[id]/items`
- `POST /api/crm/quotations/[id]/items`
- `PATCH /api/crm/quotations/[id]/items/[itemId]`
- `DELETE /api/crm/quotations/[id]/items/[itemId]`
- `GET /api/crm/quotations/[id]/customers`
- `POST /api/crm/quotations/[id]/customers`
- `PATCH /api/crm/quotations/[id]/customers`
- `DELETE /api/crm/quotations/[id]/customers`
- `GET /api/crm/quotations/[id]/topics`
- `POST /api/crm/quotations/[id]/topics`
- `PATCH /api/crm/quotations/[id]/topics`
- `DELETE /api/crm/quotations/[id]/topics`
- `GET /api/crm/quotations/[id]/followups`
- `POST /api/crm/quotations/[id]/followups`
- `PATCH /api/crm/quotations/[id]/followups`
- `DELETE /api/crm/quotations/[id]/followups`
- `GET /api/crm/quotations/[id]/attachments`
- `POST /api/crm/quotations/[id]/attachments`
- `PATCH /api/crm/quotations/[id]/attachments`
- `DELETE /api/crm/quotations/[id]/attachments`
- `GET /api/crm/quotations/[id]/revisions`
- `POST /api/crm/quotations/[id]/revisions`
## 5. UI Routes Completed
- `/dashboard/crm/quotations`
- production list with React Query, nuqs filters, create button, edit/view/delete actions
- filters: search, status, quotation type, branch, customer, enquiry, hot project
- `/dashboard/crm/quotations/[id]`
- detail page with tabs: Overview, Items, Customers, Topics, Follow-ups, Attachments, Activity, Approval Placeholder, Document Preview Placeholder
- revision chain card with create-revision action
- `/dashboard/crm/enquiries/[id]`
- related quotations tab now shows real quotation links for the enquiry
- `/dashboard/crm/customers/[id]`
- related documents tab now shows both enquiries and quotations for the customer
## 6. Permissions Used
- `crm.quotation.read`
- `crm.quotation.create`
- `crm.quotation.update`
- `crm.quotation.delete`
- `crm.quotation.item.manage`
- `crm.quotation.customer.manage`
- `crm.quotation.topic.manage`
- `crm.quotation.followup.manage`
- `crm.quotation.attachment.manage`
- `crm.quotation.revision.create`
Admin defaults include the full quotation permission set. Regular users inherit read access only unless their membership permissions are extended.
## 7. Audit Integration
- quotation create/update/delete writes audit entries with `entityType = crm_quotation`
- item create/update/delete writes audit entries with `entityType = crm_quotation_item`
- related customer create/update/delete writes audit entries with `entityType = crm_quotation_customer`
- topic create/update/delete writes audit entries with `entityType = crm_quotation_topic`
- follow-up create/update/delete writes audit entries with `entityType = crm_quotation_followup`
- attachment metadata create/update/delete writes audit entries with `entityType = crm_quotation_attachment`
- quotation detail activity tab now surfaces all quotation-side audit mutations together
## 8. Document Sequence And Totals
- quotation create uses `generateNextDocumentCode({ documentType: 'quotation' })`
- revisions also consume the same document sequence and keep `parentQuotationId` linkage
- item totals are calculated on the server
- quotation subtotal, tax, and total are refreshed from current line items after item mutations
## 9. Enquiry And Customer Integration
- quotation create/update validates customer, contact, enquiry, branch, and salesman membership against the active organization
- selecting an enquiry in the quotation form auto-fills customer/contact/project context where available
- enquiry detail now links to real quotations instead of the old Task D placeholder
- customer detail now links to both related enquiries and related quotations
## 10. Remaining Risks
- quotation item `taxRate` is stored per line, but current aggregate total refresh still uses quotation-header tax for the final quote summary rather than a mixed per-line tax rollup
- attachment handling is metadata-only; there is still no binary upload/storage pipeline
- revision creation copies header, items, customers, and topics, but does not snapshot follow-ups or attachments
- there are still no database foreign keys between quotation tables and the linked CRM entities; organization scoping is enforced in application logic
## 11. Verification
- `npx tsc --noEmit`
- `npm run gen`