@nubiia/mcp-freematica 0.6.4 → 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 +44 -12
- package/dist/clients/freematica-client.d.ts +264 -1
- package/dist/clients/freematica-client.js +387 -1
- package/dist/clients/freematica-client.js.map +1 -1
- package/dist/config.d.ts +22 -1
- package/dist/config.js +29 -1
- package/dist/config.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/contratos.d.ts +268 -5
- package/dist/schemas/contratos.js +402 -1
- package/dist/schemas/contratos.js.map +1 -1
- 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 +68 -1
- package/dist/server-instructions.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.js +5 -5
- 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 +6 -0
- package/dist/tools/contratos/cabecera.js +128 -0
- package/dist/tools/contratos/cabecera.js.map +1 -0
- package/dist/tools/contratos/index.d.ts +21 -0
- package/dist/tools/contratos/index.js +31 -0
- package/dist/tools/contratos/index.js.map +1 -0
- package/dist/tools/contratos/materiales.d.ts +4 -0
- package/dist/tools/{contratos.js → contratos/materiales.js} +5 -11
- package/dist/tools/contratos/materiales.js.map +1 -0
- package/dist/tools/contratos/opcionales.d.ts +5 -0
- package/dist/tools/contratos/opcionales.js +106 -0
- package/dist/tools/contratos/opcionales.js.map +1 -0
- package/dist/tools/contratos/servicios.d.ts +5 -0
- package/dist/tools/contratos/servicios.js +215 -0
- package/dist/tools/contratos/servicios.js.map +1 -0
- 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/dist/transports/http.d.ts +2 -0
- package/dist/transports/http.js +3 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/stdio.d.ts +2 -0
- package/dist/transports/stdio.js +3 -1
- package/dist/transports/stdio.js.map +1 -1
- package/dist/types/contratos.d.ts +29 -0
- package/dist/utils/idreg.d.ts +37 -0
- package/dist/utils/idreg.js +52 -0
- package/dist/utils/idreg.js.map +1 -0
- package/package.json +1 -1
- package/dist/tools/contratos.d.ts +0 -10
- package/dist/tools/contratos.js.map +0 -1
|
@@ -1,7 +1,270 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const CreateContratoShape: {
|
|
3
|
+
empresa: z.ZodOptional<z.ZodString>;
|
|
4
|
+
codContrato: z.ZodOptional<z.ZodString>;
|
|
5
|
+
pais: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
provincia: z.ZodOptional<z.ZodString>;
|
|
7
|
+
codPostal: z.ZodOptional<z.ZodString>;
|
|
8
|
+
poblacion: z.ZodOptional<z.ZodString>;
|
|
9
|
+
tipoVia: z.ZodOptional<z.ZodString>;
|
|
10
|
+
nombreVia: z.ZodOptional<z.ZodString>;
|
|
11
|
+
ubicacionVia: z.ZodOptional<z.ZodString>;
|
|
12
|
+
abierto: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
localizacionServicio: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
estadistico: z.ZodOptional<z.ZodString>;
|
|
15
|
+
delegacion: z.ZodString;
|
|
16
|
+
descripcion: z.ZodString;
|
|
17
|
+
fecha: z.ZodString;
|
|
18
|
+
codCliente: z.ZodString;
|
|
19
|
+
};
|
|
20
|
+
export declare const UpdateContratoShape: {
|
|
21
|
+
empresa: z.ZodOptional<z.ZodString>;
|
|
22
|
+
codContrato: z.ZodOptional<z.ZodString>;
|
|
23
|
+
pais: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
provincia: z.ZodOptional<z.ZodString>;
|
|
25
|
+
codPostal: z.ZodOptional<z.ZodString>;
|
|
26
|
+
poblacion: z.ZodOptional<z.ZodString>;
|
|
27
|
+
tipoVia: z.ZodOptional<z.ZodString>;
|
|
28
|
+
nombreVia: z.ZodOptional<z.ZodString>;
|
|
29
|
+
ubicacionVia: z.ZodOptional<z.ZodString>;
|
|
30
|
+
abierto: z.ZodOptional<z.ZodBoolean>;
|
|
31
|
+
localizacionServicio: z.ZodOptional<z.ZodNumber>;
|
|
32
|
+
estadistico: z.ZodOptional<z.ZodString>;
|
|
33
|
+
idReg: z.ZodString;
|
|
34
|
+
delegacion: z.ZodOptional<z.ZodString>;
|
|
35
|
+
descripcion: z.ZodOptional<z.ZodString>;
|
|
36
|
+
fecha: z.ZodOptional<z.ZodString>;
|
|
37
|
+
codCliente: z.ZodOptional<z.ZodString>;
|
|
38
|
+
};
|
|
39
|
+
export type ContratoFields = {
|
|
40
|
+
empresa?: string;
|
|
41
|
+
delegacion?: string;
|
|
42
|
+
codContrato?: string;
|
|
43
|
+
descripcion?: string;
|
|
44
|
+
fecha?: string;
|
|
45
|
+
codCliente?: string;
|
|
46
|
+
pais?: number;
|
|
47
|
+
provincia?: string;
|
|
48
|
+
codPostal?: string;
|
|
49
|
+
poblacion?: string;
|
|
50
|
+
tipoVia?: string;
|
|
51
|
+
nombreVia?: string;
|
|
52
|
+
ubicacionVia?: string;
|
|
53
|
+
abierto?: boolean;
|
|
54
|
+
localizacionServicio?: number;
|
|
55
|
+
estadistico?: string;
|
|
56
|
+
};
|
|
57
|
+
/** Construye el body VoContratos a partir de los campos amigables definidos. */
|
|
58
|
+
export declare function buildContratoBody(args: ContratoFields): Record<string, unknown>;
|
|
59
|
+
export declare const CreateServicioShape: {
|
|
60
|
+
codServicio: z.ZodOptional<z.ZodString>;
|
|
61
|
+
descripcion: z.ZodOptional<z.ZodString>;
|
|
62
|
+
inspector: z.ZodOptional<z.ZodString>;
|
|
63
|
+
tipo: z.ZodOptional<z.ZodString>;
|
|
64
|
+
fechaAlta: z.ZodOptional<z.ZodString>;
|
|
65
|
+
fechaFin: z.ZodOptional<z.ZodString>;
|
|
66
|
+
precioEspecial: z.ZodOptional<z.ZodEnum<{
|
|
67
|
+
0: "0";
|
|
68
|
+
1: "1";
|
|
69
|
+
2: "2";
|
|
70
|
+
}>>;
|
|
71
|
+
nombreResponsable: z.ZodOptional<z.ZodString>;
|
|
72
|
+
situacion: z.ZodOptional<z.ZodString>;
|
|
73
|
+
calendarioFestivo: z.ZodOptional<z.ZodString>;
|
|
74
|
+
secuencial: z.ZodOptional<z.ZodString>;
|
|
75
|
+
clase: z.ZodOptional<z.ZodString>;
|
|
76
|
+
mesIncremento: z.ZodOptional<z.ZodNumber>;
|
|
77
|
+
observacionesPuesto: z.ZodOptional<z.ZodString>;
|
|
78
|
+
idContrato: z.ZodString;
|
|
79
|
+
};
|
|
80
|
+
export declare const UpdateServicioFechasShape: {
|
|
81
|
+
idContrato: z.ZodString;
|
|
82
|
+
idServicio: z.ZodString;
|
|
83
|
+
fechaAlta: z.ZodOptional<z.ZodString>;
|
|
84
|
+
fechaFin: z.ZodOptional<z.ZodString>;
|
|
85
|
+
};
|
|
86
|
+
export type ServicioFields = {
|
|
87
|
+
codServicio?: string;
|
|
88
|
+
descripcion?: string;
|
|
89
|
+
inspector?: string;
|
|
90
|
+
tipo?: string;
|
|
91
|
+
fechaAlta?: string;
|
|
92
|
+
fechaFin?: string;
|
|
93
|
+
precioEspecial?: '0' | '1' | '2';
|
|
94
|
+
nombreResponsable?: string;
|
|
95
|
+
situacion?: string;
|
|
96
|
+
calendarioFestivo?: string;
|
|
97
|
+
secuencial?: string;
|
|
98
|
+
clase?: string;
|
|
99
|
+
mesIncremento?: number;
|
|
100
|
+
observacionesPuesto?: string;
|
|
101
|
+
};
|
|
1
102
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* no inputs. Will be populated as more tools land.
|
|
103
|
+
* Construye el body VoServicios. Los tres campos requeridos por el API
|
|
104
|
+
* (CTRTS_EMP, CTRTS_DELEG, CTRTS_CTRT) se pasan como `parts` (decodificados
|
|
105
|
+
* del idReg del contrato).
|
|
6
106
|
*/
|
|
7
|
-
export {
|
|
107
|
+
export declare function buildServicioBody(parts: {
|
|
108
|
+
empresa: string;
|
|
109
|
+
delegacion: string;
|
|
110
|
+
codContrato: string;
|
|
111
|
+
}, args: ServicioFields): Record<string, unknown>;
|
|
112
|
+
export declare const ServicioHistoricoPreciosShape: {
|
|
113
|
+
fecha: z.ZodOptional<z.ZodString>;
|
|
114
|
+
porcentajeIncremento: z.ZodOptional<z.ZodNumber>;
|
|
115
|
+
precioHoraGlobal: z.ZodOptional<z.ZodNumber>;
|
|
116
|
+
precioHoraGlobalAnterior: z.ZodOptional<z.ZodNumber>;
|
|
117
|
+
precioHoraDiurna: z.ZodOptional<z.ZodNumber>;
|
|
118
|
+
precioHoraDiurnaAnterior: z.ZodOptional<z.ZodNumber>;
|
|
119
|
+
precioHoraNocturna: z.ZodOptional<z.ZodNumber>;
|
|
120
|
+
precioHoraNocturnaAnterior: z.ZodOptional<z.ZodNumber>;
|
|
121
|
+
precioHoraFestiva: z.ZodOptional<z.ZodNumber>;
|
|
122
|
+
precioHoraFestivaAnterior: z.ZodOptional<z.ZodNumber>;
|
|
123
|
+
precioHoraNocturnaFestiva: z.ZodOptional<z.ZodNumber>;
|
|
124
|
+
precioHoraNocturnaFestivaAnterior: z.ZodOptional<z.ZodNumber>;
|
|
125
|
+
importeFijo: z.ZodOptional<z.ZodNumber>;
|
|
126
|
+
importeFijoAnterior: z.ZodOptional<z.ZodNumber>;
|
|
127
|
+
fechaIncremento: z.ZodOptional<z.ZodString>;
|
|
128
|
+
tipoRevision: z.ZodOptional<z.ZodNumber>;
|
|
129
|
+
noAplicado: z.ZodOptional<z.ZodBoolean>;
|
|
130
|
+
origen: z.ZodOptional<z.ZodString>;
|
|
131
|
+
idContrato: z.ZodString;
|
|
132
|
+
idServicio: z.ZodString;
|
|
133
|
+
};
|
|
134
|
+
export type HistoricoPreciosFields = {
|
|
135
|
+
fecha?: string;
|
|
136
|
+
porcentajeIncremento?: number;
|
|
137
|
+
precioHoraGlobal?: number;
|
|
138
|
+
precioHoraGlobalAnterior?: number;
|
|
139
|
+
precioHoraDiurna?: number;
|
|
140
|
+
precioHoraDiurnaAnterior?: number;
|
|
141
|
+
precioHoraNocturna?: number;
|
|
142
|
+
precioHoraNocturnaAnterior?: number;
|
|
143
|
+
precioHoraFestiva?: number;
|
|
144
|
+
precioHoraFestivaAnterior?: number;
|
|
145
|
+
precioHoraNocturnaFestiva?: number;
|
|
146
|
+
precioHoraNocturnaFestivaAnterior?: number;
|
|
147
|
+
importeFijo?: number;
|
|
148
|
+
importeFijoAnterior?: number;
|
|
149
|
+
fechaIncremento?: string;
|
|
150
|
+
tipoRevision?: number;
|
|
151
|
+
noAplicado?: boolean;
|
|
152
|
+
origen?: string;
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Construye el body VoServiciosHistPr. Los campos requeridos SERVHPR_EMP /
|
|
156
|
+
* SERVHPR_DELEG / SERVHPR_CTRT se derivan del idReg del contrato; SERVHPR_SERV
|
|
157
|
+
* del idReg del servicio.
|
|
158
|
+
*/
|
|
159
|
+
export declare function buildHistoricoPreciosBody(parts: {
|
|
160
|
+
empresa: string;
|
|
161
|
+
delegacion: string;
|
|
162
|
+
codContrato: string;
|
|
163
|
+
codServicio: string;
|
|
164
|
+
}, args: HistoricoPreciosFields): Record<string, unknown>;
|
|
165
|
+
export declare const CreateServicioFacturacionTxtShape: {
|
|
166
|
+
idContrato: z.ZodString;
|
|
167
|
+
idServicio: z.ZodString;
|
|
168
|
+
linea: z.ZodString;
|
|
169
|
+
texto: z.ZodOptional<z.ZodString>;
|
|
170
|
+
textoAmpliado: z.ZodOptional<z.ZodString>;
|
|
171
|
+
};
|
|
172
|
+
/** Construye el body VoServiciosFacTxt (5 campos requeridos derivados + textos). */
|
|
173
|
+
export declare function buildFacturacionTxtBody(parts: {
|
|
174
|
+
empresa: string;
|
|
175
|
+
delegacion: string;
|
|
176
|
+
codContrato: string;
|
|
177
|
+
codServicio: string;
|
|
178
|
+
}, args: {
|
|
179
|
+
linea: string;
|
|
180
|
+
texto?: string;
|
|
181
|
+
textoAmpliado?: string;
|
|
182
|
+
}): Record<string, unknown>;
|
|
183
|
+
/**
|
|
184
|
+
* VoServiciosFac tiene 42 campos; se exponen con nombre amigable los de uso
|
|
185
|
+
* común y el resto puede pasarse en `camposAdicionales` con su nombre nativo
|
|
186
|
+
* CTRTF_* (passthrough validado por prefijo).
|
|
187
|
+
*/
|
|
188
|
+
export declare const UpdateServicioFacturacionShape: {
|
|
189
|
+
idContrato: z.ZodString;
|
|
190
|
+
idServicio: z.ZodString;
|
|
191
|
+
tipoCobro: z.ZodOptional<z.ZodString>;
|
|
192
|
+
horasContrato: z.ZodOptional<z.ZodNumber>;
|
|
193
|
+
precioHora: z.ZodOptional<z.ZodNumber>;
|
|
194
|
+
importeFacturacion: z.ZodOptional<z.ZodNumber>;
|
|
195
|
+
claveFacturacion: z.ZodOptional<z.ZodString>;
|
|
196
|
+
referencia: z.ZodOptional<z.ZodString>;
|
|
197
|
+
formaPago: z.ZodOptional<z.ZodString>;
|
|
198
|
+
descuentoEspecial: z.ZodOptional<z.ZodNumber>;
|
|
199
|
+
precioHoraDiurna: z.ZodOptional<z.ZodNumber>;
|
|
200
|
+
precioHoraNocturna: z.ZodOptional<z.ZodNumber>;
|
|
201
|
+
precioHoraFestiva: z.ZodOptional<z.ZodNumber>;
|
|
202
|
+
precioHoraNocturnaFestiva: z.ZodOptional<z.ZodNumber>;
|
|
203
|
+
ivaIncluido: z.ZodOptional<z.ZodBoolean>;
|
|
204
|
+
camposAdicionales: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
205
|
+
};
|
|
206
|
+
export type ServicioFacturacionFields = {
|
|
207
|
+
tipoCobro?: string;
|
|
208
|
+
horasContrato?: number;
|
|
209
|
+
precioHora?: number;
|
|
210
|
+
importeFacturacion?: number;
|
|
211
|
+
claveFacturacion?: string;
|
|
212
|
+
referencia?: string;
|
|
213
|
+
formaPago?: string;
|
|
214
|
+
descuentoEspecial?: number;
|
|
215
|
+
precioHoraDiurna?: number;
|
|
216
|
+
precioHoraNocturna?: number;
|
|
217
|
+
precioHoraFestiva?: number;
|
|
218
|
+
precioHoraNocturnaFestiva?: number;
|
|
219
|
+
ivaIncluido?: boolean;
|
|
220
|
+
camposAdicionales?: Record<string, string | number>;
|
|
221
|
+
};
|
|
222
|
+
/** Construye el body VoServiciosFac (requeridos derivados + campos amigables + passthrough). */
|
|
223
|
+
export declare function buildServicioFacturacionBody(parts: {
|
|
224
|
+
empresa: string;
|
|
225
|
+
delegacion: string;
|
|
226
|
+
codContrato: string;
|
|
227
|
+
codServicio: string;
|
|
228
|
+
}, args: ServicioFacturacionFields): Record<string, unknown>;
|
|
229
|
+
export declare const CreateContratoOpcionalesShape: {
|
|
230
|
+
empresa: z.ZodString;
|
|
231
|
+
delegacion: z.ZodString;
|
|
232
|
+
tipoContrato: z.ZodString;
|
|
233
|
+
numContrato: z.ZodNumber;
|
|
234
|
+
fechaContrato: z.ZodString;
|
|
235
|
+
observaciones1: z.ZodOptional<z.ZodString>;
|
|
236
|
+
observaciones2: z.ZodOptional<z.ZodString>;
|
|
237
|
+
servicio: z.ZodOptional<z.ZodString>;
|
|
238
|
+
categoria: z.ZodOptional<z.ZodString>;
|
|
239
|
+
importeFijo: z.ZodOptional<z.ZodNumber>;
|
|
240
|
+
camposAdicionales: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
241
|
+
};
|
|
242
|
+
export declare const UpdateContratoOpcionalesShape: {
|
|
243
|
+
idReg: z.ZodString;
|
|
244
|
+
empresa: z.ZodOptional<z.ZodString>;
|
|
245
|
+
delegacion: z.ZodOptional<z.ZodString>;
|
|
246
|
+
tipoContrato: z.ZodOptional<z.ZodString>;
|
|
247
|
+
numContrato: z.ZodOptional<z.ZodNumber>;
|
|
248
|
+
fechaContrato: z.ZodOptional<z.ZodString>;
|
|
249
|
+
observaciones1: z.ZodOptional<z.ZodString>;
|
|
250
|
+
observaciones2: z.ZodOptional<z.ZodString>;
|
|
251
|
+
servicio: z.ZodOptional<z.ZodString>;
|
|
252
|
+
categoria: z.ZodOptional<z.ZodString>;
|
|
253
|
+
importeFijo: z.ZodOptional<z.ZodNumber>;
|
|
254
|
+
camposAdicionales: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
255
|
+
};
|
|
256
|
+
export type ContratoOpcionalesFields = {
|
|
257
|
+
empresa?: string;
|
|
258
|
+
delegacion?: string;
|
|
259
|
+
tipoContrato?: string;
|
|
260
|
+
numContrato?: number;
|
|
261
|
+
fechaContrato?: string;
|
|
262
|
+
observaciones1?: string;
|
|
263
|
+
observaciones2?: string;
|
|
264
|
+
servicio?: string;
|
|
265
|
+
categoria?: string;
|
|
266
|
+
importeFijo?: number;
|
|
267
|
+
camposAdicionales?: Record<string, string | number>;
|
|
268
|
+
};
|
|
269
|
+
/** Construye el body VoContratosOpcionales a partir de los campos definidos. */
|
|
270
|
+
export declare function buildContratoOpcionalesBody(args: ContratoOpcionalesFields): Record<string, unknown>;
|
|
@@ -1,2 +1,403 @@
|
|
|
1
|
-
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schemas (raw shapes) e builders de body para las tools del grupo
|
|
4
|
+
* "Contratos y Servicios" (módulos pvss y ppre).
|
|
5
|
+
*
|
|
6
|
+
* Convención: las tools exponen nombres amigables en castellano
|
|
7
|
+
* (descripcion, codCliente, fechaAlta…) y los builders los traducen a los
|
|
8
|
+
* campos nativos del API (CTRT_*, CTRTS_*, SERVHPR_*, CTRTFL_*, CON2_*).
|
|
9
|
+
* Solo se incluyen en el body los campos definidos por el caller.
|
|
10
|
+
*
|
|
11
|
+
* Los límites de longitud provienen del spec OpenAPI
|
|
12
|
+
* (https://api-config.freefy.cloud/openapi.json).
|
|
13
|
+
*/
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/** Fecha en formato ISO YYYY-MM-DD (Freemática también acepta datetime). */
|
|
18
|
+
const isoDate = () => z
|
|
19
|
+
.string()
|
|
20
|
+
.regex(/^\d{4}-\d{2}-\d{2}([ T]\d{2}:\d{2}(:\d{2})?)?$/, 'Formato esperado: YYYY-MM-DD')
|
|
21
|
+
.describe('Fecha en formato YYYY-MM-DD.');
|
|
22
|
+
/** Añade `target[key] = value` solo si value !== undefined. */
|
|
23
|
+
function setIf(target, key, value) {
|
|
24
|
+
if (value !== undefined)
|
|
25
|
+
target[key] = value;
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Cabecera de contrato (VoContratos, campos CTRT_*)
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
const contratoOptionalFieldsShape = {
|
|
31
|
+
empresa: z.string().max(4).optional().describe('Código de empresa (CTRT_EMP, 4c).'),
|
|
32
|
+
codContrato: z
|
|
33
|
+
.string()
|
|
34
|
+
.max(10)
|
|
35
|
+
.optional()
|
|
36
|
+
.describe('Código del contrato (CTRT_COD, 10c). Si se omite en el alta, lo asigna Freemática.'),
|
|
37
|
+
pais: z.number().int().optional().describe('Código de país (CTRT_PAIS).'),
|
|
38
|
+
provincia: z.string().max(5).optional().describe('Provincia (CTRT_PROV, 5c).'),
|
|
39
|
+
codPostal: z.string().max(10).optional().describe('Código postal (CTRT_CPOSTAL, 10c).'),
|
|
40
|
+
poblacion: z.string().max(40).optional().describe('Población (CTRT_POB, 40c).'),
|
|
41
|
+
tipoVia: z.string().max(10).optional().describe('Tipo de vía (CTRT_TVIA, 10c). Ej: CL, AV, PZ.'),
|
|
42
|
+
nombreVia: z.string().max(80).optional().describe('Nombre de vía (CTRT_NOMVIA, 80c).'),
|
|
43
|
+
ubicacionVia: z.string().max(40).optional().describe('Ubicación vía (CTRT_UBIVIA, 40c).'),
|
|
44
|
+
abierto: z
|
|
45
|
+
.boolean()
|
|
46
|
+
.optional()
|
|
47
|
+
.describe('Contrato abierto (CTRT_ABIERTO): true → "1", false → "0".'),
|
|
48
|
+
localizacionServicio: z
|
|
49
|
+
.number()
|
|
50
|
+
.int()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Localización de servicio (CTRT_LOC_SERV).'),
|
|
53
|
+
estadistico: z.string().max(20).optional().describe('Estadístico (CTRT_ESTADISTICO, 20c).'),
|
|
54
|
+
};
|
|
55
|
+
export const CreateContratoShape = {
|
|
56
|
+
delegacion: z.string().max(4).describe('Código de delegación (CTRT_DELEG, 4c). Requerido.'),
|
|
57
|
+
descripcion: z.string().max(40).describe('Descripción del contrato (CTRT_DES, 40c). Requerido.'),
|
|
58
|
+
fecha: isoDate().describe('Fecha del contrato (CTRT_FECHA, YYYY-MM-DD). Requerido.'),
|
|
59
|
+
codCliente: z.string().max(10).describe('Código de cliente (CTRT_COD_CLI, 10c). Requerido.'),
|
|
60
|
+
...contratoOptionalFieldsShape,
|
|
61
|
+
};
|
|
62
|
+
export const UpdateContratoShape = {
|
|
63
|
+
idReg: z
|
|
64
|
+
.string()
|
|
65
|
+
.min(1)
|
|
66
|
+
.describe('idReg opaco del contrato (campo "idReg" en freematica_list_contratos).'),
|
|
67
|
+
delegacion: z.string().max(4).optional().describe('Código de delegación (CTRT_DELEG, 4c).'),
|
|
68
|
+
descripcion: z.string().max(40).optional().describe('Descripción del contrato (CTRT_DES, 40c).'),
|
|
69
|
+
fecha: isoDate().optional().describe('Fecha del contrato (CTRT_FECHA).'),
|
|
70
|
+
codCliente: z.string().max(10).optional().describe('Código de cliente (CTRT_COD_CLI, 10c).'),
|
|
71
|
+
...contratoOptionalFieldsShape,
|
|
72
|
+
};
|
|
73
|
+
/** Construye el body VoContratos a partir de los campos amigables definidos. */
|
|
74
|
+
export function buildContratoBody(args) {
|
|
75
|
+
const body = {};
|
|
76
|
+
setIf(body, 'CTRT_EMP', args.empresa);
|
|
77
|
+
setIf(body, 'CTRT_DELEG', args.delegacion);
|
|
78
|
+
setIf(body, 'CTRT_COD', args.codContrato);
|
|
79
|
+
setIf(body, 'CTRT_DES', args.descripcion);
|
|
80
|
+
setIf(body, 'CTRT_FECHA', args.fecha);
|
|
81
|
+
setIf(body, 'CTRT_COD_CLI', args.codCliente);
|
|
82
|
+
setIf(body, 'CTRT_PAIS', args.pais);
|
|
83
|
+
setIf(body, 'CTRT_PROV', args.provincia);
|
|
84
|
+
setIf(body, 'CTRT_CPOSTAL', args.codPostal);
|
|
85
|
+
setIf(body, 'CTRT_POB', args.poblacion);
|
|
86
|
+
setIf(body, 'CTRT_TVIA', args.tipoVia);
|
|
87
|
+
setIf(body, 'CTRT_NOMVIA', args.nombreVia);
|
|
88
|
+
setIf(body, 'CTRT_UBIVIA', args.ubicacionVia);
|
|
89
|
+
if (args.abierto !== undefined)
|
|
90
|
+
body['CTRT_ABIERTO'] = args.abierto ? '1' : '0';
|
|
91
|
+
setIf(body, 'CTRT_LOC_SERV', args.localizacionServicio);
|
|
92
|
+
setIf(body, 'CTRT_ESTADISTICO', args.estadistico);
|
|
93
|
+
return body;
|
|
94
|
+
}
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
// Servicios de contrato (VoServicios, campos CTRTS_*)
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
const servicioFieldsShape = {
|
|
99
|
+
codServicio: z
|
|
100
|
+
.string()
|
|
101
|
+
.max(10)
|
|
102
|
+
.optional()
|
|
103
|
+
.describe('Código del servicio (CTRTS_COD, 10c). Si se omite, lo asigna Freemática.'),
|
|
104
|
+
descripcion: z.string().max(40).optional().describe('Descripción del servicio (CTRTS_DES, 40c).'),
|
|
105
|
+
inspector: z.string().max(10).optional().describe('Código de inspector (CTRTS_INSP).'),
|
|
106
|
+
tipo: z.string().max(1).optional().describe('Tipo de servicio (CTRTS_TIPO, 1c).'),
|
|
107
|
+
fechaAlta: isoDate().optional().describe('Fecha de alta del servicio (CTRTS_FECALTA).'),
|
|
108
|
+
fechaFin: isoDate().optional().describe('Fecha fin del servicio (CTRTS_FECFIN).'),
|
|
109
|
+
precioEspecial: z
|
|
110
|
+
.enum(['0', '1', '2'])
|
|
111
|
+
.optional()
|
|
112
|
+
.describe('Tipo de cálculo en precio especial (CTRTS_PRECIO_ESP): 0=Nada, 1=Siempre, 2=Solo si hay precio especial.'),
|
|
113
|
+
nombreResponsable: z
|
|
114
|
+
.string()
|
|
115
|
+
.max(40)
|
|
116
|
+
.optional()
|
|
117
|
+
.describe('Descripción responsable cliente (CTRTS_NOMPROD, 40c).'),
|
|
118
|
+
situacion: z.string().max(100).optional().describe('Situación del servicio (CTRTS_SITUACION, 100c).'),
|
|
119
|
+
calendarioFestivo: z
|
|
120
|
+
.string()
|
|
121
|
+
.max(6)
|
|
122
|
+
.optional()
|
|
123
|
+
.describe('Calendario festivo (CTRTS_CALFEST, 6c). Ej: código postal.'),
|
|
124
|
+
secuencial: z.string().max(1).optional().describe('Tipo base operativa (CTRTS_SECUENCIAL, 1c).'),
|
|
125
|
+
clase: z.string().max(4).optional().describe('Código de la clase de servicio (CTRTS_CLASE, 4c).'),
|
|
126
|
+
mesIncremento: z.number().int().min(1).max(12).optional().describe('Mes incremento (CTRTS_MES_INCRE).'),
|
|
127
|
+
observacionesPuesto: z
|
|
128
|
+
.string()
|
|
129
|
+
.max(255)
|
|
130
|
+
.optional()
|
|
131
|
+
.describe('Observaciones puesto (CTRTS_OBS_PUESTO, 255c).'),
|
|
132
|
+
};
|
|
133
|
+
export const CreateServicioShape = {
|
|
134
|
+
idContrato: z
|
|
135
|
+
.string()
|
|
136
|
+
.min(1)
|
|
137
|
+
.describe('idReg opaco del contrato (Base64 "EMP__DELEG__COD"). Los campos requeridos CTRTS_EMP/CTRTS_DELEG/CTRTS_CTRT se derivan de él automáticamente.'),
|
|
138
|
+
...servicioFieldsShape,
|
|
139
|
+
};
|
|
140
|
+
export const UpdateServicioFechasShape = {
|
|
141
|
+
idContrato: z.string().min(1).describe('idReg opaco del contrato.'),
|
|
142
|
+
idServicio: z
|
|
143
|
+
.string()
|
|
144
|
+
.min(1)
|
|
145
|
+
.describe('idReg opaco del servicio (campo "idReg" en freematica_list_servicios_contrato).'),
|
|
146
|
+
fechaAlta: isoDate().optional().describe('Nueva fecha de inicio (CTRTS_FECALTA).'),
|
|
147
|
+
fechaFin: isoDate().optional().describe('Nueva fecha fin (CTRTS_FECFIN).'),
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Construye el body VoServicios. Los tres campos requeridos por el API
|
|
151
|
+
* (CTRTS_EMP, CTRTS_DELEG, CTRTS_CTRT) se pasan como `parts` (decodificados
|
|
152
|
+
* del idReg del contrato).
|
|
153
|
+
*/
|
|
154
|
+
export function buildServicioBody(parts, args) {
|
|
155
|
+
const body = {
|
|
156
|
+
CTRTS_EMP: parts.empresa,
|
|
157
|
+
CTRTS_DELEG: parts.delegacion,
|
|
158
|
+
CTRTS_CTRT: parts.codContrato,
|
|
159
|
+
};
|
|
160
|
+
setIf(body, 'CTRTS_COD', args.codServicio);
|
|
161
|
+
setIf(body, 'CTRTS_DES', args.descripcion);
|
|
162
|
+
setIf(body, 'CTRTS_INSP', args.inspector);
|
|
163
|
+
setIf(body, 'CTRTS_TIPO', args.tipo);
|
|
164
|
+
setIf(body, 'CTRTS_FECALTA', args.fechaAlta);
|
|
165
|
+
setIf(body, 'CTRTS_FECFIN', args.fechaFin);
|
|
166
|
+
setIf(body, 'CTRTS_PRECIO_ESP', args.precioEspecial);
|
|
167
|
+
setIf(body, 'CTRTS_NOMPROD', args.nombreResponsable);
|
|
168
|
+
setIf(body, 'CTRTS_SITUACION', args.situacion);
|
|
169
|
+
setIf(body, 'CTRTS_CALFEST', args.calendarioFestivo);
|
|
170
|
+
setIf(body, 'CTRTS_SECUENCIAL', args.secuencial);
|
|
171
|
+
setIf(body, 'CTRTS_CLASE', args.clase);
|
|
172
|
+
setIf(body, 'CTRTS_MES_INCRE', args.mesIncremento);
|
|
173
|
+
setIf(body, 'CTRTS_OBS_PUESTO', args.observacionesPuesto);
|
|
174
|
+
return body;
|
|
175
|
+
}
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// Histórico de precios de servicio (VoServiciosHistPr, campos SERVHPR_*)
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
const historicoPreciosFieldsShape = {
|
|
180
|
+
fecha: isoDate().optional().describe('Fecha del registro (SERVHPR_FCH).'),
|
|
181
|
+
porcentajeIncremento: z.number().optional().describe('Porcentaje incremento (SERVHPR_PORC_INCR).'),
|
|
182
|
+
precioHoraGlobal: z.number().optional().describe('Precio hora global (SERVHPR_PR_H_GLOBAL).'),
|
|
183
|
+
precioHoraGlobalAnterior: z
|
|
184
|
+
.number()
|
|
185
|
+
.optional()
|
|
186
|
+
.describe('Precio hora global anterior (SERVHPR_PR_H_GLOBAL_ANT).'),
|
|
187
|
+
precioHoraDiurna: z.number().optional().describe('Precio hora diurna (SERVHPR_PR_H_DIUR).'),
|
|
188
|
+
precioHoraDiurnaAnterior: z
|
|
189
|
+
.number()
|
|
190
|
+
.optional()
|
|
191
|
+
.describe('Precio hora diurna anterior (SERVHPR_PR_H_DIUR_ANT).'),
|
|
192
|
+
precioHoraNocturna: z.number().optional().describe('Precio hora nocturna (SERVHPR_PR_H_NOCT).'),
|
|
193
|
+
precioHoraNocturnaAnterior: z
|
|
194
|
+
.number()
|
|
195
|
+
.optional()
|
|
196
|
+
.describe('Precio hora nocturna anterior (SERVHPR_PR_H_NOCT_ANT).'),
|
|
197
|
+
precioHoraFestiva: z.number().optional().describe('Precio hora festiva (SERVHPR_PR_H_FEST).'),
|
|
198
|
+
precioHoraFestivaAnterior: z
|
|
199
|
+
.number()
|
|
200
|
+
.optional()
|
|
201
|
+
.describe('Precio hora festiva anterior (SERVHPR_PR_H_FEST_ANT).'),
|
|
202
|
+
precioHoraNocturnaFestiva: z
|
|
203
|
+
.number()
|
|
204
|
+
.optional()
|
|
205
|
+
.describe('Precio hora nocturna festiva (SERVHPR_PR_H_NOCFEST).'),
|
|
206
|
+
precioHoraNocturnaFestivaAnterior: z
|
|
207
|
+
.number()
|
|
208
|
+
.optional()
|
|
209
|
+
.describe('Precio hora nocturna festiva anterior (SERVHPR_PR_H_NOCFEST_ANT).'),
|
|
210
|
+
importeFijo: z.number().optional().describe('Importe fijo (SERVHPR_IMP_FIJO).'),
|
|
211
|
+
importeFijoAnterior: z.number().optional().describe('Importe fijo anterior (SERVHPR_IMP_FIJO_ANT).'),
|
|
212
|
+
fechaIncremento: isoDate().optional().describe('Fecha incremento (SERVHPR_FCH_INCR).'),
|
|
213
|
+
tipoRevision: z.number().optional().describe('Tipo revisión (SERVHPR_TIPO_REV).'),
|
|
214
|
+
noAplicado: z
|
|
215
|
+
.boolean()
|
|
216
|
+
.optional()
|
|
217
|
+
.describe('No aplicado (SERVHPR_NO_APLICADO): true → "1", false → "0".'),
|
|
218
|
+
origen: z.string().max(1).optional().describe('Origen (SERVHPR_ORIGEN, 1c).'),
|
|
219
|
+
};
|
|
220
|
+
export const ServicioHistoricoPreciosShape = {
|
|
221
|
+
idContrato: z.string().min(1).describe('idReg opaco del contrato.'),
|
|
222
|
+
idServicio: z.string().min(1).describe('idReg opaco del servicio.'),
|
|
223
|
+
...historicoPreciosFieldsShape,
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* Construye el body VoServiciosHistPr. Los campos requeridos SERVHPR_EMP /
|
|
227
|
+
* SERVHPR_DELEG / SERVHPR_CTRT se derivan del idReg del contrato; SERVHPR_SERV
|
|
228
|
+
* del idReg del servicio.
|
|
229
|
+
*/
|
|
230
|
+
export function buildHistoricoPreciosBody(parts, args) {
|
|
231
|
+
const body = {
|
|
232
|
+
SERVHPR_EMP: parts.empresa,
|
|
233
|
+
SERVHPR_DELEG: parts.delegacion,
|
|
234
|
+
SERVHPR_CTRT: parts.codContrato,
|
|
235
|
+
SERVHPR_SERV: parts.codServicio,
|
|
236
|
+
};
|
|
237
|
+
setIf(body, 'SERVHPR_FCH', args.fecha);
|
|
238
|
+
setIf(body, 'SERVHPR_PORC_INCR', args.porcentajeIncremento);
|
|
239
|
+
setIf(body, 'SERVHPR_PR_H_GLOBAL', args.precioHoraGlobal);
|
|
240
|
+
setIf(body, 'SERVHPR_PR_H_GLOBAL_ANT', args.precioHoraGlobalAnterior);
|
|
241
|
+
setIf(body, 'SERVHPR_PR_H_DIUR', args.precioHoraDiurna);
|
|
242
|
+
setIf(body, 'SERVHPR_PR_H_DIUR_ANT', args.precioHoraDiurnaAnterior);
|
|
243
|
+
setIf(body, 'SERVHPR_PR_H_NOCT', args.precioHoraNocturna);
|
|
244
|
+
setIf(body, 'SERVHPR_PR_H_NOCT_ANT', args.precioHoraNocturnaAnterior);
|
|
245
|
+
setIf(body, 'SERVHPR_PR_H_FEST', args.precioHoraFestiva);
|
|
246
|
+
setIf(body, 'SERVHPR_PR_H_FEST_ANT', args.precioHoraFestivaAnterior);
|
|
247
|
+
setIf(body, 'SERVHPR_PR_H_NOCFEST', args.precioHoraNocturnaFestiva);
|
|
248
|
+
setIf(body, 'SERVHPR_PR_H_NOCFEST_ANT', args.precioHoraNocturnaFestivaAnterior);
|
|
249
|
+
setIf(body, 'SERVHPR_IMP_FIJO', args.importeFijo);
|
|
250
|
+
setIf(body, 'SERVHPR_IMP_FIJO_ANT', args.importeFijoAnterior);
|
|
251
|
+
setIf(body, 'SERVHPR_FCH_INCR', args.fechaIncremento);
|
|
252
|
+
setIf(body, 'SERVHPR_TIPO_REV', args.tipoRevision);
|
|
253
|
+
if (args.noAplicado !== undefined)
|
|
254
|
+
body['SERVHPR_NO_APLICADO'] = args.noAplicado ? '1' : '0';
|
|
255
|
+
setIf(body, 'SERVHPR_ORIGEN', args.origen);
|
|
256
|
+
return body;
|
|
257
|
+
}
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// Textos de facturación de servicio (VoServiciosFacTxt, campos CTRTFL_*)
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
export const CreateServicioFacturacionTxtShape = {
|
|
262
|
+
idContrato: z.string().min(1).describe('idReg opaco del contrato.'),
|
|
263
|
+
idServicio: z.string().min(1).describe('idReg opaco del servicio.'),
|
|
264
|
+
linea: z.string().max(4).describe('Código de línea (CTRTFL_LIN, 4c). Requerido.'),
|
|
265
|
+
texto: z.string().max(40).optional().describe('Descripción (CTRTFL_TXT, 40c).'),
|
|
266
|
+
textoAmpliado: z
|
|
267
|
+
.string()
|
|
268
|
+
.max(255)
|
|
269
|
+
.optional()
|
|
270
|
+
.describe('Descripción ampliada (CTRTFL_TXT_AMPLIADO, 255c).'),
|
|
271
|
+
};
|
|
272
|
+
/** Construye el body VoServiciosFacTxt (5 campos requeridos derivados + textos). */
|
|
273
|
+
export function buildFacturacionTxtBody(parts, args) {
|
|
274
|
+
const body = {
|
|
275
|
+
CTRTFL_EMP: parts.empresa,
|
|
276
|
+
CTRTFL_DELEG: parts.delegacion,
|
|
277
|
+
CTRTFL_CTRT: parts.codContrato,
|
|
278
|
+
CTRTFL_SERV: parts.codServicio,
|
|
279
|
+
CTRTFL_LIN: args.linea,
|
|
280
|
+
};
|
|
281
|
+
setIf(body, 'CTRTFL_TXT', args.texto);
|
|
282
|
+
setIf(body, 'CTRTFL_TXT_AMPLIADO', args.textoAmpliado);
|
|
283
|
+
return body;
|
|
284
|
+
}
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
// Datos de facturación de servicio (VoServiciosFac, campos CTRTF_*)
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
/**
|
|
289
|
+
* VoServiciosFac tiene 42 campos; se exponen con nombre amigable los de uso
|
|
290
|
+
* común y el resto puede pasarse en `camposAdicionales` con su nombre nativo
|
|
291
|
+
* CTRTF_* (passthrough validado por prefijo).
|
|
292
|
+
*/
|
|
293
|
+
export const UpdateServicioFacturacionShape = {
|
|
294
|
+
idContrato: z.string().min(1).describe('idReg opaco del contrato.'),
|
|
295
|
+
idServicio: z.string().min(1).describe('idReg opaco del servicio.'),
|
|
296
|
+
tipoCobro: z.string().max(1).optional().describe('Tipo de cobro (CTRTF_TIPCOB, 1c).'),
|
|
297
|
+
horasContrato: z.number().optional().describe('Horas contrato (CTRTF_HHCTRT).'),
|
|
298
|
+
precioHora: z.number().optional().describe('Precio hora (CTRTF_PRECIOH).'),
|
|
299
|
+
importeFacturacion: z.number().optional().describe('Importe facturación (CTRTF_IMPFACF).'),
|
|
300
|
+
claveFacturacion: z.string().max(4).optional().describe('Clave facturación (CTRTF_CLAVEF, 4c).'),
|
|
301
|
+
referencia: z.string().max(40).optional().describe('Referencia (CTRTF_REF, 40c).'),
|
|
302
|
+
formaPago: z.string().max(3).optional().describe('Forma de pago (CTRTF_FPAGO, 3c).'),
|
|
303
|
+
descuentoEspecial: z
|
|
304
|
+
.number()
|
|
305
|
+
.optional()
|
|
306
|
+
.describe('Porcentaje descuento especial (CTRTF_DTO_ESP).'),
|
|
307
|
+
precioHoraDiurna: z.number().optional().describe('Precio hora diurna (CTRTF_PRECIOH_D).'),
|
|
308
|
+
precioHoraNocturna: z.number().optional().describe('Precio hora nocturna (CTRTF_PRECIOH_N).'),
|
|
309
|
+
precioHoraFestiva: z.number().optional().describe('Precio hora festiva (CTRTF_PRECIOH_F).'),
|
|
310
|
+
precioHoraNocturnaFestiva: z
|
|
311
|
+
.number()
|
|
312
|
+
.optional()
|
|
313
|
+
.describe('Precio hora nocturno festivo (CTRTF_PRECIOH_NF).'),
|
|
314
|
+
ivaIncluido: z
|
|
315
|
+
.boolean()
|
|
316
|
+
.optional()
|
|
317
|
+
.describe('IVA incluido (CTRTF_IVA_INC): true → "1", false → "0".'),
|
|
318
|
+
camposAdicionales: z
|
|
319
|
+
.record(z.string().regex(/^CTRTF_/, 'Las claves deben empezar por CTRTF_'), z.union([z.string(), z.number()]))
|
|
320
|
+
.optional()
|
|
321
|
+
.describe('Campos VoServiciosFac adicionales con su nombre nativo CTRTF_* (ej: CTRTF_PORCFAC, CTRTF_SERVFAC). Ver spec OpenAPI.'),
|
|
322
|
+
};
|
|
323
|
+
/** Construye el body VoServiciosFac (requeridos derivados + campos amigables + passthrough). */
|
|
324
|
+
export function buildServicioFacturacionBody(parts, args) {
|
|
325
|
+
const body = {
|
|
326
|
+
CTRTF_EMP: parts.empresa,
|
|
327
|
+
CTRTF_DELEG: parts.delegacion,
|
|
328
|
+
CTRTF_CTRT: parts.codContrato,
|
|
329
|
+
CTRTF_SERV: parts.codServicio,
|
|
330
|
+
};
|
|
331
|
+
setIf(body, 'CTRTF_TIPCOB', args.tipoCobro);
|
|
332
|
+
setIf(body, 'CTRTF_HHCTRT', args.horasContrato);
|
|
333
|
+
setIf(body, 'CTRTF_PRECIOH', args.precioHora);
|
|
334
|
+
setIf(body, 'CTRTF_IMPFACF', args.importeFacturacion);
|
|
335
|
+
setIf(body, 'CTRTF_CLAVEF', args.claveFacturacion);
|
|
336
|
+
setIf(body, 'CTRTF_REF', args.referencia);
|
|
337
|
+
setIf(body, 'CTRTF_FPAGO', args.formaPago);
|
|
338
|
+
setIf(body, 'CTRTF_DTO_ESP', args.descuentoEspecial);
|
|
339
|
+
setIf(body, 'CTRTF_PRECIOH_D', args.precioHoraDiurna);
|
|
340
|
+
setIf(body, 'CTRTF_PRECIOH_N', args.precioHoraNocturna);
|
|
341
|
+
setIf(body, 'CTRTF_PRECIOH_F', args.precioHoraFestiva);
|
|
342
|
+
setIf(body, 'CTRTF_PRECIOH_NF', args.precioHoraNocturnaFestiva);
|
|
343
|
+
if (args.ivaIncluido !== undefined)
|
|
344
|
+
body['CTRTF_IVA_INC'] = args.ivaIncluido ? '1' : '0';
|
|
345
|
+
if (args.camposAdicionales)
|
|
346
|
+
Object.assign(body, args.camposAdicionales);
|
|
347
|
+
return body;
|
|
348
|
+
}
|
|
349
|
+
// ---------------------------------------------------------------------------
|
|
350
|
+
// Opcionales de contrato (VoContratosOpcionales, campos CON2_*, módulo ppre)
|
|
351
|
+
// ---------------------------------------------------------------------------
|
|
352
|
+
const opcionalesCamposAdicionales = z
|
|
353
|
+
.record(z.string().regex(/^CON2_/, 'Las claves deben empezar por CON2_'), z.union([z.string(), z.number()]))
|
|
354
|
+
.optional()
|
|
355
|
+
.describe('Campos VoContratosOpcionales adicionales con su nombre nativo CON2_* (ej: CON2_OPC_NUM1..10, CON2_OPC_ALFA1..10, CON2_DTO_CUOTA). Ver spec OpenAPI.');
|
|
356
|
+
export const CreateContratoOpcionalesShape = {
|
|
357
|
+
empresa: z.string().max(4).describe('Empresa (CON2_CODEMP, 4c). Requerido.'),
|
|
358
|
+
delegacion: z.string().max(4).describe('Delegación (CON2_DELEG, 4c). Requerido.'),
|
|
359
|
+
tipoContrato: z.string().max(4).describe('Tipo de contrato (CON2_TIPOCONT, 4c). Requerido.'),
|
|
360
|
+
numContrato: z.number().describe('Número de contrato (CON2_NUMCONT). Requerido.'),
|
|
361
|
+
fechaContrato: isoDate().describe('Fecha del contrato (CON2_FCHCONT). Requerido.'),
|
|
362
|
+
observaciones1: z.string().max(255).optional().describe('Observaciones 1 (CON2_OBSERV1, 255c).'),
|
|
363
|
+
observaciones2: z.string().max(255).optional().describe('Observaciones 2 (CON2_OBSERV2, 255c).'),
|
|
364
|
+
servicio: z.string().max(4).optional().describe('Servicio (CON2_SERVICIO, 4c).'),
|
|
365
|
+
categoria: z.string().max(4).optional().describe('Categoría (CON2_CATEGORIA, 4c).'),
|
|
366
|
+
importeFijo: z.number().optional().describe('Importe fijo (CON2_IMPORTE_FIJO).'),
|
|
367
|
+
camposAdicionales: opcionalesCamposAdicionales,
|
|
368
|
+
};
|
|
369
|
+
export const UpdateContratoOpcionalesShape = {
|
|
370
|
+
idReg: z
|
|
371
|
+
.string()
|
|
372
|
+
.min(1)
|
|
373
|
+
.describe('idReg opaco del registro de opcionales (campo "idReg" en freematica_list_contratos_opcionales).'),
|
|
374
|
+
empresa: z.string().max(4).optional().describe('Empresa (CON2_CODEMP, 4c).'),
|
|
375
|
+
delegacion: z.string().max(4).optional().describe('Delegación (CON2_DELEG, 4c).'),
|
|
376
|
+
tipoContrato: z.string().max(4).optional().describe('Tipo de contrato (CON2_TIPOCONT, 4c).'),
|
|
377
|
+
numContrato: z.number().optional().describe('Número de contrato (CON2_NUMCONT).'),
|
|
378
|
+
fechaContrato: isoDate().optional().describe('Fecha del contrato (CON2_FCHCONT).'),
|
|
379
|
+
observaciones1: z.string().max(255).optional().describe('Observaciones 1 (CON2_OBSERV1, 255c).'),
|
|
380
|
+
observaciones2: z.string().max(255).optional().describe('Observaciones 2 (CON2_OBSERV2, 255c).'),
|
|
381
|
+
servicio: z.string().max(4).optional().describe('Servicio (CON2_SERVICIO, 4c).'),
|
|
382
|
+
categoria: z.string().max(4).optional().describe('Categoría (CON2_CATEGORIA, 4c).'),
|
|
383
|
+
importeFijo: z.number().optional().describe('Importe fijo (CON2_IMPORTE_FIJO).'),
|
|
384
|
+
camposAdicionales: opcionalesCamposAdicionales,
|
|
385
|
+
};
|
|
386
|
+
/** Construye el body VoContratosOpcionales a partir de los campos definidos. */
|
|
387
|
+
export function buildContratoOpcionalesBody(args) {
|
|
388
|
+
const body = {};
|
|
389
|
+
setIf(body, 'CON2_CODEMP', args.empresa);
|
|
390
|
+
setIf(body, 'CON2_DELEG', args.delegacion);
|
|
391
|
+
setIf(body, 'CON2_TIPOCONT', args.tipoContrato);
|
|
392
|
+
setIf(body, 'CON2_NUMCONT', args.numContrato);
|
|
393
|
+
setIf(body, 'CON2_FCHCONT', args.fechaContrato);
|
|
394
|
+
setIf(body, 'CON2_OBSERV1', args.observaciones1);
|
|
395
|
+
setIf(body, 'CON2_OBSERV2', args.observaciones2);
|
|
396
|
+
setIf(body, 'CON2_SERVICIO', args.servicio);
|
|
397
|
+
setIf(body, 'CON2_CATEGORIA', args.categoria);
|
|
398
|
+
setIf(body, 'CON2_IMPORTE_FIJO', args.importeFijo);
|
|
399
|
+
if (args.camposAdicionales)
|
|
400
|
+
Object.assign(body, args.camposAdicionales);
|
|
401
|
+
return body;
|
|
402
|
+
}
|
|
2
403
|
//# sourceMappingURL=contratos.js.map
|