Documentation Index

Fetch the complete documentation index at: https://docs.gaia-soft.com/llms.txt

Use this file to discover all available pages before exploring further.

API de Dibujos Externos. Guía de implementación

Prev Next

PRODUCTOR External Drawings API es una integración de Productor ERP con una API externa que genera los dibujos de las líneas de presupuestos y pedidos.
Está disponible tanto para las aplicaciones de escritorio Productor como para Productor Web,

Propósito del documento

Esta guía explica cómo utilizar el proyecto de referencia External Drawings API - Sample como punto de partida para implementar el servicio de dibujos externos de PRODUCTOR. Describe el contrato que debe respetarse, qué partes del Sample deben adaptarse, cómo usar las variables calculadas de línea y cómo desplegar el servicio en una red local o en un servidor público.

Elemento

Valor

API

PRODUCTOR External Drawings API v1.0

Revisión

R8

Proyecto de referencia

External Drawings API - Sample / ASP.NET Core Web API en C#

Tipos de línea

LineaEstructura, LineaPersiana, LineaToldo, LineaVentana

Tipos de dibujo

Presentacion, Produccion, ProduccionFase, Galeria

Transporte de dibujos

Contenido Base64 dentro del JSON de respuesta

Autenticación

API Key mediante X-Productor-Api-Key

Multiempresa

X-Company-Code obligatorio en /api/v1/drawings

Este documento está orientado a desarrolladores, responsables técnicos e integradores del cliente. El archivo OpenAPI R8 entregado junto al Sample es la referencia normativa del contrato HTTP/JSON.

Contenido

  • 1. Qué debe implementar el cliente

  • 2. Arquitectura y escenarios de despliegue

  • 3. Puesta en marcha rápida del Sample

  • 4. Endpoints y cabeceras HTTP

  • 5. Contrato de petición

  • 6. Modelo público de línea

  • 7. Variables calculadas de línea - R8

  • 8. Dibujos por fase de fabricación - ProduccionFase

  • 9. Contrato de respuesta y formatos

  • 10. Cómo adaptar DemoDrawingGenerator

  • 11. Serialización y compatibilidad del modelo PRODUCTOR

  • 12. Seguridad

  • 13. Logging y trazabilidad en la API del cliente

  • 14. Despliegue local y público

  • 15. Errores y comportamiento esperado

  • 16. Pruebas de integración y homologación

  • 17. Diagnóstico de incidencias

  • Anexo A. Ejemplo completo R8

  • Anexo B. Configuración orientativa del Sample

  • Anexo C. Catálogo de errores

1. Qué debe implementar el cliente

PRODUCTOR puede delegar la generación de dibujos de una línea en una WebAPI privada mantenida por el cliente. GAIA entrega el proyecto External Drawings API - Sample como implementación de referencia del contrato. El cliente debe adaptar el generador de demostración para obtener o crear sus dibujos reales, manteniendo intacto el contrato público.

1.1 Responsabilidades del cliente

1.  Desplegar una instancia de la External Drawings API accesible desde PRODUCTOR ERP y, si se utiliza PRODUCTOR Web, desde el backend de PRODUCTOR Web en Azure.

2.  Configurar una API Key suficientemente robusta y conservarla fuera del código fuente.

3.  Adaptar el generador de dibujos del Sample para interpretar la línea recibida y devolver los dibujos adecuados.

4.  Respetar los endpoints, headers, nombres JSON, tokens de enum, tipos de dibujo, formatos MIME y estructura de errores definidos por la versión 1.0.

5.  Mantener un sistema de logging que permita localizar una petición mediante X-Correlation-Id sin registrar secretos ni el contenido Base64 completo.

6.  Probar la implementación con los cuatro tipos de línea que vayan a utilizarse y con las configuraciones funcionales reales del cliente.

Qué NO debe hacer el cliente

