@pimia/sdk 0.15.0 → 0.17.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
@@ -7652,6 +7652,7 @@ export interface components {
7652
7652
  triage_resolved_by: number | null;
7653
7653
  triage_resolved_at: string | null;
7654
7654
  triage_rejection_reason: string | null;
7655
+ /** Format: date-time */
7655
7656
  exported_at: string | null;
7656
7657
  rectified_invoice_id: number | null;
7657
7658
  customer_sequence_number: number | null;
@@ -7671,6 +7672,7 @@ export interface components {
7671
7672
  /** Format: date-time */
7672
7673
  viewed_at: string | null;
7673
7674
  contract_id: number | null;
7675
+ export_batch_id: number | null;
7674
7676
  };
7675
7677
  /** InvoiceItem */
7676
7678
  InvoiceItem: {
@@ -8202,6 +8204,15 @@ export interface components {
8202
8204
  is_active: boolean;
8203
8205
  is_time_trackable: boolean;
8204
8206
  opening_stock: number;
8207
+ /**
8208
+ * @description Lo COMPROMETIDO por documentos que aún no han movido el almacén
8209
+ * (N2 · pieza 3, cifra derivada — nadie la escribe). ⚠️ `null` NO
8210
+ * es cero: es «no se está calculando» (módulo `stock` sin
8211
+ * instalar, o el ciclo de inventario apagado). Pintar un 0 ahí
8212
+ * afirmaría «nada comprometido», que es lo que no se sabe.
8213
+ * El porqué entero, en {@see \App\Support\StockCommitments}.
8214
+ */
8215
+ committed_quantity: number | null;
8205
8216
  stock_alert_qty: number | null;
8206
8217
  allow_sale_without_stock: boolean;
8207
8218
  purchase_tax_type_id: number | null;
@@ -8245,6 +8256,13 @@ export interface components {
8245
8256
  is_active: boolean;
8246
8257
  is_time_trackable: boolean;
8247
8258
  opening_stock: number;
8259
+ /**
8260
+ * @description Igual que en el recurso completo: `null` es «no se está
8261
+ * calculando», no cero (N2 · pieza 3). La celda de stock del
8262
+ * listado del panel lo lee de aquí — el índice del catálogo va
8263
+ * por `?view=summary`.
8264
+ */
8265
+ committed_quantity: number | null;
8248
8266
  stock_alert_qty: number | null;
8249
8267
  allow_sale_without_stock: boolean;
8250
8268
  /** Format: date-time */
@@ -8270,6 +8288,15 @@ export interface components {
8270
8288
  item_name: string;
8271
8289
  warehouse_id: number;
8272
8290
  quantity: number;
8291
+ /**
8292
+ * @description Lo que el ARTÍCULO tiene comprometido — global, no de este
8293
+ * almacén (N2 · pieza 3). El nombre lleva el `item_` delante por
8294
+ * eso: en una fila que habla de una nave, «comprometido» a secas
8295
+ * se leería como «comprometido aquí», y de los dos documentos que
8296
+ * comprometen solo el albarán declara almacén. `null` = no se
8297
+ * está calculando; nunca es cero.
8298
+ */
8299
+ item_committed_quantity: number | null;
8273
8300
  };
8274
8301
  /** ItemsRequest */
8275
8302
  ItemsRequest: {
@@ -9608,6 +9635,36 @@ export interface components {
9608
9635
  description?: string | null;
9609
9636
  compound_tax?: string | null;
9610
9637
  collective_tax?: string | null;
9638
+ /**
9639
+ * @description Familia AEAT del impuesto. Decide en qué modelo entra: `IVA` en el
9640
+ * 303, `IRPF` (las retenciones) en el 111 o el 115. Un porcentaje
9641
+ * negativo NO basta para que un tipo cuente como retención: lo
9642
+ * decide esta clave. Si se omite, la columna vale `IVA`.
9643
+ * @enum {string}
9644
+ */
9645
+ tax_category?: "IVA" | "IRPF" | "IGIC" | "IPSI" | "RE" | "REAGYP" | "SS" | "OTHER";
9646
+ /**
9647
+ * @description Dónde se puede aplicar el tipo: `sale` en lo que se emite
9648
+ * (facturas, presupuestos), `purchase` en lo que se recibe
9649
+ * (facturas de proveedor, gastos), `investment` en bienes de
9650
+ * inversión, `both` en cualquiera de los dos primeros. Si se omite,
9651
+ * la columna vale `both`.
9652
+ * @enum {string}
9653
+ */
9654
+ tax_scope?: "sale" | "purchase" | "both" | "investment";
9655
+ /**
9656
+ * @description Marca este tipo como el preseleccionado de su familia y su ámbito.
9657
+ * Solo puede haberlo uno por (categoría, ámbito): al marcar este, el
9658
+ * anterior de esa pareja se desmarca. Es el que gana cuando un
9659
+ * documento declara un tramo por el porcentaje y varios tipos
9660
+ * encajan.
9661
+ */
9662
+ is_default?: boolean;
9663
+ /**
9664
+ * @description Modelo de la AEAT en el que declara este impuesto: `303` el IVA,
9665
+ * `111` o `115` las retenciones.
9666
+ */
9667
+ aeat_model?: string | null;
9611
9668
  };
9612
9669
  /** TaxTypeResource */
9613
9670
  TaxTypeResource: {
@@ -20028,6 +20085,46 @@ export interface operations {
20028
20085
  warehouse_name: string;
20029
20086
  quantity: number;
20030
20087
  }[];
20088
+ /**
20089
+ * @description Lo COMPROMETIDO y lo DISPONIBLE (N2 · pieza 3). Cifra
20090
+ * derivada: nadie la escribe, se calcula al preguntarla.
20091
+ * `null` ENTERO = no se está calculando (módulo `stock` sin
20092
+ * instalar o ciclo de inventario apagado); un cero ahí
20093
+ * afirmaría «nada comprometido», que es lo que no se sabe. El desglose viaja entero y sin paginar, como
20094
+ * `warehouse_stock`: es cabecera de pestaña, y son los
20095
+ * borradores vivos de UN artículo, que en una pyme se cuentan
20096
+ * con los dedos. Va aquí y no en un endpoint aparte porque la
20097
+ * pregunta es la misma que abre el libro — «¿por qué tengo
20098
+ * 47?» y «¿por qué solo puedo vender 35?» se responden en la
20099
+ * misma pantalla.
20100
+ */
20101
+ committed: {
20102
+ quantity: number;
20103
+ /**
20104
+ * @description ⚠️ `null` cuando el artículo NUNCA ha llevado stock
20105
+ * (`opening_stock` NULL, la distinción que la migración se
20106
+ * esforzó en preservar): de ese no hay disponible que
20107
+ * calcular, y un «−4» ahí sería una alarma inventada.
20108
+ */
20109
+ available: number | null;
20110
+ documents: ({
20111
+ /** @constant */
20112
+ document_type: "delivery_note";
20113
+ document_id: number;
20114
+ document_number: string;
20115
+ customer_name: string;
20116
+ date: string;
20117
+ quantity: number;
20118
+ } | {
20119
+ /** @constant */
20120
+ document_type: "invoice";
20121
+ document_id: number;
20122
+ document_number: string;
20123
+ customer_name: string;
20124
+ date: string;
20125
+ quantity: number;
20126
+ })[];
20127
+ } | null;
20031
20128
  };
20032
20129
  };
20033
20130
  };
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.17.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)",