@nubiia/mcp-freematica 0.6.1

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.
Files changed (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +485 -0
  3. package/dist/clients/base-client.d.ts +31 -0
  4. package/dist/clients/base-client.js +102 -0
  5. package/dist/clients/base-client.js.map +1 -0
  6. package/dist/clients/fiql-builder.d.ts +118 -0
  7. package/dist/clients/fiql-builder.js +257 -0
  8. package/dist/clients/fiql-builder.js.map +1 -0
  9. package/dist/clients/freematica-client.d.ts +659 -0
  10. package/dist/clients/freematica-client.js +1327 -0
  11. package/dist/clients/freematica-client.js.map +1 -0
  12. package/dist/clients/hardened-base-client.d.ts +143 -0
  13. package/dist/clients/hardened-base-client.js +366 -0
  14. package/dist/clients/hardened-base-client.js.map +1 -0
  15. package/dist/config.d.ts +104 -0
  16. package/dist/config.js +105 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +55 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/logger.d.ts +71 -0
  22. package/dist/logger.js +114 -0
  23. package/dist/logger.js.map +1 -0
  24. package/dist/schemas/albaranes.d.ts +124 -0
  25. package/dist/schemas/albaranes.js +250 -0
  26. package/dist/schemas/albaranes.js.map +1 -0
  27. package/dist/schemas/cartera.d.ts +70 -0
  28. package/dist/schemas/cartera.js +104 -0
  29. package/dist/schemas/cartera.js.map +1 -0
  30. package/dist/schemas/contratos.d.ts +7 -0
  31. package/dist/schemas/contratos.js +2 -0
  32. package/dist/schemas/contratos.js.map +1 -0
  33. package/dist/schemas/facturas-electronicas.d.ts +60 -0
  34. package/dist/schemas/facturas-electronicas.js +79 -0
  35. package/dist/schemas/facturas-electronicas.js.map +1 -0
  36. package/dist/schemas/facturas-ventas.d.ts +118 -0
  37. package/dist/schemas/facturas-ventas.js +153 -0
  38. package/dist/schemas/facturas-ventas.js.map +1 -0
  39. package/dist/schemas/filters.d.ts +92 -0
  40. package/dist/schemas/filters.js +76 -0
  41. package/dist/schemas/filters.js.map +1 -0
  42. package/dist/schemas/master-data.d.ts +26 -0
  43. package/dist/schemas/master-data.js +86 -0
  44. package/dist/schemas/master-data.js.map +1 -0
  45. package/dist/schemas/pagination.d.ts +14 -0
  46. package/dist/schemas/pagination.js +27 -0
  47. package/dist/schemas/pagination.js.map +1 -0
  48. package/dist/schemas/pedidos-compras.d.ts +92 -0
  49. package/dist/schemas/pedidos-compras.js +189 -0
  50. package/dist/schemas/pedidos-compras.js.map +1 -0
  51. package/dist/server-instructions.d.ts +1 -0
  52. package/dist/server-instructions.js +83 -0
  53. package/dist/server-instructions.js.map +1 -0
  54. package/dist/server.d.ts +6 -0
  55. package/dist/server.js +41 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/tools/albaranes.d.ts +16 -0
  58. package/dist/tools/albaranes.js +202 -0
  59. package/dist/tools/albaranes.js.map +1 -0
  60. package/dist/tools/calendarios.d.ts +13 -0
  61. package/dist/tools/calendarios.js +82 -0
  62. package/dist/tools/calendarios.js.map +1 -0
  63. package/dist/tools/cartera.d.ts +13 -0
  64. package/dist/tools/cartera.js +78 -0
  65. package/dist/tools/cartera.js.map +1 -0
  66. package/dist/tools/clientes.d.ts +3 -0
  67. package/dist/tools/clientes.js +48 -0
  68. package/dist/tools/clientes.js.map +1 -0
  69. package/dist/tools/contabilidad.d.ts +14 -0
  70. package/dist/tools/contabilidad.js +259 -0
  71. package/dist/tools/contabilidad.js.map +1 -0
  72. package/dist/tools/contactos-clientes.d.ts +3 -0
  73. package/dist/tools/contactos-clientes.js +25 -0
  74. package/dist/tools/contactos-clientes.js.map +1 -0
  75. package/dist/tools/contratos.d.ts +10 -0
  76. package/dist/tools/contratos.js +35 -0
  77. package/dist/tools/contratos.js.map +1 -0
  78. package/dist/tools/facturas-compras.d.ts +13 -0
  79. package/dist/tools/facturas-compras.js +131 -0
  80. package/dist/tools/facturas-compras.js.map +1 -0
  81. package/dist/tools/facturas-electronicas.d.ts +17 -0
  82. package/dist/tools/facturas-electronicas.js +268 -0
  83. package/dist/tools/facturas-electronicas.js.map +1 -0
  84. package/dist/tools/facturas-ventas.d.ts +16 -0
  85. package/dist/tools/facturas-ventas.js +181 -0
  86. package/dist/tools/facturas-ventas.js.map +1 -0
  87. package/dist/tools/helpers.d.ts +17 -0
  88. package/dist/tools/helpers.js +36 -0
  89. package/dist/tools/helpers.js.map +1 -0
  90. package/dist/tools/localizaciones.d.ts +17 -0
  91. package/dist/tools/localizaciones.js +192 -0
  92. package/dist/tools/localizaciones.js.map +1 -0
  93. package/dist/tools/master-data.d.ts +10 -0
  94. package/dist/tools/master-data.js +70 -0
  95. package/dist/tools/master-data.js.map +1 -0
  96. package/dist/tools/oportunidades-negocio.d.ts +3 -0
  97. package/dist/tools/oportunidades-negocio.js +68 -0
  98. package/dist/tools/oportunidades-negocio.js.map +1 -0
  99. package/dist/tools/pedidos-compras.d.ts +14 -0
  100. package/dist/tools/pedidos-compras.js +105 -0
  101. package/dist/tools/pedidos-compras.js.map +1 -0
  102. package/dist/tools/personal.d.ts +13 -0
  103. package/dist/tools/personal.js +154 -0
  104. package/dist/tools/personal.js.map +1 -0
  105. package/dist/tools/prl.d.ts +47 -0
  106. package/dist/tools/prl.js +242 -0
  107. package/dist/tools/prl.js.map +1 -0
  108. package/dist/tools/proveedores.d.ts +14 -0
  109. package/dist/tools/proveedores.js +122 -0
  110. package/dist/tools/proveedores.js.map +1 -0
  111. package/dist/transports/http.d.ts +12 -0
  112. package/dist/transports/http.js +110 -0
  113. package/dist/transports/http.js.map +1 -0
  114. package/dist/transports/stdio.d.ts +12 -0
  115. package/dist/transports/stdio.js +15 -0
  116. package/dist/transports/stdio.js.map +1 -0
  117. package/dist/types/api-envelope.d.ts +27 -0
  118. package/dist/types/api-envelope.js +2 -0
  119. package/dist/types/api-envelope.js.map +1 -0
  120. package/dist/types/clientes.d.ts +9 -0
  121. package/dist/types/clientes.js +2 -0
  122. package/dist/types/clientes.js.map +1 -0
  123. package/dist/types/contactos-clientes.d.ts +7 -0
  124. package/dist/types/contactos-clientes.js +2 -0
  125. package/dist/types/contactos-clientes.js.map +1 -0
  126. package/dist/types/contratos.d.ts +8 -0
  127. package/dist/types/contratos.js +2 -0
  128. package/dist/types/contratos.js.map +1 -0
  129. package/dist/types/master-data.d.ts +9 -0
  130. package/dist/types/master-data.js +2 -0
  131. package/dist/types/master-data.js.map +1 -0
  132. package/dist/types/oportunidades-negocio.d.ts +8 -0
  133. package/dist/types/oportunidades-negocio.js +2 -0
  134. package/dist/types/oportunidades-negocio.js.map +1 -0
  135. package/dist/utils/size-guardrail.d.ts +22 -0
  136. package/dist/utils/size-guardrail.js +31 -0
  137. package/dist/utils/size-guardrail.js.map +1 -0
  138. package/package.json +90 -0
@@ -0,0 +1,92 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Enum lógico del estado de un pedido de compra.
4
+ *
5
+ * Mapeo a FIQL sobre los campos `ALCC_PED_BLOQ` y `ALCC_PED_RECIB`:
6
+ *
7
+ * - `pendiente` → `ALCC_PED_BLOQ=='';ALCC_PED_RECIB==''`
8
+ * (ambos campos vacíos — pedido abierto, ni bloqueado ni recibido)
9
+ * - `bloqueado` → `ALCC_PED_BLOQ!=''`
10
+ * (campo ALCC_PED_BLOQ tiene algún valor centinela)
11
+ * - `recibido` → `ALCC_PED_RECIB!=''`
12
+ * (campo ALCC_PED_RECIB tiene algún valor centinela)
13
+ *
14
+ * ASUNCIÓN EMPÍRICA — convención nullable en Freemática FIQL:
15
+ * La API de Freemática no expone IS NULL nativo en FIQL. La convención
16
+ * observada en otras tablas del sistema (ver TD-118: ASI_BORR, CARCL_FECIMPAG)
17
+ * es representar el valor nulo/ausente como cadena vacía `''` en expresiones
18
+ * `==` / `!=`. Para ALCC_PED_BLOQ y ALCC_PED_RECIB:
19
+ * - bloqueado=true → `ALCC_PED_BLOQ!=''` (campo tiene valor → bloqueado)
20
+ * - recibido=true → `ALCC_PED_RECIB!=''` (campo tiene valor → recibido)
21
+ * - pendiente → ambos campos vacíos
22
+ *
23
+ * Esta convención NO ha sido verificada contra la API real de Freemática.
24
+ * Si en pruebas funcionales el filtro no actúa correctamente, puede que el
25
+ * centinela sea el literal `null` (como en CARCL_FECIMPAG), un valor 'S'/'N'
26
+ * o un valor numérico '1'/'0'. Documentado para futura verificación empírica.
27
+ *
28
+ * TODO(TD-152): verificar contra API real cuando esté disponible.
29
+ */
30
+ export declare const EstadoPedidoEnum: z.ZodEnum<["pendiente", "bloqueado", "recibido"]>;
31
+ export type EstadoPedido = z.infer<typeof EstadoPedidoEnum>;
32
+ /**
33
+ * Genera la expresión FIQL para el filtro de estado de pedido de compra.
34
+ *
35
+ * El estado se mapea a expresiones FIQL sobre `ALCC_PED_BLOQ` y `ALCC_PED_RECIB`.
36
+ * Ver `EstadoPedidoEnum` para la documentación completa de la convención.
37
+ *
38
+ * @param estado - Valor del enum de estado.
39
+ * @returns Expresión FIQL para incluir en `rquery` (sin `rquery=`).
40
+ */
41
+ export declare function buildEstadoPedidoFiql(estado: EstadoPedido): string;
42
+ /**
43
+ * Filtros tipados para `freematica_list_pedidos_compra`.
44
+ *
45
+ * El endpoint GET /pcmp/v2/pedidos tiene un diseño mixto:
46
+ * - 4 filtros como **query params nativos** (no FIQL): codEmpresa, desdeFecha, hastaFecha, codProveedor.
47
+ * - El resto de filtros via **rQuery** (FIQL) con campos ALCC_*.
48
+ *
49
+ * Mapeo completo:
50
+ * | Filtro lógico | Destino | Campo API |
51
+ * |----------------------|---------------------|------------------------|
52
+ * | empresa (4c) | query param nativo | codEmpresa |
53
+ * | codProveedor (10c) | query param nativo | codProveedor |
54
+ * | fechaPedidoDesde | query param nativo | desdeFecha |
55
+ * | fechaPedidoHasta | query param nativo | hastaFecha |
56
+ * | numPedido | FIQL rquery | ALCC_NUMDOC |
57
+ * | codDocumento (4c) | FIQL rquery | ALCC_CODDOC |
58
+ * | delegacion (4c) | FIQL rquery | ALCC_DELEG |
59
+ * | formaPago (3c) | FIQL rquery | ALCC_FPAGO |
60
+ * | tipoIva (4c) | FIQL rquery | ALCC_TIPO_IVA |
61
+ * | codCliente (10c) | FIQL rquery | ALCC_COD_CLIENTE |
62
+ * | codInstalador | FIQL rquery | ALCC_COD_INSTALADOR |
63
+ * | codMantenedor | FIQL rquery | ALCC_COD_MANTENEDOR |
64
+ * | fechaEntregaDesde | FIQL rquery | ALCC_FCHENTREGA =ge= |
65
+ * | fechaEntregaHasta | FIQL rquery | ALCC_FCHENTREGA =le= |
66
+ * | referencia (40c) | FIQL rquery | ALCC_REFERENCIA |
67
+ * | estado | FIQL rquery compuesta| ALCC_PED_BLOQ + ALCC_PED_RECIB |
68
+ */
69
+ export declare const ListPedidosCompraFiltersSchema: {
70
+ empresa: z.ZodOptional<z.ZodString>;
71
+ codProveedor: z.ZodOptional<z.ZodString>;
72
+ fechaPedidoDesde: z.ZodOptional<z.ZodString>;
73
+ fechaPedidoHasta: z.ZodOptional<z.ZodString>;
74
+ numPedido: z.ZodOptional<z.ZodNumber>;
75
+ codDocumento: z.ZodOptional<z.ZodString>;
76
+ delegacion: z.ZodOptional<z.ZodString>;
77
+ formaPago: z.ZodOptional<z.ZodString>;
78
+ tipoIva: z.ZodOptional<z.ZodString>;
79
+ codCliente: z.ZodOptional<z.ZodString>;
80
+ codInstalador: z.ZodOptional<z.ZodString>;
81
+ codMantenedor: z.ZodOptional<z.ZodString>;
82
+ fechaEntregaDesde: z.ZodOptional<z.ZodString>;
83
+ fechaEntregaHasta: z.ZodOptional<z.ZodString>;
84
+ referencia: z.ZodOptional<z.ZodString>;
85
+ estado: z.ZodOptional<z.ZodEnum<["pendiente", "bloqueado", "recibido"]>>;
86
+ page: z.ZodDefault<z.ZodNumber>;
87
+ items: z.ZodDefault<z.ZodNumber>;
88
+ };
89
+ /** Tipo inferido de los filtros de listado de pedidos de compra. */
90
+ export type ListPedidosCompraFilters = {
91
+ [K in keyof typeof ListPedidosCompraFiltersSchema]?: z.infer<(typeof ListPedidosCompraFiltersSchema)[K]>;
92
+ };
@@ -0,0 +1,189 @@
1
+ import { z } from 'zod';
2
+ import { PaginationSchema } from './pagination.js';
3
+ /**
4
+ * Enum lógico del estado de un pedido de compra.
5
+ *
6
+ * Mapeo a FIQL sobre los campos `ALCC_PED_BLOQ` y `ALCC_PED_RECIB`:
7
+ *
8
+ * - `pendiente` → `ALCC_PED_BLOQ=='';ALCC_PED_RECIB==''`
9
+ * (ambos campos vacíos — pedido abierto, ni bloqueado ni recibido)
10
+ * - `bloqueado` → `ALCC_PED_BLOQ!=''`
11
+ * (campo ALCC_PED_BLOQ tiene algún valor centinela)
12
+ * - `recibido` → `ALCC_PED_RECIB!=''`
13
+ * (campo ALCC_PED_RECIB tiene algún valor centinela)
14
+ *
15
+ * ASUNCIÓN EMPÍRICA — convención nullable en Freemática FIQL:
16
+ * La API de Freemática no expone IS NULL nativo en FIQL. La convención
17
+ * observada en otras tablas del sistema (ver TD-118: ASI_BORR, CARCL_FECIMPAG)
18
+ * es representar el valor nulo/ausente como cadena vacía `''` en expresiones
19
+ * `==` / `!=`. Para ALCC_PED_BLOQ y ALCC_PED_RECIB:
20
+ * - bloqueado=true → `ALCC_PED_BLOQ!=''` (campo tiene valor → bloqueado)
21
+ * - recibido=true → `ALCC_PED_RECIB!=''` (campo tiene valor → recibido)
22
+ * - pendiente → ambos campos vacíos
23
+ *
24
+ * Esta convención NO ha sido verificada contra la API real de Freemática.
25
+ * Si en pruebas funcionales el filtro no actúa correctamente, puede que el
26
+ * centinela sea el literal `null` (como en CARCL_FECIMPAG), un valor 'S'/'N'
27
+ * o un valor numérico '1'/'0'. Documentado para futura verificación empírica.
28
+ *
29
+ * TODO(TD-152): verificar contra API real cuando esté disponible.
30
+ */
31
+ export const EstadoPedidoEnum = z.enum(['pendiente', 'bloqueado', 'recibido']);
32
+ /**
33
+ * Genera la expresión FIQL para el filtro de estado de pedido de compra.
34
+ *
35
+ * El estado se mapea a expresiones FIQL sobre `ALCC_PED_BLOQ` y `ALCC_PED_RECIB`.
36
+ * Ver `EstadoPedidoEnum` para la documentación completa de la convención.
37
+ *
38
+ * @param estado - Valor del enum de estado.
39
+ * @returns Expresión FIQL para incluir en `rquery` (sin `rquery=`).
40
+ */
41
+ export function buildEstadoPedidoFiql(estado) {
42
+ switch (estado) {
43
+ case 'pendiente':
44
+ return "ALCC_PED_BLOQ=='';ALCC_PED_RECIB==''";
45
+ case 'bloqueado':
46
+ return "ALCC_PED_BLOQ!=''";
47
+ case 'recibido':
48
+ return "ALCC_PED_RECIB!=''";
49
+ }
50
+ }
51
+ /**
52
+ * Filtros tipados para `freematica_list_pedidos_compra`.
53
+ *
54
+ * El endpoint GET /pcmp/v2/pedidos tiene un diseño mixto:
55
+ * - 4 filtros como **query params nativos** (no FIQL): codEmpresa, desdeFecha, hastaFecha, codProveedor.
56
+ * - El resto de filtros via **rQuery** (FIQL) con campos ALCC_*.
57
+ *
58
+ * Mapeo completo:
59
+ * | Filtro lógico | Destino | Campo API |
60
+ * |----------------------|---------------------|------------------------|
61
+ * | empresa (4c) | query param nativo | codEmpresa |
62
+ * | codProveedor (10c) | query param nativo | codProveedor |
63
+ * | fechaPedidoDesde | query param nativo | desdeFecha |
64
+ * | fechaPedidoHasta | query param nativo | hastaFecha |
65
+ * | numPedido | FIQL rquery | ALCC_NUMDOC |
66
+ * | codDocumento (4c) | FIQL rquery | ALCC_CODDOC |
67
+ * | delegacion (4c) | FIQL rquery | ALCC_DELEG |
68
+ * | formaPago (3c) | FIQL rquery | ALCC_FPAGO |
69
+ * | tipoIva (4c) | FIQL rquery | ALCC_TIPO_IVA |
70
+ * | codCliente (10c) | FIQL rquery | ALCC_COD_CLIENTE |
71
+ * | codInstalador | FIQL rquery | ALCC_COD_INSTALADOR |
72
+ * | codMantenedor | FIQL rquery | ALCC_COD_MANTENEDOR |
73
+ * | fechaEntregaDesde | FIQL rquery | ALCC_FCHENTREGA =ge= |
74
+ * | fechaEntregaHasta | FIQL rquery | ALCC_FCHENTREGA =le= |
75
+ * | referencia (40c) | FIQL rquery | ALCC_REFERENCIA |
76
+ * | estado | FIQL rquery compuesta| ALCC_PED_BLOQ + ALCC_PED_RECIB |
77
+ */
78
+ export const ListPedidosCompraFiltersSchema = {
79
+ ...PaginationSchema,
80
+ // -------------------------------------------------------------------------
81
+ // Filtros nativos (query params, NO FIQL)
82
+ // -------------------------------------------------------------------------
83
+ empresa: z
84
+ .string()
85
+ .length(4)
86
+ .optional()
87
+ .describe('Código de empresa Freemática, exactamente 4 caracteres. ' +
88
+ 'Se envía como query param nativo `codEmpresa` (NO FIQL). Ej.: "1000".'),
89
+ codProveedor: z
90
+ .string()
91
+ .min(1)
92
+ .max(10)
93
+ .optional()
94
+ .describe('Código natural del proveedor, hasta 10 caracteres. ' +
95
+ 'Se envía como query param nativo `codProveedor` (NO FIQL). Ej.: "P001".'),
96
+ fechaPedidoDesde: z
97
+ .string()
98
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'Formato ISO YYYY-MM-DD')
99
+ .optional()
100
+ .describe('Fecha inicio del rango de búsqueda por fecha de pedido (ISO YYYY-MM-DD). ' +
101
+ 'Se envía como query param nativo `desdeFecha` (NO FIQL). Ej.: "2025-01-01".'),
102
+ fechaPedidoHasta: z
103
+ .string()
104
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'Formato ISO YYYY-MM-DD')
105
+ .optional()
106
+ .describe('Fecha fin del rango de búsqueda por fecha de pedido (ISO YYYY-MM-DD). ' +
107
+ 'Se envía como query param nativo `hastaFecha` (NO FIQL). Ej.: "2025-12-31".'),
108
+ // -------------------------------------------------------------------------
109
+ // Filtros FIQL (via rquery con campos ALCC_*)
110
+ // -------------------------------------------------------------------------
111
+ numPedido: z
112
+ .number()
113
+ .int()
114
+ .positive()
115
+ .optional()
116
+ .describe('Número de pedido (hasta 8 dígitos). ' +
117
+ 'FIQL: ALCC_NUMDOC==N. Ej.: 12345678.'),
118
+ codDocumento: z
119
+ .string()
120
+ .length(4)
121
+ .optional()
122
+ .describe('Código de tipo de documento, exactamente 4 caracteres. ' +
123
+ 'FIQL: ALCC_CODDOC==XXXX. Ej.: "PCMP".'),
124
+ delegacion: z
125
+ .string()
126
+ .length(4)
127
+ .optional()
128
+ .describe('Código de delegación, exactamente 4 caracteres. ' +
129
+ 'FIQL: ALCC_DELEG==XXXX. Ej.: "MAD1".'),
130
+ formaPago: z
131
+ .string()
132
+ .length(3)
133
+ .optional()
134
+ .describe('Código de forma de pago, exactamente 3 caracteres. ' +
135
+ 'FIQL: ALCC_FPAGO==XXX. Ej.: "TRF".'),
136
+ tipoIva: z
137
+ .string()
138
+ .length(4)
139
+ .optional()
140
+ .describe('Código de tipo de IVA, exactamente 4 caracteres. ' +
141
+ 'FIQL: ALCC_TIPO_IVA==XXXX. Ej.: "GEN1".'),
142
+ codCliente: z
143
+ .string()
144
+ .min(1)
145
+ .max(10)
146
+ .optional()
147
+ .describe('Código natural del cliente asociado al pedido, hasta 10 caracteres. ' +
148
+ 'FIQL: ALCC_COD_CLIENTE==X. Ej.: "0001000".'),
149
+ codInstalador: z
150
+ .string()
151
+ .min(1)
152
+ .optional()
153
+ .describe('Código del instalador asociado al pedido. ' +
154
+ 'FIQL: ALCC_COD_INSTALADOR==X.'),
155
+ codMantenedor: z
156
+ .string()
157
+ .min(1)
158
+ .optional()
159
+ .describe('Código del mantenedor asociado al pedido. ' +
160
+ 'FIQL: ALCC_COD_MANTENEDOR==X.'),
161
+ fechaEntregaDesde: z
162
+ .string()
163
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'Formato ISO YYYY-MM-DD')
164
+ .optional()
165
+ .describe('Fecha inicio del rango de fecha de entrega del pedido (ISO YYYY-MM-DD). ' +
166
+ 'FIQL: ALCC_FCHENTREGA=ge=YYYY-MM-DD. Ej.: "2025-01-01".'),
167
+ fechaEntregaHasta: z
168
+ .string()
169
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'Formato ISO YYYY-MM-DD')
170
+ .optional()
171
+ .describe('Fecha fin del rango de fecha de entrega del pedido (ISO YYYY-MM-DD). ' +
172
+ 'FIQL: ALCC_FCHENTREGA=le=YYYY-MM-DD. Ej.: "2025-12-31".'),
173
+ referencia: z
174
+ .string()
175
+ .min(1)
176
+ .max(40)
177
+ .optional()
178
+ .describe('Referencia exacta del pedido (hasta 40 caracteres). ' +
179
+ 'FIQL: ALCC_REFERENCIA==X (match exacto). Ej.: "REF-2025-001".'),
180
+ estado: EstadoPedidoEnum
181
+ .optional()
182
+ .describe('Estado del pedido de compra. Valores: ' +
183
+ '"pendiente" (ni bloqueado ni recibido → ALCC_PED_BLOQ==\'\';ALCC_PED_RECIB==\'\'), ' +
184
+ '"bloqueado" (ALCC_PED_BLOQ!= \'\'), ' +
185
+ '"recibido" (ALCC_PED_RECIB!=\'\'). ' +
186
+ 'NOTA EMPÍRICA: convención de campo vacío como centinela de "sin valor" en Freemática FIQL; ' +
187
+ 'verificar contra API real si el filtro no produce resultados esperados.'),
188
+ };
189
+ //# sourceMappingURL=pedidos-compras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pedidos-compras.js","sourceRoot":"","sources":["../../src/schemas/pedidos-compras.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const FREEMATICA_MCP_INSTRUCTIONS: string;
@@ -0,0 +1,83 @@
1
+ export const FREEMATICA_MCP_INSTRUCTIONS = `
2
+ # Freemática MCP
3
+
4
+ Este servidor expone operaciones del API REST de Freemática como tools MCP.
5
+
6
+ ## Tools disponibles (8)
7
+
8
+ ### Materiales (1)
9
+
10
+ - **freematica_list_materiales_asignados_servicios** — Lista de material
11
+ asignado a servicios (sin parámetros). Devuelve { items, count, total }.
12
+
13
+ ### Datos maestros (1)
14
+
15
+ - **freematica_get_master_data** — Devuelve un catálogo de datos maestros.
16
+ Parámetro \`catalog\` (enum): tipos-contrato, tipo-instalacion, clases-servicios,
17
+ tipos-casos, subtipos-casos, tipos-oportunidad-negocio, tipos-impuestos,
18
+ naturalezas-abono, paises, nacionalidades, provincias, poblaciones, empresas,
19
+ delegaciones, lineas-negocio, cargos-clientes, familias, subfamilias (18 catálogos).
20
+ Devuelve { catalog, items, count, total }.
21
+
22
+ ### Clientes (2)
23
+
24
+ - **freematica_list_clientes(page=1, items=20)** — Lista paginada de clientes.
25
+ - **freematica_get_cliente(id)** — Detalle de un cliente. \`id\` = \`idReg\` opaco.
26
+
27
+ ### Contactos clientes (1)
28
+
29
+ - **freematica_list_contactos_clientes(page=1, items=20)** — Lista paginada.
30
+
31
+ ### Oportunidades de negocio (3)
32
+
33
+ - **freematica_list_oportunidades_negocio(page=1, items=20)** — Lista paginada.
34
+ - **freematica_get_oportunidad_negocio(id)** — Detalle. \`id\` = \`idReg\` opaco.
35
+ - **freematica_get_oportunidad_negocio_datos_ampliados(id)** — Datos ampliados.
36
+ Puede devolver not_found si la oportunidad no tiene datos extra.
37
+
38
+ ## Paginación
39
+
40
+ Todas las tools \`freematica_list_*\` aceptan dos parámetros opcionales:
41
+
42
+ - **page** (int, ≥1, default 1): página a recuperar, 1-indexed.
43
+ - **items** (int, 1..50, default 20): items por página.
44
+
45
+ La respuesta siempre incluye \`total\` = total de elementos en el dataset,
46
+ para que puedas paginar (\`page = total / items + 1\`).
47
+
48
+ AVISO: NO uses \`page=0\` (este parámetro lo bloquea al mínimo 1). El API real
49
+ trata \`page=0\` como "devuelve TODO el dataset" — puede ser muchos MB.
50
+
51
+ ## IDs opacos en endpoints de detalle
52
+
53
+ Las tools \`freematica_get_*\` requieren un \`id\` que es el campo \`idReg\` de los
54
+ items en los listados — un string opaco base64 como \`MV9fMTAwMA==\` o \`MDJfXzI=\`.
55
+
56
+ NO uses códigos naturales como \`COD_CLI\` o \`ID_OPORTUNIDAD\` — el API devuelve
57
+ not_found. Patrón típico:
58
+
59
+ 1. Llamar a \`freematica_list_clientes\` y localizar el cliente que buscas.
60
+ 2. Tomar su campo \`idReg\`.
61
+ 3. Pasarlo como \`id\` a \`freematica_get_cliente\`.
62
+
63
+ ## Resolución de códigos a nombres
64
+
65
+ Muchas tools devuelven códigos como \`COD_TIPO_OPOR: "01"\` o \`COD_GRUPO_CLI: 1.0\`.
66
+ Para mostrar nombres legibles, usa \`freematica_get_master_data\` con el catálogo
67
+ correspondiente y haz el lookup.
68
+
69
+ ## Manejo de errores
70
+
71
+ Las llamadas pueden fallar con uno de estos códigos:
72
+
73
+ | Código | Significado | Acción del LLM |
74
+ |---|---|---|
75
+ | invalid_token | Credenciales caducadas o inválidas | Avisar al usuario; renovar en Nubiia. |
76
+ | forbidden | Permisos insuficientes | Explicar; no reintentar. |
77
+ | not_found | Recurso o endpoint inexistente | Comprobar el id; no reintentar (excepto datos-ampliados, que puede ser un caso normal). |
78
+ | rate_limit_exceeded | Demasiadas peticiones | Esperar y reintentar una vez. |
79
+ | server_error | Error 5xx del API | Reintentar una vez con backoff. |
80
+ | network_error | Problemas de red | Reintentar una vez tras 2s. |
81
+ | unexpected_error | Error no clasificado | Loggear y reintentar una vez. |
82
+ `.trim();
83
+ //# sourceMappingURL=server-instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../src/server-instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiF1C,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { FreematicaClient } from './clients/freematica-client.js';
3
+ export interface CreateFreematicaServerOptions {
4
+ client: FreematicaClient;
5
+ }
6
+ export declare function createFreematicaServer(opts: CreateFreematicaServerOptions): McpServer;
package/dist/server.js ADDED
@@ -0,0 +1,41 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { FREEMATICA_MCP_INSTRUCTIONS } from './server-instructions.js';
3
+ import { registerAlbaranesTools } from './tools/albaranes.js';
4
+ import { registerCalendariosTools } from './tools/calendarios.js';
5
+ import { registerCarteraTools } from './tools/cartera.js';
6
+ import { registerClientesTools } from './tools/clientes.js';
7
+ import { registerContactosClientesTools } from './tools/contactos-clientes.js';
8
+ import { registerContabilidadTools } from './tools/contabilidad.js';
9
+ import { registerContratosTools } from './tools/contratos.js';
10
+ import { registerFacturasComprasTools } from './tools/facturas-compras.js';
11
+ import { registerFacturasElectronicasTools } from './tools/facturas-electronicas.js';
12
+ import { registerFacturasVentasTools } from './tools/facturas-ventas.js';
13
+ import { registerLocalizacionesTools } from './tools/localizaciones.js';
14
+ import { registerMasterDataTools } from './tools/master-data.js';
15
+ import { registerOportunidadesNegocioTools } from './tools/oportunidades-negocio.js';
16
+ import { registerPedidosComprasTools } from './tools/pedidos-compras.js';
17
+ import { registerPersonalTools } from './tools/personal.js';
18
+ import { registerPrlTools } from './tools/prl.js';
19
+ import { registerProveedoresTools } from './tools/proveedores.js';
20
+ export function createFreematicaServer(opts) {
21
+ const server = new McpServer({ name: 'freematica-mcp', version: '0.6.0' }, { instructions: FREEMATICA_MCP_INSTRUCTIONS });
22
+ registerContratosTools(server, opts.client);
23
+ registerMasterDataTools(server, opts.client);
24
+ registerClientesTools(server, opts.client);
25
+ registerContactosClientesTools(server, opts.client);
26
+ registerOportunidadesNegocioTools(server, opts.client);
27
+ registerCarteraTools(server, opts.client);
28
+ registerFacturasVentasTools(server, opts.client);
29
+ registerFacturasComprasTools(server, opts.client);
30
+ registerPedidosComprasTools(server, opts.client);
31
+ registerProveedoresTools(server, opts.client);
32
+ registerLocalizacionesTools(server, opts.client);
33
+ registerContabilidadTools(server, opts.client);
34
+ registerPrlTools(server, opts.client);
35
+ registerPersonalTools(server, opts.client);
36
+ registerCalendariosTools(server, opts.client);
37
+ registerFacturasElectronicasTools(server, opts.client);
38
+ registerAlbaranesTools(server, opts.client);
39
+ return server;
40
+ }
41
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAMlE,MAAM,UAAU,sBAAsB,CAAC,IAAmC;IACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC5C,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAC9C,CAAC;IAEF,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,iCAAiC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,iCAAiC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { FreematicaClient } from '../clients/freematica-client.js';
3
+ /**
4
+ * Registra las tools de albaranes en el servidor MCP.
5
+ *
6
+ * Tools registradas:
7
+ * - `freematica_list_albaranes_ventas`: lista paginada de albaranes de ventas.
8
+ * - `freematica_get_albaran_venta`: detalle de un albarán de venta por idReg.
9
+ * - `freematica_list_albaranes_factura`: lista de vinculaciones albarán↔factura.
10
+ * - `freematica_get_albaran_factura`: detalle de una vinculación por idReg.
11
+ * - `freematica_list_resultados_facturacion`: resultados batch facturación vigilancia.
12
+ *
13
+ * @param server - Instancia del servidor MCP.
14
+ * @param client - Cliente Freemática autenticado.
15
+ */
16
+ export declare function registerAlbaranesTools(server: McpServer, client: FreematicaClient): void;
@@ -0,0 +1,202 @@
1
+ import { z } from 'zod';
2
+ import { FreematicaError } from '../clients/base-client.js';
3
+ import { ListAlbaranesFacturaFiltersSchema, ListAlbaranesVentasFiltersSchema, ListResultadosFacturacionFiltersSchema, } from '../schemas/albaranes.js';
4
+ import { error, ok, okList } from './helpers.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Tool names
7
+ // ---------------------------------------------------------------------------
8
+ const LIST_ALBARANES_VENTAS_TOOL = 'freematica_list_albaranes_ventas';
9
+ const GET_ALBARAN_VENTA_TOOL = 'freematica_get_albaran_venta';
10
+ const LIST_ALBARANES_FACTURA_TOOL = 'freematica_list_albaranes_factura';
11
+ const GET_ALBARAN_FACTURA_TOOL = 'freematica_get_albaran_factura';
12
+ const LIST_RESULTADOS_FACTURACION_TOOL = 'freematica_list_resultados_facturacion';
13
+ // ---------------------------------------------------------------------------
14
+ // Descriptions
15
+ // ---------------------------------------------------------------------------
16
+ const LIST_ALBARANES_VENTAS_DESCRIPTION = [
17
+ 'Devuelve la lista paginada de albaranes de ventas de Freemática.',
18
+ '',
19
+ 'Cada item contiene campos con prefijo ALVC_* (cabecera) y ALVL_* (líneas).',
20
+ 'Campos destacados: ALVC_CODEMP (empresa), ALVC_DELEG (delegación),',
21
+ 'ALVC_CODCLI (cliente), ALVC_CODDOC (código documento), ALVC_NUMDOC (número),',
22
+ 'ALVC_FCHDOC (fecha), ALVC_SERIEFRA (serie factura), ALVC_IND_NOFAC (no facturar),',
23
+ 'ALVC_FPAGO (forma pago), más `idReg` opaco para el endpoint singular.',
24
+ '',
25
+ 'Los filtros principales (empresa, delegacion, codCliente, codDocumento, fechaDesde,',
26
+ 'fechaHasta) se envían como query params NATIVOS del endpoint (no FIQL).',
27
+ 'El campo `empresa` es requerido por el endpoint de Freemática.',
28
+ '',
29
+ 'Paginación 1-indexed.',
30
+ ].join('\n');
31
+ const GET_ALBARAN_VENTA_DESCRIPTION = [
32
+ 'Devuelve el detalle completo de un albarán de venta.',
33
+ '',
34
+ 'El parámetro `id` DEBE ser el campo `idReg` (string opaco base64) que aparece en',
35
+ 'los items de freematica_list_albaranes_ventas. NO usar ALVC_NUMDOC ni otro código natural.',
36
+ ].join('\n');
37
+ const LIST_ALBARANES_FACTURA_DESCRIPTION = [
38
+ 'Devuelve la lista paginada de vinculaciones albarán↔factura de Freemática.',
39
+ '',
40
+ 'Cada item contiene campos con prefijo FVCA_*: FVCA_CODEMP (empresa),',
41
+ 'FVCA_SERIEFRA (serie factura), FVCA_NUMFRA (número factura), FVCA_CODCLI (cliente),',
42
+ 'FVCA_NUMALB (número albarán), FVCA_FCHALB (fecha albarán), FVCA_FCHFAC (fecha factura),',
43
+ 'FVCA_NUMPED (número pedido), FVCA_CODDOC (código documento), más `idReg` opaco.',
44
+ '',
45
+ 'El filtro `idReg` es un query param nativo. Los filtros empresa, serie, numFactura',
46
+ 'y codCliente se envían como FIQL en el parámetro rQuery.',
47
+ '',
48
+ 'Casos de uso principales:',
49
+ ' - Buscar qué facturas incluyen un albarán determinado (filtrar por FVCA_NUMALB vía rQuery)',
50
+ ' - Listar todos los albaranes vinculados a una factura (filtrar por numFactura + serie)',
51
+ '',
52
+ 'Paginación 1-indexed.',
53
+ ].join('\n');
54
+ const GET_ALBARAN_FACTURA_DESCRIPTION = [
55
+ 'Devuelve el detalle completo de un registro de vinculación albarán↔factura.',
56
+ '',
57
+ 'El parámetro `id` DEBE ser el campo `idReg` (string opaco base64) que aparece en',
58
+ 'los items de freematica_list_albaranes_factura. NO usar FVCA_NUMFRA ni otro código natural.',
59
+ ].join('\n');
60
+ const LIST_RESULTADOS_FACTURACION_DESCRIPTION = [
61
+ 'Devuelve los resultados del proceso batch de facturación automática de vigilancia.',
62
+ '',
63
+ 'Cada item contiene campos con prefijo FACT_*: FACT_EMP (empresa), FACT_DELEG (delegación),',
64
+ 'FACT_CAL (año calendario), FACT_MES (mes), FACT_CTRT (contrato), FACT_SERV (servicio),',
65
+ 'FACT_TIPFAC (tipo facturación), FACT_COD_CLI (cliente), FACT_TRASP (estado traspaso),',
66
+ 'FACT_NUMDOC (documento generado), FACT_IMP_BASE (importe base), FACT_IMPF (importe final),',
67
+ 'y múltiples campos de horas (FACT_HHD, FACT_HHF, FACT_HHG, FACT_HHN, etc.).',
68
+ '',
69
+ 'Todos los filtros se envían como FIQL en el parámetro rquery.',
70
+ '',
71
+ 'Paginación 1-indexed. El param `order` es nativo del endpoint.',
72
+ ].join('\n');
73
+ // ---------------------------------------------------------------------------
74
+ // Register function
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Registra las tools de albaranes en el servidor MCP.
78
+ *
79
+ * Tools registradas:
80
+ * - `freematica_list_albaranes_ventas`: lista paginada de albaranes de ventas.
81
+ * - `freematica_get_albaran_venta`: detalle de un albarán de venta por idReg.
82
+ * - `freematica_list_albaranes_factura`: lista de vinculaciones albarán↔factura.
83
+ * - `freematica_get_albaran_factura`: detalle de una vinculación por idReg.
84
+ * - `freematica_list_resultados_facturacion`: resultados batch facturación vigilancia.
85
+ *
86
+ * @param server - Instancia del servidor MCP.
87
+ * @param client - Cliente Freemática autenticado.
88
+ */
89
+ export function registerAlbaranesTools(server, client) {
90
+ // -------------------------------------------------------------------------
91
+ // freematica_list_albaranes_ventas
92
+ // -------------------------------------------------------------------------
93
+ server.tool(LIST_ALBARANES_VENTAS_TOOL, LIST_ALBARANES_VENTAS_DESCRIPTION, ListAlbaranesVentasFiltersSchema, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ page, items, empresa, delegacion, codCliente, codDocumento, fechaDesde, fechaHasta, order, }) => {
94
+ try {
95
+ const result = await client.listAlbaranesVentas({
96
+ page,
97
+ items,
98
+ empresa,
99
+ delegacion,
100
+ codCliente,
101
+ codDocumento,
102
+ fechaDesde,
103
+ fechaHasta,
104
+ order,
105
+ });
106
+ return okList({ items: result.items, total: result.total, page, itemsPerPage: items });
107
+ }
108
+ catch (err) {
109
+ if (err instanceof FreematicaError)
110
+ return error(err);
111
+ return error(err instanceof Error ? err : new Error(String(err)));
112
+ }
113
+ });
114
+ // -------------------------------------------------------------------------
115
+ // freematica_get_albaran_venta
116
+ // -------------------------------------------------------------------------
117
+ server.tool(GET_ALBARAN_VENTA_TOOL, GET_ALBARAN_VENTA_DESCRIPTION, {
118
+ id: z
119
+ .string()
120
+ .min(1)
121
+ .describe('idReg opaco del albarán de venta (campo "idReg" en los items de freematica_list_albaranes_ventas).'),
122
+ }, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ id }) => {
123
+ try {
124
+ const albaran = await client.getAlbaranVenta(id);
125
+ return ok(albaran);
126
+ }
127
+ catch (err) {
128
+ if (err instanceof FreematicaError)
129
+ return error(err);
130
+ return error(err instanceof Error ? err : new Error(String(err)));
131
+ }
132
+ });
133
+ // -------------------------------------------------------------------------
134
+ // freematica_list_albaranes_factura
135
+ // -------------------------------------------------------------------------
136
+ server.tool(LIST_ALBARANES_FACTURA_TOOL, LIST_ALBARANES_FACTURA_DESCRIPTION, ListAlbaranesFacturaFiltersSchema, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ page, items, idReg, empresa, serie, numFactura, codCliente, }) => {
137
+ try {
138
+ const result = await client.listAlbaranesFactura({
139
+ page,
140
+ items,
141
+ idReg,
142
+ empresa,
143
+ serie,
144
+ numFactura,
145
+ codCliente,
146
+ });
147
+ return okList({ items: result.items, total: result.total, page, itemsPerPage: items });
148
+ }
149
+ catch (err) {
150
+ if (err instanceof FreematicaError)
151
+ return error(err);
152
+ return error(err instanceof Error ? err : new Error(String(err)));
153
+ }
154
+ });
155
+ // -------------------------------------------------------------------------
156
+ // freematica_get_albaran_factura
157
+ // -------------------------------------------------------------------------
158
+ server.tool(GET_ALBARAN_FACTURA_TOOL, GET_ALBARAN_FACTURA_DESCRIPTION, {
159
+ id: z
160
+ .string()
161
+ .min(1)
162
+ .describe('idReg opaco del registro albarán-factura (campo "idReg" en los items de freematica_list_albaranes_factura).'),
163
+ }, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ id }) => {
164
+ try {
165
+ const albaran = await client.getAlbaranFactura(id);
166
+ return ok(albaran);
167
+ }
168
+ catch (err) {
169
+ if (err instanceof FreematicaError)
170
+ return error(err);
171
+ return error(err instanceof Error ? err : new Error(String(err)));
172
+ }
173
+ });
174
+ // -------------------------------------------------------------------------
175
+ // freematica_list_resultados_facturacion
176
+ // -------------------------------------------------------------------------
177
+ server.tool(LIST_RESULTADOS_FACTURACION_TOOL, LIST_RESULTADOS_FACTURACION_DESCRIPTION, ListResultadosFacturacionFiltersSchema, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ page, items, empresa, delegacion, codCliente, calendario, mes, contrato, servicio, tipoFac, traspasado, order, }) => {
178
+ try {
179
+ const result = await client.listResultadosFacturacion({
180
+ page,
181
+ items,
182
+ empresa,
183
+ delegacion,
184
+ codCliente,
185
+ calendario,
186
+ mes,
187
+ contrato,
188
+ servicio,
189
+ tipoFac,
190
+ traspasado,
191
+ order,
192
+ });
193
+ return okList({ items: result.items, total: result.total, page, itemsPerPage: items });
194
+ }
195
+ catch (err) {
196
+ if (err instanceof FreematicaError)
197
+ return error(err);
198
+ return error(err instanceof Error ? err : new Error(String(err)));
199
+ }
200
+ });
201
+ }
202
+ //# sourceMappingURL=albaranes.js.map