<?php
/**
 * Created by PhpStorm.
 * User: Giansalex
 * Date: 08/08/2017
 * Time: 00:03.
 */

declare(strict_types=1);

namespace Greenter\Model\Despatch;

use DateTime;

/**
 * Class Shipment.
 */
class Shipment
{
    /**
     * Motivo del traslado.
     *
     * @var string
     */
    private $codTraslado;
    /**
     * Descripción de motivo de traslado.
     *
     * @var string
     */
    private $desTraslado;
    /**
     * Sustento de la diferencia del Peso bruto total de la carga respecto al peso de los ítems seleccionados.
     *
     * @var string
     */
    private $sustentoPeso;
    /**
     * Indicador de Transbordo Programado.
     *
     * @var bool
     */
    private $indTransbordo;
    /**
     * Indicador de traslado, Retorno, Transbordo, etc.
     * opciones:
     *
     * SUNAT_Envio_IndicadorTransbordoProgramado
     * SUNAT_Envio_IndicadorTrasladoVehiculoM1L
     * SUNAT_Envio_IndicadorRetornoVehiculoEnvaseVacio
     * SUNAT_Envio_IndicadorRetornoVehiculoVacio
     * SUNAT_Envio_IndicadorTrasladoTotalDAMoDS
     * SUNAT_Envio_IndicadorVehiculoConductoresTransp
     *
     * @var string[]
     */
    private $indicadores;
    /**
     * Peso bruto total de los ítems seleccionados (en KGM).
     *
     * @var float
     */
    private $pesoItems;
    /**
     * @var float
     */
    private $pesoTotal;
    /**
     * @var string
     */
    private $undPesoTotal;
    /**
     * Numero de Bultos.
     *
     * @var int
     */
    private $numBultos;
    /**
     * @var string
     */
    private $modTraslado;
    /**
     * Fecha de inicio del traslado.
     *
     * @var DateTime
     */
    private $fecTraslado;
    /**
     * Fecha de entrega de bienes al transportista.
     *
     * @var DateTime
     */
    private $fecEntregaBienes;
    /**
     * Numero de Contenedor (Motivo Importación).
     *
     * @var string
     */
    private $numContenedor;
    /**
     * Contenedores (precinto)
     *
     * @var string[]
     */
    private $contenedores;
    /**
     * Codigo del Puerto. (Puerto o Aeropuerto de embarque/desembarque).
     *
     * @var string
     */
    private $codPuerto;
    /**
     * @var Puerto
     */
    private $puerto;
    /**
     * @var Puerto
     */
    private $aeropuerto;
    /**
     * @var Transportist
     */
    private $transportista;
    /**
     * Vehiculo Principal.
     *
     * @var Vehicle
     */
    private $vehiculo;
    /**
     * Conductores principales y secundarios.
     *
     * @var Driver[]
     */
    private $choferes;
    /**
     * @var Direction
     */
    private $llegada;
    /**
     * @var Direction
     */
    private $partida;

    /**
     * @return string
     */
    public function getCodTraslado(): ?string
    {
        return $this->codTraslado;
    }

    /**
     * @param string $codTraslado
     *
     * @return Shipment
     */
    public function setCodTraslado(?string $codTraslado): Shipment
    {
        $this->codTraslado = $codTraslado;

        return $this;
    }

    /**
     * @return string
     */
    public function getDesTraslado(): ?string
    {
        return $this->desTraslado;
    }

    /**
     * @param string $desTraslado
     *
     * @return Shipment
     */
    public function setDesTraslado(?string $desTraslado): Shipment
    {
        $this->desTraslado = $desTraslado;

        return $this;
    }

    /**
     * @return string
     */
    public function getSustentoPeso(): ?string
    {
        return $this->sustentoPeso;
    }

    /**
     * @param string|null $sustentoPeso
     * @return Shipment
     */
    public function setSustentoPeso(?string $sustentoPeso): Shipment
    {
        $this->sustentoPeso = $sustentoPeso;
        return $this;
    }

    /**
     * @return bool
     */
    public function isIndTransbordo(): ?bool
    {
        return $this->indTransbordo;
    }

    /**
     * @deprecated use setIndicadores
     *
     * @param bool $indTransbordo
     *
     * @return Shipment
     */
    public function setIndTransbordo(?bool $indTransbordo): Shipment
    {
        $this->indTransbordo = $indTransbordo;

        return $this;
    }

    /**
     * @return string[]
     */
    public function getIndicadores(): ?array
    {
        return $this->indicadores;
    }

    /**
     * @param string[] $indicadores
     * @return Shipment
     */
    public function setIndicadores(?array $indicadores): Shipment
    {
        $this->indicadores = $indicadores;
        return $this;
    }

    /**
     * @return float
     */
    public function getPesoItems(): ?float
    {
        return $this->pesoItems;
    }

    /**
     * @param float|null $pesoItems
     * @return Shipment
     */
    public function setPesoItems(?float $pesoItems): Shipment
    {
        $this->pesoItems = $pesoItems;
        return $this;
    }

    /**
     * @return float
     */
    public function getPesoTotal(): ?float
    {
        return $this->pesoTotal;
    }

    /**
     * @param float $pesoTotal
     *
     * @return Shipment
     */
    public function setPesoTotal(?float $pesoTotal): Shipment
    {
        $this->pesoTotal = $pesoTotal;

        return $this;
    }

