@nubiia/mcp-freematica 0.7.0 → 0.8.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 +8 -0
- package/dist/clients/freematica-client.d.ts +74 -0
- package/dist/clients/freematica-client.js +106 -0
- package/dist/clients/freematica-client.js.map +1 -1
- package/dist/schemas/clientes.d.ts +164 -0
- package/dist/schemas/clientes.js +205 -0
- package/dist/schemas/clientes.js.map +1 -0
- package/dist/schemas/localizaciones.d.ts +90 -0
- package/dist/schemas/localizaciones.js +145 -0
- package/dist/schemas/localizaciones.js.map +1 -0
- package/dist/server-instructions.js +24 -0
- package/dist/server-instructions.js.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/clientes.d.ts +2 -1
- package/dist/tools/clientes.js +63 -2
- package/dist/tools/clientes.js.map +1 -1
- package/dist/tools/contactos-clientes.d.ts +2 -1
- package/dist/tools/contactos-clientes.js +58 -4
- package/dist/tools/contactos-clientes.js.map +1 -1
- package/dist/tools/contratos/cabecera.d.ts +2 -3
- package/dist/tools/contratos/cabecera.js.map +1 -1
- package/dist/tools/helpers.d.ts +4 -0
- package/dist/tools/helpers.js.map +1 -1
- package/dist/tools/localizaciones.d.ts +2 -1
- package/dist/tools/localizaciones.js +149 -2
- package/dist/tools/localizaciones.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schemas (raw shapes) y builders de body para las tools de escritura de
|
|
4
|
+
* Clientes y Contactos de Clientes (módulo pgrl, v2).
|
|
5
|
+
*
|
|
6
|
+
* Convención: nombres amigables en castellano traducidos a los campos nativos
|
|
7
|
+
* del API (VoClientes / VoContactosClientes CC_*). Solo se incluyen en el body
|
|
8
|
+
* los campos definidos. Los campos menos comunes se pasan en
|
|
9
|
+
* `camposAdicionales` con su nombre nativo.
|
|
10
|
+
*
|
|
11
|
+
* Límites de longitud según el spec OpenAPI
|
|
12
|
+
* (https://api-config.freefy.cloud/openapi.json).
|
|
13
|
+
*/
|
|
14
|
+
/** Añade `target[key] = value` solo si value !== undefined. */
|
|
15
|
+
function setIf(target, key, value) {
|
|
16
|
+
if (value !== undefined)
|
|
17
|
+
target[key] = value;
|
|
18
|
+
}
|
|
19
|
+
/** Convierte boolean a los flags '1'/'0' de Freemática. */
|
|
20
|
+
function boolFlag(value) {
|
|
21
|
+
return value ? '1' : '0';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Passthrough de campos nativos no expuestos con nombre amigable.
|
|
25
|
+
* Se validan las claves con estilo de columna Freemática (mayúsculas + '_').
|
|
26
|
+
*/
|
|
27
|
+
const camposAdicionales = (ejemplo) => z
|
|
28
|
+
.record(z.string().regex(/^[A-Z][A-Z0-9_]*$/, 'Las claves deben ser columnas Freemática (MAYUSCULAS_CON_GUION_BAJO)'), z.union([z.string(), z.number()]))
|
|
29
|
+
.optional()
|
|
30
|
+
.describe(`Campos nativos adicionales del Vo correspondiente (ej: ${ejemplo}). Ver spec OpenAPI para la lista completa.`);
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Clientes (VoClientes, 109 campos)
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
const clienteOptionalFieldsShape = {
|
|
35
|
+
personaFiscal: z.string().max(200).optional().describe('Nombre fiscal (PERSONA_FISCAL, 200c).'),
|
|
36
|
+
contacto: z.string().max(40).optional().describe('Nombre del contacto (CONTACTO, 40c).'),
|
|
37
|
+
cargo: z.string().max(40).optional().describe('Cargo del contacto (CARGO, 40c).'),
|
|
38
|
+
tipoVia: z.string().max(10).optional().describe('Tipo de vía (TIPO_VIA, 10c). Ej: CL, AV.'),
|
|
39
|
+
nombreVia: z.string().max(40).optional().describe('Nombre de la vía (NOMBRE_VIA, 40c).'),
|
|
40
|
+
numero: z.string().max(10).optional().describe('Número de vía (NUMERO, 10c).'),
|
|
41
|
+
codPoblacion: z.string().max(40).optional().describe('Código de población (COD_POBLACION, 40c).'),
|
|
42
|
+
codPostal: z.string().max(10).optional().describe('Código postal (COD_POSTAL, 10c).'),
|
|
43
|
+
codProvincia: z.string().max(5).optional().describe('Código de provincia (COD_PROVINCIA, 5c).'),
|
|
44
|
+
codPais: z.string().max(3).optional().describe('Código de país (COD_PAIS, 3c).'),
|
|
45
|
+
email: z.string().max(100).optional().describe('Correo electrónico (E_MAIL, 100c).'),
|
|
46
|
+
web: z.string().max(100).optional().describe('Página web (WEB, 100c).'),
|
|
47
|
+
telefono1: z.string().max(15).optional().describe('Teléfono 1 (TELEFONO1, 15c).'),
|
|
48
|
+
telefono2: z.string().max(15).optional().describe('Teléfono 2 (TELEFONO2, 15c).'),
|
|
49
|
+
nombreComercial: z.string().max(40).optional().describe('Nombre comercial (NOMBRECOMERCIAL, 40c).'),
|
|
50
|
+
representante: z.string().max(5).optional().describe('Código del comercial (REPRESENTANTE, 5c).'),
|
|
51
|
+
codTipo: z.string().max(2).optional().describe('Código tipo de cliente (COD_TIPO, 2c).'),
|
|
52
|
+
comentarios: z.string().optional().describe('Comentarios libres (COMENTARIOS).'),
|
|
53
|
+
camposAdicionales: camposAdicionales('COD_TARIFA, COD_ZONA, CREDITO, CMC_LINKEDIN'),
|
|
54
|
+
};
|
|
55
|
+
export const CreateClienteShape = {
|
|
56
|
+
grupoCliente: z.number().int().describe('Código de grupo de cliente (COD_GRUPO_CLI). Requerido.'),
|
|
57
|
+
codCliente: z.string().max(10).describe('Código de cliente (COD_CLI, 10c). Requerido.'),
|
|
58
|
+
nombre: z.string().max(40).describe('Nombre del cliente (NOMBRE_CLI, 40c). Requerido.'),
|
|
59
|
+
nif: z.string().max(15).describe('NIF (15c). Requerido.'),
|
|
60
|
+
tipoImpuesto: z.string().max(4).describe('Tipo de impuesto (TIPO_IMPTO, 4c). Requerido.'),
|
|
61
|
+
divisa: z.string().max(4).describe('Código de divisa (COD_DIVISA, 4c). Ej: EUR. Requerido.'),
|
|
62
|
+
tipoFacturacion: z
|
|
63
|
+
.enum(['D', 'M', 'Q'])
|
|
64
|
+
.describe('Tipo de proceso de facturación (TIPO_FACT): D=Diario, M=Mensual, Q=Quincenal. Requerido.'),
|
|
65
|
+
...clienteOptionalFieldsShape,
|
|
66
|
+
};
|
|
67
|
+
export const UpdateClienteShape = {
|
|
68
|
+
idReg: z
|
|
69
|
+
.string()
|
|
70
|
+
.min(1)
|
|
71
|
+
.describe('idReg opaco del cliente (campo "idReg" en freematica_list_clientes).'),
|
|
72
|
+
nombre: z.string().max(40).optional().describe('Nombre del cliente (NOMBRE_CLI, 40c).'),
|
|
73
|
+
nif: z.string().max(15).optional().describe('NIF (15c).'),
|
|
74
|
+
tipoImpuesto: z.string().max(4).optional().describe('Tipo de impuesto (TIPO_IMPTO, 4c).'),
|
|
75
|
+
divisa: z.string().max(4).optional().describe('Código de divisa (COD_DIVISA, 4c).'),
|
|
76
|
+
tipoFacturacion: z
|
|
77
|
+
.enum(['D', 'M', 'Q'])
|
|
78
|
+
.optional()
|
|
79
|
+
.describe('Tipo de proceso de facturación (TIPO_FACT): D/M/Q.'),
|
|
80
|
+
...clienteOptionalFieldsShape,
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Construye el idReg de un cliente a partir de sus códigos naturales.
|
|
84
|
+
* Formato verificado contra el API real: Base64("{GRUPO}__{COD}").
|
|
85
|
+
*/
|
|
86
|
+
export function buildClienteIdReg(grupoCliente, codCliente) {
|
|
87
|
+
return Buffer.from(`${grupoCliente}__${codCliente}`).toString('base64');
|
|
88
|
+
}
|
|
89
|
+
/** Construye el body VoClientes con los campos definidos. */
|
|
90
|
+
export function buildClienteBody(args) {
|
|
91
|
+
const body = {};
|
|
92
|
+
setIf(body, 'COD_GRUPO_CLI', args.grupoCliente);
|
|
93
|
+
setIf(body, 'COD_CLI', args.codCliente);
|
|
94
|
+
setIf(body, 'NOMBRE_CLI', args.nombre);
|
|
95
|
+
setIf(body, 'NIF', args.nif);
|
|
96
|
+
setIf(body, 'TIPO_IMPTO', args.tipoImpuesto);
|
|
97
|
+
setIf(body, 'COD_DIVISA', args.divisa);
|
|
98
|
+
setIf(body, 'TIPO_FACT', args.tipoFacturacion);
|
|
99
|
+
setIf(body, 'PERSONA_FISCAL', args.personaFiscal);
|
|
100
|
+
setIf(body, 'CONTACTO', args.contacto);
|
|
101
|
+
setIf(body, 'CARGO', args.cargo);
|
|
102
|
+
setIf(body, 'TIPO_VIA', args.tipoVia);
|
|
103
|
+
setIf(body, 'NOMBRE_VIA', args.nombreVia);
|
|
104
|
+
setIf(body, 'NUMERO', args.numero);
|
|
105
|
+
setIf(body, 'COD_POBLACION', args.codPoblacion);
|
|
106
|
+
setIf(body, 'COD_POSTAL', args.codPostal);
|
|
107
|
+
setIf(body, 'COD_PROVINCIA', args.codProvincia);
|
|
108
|
+
setIf(body, 'COD_PAIS', args.codPais);
|
|
109
|
+
setIf(body, 'E_MAIL', args.email);
|
|
110
|
+
setIf(body, 'WEB', args.web);
|
|
111
|
+
setIf(body, 'TELEFONO1', args.telefono1);
|
|
112
|
+
setIf(body, 'TELEFONO2', args.telefono2);
|
|
113
|
+
setIf(body, 'NOMBRECOMERCIAL', args.nombreComercial);
|
|
114
|
+
setIf(body, 'REPRESENTANTE', args.representante);
|
|
115
|
+
setIf(body, 'COD_TIPO', args.codTipo);
|
|
116
|
+
setIf(body, 'COMENTARIOS', args.comentarios);
|
|
117
|
+
if (args.camposAdicionales)
|
|
118
|
+
Object.assign(body, args.camposAdicionales);
|
|
119
|
+
return body;
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Contactos de clientes (VoContactosClientes, campos CC_*)
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
const contactoOptionalFieldsShape = {
|
|
125
|
+
nombreApellidos: z.string().max(100).optional().describe('Nombre y apellidos (CC_NOM_APELL, 100c).'),
|
|
126
|
+
cargo: z.string().max(40).optional().describe('Cargo (CC_CARGO, 40c).'),
|
|
127
|
+
codCargo: z.string().max(4).optional().describe('Código de cargo (CC_COD_CARGO, 4c). Catálogo cargos-clientes.'),
|
|
128
|
+
telefono: z.string().max(15).optional().describe('Teléfono (CC_TELEFONO, 15c).'),
|
|
129
|
+
movil: z.string().max(15).optional().describe('Móvil (CC_MOBIL, 15c).'),
|
|
130
|
+
email: z.string().max(100).optional().describe('Correo electrónico (CC_EMAIL1, 100c).'),
|
|
131
|
+
nif: z.string().max(15).optional().describe('NIF del contacto (CC_NIF, 15c).'),
|
|
132
|
+
comentarios: z.string().max(1000).optional().describe('Comentarios (CC_COMENTARIOS, 1000c).'),
|
|
133
|
+
contactoPrincipal: z
|
|
134
|
+
.boolean()
|
|
135
|
+
.optional()
|
|
136
|
+
.describe('Contacto principal (CC_CONTACTO_PRINCIPAL): true → "1", false → "0".'),
|
|
137
|
+
decisor: z.boolean().optional().describe('Contacto decisor (CC_DECISOR): true → "1", false → "0".'),
|
|
138
|
+
inactivo: z.boolean().optional().describe('Contacto inactivo (CC_INACTIVO): true → "1", false → "0".'),
|
|
139
|
+
localizacion: z
|
|
140
|
+
.number()
|
|
141
|
+
.int()
|
|
142
|
+
.optional()
|
|
143
|
+
.describe('Código de localización del cliente a la que pertenece (CC_LOCALIZ).'),
|
|
144
|
+
linkedin: z.string().max(200).optional().describe('LinkedIn (CC_LINKEDIN, 200c).'),
|
|
145
|
+
camposAdicionales: camposAdicionales('CC_SALUDO, CC_TRATAMIENTO, CC_MAILING'),
|
|
146
|
+
};
|
|
147
|
+
export const CreateContactoClienteShape = {
|
|
148
|
+
grupoCliente: z.number().int().describe('Código de grupo de cliente (CC_GRUPO_CLI). Requerido.'),
|
|
149
|
+
codCliente: z.string().max(10).describe('Código de cliente (CC_CLI, 10c). Requerido.'),
|
|
150
|
+
...contactoOptionalFieldsShape,
|
|
151
|
+
};
|
|
152
|
+
export const UpdateContactoClienteShape = {
|
|
153
|
+
idReg: z
|
|
154
|
+
.string()
|
|
155
|
+
.min(1)
|
|
156
|
+
.describe('idReg opaco del contacto (campo "idReg" en freematica_list_contactos_clientes).'),
|
|
157
|
+
...contactoOptionalFieldsShape,
|
|
158
|
+
};
|
|
159
|
+
/** Construye el body VoContactosClientes con los campos definidos. */
|
|
160
|
+
export function buildContactoClienteBody(args) {
|
|
161
|
+
const body = {};
|
|
162
|
+
setIf(body, 'CC_GRUPO_CLI', args.grupoCliente);
|
|
163
|
+
setIf(body, 'CC_CLI', args.codCliente);
|
|
164
|
+
setIf(body, 'CC_NOM_APELL', args.nombreApellidos);
|
|
165
|
+
setIf(body, 'CC_CARGO', args.cargo);
|
|
166
|
+
setIf(body, 'CC_COD_CARGO', args.codCargo);
|
|
167
|
+
setIf(body, 'CC_TELEFONO', args.telefono);
|
|
168
|
+
setIf(body, 'CC_MOBIL', args.movil);
|
|
169
|
+
setIf(body, 'CC_EMAIL1', args.email);
|
|
170
|
+
setIf(body, 'CC_NIF', args.nif);
|
|
171
|
+
setIf(body, 'CC_COMENTARIOS', args.comentarios);
|
|
172
|
+
if (args.contactoPrincipal !== undefined)
|
|
173
|
+
body['CC_CONTACTO_PRINCIPAL'] = boolFlag(args.contactoPrincipal);
|
|
174
|
+
if (args.decisor !== undefined)
|
|
175
|
+
body['CC_DECISOR'] = boolFlag(args.decisor);
|
|
176
|
+
if (args.inactivo !== undefined)
|
|
177
|
+
body['CC_INACTIVO'] = boolFlag(args.inactivo);
|
|
178
|
+
setIf(body, 'CC_LOCALIZ', args.localizacion);
|
|
179
|
+
setIf(body, 'CC_LINKEDIN', args.linkedin);
|
|
180
|
+
if (args.camposAdicionales)
|
|
181
|
+
Object.assign(body, args.camposAdicionales);
|
|
182
|
+
return body;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Claves de metadatos de presentación que devuelven los GET de Freemática y
|
|
186
|
+
* que no forman parte del Vo de escritura. Se eliminan antes de hacer el
|
|
187
|
+
* merge de un update (fetch + merge + PUT).
|
|
188
|
+
*/
|
|
189
|
+
const METADATA_KEYS = ['RowNumber', '_id', '_cellSettings'];
|
|
190
|
+
/**
|
|
191
|
+
* Fusiona el estado actual de un registro (obtenido por GET) con los cambios
|
|
192
|
+
* a aplicar, eliminando los metadatos de presentación.
|
|
193
|
+
*
|
|
194
|
+
* ASUNCIÓN EMPÍRICA: los endpoints PUT de Freemática aceptan el objeto
|
|
195
|
+
* completo devuelto por el GET (mismos nombres de columna). Si en pruebas
|
|
196
|
+
* funcionales el API rechazara algún campo de solo lectura, habría que
|
|
197
|
+
* añadirlo a METADATA_KEYS.
|
|
198
|
+
*/
|
|
199
|
+
export function mergeForUpdate(current, changes) {
|
|
200
|
+
const merged = { ...current, ...changes };
|
|
201
|
+
for (const key of METADATA_KEYS)
|
|
202
|
+
delete merged[key];
|
|
203
|
+
return merged;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=clientes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientes.js","sourceRoot":"","sources":["../../src/schemas/clientes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export type LocalizacionTipo = 'cobro' | 'envio' | 'factura' | 'servicio';
|
|
3
|
+
export declare const LOC_TIPOS: LocalizacionTipo[];
|
|
4
|
+
interface LocFieldMap {
|
|
5
|
+
/** Columna del código de localización (requerida por el API). */
|
|
6
|
+
codField: string;
|
|
7
|
+
/** Columna del nombre/denominación. */
|
|
8
|
+
nombreField: string;
|
|
9
|
+
/** Columna del domicilio. */
|
|
10
|
+
domicilioField: string;
|
|
11
|
+
/** Columna de la persona de contacto. */
|
|
12
|
+
contactoField: string;
|
|
13
|
+
/** ¿El API exige el nombre en el alta? */
|
|
14
|
+
nombreRequerido: boolean;
|
|
15
|
+
/** Path del recurso v2 (list/create; update añade /{idReg}). */
|
|
16
|
+
path: string;
|
|
17
|
+
/** Path del GET singular usado en el fetch+merge del update. */
|
|
18
|
+
getPath: string;
|
|
19
|
+
/** Sufijo del nombre de tool: freematica_*_localizacion_<sufijo>_cliente. */
|
|
20
|
+
toolSuffix: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const LOC_FIELD_MAP: Record<LocalizacionTipo, LocFieldMap>;
|
|
23
|
+
/**
|
|
24
|
+
* Shape del alta de localización. `formaPago` solo lo exige el API en el tipo
|
|
25
|
+
* `cobro`; para el resto es ignorable (se valida en el handler).
|
|
26
|
+
*/
|
|
27
|
+
export declare const CreateLocalizacionClienteShape: {
|
|
28
|
+
codPais: z.ZodOptional<z.ZodNumber>;
|
|
29
|
+
codProvincia: z.ZodOptional<z.ZodString>;
|
|
30
|
+
codPoblacion: z.ZodOptional<z.ZodString>;
|
|
31
|
+
codPostal: z.ZodOptional<z.ZodString>;
|
|
32
|
+
domicilio: z.ZodOptional<z.ZodString>;
|
|
33
|
+
email: z.ZodOptional<z.ZodString>;
|
|
34
|
+
telefono1: z.ZodOptional<z.ZodString>;
|
|
35
|
+
telefono2: z.ZodOptional<z.ZodString>;
|
|
36
|
+
contacto: z.ZodOptional<z.ZodString>;
|
|
37
|
+
camposAdicionales: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
38
|
+
tipo: z.ZodEnum<{
|
|
39
|
+
cobro: "cobro";
|
|
40
|
+
envio: "envio";
|
|
41
|
+
factura: "factura";
|
|
42
|
+
servicio: "servicio";
|
|
43
|
+
}>;
|
|
44
|
+
grupoCliente: z.ZodNumber;
|
|
45
|
+
codCliente: z.ZodString;
|
|
46
|
+
codLocalizacion: z.ZodNumber;
|
|
47
|
+
nombre: z.ZodOptional<z.ZodString>;
|
|
48
|
+
formaPago: z.ZodOptional<z.ZodString>;
|
|
49
|
+
};
|
|
50
|
+
export declare const UpdateLocalizacionClienteShape: {
|
|
51
|
+
codPais: z.ZodOptional<z.ZodNumber>;
|
|
52
|
+
codProvincia: z.ZodOptional<z.ZodString>;
|
|
53
|
+
codPoblacion: z.ZodOptional<z.ZodString>;
|
|
54
|
+
codPostal: z.ZodOptional<z.ZodString>;
|
|
55
|
+
domicilio: z.ZodOptional<z.ZodString>;
|
|
56
|
+
email: z.ZodOptional<z.ZodString>;
|
|
57
|
+
telefono1: z.ZodOptional<z.ZodString>;
|
|
58
|
+
telefono2: z.ZodOptional<z.ZodString>;
|
|
59
|
+
contacto: z.ZodOptional<z.ZodString>;
|
|
60
|
+
camposAdicionales: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
61
|
+
tipo: z.ZodEnum<{
|
|
62
|
+
cobro: "cobro";
|
|
63
|
+
envio: "envio";
|
|
64
|
+
factura: "factura";
|
|
65
|
+
servicio: "servicio";
|
|
66
|
+
}>;
|
|
67
|
+
idReg: z.ZodString;
|
|
68
|
+
nombre: z.ZodOptional<z.ZodString>;
|
|
69
|
+
formaPago: z.ZodOptional<z.ZodString>;
|
|
70
|
+
};
|
|
71
|
+
export type LocalizacionClienteFields = {
|
|
72
|
+
grupoCliente?: number;
|
|
73
|
+
codCliente?: string;
|
|
74
|
+
codLocalizacion?: number;
|
|
75
|
+
nombre?: string;
|
|
76
|
+
formaPago?: string;
|
|
77
|
+
codPais?: number;
|
|
78
|
+
codProvincia?: string;
|
|
79
|
+
codPoblacion?: string;
|
|
80
|
+
codPostal?: string;
|
|
81
|
+
domicilio?: string;
|
|
82
|
+
email?: string;
|
|
83
|
+
telefono1?: string;
|
|
84
|
+
telefono2?: string;
|
|
85
|
+
contacto?: string;
|
|
86
|
+
camposAdicionales?: Record<string, string | number>;
|
|
87
|
+
};
|
|
88
|
+
/** Construye el body del Vo de localización correspondiente al tipo. */
|
|
89
|
+
export declare function buildLocalizacionClienteBody(tipo: LocalizacionTipo, args: LocalizacionClienteFields): Record<string, unknown>;
|
|
90
|
+
export {};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schemas (raw shapes) y builders de body para las tools de escritura de
|
|
4
|
+
* Localizaciones de Clientes (módulo pgrl, v2): cobro, envío, factura y
|
|
5
|
+
* servicio.
|
|
6
|
+
*
|
|
7
|
+
* Los cuatro tipos comparten la mayoría de campos (dirección, teléfonos,
|
|
8
|
+
* email, contacto) pero cada uno usa nombres de columna distintos para el
|
|
9
|
+
* código, el nombre, el domicilio y el contacto. `LOC_FIELD_MAP` centraliza
|
|
10
|
+
* ese mapeo.
|
|
11
|
+
*/
|
|
12
|
+
/** Añade `target[key] = value` solo si value !== undefined. */
|
|
13
|
+
function setIf(target, key, value) {
|
|
14
|
+
if (value !== undefined)
|
|
15
|
+
target[key] = value;
|
|
16
|
+
}
|
|
17
|
+
export const LOC_TIPOS = ['cobro', 'envio', 'factura', 'servicio'];
|
|
18
|
+
export const LOC_FIELD_MAP = {
|
|
19
|
+
cobro: {
|
|
20
|
+
codField: 'LOC_CLI_COB',
|
|
21
|
+
nombreField: 'NOM_LOC_COB',
|
|
22
|
+
domicilioField: 'DOMICILIO',
|
|
23
|
+
contactoField: 'COB_CONTACTO',
|
|
24
|
+
nombreRequerido: true,
|
|
25
|
+
path: '/pgrl/v2/localizaciones-cobro-clientes',
|
|
26
|
+
getPath: '/pgrl/v2/localizaciones-cobro-clientes',
|
|
27
|
+
toolSuffix: 'cobro',
|
|
28
|
+
},
|
|
29
|
+
envio: {
|
|
30
|
+
codField: 'LOC_CLI_ENV',
|
|
31
|
+
nombreField: 'NOM_LOC_ENV',
|
|
32
|
+
domicilioField: 'DOMICILIO_ENVIO',
|
|
33
|
+
contactoField: 'ENV_CONTACTO',
|
|
34
|
+
nombreRequerido: false,
|
|
35
|
+
path: '/pgrl/v2/localizaciones-envio-clientes',
|
|
36
|
+
getPath: '/pgrl/v2/localizaciones-envio-clientes',
|
|
37
|
+
toolSuffix: 'envio',
|
|
38
|
+
},
|
|
39
|
+
factura: {
|
|
40
|
+
codField: 'LOC_CLI_FAC',
|
|
41
|
+
nombreField: 'NOM_LOC_FAC',
|
|
42
|
+
domicilioField: 'DOMICILIO',
|
|
43
|
+
contactoField: 'FAC_CONTACTO',
|
|
44
|
+
nombreRequerido: true,
|
|
45
|
+
path: '/pgrl/v2/localizaciones-factura-clientes',
|
|
46
|
+
// El GET singular v2 no existe para factura; se usa el v1 (mismas columnas).
|
|
47
|
+
getPath: '/pgrl/v1/localizaciones-factura-clientes',
|
|
48
|
+
toolSuffix: 'factura',
|
|
49
|
+
},
|
|
50
|
+
servicio: {
|
|
51
|
+
codField: 'LOC_CLI_SERV',
|
|
52
|
+
nombreField: 'DESCRIPCION',
|
|
53
|
+
domicilioField: 'DOMICILIO',
|
|
54
|
+
contactoField: 'CONTACTO',
|
|
55
|
+
nombreRequerido: true,
|
|
56
|
+
path: '/pgrl/v2/localizaciones-servicio-clientes',
|
|
57
|
+
getPath: '/pgrl/v2/localizaciones-servicio-clientes',
|
|
58
|
+
toolSuffix: 'servicio',
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const localizacionOptionalFieldsShape = {
|
|
62
|
+
codPais: z.number().int().optional().describe('Código de país (COD_PAIS).'),
|
|
63
|
+
codProvincia: z.string().max(5).optional().describe('Código de provincia (COD_PROVINCIA, 5c).'),
|
|
64
|
+
codPoblacion: z.string().max(40).optional().describe('Código de población (COD_POBLACION, 40c).'),
|
|
65
|
+
codPostal: z.string().max(10).optional().describe('Código postal (COD_POSTAL, 10c).'),
|
|
66
|
+
domicilio: z
|
|
67
|
+
.string()
|
|
68
|
+
.max(100)
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('Domicilio (DOMICILIO / DOMICILIO_ENVIO según el tipo).'),
|
|
71
|
+
email: z.string().max(100).optional().describe('Correo electrónico (E_MAIL, 100c).'),
|
|
72
|
+
telefono1: z.string().max(15).optional().describe('Teléfono 1 (TELEFONO1, 15c).'),
|
|
73
|
+
telefono2: z.string().max(15).optional().describe('Teléfono 2 (TELEFONO2, 15c).'),
|
|
74
|
+
contacto: z
|
|
75
|
+
.string()
|
|
76
|
+
.max(40)
|
|
77
|
+
.optional()
|
|
78
|
+
.describe('Persona de contacto (COB_CONTACTO / ENV_CONTACTO / FAC_CONTACTO / CONTACTO según el tipo).'),
|
|
79
|
+
camposAdicionales: z
|
|
80
|
+
.record(z.string().regex(/^[A-Z][A-Z0-9_]*$/, 'Las claves deben ser columnas Freemática (MAYUSCULAS_CON_GUION_BAJO)'), z.union([z.string(), z.number()]))
|
|
81
|
+
.optional()
|
|
82
|
+
.describe('Campos nativos adicionales del Vo del tipo (ej: cobro → CMCC_IBAN, COD_BANCO; servicio → COD_ZONA, LATITUD_LONGITUD, CMCS_COD_DLG). Ver spec OpenAPI.'),
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Shape del alta de localización. `formaPago` solo lo exige el API en el tipo
|
|
86
|
+
* `cobro`; para el resto es ignorable (se valida en el handler).
|
|
87
|
+
*/
|
|
88
|
+
export const CreateLocalizacionClienteShape = {
|
|
89
|
+
tipo: z
|
|
90
|
+
.enum(['cobro', 'envio', 'factura', 'servicio'])
|
|
91
|
+
.describe('Tipo de localización: cobro, envio, factura o servicio (instalación).'),
|
|
92
|
+
grupoCliente: z.number().int().describe('Código de grupo de cliente (COD_GRUPO_CLI). Requerido.'),
|
|
93
|
+
codCliente: z.string().max(10).describe('Código de cliente (COD_CLI, 10c). Requerido.'),
|
|
94
|
+
codLocalizacion: z
|
|
95
|
+
.number()
|
|
96
|
+
.int()
|
|
97
|
+
.describe('Código de la localización (LOC_CLI_COB/ENV/FAC/SERV según el tipo). Requerido.'),
|
|
98
|
+
nombre: z
|
|
99
|
+
.string()
|
|
100
|
+
.max(80)
|
|
101
|
+
.optional()
|
|
102
|
+
.describe('Denominación (NOM_LOC_COB / NOM_LOC_ENV / NOM_LOC_FAC / DESCRIPCION). Requerido por el API en cobro, factura y servicio.'),
|
|
103
|
+
formaPago: z
|
|
104
|
+
.string()
|
|
105
|
+
.max(3)
|
|
106
|
+
.optional()
|
|
107
|
+
.describe('Código de forma de pago (COD_FORMA_PAGO). Requerido por el API SOLO en tipo cobro.'),
|
|
108
|
+
...localizacionOptionalFieldsShape,
|
|
109
|
+
};
|
|
110
|
+
export const UpdateLocalizacionClienteShape = {
|
|
111
|
+
tipo: z
|
|
112
|
+
.enum(['cobro', 'envio', 'factura', 'servicio'])
|
|
113
|
+
.describe('Tipo de localización: cobro, envio, factura o servicio.'),
|
|
114
|
+
idReg: z
|
|
115
|
+
.string()
|
|
116
|
+
.min(1)
|
|
117
|
+
.describe('idReg opaco de la localización (campo "idReg" en la list tool del tipo).'),
|
|
118
|
+
nombre: z.string().max(80).optional().describe('Nueva denominación.'),
|
|
119
|
+
formaPago: z.string().max(3).optional().describe('Código de forma de pago (solo tipo cobro).'),
|
|
120
|
+
...localizacionOptionalFieldsShape,
|
|
121
|
+
};
|
|
122
|
+
/** Construye el body del Vo de localización correspondiente al tipo. */
|
|
123
|
+
export function buildLocalizacionClienteBody(tipo, args) {
|
|
124
|
+
const map = LOC_FIELD_MAP[tipo];
|
|
125
|
+
const body = {};
|
|
126
|
+
setIf(body, 'COD_GRUPO_CLI', args.grupoCliente);
|
|
127
|
+
setIf(body, 'COD_CLI', args.codCliente);
|
|
128
|
+
setIf(body, map.codField, args.codLocalizacion);
|
|
129
|
+
setIf(body, map.nombreField, args.nombre);
|
|
130
|
+
if (tipo === 'cobro')
|
|
131
|
+
setIf(body, 'COD_FORMA_PAGO', args.formaPago);
|
|
132
|
+
setIf(body, 'COD_PAIS', args.codPais);
|
|
133
|
+
setIf(body, 'COD_PROVINCIA', args.codProvincia);
|
|
134
|
+
setIf(body, 'COD_POBLACION', args.codPoblacion);
|
|
135
|
+
setIf(body, 'COD_POSTAL', args.codPostal);
|
|
136
|
+
setIf(body, map.domicilioField, args.domicilio);
|
|
137
|
+
setIf(body, 'E_MAIL', args.email);
|
|
138
|
+
setIf(body, 'TELEFONO1', args.telefono1);
|
|
139
|
+
setIf(body, 'TELEFONO2', args.telefono2);
|
|
140
|
+
setIf(body, map.contactoField, args.contacto);
|
|
141
|
+
if (args.camposAdicionales)
|
|
142
|
+
Object.assign(body, args.camposAdicionales);
|
|
143
|
+
return body;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=localizaciones.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localizaciones.js","sourceRoot":"","sources":["../../src/schemas/localizaciones.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,6 +91,30 @@ Flujo típico para crear un contrato completo:
|
|
|
91
91
|
3. freematica_create_servicio_historico_precios con los precios.
|
|
92
92
|
4. (opcional) freematica_create_servicio_facturacion_txt.
|
|
93
93
|
|
|
94
|
+
## Clientes, Contactos y Localizaciones — escritura
|
|
95
|
+
|
|
96
|
+
Con FREEMATICA_ENABLE_WRITES=true (no existe borrado):
|
|
97
|
+
|
|
98
|
+
- **freematica_create_cliente** — requeridos: grupoCliente, codCliente,
|
|
99
|
+
nombre, nif, tipoImpuesto, divisa, tipoFacturacion (D/M/Q). El idReg se
|
|
100
|
+
calcula automáticamente.
|
|
101
|
+
- **freematica_update_cliente(idReg, …)** — actualización parcial: la tool
|
|
102
|
+
recupera el cliente y fusiona los cambios antes del PUT.
|
|
103
|
+
- **freematica_create_contacto_cliente** — requeridos: grupoCliente y
|
|
104
|
+
codCliente. Opcionales: nombreApellidos, cargo, telefono, movil, email…
|
|
105
|
+
- **freematica_update_contacto_cliente(idReg, …)** — parcial (fetch+merge).
|
|
106
|
+
- **freematica_create_localizacion_cliente(tipo, …)** — tipo: cobro | envio |
|
|
107
|
+
factura | servicio. formaPago solo se exige en cobro; nombre en todos salvo
|
|
108
|
+
envío. Campos específicos del tipo vía camposAdicionales.
|
|
109
|
+
- **freematica_update_localizacion_cliente(tipo, idReg, …)** — parcial
|
|
110
|
+
(fetch+merge). El idReg sale de la list tool del tipo.
|
|
111
|
+
|
|
112
|
+
Flujo típico cliente nuevo completo:
|
|
113
|
+
1. freematica_create_cliente
|
|
114
|
+
2. freematica_create_contacto_cliente
|
|
115
|
+
3. freematica_create_localizacion_cliente (tipo=servicio, y cobro/factura si aplica)
|
|
116
|
+
4. freematica_create_contrato + servicios (ver sección Contratos)
|
|
117
|
+
|
|
94
118
|
## IDs opacos en endpoints de detalle
|
|
95
119
|
|
|
96
120
|
Las tools \`freematica_get_*\` requieren un \`id\` que es el campo \`idReg\` de los
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../src/server-instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG
|
|
1
|
+
{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../src/server-instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJ1C,CAAC,IAAI,EAAE,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -22,15 +22,15 @@ export function createFreematicaServer(opts) {
|
|
|
22
22
|
const server = new McpServer({ name: 'freematica-mcp', version: VERSION }, { instructions: FREEMATICA_MCP_INSTRUCTIONS });
|
|
23
23
|
registerContratosTools(server, opts.client, { enableWrites: opts.enableWrites ?? false });
|
|
24
24
|
registerMasterDataTools(server, opts.client);
|
|
25
|
-
registerClientesTools(server, opts.client);
|
|
26
|
-
registerContactosClientesTools(server, opts.client);
|
|
25
|
+
registerClientesTools(server, opts.client, { enableWrites: opts.enableWrites ?? false });
|
|
26
|
+
registerContactosClientesTools(server, opts.client, { enableWrites: opts.enableWrites ?? false });
|
|
27
27
|
registerOportunidadesNegocioTools(server, opts.client);
|
|
28
28
|
registerCarteraTools(server, opts.client);
|
|
29
29
|
registerFacturasVentasTools(server, opts.client);
|
|
30
30
|
registerFacturasComprasTools(server, opts.client);
|
|
31
31
|
registerPedidosComprasTools(server, opts.client);
|
|
32
32
|
registerProveedoresTools(server, opts.client);
|
|
33
|
-
registerLocalizacionesTools(server, opts.client);
|
|
33
|
+
registerLocalizacionesTools(server, opts.client, { enableWrites: opts.enableWrites ?? false });
|
|
34
34
|
registerContabilidadTools(server, opts.client);
|
|
35
35
|
registerPrlTools(server, opts.client);
|
|
36
36
|
registerPersonalTools(server, opts.client);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +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,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,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,4BAA4B,CAAC;AACpE,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;AAYlE,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,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC,CAAC;IAC1F,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/clientes.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { FreematicaClient } from '../clients/freematica-client.js';
|
|
3
|
-
|
|
3
|
+
import { type RegisterOptions } from './helpers.js';
|
|
4
|
+
export declare function registerClientesTools(server: McpServer, client: FreematicaClient, opts?: RegisterOptions): void;
|
package/dist/tools/clientes.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { FreematicaError } from '../clients/base-client.js';
|
|
3
3
|
import { PaginationSchema } from '../schemas/pagination.js';
|
|
4
|
+
import { CreateClienteShape, UpdateClienteShape, buildClienteBody, buildClienteIdReg, mergeForUpdate, } from '../schemas/clientes.js';
|
|
4
5
|
import { error, ok, okList } from './helpers.js';
|
|
5
6
|
const LIST_TOOL_NAME = 'freematica_list_clientes';
|
|
6
7
|
const GET_TOOL_NAME = 'freematica_get_cliente';
|
|
8
|
+
const CREATE_TOOL_NAME = 'freematica_create_cliente';
|
|
9
|
+
const UPDATE_TOOL_NAME = 'freematica_update_cliente';
|
|
7
10
|
const LIST_DESCRIPTION = [
|
|
8
11
|
'Devuelve la lista paginada de clientes de Freemática.',
|
|
9
12
|
'',
|
|
@@ -16,11 +19,35 @@ const GET_DESCRIPTION = [
|
|
|
16
19
|
'',
|
|
17
20
|
'El parámetro `id` DEBE ser el campo `idReg` (string opaco base64) que aparece en los items de freematica_list_clientes. NO usar COD_CLI ni otro código natural — el API devuelve not_found.',
|
|
18
21
|
].join('\n');
|
|
19
|
-
|
|
22
|
+
const CREATE_DESCRIPTION = [
|
|
23
|
+
'Da de alta un cliente en Freemática.',
|
|
24
|
+
'',
|
|
25
|
+
'Endpoint: POST /pgrl/v2/clientes — body VoClientes (109 campos).',
|
|
26
|
+
'Requeridos: grupoCliente, codCliente, nombre (40c), nif, tipoImpuesto,',
|
|
27
|
+
'divisa (ej. EUR) y tipoFacturacion (D=Diario, M=Mensual, Q=Quincenal).',
|
|
28
|
+
'El idReg del cliente se calcula automáticamente (Base64 "GRUPO__COD").',
|
|
29
|
+
'',
|
|
30
|
+
'Los campos no expuestos con nombre amigable se pasan en camposAdicionales',
|
|
31
|
+
'con su nombre nativo (ej. COD_TARIFA, CREDITO). Devuelve el cliente creado.',
|
|
32
|
+
].join('\n');
|
|
33
|
+
const UPDATE_DESCRIPTION = [
|
|
34
|
+
'Actualiza un cliente existente (actualización parcial).',
|
|
35
|
+
'',
|
|
36
|
+
'Endpoint: PUT /pgrl/v2/clientes/{idReg}. La tool primero recupera el',
|
|
37
|
+
'cliente actual, aplica encima los campos informados y envía el objeto',
|
|
38
|
+
'completo (el API exige los campos obligatorios en cada PUT). El estado',
|
|
39
|
+
'previo queda en el log de auditoría.',
|
|
40
|
+
].join('\n');
|
|
41
|
+
export function registerClientesTools(server, client, opts = { enableWrites: false }) {
|
|
20
42
|
server.tool(LIST_TOOL_NAME, LIST_DESCRIPTION, PaginationSchema, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ page, items }) => {
|
|
21
43
|
try {
|
|
22
44
|
const result = await client.listClientes({ page, items });
|
|
23
|
-
return okList({
|
|
45
|
+
return okList({
|
|
46
|
+
items: result.items,
|
|
47
|
+
total: result.total,
|
|
48
|
+
page,
|
|
49
|
+
itemsPerPage: items,
|
|
50
|
+
});
|
|
24
51
|
}
|
|
25
52
|
catch (err) {
|
|
26
53
|
if (err instanceof FreematicaError)
|
|
@@ -44,5 +71,39 @@ export function registerClientesTools(server, client) {
|
|
|
44
71
|
return error(err instanceof Error ? err : new Error(String(err)));
|
|
45
72
|
}
|
|
46
73
|
});
|
|
74
|
+
if (!opts.enableWrites)
|
|
75
|
+
return;
|
|
76
|
+
server.tool(CREATE_TOOL_NAME, CREATE_DESCRIPTION, CreateClienteShape, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (args) => {
|
|
77
|
+
try {
|
|
78
|
+
const fields = args;
|
|
79
|
+
const body = buildClienteBody(fields);
|
|
80
|
+
// El API exige idReg también en el alta; se deriva de los códigos naturales.
|
|
81
|
+
body['idReg'] = buildClienteIdReg(fields.grupoCliente, fields.codCliente);
|
|
82
|
+
const created = await client.createCliente(body);
|
|
83
|
+
return ok(created);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (err instanceof FreematicaError)
|
|
87
|
+
return error(err);
|
|
88
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
server.tool(UPDATE_TOOL_NAME, UPDATE_DESCRIPTION, UpdateClienteShape, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ idReg, ...fields }) => {
|
|
92
|
+
try {
|
|
93
|
+
const changes = buildClienteBody(fields);
|
|
94
|
+
if (Object.keys(changes).length === 0) {
|
|
95
|
+
return error(new Error('Debes informar al menos un campo a actualizar además de idReg.'));
|
|
96
|
+
}
|
|
97
|
+
const current = await client.getCliente(idReg);
|
|
98
|
+
const body = mergeForUpdate(current, changes);
|
|
99
|
+
const updated = await client.updateCliente(idReg, body);
|
|
100
|
+
return ok(updated);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (err instanceof FreematicaError)
|
|
104
|
+
return error(err);
|
|
105
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
47
108
|
}
|
|
48
109
|
//# sourceMappingURL=clientes.js.map
|