@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.
Files changed (60) hide show
  1. package/README.md +44 -12
  2. package/dist/clients/freematica-client.d.ts +264 -1
  3. package/dist/clients/freematica-client.js +387 -1
  4. package/dist/clients/freematica-client.js.map +1 -1
  5. package/dist/config.d.ts +22 -1
  6. package/dist/config.js +29 -1
  7. package/dist/config.js.map +1 -1
  8. package/dist/schemas/clientes.d.ts +164 -0
  9. package/dist/schemas/clientes.js +205 -0
  10. package/dist/schemas/clientes.js.map +1 -0
  11. package/dist/schemas/contratos.d.ts +268 -5
  12. package/dist/schemas/contratos.js +402 -1
  13. package/dist/schemas/contratos.js.map +1 -1
  14. package/dist/schemas/localizaciones.d.ts +90 -0
  15. package/dist/schemas/localizaciones.js +145 -0
  16. package/dist/schemas/localizaciones.js.map +1 -0
  17. package/dist/server-instructions.js +68 -1
  18. package/dist/server-instructions.js.map +1 -1
  19. package/dist/server.d.ts +6 -0
  20. package/dist/server.js +5 -5
  21. package/dist/server.js.map +1 -1
  22. package/dist/tools/clientes.d.ts +2 -1
  23. package/dist/tools/clientes.js +63 -2
  24. package/dist/tools/clientes.js.map +1 -1
  25. package/dist/tools/contactos-clientes.d.ts +2 -1
  26. package/dist/tools/contactos-clientes.js +58 -4
  27. package/dist/tools/contactos-clientes.js.map +1 -1
  28. package/dist/tools/contratos/cabecera.d.ts +6 -0
  29. package/dist/tools/contratos/cabecera.js +128 -0
  30. package/dist/tools/contratos/cabecera.js.map +1 -0
  31. package/dist/tools/contratos/index.d.ts +21 -0
  32. package/dist/tools/contratos/index.js +31 -0
  33. package/dist/tools/contratos/index.js.map +1 -0
  34. package/dist/tools/contratos/materiales.d.ts +4 -0
  35. package/dist/tools/{contratos.js → contratos/materiales.js} +5 -11
  36. package/dist/tools/contratos/materiales.js.map +1 -0
  37. package/dist/tools/contratos/opcionales.d.ts +5 -0
  38. package/dist/tools/contratos/opcionales.js +106 -0
  39. package/dist/tools/contratos/opcionales.js.map +1 -0
  40. package/dist/tools/contratos/servicios.d.ts +5 -0
  41. package/dist/tools/contratos/servicios.js +215 -0
  42. package/dist/tools/contratos/servicios.js.map +1 -0
  43. package/dist/tools/helpers.d.ts +4 -0
  44. package/dist/tools/helpers.js.map +1 -1
  45. package/dist/tools/localizaciones.d.ts +2 -1
  46. package/dist/tools/localizaciones.js +149 -2
  47. package/dist/tools/localizaciones.js.map +1 -1
  48. package/dist/transports/http.d.ts +2 -0
  49. package/dist/transports/http.js +3 -1
  50. package/dist/transports/http.js.map +1 -1
  51. package/dist/transports/stdio.d.ts +2 -0
  52. package/dist/transports/stdio.js +3 -1
  53. package/dist/transports/stdio.js.map +1 -1
  54. package/dist/types/contratos.d.ts +29 -0
  55. package/dist/utils/idreg.d.ts +37 -0
  56. package/dist/utils/idreg.js +52 -0
  57. package/dist/utils/idreg.js.map +1 -0
  58. package/package.json +1 -1
  59. package/dist/tools/contratos.d.ts +0 -10
  60. package/dist/tools/contratos.js.map +0 -1
