@nubiia/mcp-freematica 0.8.0 → 0.9.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/README.md +12 -7
- package/dist/clients/fiql-builder.d.ts +32 -8
- package/dist/clients/fiql-builder.js +42 -14
- package/dist/clients/fiql-builder.js.map +1 -1
- package/dist/clients/freematica-client.d.ts +92 -35
- package/dist/clients/freematica-client.js +251 -98
- package/dist/clients/freematica-client.js.map +1 -1
- package/dist/schemas/cartera.d.ts +7 -5
- package/dist/schemas/cartera.js +13 -11
- package/dist/schemas/cartera.js.map +1 -1
- package/dist/schemas/facturas-ventas.d.ts +20 -16
- package/dist/schemas/facturas-ventas.js +36 -32
- package/dist/schemas/facturas-ventas.js.map +1 -1
- package/dist/schemas/pedidos-compras.d.ts +8 -6
- package/dist/schemas/pedidos-compras.js +8 -6
- package/dist/schemas/pedidos-compras.js.map +1 -1
- package/dist/server-instructions.js +19 -0
- package/dist/server-instructions.js.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/articulos.d.ts +14 -0
- package/dist/tools/articulos.js +183 -0
- package/dist/tools/articulos.js.map +1 -0
- package/dist/tools/cartera.js +2 -2
- package/dist/tools/cartera.js.map +1 -1
- package/dist/tools/contabilidad.js +7 -7
- package/dist/tools/contabilidad.js.map +1 -1
- package/dist/tools/facturas-ventas.js +12 -12
- package/dist/tools/facturas-ventas.js.map +1 -1
- package/dist/tools/localizaciones.d.ts +1 -1
- package/dist/tools/localizaciones.js +3 -12
- package/dist/tools/localizaciones.js.map +1 -1
- package/dist/tools/personal.js +13 -17
- package/dist/tools/personal.js.map +1 -1
- package/dist/tools/prl.js +15 -49
- package/dist/tools/prl.js.map +1 -1
- package/dist/tools/proveedores.d.ts +2 -2
- package/dist/tools/proveedores.js +8 -6
- package/dist/tools/proveedores.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,6 +20,9 @@ MCP server que expone operaciones del API REST de Freemática (ERP: facturación
|
|
|
20
20
|
|
|
21
21
|
| Tool | Endpoint Freemática | Descripción |
|
|
22
22
|
| ---------------------------------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `freematica_list_articulos` | `GET /part/v1/articulos` | Catálogo de artículos/materiales/consumibles (referencias, familias, proveedores) |
|
|
24
|
+
| `freematica_get_articulo` | `GET /part/v1/articulos/{idreg}` | Detalle de un artículo |
|
|
25
|
+
| `freematica_get_precio_articulo` | `GET /pgrl/v1/precio-articulo/{idreg}` | Precios de venta de un artículo (PRECIO_VENTA, DESCUENTO, FACTURABLE) |
|
|
23
26
|
| `freematica_list_materiales_asignados_servicios` | `GET /pvss/v2/contratos-servicios-material` | Lista de material asignado a servicios |
|
|
24
27
|
| `freematica_get_master_data` | (24 endpoints según `catalog`) | Devuelve un catálogo de datos maestros (tipos, geográficos, organizativos, inventario, financiero) |
|
|
25
28
|
| `freematica_list_clientes` | `GET /pgrl/v2/clientes` | Lista paginada de clientes |
|
|
@@ -31,7 +34,7 @@ MCP server que expone operaciones del API REST de Freemática (ERP: facturación
|
|
|
31
34
|
| `freematica_get_ficha_prev_cliente` | `GET /pprl/v2/ficha-prev-cliente` | Ficha PRL de un cliente |
|
|
32
35
|
| `freematica_list_vigilancia_salud` | `GET /pprl/v1/vigilancia-salud` | Lista paginada de registros de Vigilancia de la Salud |
|
|
33
36
|
| `freematica_get_vigilancia_salud` | `GET /pprl/v1/vigilancia-salud/{idreg}` | Detalle de un registro de Vigilancia de la Salud |
|
|
34
|
-
| `freematica_list_personal` | `GET /pers/
|
|
37
|
+
| `freematica_list_personal` | `GET /pers/v1/personal` | Lista paginada de personas (RRHH) |
|
|
35
38
|
| `freematica_get_persona` | `GET /pers/v2/personal/{idreg}` | Detalle de una persona |
|
|
36
39
|
| `freematica_list_calendarios` | `GET /pgrl/v1/calendarios` | Lista paginada de calendarios laborales |
|
|
37
40
|
| `freematica_list_calendario_periodos` | `GET /pgrl/v1/calendarios/{idreg}/periodos` | Periodos de un calendario laboral |
|
|
@@ -105,8 +108,8 @@ freematica_list_cartera_clientes({
|
|
|
105
108
|
estado: 'pendiente',
|
|
106
109
|
});
|
|
107
110
|
|
|
108
|
-
// El MCP construye internamente:
|
|
109
|
-
// rquery=CARCL_EMP==0001;CARCL_FECDOC=ge=2026-01-01;CARCL_SITCAR==1
|
|
111
|
+
// El MCP construye internamente (valores siempre entre comillas simples):
|
|
112
|
+
// rquery=CARCL_EMP=='0001';CARCL_FECDOC=ge='2026-01-01';CARCL_SITCAR=='1'
|
|
110
113
|
```
|
|
111
114
|
|
|
112
115
|
### Ventajas del patrón
|
|
@@ -124,14 +127,16 @@ freematica_list_facturas_cabecera({
|
|
|
124
127
|
empresa: '0001',
|
|
125
128
|
traspasadoContabilidad: false,
|
|
126
129
|
});
|
|
127
|
-
// → rquery=
|
|
130
|
+
// → rquery=FVC_CODEMP=='0001';FVC_TRASP_CONTAB=='0'
|
|
128
131
|
|
|
129
|
-
//
|
|
132
|
+
// Proveedor por nombre EXACTO (el API no soporta búsqueda parcial: =lk=
|
|
133
|
+
// responde 400 y los wildcards % devuelven 0 resultados). El filtro activo
|
|
134
|
+
// de proveedores post-filtra las bajas en cliente (FIQL no tiene IS NULL):
|
|
130
135
|
freematica_list_proveedores({
|
|
131
|
-
nombre: '
|
|
136
|
+
nombre: 'LEJIAS PONS S.A.',
|
|
132
137
|
activo: true,
|
|
133
138
|
});
|
|
134
|
-
// → rquery=NOMBRE_PRO
|
|
139
|
+
// → rquery=NOMBRE_PRO=='LEJIAS PONS S.A.'
|
|
135
140
|
```
|
|
136
141
|
|
|
137
142
|
## Modos de transporte
|
|
@@ -15,11 +15,29 @@
|
|
|
15
15
|
* - `;` AND (combina expresiones)
|
|
16
16
|
* - `,` OR (combina expresiones)
|
|
17
17
|
*
|
|
18
|
+
* Quoting de valores: TODOS los valores escalares se emiten entre comillas
|
|
19
|
+
* simples (`CAMPO=='valor'`). El API de Freemática lo exige para columnas de
|
|
20
|
+
* texto y fecha (sin comillas responde 400 "Error al ejecutar sentencia" o
|
|
21
|
+
* ignora el filtro silenciosamente) y lo acepta también en columnas
|
|
22
|
+
* numéricas. Verificado empíricamente contra /pers/v1/personal,
|
|
23
|
+
* /part/v1/articulos, /pcon/v2/cuentas, /pven/v1/facturas-cabecera,
|
|
24
|
+
* /pcar/v1/cartera-clientes y /pgrl/v2/proveedores.
|
|
25
|
+
*
|
|
18
26
|
* Caracteres que requieren escape en valores FIQL:
|
|
19
|
-
* `;` `,` `(` `)` `"` `'`
|
|
27
|
+
* `;` `,` `(` `)` `"` `'` → percent-encoding (%3B, %2C, %28, %29, %22, %27)
|
|
20
28
|
* `=` → %3D (evita ambigüedad con operadores FIQL del tipo `=op=`)
|
|
21
29
|
* `!` → %21 (evita ambigüedad con el operador `!=`)
|
|
22
30
|
* El `==` en un valor se convierte en `%3D%3D` automáticamente.
|
|
31
|
+
* El espacio NO se escapea: dentro de comillas simples el API lo acepta
|
|
32
|
+
* tal cual, y percent-encodearlo rompe el match (doble encoding al pasar
|
|
33
|
+
* la FIQL por URLSearchParams).
|
|
34
|
+
*
|
|
35
|
+
* LIMITACIÓN CONOCIDA: los valores que contienen caracteres reservados
|
|
36
|
+
* (comas, apóstrofes, paréntesis…) viajan percent-encoded dentro del quoting
|
|
37
|
+
* y el servidor los compara literalmente, así que un filtro por un valor con
|
|
38
|
+
* esos caracteres puede devolver 0 resultados (verificado con comas en
|
|
39
|
+
* DESC_ART; sin datos con apóstrofes para verificar alternativas). El escape
|
|
40
|
+
* se mantiene porque no escaparlos rompería la gramática FIQL (inyección).
|
|
23
41
|
*/
|
|
24
42
|
/**
|
|
25
43
|
* Operadores escalares soportados.
|
|
@@ -62,19 +80,19 @@ export type FiqlFilters = FiqlGroup | {
|
|
|
62
80
|
* **Grupo plano** (se unen con AND):
|
|
63
81
|
* ```ts
|
|
64
82
|
* buildFiql({ COD_CLI: '123', ESTADO: 'activo' })
|
|
65
|
-
* // →
|
|
83
|
+
* // → "COD_CLI=='123';ESTADO=='activo'"
|
|
66
84
|
* ```
|
|
67
85
|
*
|
|
68
86
|
* **Operador explícito**:
|
|
69
87
|
* ```ts
|
|
70
88
|
* buildFiql({ IMPORTE: { op: 'gt', value: 1000 } })
|
|
71
|
-
* // →
|
|
89
|
+
* // → "IMPORTE=gt='1000'"
|
|
72
90
|
* ```
|
|
73
91
|
*
|
|
74
92
|
* **Operador IN con array**:
|
|
75
93
|
* ```ts
|
|
76
94
|
* buildFiql({ COD_CLI: { op: 'in', value: ['A1', 'A2'] } })
|
|
77
|
-
* // →
|
|
95
|
+
* // → "COD_CLI=in=('A1','A2')"
|
|
78
96
|
* ```
|
|
79
97
|
*
|
|
80
98
|
* **Composición AND/OR**:
|
|
@@ -82,19 +100,25 @@ export type FiqlFilters = FiqlGroup | {
|
|
|
82
100
|
* buildFiql({
|
|
83
101
|
* and: [{ EMPRESA: '1' }, { DELEGACION: 'MAD' }],
|
|
84
102
|
* })
|
|
85
|
-
* // →
|
|
103
|
+
* // → "EMPRESA=='1';DELEGACION=='MAD'"
|
|
86
104
|
*
|
|
87
105
|
* buildFiql({
|
|
88
106
|
* or: [{ ESTADO: 'activo' }, { ESTADO: 'pendiente' }],
|
|
89
107
|
* })
|
|
90
|
-
* // →
|
|
108
|
+
* // → "ESTADO=='activo',ESTADO=='pendiente'"
|
|
91
109
|
* ```
|
|
92
110
|
*
|
|
111
|
+
* AVISO: la composición OR (`,`) responde 400 en los endpoints probados del
|
|
112
|
+
* API real (pers, part); para expresar "uno de varios valores" usar el
|
|
113
|
+
* operador `in`, que sí está soportado.
|
|
114
|
+
*
|
|
93
115
|
* ### Reglas
|
|
116
|
+
* - Todos los valores escalares se emiten entre comillas simples.
|
|
94
117
|
* - Los valores `undefined` se omiten silenciosamente.
|
|
95
118
|
* - Si todos los filtros son `undefined` o el objeto está vacío → retorna `""`.
|
|
96
|
-
* - Los caracteres reservados FIQL (`;`, `,`, `(`, `)`, `"`, `'`,
|
|
97
|
-
* en los valores se percent-encodean automáticamente.
|
|
119
|
+
* - Los caracteres reservados FIQL (`;`, `,`, `(`, `)`, `"`, `'`, `=`, `!`)
|
|
120
|
+
* en los valores se percent-encodean automáticamente. El espacio va tal
|
|
121
|
+
* cual (protegido por el quoting).
|
|
98
122
|
* - Las claves `and`/`or` sólo activan composición si su valor es un `Array`.
|
|
99
123
|
* Si el valor es un string, number u otro tipo primitivo, se tratan como
|
|
100
124
|
* nombres de campo ordinarios (ej. `{ and: 'val' }` → `AND==val`).
|
|
@@ -15,11 +15,29 @@
|
|
|
15
15
|
* - `;` AND (combina expresiones)
|
|
16
16
|
* - `,` OR (combina expresiones)
|
|
17
17
|
*
|
|
18
|
+
* Quoting de valores: TODOS los valores escalares se emiten entre comillas
|
|
19
|
+
* simples (`CAMPO=='valor'`). El API de Freemática lo exige para columnas de
|
|
20
|
+
* texto y fecha (sin comillas responde 400 "Error al ejecutar sentencia" o
|
|
21
|
+
* ignora el filtro silenciosamente) y lo acepta también en columnas
|
|
22
|
+
* numéricas. Verificado empíricamente contra /pers/v1/personal,
|
|
23
|
+
* /part/v1/articulos, /pcon/v2/cuentas, /pven/v1/facturas-cabecera,
|
|
24
|
+
* /pcar/v1/cartera-clientes y /pgrl/v2/proveedores.
|
|
25
|
+
*
|
|
18
26
|
* Caracteres que requieren escape en valores FIQL:
|
|
19
|
-
* `;` `,` `(` `)` `"` `'`
|
|
27
|
+
* `;` `,` `(` `)` `"` `'` → percent-encoding (%3B, %2C, %28, %29, %22, %27)
|
|
20
28
|
* `=` → %3D (evita ambigüedad con operadores FIQL del tipo `=op=`)
|
|
21
29
|
* `!` → %21 (evita ambigüedad con el operador `!=`)
|
|
22
30
|
* El `==` en un valor se convierte en `%3D%3D` automáticamente.
|
|
31
|
+
* El espacio NO se escapea: dentro de comillas simples el API lo acepta
|
|
32
|
+
* tal cual, y percent-encodearlo rompe el match (doble encoding al pasar
|
|
33
|
+
* la FIQL por URLSearchParams).
|
|
34
|
+
*
|
|
35
|
+
* LIMITACIÓN CONOCIDA: los valores que contienen caracteres reservados
|
|
36
|
+
* (comas, apóstrofes, paréntesis…) viajan percent-encoded dentro del quoting
|
|
37
|
+
* y el servidor los compara literalmente, así que un filtro por un valor con
|
|
38
|
+
* esos caracteres puede devolver 0 resultados (verificado con comas en
|
|
39
|
+
* DESC_ART; sin datos con apóstrofes para verificar alternativas). El escape
|
|
40
|
+
* se mantiene porque no escaparlos rompería la gramática FIQL (inyección).
|
|
23
41
|
*/
|
|
24
42
|
// ---------------------------------------------------------------------------
|
|
25
43
|
// Internals
|
|
@@ -47,7 +65,7 @@ const OP_MAP = {
|
|
|
47
65
|
* `CAMPO==x=gt=0` → parser puede interpretar `x=gt=0` como sub-operador
|
|
48
66
|
* `CAMPO==123==EVIL` → parser puede ver un doble operador
|
|
49
67
|
*/
|
|
50
|
-
const FIQL_RESERVED_RE = /[;,()"'
|
|
68
|
+
const FIQL_RESERVED_RE = /[;,()"'=!]/g;
|
|
51
69
|
const RESERVED_ENCODE_MAP = {
|
|
52
70
|
';': '%3B',
|
|
53
71
|
',': '%2C',
|
|
@@ -55,7 +73,6 @@ const RESERVED_ENCODE_MAP = {
|
|
|
55
73
|
')': '%29',
|
|
56
74
|
'"': '%22',
|
|
57
75
|
"'": '%27',
|
|
58
|
-
' ': '%20',
|
|
59
76
|
'=': '%3D',
|
|
60
77
|
'!': '%21',
|
|
61
78
|
};
|
|
@@ -73,13 +90,18 @@ function escapeFiqlValue(raw) {
|
|
|
73
90
|
return raw.replace(FIQL_RESERVED_RE, (ch) => RESERVED_ENCODE_MAP[ch] ?? ch);
|
|
74
91
|
}
|
|
75
92
|
/**
|
|
76
|
-
* Convierte un valor primitivo a string FIQL escapado.
|
|
93
|
+
* Convierte un valor primitivo a string FIQL escapado y quoted.
|
|
94
|
+
*
|
|
95
|
+
* El valor SIEMPRE va entre comillas simples: es el formato que exige el
|
|
96
|
+
* API de Freemática para columnas de texto/fecha y que acepta también en
|
|
97
|
+
* columnas numéricas. Las comillas simples internas van percent-encoded
|
|
98
|
+
* (%27) para que no puedan cerrar el quoting.
|
|
77
99
|
*
|
|
78
100
|
* @param val - Primitivo (`string | number | boolean`).
|
|
79
|
-
* @returns Representación FIQL del valor.
|
|
101
|
+
* @returns Representación FIQL del valor (ej. `'123'`).
|
|
80
102
|
*/
|
|
81
103
|
function primitiveToFiql(val) {
|
|
82
|
-
return escapeFiqlValue(String(val))
|
|
104
|
+
return `'${escapeFiqlValue(String(val))}'`;
|
|
83
105
|
}
|
|
84
106
|
/**
|
|
85
107
|
* Genera una expresión FIQL simple para `campo operador valor`.
|
|
@@ -97,7 +119,7 @@ function buildExpression(key, fiqlValue) {
|
|
|
97
119
|
const arr = Array.isArray(value) ? value : [value];
|
|
98
120
|
if (arr.length === 0)
|
|
99
121
|
return '';
|
|
100
|
-
const encoded = arr.map((v) =>
|
|
122
|
+
const encoded = arr.map((v) => primitiveToFiql(v)).join(',');
|
|
101
123
|
return `${key}${fiqlOp}(${encoded})`;
|
|
102
124
|
}
|
|
103
125
|
const scalar = Array.isArray(value) ? value[0] : value;
|
|
@@ -167,19 +189,19 @@ function isComposition(filters) {
|
|
|
167
189
|
* **Grupo plano** (se unen con AND):
|
|
168
190
|
* ```ts
|
|
169
191
|
* buildFiql({ COD_CLI: '123', ESTADO: 'activo' })
|
|
170
|
-
* // →
|
|
192
|
+
* // → "COD_CLI=='123';ESTADO=='activo'"
|
|
171
193
|
* ```
|
|
172
194
|
*
|
|
173
195
|
* **Operador explícito**:
|
|
174
196
|
* ```ts
|
|
175
197
|
* buildFiql({ IMPORTE: { op: 'gt', value: 1000 } })
|
|
176
|
-
* // →
|
|
198
|
+
* // → "IMPORTE=gt='1000'"
|
|
177
199
|
* ```
|
|
178
200
|
*
|
|
179
201
|
* **Operador IN con array**:
|
|
180
202
|
* ```ts
|
|
181
203
|
* buildFiql({ COD_CLI: { op: 'in', value: ['A1', 'A2'] } })
|
|
182
|
-
* // →
|
|
204
|
+
* // → "COD_CLI=in=('A1','A2')"
|
|
183
205
|
* ```
|
|
184
206
|
*
|
|
185
207
|
* **Composición AND/OR**:
|
|
@@ -187,19 +209,25 @@ function isComposition(filters) {
|
|
|
187
209
|
* buildFiql({
|
|
188
210
|
* and: [{ EMPRESA: '1' }, { DELEGACION: 'MAD' }],
|
|
189
211
|
* })
|
|
190
|
-
* // →
|
|
212
|
+
* // → "EMPRESA=='1';DELEGACION=='MAD'"
|
|
191
213
|
*
|
|
192
214
|
* buildFiql({
|
|
193
215
|
* or: [{ ESTADO: 'activo' }, { ESTADO: 'pendiente' }],
|
|
194
216
|
* })
|
|
195
|
-
* // →
|
|
217
|
+
* // → "ESTADO=='activo',ESTADO=='pendiente'"
|
|
196
218
|
* ```
|
|
197
219
|
*
|
|
220
|
+
* AVISO: la composición OR (`,`) responde 400 en los endpoints probados del
|
|
221
|
+
* API real (pers, part); para expresar "uno de varios valores" usar el
|
|
222
|
+
* operador `in`, que sí está soportado.
|
|
223
|
+
*
|
|
198
224
|
* ### Reglas
|
|
225
|
+
* - Todos los valores escalares se emiten entre comillas simples.
|
|
199
226
|
* - Los valores `undefined` se omiten silenciosamente.
|
|
200
227
|
* - Si todos los filtros son `undefined` o el objeto está vacío → retorna `""`.
|
|
201
|
-
* - Los caracteres reservados FIQL (`;`, `,`, `(`, `)`, `"`, `'`,
|
|
202
|
-
* en los valores se percent-encodean automáticamente.
|
|
228
|
+
* - Los caracteres reservados FIQL (`;`, `,`, `(`, `)`, `"`, `'`, `=`, `!`)
|
|
229
|
+
* en los valores se percent-encodean automáticamente. El espacio va tal
|
|
230
|
+
* cual (protegido por el quoting).
|
|
203
231
|
* - Las claves `and`/`or` sólo activan composición si su valor es un `Array`.
|
|
204
232
|
* Si el valor es un string, number u otro tipo primitivo, se tratan como
|
|
205
233
|
* nombres de campo ordinarios (ej. `{ and: 'val' }` → `AND==val`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fiql-builder.js","sourceRoot":"","sources":["../../src/clients/fiql-builder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fiql-builder.js","sourceRoot":"","sources":["../../src/clients/fiql-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,64 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
37
37
|
* Endpoint: GET /pvss/v2/contratos-servicios-material
|
|
38
38
|
*/
|
|
39
39
|
getMaterialesAsignadosServicios(): Promise<ListResult<VoContratosServMatAsignado>>;
|
|
40
|
+
/**
|
|
41
|
+
* Lista paginada de artículos del catálogo de inventario.
|
|
42
|
+
*
|
|
43
|
+
* Endpoint: GET /part/v1/articulos
|
|
44
|
+
*
|
|
45
|
+
* Todos los filtros son de coincidencia EXACTA (el endpoint no soporta
|
|
46
|
+
* búsqueda parcial: =lk= responde 400 y los wildcards % devuelven 0
|
|
47
|
+
* resultados — verificado contra el API real). OJO: COD_ARTICULO puede
|
|
48
|
+
* llevar espacios iniciales en Freemática (ej. " QQ10615") que forman
|
|
49
|
+
* parte del código.
|
|
50
|
+
*
|
|
51
|
+
* El filtro `activo` mapea a MOTIVO_BAJA (columna de texto — las columnas
|
|
52
|
+
* de fecha no permiten comparar con vacío):
|
|
53
|
+
* - `true` → MOTIVO_BAJA=='' (sin motivo de baja).
|
|
54
|
+
* - `false` → MOTIVO_BAJA!='' (con motivo de baja).
|
|
55
|
+
* Los artículos con MOTIVO_BAJA nulo (≈36 de 6304 en producción) no
|
|
56
|
+
* matchean ninguno de los dos valores.
|
|
57
|
+
*
|
|
58
|
+
* @param opts - Paginación y filtros opcionales.
|
|
59
|
+
* @returns Lista paginada de artículos (cada item incluye `idReg`).
|
|
60
|
+
*/
|
|
61
|
+
listArticulos(opts: {
|
|
62
|
+
page?: number;
|
|
63
|
+
items?: number;
|
|
64
|
+
codArticulo?: string;
|
|
65
|
+
tipoCodigo?: string;
|
|
66
|
+
codProveedor?: string;
|
|
67
|
+
linea?: string;
|
|
68
|
+
familia?: string;
|
|
69
|
+
subfamilia?: string;
|
|
70
|
+
descripcion?: string;
|
|
71
|
+
codigoBarras?: string;
|
|
72
|
+
activo?: boolean;
|
|
73
|
+
}): Promise<ListResult<Record<string, unknown>>>;
|
|
74
|
+
/**
|
|
75
|
+
* Detalle de un artículo por `idReg` opaco.
|
|
76
|
+
*
|
|
77
|
+
* Endpoint: GET /part/v1/articulos/{idreg}
|
|
78
|
+
*
|
|
79
|
+
* El API devuelve un envelope de LISTA con un único item (verificado contra
|
|
80
|
+
* el API real), no un objeto detalle; este método lo desenvuelve.
|
|
81
|
+
*
|
|
82
|
+
* @param idReg - Identificador opaco (base64) del artículo.
|
|
83
|
+
* @returns Objeto con todos los campos del artículo.
|
|
84
|
+
*/
|
|
85
|
+
getArticulo(idReg: string): Promise<Record<string, unknown>>;
|
|
86
|
+
/**
|
|
87
|
+
* Precios de venta de un artículo por `idReg` opaco.
|
|
88
|
+
*
|
|
89
|
+
* Endpoint: GET /pgrl/v1/precio-articulo/{idreg}
|
|
90
|
+
*
|
|
91
|
+
* Devuelve un objeto con PRECIO_VENTA, DESCUENTO y FACTURABLE.
|
|
92
|
+
*
|
|
93
|
+
* @param idReg - Identificador opaco (base64) del artículo (el mismo que
|
|
94
|
+
* devuelve freematica_list_articulos).
|
|
95
|
+
* @returns Objeto de precios del artículo.
|
|
96
|
+
*/
|
|
97
|
+
getPrecioArticulo(idReg: string): Promise<Record<string, unknown>>;
|
|
40
98
|
/**
|
|
41
99
|
* Obtener un catálogo de datos maestros.
|
|
42
100
|
*/
|
|
@@ -102,23 +160,13 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
102
160
|
*
|
|
103
161
|
* Endpoint: GET /pprl/v1/vigilancia-salud
|
|
104
162
|
*
|
|
105
|
-
*
|
|
106
|
-
* codifican en FIQL y se envían como `rquery`.
|
|
107
|
-
*
|
|
108
|
-
* @param opts - Opciones de paginación y filtrado.
|
|
163
|
+
* @param opts - Paginación y filtro opcional idRegPersona.
|
|
109
164
|
* @returns Lista paginada de registros VS.
|
|
110
165
|
*/
|
|
111
166
|
listVigilanciaSalud(opts: {
|
|
112
167
|
page?: number;
|
|
113
168
|
items?: number;
|
|
114
169
|
idRegPersona?: string;
|
|
115
|
-
empresa?: string;
|
|
116
|
-
delegacion?: string;
|
|
117
|
-
codPersona?: string;
|
|
118
|
-
tipoRevision?: string;
|
|
119
|
-
resultado?: string;
|
|
120
|
-
fechaCitaDesde?: string;
|
|
121
|
-
fechaCitaHasta?: string;
|
|
122
170
|
}): Promise<ListResult<Record<string, unknown>>>;
|
|
123
171
|
/**
|
|
124
172
|
* Lista de cuentas analíticas.
|
|
@@ -140,12 +188,11 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
140
188
|
/**
|
|
141
189
|
* Lista paginada de personas (empleados) con filtros FIQL opcionales.
|
|
142
190
|
*
|
|
143
|
-
* Endpoint: GET /pers/
|
|
191
|
+
* Endpoint: GET /pers/v1/personal
|
|
144
192
|
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* para estos campos).
|
|
193
|
+
* Todos los filtros son de coincidencia EXACTA: el endpoint no soporta
|
|
194
|
+
* búsqueda parcial (=lk= responde 400 y los wildcards % / * devuelven 0
|
|
195
|
+
* resultados — verificado contra el API real).
|
|
149
196
|
*
|
|
150
197
|
* @param opts - Opciones de paginación y filtrado.
|
|
151
198
|
* @returns Lista paginada de personas.
|
|
@@ -162,14 +209,18 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
162
209
|
situacion?: string;
|
|
163
210
|
departamento?: string;
|
|
164
211
|
seccion?: string;
|
|
165
|
-
activo?: boolean;
|
|
166
212
|
}): Promise<ListResult<Record<string, unknown>>>;
|
|
167
213
|
/**
|
|
168
|
-
* Detalle de una persona por `idReg` opaco.
|
|
214
|
+
* Detalle de una persona por su `idReg` opaco.
|
|
169
215
|
*
|
|
170
|
-
* Endpoint: GET /pers/
|
|
216
|
+
* Endpoint: GET /pers/v1/personal/{idreg}
|
|
171
217
|
*
|
|
172
|
-
*
|
|
218
|
+
* v1, igual que el listado: garantiza que todo idReg devuelto por
|
|
219
|
+
* freematica_list_personal funciona aquí (la vista v2 es un subconjunto
|
|
220
|
+
* de sincronización incremental). El API devuelve un envelope de LISTA
|
|
221
|
+
* con un único item (verificado contra el API real); se desenvuelve.
|
|
222
|
+
*
|
|
223
|
+
* @param idReg - Identificador opaco (base64) de la persona.
|
|
173
224
|
* @returns Objeto con todos los campos de la persona.
|
|
174
225
|
*/
|
|
175
226
|
getPersona(idReg: string): Promise<Record<string, unknown>>;
|
|
@@ -238,12 +289,11 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
238
289
|
* Construye la FIQL a partir de los filtros tipados y la añade como `rquery`
|
|
239
290
|
* usando `appendRquery()` (patrón canónico del foundation TD-117).
|
|
240
291
|
*
|
|
241
|
-
* El filtro `soloImpagados=true` genera `CARCL_FECIMPAG
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
* consistente con el resto de filtros.
|
|
292
|
+
* El filtro `soloImpagados=true` genera `CARCL_FECIMPAG=ge='1900-01-01'`
|
|
293
|
+
* (cualquier fecha de impago con valor). El FIQL de Freemática no tiene
|
|
294
|
+
* IS NOT NULL: `!=null` devuelve 0 resultados silenciosamente y `!='null'`
|
|
295
|
+
* responde 500 (verificado contra el API real; con este rango devuelve
|
|
296
|
+
* 382 impagados de 72054 documentos).
|
|
247
297
|
*
|
|
248
298
|
* El filtro `estado` mapea a los valores numéricos de `CARCL_SITCAR`
|
|
249
299
|
* (1=pendiente, 2=cancelado, 3=derivado).
|
|
@@ -315,13 +365,16 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
315
365
|
/**
|
|
316
366
|
* Lista paginada de proveedores con filtros FIQL.
|
|
317
367
|
*
|
|
318
|
-
* El filtro `activo` mapea a FECHA_BAJA
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
* - `
|
|
368
|
+
* El filtro `activo` mapea a FECHA_BAJA. El API no soporta IS NULL en FIQL
|
|
369
|
+
* (`==null` devuelve 0 resultados y `=='null'` responde 500 — verificado
|
|
370
|
+
* contra el API real), así que:
|
|
371
|
+
* - `false` → `FECHA_BAJA=ge='1900-01-01'` (cualquier fecha de baja).
|
|
372
|
+
* - `true` → sin filtro server-side; las bajas se descartan post-process
|
|
373
|
+
* sobre la página recibida (FECHA_BAJA con valor). El `total`
|
|
374
|
+
* devuelto es el del dataset sin filtrar.
|
|
323
375
|
*
|
|
324
|
-
* El filtro `nombre`
|
|
376
|
+
* El filtro `nombre` es coincidencia EXACTA: el operador `=lk=` responde
|
|
377
|
+
* 400 en este endpoint y los wildcards % devuelven 0 resultados.
|
|
325
378
|
*
|
|
326
379
|
* Endpoint: GET /pgrl/v2/proveedores
|
|
327
380
|
*/
|
|
@@ -378,7 +431,11 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
378
431
|
* Lista paginada de localizaciones de servicio de clientes.
|
|
379
432
|
*
|
|
380
433
|
* Filtros soportados: codCliente (COD_CLI), grupoCliente (GRUPO_CLI), codPais (COD_PAIS),
|
|
381
|
-
* codProvincia (COD_PROVINCIA), representante (COD_REPRES)
|
|
434
|
+
* codProvincia (COD_PROVINCIA), representante (COD_REPRES).
|
|
435
|
+
*
|
|
436
|
+
* La vista NO tiene columna FECHA_BAJA (filtrar por ella responde 400
|
|
437
|
+
* "Error en rquery" — verificado contra el API real), así que no existe
|
|
438
|
+
* filtro activo/baja en este recurso.
|
|
382
439
|
*
|
|
383
440
|
* Endpoint: GET /pgrl/v2/localizaciones-servicio-clientes
|
|
384
441
|
*/
|
|
@@ -388,7 +445,6 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
388
445
|
codPais?: string;
|
|
389
446
|
codProvincia?: string;
|
|
390
447
|
representante?: string;
|
|
391
|
-
activo?: boolean;
|
|
392
448
|
}): Promise<ListResult<Record<string, unknown>>>;
|
|
393
449
|
/**
|
|
394
450
|
* Detalle de una factura de ventas (cabecera) por `idReg` opaco.
|
|
@@ -846,7 +902,8 @@ export declare class FreematicaClient extends BaseClient {
|
|
|
846
902
|
/**
|
|
847
903
|
* Lista paginada de localizaciones de factura de clientes.
|
|
848
904
|
*
|
|
849
|
-
* Endpoint: GET /pgrl/
|
|
905
|
+
* Endpoint: GET /pgrl/v1/localizaciones-factura-clientes
|
|
906
|
+
* (la lista solo existe en v1; el v2 de este recurso es solo POST/PUT).
|
|
850
907
|
*/
|
|
851
908
|
listLocalizacionesFacturaClientes(opts?: ListOptions & {
|
|
852
909
|
codCliente?: string;
|