feat(frontend): productPrices feature — history + dialog (PRD-003)
- API layer: getProductPrices + addProductPrice (axiosClient)
- Hooks: useProductPrices (useQuery, staleTime 30s, enabled productId>0)
useAddProductPrice (useMutation, invalidates ['products', id, 'prices'])
- Components: ProductPriceHistory (shadcn Table + Badge Vigente, formatCivilDate, formatCurrency)
AddProductPriceDialog (shadcn Dialog + Form, Zod schema con priceValidFrom>=todayArgentina())
- Integration: ProductsPage gets "Ver precios" per row opening prices dialog
- lib/numberFormat.ts: formatCurrency() con Intl.NumberFormat ARS
- types.ts extended: ProductPrice, AddProductPriceRequest, AddProductPriceResponse
- Tests (Vitest + RTL): 19 tests — RED→GREEN confirmed
- ProductPriceHistory: loading/error/empty/data/Badge Vigente/dialog/permissions
- AddProductPriceDialog: validation (fecha pasada, precio=0, precio negativo),
happy path payload + close, server 409 inline error, vi.useFakeTimers ART
- hooks: useProductPrices caching + disabled when productId=0,
useAddProductPrice invalidateQueries + error 409
- 453 total tests, 0 rojos