No es necesario reproducir el motor de cálculo de PRODUCTOR, crear un DTO alternativo de línea, autenticar usuarios finales, asociar la API Key a una empresa concreta ni implementar lógica dentro de PRODUCTOR. El servicio recibe el modelo público ya preparado para exportación.

1.2 Qué puede modificar en el Sample

Área

Puede adaptarse

Debe mantenerse compatible

Generación de dibujos

Sí: CAD, configurador, archivos, renders, imágenes, PDF, SVG, etc.

La respuesta Drawing y sus tipos.

Reglas funcionales

Sí: decisiones según medidas, opciones, acabados, variables y fase.

La semántica del request recibido.

Hosting

Sí: Kestrel/Windows Service, IIS, Azure u otro ASP.NET Core compatible.

Las rutas HTTP públicas.

Logging

Sí: sinks, retención, ubicación y nivel.

No registrar API Key ni Base64.

Seguridad adicional

Sí, si no rompe PRODUCTOR.

Debe seguir aceptándose la autenticación estándar por API Key.

Contrato JSON

No libremente.

Debe seguir exactamente la API v1.0/OpenAPI R8.

2. Arquitectura y escenarios de despliegue

PRODUCTOR ERP (red cliente)  ----->  External Drawings API  ----->  Motor de dibujos del cliente
PRODUCTOR Web (backend Azure) --->  External Drawings API  ----->  Motor de dibujos del cliente
Navegador ---------------------->  PRODUCTOR Web
                                   (el navegador nunca llama directamente a la API del cliente)

2.1 Servicio sólo en red local

Es válido cuando únicamente PRODUCTOR ERP necesita consumir los dibujos. La API puede escuchar en una URL local accesible desde los equipos/servidores de PRODUCTOR. Si PRODUCTOR Web también debe utilizarla, Azure necesitará conectividad privada expresa hacia esa red o una URL pública.

2.2 Servicio público

Es la opción habitual cuando PRODUCTOR Web debe consumir el servicio. Debe publicarse mediante HTTPS y ser accesible desde el backend de PRODUCTOR Web. PRODUCTOR ERP también puede utilizar la misma URL pública.

2.3 Acceso local y público

El mismo servicio puede exponerse mediante una URL interna y otra pública. El contrato es idéntico en ambos accesos. Esta configuración permite que ERP utilice la red local mientras PRODUCTOR Web utiliza la URL pública.

3. Puesta en marcha rápida del Sample

El proyecto Sample es una ASP.NET Core Web API en C#. No contiene lógica CAD real: su objetivo es demostrar el contrato y ofrecer un punto de extensión seguro.

3.1 Estructura de referencia

Productor.ExternalDrawings.SampleApi/
 Controllers/
   DrawingsController.cs
   HealthController.cs
 Contract/
   DrawingRequest.cs
   DrawingResponse.cs
   Drawing.cs
   DrawingError.cs
   DrawingWarning.cs
   TipoDibujo.cs
 ProductorModel/
   Linea.cs
   LineaEstructura.cs
   LineaPersiana.cs
   LineaToldo.cs
   LineaVentana.cs
   LineaVariable.cs
   ... tipos auxiliares públicos
 Serialization/
 Security/
 Logging/
 Services/
   IDrawingGenerator.cs
   DemoDrawingGenerator.cs
 Validation/
 Tests/
 openapi/
 appsettings.json
 Program.cs
 README.md

3.2 Primera ejecución

1.  Abra el proyecto Sample con un SDK .NET compatible con la versión entregada.

2.  Configure la API Key mediante secret, variable de entorno o configuración protegida. No incluya una clave real en el repositorio.

3.  Ejecute el proyecto con dotnet run o desde el entorno de desarrollo.

4.  Compruebe GET /api/v1/health enviando la API Key.

5.  Realice una petición de prueba a POST /api/v1/drawings con X-Company-Code y X-Correlation-Id.

6.  Una vez validado el contrato, sustituya o adapte DemoDrawingGenerator con la lógica real del cliente.

dotnet run