package/README.md CHANGED
@@ -59,6 +59,37 @@ MCP server que expone operaciones del API REST de Freemática (ERP: facturación
59
59
  | `freematica_list_albaranes_factura` | `GET /pven/v2/albaranes-facturas` | Lista paginada de vinculaciones albarán↔factura (idReg nativo + FIQL) |
60
60
  | `freematica_get_albaran_factura` | `GET /pven/v2/albaranes-facturas/{idReg}` | Detalle de una vinculación albarán-factura |
61
61
  | `freematica_list_resultados_facturacion` | `GET /pvss/v1/facturacion-resultados` | Resultados del proceso batch de facturación automática de vigilancia (FIQL) |
62
+ | `freematica_list_contratos` | `GET /pvss/v1/contratos` | Lista paginada de cabeceras de contratos (solo filtros nativos: el API ignora FIQL aquí) |
63
+ | `freematica_get_contrato` | `GET /pvss/v1/contratos` (scan) | Busca un contrato por empresa + código natural (paginación interna + filtrado en cliente) |
64
+ | `freematica_list_servicios_contrato` | `GET /pvss/v1/contratos/{idReg}/servicios` | Servicios de un contrato |
65
+ | `freematica_get_servicio_contrato` | `GET /pvss/v2/contratos-servicios/{idReg}` | Detalle de un servicio de contrato |
66
+ | `freematica_list_contratos_opcionales` | `GET /ppre/v2/contratos/opcionales` | Lista paginada de opcionales de contratos |
67
+ | `freematica_get_contrato_opcionales` | `GET /ppre/v2/contratos/opcionales/{idReg}` | Detalle de un registro de opcionales |
68
+ | `freematica_list_localizaciones_envio_clientes` | `GET /pgrl/v2/localizaciones-envio-clientes` | Localizaciones de envío de clientes |
69
+ | `freematica_list_localizaciones_factura_clientes` | `GET /pgrl/v2/localizaciones-factura-clientes` | Localizaciones de factura de clientes |
70
+
71
+ ### Tools de escritura (requieren `FREEMATICA_ENABLE_WRITES=true`)
72
+
73
+ Por defecto el servidor es de **solo lectura**. Con `FREEMATICA_ENABLE_WRITES=true` se registran además estas tools de creación y actualización. **No existe ninguna tool de borrado.** Todas las escrituras dejan log de auditoría (operación + endpoint + campos a nivel info; body completo a nivel debug).
74
+
75
+ | Tool | Endpoint Freemática | Descripción |
76
+ | ---------------------------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------- |
77
+ | `freematica_create_contrato` | `POST /pvss/v2/contratos` | Alta de cabecera de contrato |
78
+ | `freematica_update_contrato` | `PUT /pvss/v2/contratos/{idReg}` | Actualización de cabecera de contrato |
79
+ | `freematica_create_servicio_contrato` | `POST /pvss/v2/contratos/{idReg}/servicios` | Alta de servicio (identificación derivada del idReg) |
80
+ | `freematica_update_servicio_fechas` | `PUT /pvss/v2/contratos/{id}/servicio/{id}` | Fechas inicio/fin del servicio (mecanismo de baja) |
81
+ | `freematica_create_servicio_historico_precios` | `POST /pvss/v2/contratos/{id}/servicios-historico-precios/{id}` | Alta de revisión de precios del servicio |
82
+ | `freematica_update_servicio_historico_precios` | `PUT /pvss/v2/contratos/{id}/servicios-historico-precios/{id}` | Actualización de revisión de precios |
83
+ | `freematica_create_servicio_facturacion_txt` | `POST /pvss/v2/contratos/{id}/servicios-facturacion-txt/{id}` | Alta de línea de texto de facturación |
84
+ | `freematica_update_servicio_facturacion` | `PUT /pvss/v2/contratos/{id}/servicios-facturacion/{id}` | Datos de facturación del servicio (precios hora, forma de pago…) |
85
+ | `freematica_create_contrato_opcionales` | `POST /ppre/v2/contratos/opcionales` | Alta de opcionales de contrato |
86
+ | `freematica_update_contrato_opcionales` | `PUT /ppre/v2/contratos/opcionales/{idReg}` | Actualización de opcionales de contrato |
87
+ | `freematica_create_cliente` | `POST /pgrl/v2/clientes` | Alta de cliente (idReg derivado de grupo+código) |
88
+ | `freematica_update_cliente` | `PUT /pgrl/v2/clientes/{idReg}` | Actualización parcial de cliente (fetch+merge) |
89
+ | `freematica_create_contacto_cliente` | `POST /pgrl/v2/contactos-clientes` | Alta de contacto de cliente |
90
+ | `freematica_update_contacto_cliente` | `PUT /pgrl/v2/contactos-clientes/{idReg}` | Actualización parcial de contacto (fetch+merge) |
91
+ | `freematica_create_localizacion_cliente` | `POST /pgrl/v2/localizaciones-{tipo}-clientes` | Alta de localización (tipo: cobro/envio/factura/servicio) |
92
+ | `freematica_update_localizacion_cliente` | `PUT /pgrl/v2/localizaciones-{tipo}-clientes/{idReg}` | Actualización parcial de localización (fetch+merge) |
62
93
 
63
94
  ## Filtros tipados (FIQL interno)
64
95
 
@@ -234,18 +265,19 @@ El servidor lee toda su configuración de **variables de entorno** al arrancar.
234
265
 
235
266
  Variables de entorno opcionales para tuning de comportamiento en producción:
236
267
 
237
- | Variable | Default | Descripción |
238
- | --------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
239
- | `FREEMATICA_BASE_URL` | `https://api-p01.clientservicepanel.com/restsat/api` | Base URL del API de Freemática. Cambiar solo si Freemática cambia el host o se usa un entorno alternativo. |
240
- | `FREEMATICA_TIMEOUT_MS` | `30000` | Timeout por petición en milisegundos. Si el upstream no responde en este tiempo, el request se cancela con `network_error`. |
241
- | `FREEMATICA_MAX_RETRIES` | `3` | Número máximo de reintentos para errores 5xx y errores de red. Los errores 4xx nunca se reintentan. |
242
- | `FREEMATICA_CIRCUIT_BREAKER_THRESHOLD` | `5` | Número de operaciones lógicas fallidas consecutivas (post-retry-exhaustion) necesarias para abrir el circuit breaker. |
243
- | `FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS` | `30000` | Tiempo en ms que el circuit breaker permanece abierto antes de pasar a half-open. |
244
- | `FREEMATICA_MAX_RESPONSE_SIZE_MB` | `10` | Tamaño máximo de respuesta aceptada del upstream en MB. Respuestas mayores se truncan con aviso en el campo `truncated`. |
245
- | `MCP_TRANSPORT` | `stdio` | Transporte: `stdio` (para Claude Desktop/Code) o `http` (para Nubiia). Equivale al flag `--transport=`. |
246
- | `MCP_PORT` | `3000` | Puerto TCP donde el servidor MCP expone `/mcp` y `/health`. Ignorado en modo stdio. |
247
- | `MCP_ALLOWED_ORIGINS` | `*` | CORS: lista de orígenes permitidos separados por coma, o `*` para todos. En producción restringir al dominio de Nubiia. Ignorado en modo stdio. |
248
- | `LOG_LEVEL` | `info` | Nivel de log para pino: `fatal`, `error`, `warn`, `info`, `debug`, `trace`. En producción usar `info`. En desarrollo usar `debug`. |
268
+ | Variable | Default | Descripción |
269
+ | --------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
270
+ | `FREEMATICA_BASE_URL` | `https://api-p01.clientservicepanel.com/restsat/api` | Base URL del API de Freemática. Cambiar solo si Freemática cambia el host o se usa un entorno alternativo. |
271
+ | `FREEMATICA_TIMEOUT_MS` | `30000` | Timeout por petición en milisegundos. Si el upstream no responde en este tiempo, el request se cancela con `network_error`. |
272
+ | `FREEMATICA_MAX_RETRIES` | `3` | Número máximo de reintentos para errores 5xx y errores de red. Los errores 4xx nunca se reintentan. |
273
+ | `FREEMATICA_CIRCUIT_BREAKER_THRESHOLD` | `5` | Número de operaciones lógicas fallidas consecutivas (post-retry-exhaustion) necesarias para abrir el circuit breaker. |
274
+ | `FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS` | `30000` | Tiempo en ms que el circuit breaker permanece abierto antes de pasar a half-open. |
275
+ | `FREEMATICA_MAX_RESPONSE_SIZE_MB` | `10` | Tamaño máximo de respuesta aceptada del upstream en MB. Respuestas mayores se truncan con aviso en el campo `truncated`. |
276
+ | `FREEMATICA_ENABLE_WRITES` | `false` | Registra las tools de escritura (`freematica_create_*` / `freematica_update_*`). Sin ella el servidor es de solo lectura. Valores: `true`/`false`/`1`/`0`. |
277
+ | `MCP_TRANSPORT` | `stdio` | Transporte: `stdio` (para Claude Desktop/Code) o `http` (para Nubiia). Equivale al flag `--transport=`. |
278
+ | `MCP_PORT` | `3000` | Puerto TCP donde el servidor MCP expone `/mcp` y `/health`. Ignorado en modo stdio. |
279
+ | `MCP_ALLOWED_ORIGINS` | `*` | CORS: lista de orígenes permitidos separados por coma, o `*` para todos. En producción restringir al dominio de Nubiia. Ignorado en modo stdio. |
280
+ | `LOG_LEVEL` | `info` | Nivel de log para pino: `fatal`, `error`, `warn`, `info`, `debug`, `trace`. En producción usar `info`. En desarrollo usar `debug`. |
249
281
 
250
282
  ### De dónde salen las credenciales `x-auth-*`
251
283
 
@@ -3,11 +3,12 @@ import { type MasterDataCatalog } from '../schemas/master-data.js';
3
3
  import { type ListCarteraFilters } from '../schemas/cartera.js';
4
4
  import type { ListFacturasCabeceraFilters, ListFacturaLineasFilters, ListFacturaIvaFilters, ListFacturaVencimientosFilters } from '../schemas/facturas-ventas.js';
5
5
  import { type ListPedidosCompraFilters } from '../schemas/pedidos-compras.js';
6
+ import { type LocalizacionTipo } from '../schemas/localizaciones.js';
6
7
  import type { Cliente } from '../types/clientes.js';
7
8
  import type { ContactoCliente } from '../types/contactos-clientes.js';
8
9
  import type { MasterDataItem } from '../types/master-data.js';
9
10
  import type { OportunidadNegocio } from '../types/oportunidades-negocio.js';
10
- import type { VoContratosServMatAsignado } from '../types/contratos.js';
11
+ import type { VoContrato, VoContratoServicio, VoContratosOpcionales, VoContratosServMatAsignado, VoServiciosFac, VoServiciosFacTxt, VoServiciosHistPr } from '../types/contratos.js';
11
12
  export interface ListResult<T> {
12
13
  items: T[];
13
14
  total: number;
@@ -601,6 +602,268 @@ export declare class FreematicaClient extends BaseClient {
601
602
  traspasado?: string;
602
603
  order?: string;
603
604
  }): Promise<ListResult<Record<string, unknown>>>;
605
+ /**
606
+ * Lista paginada de cabeceras de contratos.
607
+ *
608
+ * Endpoint: GET /pvss/v1/contratos
609
+ *
610
+ * IMPORTANTE: este endpoint IGNORA silenciosamente el query param `rQuery`
611
+ * (verificado empíricamente contra el API real el 2026-07-02: con un filtro
612
+ * FIQL válido devuelve el dataset completo sin error). Por eso solo se
613
+ * exponen los filtros nativos `codEmpresa` y `codDelegacion`; cualquier otro
614
+ * filtrado debe hacerse en cliente (ver `getContrato`).
615
+ *
616
+ * @param opts - Paginación + filtros nativos empresa/delegación + order.
617
+ * @returns Lista paginada de cabeceras de contrato (campos CTRT_*).
618
+ */
619
+ listContratos(opts?: ListOptions & {
620
+ empresa?: string;
621
+ delegacion?: string;
622
+ order?: string;
623
+ }): Promise<ListResult<VoContrato>>;
624
+ /**
625
+ * Busca una cabecera de contrato por sus códigos naturales.
626
+ *
627
+ * No existe un endpoint GET singular para contratos pvss y el listado ignora
628
+ * `rQuery`, así que se pagina el listado (items=200, máximo permitido por el
629
+ * API) filtrando en cliente por CTRT_COD hasta encontrar la coincidencia.
630
+ *
631
+ * @param opts - Códigos naturales del contrato.
632
+ * @returns Cabecera del contrato.
633
+ * @throws FreematicaError('not_found') si no existe.
634
+ */
635
+ getContrato(opts: {
636
+ empresa: string;
637
+ delegacion?: string;
638
+ codContrato: string;
639
+ }): Promise<VoContrato>;
640
+ /**
641
+ * Lista paginada de servicios de un contrato.
642
+ *
643
+ * Endpoint: GET /pvss/v1/contratos/{idContrato}/servicios
644
+ *
645
+ * @param idContrato - idReg opaco del contrato (Base64 "EMP__DELEG__COD").
646
+ * @param opts - Paginación + order.
647
+ * @returns Lista paginada de servicios (campos CTRTS_*).
648
+ */
649
+ listServiciosContrato(idContrato: string, opts?: ListOptions & {
650
+ order?: string;
651
+ }): Promise<ListResult<VoContratoServicio>>;
652
+ /**
653
+ * Detalle de un servicio de contrato por `idReg` opaco.
654
+ *
655
+ * Endpoint: GET /pvss/v2/contratos-servicios/{idreg}
656
+ *
657
+ * @param idReg - idReg opaco del servicio (Base64 "EMP__DELEG__CTRT__COD").
658
+ * @returns Servicio completo.
659
+ */
660
+ getServicioContrato(idReg: string): Promise<VoContratoServicio>;
661
+ /**
662
+ * Lista paginada de opcionales de contratos.
663
+ *
664
+ * Endpoint: GET /ppre/v2/contratos/opcionales
665
+ *
666
+ * @param opts - Paginación + order.
667
+ * @returns Lista paginada de opcionales (campos CON2_*).
668
+ */
669
+ listContratosOpcionales(opts?: ListOptions & {
670
+ order?: string;
671
+ }): Promise<ListResult<VoContratosOpcionales>>;
672
+ /**
673
+ * Detalle de un registro de opcionales de contrato por `idReg` opaco.
674
+ *
675
+ * Endpoint: GET /ppre/v2/contratos/opcionales/{idReg}
676
+ */
677
+ getContratoOpcionales(idReg: string): Promise<VoContratosOpcionales>;
678
+ /**
679
+ * Alta de cabecera de contrato.
680
+ *
681
+ * Endpoint: POST /pvss/v2/contratos — body VoContratos.
682
+ * Campos requeridos por el API: CTRT_DELEG, CTRT_DES, CTRT_FECHA, CTRT_COD_CLI.
683
+ *
684
+ * @param body - Campos CTRT_* del contrato.
685
+ * @returns El contrato creado (VoContratos).
686
+ */
687
+ createContrato(body: VoContrato): Promise<VoContrato>;
688
+ /**
689
+ * Actualización de cabecera de contrato.
690
+ *
691
+ * Endpoint: PUT /pvss/v2/contratos/{idReg} — body VoContratos.
692
+ *
693
+ * @param idReg - idReg opaco del contrato.
694
+ * @param body - Campos CTRT_* a actualizar.
695
+ * @returns Respuesta del API.
696
+ */
697
+ updateContrato(idReg: string, body: VoContrato): Promise<VoContrato>;
698
+ /**
699
+ * Alta de un servicio en un contrato.
700
+ *
701
+ * Endpoint: POST /pvss/v2/contratos/{idReg}/servicios — body VoServicios.
702
+ * Campos requeridos por el API: CTRTS_EMP, CTRTS_DELEG, CTRTS_CTRT (los
703
+ * mismos valores codificados en el idReg del contrato).
704
+ *
705
+ * @param idContrato - idReg opaco del contrato.
706
+ * @param body - Campos CTRTS_* del servicio.
707
+ * @returns El servicio creado (VoServicios).
708
+ */
709
+ createServicioContrato(idContrato: string, body: VoContratoServicio): Promise<VoContratoServicio>;
710
+ /**
711
+ * Actualiza fechas de inicio y fin de un servicio.
712
+ *
713
+ * Endpoint: PUT /pvss/v2/contratos/{idContrato}/servicio/{idServicio}.
714
+ * Según el spec, este endpoint solo actualiza fecha inicio y fecha fin.
715
+ *
716
+ * @param idContrato - idReg opaco del contrato.
717
+ * @param idServicio - idReg opaco del servicio.
718
+ * @param body - Campos CTRTS_* (fechas) a actualizar.
719
+ * @returns Respuesta del API.
720
+ */
721
+ updateServicioFechas(idContrato: string, idServicio: string, body: VoContratoServicio): Promise<VoContratoServicio>;
722
+ /**
723
+ * Actualiza los datos de facturación de un servicio.
724
+ *
725
+ * Endpoint: PUT /pvss/v2/contratos/{idContrato}/servicios-facturacion/{idServicio}.
726
+ *
727
+ * @param idContrato - idReg opaco del contrato.
728
+ * @param idServicio - idReg opaco del servicio.
729
+ * @param body - Campos CTRTF_* a actualizar.
730
+ * @returns Respuesta del API.
731
+ */
732
+ updateServicioFacturacion(idContrato: string, idServicio: string, body: VoServiciosFac): Promise<VoServiciosFac>;
733
+ /**
734
+ * Alta de un texto de facturación de un servicio.
735
+ *
736
+ * Endpoint: POST /pvss/v2/contratos/{idContrato}/servicios-facturacion-txt/{idServicio}.
737
+ *
738
+ * @param idContrato - idReg opaco del contrato.
739
+ * @param idServicio - idReg opaco del servicio.
740
+ * @param body - Campos CTRTFL_* del texto.
741
+ * @returns Respuesta del API.
742
+ */
743
+ createServicioFacturacionTxt(idContrato: string, idServicio: string, body: VoServiciosFacTxt): Promise<VoServiciosFacTxt>;
744
+ /**
745
+ * Alta de un registro de histórico de precios de un servicio.
746
+ *
747
+ * Endpoint: POST /pvss/v2/contratos/{idContrato}/servicios-historico-precios/{idServicio}.
748
+ *
749
+ * @param idContrato - idReg opaco del contrato.
750
+ * @param idServicio - idReg opaco del servicio.
751
+ * @param body - Campos SERVHPR_* del histórico.
752
+ * @returns Respuesta del API (VoServiciosHistPr).
753
+ */
754
+ createServicioHistoricoPrecios(idContrato: string, idServicio: string, body: VoServiciosHistPr): Promise<VoServiciosHistPr>;
755
+ /**
756
+ * Actualiza un registro de histórico de precios de un servicio.
757
+ *
758
+ * Endpoint: PUT /pvss/v2/contratos/{idContrato}/servicios-historico-precios/{idServicio}.
759
+ *
760
+ * @param idContrato - idReg opaco del contrato.
761
+ * @param idServicio - idReg opaco del servicio.
762
+ * @param body - Campos SERVHPR_* a actualizar.
763
+ * @returns Respuesta del API.
764
+ */
765
+ updateServicioHistoricoPrecios(idContrato: string, idServicio: string, body: VoServiciosHistPr): Promise<VoServiciosHistPr>;
766
+ /**
767
+ * Alta de un registro de opcionales de contrato.
768
+ *
769
+ * Endpoint: POST /ppre/v2/contratos/opcionales — body VoContratosOpcionales.
770
+ * Campos requeridos por el API: CON2_CODEMP, CON2_DELEG, CON2_TIPOCONT,
771
+ * CON2_NUMCONT, CON2_FCHCONT.
772
+ *
773
+ * @param body - Campos CON2_* del registro.
774
+ * @returns El registro creado.
775
+ */
776
+ createContratoOpcionales(body: VoContratosOpcionales): Promise<VoContratosOpcionales>;
777
+ /**
778
+ * Actualiza un registro de opcionales de contrato.
779
+ *
780
+ * Endpoint: PUT /ppre/v2/contratos/opcionales/{idReg}.
781
+ *
782
+ * @param idReg - idReg opaco del registro de opcionales.
783
+ * @param body - Campos CON2_* a actualizar.
784
+ * @returns Respuesta del API.
785
+ */
786
+ updateContratoOpcionales(idReg: string, body: VoContratosOpcionales): Promise<VoContratosOpcionales>;
787
+ /**
788
+ * Log de auditoría de operaciones de escritura.
789
+ *
790
+ * Nivel info: operación + endpoint + claves del body (sin valores).
791
+ * Nivel debug: body completo, para poder reconstruir la operación.
792
+ */
793
+ private logWrite;
794
+ /**
795
+ * Alta de cliente.
796
+ *
797
+ * Endpoint: POST /pgrl/v2/clientes — body VoClientes.
798
+ * Requeridos por el API: idReg, COD_GRUPO_CLI, COD_CLI, NOMBRE_CLI, NIF,
799
+ * TIPO_IMPTO, COD_DIVISA, TIPO_FACT.
800
+ */
801
+ createCliente(body: Record<string, unknown>): Promise<Record<string, unknown>>;
802
+ /**
803
+ * Actualización de cliente.
804
+ *
805
+ * Endpoint: PUT /pgrl/v2/clientes/{idReg} — body VoClientes completo
806
+ * (el caller hace fetch+merge antes de llamar).
807
+ */
808
+ updateCliente(idReg: string, body: Record<string, unknown>): Promise<Record<string, unknown>>;
809
+ /**
810
+ * Detalle de un contacto de cliente por `idReg` opaco.
811
+ *
812
+ * Endpoint: GET /pgrl/v1/contactos-clientes/{idreg}
813
+ * (v2 solo expone el listado; el singular es v1 pero devuelve las mismas
814
+ * columnas CC_*). Se usa en el fetch+merge del update.
815
+ */
816
+ getContactoCliente(idReg: string): Promise<Record<string, unknown>>;
817
+ /**
818
+ * Alta de contacto de cliente.
819
+ *
820
+ * Endpoint: POST /pgrl/v2/contactos-clientes — body VoContactosClientes.
821
+ * Requeridos por el API: CC_GRUPO_CLI, CC_CLI.
822
+ */
823
+ createContactoCliente(body: Record<string, unknown>): Promise<Record<string, unknown>>;
824
+ /**
825
+ * Actualización de contacto de cliente.
826
+ *
827
+ * Endpoint: PUT /pgrl/v2/contactos-clientes/{idReg}.
828
+ */
829
+ updateContactoCliente(idReg: string, body: Record<string, unknown>): Promise<Record<string, unknown>>;
830
+ /**
831
+ * Detalle de una localización de cliente por tipo e `idReg` opaco.
832
+ *
833
+ * Usa el GET singular v2 del tipo (v1 para factura, que no tiene v2; las
834
+ * columnas son las mismas). Se emplea en el fetch+merge de los updates.
835
+ */
836
+ getLocalizacionCliente(tipo: LocalizacionTipo, idReg: string): Promise<Record<string, unknown>>;
837
+ /**
838
+ * Lista paginada de localizaciones de envío de clientes.
839
+ *
840
+ * Endpoint: GET /pgrl/v2/localizaciones-envio-clientes
841
+ */
842
+ listLocalizacionesEnvioClientes(opts?: ListOptions & {
843
+ codCliente?: string;
844
+ grupoCliente?: string;
845
+ }): Promise<ListResult<Record<string, unknown>>>;
846
+ /**
847
+ * Lista paginada de localizaciones de factura de clientes.
848
+ *
849
+ * Endpoint: GET /pgrl/v2/localizaciones-factura-clientes
850
+ */
851
+ listLocalizacionesFacturaClientes(opts?: ListOptions & {
852
+ codCliente?: string;
853
+ grupoCliente?: string;
854
+ }): Promise<ListResult<Record<string, unknown>>>;
855
+ /**
856
+ * Alta de localización de cliente (cobro, envío, factura o servicio).
857
+ *
858
+ * Endpoint: POST /pgrl/v2/localizaciones-{tipo}-clientes — body Vo del tipo.
859
+ */
860
+ createLocalizacionCliente(tipo: LocalizacionTipo, body: Record<string, unknown>): Promise<Record<string, unknown>>;
861
+ /**
862
+ * Actualización de localización de cliente (cobro, envío, factura o servicio).
863
+ *
864
+ * Endpoint: PUT /pgrl/v2/localizaciones-{tipo}-clientes/{idReg}.
865
+ */
866
+ updateLocalizacionCliente(tipo: LocalizacionTipo, idReg: string, body: Record<string, unknown>): Promise<Record<string, unknown>>;
604
867
  private listResource;
605
868
  /**
606
869
  * Helper genérico para endpoints de lista que soportan paginación + filtros FIQL