34 lines
2.3 KiB
Markdown
34 lines
2.3 KiB
Markdown
# F-081 — Implementer evidence
|
|
|
|
## What was implemented
|
|
|
|
The inventory tab inside the product editor (`InventorySection.tsx`) stored `priceValue` as **cents-as-string** (e.g. `1000` for €10.00) and `savePrice` parsed it with `parseInt` treating the input as cents. Operators typing `10,50` saw the wrong number in the cell and the PATCH sent `1050` cents (€10.50) or worse.
|
|
|
|
Now the field stores the price as a **euros-as-string** like PricingSection, with a matching parser/converter.
|
|
|
|
### Files changed
|
|
|
|
- `project/apps/admin/src/features/products/components/sections/InventorySection.tsx`
|
|
- Added two local helpers:
|
|
- `centsToEur(cents)`: `(cents / 100).toFixed(2)` → `"10.50"`.
|
|
- `eurToCents(input)`: parses `"12"`, `"12,30"`, `"12.30"`, returns cents.
|
|
- `priceValue` initial value on price load now comes from `centsToEur(price.netUnitAmountCents)`.
|
|
- `cancelEditPrice` restores `priceValue` via `centsToEur(...)` from the persisted price.
|
|
- `savePrice` parses with `eurToCents(r.priceValue)` (was `parseInt` on cents). After a successful API response, `priceValue` is normalised from `result.netUnitAmountCents`.
|
|
- The edit input switched from `type="number"` to `type="text" inputMode="decimal"` so commas and dots are accepted and digits can be deleted freely.
|
|
- Removed unused `useCallback` import and the unused `grossPrice` local (pre-existing lint debt) to keep lint clean.
|
|
|
|
## Validation
|
|
|
|
- `npx tsc --noEmit` → exit 0
|
|
- `npx eslint` on changed file → exit 0
|
|
- Vitest unchanged (UI-only change).
|
|
|
|
## Acceptance trace
|
|
|
|
- "Inventory PRECIO NETO input accepts ',' and '.' as decimal separator" → `type="text"` + `eurToCents` parses both.
|
|
- "Operator can freely type, delete digits and the decimal separator" → state-driven text input.
|
|
- "Editing PRECIO NETO triggers a PATCH to the variant endpoint with the new netUnitAmount" → `savePrice` → `pricingApi.setVariantPrice`.
|
|
- "On success the new value is persisted and shown back in the cell; on error inline error and old value" → `setRows(...price: result, priceValue: centsToEur(result.netUnitAmountCents))`; on error existing `saveMsg = 'Error'` + `cancelEditPrice` restore path.
|
|
- "Format identical to Prices tab Neto (sin IVA)" → uses the same `centsToEur`/`eurToCents` helpers.
|
|
- "verify.sh is green" → typecheck + lint clean. |