@pimia/sdk 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.d.ts CHANGED
@@ -8202,6 +8202,15 @@ export interface components {
8202
8202
  is_active: boolean;
8203
8203
  is_time_trackable: boolean;
8204
8204
  opening_stock: number;
8205
+ /**
8206
+ * @description Lo COMPROMETIDO por documentos que aún no han movido el almacén
8207
+ * (N2 · pieza 3, cifra derivada — nadie la escribe). ⚠️ `null` NO
8208
+ * es cero: es «no se está calculando» (módulo `stock` sin
8209
+ * instalar, o el ciclo de inventario apagado). Pintar un 0 ahí
8210
+ * afirmaría «nada comprometido», que es lo que no se sabe.
8211
+ * El porqué entero, en {@see \App\Support\StockCommitments}.
8212
+ */
8213
+ committed_quantity: number | null;
8205
8214
  stock_alert_qty: number | null;
8206
8215
  allow_sale_without_stock: boolean;
8207
8216
  purchase_tax_type_id: number | null;
@@ -8245,6 +8254,13 @@ export interface components {
8245
8254
  is_active: boolean;
8246
8255
  is_time_trackable: boolean;
8247
8256
  opening_stock: number;
8257
+ /**
8258
+ * @description Igual que en el recurso completo: `null` es «no se está
8259
+ * calculando», no cero (N2 · pieza 3). La celda de stock del
8260
+ * listado del panel lo lee de aquí — el índice del catálogo va
8261
+ * por `?view=summary`.
8262
+ */
8263
+ committed_quantity: number | null;
8248
8264
  stock_alert_qty: number | null;
8249
8265
  allow_sale_without_stock: boolean;
8250
8266
  /** Format: date-time */
@@ -8270,6 +8286,15 @@ export interface components {
8270
8286
  item_name: string;
8271
8287
  warehouse_id: number;
8272
8288
  quantity: number;
8289
+ /**
8290
+ * @description Lo que el ARTÍCULO tiene comprometido — global, no de este
8291
+ * almacén (N2 · pieza 3). El nombre lleva el `item_` delante por
8292
+ * eso: en una fila que habla de una nave, «comprometido» a secas
8293
+ * se leería como «comprometido aquí», y de los dos documentos que
8294
+ * comprometen solo el albarán declara almacén. `null` = no se
8295
+ * está calculando; nunca es cero.
8296
+ */
8297
+ item_committed_quantity: number | null;
8273
8298
  };
8274
8299
  /** ItemsRequest */
8275
8300
  ItemsRequest: {
@@ -20028,6 +20053,46 @@ export interface operations {
20028
20053
  warehouse_name: string;
20029
20054
  quantity: number;
20030
20055
  }[];
20056
+ /**
20057
+ * @description Lo COMPROMETIDO y lo DISPONIBLE (N2 · pieza 3). Cifra
20058
+ * derivada: nadie la escribe, se calcula al preguntarla.
20059
+ * `null` ENTERO = no se está calculando (módulo `stock` sin
20060
+ * instalar o ciclo de inventario apagado); un cero ahí
20061
+ * afirmaría «nada comprometido», que es lo que no se sabe. El desglose viaja entero y sin paginar, como
20062
+ * `warehouse_stock`: es cabecera de pestaña, y son los
20063
+ * borradores vivos de UN artículo, que en una pyme se cuentan
20064
+ * con los dedos. Va aquí y no en un endpoint aparte porque la
20065
+ * pregunta es la misma que abre el libro — «¿por qué tengo
20066
+ * 47?» y «¿por qué solo puedo vender 35?» se responden en la
20067
+ * misma pantalla.
20068
+ */
20069
+ committed: {
20070
+ quantity: number;
20071
+ /**
20072
+ * @description ⚠️ `null` cuando el artículo NUNCA ha llevado stock
20073
+ * (`opening_stock` NULL, la distinción que la migración se
20074
+ * esforzó en preservar): de ese no hay disponible que
20075
+ * calcular, y un «−4» ahí sería una alarma inventada.
20076
+ */
20077
+ available: number | null;
20078
+ documents: ({
20079
+ /** @constant */
20080
+ document_type: "delivery_note";
20081
+ document_id: number;
20082
+ document_number: string;
20083
+ customer_name: string;
20084
+ date: string;
20085
+ quantity: number;
20086
+ } | {
20087
+ /** @constant */
20088
+ document_type: "invoice";
20089
+ document_id: number;
20090
+ document_number: string;
20091
+ customer_name: string;
20092
+ date: string;
20093
+ quantity: number;
20094
+ })[];
20095
+ } | null;
20031
20096
  };
20032
20097
  };
20033
20098
  };