Objetivo de la primera prueba

Antes de integrar el motor de dibujo real, debe comprobarse que autenticación, headers, deserialización de Linea, Variables, ProduccionFase, respuesta Base64 y logging funcionan de extremo a extremo.

4. Endpoints y cabeceras HTTP

Método

Ruta

Finalidad

GET

/api/v1/health

Comprueba disponibilidad del servicio y credenciales.

POST

/api/v1/drawings

Solicita cero o más dibujos para una línea PRODUCTOR.

4.1 Cabeceras de /api/v1/drawings

Content-Type: application/json; charset=utf-8
Accept: application/json
X-Productor-Api-Key: <secreto>
X-Company-Code: EMP001
X-Correlation-Id: d80990be-faf5-49b3-a3ce-e177857467a4

Header

Obligatorio

Regla

X-Productor-Api-Key

Secreto compartido de integración. Puede ser común a todas las empresas.

X-Company-Code

Código de la empresa activa en PRODUCTOR. Máximo contractual: 40 caracteres.

X-Correlation-Id

UUID de trazabilidad. Coincide con IdPeticion del JSON.

No existe asociación obligatoria entre API Key y empresa. Si el cliente desea comprobar que X-Company-Code corresponde a una empresa conocida, puede hacerlo como validación funcional y devolver COMPANY_NOT_FOUND (HTTP 422).

4.2 /api/v1/health

El endpoint de salud utiliza la autenticación por API Key, pero no requiere X-Company-Code. Su finalidad es comprobar que el servicio está disponible y que las credenciales configuradas son válidas.

5. Contrato de petición

{
 "Version": "1.0",
 "IdPeticion": "d80990be-faf5-49b3-a3ce-e177857467a4",
 "TiposDibujo": ["Presentacion", "ProduccionFase"],
 "FaseFabricacion": "CORTE",
 "TipoLinea": "LineaEstructura",
 "Linea": {
   "NumeroLinea": 7,
   "CodigoArticulo": "ZIPCJ",
   "Cantidad": 1,
   "Ancho": 1200,
   "Alto": 1500,
   "Opciones": [],
   "Dimensiones": [],
   "Acabados": [],
   "Variables": []
 }
}

Campo

Tipo

Regla

Version

string

Obligatorio. En v1 debe ser "1.0".

IdPeticion

UUID

Obligatorio. Mismo valor que X-Correlation-Id.

TiposDibujo

array<string>

Uno o más valores, sin duplicados.

FaseFabricacion

string

Obligatorio sólo si TiposDibujo contiene ProduccionFase.

TipoLinea

string

Uno de los cuatro tipos de línea soportados.

Linea

object

Modelo público concreto de PRODUCTOR.

5.1 Tipos de dibujo

Valor

Uso

Presentacion

Dibujo comercial o de presentación.

Produccion

Dibujo técnico general de fabricación.

ProduccionFase

Dibujo técnico específico de una fase de fabricación.

Galeria

Fotografías, renders o imágenes auxiliares.

Una misma petición puede solicitar varios tipos. La respuesta siempre contiene una colección Dibujos y puede incluir varios dibujos del mismo tipo.

6. Modelo público de línea

PRODUCTOR no envía un DTO simplificado creado específicamente para esta API. La propiedad Linea utiliza el modelo público PRODUCTOR correspondiente al TipoLinea indicado. El Sample incluye las clases necesarias para deserializarlo.

TipoLinea

Información característica disponible

LineaEstructura

Opciones, Dimensiones, Acabados, Variables y propiedades comunes de línea.

LineaPersiana

Opciones, cajón/lama/accionamiento, motores, guías, vuelos, divisiones, acabados específicos, Variables, etc.

LineaToldo

Opciones, medidas, inclinación, brazos, motor, cofre, lona, faldilla, acabados específicos, Variables, etc.

LineaVentana

Dimensiones, Opciones, acabados de perfiles/accesorios, SeriePerfiles, Vidrio, herrajes, complementos y Variables.

