/**
  * Valida que la cantidad indicada esté disponible en
  * el almacén, ubicación y lote
  * 
  * @return boolean
  */
 public function validaLogico()
 {
     parent::validaLogico();
     $articulo = new Articulos($this->IDArticulo);
     $bloqueoStock = $articulo->getBloqueoStock()->getIDTIpo() == '1';
     if ($this->Unidades == 0) {
         $this->_errores[] = "Debe indicar una cantidad distinta a cero";
     }
     $almacen = new Almacenes($this->IDAlmacen);
     //print_r($this);
     if ($almacen->getControlUbicaciones()->getIDTipo() == '1' and $this->IDUbicacion == 0) {
         $this->_errores[] = "Debe indicar la ubicación";
     }
     unset($almacen);
     if ($bloqueoStock) {
         $udadMedidaVenta = $articulo->getUMV();
         $udadMedidaAlmacen = $articulo->getUMA();
         $stock = new Existencias();
         $existencias = $stock->getStock($this->IDArticulo, $this->IDAlmacen, $this->IDLote, $this->IDUbicacion);
         unset($stock);
         // Calcular las cantidades de ese articulo, almacen, lote y ubicación que estan
         // en lineas de expediciones sin estar expedidas aún. O sea lo que está en
         // proceso de expedición. No tengo en cuenta los valores de la BD de la línea actual
         // porque puede que hayan cambiado.
         $filtro = "IDLinea<>'{$this->IDLinea}' and Expedida='0' and IDAlmacen='{$this->IDAlmacen}' and IDLote='{$this->IDLote}' and IDUbicacion='{$this->IDUbicacion}'";
         $expedicion = new Expediciones();
         $rows = $expedicion->cargaCondicion("sum(Unidades) as Unidades,sum(Pales) as Pales,sum(Cajas) as Cajas", $filtro);
         $row = $rows[0];
         $row['Unidades'] += $this->Unidades;
         $row['Pales'] += $this->Pales;
         $row['Cajas'] += $this->Cajas;
         unset($expedicion);
         if ($existencias['DI'] < $articulo->convertUnit('UMV', 'UMA', $row['Unidades'])) {
             $this->_errores[] = "Hay " . round($articulo->convertUnit('UMA', 'UMV', $existencias['DI']), 2) . " {$udadMedidaVenta} (" . round($existencias['DI'], 2) . " {$udadMedidaAlmacen}) disponibles para ese lote y ubicación";
         }
         if ($existencias['CA'] < $row['Cajas']) {
             $this->_errores[] = "Hay {$existencias['CA']} cajas disponibles para ese lote y ubicacion";
         }
         if ($existencias['PT'] < $row['Pales']) {
             $this->_errores[] = "Hay {$existencias['PT']} pales disponibles para ese lote y ubicacion";
         }
     }
     unset($articulo);
     return count($this->_errores) == 0;
 }
 /**
  * Expide la linea de traspaso de tipo 0 (la de envío)
  * Actualiza las existencias y marca la línea como expedida.
  * Genera la línea de traspaso de tipo 1 (la de entrada) poniendo el 'entrando' y
  * generar tantas líneas de recepción como líneas de expedición se hayan generado
  * para mantener las mismas unidades y lotes
  *
  * NO SE REALIZA NINGUN TRATAMIENTO CON LAS EXISTENCIAS SI EL ARTICULO NO ES INVENTARIABLE
  *
  * @return boolean
  */
 public function expide()
 {
     $ok = true;
     $articulo = new Articulos($this->IDArticulo);
     $esInventariable = $articulo->getInventario()->getIDTipo();
     if ($esInventariable) {
         // Quitar la reserva de mercancía
         $exi = new Existencias();
         $ok = $exi->quitaReserva($this->IDAlmacen, $this->IDArticulo, $this->Unidades, $this->UnidadMedida);
         unset($exi);
     }
     if ($esInventariable and $ok) {
         // Expedir la línea de traspaso
         $expedicion = new Expediciones();
         $unidadesNetas = $expedicion->expide("TraspasosCab", $this->IDLinea);
         unset($expedicion);
     } else {
         $unidadesNetas = $this->Unidades;
     }
     if ($ok) {
         // Marcar la línea de traspaso como expedida y
         // poner las unidades netas expedidas
         $this->setIDEstado(2);
         $this->setUnidades($unidadesNetas);
         $this->totalizaLinea();
         $this->save();
         // Generar la línea de traspaso de tipo 1 (la de entrada) y poner el entrando
         $idAlmacenDestino = $this->getIDTraspaso()->getIDAlmacenDestino()->getIDAlmacen();
         $lineaEntrada = new TraspasosLineas();
         $lineaEntrada->setIDLinea('');
         $lineaEntrada->setIDTraspaso($this->IDTraspaso);
         $lineaEntrada->setTipo(1);
         $lineaEntrada->setIDArticulo($this->IDArticulo);
         $lineaEntrada->setDescripcion($this->Descripcion);
         $lineaEntrada->setUnidades($this->Unidades);
         $lineaEntrada->setUnidadMedida($this->UnidadMedida);
         $lineaEntrada->setIDAlmacen($idAlmacenDestino);
         $lineaEntrada->setPrecio($this->Precio);
         $lineaEntrada->setImporte($this->Importe);
         $lineaEntrada->setIDEstado(0);
         $idLineaEntrada = $lineaEntrada->create();
         unset($lineaEntrada);
         // Generar tantas líneas de recepción como líneas de expedición haya para
         // la línea de traspaso expedida
         $expedicion = new Expediciones();
         $rows = $expedicion->cargaCondicion("*", "Entidad='TraspasosCab' and IDLineaEntidad='{$this->IDLinea}'");
         unset($expedicion);
         foreach ($rows as $row) {
             $recepcion = new Recepciones();
             $recepcion->setEntidad($row['Entidad']);
             $recepcion->setIDEntidad($row['IDEntidad']);
             $recepcion->setIDLineaEntidad($idLineaEntrada);
             $recepcion->setIDAlmacen($idAlmacenDestino);
             $recepcion->setIDAlmacenero($_SESSION['usuarioPortal']['Id']);
             $recepcion->setIDArticulo($row['IDArticulo']);
             $recepcion->setUnidades($row['Unidades']);
             $recepcion->setUnidadMedida($row['UnidadMedida']);
             $recepcion->setUnidadesBrutas($row['Unidades']);
             $recepcion->setUnidadesNetas($row['Unidades']);
             $recepcion->setIDLote($row['IDLote']);
             $recepcion->create();
             unset($recepcion);
         }
         // Poner el entrando
         $exi = new Existencias();
         $ok = $exi->hazEntrando($idAlmacenDestino, $this->IDArticulo, $this->getUnidades(), $this->getUnidadMedida());
         unset($exi);
     }
     unset($articulo);
     return $ok;
 }
 public function listAction($entidad = '', $idEntidad = '')
 {
     if ($entidad == '') {
         $entidad = $this->request[2];
     }
     if ($idEntidad == '') {
         $idEntidad = $this->request[3];
     }
     $objetoEntidad = new $entidad($idEntidad);
     $lis = new Expediciones();
     $rows = $lis->cargaCondicion('IDLinea', "Entidad='{$entidad}' AND IDEntidad='{$idEntidad}'", 'IDLineaEntidad,IDLinea ASC');
     unset($lis);
     foreach ($rows as $row) {
         $lineas[] = new Expediciones($row['IDLinea']);
     }
     if ($entidad == "AlbaranesCab" and count($lineas) == 0) {
         // En un albarán que no tiene nada que expedir, posiblemente esté vacío
         // o sus artículos no son inventariables. Lo expedido directamente
         $objetoEntidad->expide();
     }
     if ($objetoEntidad->getIDEstado()->getIDTipo() == '1') {
         $template = 'ExpedirLineas/form.html.twig';
     } else {
         $template = 'ExpedirLineas/list.html.twig';
     }
     $this->values['listado']['data'] = $lineas;
     $this->values['entidad'] = $entidad;
     $this->values['idEntidad'] = $idEntidad;
     $this->values['objetoEntidad'] = $objetoEntidad;
     unset($objetoEntidad);
     unset($lineas);
     return array('template' => $template, 'values' => $this->values);
 }