/**
  * Recepciona la línea de pedido.
  * Pasa las existencias del estado "Entrando" (1) al estado "Recepionada" (2)
  * y marca la línea como Recepcionada.
  *
  * Las unidades recibidas pueden ser diferentes a las pedidas.
  *
  * Recalcula los precios (Pvd,Pmc,Margen,Pvp) del artículo en base a las unidades recepcionadas
  *
  * @return boolean
  */
 public function recepciona()
 {
     $ok = true;
     $articulo = new Articulos($this->IDArticulo);
     $esInventariable = $articulo->getInventario()->getIDTipo();
     if ($esInventariable) {
         // Quitar 'entrando'
         $exi = new Existencias();
         $ok = $exi->quitaEntrando($this->IDAlmacen, $this->IDArticulo, $this->Unidades, $this->UnidadMedida);
         unset($exi);
     }
     if ($esInventariable and $ok) {
         // Recepcionar las líneas de recepción de la línea de pedido
         $recepcion = new Recepciones();
         $unidadesNetas = $recepcion->recepciona("PedidosCab", $this->IDLinea);
         unset($recepcion);
     } else {
         $unidadesNetas = $this->Unidades;
     }
     if ($ok) {
         // Marcar la línea de pedido como recepcionada y
         // Poner las unidades netas recibidas y las unidades pendientes de facturar
         // Recalcular la línea de pedido en base a las Unidades Recibidas
         // Actualiza los precios del artículo
         $this->setIDEstado(2);
         $this->setUnidadesRecibidas($unidadesNetas);
         $this->setUnidadesPtesFacturar($unidadesNetas);
         $this->setImporte($unidadesNetas * $this->Precio * (1 - $this->Descuento / 100));
         if ($unidadesNetas != 0) {
             $articulo = new Articulos($this->IDArticulo);
             $articulo->actualizaPrecios($unidadesNetas, abs($this->Importe / $unidadesNetas));
             unset($articulo);
         }
         $this->save();
     }
     return $ok;
 }