    /**
     * @return string
     */
    public function getUndPesoTotal(): ?string
    {
        return $this->undPesoTotal;
    }

    /**
     * @param string $undPesoTotal
     *
     * @return Shipment
     */
    public function setUndPesoTotal(?string $undPesoTotal): Shipment
    {
        $this->undPesoTotal = $undPesoTotal;

        return $this;
    }

    /**
     * @return int
     */
    public function getNumBultos(): ?int
    {
        return $this->numBultos;
    }

    /**
     * @param int $numBultos
     *
     * @return Shipment
     */
    public function setNumBultos(?int $numBultos): Shipment
    {
        $this->numBultos = $numBultos;

        return $this;
    }

    /**
     * @return string
     */
    public function getModTraslado(): ?string
    {
        return $this->modTraslado;
    }

    /**
     * @param string $modTraslado
     *
     * @return Shipment
     */
    public function setModTraslado(?string $modTraslado): Shipment
    {
        $this->modTraslado = $modTraslado;

        return $this;
    }

    /**
     * @return DateTime
     */
    public function getFecTraslado(): ?DateTime
    {
        return $this->fecTraslado;
    }

    /**
     * @param DateTime $fecTraslado
     *
     * @return Shipment
     */
    public function setFecTraslado(?DateTime $fecTraslado): Shipment
    {
        $this->fecTraslado = $fecTraslado;

        return $this;
    }

    /**
     * @return DateTime
     */
    public function getFecEntregaBienes(): ?DateTime
    {
        return $this->fecEntregaBienes;
    }

    /**
     * @param DateTime $fecEntregaBienes
     *
     * @return Shipment
     */
    public function setFecEntregaBienes(?DateTime $fecEntregaBienes): Shipment
    {
        $this->fecEntregaBienes = $fecEntregaBienes;

        return $this;
    }

    /**
     * @return string
     */
    public function getNumContenedor(): ?string
    {
        return $this->numContenedor;
    }

    /**
     * @deprecated use setContenedores
     *
     * @param string $numContenedor
     *
     * @return Shipment
     */
    public function setNumContenedor(?string $numContenedor): Shipment
    {
        $this->numContenedor = $numContenedor;

        return $this;
    }

    /**
     * @return string[]
     */
    public function getContenedores(): ?array
    {
        return $this->contenedores;
    }

    /**
     * @param string[] $contenedores
     * @return Shipment
     */
    public function setContenedores(?array $contenedores): Shipment
    {
        $this->contenedores = $contenedores;
        return $this;
    }

    /**
     * @return string
     */
    public function getCodPuerto(): ?string
    {
        return $this->codPuerto;
    }

    /**
     * @deprecated use setPuerto
     *
     * @param string $codPuerto
     *
     * @return Shipment
     */
    public function setCodPuerto(?string $codPuerto): Shipment
    {
        $this->codPuerto = $codPuerto;

        return $this;
    }

    /**
     * @return Puerto
     */
    public function getPuerto(): ?Puerto
    {
        return $this->puerto;
    }

    /**
     * @param Puerto|null $puerto
     * @return Shipment
     */
    public function setPuerto(?Puerto $puerto): Shipment
    {
        $this->puerto = $puerto;
        return $this;
    }

    /**
     * @return Puerto
     */
    public function getAeropuerto(): ?Puerto
    {
        return $this->aeropuerto;
    }

    /**
     * @param Puerto|null $aeropuerto
     * @return Shipment
     */
    public function setAeropuerto(?Puerto $aeropuerto): Shipment
    {
        $this->aeropuerto = $aeropuerto;
        return $this;
    }

    /**
     * @return Transportist
     */
    public function getTransportista(): ?Transportist
    {
        return $this->transportista;
    }

    /**
     * @param Transportist $transportista
     *
     * @return Shipment
     */
    public function setTransportista(?Transportist $transportista): Shipment
    {
        $this->transportista = $transportista;

        return $this;
    }

    /**
     * @return Vehicle
     */
    public function getVehiculo(): ?Vehicle
    {
        return $this->vehiculo;
    }

    /**
     * @param Vehicle|null $vehiculo
     * @return Shipment
     */
    public function setVehiculo(?Vehicle $vehiculo): Shipment
    {
        $this->vehiculo = $vehiculo;
        return $this;
    }

    /**
     * @return Driver[]
     */
    public function getChoferes(): ?array
    {
        return $this->choferes;
    }

    /**
     * @param Driver[] $choferes
     * @return Shipment
     */
    public function setChoferes(?array $choferes): Shipment
    {
        $this->choferes = $choferes;
        return $this;
    }

    /**
     * @return Direction
     */
    public function getLlegada(): ?Direction
    {
        return $this->llegada;
    }

    /**
     * @param Direction $llegada
     *
     * @return Shipment
     */
    public function setLlegada(?Direction $llegada): Shipment
    {
        $this->llegada = $llegada;

        return $this;
    }

    /**
     * @return Direction
     */
    public function getPartida(): ?Direction
    {
        return $this->partida;
    }

    /**
     * @param Direction $partida
     *
     * @return Shipment
     */
    public function setPartida(?Direction $partida): Shipment
    {
        $this->partida = $partida;

        return $this;
    }
}
