55 lines
2.9 KiB
Markdown
55 lines
2.9 KiB
Markdown
# Task D.4.6 Implementation Report - 2026-06-30
|
|
|
|
## Scope
|
|
- Fix `POST /api/crm/quotations` returning `400` during document-number generation.
|
|
- Preserve existing quotation, sequence, branch, organization, and approval rules.
|
|
- Improve frontend propagation of backend error messages.
|
|
|
|
## Root Cause
|
|
- Quotation create sends `payload.quotationType` as a master-option `id` from category `crm_quotation_type`.
|
|
- Document-sequence resolution was looking up only `crm_product_type` options.
|
|
- Because `crm_quotation_type.id` and `crm_product_type.id` are different records, valid quotation-type ids never resolved to a product-type code even though the codes and document-sequence rows already existed.
|
|
- Result: document-sequence generation failed before quotation insert with message `Missing product type code configuration for quotation type.`
|
|
|
|
## Implementation
|
|
- Added shared resolver [product-type-resolver.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-sequence/product-type-resolver.ts) to normalize and resolve:
|
|
- product-type option ids
|
|
- product-type codes
|
|
- document-sequence aliases such as `dock_door` and `solar`
|
|
- quotation-type ids/codes via reference-option translation into product-type codes
|
|
- Updated [service.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-sequence/service.ts) so quotation document-sequence generation now resolves:
|
|
- `crm_quotation_type` option -> code
|
|
- code -> matching `crm_product_type`
|
|
- product type -> document sequence / prefix
|
|
- Added internal diagnostic details to failed document-sequence audit payloads:
|
|
- requested product type
|
|
- normalized requested value
|
|
- available product-type ids/codes
|
|
- available quotation-type ids/codes
|
|
- Updated [api-client.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/lib/api-client.ts) to surface backend `message`/`error` payloads instead of always throwing generic `API error: 400 Bad Request`.
|
|
|
|
## Tests
|
|
- Added [product-type-resolver.test.ts](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/src/features/foundation/document-sequence/product-type-resolver.test.ts) covering:
|
|
- quotation-type id resolution
|
|
- direct code resolution
|
|
- alias resolution
|
|
- non-quotation fallback
|
|
- unresolved input handling
|
|
|
|
## Verification
|
|
- `npm exec tsc --noEmit`
|
|
- `node --import tsx --test src/features/foundation/document-sequence/config.test.ts src/features/foundation/document-sequence/product-type-resolver.test.ts`
|
|
- Live API verification against local app on `http://localhost:3000` on `2026-06-30` with authenticated UAT admin session:
|
|
- `crane` -> `CRA2606-002`
|
|
- `dockdoor` -> `DKA2606-001`
|
|
- `solarcell` -> `SCA2606-001`
|
|
- `service` -> `SVA2606-001`
|
|
|
|
## Regression Notes
|
|
- No schema changes
|
|
- No seed changes
|
|
- No duplicate `ms_options`
|
|
- No duplicate `document_sequences`
|
|
- Existing organization and branch scoping preserved
|
|
- Existing document prefix format preserved
|