Beispiel #2
0
 /**
  * Si hay stock no se puede cambiar el estado de inventario ni las unidades de medida
  * Si las unidades de media son iguales, los factores de conversión los pongo a 1
  * Calculo el precio de venta sobre EL PRECIO MEDIO DE COSTO
  * Si columna 'etiqueta' está vacía, le pongo valor de la descripción del artículo
  */
 protected function validaLogico()
 {
     parent::validaLogico();
     // Si hay stock no se puede cambiar:
     // - ni el estado de inventario
     // - ni las unidades de medida
     // - ni si es compuesto o no
     $exi = new Existencias();
     if ($exi->hayRegistroExistencias($this->IDArticulo)) {
         // Hay registro de existencias
         $articulo = new Articulos($this->IDArticulo);
         $this->setInventario($articulo->getInventario()->getIDTipo());
         $this->setUMA($articulo->getUMA()->getId());
         $this->setUMC($articulo->getUMC()->getId());
         $this->setUMV($articulo->getUMV()->getId());
         $this->setAllowsChildren($articulo->getAllowsChildren()->getIDTipo());
         unset($articulo);
         $this->_alertas[] = "Hay Stock, no puede cambiar ni el estado de Inventario ni las Unidades de Medida, ni si es compuesto";
     } else {
         // Si no es inventariable, pongo los valores relativos
         // al inventario a 0.
         if ($this->Inventario == 0) {
             $this->Trazabilidad = 0;
             $this->BloqueoStock = 0;
             $this->StockMinimo = 0;
             $this->StockMaximo = 0;
             $this->Caducidad = 0;
         }
         // Si las unidades de media son iguales, los factores de conversión los pongo a 1
         if ($this->UMC == $this->UMB) {
             $this->CUMC = 1;
         }
         if ($this->UMA == $this->UMB) {
             $this->CUMA = 1;
         }
         if ($this->UMV == $this->UMB) {
             $this->CUMV = 1;
         }
     }
     // Calculo el precio de venta sobre EL PRECIO MEDIO DE COSTO
     if ($this->Pmc == 0) {
         $this->Pmc = $this->Pvd;
     }
     if ($this->Pmc != 0) {
         $this->Pvp = $this->Pmc * (1 + $this->Margen / 100);
     }
     // Pongo valores por defecto
     if (trim($this->CodigoEAN == '')) {
         $this->CodigoEAN = $this->Codigo;
     }
     if (trim($this->Subtitulo == '')) {
         $this->Subtitulo = $this->Descripcion;
     }
     if (trim($this->Resumen == '')) {
         $this->Resumen = $this->Descripcion;
     }
     if (trim($this->Etiqueta == '')) {
         $this->Etiqueta = substr($this->Descripcion, 0, 29);
     }
     // Valido que no se dupliquen los estados
     $valida = array();
     for ($i = 1; $i <= 5; $i++) {
         $idEstado = $this->{"IDEstado{$i}"};
         if (isset($valida[$idEstado])) {
             $this->{"IDEstado{$i}"} = 0;
         } else {
             $valida[$idEstado] = '1';
         }
     }
     // Si no está vigente, entonces tampoco se publica
     if (!$this->Vigente) {
         $this->Publish = 0;
     }
     unset($exi);
 }
 /**
  * Recepciona la línea de elaboración de tipo 1 (la de entrada)
  * Actualiza las existencias y marca la línea como recepcionada.
  *
  * NO SE REALIZA NINGUN TRATAMIENTO CON LAS EXISTENCIAS SI EL ARTICULO NO ES INVENTARIABLE
  *
  * @return boolean
  */
 public function recepciona()
 {
     $ok = true;
     $articulo = new Articulos($this->IDArticulo);
     $esInventariable = $articulo->getInventario()->getIDTipo();
     if ($esInventariable) {
         // Recepcionar la línea de elaboración
         $recepcion = new Recepciones();
         $unidadesNetas = $recepcion->recepciona("ManufacCab", $this->IDLinea);
         unset($recepcion);
     } else {
         $unidadesNetas = $this->Unidades;
     }
     if ($ok) {
         // Marcar la línea de elaboración como recepcionada y
         // Poner las unidades netas recibidas
         // Recalcular la línea
         // Actualiza los precios del artículo
         $this->setIDEstado(3);
         $this->setUnidades($unidadesNetas);
         $this->TotalizaLinea();
         if ($unidadesNetas != 0) {
             $articulo = new Articulos($this->IDArticulo);
             $articulo->actualizaPrecios($unidadesNetas, abs($this->Importe / $unidadesNetas));
             unset($articulo);
         }
         $this->save();
     }
     return $ok;
 }
 /**
  * Recepciona la línea de traspaso de tipo 1 (la de entrada)
  * Actualiza las existencias y marca la línea como expedida.
  *
  * NO SE REALIZA NINGUN TRATAMIENTO CON LAS EXISTENCIAS SI EL ARTICULO NO ES INVENTARIABLE
  *
  * @return boolean
  */
 public function recepciona()
 {
     $ok = true;
     $articulo = new Articulos($this->IDArticulo);
     $esInventariable = $articulo->getInventario()->getIDTipo();
     if ($esInventariable) {
         // Quitar 'entrando'
         $exi = new Existencias();
         $ok = $exi->quitaEntrando($this->IDAlmacen, $this->IDArticulo, $this->Unidades, $this->UnidadMedida);
         unset($exi);
     }
     if ($esInventariable and $ok) {
         // Recepcionar las líneas de recepción de la línea de traspaso
         $recepcion = new Recepciones();
         $unidadesNetas = $recepcion->recepciona("TraspasosCab", $this->IDLinea);
         unset($recepcion);
     } else {
         $unidadesNetas = $this->Unidades;
     }
     if ($ok) {
         // Marcar la línea de traspaso como recepcionada y
         // Poner las unidades netas recibidas
         // Recalcular la línea
         // Actualiza los precios del artículo
         $this->setIDEstado(3);
         $this->setUnidades($unidadesNetas);
         $this->TotalizaLinea();
         if ($unidadesNetas != 0) {
             $articulo = new Articulos($this->IDArticulo);
             $articulo->actualizaPrecios($unidadesNetas, abs($this->Importe / $unidadesNetas));
             unset($articulo);
         }
         $this->save();
     }
     return $ok;
 }
 /**
  * Expide la linea de albarán
  *
  * Actualiza las existencias y marca la línea como expedida.
  *
  * Las unidades expedidas pueden ser diferentes a las indicadas y por lo tanto se RECALCULA EL ALBARAN.
  *
  * 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 albarán
         $expedicion = new Expediciones();
         $unidadesNetas = $expedicion->expide("AlbaranesCab", $this->IDLinea);
         unset($expedicion);
     } else {
         $unidadesNetas = $this->Unidades;
     }
     if ($ok) {
         // Marcar la línea de albarán como expedida y
         // poner las unidades netas expedidas
         $this->setIDEstado(2);
         $this->setUnidades($unidadesNetas);
         $this->totalizaLinea($articulo);
         $this->save();
     }
     unset($articulo);
     return $ok;
 }
 /**
  * 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;
 }