6.1 Datos que PRODUCTOR no exporta para dibujos

El perfil de exportación excluye información comercial, fiscal, documental o de despiece que no debe ser necesaria para generar el dibujo, como Valor, Impuestos, DatosAuxiliares, FechaEntrega, ObservacionesProduccion, referencias de documento origen y DespieceLinea.

Regla de compatibilidad

No elimine propiedades desconocidas del modelo ni sustituya las clases públicas por un modelo propio más pequeño salvo que mantenga exactamente el mismo contrato de entrada. El Sample ya incorpora el perfil de serialización compatible con PRODUCTOR.

7. Variables calculadas de línea - R8

R8 añade la colección Variables a LineaEstructura, LineaPersiana, LineaToldo y LineaVentana. PRODUCTOR calcula estas variables antes de exportar la línea; la API externa las recibe ya resueltas y puede utilizarlas para adaptar el dibujo.

"Variables": [
 {
   "SimboloVariable": "<SIMBOLO>",
   "Valor": 125.5,
   "NombreVariable": "<NOMBRE>"
 }
]

Propiedad

Tipo

Descripción

SimboloVariable

string, máx. 15

Símbolo identificativo de la variable.

Valor

decimal

Valor calculado por PRODUCTOR.

NombreVariable

string, máx. 200

Nombre descriptivo de la variable.

7.1 Reglas de uso

  • La Sample API consume las variables; no debe recalcularlas.

  • No existe un catálogo global obligatorio de símbolos. Los símbolos dependen de la configuración/cálculo de PRODUCTOR y del acuerdo funcional de cada integración.

  • La colección puede estar vacía.

  • Una variable ausente NO equivale a Valor = 0. Sólo hay valor cero cuando el elemento existe y su Valor es 0.

  • SimboloVariable debe tratarse como un código opaco. Para búsquedas exactas, el Sample usa comparación ordinal.

  • Las variables pueden utilizarse para decidir geometría, componentes, anotaciones, archivos de plantilla o cualquier otro aspecto del dibujo.

7.2 Ejemplo conceptual de lectura

static decimal? GetVariableValue(IEnumerable<LineaVariable>? variables, string simbolo)
{
   var variable = variables?.FirstOrDefault(v =>
       string.Equals(v.SimboloVariable, simbolo, StringComparison.Ordinal));

   return variable?.Valor;
}

Importante

No escriba lógica del tipo GetVariableValue(...) ?? 0 salvo que funcionalmente el cliente haya decidido que la ausencia de esa variable significa cero. El estándar no establece esa equivalencia.

8. Dibujos por fase de fabricación - ProduccionFase

ProduccionFase permite solicitar un dibujo técnico específico para una fase del proceso de fabricación. El único contexto adicional es FaseFabricacion, un código string en el sobre de la petición.

{
 "TiposDibujo": ["ProduccionFase"],
 "FaseFabricacion": "CORTE",
 "TipoLinea": "LineaVentana",
 "Linea": { ... }
}

  • FaseFabricacion es obligatoria y no puede estar vacía o contener sólo espacios cuando se solicita ProduccionFase.

  • PRODUCTOR no traduce ni normaliza el código de fase. El servicio debe tratarlo como un código opaco.

  • No se añade ningún identificador de línea específico para ProduccionFase: la petición ya contiene el objeto Linea completo.

  • Un request representa como máximo una fase. Si se necesitan dibujos de CORTE y MONTAJE, se realizan dos peticiones independientes.

  • Un request mixto puede solicitar, por ejemplo, Presentacion y ProduccionFase. FaseFabricacion sólo aporta contexto al dibujo ProduccionFase.

9. Contrato de respuesta y formatos

