<mxfile host="app.diagrams.net" agent="ApiPay Hub docs-portal" type="device" version="24.7.17">
  <diagram id="apipay-arquitectura-contenedores" name="Arquitectura de contenedores">
    <mxGraphModel dx="1600" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="826" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <mxCell id="lay-clientes" value="Clientes" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=#9E9E9E;dashed=1;dashPattern=8 8;verticalAlign=top;align=left;spacingLeft=10;spacingTop=6;fontColor=#1A1A1A;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="40" y="60" width="240" height="340" as="geometry" />
        </mxCell>
        <mxCell id="lay-cluster" value="Cluster AKS - namespace apipay-prod" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=#9E9E9E;dashed=1;dashPattern=8 8;verticalAlign=top;align=left;spacingLeft=10;spacingTop=6;fontColor=#1A1A1A;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="340" y="60" width="420" height="480" as="geometry" />
        </mxCell>
        <mxCell id="lay-azure" value="Servicios administrados" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=#9E9E9E;dashed=1;dashPattern=8 8;verticalAlign=top;align=left;spacingLeft=10;spacingTop=6;fontColor=#1A1A1A;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="820" y="60" width="280" height="460" as="geometry" />
        </mxCell>
        <mxCell id="lay-gw" value="Pasarelas" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F5F5F5;strokeColor=#9E9E9E;dashed=1;dashPattern=8 8;verticalAlign=top;align=left;spacingLeft=10;spacingTop=6;fontColor=#1A1A1A;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="1160" y="60" width="260" height="305" as="geometry" />
        </mxCell>

        <mxCell id="merchantsrv" value="Backend del comercio" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="60" y="110" width="200" height="55" as="geometry" />
        </mxCell>
        <mxCell id="buyerbrowser" value="Navegador del comprador" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="60" y="180" width="200" height="55" as="geometry" />
        </mxCell>
        <mxCell id="devbrowser" value="Navegador del desarrollador" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="60" y="250" width="200" height="55" as="geometry" />
        </mxCell>
        <mxCell id="opbrowser" value="Navegador del operador" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="60" y="320" width="200" height="55" as="geometry" />
        </mxCell>

        <mxCell id="ingress" value="NGINX Ingress + cert-manager&lt;br&gt;TLS 1.3 en el borde, enruta por hostname" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="360" y="110" width="380" height="60" as="geometry" />
        </mxCell>
        <mxCell id="paymentapi" value="payment-api&lt;br&gt;Spring Boot 4 - Java 25&lt;br&gt;puerto 8080" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="360" y="200" width="180" height="80" as="geometry" />
        </mxCell>
        <mxCell id="adminapi" value="admin-api&lt;br&gt;Spring Boot 4 - Java 25&lt;br&gt;puerto 8081" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="560" y="200" width="180" height="80" as="geometry" />
        </mxCell>
        <mxCell id="backoffice" value="backoffice&lt;br&gt;Next.js 15 App Router&lt;br&gt;puerto 3000" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="360" y="310" width="180" height="70" as="geometry" />
        </mxCell>
        <mxCell id="widget" value="checkout-widget&lt;br&gt;estatico de Vite 7&lt;br&gt;NGINX unprivileged 8080" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E0F7FA;strokeColor=#00838F;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="560" y="310" width="180" height="70" as="geometry" />
        </mxCell>
        <mxCell id="docsportal" value="docs-portal&lt;br&gt;estatico de Next.js 15&lt;br&gt;output: export&lt;br&gt;NGINX unprivileged 8080" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E0F7FA;strokeColor=#00838F;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="360" y="410" width="180" height="90" as="geometry" />
        </mxCell>
        <mxCell id="dispatcher" value="webhook-dispatcher&lt;br&gt;worker Kafka&lt;br&gt;sin HTTP publico&lt;br&gt;management 8090 interno" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="560" y="410" width="180" height="90" as="geometry" />
        </mxCell>

        <mxCell id="postgres" value="PostgreSQL 17&lt;br&gt;schema apipay - RLS" style="shape=cylinder3;boundedLbl=1;backgroundOutline=1;size=13;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="840" y="110" width="240" height="70" as="geometry" />
        </mxCell>
        <mxCell id="redis" value="Redis 7.4&lt;br&gt;idempotencia, rate limit,&lt;br&gt;sesion del widget" style="shape=cylinder3;boundedLbl=1;backgroundOutline=1;size=13;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="840" y="200" width="240" height="80" as="geometry" />
        </mxCell>
        <mxCell id="kafka" value="Kafka / Event Hubs - 3 topics&lt;br&gt;apipay.payment-events.v1&lt;br&gt;apipay.outbound-webhooks.v1&lt;br&gt;apipay.audit.v1&lt;br&gt;clave de particion = tenant_id" style="shape=process;size=0.06;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="840" y="300" width="240" height="110" as="geometry" />
        </mxCell>
        <mxCell id="keyvault" value="Azure Key Vault&lt;br&gt;credenciales por tenant&lt;br&gt;KEK de los secretos de firma" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="840" y="430" width="240" height="70" as="geometry" />
        </mxCell>

        <mxCell id="webpay" value="Webpay Plus via Servipag" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#6A1B9A;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="1180" y="110" width="220" height="55" as="geometry" />
        </mxCell>
        <mxCell id="mercadopago" value="MercadoPago" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#6A1B9A;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="1180" y="180" width="220" height="50" as="geometry" />
        </mxCell>
        <mxCell id="sandbox" value="gateway-sandbox&lt;br&gt;modulo in-process de payment-api&lt;br&gt;sin salida a red - solo livemode=false" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;dashed=1;fillColor=#F3E5F5;strokeColor=#6A1B9A;fontColor=#1A1A1A;fontSize=11" vertex="1" parent="1">
          <mxGeometry x="1180" y="245" width="220" height="90" as="geometry" />
        </mxCell>

        <mxCell id="nota-estatico" value="checkout-widget y docs-portal no tienen backend propio: son bundles estaticos servidos por NGINX unprivileged en el 8080. El portal se compila con output: export, asi que no admite middleware, route handlers ni cookies() y no puede leer datos de ningun tenant." style="shape=note;size=14;whiteSpace=wrap;html=1;fillColor=#FFFDE7;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=10;align=left;verticalAlign=top;spacingLeft=6;spacingTop=2" vertex="1" parent="1">
          <mxGeometry x="40" y="620" width="670" height="90" as="geometry" />
        </mxCell>
        <mxCell id="nota-worker" value="webhook-dispatcher no expone Service ni Ingress: solo consume Kafka y hace egress HTTPS. Su DataSource principal es ya el rol apipay_worker. payment-api y admin-api usan apipay_app para el trafico de negocio y un segundo DataSource con apipay_worker exclusivamente para el relay del outbox." style="shape=note;size=14;whiteSpace=wrap;html=1;fillColor=#FFFDE7;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=10;align=left;verticalAlign=top;spacingLeft=6;spacingTop=2" vertex="1" parent="1">
          <mxGeometry x="750" y="620" width="670" height="90" as="geometry" />
        </mxCell>

        <mxCell id="e-msrv-ing" value="HTTPS api.apipay.io" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0" edge="1" parent="1" source="merchantsrv" target="ingress">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-buyer-ing" value="HTTPS checkout.apipay.io" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="buyerbrowser" target="ingress">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-dev-ing" value="HTTPS docs.apipay.io" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0" edge="1" parent="1" source="devbrowser" target="ingress">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-op-ing" value="HTTPS admin.apipay.io" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.1;entryY=1;entryDx=0;entryDy=0" edge="1" parent="1" source="opbrowser" target="ingress">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="310" y="347" />
              <mxPoint x="310" y="190" />
              <mxPoint x="398" y="190" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-gw-ing" value="webhooks entrantes: POST /v1/gateways/{gatewayId}/webhooks" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#6A1B9A;fontColor=#4A148C;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="lay-gw" target="ingress">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1290" y="25" />
              <mxPoint x="550" y="25" />
            </Array>
          </mxGeometry>
        </mxCell>

        <mxCell id="e-ing-pa" value="8080" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="ingress" target="paymentapi">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-ing-aa" value="8081" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="ingress" target="adminapi">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-ing-bo" value="3000" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.05;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="ingress" target="backoffice">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="379" y="345" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-ing-wg" value="8080" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.95;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="ingress" target="widget">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="750" y="345" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-ing-docs" value="8080" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.05;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="ingress" target="docsportal">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="352" y="455" />
            </Array>
          </mxGeometry>
        </mxCell>

        <mxCell id="e-pa-pg" value="SQL/TLS - rol apipay_app&lt;br&gt;SET LOCAL app.tenant_id" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.4;entryDx=0;entryDy=0" edge="1" parent="1" source="paymentapi" target="postgres">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="790" y="220" />
              <mxPoint x="790" y="138" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-pa-pg-worker" value="SQL/TLS - rol apipay_worker&lt;br&gt;solo el relay del outbox" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;dashed=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.8;entryDx=0;entryDy=0" edge="1" parent="1" source="paymentapi" target="postgres">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="800" y="260" />
              <mxPoint x="800" y="166" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-aa-pg" value="SQL/TLS" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.2;entryDx=0;entryDy=0" edge="1" parent="1" source="adminapi" target="postgres">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-wd-pg" value="SQL/TLS - apipay_worker&lt;br&gt;deliveries y secretos cifrados" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0" edge="1" parent="1" source="dispatcher" target="postgres">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="900" y="433" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-pa-redis" value="RESP/TLS" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="paymentapi" target="redis">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="780" y="240" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-aa-redis" value="RESP/TLS: cache de config del tenant" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.8;entryDx=0;entryDy=0" edge="1" parent="1" source="adminapi" target="redis">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-pa-kafka" value="publica lo drenado de outbox_events" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.9;exitDx=0;exitDy=0;entryX=0;entryY=0.3;entryDx=0;entryDy=0" edge="1" parent="1" source="paymentapi" target="kafka">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="770" y="272" />
              <mxPoint x="770" y="333" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-aa-kafka" value="publica su auditoria con su propio relay" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.95;exitDx=0;exitDy=0;entryX=0;entryY=0.7;entryDx=0;entryDy=0" edge="1" parent="1" source="adminapi" target="kafka">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="790" y="276" />
              <mxPoint x="790" y="377" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-kafka-wd" value="consume apipay.outbound-webhooks.v1&lt;br&gt;grupo webhook-dispatcher" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0;exitY=0.9;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="kafka" target="dispatcher">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="800" y="399" />
              <mxPoint x="800" y="455" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-pa-kv" value="Workload Identity:&lt;br&gt;credenciales de pasarela por tenant" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;dashed=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.6;exitDx=0;exitDy=0;entryX=0;entryY=0.3;entryDx=0;entryDy=0" edge="1" parent="1" source="paymentapi" target="keyvault">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="810" y="248" />
              <mxPoint x="810" y="451" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-wd-kv" value="Workload Identity: KEK de las firmas" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;dashed=1;strokeColor=#455A64;fontColor=#1A1A1A;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=1;exitY=0.85;exitDx=0;exitDy=0;entryX=0;entryY=0.8;entryDx=0;entryDy=0" edge="1" parent="1" source="dispatcher" target="keyvault">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <mxCell id="e-pa-gw" value="HTTPS TLS 1.3 via el SPI PaymentGateway (webpay, mercadopago)" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#6A1B9A;fontColor=#4A148C;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0" edge="1" parent="1" source="paymentapi" target="lay-gw">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="450" y="570" />
              <mxPoint x="1290" y="570" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-wd-msrv" value="POST firmado al webhook_endpoint del comercio" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#2E7D32;fontColor=#1B5E20;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0;exitY=0.85;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="dispatcher" target="merchantsrv">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="320" y="487" />
              <mxPoint x="320" y="590" />
              <mxPoint x="20" y="590" />
              <mxPoint x="20" y="137" />
            </Array>
          </mxGeometry>
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
