@pimia/sdk 0.14.0 → 0.15.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
@@ -3774,6 +3774,13 @@ export interface paths {
3774
3774
  * líneas con `item_id`, y un artículo con `opening_stock` NULL («nunca ha
3775
3775
  * llevado stock») no se estrena por una compra — se estrena en su ficha o
3776
3776
  * con un ajuste, que son los gestos que significan «declaro existencias».
3777
+ *
3778
+ * ⚠️ **El almacén se puede declarar AQUÍ** (`warehouse_id`, opcional, N2) y
3779
+ * no solo en la factura: dónde se guarda la mercancía se sabe al recibirla
3780
+ * —descargando el camión—, no al teclear la factura que el OCR acaba de
3781
+ * crear. Lo que llegue aquí manda sobre lo que declarara el documento, y
3782
+ * se GUARDA en él: si el documento dijera una cosa y el almacén moviera
3783
+ * otra, la ficha estaría mintiendo sobre lo que hizo.
3777
3784
  */
3778
3785
  post: operations["receivedInvoices.markGoodsReceived"];
3779
3786
  delete?: never;
@@ -4614,6 +4621,113 @@ export interface paths {
4614
4621
  patch?: never;
4615
4622
  trace?: never;
4616
4623
  };
4624
+ "/stock-counts/{id}/confirm": {
4625
+ parameters: {
4626
+ query?: never;
4627
+ header?: never;
4628
+ path?: never;
4629
+ cookie?: never;
4630
+ };
4631
+ get?: never;
4632
+ put?: never;
4633
+ /**
4634
+ * Confirma el recuento: emite los ajustes en bloque contra el libro
4635
+ * @description Una línea por artículo contado y con diferencia, con motivo `count` y el
4636
+ * recuento como documento de origen. Lo que NO emite nada:
4637
+ *
4638
+ * - las líneas **sin contar** (`counted_quantity` NULL) — nadie miró esa
4639
+ * estantería, y suponer que está vacía sería inventarse un dato;
4640
+ * - las que **cuadran** con el saldo del momento — el libro anota lo que
4641
+ * le pasó al contador, no lo que un documento quiso hacerle.
4642
+ *
4643
+ * Todo va en UNA transacción: un recuento a medias dejaría el almacén en
4644
+ * un estado que ni la realidad ni el sistema han tenido nunca.
4645
+ */
4646
+ post: operations["stockCounts.confirm"];
4647
+ delete?: never;
4648
+ options?: never;
4649
+ head?: never;
4650
+ patch?: never;
4651
+ trace?: never;
4652
+ };
4653
+ "/stock-counts/{id}/cancel": {
4654
+ parameters: {
4655
+ query?: never;
4656
+ header?: never;
4657
+ path?: never;
4658
+ cookie?: never;
4659
+ };
4660
+ get?: never;
4661
+ put?: never;
4662
+ /**
4663
+ * Cancela un borrador: no emite nada y deja constancia de que se abrió y
4664
+ * no se cerró. Un recuento confirmado no se cancela — ya movió el almacén
4665
+ */
4666
+ post: operations["stockCounts.cancel"];
4667
+ delete?: never;
4668
+ options?: never;
4669
+ head?: never;
4670
+ patch?: never;
4671
+ trace?: never;
4672
+ };
4673
+ "/stock-counts": {
4674
+ parameters: {
4675
+ query?: never;
4676
+ header?: never;
4677
+ path?: never;
4678
+ cookie?: never;
4679
+ };
4680
+ /** Los recuentos de la empresa, del más nuevo al más viejo */
4681
+ get: operations["stock-counts.index"];
4682
+ put?: never;
4683
+ /**
4684
+ * Abre un recuento
4685
+ * @description Nace **sembrado** con lo que el almacén dice tener ahora (`seed`, por
4686
+ * defecto sí): contar es corregir una lista, no escribirla de cero. Se
4687
+ * siembran los artículos con saldo distinto de cero — una lista con las
4688
+ * doscientas referencias que el almacén NO tiene es una lista que nadie
4689
+ * lee. Lo que aparezca de más se añade contando (`PUT` con su `item_id`).
4690
+ */
4691
+ post: operations["stock-counts.store"];
4692
+ delete?: never;
4693
+ options?: never;
4694
+ head?: never;
4695
+ patch?: never;
4696
+ trace?: never;
4697
+ };
4698
+ "/stock-counts/{stock_count}": {
4699
+ parameters: {
4700
+ query?: never;
4701
+ header?: never;
4702
+ path?: never;
4703
+ cookie?: never;
4704
+ };
4705
+ get: operations["stock-counts.show"];
4706
+ /**
4707
+ * Cuenta: escribe lo contado de cada línea
4708
+ * @description Las líneas se UPSERTAN por artículo y no se borran y recrean, que es lo
4709
+ * que hacen los documentos de venta: aquí `expected_quantity` es la foto
4710
+ * de lo que el sistema creía cuando se dibujó la línea, y recrearla la
4711
+ * refrescaría en silencio — perdiendo justo el dato que permite avisar de
4712
+ * que algo se movió mientras se contaba. Un artículo que no venga en la
4713
+ * petición se queda como estaba.
4714
+ *
4715
+ * Un recuento confirmado o cancelado no se edita: **422**.
4716
+ */
4717
+ put: operations["stock-counts.update"];
4718
+ post?: never;
4719
+ /**
4720
+ * Borra un recuento que no ha movido nada
4721
+ * @description Un confirmado no se borra: sus asientos explican saldos de hoy, y
4722
+ * borrarlo dejaría el libro nombrando un documento que no existe. Para el
4723
+ * que se abrió y no se cerró está `cancel`.
4724
+ */
4725
+ delete: operations["stock-counts.destroy"];
4726
+ options?: never;
4727
+ head?: never;
4728
+ patch?: never;
4729
+ trace?: never;
4730
+ };
4617
4731
  "/stock-movements": {
4618
4732
  parameters: {
4619
4733
  query?: never;
@@ -8967,7 +9081,7 @@ export interface components {
8967
9081
  * ningún permiso es una operación legítima, y `required` la
8968
9082
  * prohibiría (un array vacío no pasa `required`).
8969
9083
  */
8970
- abilities: ("dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment" | "view-contract" | "create-contract" | "edit-contract" | "delete-contract" | "view-warehouse" | "create-warehouse" | "edit-warehouse" | "delete-warehouse")[];
9084
+ abilities: ("dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment" | "view-contract" | "create-contract" | "edit-contract" | "delete-contract" | "view-warehouse" | "create-warehouse" | "edit-warehouse" | "delete-warehouse" | "view-stock-count" | "create-stock-count" | "edit-stock-count" | "delete-stock-count")[];
8971
9085
  };
8972
9086
  /**
8973
9087
  * RoleRequest
@@ -8992,7 +9106,7 @@ export interface components {
8992
9106
  name: string;
8993
9107
  abilities?: {
8994
9108
  /** @enum {string} */
8995
- ability: "dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment" | "view-contract" | "create-contract" | "edit-contract" | "delete-contract" | "view-warehouse" | "create-warehouse" | "edit-warehouse" | "delete-warehouse";
9109
+ ability: "dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment" | "view-contract" | "create-contract" | "edit-contract" | "delete-contract" | "view-warehouse" | "create-warehouse" | "edit-warehouse" | "delete-warehouse" | "view-stock-count" | "create-stock-count" | "edit-stock-count" | "delete-stock-count";
8996
9110
  }[] | null;
8997
9111
  };
8998
9112
  /** RoleResource */
@@ -9093,6 +9207,78 @@ export interface components {
9093
9207
  */
9094
9208
  warehouse_id?: number | null;
9095
9209
  };
9210
+ /** StockCountLineResource */
9211
+ StockCountLineResource: {
9212
+ id: number;
9213
+ item_id: number;
9214
+ item_name: string;
9215
+ /** @description Lo que el sistema creía CUANDO SE DIBUJÓ la línea. */
9216
+ expected_quantity: number;
9217
+ /**
9218
+ * @description Lo contado. NULL = todavía no se ha contado, que NO es contar
9219
+ * cero: una estantería vacía es un dato y una que nadie ha mirado
9220
+ * no lo es. Las que llegan aquí en NULL no emiten nada al
9221
+ * confirmar.
9222
+ */
9223
+ counted_quantity: number | null;
9224
+ /**
9225
+ * @description La diferencia que se ENSEÑA mientras se cuenta. ⚠️ No es la que
9226
+ * se aplica al confirmar: esa se calcula contra el saldo de ese
9227
+ * momento, porque contar dice «aquí hay 12», no «quítale 3».
9228
+ */
9229
+ difference: number | null;
9230
+ /**
9231
+ * @description El asiento que esta línea emitió al confirmar, si emitió alguno
9232
+ * (una línea que cuadra no escribe nada en el libro).
9233
+ */
9234
+ stock_movement_id: number | null;
9235
+ };
9236
+ /** StockCountRequest */
9237
+ StockCountRequest: {
9238
+ /** Format: date-time */
9239
+ count_date: string;
9240
+ notes?: string | null;
9241
+ warehouse_id?: number | null;
9242
+ /**
9243
+ * @description Sembrar el recuento con lo que el almacén tiene ahora. Solo se
9244
+ * mira en el alta.
9245
+ */
9246
+ seed?: boolean | null;
9247
+ lines?: {
9248
+ item_id: number;
9249
+ counted_quantity: number | null;
9250
+ }[] | null;
9251
+ };
9252
+ /** StockCountResource */
9253
+ StockCountResource: {
9254
+ id: number;
9255
+ count_number: string;
9256
+ sequence_number: number;
9257
+ /**
9258
+ * @description DRAFT | CONFIRMED | CANCELLED. Un confirmado es historia: ya
9259
+ * emitió sus asientos, y no se edita ni se borra.
9260
+ */
9261
+ status: string;
9262
+ /** Format: date-time */
9263
+ count_date: string;
9264
+ /**
9265
+ * @description De qué almacén se contó. NULL solo si el almacén se borró
9266
+ * después: el recuento sobrevive a lo que nombra.
9267
+ */
9268
+ warehouse_id: number | null;
9269
+ warehouse_name: string | null;
9270
+ notes: string | null;
9271
+ /**
9272
+ * Format: date-time
9273
+ * @description Cuándo se confirmó, no solo si: dice además el instante, como
9274
+ * los dos candados del ciclo de stock.
9275
+ */
9276
+ confirmed_at: string | null;
9277
+ creator_id: number | null;
9278
+ /** Format: date-time */
9279
+ created_at: string | null;
9280
+ lines?: components["schemas"]["StockCountLineResource"][];
9281
+ };
9096
9282
  /** StockMovementResource */
9097
9283
  StockMovementResource: {
9098
9284
  id: number;
@@ -17990,7 +18176,13 @@ export interface operations {
17990
18176
  };
17991
18177
  cookie?: never;
17992
18178
  };
17993
- requestBody?: never;
18179
+ requestBody?: {
18180
+ content: {
18181
+ "application/json": {
18182
+ warehouse_id?: number | null;
18183
+ };
18184
+ };
18185
+ };
17994
18186
  responses: {
17995
18187
  /** @description `ReceivedInvoiceResource` */
17996
18188
  200: {
@@ -18003,19 +18195,7 @@ export interface operations {
18003
18195
  };
18004
18196
  };
18005
18197
  };
18006
- 422: {
18007
- headers: {
18008
- [name: string]: unknown;
18009
- };
18010
- content: {
18011
- "application/json": {
18012
- /** @constant */
18013
- error: "goods_already_received";
18014
- /** @constant */
18015
- message: "La mercancía de esta factura recibida ya se sumó al almacén.";
18016
- };
18017
- };
18018
- };
18198
+ 422: components["responses"]["ValidationException"];
18019
18199
  };