{
 "Version": "1.0",
 "IdPeticion": "d80990be-faf5-49b3-a3ce-e177857467a4",
 "Exito": true,
 "Dibujos": [
   {
     "Id": "corte-1",
     "Tipo": "ProduccionFase",
     "Nombre": "Plano de corte",
     "MimeType": "image/svg+xml",
     "NombreFichero": "vent70-corte.svg",
     "Contenido": "PHN2ZyB4bWxucz0iLi4u"
   }
 ],
 "Avisos": []
}

Campo Drawing

Regla

Id

Obligatorio. Identificador del dibujo dentro de la respuesta/contexto.

Tipo

Presentacion, Produccion, ProduccionFase o Galeria.

Nombre

Descripción opcional para uso humano.

MimeType

image/png, image/jpeg, image/svg+xml o application/pdf.

NombreFichero

Nombre opcional del fichero sugerido.

Contenido

Obligatorio. Bytes del dibujo codificados en Base64.

9.1 Cero dibujos no es un error

Si la petición es válida pero no existe dibujo para esa configuración, debe devolverse HTTP 200, Exito=true y Dibujos=[]. Puede añadirse un aviso DRAWING_NOT_AVAILABLE. No debe utilizarse HTTP 404 para este caso.

9.2 Límites recomendados

Elemento

Límite/criterio R8

Request

Recomendado <= 2 MiB.

Response total

PRODUCTOR acepta hasta 20 MiB.

Dibujo decodificado

Recomendado <= 5 MiB por dibujo.

Codificación

UTF-8 para JSON; Contenido en Base64.

10. Cómo adaptar DemoDrawingGenerator

DemoDrawingGenerator existe únicamente para demostrar el flujo. El cliente debe sustituir o ampliar su lógica para conectarse con su motor de dibujos, CAD, configurador, repositorio de imágenes o sistema industrial.

10.1 Flujo recomendado

1.  Recibir DrawingRequest ya validado.

2.  Examinar TipoLinea y trabajar con la clase pública correspondiente.

3.  Leer medidas, opciones, acabados, complementos y Variables necesarias para la decisión gráfica.

4.  Si se solicita ProduccionFase, utilizar también FaseFabricacion.

5.  Generar o localizar uno o más archivos.

6.  Convertir los bytes a Base64.

7.  Crear uno o más elementos Drawing con Tipo y MimeType correctos.

8.  Devolver DrawingResponse manteniendo IdPeticion de la petición.

10.2 Lógica conceptual

// Ejemplo conceptual: el contrato exacto de IDrawingGenerator
// se encuentra en el proyecto Sample entregado.

var valor = GetVariableValue(linea.Variables, "<SIMBOLO_ACORDADO>");

if (request.TiposDibujo.Contains(TipoDibujo.ProduccionFase))
{
   var fase = request.FaseFabricacion;
   // Seleccionar/generar el dibujo adecuado para esa fase.
}

// Generar bytes -> Convert.ToBase64String(bytes)
// Devolver Drawing con Tipo, MimeType, NombreFichero y Contenido.

10.3 Reglas que no deben alterarse

  • No cambie la ruta /api/v1/drawings.

  • No devuelva URLs en sustitución de Contenido Base64 en la versión 1.0.

  • No introduzca nombres CLR o metadatos $type en el JSON público.

  • No convierta BoolEnum a true/false ni a 0/1.

  • No exponga excepciones, stack traces o secretos en DrawingResponse.

  • No dependa de que exista siempre una variable concreta salvo acuerdo funcional específico.

11. Serialización y compatibilidad del modelo PRODUCTOR

El Sample contiene una capa de serialización específica para respetar el contrato público PRODUCTOR. No debe sustituirse por la configuración JSON por defecto sin comprobar antes todos los alias y enums.

11.1 BoolEnum

False -> "N"
True  -> "S"

Los campos del modelo público que usan BoolEnum deben viajar como strings "N" o "S". No son booleanos JSON.

11.2 Otros enums

Los enums públicos utilizan sus tokens de XmlEnum. Ejemplos del contrato: I, D, ID, DI, TOTAL, MASCAJON, TAPAJUNTAS, PREMARCO, PERSIANA, etc. El Sample ya incluye el converter necesario.

