# Task D.4.6: Fix Quotation Document Sequence Product-Type Resolution

## Objective

Fix quotation creation failure caused by incorrect quotation-type to product-type resolution during document number generation.

This task must correct the runtime mapping logic inside the document sequence service without introducing duplicate master data or changing existing business rules.

---

## Background

Creating a quotation currently fails with:

```json
{
  "message": "Missing product type code configuration quotation type."
}
```

The failure occurs after quotation validation succeeds and immediately before document number allocation.

Investigation confirmed this is **not** caused by missing seed data.

---

## Current Findings

Verified:

- Quotation payload validation succeeds.
- `createQuotation()` reaches document code generation.
- `generateNextDocumentCode()` throws before allocating a sequence.
- Database already contains:

### Master Options

Category:

```
crm_quotation_type
```

Values:

- crane
- dockdoor
- solarcell
- service
- other

Category:

```
crm_product_type
```

Values:

- crane
- dockdoor
- solarcell
- service
- sparepart

### Document Sequences

Quotation sequences already exist for:

- crane
- dockdoor
- solarcell
- service

Therefore the failure is **not** caused by missing:

- master option
- document sequence
- seed data

---

## Root Cause

The document sequence service is failing to consistently resolve:

Quotation Type

↓

Product Type

↓

Document Sequence

The runtime mapping rejects a valid quotation type before sequence generation.

This is a logic bug.

---

## Scope

Review:

```
src/features/crm/quotations/server/service.ts
```

```
src/features/foundation/document-sequence/service.ts
```

```
src/features/foundation/master-options/*
```

```
src/db/seeds/*
```

Do **not** redesign the quotation module.

Do **not** modify document numbering rules.

---

## Requirements

### 1. Trace Runtime Resolution

Document the complete resolution path.

Expected flow:

```
Quotation

↓

quotationTypeId

↓

Master Option

↓

productTypeCode

↓

Document Sequence

↓

Document Number
```

Verify every transformation.

---

### 2. Normalize Product Type Resolution

Support all valid inputs.

The resolver should accept:

- option id
- option code
- normalized product type code

It must not depend on display labels.

---

### 3. Standardize Mapping

Support at minimum:

| Quotation Type | Product Type | Prefix |
|----------------|-------------|--------|
| crane | crane | CR |
| dockdoor | dockdoor | DK |
| solarcell | solarcell | SC |
| service | service | SV |
| sparepart | sparepart | SP |

Future product types should require configuration only, not new code branches.

---

### 4. Remove Duplicate Lookup Logic

If quotation service and document sequence service both perform mapping independently:

Refactor into a shared resolver.

Avoid duplicated switch statements.

---

### 5. Improve Error Messages

Replace generic runtime errors with diagnostic information.

Example:

```
Unable to resolve product type for quotation.

quotationTypeId:
xxxxxxxx

quotationTypeCode:
crane

organizationId:
...

branchId:
...

resolvedProductType:
null
```

This should only be returned internally/logged during development.

User-facing messages should remain business friendly.

---

### 6. Preserve Existing Business Rules

Do not modify:

- organization isolation
- branch isolation
- document numbering format
- document sequence locking
- approval workflow
- quotation schema

---

### 7. Frontend Error Handling

Improve API error handling.

Current UI displays:

```
API Error 400 Bad Request
```

Instead display backend messages when available.

Example:

```
Missing product type code configuration quotation type.
```

Fallback to generic messages only when backend provides none.

---

## Validation

Verify quotation creation succeeds for:

- Crane
- Dock Door
- Solar Cell
- Service

Each must generate the correct sequence.

Example:

```
CRA2606-001
```

```
DKA2606-001
```

```
SCA2606-001
```

```
SVA2606-001
```

Verify the sequence increments correctly.

---

## Regression Checklist

Confirm no regression for:

- Document sequence generation
- Branch-specific numbering
- Organization-specific numbering
- Product-specific numbering
- Existing document types
- Existing sequence rows
- Existing seeds

---

## Technical Constraints

- No database schema changes unless absolutely required.
- No duplicate `ms_options`.
- No duplicate `document_sequences`.
- Keep seed scripts idempotent.
- Preserve current APIs.

---

## Deliverables

- Fixed runtime product-type resolution.
- Shared resolver (if duplication exists).
- Improved backend diagnostics.
- Improved frontend API error display.
- Updated unit/integration tests where applicable.
- Verification report summarizing:
  - root cause
  - implementation
  - validation results
  - regression results

---

## Acceptance Criteria

- Quotation creation succeeds without 400 errors for all configured product types.
- Document numbers are generated correctly.
- Existing numbering rules remain unchanged.
- No additional seed data is required.
- TypeScript passes.

```bash
npm exec tsc --noEmit
```

- Existing test suite passes.
- No regression in document sequence generation.

---

## Implementation Status - 2026-06-30

- Status: Completed
- Implementation report:
  - [task-d.4.6-quotation-document-sequence-fix-2026-06-30.md](/C:/Users/mtpphtaps/Documents/gitea/alla-allaos-fullstack/docs/implementation/task-d.4.6-quotation-document-sequence-fix-2026-06-30.md)

### Result Summary
- Fixed quotation-type to product-type resolution in document sequence generation.
- Added a shared resolver for option id/code/alias handling plus quotation-type reference mapping.
- Preserved current numbering rules and existing sequence rows.
- Improved API client error handling so backend messages can be shown in the UI.

### Validation Summary
- `npm exec tsc --noEmit` passed.
- `node --import tsx --test src/features/foundation/document-sequence/config.test.ts src/features/foundation/document-sequence/product-type-resolver.test.ts` passed.
- Authenticated API verification on `http://localhost:3000` passed for:
  - `crane` -> `CRA2606-002`
  - `dockdoor` -> `DKA2606-001`
  - `solarcell` -> `SCA2606-001`
  - `service` -> `SVA2606-001`
