Esempio n. 1
0
 /**
  * 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;
 }
Esempio n. 2
0
 /**
  * Actualiza (incrementa o decrementa según el signo) las existencias del artículo, almacén, ubicación y lote
  * con los valores que recibe en el array $valores que tiene siete elementos:
  *
  * UM (unidad de medida origen), Reales, Pales, Cajas, Reservadas, Entrando, Deposito
  *
  * Si no existiese ninguna entrada en el registro de existencias para los valores recibidos, la crea.
  *
  * Si después de actualizar, las existencias se quedan a 0, se borra el registro.
  *
  * @param integer $idAlmacen id de almacén
  * @param integer $idArticulo id de artículo
  * @param integer $idLote id de lote
  * @param integer $idUbicacion id de la ubicación
  * @param integer $flagDeposito
  * @param array $valores array('UM',Reales','Pales','Cajas','Reservadas','Entrando')
  */
 public function actualiza($idAlmacen, $idArticulo, $idLote, $idUbicacion, $flagDeposito, array $valores)
 {
     $condicion = "(IDAlmacen='{$idAlmacen}') AND (IDArticulo='{$idArticulo}') AND (IDLote='{$idLote}') AND (IDUbicacion='{$idUbicacion}') AND (EnDeposito='{$flagDeposito}')";
     $rows = $this->cargaCondicion('*', $condicion);
     $this->setId($rows[0]['Id']);
     $this->load();
     $articulo = new Articulos($idArticulo);
     // Si existe la entrada, la actualizo
     if (count($rows)) {
         $this->setReales($this->getReales() + $articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales'], 6));
         $this->setPales($this->getPales() + $valores['Pales']);
         $this->setCajas($this->getCajas() + $valores['Cajas']);
         $this->setReservadas($this->getReservadas() + $articulo->convertUnit($valores['UM'], 'UMA', $valores['Reservadas'], 6));
         $this->setEntrando($this->getEntrando() + $articulo->convertUnit($valores['UM'], 'UMA', $valores['Entrando'], 6));
         $this->save();
     } else {
         // Si no existe, la creo
         $this->setIDAlmacen($idAlmacen);
         $this->setIDUbicacion($idUbicacion);
         $this->setIDArticulo($idArticulo);
         $this->setIDLote($idLote);
         $this->setReales($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales'], 6));
         $this->setPales($valores['Pales']);
         $this->setCajas($valores['Cajas']);
         $this->setReservadas($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reservadas'], 6));
         $this->setEntrando($articulo->convertUnit($valores['UM'], 'UMA', $valores['Entrando'], 6));
         $this->setEnDeposito($flagDeposito);
         $this->create();
     }
     // Si despues de actualizar, todas las columnas de valores se han quedado a cero, borro el registro
     $haQuedado = $this->Reales + $this->Reservadas + $this->Entrando + $this->Pales + $this->Cajas;
     if ($haQuedado >= 0 and $haQuedado < 9.000000000000001E-5) {
         $this->erase();
     }
     unset($articulo);
 }
Esempio n. 3
0
 /**
  * Genera un movimiento de almacén y actualiza el stock
  *
  * No se creará movimiento de almacén y por lo tanto tampoco se actualizarán existencias:
  *
  *  * si el artículo no está sujeto a control de inventario
  *
  *  * si el almacén está sujeto a control de ubicaciones y no se ha indicado ninguna
  *
  *  * si el artículo está sujeto a control de trazabilidad y no se ha indicado ningún lote
  *
  *  * si no hay existencias suficientes y el artículo bloquea stock
  *
  * @param string $documento El literal que identifica el controlador que provoca el movimiento
  * @param string $signo El signo que tendrá el movimiento (E = Entrada, S = Salida)
  * @param integer $idDocumento El id del documento que provoca el movimiento (albaran, pedido, traspaso, inventario, etc)
  * @param integer $idAlmacen El id del almacén
  * @param integer $idArticulo El id del articulo
  * @param integer $idLote El id del lote
  * @param integer $idUbicacion El id de la ubicacion
  * @param integer $flagDeposito Indica si el movimineto se ha de realizar contra stock de deposito o no (0, 1)
  * @param array $valores Array con los valores a actualizar
  * @return boolean Si el artículo no está sujeto a inventario devuelve TRUE, en caso contrario devuelve TRUE o FALSE dependiendo del éxito de la operación
  */
 public function genera($documento, $signo, $idDocumento, $idAlmacen, $idArticulo, $idLote, $idUbicacion, $flagDeposito, array $valores)
 {
     $ok = false;
     $articulo = new Articulos($idArticulo);
     // Si el artículo está sujeto a inventario
     if ($articulo->getInventario()->getIDTipo()) {
         $tipoMvto = new TiposMvtosAlmacen();
         $row = $tipoMvto->cargaCondicion("Id,Signo", "TipoDocumento='{$documento}' and Signo='{$signo}'");
         unset($tipoMvto);
         $idTipo = $row[0]['Id'];
         $signo = $row[0]['Signo'];
         if ($signo) {
             if ($valores['UM'] == '') {
                 $valores['UM'] = 'UMA';
             }
             $this->setIDTipo($idTipo);
             $this->setIDAlmacen($idAlmacen);
             $this->setIDArticulo($idArticulo);
             $this->setIDLote($idLote);
             $this->setIDUbicacion($idUbicacion);
             $this->setIDDocumento($idDocumento);
             switch ($signo) {
                 case 'E':
                     $this->setUnidadesE($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales']));
                     $this->setPalesE($valores['Pales']);
                     $this->setCajasE($valores['Cajas']);
                     break;
                 case 'S':
                     $this->setUnidadesS($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales']));
                     $this->setPalesS($valores['Pales']);
                     $this->setCajasS($valores['Cajas']);
                     break;
             }
             if ($this->validaMovimiento($signo)) {
                 if (parent::create()) {
                     if ($signo == 'S') {
                         $valores['Reales'] = -1 * $valores['Reales'];
                         $valores['Pales'] = -1 * $valores['Pales'];
                         $valores['Cajas'] = -1 * $valores['Cajas'];
                     }
                     $ok = true;
                     $exi = new Existencias();
                     $exi->actualiza($idAlmacen, $idArticulo, $idLote, $idUbicacion, $flagDeposito, $valores);
                     $this->_errores = $exi->getErrores();
                     unset($exi);
                 } else {
                     print_r($this->_errores);
                 }
             } else {
                 print_r($this->_errores);
             }
         } else {
             "NO SE HA DEFINIDIO EL TIPO DE MOVIMIENTO DE ALMACEN";
         }
     } else {
         $ok = true;
     }
     unset($articulo);
     return $ok;
 }