18020
18200
  };
18021
18201
  "reconciliation.transactions": {
@@ -19565,12 +19745,215 @@ export interface operations {
19565
19745
  422: components["responses"]["ValidationException"];
19566
19746
  };
19567
19747
  };
19748
+ "stockCounts.confirm": {
19749
+ parameters: {
19750
+ query?: never;
19751
+ header?: never;
19752
+ path: {
19753
+ id: string;
19754
+ };
19755
+ cookie?: never;
19756
+ };
19757
+ requestBody?: never;
19758
+ responses: {
19759
+ 200: {
19760
+ headers: {
19761
+ [name: string]: unknown;
19762
+ };
19763
+ content: {
19764
+ "application/json": {
19765
+ data: {
19766
+ id: number;
19767
+ status: string;
19768
+ };
19769
+ meta: {
19770
+ adjusted_lines: number;
19771
+ unchanged_lines: number;
19772
+ uncounted_lines: number;
19773
+ moved_while_counting: number;
19774
+ };
19775
+ };
19776
+ };
19777
+ };
19778
+ 403: components["responses"]["AuthorizationException"];
19779
+ };
19780
+ };
19781
+ "stockCounts.cancel": {
19782
+ parameters: {
19783
+ query?: never;
19784
+ header?: never;
19785
+ path: {
19786
+ id: string;
19787
+ };
19788
+ cookie?: never;
19789
+ };
19790
+ requestBody?: never;
19791
+ responses: {
19792
+ /**
19793
+ * @description `StockCountResource`
19794
+ *
19795
+ * Confirmar un recuento en el que nadie contó nada no es «cuadrar
19796
+ * el almacén»: es no haber contado. Decirlo es mejor que sellar un
19797
+ * documento vacío que después parecerá un inventario hecho.
19798
+ */
19799
+ 200: {
19800
+ headers: {
19801
+ [name: string]: unknown;
19802
+ };
19803
+ content: {
19804
+ "application/json": {
19805
+ data: components["schemas"]["StockCountResource"];
19806
+ } | string;
19807
+ };
19808
+ };
19809
+ 403: components["responses"]["AuthorizationException"];
19810
+ };
19811
+ };
19812
+ "stock-counts.index": {
19813
+ parameters: {
19814
+ query?: {
19815
+ /** @description Solo los de este estado (`DRAFT`, `CONFIRMED`, `CANCELLED`). */
19816
+ status?: string;
19817
+ /** @description Solo los de este almacén. */
19818
+ warehouse_id?: number;
19819
+ };
19820
+ header?: never;
19821
+ path?: never;
19822
+ cookie?: never;
19823
+ };
19824
+ requestBody?: never;
19825
+ responses: {
19826
+ /** @description Array of `StockCountResource` */
19827
+ 200: {
19828
+ headers: {
19829
+ [name: string]: unknown;
19830
+ };
19831
+ content: {
19832
+ "application/json": {
19833
+ data: components["schemas"]["StockCountResource"][];
19834
+ };
19835
+ };
19836
+ };
19837
+ 403: components["responses"]["AuthorizationException"];
19838
+ };
19839
+ };
19840
+ "stock-counts.store": {
19841
+ parameters: {
19842
+ query?: never;
19843
+ header?: never;
19844
+ path?: never;
19845
+ cookie?: never;
19846
+ };
19847
+ requestBody: {
19848
+ content: {
19849
+ "application/json": components["schemas"]["StockCountRequest"];
19850
+ };
19851
+ };
19852
+ responses: {
19853
+ /** @description El recurso recién creado. */
19854
+ 201: {
19855
+ headers: {
19856
+ [name: string]: unknown;
19857
+ };
19858
+ content: {
19859
+ "application/json": 201;
19860
+ };
19861
+ };
19862
+ 403: components["responses"]["AuthorizationException"];
19863
+ 422: components["responses"]["ValidationException"];
19864
+ };
19865
+ };
19866
+ "stock-counts.show": {
19867
+ parameters: {
19868
+ query?: never;
19869
+ header?: never;
19870
+ path: {
19871
+ stock_count: string;
19872
+ };
19873
+ cookie?: never;
19874
+ };
19875
+ requestBody?: never;
19876
+ responses: {
19877
+ /** @description `StockCountResource` */
19878
+ 200: {
19879
+ headers: {
19880
+ [name: string]: unknown;
19881
+ };
19882
+ content: {
19883
+ "application/json": {
19884
+ data: components["schemas"]["StockCountResource"] & Record<string, never>;
19885
+ };
19886
+ };
19887
+ };
19888
+ 403: components["responses"]["AuthorizationException"];
19889
+ };
19890
+ };
19891
+ "stock-counts.update": {
19892
+ parameters: {
19893
+ query?: never;
19894
+ header?: never;
19895
+ path: {
19896
+ stock_count: string;
19897
+ };
19898
+ cookie?: never;
19899
+ };
19900
+ requestBody: {
19901
+ content: {
19902
+ "application/json": components["schemas"]["StockCountRequest"];
19903
+ };
19904
+ };
19905
+ responses: {
19906
+ /**
19907
+ * @description `StockCountResource`
19908
+ *
19909
+ * Confirmar un recuento en el que nadie contó nada no es «cuadrar
19910
+ * el almacén»: es no haber contado. Decirlo es mejor que sellar un
19911
+ * documento vacío que después parecerá un inventario hecho.
19912
+ */
19913
+ 200: {
19914
+ headers: {
19915
+ [name: string]: unknown;
19916
+ };
19917
+ content: {
19918
+ "application/json": {
19919
+ data: components["schemas"]["StockCountResource"] & Record<string, never>;
19920
+ } | string;
19921
+ };
19922
+ };
19923
+ 403: components["responses"]["AuthorizationException"];
19924
+ 422: components["responses"]["ValidationException"];
19925
+ };
19926
+ };
19927
+ "stock-counts.destroy": {
19928
+ parameters: {
19929
+ query?: never;
19930
+ header?: never;
19931
+ path: {
19932
+ stock_count: string;
19933
+ };
19934
+ cookie?: never;
19935
+ };
19936
+ requestBody?: never;
19937
+ responses: {
19938
+ 200: {
19939
+ headers: {
19940
+ [name: string]: unknown;
19941
+ };
19942
+ content: {
19943
+ "application/json": {
19944
+ success: string;
19945
+ };
19946
+ };
19947
+ };
19948
+ 403: components["responses"]["AuthorizationException"];
19949
+ };
19950
+ };
19568
19951
  "stockMovements.index": {
19569
19952
  parameters: {
19570
19953
  query?: {
19571
19954
  /** @description Solo los asientos de este artículo. */
19572
19955
  item_id?: number;
19573
- /** @description Solo los asientos con este motivo (`initial`, `import`, `manual_edit`, `manual_adjustment`, `purchase`, `sale_invoice`, `delivery_note`, `pos_sale`, `pos_return`). */
19956
+ /** @description Solo los asientos con este motivo (`initial`, `import`, `manual_edit`, `manual_adjustment`, `purchase`, `sale_invoice`, `delivery_note`, `pos_sale`, `pos_return`, `count`). */
19574
19957
  reason?: string;
19575
19958
  /** @description Solo los asientos de este almacén. */
19576
19959
  warehouse_id?: number;
package/dist/client.d.ts CHANGED
@@ -29,6 +29,8 @@ export type ContractResource = Schemas['ContractResource'];
29
29
  export type WarehouseResource = Schemas['WarehouseResource'];
30
30
  /** El saldo de un artículo EN un almacén. */
31
31
  export type ItemWarehouseStockResource = Schemas['ItemWarehouseStockResource'];
32
+ /** Un recuento de inventario tal y como lo devuelve la API. */
33
+ export type StockCountResource = Schemas['StockCountResource'];
32
34
  /** Cuerpo de alta/edición de cliente. Incluye `customFields`. */
33
35
  export type CustomerRequest = Schemas['CustomerRequest'];
34
36
  /** Cuerpo de alta/edición de factura. Incluye `customFields`. */
@@ -46,6 +48,12 @@ export type ContractRequest = Schemas['ContractRequest'];
46
48
  * misma transacción, porque la empresa necesita exactamente uno.
47
49
  */
48
50
  export type WarehouseRequest = Schemas['WarehouseRequest'];
51
+ /**
52
+ * Cuerpo del alta y del conteo de un recuento. ⚠️ En `lines`,
53
+ * `counted_quantity: null` es «sin contar» y **no** es cero: las líneas en
54
+ * null no emiten nada al confirmar.
55
+ */
56
+ export type StockCountRequest = Schemas['StockCountRequest'];
49
57
  /**
50
58
  * El sobre `{ data: … }` de Laravel para las escrituras que el spec **no
51
59
  * tipa**.
@@ -861,6 +869,97 @@ export declare class PimiaClient {
861
869
  };
862
870
  }>;
863
871
  };
872
+ /**
873
+ * Recuentos de inventario: contar un almacén y cuadrarlo de una vez. Exige
874
+ * `items:read` / `items:write` y el módulo `stock` (opt-in), como el resto.
875
+ *
876
+ * El ciclo es **contar → mirar diferencias → confirmar**, y los dos últimos
877
+ * pasos son llamadas distintas a propósito:
878
+ *
879
+ * - `update` escribe lo contado y **no mueve una sola existencia**;
880
+ * - `confirm` emite los ajustes en bloque, uno por línea con diferencia,
881
+ * todos con motivo `count` y en la misma transacción.
882
+ *
883
+ * ⛔ **Dos cosas que hay que tener delante para no programar contra una
884
+ * aritmética que el servidor no garantiza:**
885
+ *
886
+ * 1. **La diferencia se calcula al CONFIRMAR**, contra el saldo de ese
887
+ * momento: un recuento dice «aquí hay 12», no «quítale 3». Si algo se
888
+ * movió entre contar y confirmar, el almacén queda igualmente en lo
889
+ * contado, y el `meta.moved_while_counting` de la respuesta dice cuántas
890
+ * líneas fueron.
891
+ * 2. **`counted_quantity: null` es «sin contar», y no es cero.** Las líneas
892
+ * en null no emiten nada; mandar 0 es declarar que miraste y no había.
893
+ */
894
+ get stockCounts(): {
895
+ list: (query?: RequestOptions["query"], options?: ReadOptions) => Promise<{
896
+ data: components["schemas"]["StockCountResource"][];
897
+ }>;
898
+ get: (id: number | string, options?: ReadOptions) => Promise<{
899
+ data: components["schemas"]["StockCountResource"] & Record<string, never>;
900
+ }>;
901
+ /**
902
+ * Abre el recuento. Nace **sembrado** con lo que el almacén dice tener
903
+ * (`seed`, por defecto sí): contar es corregir una lista, no escribirla.
904
+ */
905
+ create: (body: StockCountRequest, options?: WriteOptions) => Promise<ResourceEnvelope<{
906
+ id: number;
907
+ count_number: string;
908
+ sequence_number: number;
909
+ status: string;
910
+ count_date: string;
911
+ warehouse_id: number | null;
912
+ warehouse_name: string | null;
913
+ notes: string | null;
914
+ confirmed_at: string | null;
915
+ creator_id: number | null;
916
+ created_at: string | null;
917
+ lines?: components["schemas"]["StockCountLineResource"][];
918
+ }>>;
919
+ /** Cuenta: escribe lo contado. No mueve el almacén. */
920
+ update: (id: number | string, body: StockCountRequest, options?: WriteOptions) => Promise<ResourceEnvelope<{
921
+ id: number;
922
+ count_number: string;
923
+ sequence_number: number;
924
+ status: string;
925
+ count_date: string;
926
+ warehouse_id: number | null;
927
+ warehouse_name: string | null;
928
+ notes: string | null;
929
+ confirmed_at: string | null;
930
+ creator_id: number | null;
931
+ created_at: string | null;
932
+ lines?: components["schemas"]["StockCountLineResource"][];
933
+ }>>;
934
+ /**
935
+ * Confirma: emite los ajustes en bloque. La respuesta trae el resumen en
936
+ * `meta` — cuántas líneas se ajustaron, cuántas cuadraban, cuántas
937
+ * quedaron sin contar y cuántas se movieron mientras se contaba.
938
+ */
939
+ confirm: (id: number | string, options?: WriteOptions) => Promise<{
940
+ data: {
941
+ id: number;
942
+ status: string;
943
+ };
944
+ meta: {
945
+ adjusted_lines: number;
946
+ unchanged_lines: number;
947
+ uncounted_lines: number;
948
+ moved_while_counting: number;
949
+ };
950
+ }>;
951
+ /** Cancela un borrador. Uno confirmado ya movió el almacén: 422. */
952
+ cancel: (id: number | string, options?: WriteOptions) => Promise<string | {
953
+ data: components["schemas"]["StockCountResource"];
954
+ }>;
955
+ /**
956
+ * Borra un recuento que no ha movido nada. Uno confirmado **no se
957
+ * borra**: sus asientos explican el saldo de hoy.
958
+ */
959
+ delete: (id: number | string, options?: ReadOptions) => Promise<{
960
+ success: string;
961
+ }>;
962
+ };
864
963
  get<T = unknown>(path: string, query?: RequestOptions['query'], options?: ReadOptions): Promise<T>;
865
964
  post<T = unknown>(path: string, body?: unknown, options?: WriteOptions): Promise<T>;
866
965
  put<T = unknown>(path: string, body?: unknown, options?: WriteOptions): Promise<T>;
package/dist/client.js CHANGED
@@ -197,6 +197,54 @@ export class PimiaClient {
197
197
  stock: (id, query, options) => this.get(`/warehouses/${id}/stock`, query, options),
198
198
  };
199
199
  }
200
+ /**
201
+ * Recuentos de inventario: contar un almacén y cuadrarlo de una vez. Exige
202
+ * `items:read` / `items:write` y el módulo `stock` (opt-in), como el resto.
203
+ *
204
+ * El ciclo es **contar → mirar diferencias → confirmar**, y los dos últimos
205
+ * pasos son llamadas distintas a propósito:
206
+ *
207
+ * - `update` escribe lo contado y **no mueve una sola existencia**;
208
+ * - `confirm` emite los ajustes en bloque, uno por línea con diferencia,
209
+ * todos con motivo `count` y en la misma transacción.
210
+ *
211
+ * ⛔ **Dos cosas que hay que tener delante para no programar contra una
212
+ * aritmética que el servidor no garantiza:**
213
+ *
214
+ * 1. **La diferencia se calcula al CONFIRMAR**, contra el saldo de ese
215
+ * momento: un recuento dice «aquí hay 12», no «quítale 3». Si algo se
216
+ * movió entre contar y confirmar, el almacén queda igualmente en lo
217
+ * contado, y el `meta.moved_while_counting` de la respuesta dice cuántas
218
+ * líneas fueron.
219
+ * 2. **`counted_quantity: null` es «sin contar», y no es cero.** Las líneas
220
+ * en null no emiten nada; mandar 0 es declarar que miraste y no había.
221
+ */
222
+ get stockCounts() {
223
+ return {
224
+ list: (query, options) => this.get('/stock-counts', query, options),
225
+ get: (id, options) => this.get(`/stock-counts/${id}`, undefined, options),
226
+ /**
227
+ * Abre el recuento. Nace **sembrado** con lo que el almacén dice tener
228
+ * (`seed`, por defecto sí): contar es corregir una lista, no escribirla.
229
+ */
230
+ create: (body, options) => this.post('/stock-counts', body, options),
231
+ /** Cuenta: escribe lo contado. No mueve el almacén. */
232
+ update: (id, body, options) => this.put(`/stock-counts/${id}`, body, options),
233
+ /**
234
+ * Confirma: emite los ajustes en bloque. La respuesta trae el resumen en
235
+ * `meta` — cuántas líneas se ajustaron, cuántas cuadraban, cuántas
236
+ * quedaron sin contar y cuántas se movieron mientras se contaba.
237
+ */
238
+ confirm: (id, options) => this.post(`/stock-counts/${id}/confirm`, {}, options),
239
+ /** Cancela un borrador. Uno confirmado ya movió el almacén: 422. */
240
+ cancel: (id, options) => this.post(`/stock-counts/${id}/cancel`, {}, options),
241
+ /**
242
+ * Borra un recuento que no ha movido nada. Uno confirmado **no se
243
+ * borra**: sus asientos explican el saldo de hoy.
244
+ */
245
+ delete: (id, options) => this.delete(`/stock-counts/${id}`, options),
246
+ };
247
+ }
200
248
  get(path, query, options) {
201
249
  return this.request(path, { ...options, method: 'GET', query });
202
250
  }
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  * salen los tipos de `./api`.
7
7
  */
8
8
  export { PimiaClient, toFormData } from './client.js';
9
- export type { ContractRequest, ContractResource, CustomerRequest, CustomerResource, EstimateResource, EstimatesRequest, InvoiceResource, InvoicesRequest, ItemWarehouseStockResource, PimiaClientOptions, RateLimit, ReadOptions, RequestOptions, ResourceEnvelope, ResponseMeta, ResponseWithMeta, WarehouseRequest, WarehouseResource, WriteOptions, } from './client.js';
9
+ export type { ContractRequest, ContractResource, CustomerRequest, CustomerResource, EstimateResource, EstimatesRequest, InvoiceResource, InvoicesRequest, ItemWarehouseStockResource, PimiaClientOptions, RateLimit, ReadOptions, RequestOptions, ResourceEnvelope, ResponseMeta, ResponseWithMeta, StockCountRequest, StockCountResource, WarehouseRequest, WarehouseResource, WriteOptions, } from './client.js';
10
10
  export { OAuth, createPkceChallenge, createState } from './oauth.js';
11
11
  export type { AuthorizationServerMetadata, AuthorizeUrlOptions, OAuthConfig, PkceChallenge, } from './oauth.js';
12
12
  export { MemoryTokenStore, isExpired, tokenSetFromResponse } from './tokens.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pimia/sdk",
3
- "version": "0.14.0",
3
+ "version": "0.15.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)",