package/dist/client.d.ts CHANGED
@@ -960,6 +960,94 @@ export declare class PimiaClient {
960
960
  success: string;
961
961
  }>;
962
962
  };
963
+ /**
964
+ * El libro del almacén: por qué un artículo tiene el saldo que tiene. Exige
965
+ * `items:read` — leer el libro es leer el catálogo que explica— y, a
966
+ * diferencia de almacenes y recuentos, **NO va tras el módulo `stock`**: el
967
+ * libro es N1 y N1 es de todos.
968
+ *
969
+ * ## El COMPROMETIDO, en la cabecera de `forItem`
970
+ *
971
+ * `meta.committed` responde la otra mitad de la pregunta: no «cuánto tengo»
972
+ * sino **«cuánto de lo que tengo puedo vender»**. Trae la cantidad, el
973
+ * disponible (saldo − comprometido) y el DESGLOSE de los documentos que lo
974
+ * comprometen.
975
+ *
976
+ * ⛔ **Tres cosas que hay que tener delante:**
977
+ *
978
+ * 1. **Es una cifra DERIVADA**: no hay columna que escribir, no existe un
979
+ * `PUT` para reservar. Comprometen el albarán y la factura **en
980
+ * borrador**, y dejan de hacerlo solos cuando mueven el almacén (al
981
+ * entregar y al publicar). El presupuesto aceptado NO compromete: nada en
982
+ * el núcleo dice cuándo se cumplió.
983
+ * 2. ⚠️ **`committed` a `null` NO es cero.** Es «no se está calculando» — la
984
+ * empresa no tiene el módulo `stock`, o tiene el ciclo de inventario
985
+ * apagado. Pintar un 0 ahí afirma «nada comprometido», que es justo lo
986
+ * que no se sabe. Igual con `committed_quantity` en el artículo.
987
+ * 3. **Es GLOBAL por artículo, sin dimensión de almacén**: de los documentos
988
+ * que comprometen solo el albarán declara almacén.
989
+ */
990
+ get stockMovements(): {
991
+ /**
992
+ * El libro entero de la empresa, filtrable por artículo, almacén, motivo
993
+ * y fechas. Su `meta` trae además el valor informativo del almacén
994
+ * (`stock_value_cents`), que NO es valoración contable.
995
+ */
996
+ list: (query?: RequestOptions["query"], options?: ReadOptions) => Promise<{
997
+ data: components["schemas"]["StockMovementResource"][];
998
+ meta: {
999
+ stock_movement_total_count: number;
1000
+ stock_value_cents: number;
1001
+ };
1002
+ }>;
1003
+ /**
1004
+ * El libro de UN artículo, con la cabecera que lo explica: saldo
1005
+ * (`meta.opening_stock`), reparto por almacén (`meta.warehouse_stock`) y
1006
+ * comprometido (`meta.committed`).
1007
+ */
1008
+ forItem: (itemId: number | string, query?: RequestOptions["query"], options?: ReadOptions) => Promise<{
1009
+ data: components["schemas"]["StockMovementResource"][];
1010
+ meta: {
1011
+ opening_stock: number | null;
1012
+ warehouse_stock: {
1013
+ warehouse_id: number;
1014
+ warehouse_name: string;
1015
+ quantity: number;
1016
+ }[];
1017
+ committed: {
1018
+ quantity: number;
1019
+ available: number | null;
1020
+ documents: ({
1021
+ document_type: "delivery_note";
1022
+ document_id: number;
1023
+ document_number: string;
1024
+ customer_name: string;
1025
+ date: string;
1026
+ quantity: number;
1027
+ } | {
1028
+ document_type: "invoice";
1029
+ document_id: number;
1030
+ document_number: string;
1031
+ customer_name: string;
1032
+ date: string;
1033
+ quantity: number;
1034
+ })[];
1035
+ } | null;
1036
+ };
1037
+ }>;
1038
+ /**
1039
+ * El ajuste manual con motivo: la corrección que deja rastro, frente al
1040
+ * `PUT /items/{item}` que pisa el contador sin decir por qué. Cantidad
1041
+ * FIRMADA (± decimal) y `note` obligatoria; `warehouse_id` opcional.
1042
+ */
1043
+ adjust: (itemId: number | string, body: {
1044
+ quantity: number;
1045
+ note: string;
1046
+ warehouse_id?: number;
1047
+ }, options?: WriteOptions) => Promise<{
1048
+ data: components["schemas"]["StockMovementResource"];
1049
+ }>;
1050
+ };
963
1051
  get<T = unknown>(path: string, query?: RequestOptions['query'], options?: ReadOptions): Promise<T>;