11.3 Alias de propiedades

Algunas propiedades se publican con nombres XML históricos. El cliente debe consumir los nombres recibidos por el contrato, no deducirlos desde el nombre de la propiedad CLR. Por ejemplo, en LineaVentana se utilizan alias públicos como Perfiles.Acabado y Accesorios.Tonalidad.

11.4 TipoLinea y deserialización polimórfica

TipoLinea actúa como discriminador seguro y sólo admite LineaEstructura, LineaPersiana, LineaToldo o LineaVentana. La API no debe permitir resolución arbitraria de tipos CLR a partir del JSON.

12. Seguridad

Medida

Requisito/recomendación

API Key

Obligatoria. Alta entropía. Configurada como secreto o variable de entorno.

HTTPS

Obligatorio para endpoints públicos.

X-Company-Code

Obligatorio en drawings. No requiere asociación con la API Key.

Rate limit

Configurable; valor inicial de referencia 60 peticiones/minuto por IP.

Tamaño de body

Limitar para evitar abuso; referencia 2 MiB.

Errores

No devolver stack trace ni detalles internos.

Logs

No registrar API Key, Base64, connection strings completas ni credenciales.

API pública

Si el servicio debe ser utilizado por PRODUCTOR Web, la URL accesible desde Azure debe estar protegida por HTTPS. El navegador del usuario nunca recibe la API Key ni llama directamente a la API del cliente.

13. Logging y trazabilidad en la API del cliente

El Sample utiliza Serilog como implementación de referencia. El cliente puede cambiar sinks o plataforma de observabilidad, pero debe conservar una trazabilidad suficiente para soporte.

Dato recomendado

Motivo

CorrelationId

Localizar la misma petición en PRODUCTOR y en la API.

CompanyCode

Saber para qué empresa se procesó la llamada.

FaseFabricacion

Diagnosticar dibujos de ProduccionFase.

TipoLinea / CodigoArticulo

Contexto funcional básico.

TiposDibujo

Saber qué se solicitó.

NumeroVariables

Diagnóstico R8 sin volcar todos los valores.

StatusCode / ElapsedMs

Resultado y rendimiento.

NumeroDibujos

Resultado funcional de la llamada.

Los valores completos de Variables no necesitan registrarse como propiedades estructuradas de Serilog. Para soporte, X-Correlation-Id es la referencia principal que debe conservarse.

Datos prohibidos en logs

No registrar X-Productor-Api-Key, Contenido Base64, credenciales, secretos, connection strings completas ni bodies completos sin sanitizar.

14. Despliegue local y público

14.1 Kestrel / Windows Service en red local

La referencia local es ejecutar la misma ASP.NET Core Web API sobre Kestrel, normalmente instalada como Windows Service. La configuración, los logs y los secretos deben mantenerse fuera de la carpeta de binarios para facilitar actualizaciones.

dotnet publish -c Release -r win-x64 --self-contained true

Rutas orientativas del proyecto de referencia:

C:\Program Files\GAIA\PRODUCTOR API\       binarios
C:\ProgramData\GAIA\PRODUCTOR API\        configuración y logs persistentes

14.2 IIS, Azure App Service u otro hosting público

El mismo proyecto puede publicarse en IIS, Azure App Service u otro hosting compatible con ASP.NET Core. Dominio, TLS, bindings, certificados, App Settings, secretos y sinks de logging son responsabilidad de la infraestructura del cliente.

14.3 Actualizaciones

1.  Detener la instancia o servicio.

2.  Sustituir los binarios conservando configuración, secretos y logs.

3.  Arrancar de nuevo el servicio.

4.  Ejecutar /api/v1/health.

5.  Realizar al menos una petición /api/v1/drawings de prueba.

6.  Aplicar rollback si la comprobación falla.

15. Errores y comportamiento esperado

Código

