<mxfile host="app.diagrams.net" agent="rndc-diagramas.py" version="24.0.0"><diagram id="c3-componentes" name="Nivel 3 · Componentes del integrador"><mxGraphModel dx="1400" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="kafka-in" value="&lt;b&gt;Kafka&lt;/b&gt;&lt;div&gt;[Contenedor]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Eventos validados&lt;/font&gt;&lt;/div&gt;" style="shape=mxgraph.c4.container;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#23A2D9;fontColor=#ffffff;align=center;strokeColor=#0E7DAD;metaEdit=1;" vertex="1" parent="1"><mxGeometry x="40" y="40" width="180" height="90" as="geometry"/></mxCell><mxCell id="rndc" value="&lt;b&gt;RNDC · servicio web&lt;/b&gt;&lt;div&gt;[Sistema externo · SOAP/XML]&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#8C8496;strokeColor=#736782;fontColor=#ffffff;align=center;arcSize=10;strokeWidth=1;metaEdit=1;resizable=0;" vertex="1" parent="1"><mxGeometry x="960" y="40" width="290" height="90" as="geometry"/></mxCell><mxCell id="integrador" value="&lt;b&gt;Integrador RNDC&lt;/b&gt;&lt;div&gt;[Contenedor · Camel sobre Quarkus]&lt;/div&gt;" style="rounded=1;fontSize=11;whiteSpace=wrap;html=1;dashed=1;arcSize=20;fillColor=none;strokeColor=#666666;fontColor=#333333;labelBackgroundColor=none;align=left;verticalAlign=bottom;labelBorderColor=none;spacingTop=0;spacing=10;dashPattern=8 4;metaEdit=1;rotatable=0;perimeter=rectanglePerimeter;noLabel=0;labelPadding=0;allowArrows=0;connectable=0;expand=0;recursiveResize=0;editable=1;pointerEvents=0;absoluteArcSize=1;" vertex="1" parent="1"><mxGeometry x="40" y="170" width="1240" height="560" as="geometry"/></mxCell><mxCell id="consumer" value="&lt;b&gt;Consumidor de eventos&lt;/b&gt;&lt;div&gt;[Componente · Camel Kafka]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Una ruta por tipo: remesa, manifiesto, cumplido, anulación&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="20" y="40" width="210" height="110" as="geometry"/></mxCell><mxCell id="prevalid" value="&lt;b&gt;Validador previo&lt;/b&gt;&lt;div&gt;[Componente · reglas]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Peso total ≤ capacidad de la configuración; SOAT/RTM vigentes a la fecha de descargue; flete ≥ mínimo; ICA del municipio; códigos DANE y Sistema Armonizado&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="300" y="40" width="250" height="150" as="geometry"/></mxCell><mxCell id="catalogos" value="&lt;b&gt;Catálogos maestros&lt;/b&gt;&lt;div&gt;[Componente · caché]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Municipios, configuraciones vehiculares, tarifas ICA, naturaleza de carga; se refrescan desde el RNDC&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="300" y="230" width="250" height="110" as="geometry"/></mxCell><mxCell id="idem" value="&lt;b&gt;Registro de idempotencia y estado&lt;/b&gt;&lt;div&gt;[Componente · PostgreSQL]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Consecutivo único por operación; estados: pendiente, enviado, aceptado, rechazado, diferido&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="300" y="370" width="250" height="120" as="geometry"/></mxCell><mxCell id="mapper" value="&lt;b&gt;Mapeador XML&lt;/b&gt;&lt;div&gt;[Componente · plantillas]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Una plantilla por procesoid; nunca se construye XML a mano en las rutas&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="620" y="40" width="230" height="110" as="geometry"/></mxCell><mxCell id="parser" value="&lt;b&gt;Intérprete de respuestas&lt;/b&gt;&lt;div&gt;[Componente]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;ingresoid → aceptado; ErrorMSG → código (MAN071, REM139…) clasificado en corregible, reintentable o definitivo&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="620" y="210" width="230" height="130" as="geometry"/></mxCell><mxCell id="publisher" value="&lt;b&gt;Publicador de resultados&lt;/b&gt;&lt;div&gt;[Componente · Kafka]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;rndc.resultado con ingresoid o error; alimenta estado, web y conciliación&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="620" y="370" width="230" height="120" as="geometry"/></mxCell><mxCell id="soap" value="&lt;b&gt;Cliente SOAP RNDC&lt;/b&gt;&lt;div&gt;[Componente · CXF]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Credenciales por empresa, timeouts, reintentos con backoff y circuit breaker&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="920" y="40" width="290" height="120" as="geometry"/></mxCell><mxCell id="diferida" value="&lt;b&gt;Cola diferida (contingencia)&lt;/b&gt;&lt;div&gt;[Componente · Kafka]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Si el RNDC no responde: reintento programado dentro de la ventana de contingencia; alerta si vence&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="920" y="210" width="290" height="120" as="geometry"/></mxCell><mxCell id="telemetria" value="&lt;b&gt;Telemetría&lt;/b&gt;&lt;div&gt;[Componente · OpenTelemetry]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;Traza por despacho; métricas por código de error y por empresa&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#63BEF2;fontColor=#ffffff;align=center;arcSize=6;strokeColor=#2086C9;metaEdit=1;resizable=0;" vertex="1" parent="integrador"><mxGeometry x="920" y="370" width="290" height="110" as="geometry"/></mxCell><mxCell id="kafka-out" value="&lt;b&gt;Kafka&lt;/b&gt;&lt;div&gt;[Contenedor]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;rndc.resultado&lt;/font&gt;&lt;/div&gt;" style="shape=mxgraph.c4.container;whiteSpace=wrap;html=1;labelBackgroundColor=none;fillColor=#23A2D9;fontColor=#ffffff;align=center;strokeColor=#0E7DAD;metaEdit=1;" vertex="1" parent="1"><mxGeometry x="660" y="780" width="230" height="80" as="geometry"/></mxCell><mxCell id="e0" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Consume&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="kafka-in" target="consumer"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e1" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;¿Ya se envió? Marca en curso&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="consumer" target="idem"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="165" y="600"/></Array></mxGeometry></mxCell><mxCell id="e2" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Operación a reportar&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="consumer" target="prevalid"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e3" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Consulta&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="prevalid" target="catalogos"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e4" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Operación válida&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="prevalid" target="mapper"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e5" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;XML del procesoid&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="mapper" target="soap"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e6" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;AtenderMensajeRNDC&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center&quot;&gt;[SOAP/XML]&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="soap" target="rndc"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e7" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Respuesta XML&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="soap" target="parser"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e8" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Reintentar o sin respuesta&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="parser" target="diferida"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e9" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Reintenta&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;dashed=1;" edge="1" parent="1" source="diferida" target="soap"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e10" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Aceptado o definitivo&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="parser" target="publisher"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e11" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Actualiza estado&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="publisher" target="idem"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e12" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Publica&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="1" source="publisher" target="kafka-out"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="e13" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Rechazo con causa&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;dashed=1;" edge="1" parent="1" source="prevalid" target="publisher"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="620" y="330"/><mxPoint x="620" y="580"/></Array></mxGeometry></mxCell><mxCell id="e14" value="&lt;div style=&quot;text-align: center&quot;&gt;&lt;b&gt;Métricas por código de error&lt;/b&gt;&lt;/div&gt;" style="endArrow=blockThin;html=1;fontSize=10;fontColor=#404040;strokeWidth=1;endFill=1;strokeColor=#828282;elbow=vertical;metaEdit=1;endSize=14;startSize=14;jumpStyle=arc;jumpSize=16;rounded=0;edgeStyle=orthogonalEdgeStyle;dashed=1;" edge="1" parent="1" source="parser" target="telemetria"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell></root></mxGraphModel></diagram></mxfile>
