105 lines
3.3 KiB
JavaScript
105 lines
3.3 KiB
JavaScript
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
|
|
};
|
|
|