HTTP

Significado

INVALID_JSON

400

JSON no deserializable.

UNSUPPORTED_VERSION

400

Version distinta de 1.0.

INVALID_DRAWING_TYPE

400

Tipo de dibujo no soportado.

UNSUPPORTED_LINE_TYPE

400

Tipo de línea no soportado.

LINE_TYPE_MISMATCH

400

TipoLinea no corresponde con Linea.

COMPANY_CODE_REQUIRED

400

Falta X-Company-Code.

PRODUCTION_PHASE_REQUIRED

400

ProduccionFase sin FaseFabricacion válida.

UNAUTHORIZED

401

API Key ausente o inválida.

FORBIDDEN

403

Política adicional deniega el acceso.

REQUEST_TOO_LARGE

413

Request supera el límite.

UNSUPPORTED_CONFIGURATION

422

Configuración o fase no procesable.

DRAWING_TOO_LARGE

422

Dibujo supera el límite acordado.

COMPANY_NOT_FOUND

422

Validación opcional de empresa.

RATE_LIMITED

429

Rate limit excedido.

INTERNAL_ERROR

500

Error interno controlado.

SERVICE_UNAVAILABLE

503

Dependencia temporalmente no disponible.

15.1 Formato de error

{
 "Version": "1.0",
 "IdPeticion": "...",
 "Exito": false,
 "Error": {
   "Codigo": "UNSUPPORTED_CONFIGURATION",
   "Mensaje": "La configuración recibida no puede procesarse."
 },
 "Dibujos": [],
 "Avisos": []
}

Los códigos son estables y apropiados para lógica; Mensaje es descriptivo para diagnóstico. No utilice mensajes de excepción .NET como contrato público.

16. Pruebas de integración y homologación

Antes de considerar la integración lista, el cliente debería validar como mínimo los siguientes escenarios contra su versión desplegada:

☐ GET /api/v1/health con API Key válida.

☐ 401 con API Key ausente o incorrecta.

☐ 400 si falta X-Company-Code en /drawings.

☐ Una petición válida por cada TipoLinea utilizado.

☐ BoolEnum recibido como N/S.

☐ Variables presentes, vacías y con Valor = 0.

☐ Variable ausente tratada de forma distinta a valor cero.

☐ Presentacion, Produccion y Galeria si se utilizan.

☐ ProduccionFase con FaseFabricacion válida.

☐ 400 PRODUCTION_PHASE_REQUIRED cuando falta la fase.

☐ Dos fases distintas mediante dos requests independientes.

☐ Respuesta con varios dibujos del mismo tipo.

☐ HTTP 200 con Dibujos=[] cuando no existe dibujo.

☐ PNG/JPEG/SVG/PDF según formatos utilizados.

☐ Límites de tamaño configurados.

☐ Logs localizables por X-Correlation-Id y sin secretos/Base64.

☐ Acceso desde PRODUCTOR Web/Azure si la integración lo requiere.

Criterio de homologación

La integración está lista cuando el contrato R8 se procesa sin transformaciones ad hoc en PRODUCTOR, los dibujos reales se generan para las configuraciones acordadas y una incidencia puede diagnosticarse usando IdPeticion/X-Correlation-Id.

17. Diagnóstico de incidencias

Síntoma

Comprobaciones recomendadas

401

API Key enviada, valor configurado, espacios accidentales, secreto correcto en el entorno.

400 COMPANY_CODE_REQUIRED

X-Company-Code está presente y no vacío.

400 PRODUCTION_PHASE_REQUIRED

FaseFabricacion presente y no blanca cuando se solicita ProduccionFase.

400 LINE_TYPE_MISMATCH

TipoLinea coincide con la clase/contenido de Linea.

422

Configuración funcional, fase, empresa opcional o límites del dibujo.

429

Rate limit; revisar carga y Retry-After.

503

Dependencia del motor de dibujo no disponible.

Dibujo incorrecto

