/** * 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; }
private function recalcula($idAlmacen) { // Poner las reservadas y el entrando a cero $stock = new Existencias(); $stock->queryUpdate(array("Reservadas" => 0, "Entrando" => 0), "IDAlmacen='{$idAlmacen}'"); // Borrar los registros de stock que estén a cero $stock->queryDelete("IDAlmacen='{$idAlmacen}' and Reales=0 and Pales=0 and Cajas=0 and Reservadas=0 and Entrando=0"); // Calcular las reservas de los artículos inventariables $lineas = new AlbaranesLineas(); $articulos = new Articulos(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); unset($lineas); unset($articulos); $query = "select l.IDArticulo,a.Codigo,l.Descripcion, sum(l.Unidades) Unidades,l.UnidadMedida "; $query .= "from {$tablaLineas} as l "; $query .= "join {$tablaArticulos} as a on l.IDArticulo=a.IDArticulo "; $query .= "where l.IDEstado='1' and a.Inventario='1' "; $query .= "group by l.IDArticulo"; $em = new EntityManager($_SESSION['project']['conection']); $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); unset($em); $resultado['reservas'] = $rows; foreach ($rows as $row) { $stock = new Existencias(); $stock->hazReserva($idAlmacen, $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']); } // Calcular el entrando de los artículos inventariables $lineas = new PedidosLineas(); $articulos = new Articulos(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); unset($lineas); unset($articulos); $query = "select l.IDArticulo,a.Codigo,l.Descripcion,sum(l.Unidades) Unidades,l.UnidadMedida "; $query .= "from {$tablaLineas} as l "; $query .= "join {$tablaArticulos} as a on l.IDArticulo=a.IDArticulo "; $query .= "where l.IDEstado='1' and a.Inventario='1' "; $query .= "group by l.IDArticulo"; $em = new EntityManager($_SESSION['project']['conection']); $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); unset($em); $resultado['entrando'] = $rows; foreach ($rows as $row) { $stock = new Existencias(); $stock->hazEntrando($idAlmacen, $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']); } return $resultado; }
/** * Confirma el pedido, que consiste actualizar las existencias a ENTRANDO. * Pasando del estado PTE. CONFIRMAR (0) a CONFIRMADO (1). * Para poder confirmar es obligatorio indicar una fecha prevista de entrega * Solo se tienen en cuenta los artículos inventariables. * Anota en el registro de existencias las cantidades pendientes de entrada */ public function confirma() { if ($this->getFechaEntrega() == '00/00/0000') { $this->_errores[] = "Antes de confirmar el pedido debe indicar una fecha prevista de entrega"; } elseif ($this->FechaEntrega < $this->Fecha) { $this->_errores[] = "La fecha prevista de entrega debe ser igual o mayor a la fecha del pedido"; } // Si no está confirmado if ($this->getIDEstado()->getIDTipo() == 0 and count($this->_errores) == 0) { $lineas = new PedidosLineas(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $articulos = new Articulos(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); $em = new EntityManager($this->getConectionName()); $query = "SELECT t1.IDArticulo, t1.IDAlmacen, sum(t1.Unidades) as Entrando, t1.UnidadMedida\n FROM {$tablaLineas} as t1, {$tablaArticulos} as t2\n WHERE t1.IDPedido='{$this->IDPedido}'\n AND t1.IDEstado='0'\n AND t1.IDArticulo=t2.IDArticulo\n AND t2.Inventario='1'\n GROUP BY t1.IDArticulo,t1.IDAlmacen, t1.UnidadMedida"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); // Poner previsión de entrada $exi = new Existencias(); foreach ($rows as $row) { $exi->hazEntrando($row['IDAlmacen'], $row['IDArticulo'], $row['Entrando'], $row['UnidadMedida'], $this->Deposito); } unset($exi); // Marcar como Entrando las líneas de pedido $lineas->queryUpdate(array("IDEstado" => 1), "IDPedido='{$this->IDPedido}' and IDEstado='0'"); // Confirmar la cabecera del pedido $this->setIDEstado(1); $this->save(); } }