@startuml

abstract class Barco{
    -self.__id = Barco.gen.generar_numeros_distintos()
    -self.__disponible = True
    -self.__peso_max = peso_max
    -self.__cant_contenedores_max = cant_contenedores_max
    -self.__kmRecorridos = 0
    -self.__lleva_mat_esp = lleva_mat_esp
    -self.__contenedores = []

    +gettersYseters()
    +obtenerPesoActual(
}

class Barco_basico{
    -init = super().init

    +puede_cargar_esta_carga()
    +tiene_lugar()
    +cargar()
}

class Barco_especial{
    -init = super().init

    +puede_cargar_esta_carga()
    +tiene_lugar()
    +cargar()
}
class Cargable{
    +puede_cargar_esta_carga()
    +tiene_lugar()
    +cargar()
}


abstract class Contenedor{
    -materialEspecial: bool
    -peso: Double
    -altoEx:Double
    -largoEx:Double
    -anchoEx:Double
    -altoInte:Double
    -largoInte:Double
    -anchoInte:Double
    -volumen: Double
    -id: Integer
    -precioCarga: Double


    +getVolumen(): Double
}

class FlatRack{
    -super().__init__(id, mat_especial)
    -self.medidas_exterior = Medidas(6.1,100000,2.3)
    -self.medidas_interior = Medidas(6.0,100000,2.3)
    -self.volumen_max = 33
    -self.peso_max = 45000
    -self.carga = None
}

abstract class ContenedorBasicoAbs{
    +def verificar_carga(self, carga):
}

class Basico{
    -super().__init__(id, mat_especial)
    -self.medidas_exterior = Medidas(6.1,2.45,2.6)
    -self.medidas_interior = Medidas(6.0,2.35,2.3)
    -self.peso_max = 24000
    -self.volumen_max = 32.6
    -self.carga = None
}

class BasicoHC{
    -super().__init__(id, mat_especial)
    -self.medidas_exterior = Medidas(12.1,2.45,2.6)
    -self.medidas_interior = Medidas(12.0,2.35,2.3)
    -self.volumen_max = 67.7
    -self.peso_max = 32500
    -self.carga = None

    +verificar_carga(): = super()
}








class Camion{
    -cantCamiones = 5
    -costoFijo = 20000
    -disponible: Boolean
}






class Carga{
    -tas = Tasador_de_cargas()
    -p = tas.setear_precio_carga()
    -self.__medidas = medidas
    -self.__precio = p
    -self.__peso = peso
    -self.__mat_especial = mat_especial
}


class Pedido{
    -self.__retiraEnPuerto = retiraEnPuerto #bool
    -self.__conteneCompleto = conteneCompleto #bool
    -self.__id = Pedidos.gen.generar_numeros_distintos()
    -self.__carga = carga
}

class Cliente{
    -self.__apellido = apellido
    -self.__nombre = nombre
    -self.__id = Cliente.gen.generar_numeros_distintos()
    -self.__pedido = None
    -self.__cargas = []
}

class Empresa implements metodosViajes{
    -self.__camiones = []

            ' for i in range(5):'
                ' camion = Camion(i)'
               ' self.__camiones.append(camion)'
            ' for barco in barcos:'
                 'self.__barcos.append(barco)'

    -self.__barco_con_mas_km = None
    -self.__barco_con_menos_km = None
}

class generarId{
    +generar_numeros_distintos()
}

class Medidas{
    -self.__largo = largo
    -self.__ancho = ancho
    -self.__alto = alto

    +comparar_medidas()
}

class metodosViajes{
    +viajar()
    +definirPrecioViaje()
}

class tasadorCarga{
    +random()
}

Carga..|>generarId
Barco..|>generarId
Pedido..|>generarId
ContenedorBasicoAbs<|--Basico
ContenedorBasicoAbs<|--BasicoHC
Contenedor<|--ContenedorBasicoAbs
Contenedor<|--FlatRack

Barco_basico<|--Barco
Barco_especial<|--Barco

Cargable<|..Barco

tasadorCarga<|..Carga

Barco--Empresa
Camion--Empresa
Pedido--Empresa
Contenedor--Empresa

Contenedor--Medidas
Carga--Medidas
Barco--Medidas


Pedido*--Cliente
Carga*--Cliente
Carga*--Pedido
@enduml