<mxfile host="app.diagrams.net" modified="2026-09-03T19:45:00.000Z" agent="Antigravity" version="21.0.0" type="device">
  <diagram id="clickandgo_poo_inacap" name="Evaluacion Sumativa 1 - ClickAndGo">
    <mxGraphModel dx="1800" dy="1200" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1800" pageHeight="1300" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <!-- TITULO FORMAL -->
        <mxCell id="title" value="&lt;b&gt;INACAP — PROGRAMACIÓN ORIENTADA A OBJETOS (TI3V21)&lt;/b&gt;&lt;br&gt;Evaluación Sumativa N°1: Diagrama de Clases UML — Caso 05: Tienda de E-Commerce (ClickAndGo)&lt;br&gt;&lt;i&gt;Integrantes: Miguel Troncoso &amp;amp; Alexandy Remicinthe | Carrera: Analista Programador | Docente: Michael Alexis Arjel Mayerovich&lt;/i&gt;" style="text;html=1;strokeColor=#b85450;fillColor=#f8cecc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontSize=14;fontColor=#333333;" vertex="1" parent="1">
          <mxGeometry x="40" y="25" width="1680" height="60" as="geometry" />
        </mxCell>

        <!-- CLASE: Cliente -->
        <mxCell id="c_cliente" value="&lt;b&gt;Cliente&lt;/b&gt;&#xa;--&#xa;- idCliente: String&#xa;- nombre: String&#xa;- identificador: String&#xa;- tipoIdentificador: String&#xa;--&#xa;+ validarIdentificador(): bool&#xa;+ getIdentificador(): String&#xa;+ getNombre(): String" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e1d5e7;strokeColor=#9673a6;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="50" y="130" width="230" height="160" as="geometry" />
        </mxCell>

        <!-- CLASE: Pedido -->
        <mxCell id="c_pedido" value="&lt;b&gt;Pedido&lt;/b&gt;&#xa;--&#xa;- idPedido: String&#xa;- fechaCreacion: DateTime&#xa;- estadoPago: String&#xa;- estadoEntrega: String&#xa;- totalFleteCLP: float&#xa;- totalFinalCLP: float&#xa;--&#xa;+ agregarLinea(producto: Producto, cantidad: int): bool&#xa;+ confirmarPedido(): bool&#xa;+ registrarPago(): void&#xa;+ despachar(operador: Trabajador): bool&#xa;+ procesarDespachoEntregas(): void&#xa;+ calcularTotal(): float" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#d5e8d4;strokeColor=#82b366;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="410" y="120" width="340" height="230" as="geometry" />
        </mxCell>

        <!-- CLASE: DetallePedido -->
        <mxCell id="c_detalle" value="&lt;b&gt;DetallePedido&lt;/b&gt;&#xa;--&#xa;- cantidad: int&#xa;- precioUnitarioCongelado: float&#xa;--&#xa;+ calcularSubtotal(): float&#xa;+ getProducto(): Producto&#xa;+ getCantidad(): int" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#d5e8d4;strokeColor=#82b366;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="910" y="140" width="240" height="150" as="geometry" />
        </mxCell>

        <!-- CLASE ABSTRACTA: Producto -->
        <mxCell id="c_producto" value="&amp;laquo;abstract&amp;raquo;&#xa;&lt;b&gt;&lt;i&gt;Producto&lt;/i&gt;&lt;/b&gt;&#xa;--&#xa;# idProducto: String&#xa;# nombre: String&#xa;# precioBaseCLP: float&#xa;# stock: int&#xa;--&#xa;+ {abstract} procesarEntrega(detalle: DetallePedido): void&#xa;+ {abstract} calcularPrecioFinal(indicadorDolar: float): float&#xa;+ descontarStock(cantidad: int): bool&#xa;+ tieneStockSuficiente(cantidad: int): bool&#xa;+ getStock(): int&#xa;+ getNombre(): String" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#dae8fc;strokeColor=#6c8ebf;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="870" y="380" width="350" height="210" as="geometry" />
        </mxCell>

        <!-- CLASE: ProductoFisico -->
        <mxCell id="c_pfisico" value="&lt;b&gt;ProductoFisico&lt;/b&gt;&#xa;--&#xa;- pesoKg: float&#xa;- volumenM3: float&#xa;- tarifaFleteBase: float&#xa;--&#xa;+ calcularFlete(distanciaKm: float): float&#xa;+ procesarEntrega(detalle: DetallePedido): void&#xa;+ calcularPrecioFinal(indicadorDolar: float): float" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#dae8fc;strokeColor=#6c8ebf;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="590" y="670" width="280" height="150" as="geometry" />
        </mxCell>

        <!-- CLASE: ProductoElectronica -->
        <mxCell id="c_pelectronica" value="&lt;b&gt;ProductoElectronica&lt;/b&gt;&#xa;--&#xa;- precioUSD: float&#xa;- garantiaMeses: int&#xa;--&#xa;+ calcularPrecioFinal(indicadorDolar: float): float&#xa;+ getPrecioUSD(): float" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#fff2cc;strokeColor=#d6b656;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="590" y="890" width="280" height="130" as="geometry" />
        </mxCell>

        <!-- CLASE: ProductoDigital -->
        <mxCell id="c_pdigital" value="&lt;b&gt;ProductoDigital&lt;/b&gt;&#xa;--&#xa;- enlaceDescarga: String&#xa;- licenciaActivacion: String&#xa;- pesoArchivoMB: float&#xa;--&#xa;+ procesarEntrega(detalle: DetallePedido): void&#xa;+ calcularPrecioFinal(indicadorDolar: float): float&#xa;+ emitirLicencia(): String" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#dae8fc;strokeColor=#6c8ebf;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="930" y="670" width="280" height="160" as="geometry" />
        </mxCell>

        <!-- CLASE: ProductoServicio -->
        <mxCell id="c_pservicio" value="&lt;b&gt;ProductoServicio&lt;/b&gt;&#xa;--&#xa;- fechaAgendada: DateTime&#xa;- direccionVisita: String&#xa;- duracionEstimadaHoras: int&#xa;--&#xa;+ procesarEntrega(detalle: DetallePedido): void&#xa;+ calcularPrecioFinal(indicadorDolar: float): float&#xa;+ agendarFecha(fecha: DateTime): bool" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#dae8fc;strokeColor=#6c8ebf;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="1270" y="670" width="280" height="160" as="geometry" />
        </mxCell>

        <!-- CLASE ABSTRACTA: Trabajador -->
        <mxCell id="c_trabajador" value="&amp;laquo;abstract&amp;raquo;&#xa;&lt;b&gt;&lt;i&gt;Trabajador&lt;/i&gt;&lt;/b&gt;&#xa;--&#xa;# idTrabajador: String&#xa;# nombre: String&#xa;# correo: String&#xa;--&#xa;+ {abstract} puedeModificarCatalogo(): bool&#xa;+ {abstract} puedeDespachar(): bool&#xa;+ getNombre(): String" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#f8cecc;strokeColor=#b85450;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="50" y="430" width="270" height="170" as="geometry" />
        </mxCell>

        <!-- CLASE: EncargadoBodega -->
        <mxCell id="c_bodega" value="&lt;b&gt;EncargadoBodega&lt;/b&gt;&#xa;--&#xa;- zonaBodegaAsignada: String&#xa;--&#xa;+ puedeModificarCatalogo(): bool  [false]&#xa;+ puedeDespachar(): bool      [true]&#xa;+ registrarPreparacion(pedido: Pedido): void" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#f8cecc;strokeColor=#b85450;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="30" y="690" width="260" height="140" as="geometry" />
        </mxCell>

        <!-- CLASE: Administrador -->
        <mxCell id="c_admin" value="&lt;b&gt;Administrador&lt;/b&gt;&#xa;--&#xa;- nivelAcceso: int&#xa;--&#xa;+ puedeModificarCatalogo(): bool  [true]&#xa;+ puedeDespachar(): bool      [true]&#xa;+ actualizarPrecio(producto: Producto, nuevoPrecio: float): void&#xa;+ registrarNuevoProducto(producto: Producto): void" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#f8cecc;strokeColor=#b85450;rounded=1;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="310" y="690" width="310" height="160" as="geometry" />
        </mxCell>

        <!-- CAJA DE REGLAS DE NEGOCIO MINIMAS EVALUADAS -->
        <mxCell id="box_rubrica" value="&lt;b&gt;CUMPLIMIENTO DE REQUISITOS MÍNIMOS EVALUADOS (PAUTA INACAP):&lt;/b&gt;&lt;br&gt;&lt;br&gt;1. &lt;b&gt;Tres subtipos con comportamiento polimórfico:&lt;/b&gt; &lt;i&gt;ProductoFisico&lt;/i&gt;, &lt;i&gt;ProductoDigital&lt;/i&gt; y &lt;i&gt;ProductoServicio&lt;/i&gt; implementan &lt;i&gt;procesarEntrega()&lt;/i&gt; según su naturaleza.&lt;br&gt;2. &lt;b&gt;Dos trabajadores con permisos distintos:&lt;/b&gt; &lt;i&gt;EncargadoBodega&lt;/i&gt; (solo despacho) y &lt;i&gt;Administrador&lt;/i&gt; (despacho + edición de precios/catálogo).&lt;br&gt;3. &lt;b&gt;Al menos un dato con validación:&lt;/b&gt; &lt;i&gt;Cliente.validarIdentificador()&lt;/i&gt; valida algoritmo oficial Módulo 11 (RUT chileno) o formato de Correo Electrónico.&lt;br&gt;4. &lt;b&gt;Transacción con líneas de detalle:&lt;/b&gt; &lt;i&gt;Pedido&lt;/i&gt; compuesto por &lt;i&gt;DetallePedido&lt;/i&gt; (multiplicidad 1 a 1..*), congelando cantidad y precio pactado.&lt;br&gt;5. &lt;b&gt;Dos reglas que impidan operación:&lt;/b&gt;&lt;br&gt;   • &lt;b&gt;Regla 1 (Stock):&lt;/b&gt; &lt;i&gt;confirmarPedido()&lt;/i&gt; se rechaza si algún producto carece de stock suficiente.&lt;br&gt;   • &lt;b&gt;Regla 2 (Despacho):&lt;/b&gt; &lt;i&gt;despachar()&lt;/i&gt; se rechaza si el pedido no está en estado PAGADO.&lt;br&gt;6. &lt;b&gt;Precio con indicador externo:&lt;/b&gt; &lt;i&gt;ProductoElectronica.calcularPrecioFinal()&lt;/i&gt; multiplica &lt;i&gt;precioUSD * indicadorDolar&lt;/i&gt; diario." style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;fillColor=#ffffcc;strokeColor=#d6b656;align=left;spacingLeft=10;fontSize=11;" vertex="1" parent="1">
          <mxGeometry x="930" y="890" width="700" height="200" as="geometry" />
        </mxCell>

        <!-- RELACIONES Y CONECTORES -->

        <!-- Asociacion: Cliente 1 a Pedido 0..* -->
        <mxCell id="rel_cliente_pedido" value="realiza" style="endArrow=open;html=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;strokeColor=#333333;strokeWidth=1.5;" edge="1" source="c_cliente" target="c_pedido" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="lbl_cp_1" value="1" style="edgeLabel;html=1;align=center;verticalAlign=bottom;fontSize=12;fontStyle=1;" vertex="1" connectable="0" parent="rel_cliente_pedido">
          <mxGeometry x="-0.75" relative="1" as="geometry" />
        </mxCell>
        <mxCell id="lbl_cp_2" value="0..*" style="edgeLabel;html=1;align=center;verticalAlign=bottom;fontSize=12;fontStyle=1;" vertex="1" connectable="0" parent="rel_cliente_pedido">
          <mxGeometry x="0.75" relative="1" as="geometry" />
        </mxCell>

        <!-- Composicion: Pedido 1 a DetallePedido 1..* -->
        <mxCell id="rel_pedido_detalle" value="contiene" style="endArrow=none;startArrow=diamond;startFill=1;html=1;exitX=1;exitY=0.35;entryX=0;entryY=0.5;strokeColor=#333333;strokeWidth=2;" edge="1" source="c_pedido" target="c_detalle" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="lbl_pd_1" value="1" style="edgeLabel;html=1;align=center;verticalAlign=bottom;fontSize=12;fontStyle=1;" vertex="1" connectable="0" parent="rel_pedido_detalle">
          <mxGeometry x="-0.7" relative="1" as="geometry" />
        </mxCell>
        <mxCell id="lbl_pd_2" value="1..*" style="edgeLabel;html=1;align=center;verticalAlign=bottom;fontSize=12;fontStyle=1;" vertex="1" connectable="0" parent="rel_pedido_detalle">
          <mxGeometry x="0.7" relative="1" as="geometry" />
        </mxCell>

        <!-- Agregacion: DetallePedido * a Producto 1 -->
        <mxCell id="rel_detalle_producto" value="referencia" style="endArrow=none;startArrow=diamond;startFill=0;html=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;strokeColor=#333333;strokeWidth=2;" edge="1" source="c_detalle" target="c_producto" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="lbl_dpr_1" value="*" style="edgeLabel;html=1;align=center;verticalAlign=bottom;fontSize=12;fontStyle=1;" vertex="1" connectable="0" parent="rel_detalle_producto">
          <mxGeometry x="-0.65" relative="1" as="geometry" />
        </mxCell>
        <mxCell id="lbl_dpr_2" value="1" style="edgeLabel;html=1;align=center;verticalAlign=bottom;fontSize=12;fontStyle=1;" vertex="1" connectable="0" parent="rel_detalle_producto">
          <mxGeometry x="0.65" relative="1" as="geometry" />
        </mxCell>

        <!-- Herencia: ProductoFisico hereda de Producto -->
        <mxCell id="rel_h_fisico" style="endArrow=block;endFill=0;html=1;exitX=0.5;exitY=0;entryX=0.2;entryY=1;strokeColor=#333333;strokeWidth=1.5;" edge="1" source="c_pfisico" target="c_producto" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Herencia: ProductoDigital hereda de Producto -->
        <mxCell id="rel_h_digital" style="endArrow=block;endFill=0;html=1;exitX=0.5;exitY=0;entryX=0.5;entryY=1;strokeColor=#333333;strokeWidth=1.5;" edge="1" source="c_pdigital" target="c_producto" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Herencia: ProductoServicio hereda de Producto -->
        <mxCell id="rel_h_servicio" style="endArrow=block;endFill=0;html=1;exitX=0.5;exitY=0;entryX=0.8;entryY=1;strokeColor=#333333;strokeWidth=1.5;" edge="1" source="c_pservicio" target="c_producto" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Herencia: ProductoElectronica hereda de ProductoFisico -->
        <mxCell id="rel_h_elect" style="endArrow=block;endFill=0;html=1;exitX=0.5;exitY=0;entryX=0.5;entryY=1;strokeColor=#333333;strokeWidth=1.5;" edge="1" source="c_pelectronica" target="c_pfisico" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Herencia: EncargadoBodega hereda de Trabajador -->
        <mxCell id="rel_h_bodega" style="endArrow=block;endFill=0;html=1;exitX=0.5;exitY=0;entryX=0.3;entryY=1;strokeColor=#333333;strokeWidth=1.5;" edge="1" source="c_bodega" target="c_trabajador" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Herencia: Administrador hereda de Trabajador -->
        <mxCell id="rel_h_admin" style="endArrow=block;endFill=0;html=1;exitX=0.5;exitY=0;entryX=0.7;entryY=1;strokeColor=#333333;strokeWidth=1.5;" edge="1" source="c_admin" target="c_trabajador" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Dependencia: Pedido usa Trabajador -->
        <mxCell id="rel_pedido_trabajador" value="&amp;laquo;usa&amp;raquo; (despachar)" style="endArrow=open;dashed=1;html=1;exitX=0;exitY=0.8;entryX=1;entryY=0.3;strokeColor=#666666;strokeWidth=1.5;" edge="1" source="c_pedido" target="c_trabajador" parent="1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

      </root>
    </mxGraphModel>
  </diagram>
</mxfile>