/** * 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; }
/** * 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; }