964
1052
  post<T = unknown>(path: string, body?: unknown, options?: WriteOptions): Promise<T>;
965
1053
  put<T = unknown>(path: string, body?: unknown, options?: WriteOptions): Promise<T>;
package/dist/client.js CHANGED
@@ -245,6 +245,55 @@ export class PimiaClient {
245
245
  delete: (id, options) => this.delete(`/stock-counts/${id}`, options),
246
246
  };
247
247
  }
248
+ /**
249
+ * El libro del almacén: por qué un artículo tiene el saldo que tiene. Exige
250
+ * `items:read` — leer el libro es leer el catálogo que explica— y, a
251
+ * diferencia de almacenes y recuentos, **NO va tras el módulo `stock`**: el
252
+ * libro es N1 y N1 es de todos.
253
+ *
254
+ * ## El COMPROMETIDO, en la cabecera de `forItem`
255
+ *
256
+ * `meta.committed` responde la otra mitad de la pregunta: no «cuánto tengo»
257
+ * sino **«cuánto de lo que tengo puedo vender»**. Trae la cantidad, el
258
+ * disponible (saldo − comprometido) y el DESGLOSE de los documentos que lo
259
+ * comprometen.
260
+ *
261
+ * ⛔ **Tres cosas que hay que tener delante:**
262
+ *
263
+ * 1. **Es una cifra DERIVADA**: no hay columna que escribir, no existe un
264
+ * `PUT` para reservar. Comprometen el albarán y la factura **en
265
+ * borrador**, y dejan de hacerlo solos cuando mueven el almacén (al
266
+ * entregar y al publicar). El presupuesto aceptado NO compromete: nada en
267
+ * el núcleo dice cuándo se cumplió.
268
+ * 2. ⚠️ **`committed` a `null` NO es cero.** Es «no se está calculando» — la
269
+ * empresa no tiene el módulo `stock`, o tiene el ciclo de inventario
270
+ * apagado. Pintar un 0 ahí afirma «nada comprometido», que es justo lo
271
+ * que no se sabe. Igual con `committed_quantity` en el artículo.
272
+ * 3. **Es GLOBAL por artículo, sin dimensión de almacén**: de los documentos
273
+ * que comprometen solo el albarán declara almacén.
274
+ */
275
+ get stockMovements() {
276
+ return {
277
+ /**
278
+ * El libro entero de la empresa, filtrable por artículo, almacén, motivo
279
+ * y fechas. Su `meta` trae además el valor informativo del almacén
280
+ * (`stock_value_cents`), que NO es valoración contable.
281
+ */
282
+ list: (query, options) => this.get('/stock-movements', query, options),
283
+ /**
284
+ * El libro de UN artículo, con la cabecera que lo explica: saldo
285
+ * (`meta.opening_stock`), reparto por almacén (`meta.warehouse_stock`) y
286
+ * comprometido (`meta.committed`).
287
+ */
288
+ forItem: (itemId, query, options) => this.get(`/items/${itemId}/stock-movements`, query, options),
289
+ /**
290
+ * El ajuste manual con motivo: la corrección que deja rastro, frente al
291
+ * `PUT /items/{item}` que pisa el contador sin decir por qué. Cantidad
292
+ * FIRMADA (± decimal) y `note` obligatoria; `warehouse_id` opcional.
293
+ */
294
+ adjust: (itemId, body, options) => this.post(`/items/${itemId}/stock-adjustments`, body, options),
295
+ };
296
+ }
248
297
  get(path, query, options) {
249
298
  return this.request(path, { ...options, method: 'GET', query });
250
299
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pimia/sdk",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Cliente TypeScript de la API de Pimia para apps de partner: OAuth con PKCE, rotación de refresh persistida, reintentos de rate limit y tipos generados del OpenAPI.",
5
5
  "license": "MIT",
6
6
  "author": "Pimia (https://pimia.es)",