import { http } from './http.js'; /** * Sales quotes (manifest type = quote). * Summary = { id, number, type: 'quote', entityId, date } * Line = { id, articleId, sku, amount, net, rebate, tax, comment } — no transactedAmount * LineInput = { sku, amount, net, tax, rebate?, comment? } */ export const quote = { /** * GET /api/quote?offset=0&limit=50&search=...&seekMonths=-1 * @param {{ offset?: number, limit?: number, search?: string, seekMonths?: number }} [params] * → { quotes: QuoteSummary[], total: number, unfilteredTotal: number, offset: number, limit: number } */ // #region GET /api/quote — list list({ offset = 0, limit = 50, search, seekMonths, entityId } = {}) { const params = new URLSearchParams(); if (offset != null) params.set('offset', String(Math.max(0, Math.floor(Number(offset) || 0)))); if (limit != null) params.set('limit', String(Math.max(1, Math.floor(Number(limit) || 50)))); if (search && String(search).trim()) params.set('search', String(search).trim()); if (entityId != null) params.set('entityId', String(entityId)); if (seekMonths != null && Number(seekMonths) < 0) { params.set('seekMonths', String(Math.floor(Number(seekMonths)))); } const qs = params.toString(); return http(`/api/quote${qs ? `?${qs}` : ''}`); }, // #endregion /** GET /api/quote/:id → { quote: Quote } */ // #region GET /api/quote/:id — get get(id) { return http(`/api/quote/${id}`); }, // #endregion /** * POST /api/quote * Body: { number, date, entityId?, lines } * → 201 { quote: Quote } */ // #region POST /api/quote — create create(body) { return http('/api/quote', { method: 'POST', body }); }, // #endregion /** * PATCH /api/quote/:id * Body: partial { number?, date?, entityId?, lines? } * → 200 { quote: Quote } */ // #region PATCH /api/quote/:id — update update(id, body) { return http(`/api/quote/${id}`, { method: 'PATCH', body }); }, // #endregion /** DELETE /api/quote/:id → 204 */ // #region DELETE /api/quote/:id — delete delete(id) { return http(`/api/quote/${id}`, { method: 'DELETE' }); }, // #endregion /** * POST /api/quote/:id/pdf * Generates and attaches quote PDF. * @param {number|string} id Quote ID * → 201 { attachment: object, fileUrl: string } */ // #region POST /api/quote/:id/pdf — createPdf createPdf(id) { return http(`/api/quote/${id}/pdf`, { method: 'POST' }); }, // #endregion /** * DELETE /api/quote/:id/file/:fileId * Deletes quote attachment file. * @param {number|string} id Quote ID * @param {number|string} fileId File ID * → 204 void */ // #region DELETE /api/quote/:id/file/:fileId — deleteFile deleteFile(id, fileId) { return http(`/api/quote/${id}/file/${fileId}`, { method: 'DELETE' }); }, // #endregion /** * POST /api/quote/:id/order * Converts quote into sales order. * @param {number|string} id Quote ID * @param {object} [body] Optional overrides: { number, date, entityId, externalNumber, lines } * → 201 { order: Order } */ // #region POST /api/quote/:id/order — createOrder createOrder(id, body = {}) { return http(`/api/quote/${id}/order`, { method: 'POST', body }); }, // #endregion };