<mxfile host="app.diagrams.net" agent="ApiPay Hub docs-portal" type="device" version="24.7.17">
  <diagram id="apipay-hexagonal-payment-api" name="Arquitectura hexagonal del payment-api">
    <mxGraphModel dx="1400" dy="1100" 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-in" value="com.apipay.payment.adapters.in.rest" 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="1000" height="140" as="geometry" />
        </mxCell>
        <mxCell id="lay-app" value="com.apipay.payment.application" 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="230" width="1000" height="120" as="geometry" />
        </mxCell>
        <mxCell id="lay-dom" value="com.apipay.payment.domain - sin Spring, sin jakarta.persistence" 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="380" width="1000" height="150" as="geometry" />
        </mxCell>
        <mxCell id="lay-ports" value="application.port.out - puertos de salida (interfaces)" 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="560" width="1000" height="120" as="geometry" />
        </mxCell>
        <mxCell id="lay-persist" value="adapters.out.persistence - adapters.out.redis" 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="710" width="480" height="200" as="geometry" />
        </mxCell>
        <mxCell id="lay-gwout" value="adapters.out.gateway" 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="560" y="710" width="480" height="200" as="geometry" />
        </mxCell>

        <mxCell id="secfilter" value="ApiKeyAuthenticationFilter&lt;br&gt;libs/security&lt;br&gt;hash Argon2id de la clave" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="60" y="105" width="200" height="75" as="geometry" />
        </mxCell>
        <mxCell id="tenantfilter" value="TenantContextFilter&lt;br&gt;libs/tenancy&lt;br&gt;fija app.tenant_id en la conexion" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="280" y="105" width="200" height="75" as="geometry" />
        </mxCell>
        <mxCell id="intentctrl" value="PaymentIntentController&lt;br&gt;/v1/payment-intents" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="520" y="105" width="160" height="75" as="geometry" />
        </mxCell>
        <mxCell id="refundctrl" value="RefundController&lt;br&gt;/v1/refunds" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="700" y="105" width="150" height="75" as="geometry" />
        </mxCell>
        <mxCell id="webhookctrl" value="WebhookController&lt;br&gt;/v1/gateways/{gatewayId}/webhooks" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="870" y="105" width="150" height="75" as="geometry" />
        </mxCell>

        <mxCell id="nota-app" value="Los servicios de aplicacion son transaction scripts finos: cargan el agregado, delegan la decision en la maquina de estados del dominio y persisten estado + outbox_events en la MISMA transaccion, siempre a traves de puertos." 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="60" y="275" width="420" height="60" as="geometry" />
        </mxCell>
        <mxCell id="intentsvc" value="PaymentIntentService" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E0F7FA;strokeColor=#00838F;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="500" y="275" width="200" height="60" as="geometry" />
        </mxCell>
        <mxCell id="refundsvc" value="RefundService" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E0F7FA;strokeColor=#00838F;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="720" y="275" width="150" height="60" as="geometry" />
        </mxCell>
        <mxCell id="ingestsvc" value="WebhookIngestionService" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E0F7FA;strokeColor=#00838F;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="890" y="275" width="130" height="60" as="geometry" />
        </mxCell>

        <mxCell id="aggregate" value="Agregado PaymentIntent&lt;br&gt;amount_minor + currency&lt;br&gt;metadata del comercio separada&lt;br&gt;de la reservada apipay_*" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="60" y="425" width="240" height="85" as="geometry" />
        </mxCell>
        <mxCell id="statemachine" value="Maquina de estados del intent&lt;br&gt;CREATED - REQUIRES_ACTION - PROCESSING&lt;br&gt;SUCCEEDED - FAILED - EXPIRED - CANCELED&lt;br&gt;IllegalStateTransitionException si no esta permitida" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="320" y="425" width="300" height="85" as="geometry" />
        </mxCell>
        <mxCell id="txmodel" value="Transaction&lt;br&gt;TransactionEvent&lt;br&gt;PAYMENT - REFUND - CHARGEBACK" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="640" y="425" width="190" height="85" as="geometry" />
        </mxCell>
        <mxCell id="refundmodel" value="Refund&lt;br&gt;PENDING - SUCCEEDED - FAILED" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#FFF8E1;strokeColor=#F9A825;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="850" y="425" width="170" height="85" as="geometry" />
        </mxCell>

        <mxCell id="repoport" value="PaymentIntentRepository&lt;br&gt;TransactionRepository&lt;br&gt;RefundRepository" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#EDE7F6;strokeColor=#4527A0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="60" y="605" width="145" height="60" as="geometry" />
        </mxCell>
        <mxCell id="outboxport" value="OutboxPublisher" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#EDE7F6;strokeColor=#4527A0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="215" y="605" width="145" height="60" as="geometry" />
        </mxCell>
        <mxCell id="idemport" value="IdempotencyStore" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#EDE7F6;strokeColor=#4527A0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="370" y="605" width="145" height="60" as="geometry" />
        </mxCell>
        <mxCell id="gwport" value="PaymentGateway&lt;br&gt;SPI de libs/gateway-spi" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#EDE7F6;strokeColor=#4527A0;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="700" y="605" width="250" height="60" as="geometry" />
        </mxCell>

        <mxCell id="jpaadapters" value="Adapters JPA&lt;br&gt;Hibernate @TenantId&lt;br&gt;sobre RLS de PostgreSQL" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="60" y="750" width="145" height="95" as="geometry" />
        </mxCell>
        <mxCell id="outboximpl" value="OutboxJpaPublisher&lt;br&gt;INSERT en outbox_events&lt;br&gt;en la misma transaccion" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="215" y="750" width="145" height="95" as="geometry" />
        </mxCell>
        <mxCell id="redisidem" value="RedisIdempotencyStore&lt;br&gt;idem:{tenantId}:{key}&lt;br&gt;TTL 24 h" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="370" y="750" width="145" height="95" as="geometry" />
        </mxCell>
        <mxCell id="nota-persist" value="El adapter de persistencia es el UNICO que ve la metadata combinada del intent (allMetadata); el resto del sistema ve solo la del comercio." 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="60" y="855" width="455" height="45" as="geometry" />
        </mxCell>

        <mxCell id="registry" value="GatewayRegistry&lt;br&gt;resuelve la implementacion&lt;br&gt;por (tenantId, gatewayId)&lt;br&gt;contra tenant_gateway_configs" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="580" y="740" width="210" height="95" as="geometry" />
        </mxCell>
        <mxCell id="gwebpay" value="libs/gateway-webpay" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#6A1B9A;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="810" y="740" width="210" height="30" as="geometry" />
        </mxCell>
        <mxCell id="gmp" value="libs/gateway-mercadopago" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#6A1B9A;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="810" y="775" width="210" height="30" as="geometry" />
        </mxCell>
        <mxCell id="gsandbox" value="libs/gateway-sandbox (solo test)" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;dashed=1;fillColor=#F3E5F5;strokeColor=#6A1B9A;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="810" y="810" width="210" height="30" as="geometry" />
        </mxCell>
        <mxCell id="kvres" value="KeyVaultGatewayCredentialsResolver&lt;br&gt;Key Vault + cache Caffeine TTL 300 s" style="rounded=1;arcSize=12;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;fontColor=#1A1A1A;fontSize=10" vertex="1" parent="1">
          <mxGeometry x="580" y="855" width="210" height="45" as="geometry" />
        </mxCell>

        <mxCell id="reglas" value="Reglas de dependencia verificadas con ArchUnit: apps depende de libs SIEMPRE, libs de apps JAMAS. Cada gateway-* solo depende de gateway-spi y core-domain. com.apipay.domain y com.apipay.payment.domain no importan Spring ni jakarta.persistence. Anadir una pasarela nueva es una libreria gateway-* que implementa el SPI mas una fila en gateway_catalog: cero cambios en dominio ni en aplicacion." style="shape=note;size=16;whiteSpace=wrap;html=1;fillColor=#E8EAF6;strokeColor=#283593;fontColor=#1A1A1A;fontSize=11;align=left;verticalAlign=top;spacingLeft=8;spacingTop=4" vertex="1" parent="1">
          <mxGeometry x="40" y="930" width="1000" height="90" as="geometry" />
        </mxCell>

        <mxCell id="e-sec-tenant" value="" 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="secfilter" target="tenantfilter">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-tenant-intent" value="" 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="tenantfilter" target="intentctrl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-tenant-refund" value="" 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=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="tenantfilter" target="refundctrl">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="430" y="92" />
              <mxPoint x="775" y="92" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-tenant-webhook" value="sin X-API-Key: la autenticidad la da la firma de la pasarela" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;dashed=1;strokeColor=#C62828;fontColor=#B71C1C;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;exitX=0.9;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="tenantfilter" target="webhookctrl">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="460" y="78" />
              <mxPoint x="945" y="78" />
            </Array>
          </mxGeometry>
        </mxCell>

        <mxCell id="e-intentctrl-svc" value="" 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.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="intentctrl" target="intentsvc">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-refundctrl-svc" value="" 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.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="refundctrl" target="refundsvc">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-webhookctrl-svc" value="" 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.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="webhookctrl" target="ingestsvc">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <mxCell id="e-intentsvc-agg" value="" 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.75;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="intentsvc" target="aggregate">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-intentsvc-sm" value="" 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.6;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="intentsvc" target="statemachine">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-refundsvc-refund" value="" 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.4;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="refundsvc" target="refundmodel">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-refundsvc-tx" value="" 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.6;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="refundsvc" target="txmodel">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-ingest-sm" value="" 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=1;entryY=0.25;entryDx=0;entryDy=0" edge="1" parent="1" source="ingestsvc" target="statemachine">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="923" y="365" />
              <mxPoint x="635" y="365" />
              <mxPoint x="635" y="446" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="e-ingest-tx" value="" 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.5;exitY=1;exitDx=0;exitDy=0;entryX=0.9;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="ingestsvc" target="txmodel">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <mxCell id="e-app-ports" value="application depende de domain y de sus propios puertos de salida, nunca de un adapter" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;strokeColor=#283593;fontColor=#1A237E;fontSize=10;labelBackgroundColor=#FFFFFF;endArrow=block;endFill=1;strokeWidth=2;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="lay-app" target="lay-ports">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="18" y="290" />
              <mxPoint x="18" y="620" />
            </Array>
          </mxGeometry>
        </mxCell>

        <mxCell id="e-repoport-jpa" value="implementado por" 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=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="repoport" target="jpaadapters">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-outboxport-impl" value="implementado por" 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=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="outboxport" target="outboximpl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-idemport-redis" value="implementado por" 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=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="idemport" target="redisidem">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-gwport-registry" value="implementado por" 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=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="gwport" target="registry">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <mxCell id="e-reg-webpay" value="" 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.15;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="registry" target="gwebpay">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-reg-mp" value="" 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="registry" target="gmp">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-reg-sandbox" value="" 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.9;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" edge="1" parent="1" source="registry" target="gsandbox">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="e-reg-kv" value="resuelve credentials_ref" 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.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0" edge="1" parent="1" source="registry" target="kvres">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