Revisar Variables, opciones, dimensiones, acabados y FaseFabricacion con el mismo CorrelationId.

PRODUCTOR Web no conecta

Endpoint público HTTPS accesible desde Azure; no basta una URL LAN.

Para soporte, facilite siempre el valor de IdPeticion/X-Correlation-Id, fecha/hora aproximada, CompanyCode, TipoLinea y tipo de dibujo solicitado. No envíe la API Key por canales no seguros.

Anexo A. Ejemplo completo R8

A.1 Petición ProduccionFase con Variables

POST /api/v1/drawings
Content-Type: application/json; charset=utf-8
Accept: application/json
X-Productor-Api-Key: <secreto>
X-Company-Code: EMP001
X-Correlation-Id: 66b1c418-e1d6-4c8b-998a-cb2cf8b2d235

{
 "Version": "1.0",
 "IdPeticion": "66b1c418-e1d6-4c8b-998a-cb2cf8b2d235",
 "TiposDibujo": ["ProduccionFase"],
 "FaseFabricacion": "CORTE",
 "TipoLinea": "LineaVentana",
 "Linea": {
   "NumeroLinea": 4,
   "CodigoArticulo": "VENT70",
   "Cantidad": 1,
   "Ancho": 1400,
   "Alto": 1200,
   "Perfiles.Acabado": "BL",
   "Accesorios.Tonalidad": "*",
   "SeriePerfiles": "S70",
   "Vidrio": "4/16/4",
   "Dimensiones": [],
   "Opciones": [],
   "OpcionesHerraje": [],
   "Complementos": [],
   "Variables": [
     {
       "SimboloVariable": "<SIMBOLO>",
       "Valor": 125.5,
       "NombreVariable": "<NOMBRE>"
     }
   ]
 }
}

A.2 Respuesta

{
 "Version": "1.0",
 "IdPeticion": "66b1c418-e1d6-4c8b-998a-cb2cf8b2d235",
 "Exito": true,
 "Dibujos": [
   {
     "Id": "corte-1",
     "Tipo": "ProduccionFase",
     "Nombre": "Plano de corte",
     "MimeType": "image/svg+xml",
     "NombreFichero": "vent70-corte.svg",
     "Contenido": "PHN2ZyB4bWxucz0iLi4u"
   }
 ],
 "Avisos": []
}

Anexo B. Configuración orientativa del Sample

{
 "ExternalDrawings": {
   "ApiKey": "SET-VIA-SECRET-OR-ENV",
   "RateLimitPerMinute": 60,
   "MaxRequestBytes": 2097152,
   "MaxDecodedDrawingBytes": 5242880,
   "MaxResponseBytes": 20971520
 },
 "Serilog": {
   "MinimumLevel": {
     "Default": "Information",
     "Override": {
       "Microsoft": "Warning",
       "Microsoft.AspNetCore": "Warning"
     }
   },
   "Enrich": ["FromLogContext"],
   "WriteTo": [
     {"Name": "Console"}
   ]
 }
}

En producción, la API Key real debe suministrarse mediante el mecanismo seguro del entorno. La configuración de Kestrel, certificados, IIS, Azure, Windows Service y sinks de Serilog puede variar sin alterar el contrato HTTP.

Anexo C. Referencias normativas de la entrega

La documentación del cliente debe utilizarse junto con los artefactos entregados con la revisión R8:

  • Proyecto External Drawings API - Sample.

  • OpenAPI 3.1 de PRODUCTOR External Drawings API v1.0 R8.

  • README incluido en el proyecto Sample.

  • Modelos públicos PRODUCTOR incluidos en ProductorModel/.

Prioridad en caso de discrepancia

El archivo OpenAPI R8 es normativo para rutas, headers y schemas HTTP/JSON. El código del Sample muestra una implementación compatible. Esta guía explica cómo adaptar la implementación sin cambiar el contrato.

GAIA Software - PRODUCTOR External Drawings API v1.0 - R8