public function listAction($idArticuloOrigen = '')
 {
     if ($idArticuloOrigen == '') {
         $idArticuloOrigen = $this->request[2];
     }
     $articulo = new ArticulosEscandallos();
     $rows = $articulo->cargaCondicion("*", "IDArticuloOrigen='{$idArticuloOrigen}' and IDArticuloDestino>0", "Id ASC");
     $totales = $articulo->cargaCondicion("*", "IDArticuloOrigen='{$idArticuloOrigen}' and IDArticuloDestino=0");
     unset($articulo);
     $escandallo[] = new ArticulosEscandallos();
     foreach ($rows as $row) {
         $escandallo[] = new ArticulosEscandallos($row['Id']);
     }
     $this->values['articulos'] = $escandallo;
     if ($totales[0]['Id']) {
         $this->values['totales'] = new ArticulosEscandallos($totales[0]['Id']);
     }
     $this->values['IDArticuloOrigen'] = $idArticuloOrigen;
     $this->values['articuloOrigen'] = new Articulos($idArticuloOrigen);
     // Si hay existencias del articulo origen, no permito cambiar su escandallo
     $existencias = new Existencias();
     $this->values['bloqueo'] = $existencias->hayRegistroExistencias($idArticuloOrigen);
     unset($existencias);
     return array('template' => $this->entity . '/index.html.twig', 'values' => $this->values);
 }
Exemplo n.º 2
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;
 }
Exemplo n.º 3
0
 /**
  * Descatalogar los lotes (poner no vigentes) que no tengan existencias
  * entre todos los almacenes de la empresa
  */
 public function DescatalogarAction()
 {
     if ($this->values['permisos']['permisosModulo']['UP']) {
         $lote = new Lotes();
         $tablaLotes = $lote->getDataBaseName() . "." . $lote->getTableName();
         $existencias = new Existencias();
         $tablaExistencias = $existencias->getDataBaseName() . "." . $existencias->getTableName();
         unset($existencias);
         $em = new EntityManager($lote->getConectionName());
         if ($em->getDbLink()) {
             $query = "\n                UPDATE {$tablaLotes} SET Vigente='0'\n                WHERE IDLote not in (\n                    SELECT IDLote\n                    FROM {$tablaExistencias} e\n                    WHERE (\n                        IDLote>0 AND\n                        (\n                            Reales>0 OR\n                            Reservadas>0 OR\n                            Entrando>0\n                        )\n                    )\n                    GROUP BY IDLote\n                    ORDER BY IDLote\n                );";
             $em->query($query);
             $em->desConecta();
         }
         unset($lote);
         return $this->indexAction();
     } else {
         return array('template' => '_global/forbiden.html.twig');
     }
 }
Exemplo n.º 4
0
 /**
  * Cierra el inventario.
  * 
  * Consiste en generar los movimientos de almacén necesarios
  * para dejar las existencias de cada articulo/lote/ubicación 
  * según lo indicado en las líneas de inventario
  */
 public function cierra()
 {
     $ok = true;
     // Si no está cerrado
     if ($this->Cerrado == 0) {
         $lineas = new InventariosLineas();
         $rows = $lineas->cargaCondicion("*", "IDInventario='{$this->IDInventario}'");
         unset($lineas);
         $exi = new Existencias();
         foreach ($rows as $row) {
             // Buscar la existencias que hay para calcular el mvto
             // de almacén de tal forma que se queden como dice el inventario
             $stock = $exi->cargaCondicion("*", "IDAlmacen='{$this->IDAlmacen}' and IDArticulo='{$row['IDArticulo']}' and IDLote='{$row['IDLote']}' and IDUbicacion='{$row['IDUbicacion']}'");
             $valores = array('UM' => 'UMA', 'Reales' => $row['Stock'] - $stock[0]['Reales'], 'Pales' => $row['Pales'] - $stock[0]['Pales'], 'Cajas' => $row['Cajas'] - $stock[0]['Cajas'], 'Reservadas' => 0, 'Entrando' => 0);
             /**
             if ($valores['Reales']>=0)
                 $signo = "E";
             else {
                 $signo = "S";
                 $valores['Reales'] = abs($valores['Reales']);
             }
             */
             $signo = "E";
             $mvtoAlmacen = new MvtosAlmacen();
             $ok = $mvtoAlmacen->genera('InventariosCab', $signo, $this->IDInventario, $this->IDAlmacen, $row['IDArticulo'], $row['IDLote'], $row['IDUbicacion'], 0, $valores);
             // Valores con los que actualizar
         }
         unset($exi);
         unset($mvtoAlmacen);
         // Marcar el inventario como cerrado
         if ($ok) {
             $this->setCerrado(1);
             $this->save();
         }
     }
     return $ok;
 }
Exemplo n.º 5
0
 /**
  * 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;
 }
Exemplo n.º 6
0
 /**
  * Devuelve el registro de existencias del artículo para cada almacén
  * @return array
  */
 public function getExistencias()
 {
     $array = array();
     $existencias = new Existencias();
     $tablaExistencias = $existencias->getDataBaseName() . "." . $existencias->getTableName();
     $almacenes = new Almacenes();
     $tablaAlmacenes = $almacenes->getDataBaseName() . "." . $almacenes->getTableName();
     $em = new EntityManager($this->getConectionName());
     if ($em->getDbLink()) {
         $query = "select\n                        a.Nombre,\n                        sum(e.Reales) as Reales,\n                        sum(e.Pales) as Pales,\n                        sum(e.Cajas) as Cajas,\n                        sum(e.Reservadas) as Reservadas,\n                        sum(e.Entrando) as Entrando\n                      from\n                        {$tablaExistencias} as e\n                        left join {$tablaAlmacenes} as a on e.IDAlmacen=a.IDAlmacen\n                      where\n                        e.IDArticulo='{$this->IDArticulo}'\n                      group by a.Nombre\n                      order by a.Nombre ASC";
         $em->query($query);
         $array = $em->fetchResult();
         $em->desConecta();
     }
     unset($em);
     return $array;
 }
Exemplo n.º 7
0
 /**
  * Expide la linea de elaboracion de tipo 0 (la de envío)
  * 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 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 elaboración
         $expedicion = new Expediciones();
         $unidadesNetas = $expedicion->expide("ManufacCab", $this->IDLinea);
         unset($expedicion);
     } else {
         $unidadesNetas = $this->Unidades;
     }
     if ($ok) {
         // Marcar la línea de elaboracion como expedida y
         // poner las unidades netas expedidas
         $this->setIDEstado(2);
         $this->setUnidades($unidadesNetas);
         $this->totalizaLinea();
         $this->save();
     }
     unset($articulo);
     return $ok;
 }
Exemplo n.º 8
0
 public function Existencias()
 {
     $nItems = 0;
     $nErrores = 0;
     $dbLink = mysql_connect("localhost", "root", "albatronic");
     $query = "TRUNCATE {$this->dbDestino}.ErpExistencias";
     mysql_query($query);
     $query = "select e.*,a.IDArticulo as id from {$this->dbOrigen}.existencias e left join {$this->dbDestino}.ErpArticulos a on e.IDArticulo=a.Codigo";
     $result = mysql_query($query, $dbLink);
     while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
         $e = new Existencias();
         $e->setIDAlmacen($row['IDSucursal']);
         $e->setIDArticulo($row['id']);
         $e->setReales($row['Reales']);
         $e->setReservadas($row['Reservadas']);
         $e->setEntrando($row['Entrando']);
         $e->setMaximo($row['Maximo']);
         $e->setMinimo($row['Minimo']);
         $id = $e->create();
         if (!$id) {
             $errores[] = $e->getErrores();
             $nErrores++;
         } else {
             $e->setPrimaryKeyMD5(md5($id));
             $e->save();
             $nItems++;
         }
     }
     echo "Existencias {$nItems}<br/>";
     if (count($errores)) {
         echo "<pre>";
         print_r($errores);
         echo "</pre>";
     }
 }
Exemplo n.º 9
0
 /**
  * Validaciones antes de actualizar o crear
  */
 public function valida()
 {
     unset($this->_errores);
     if ($this->IDArticulo == '') {
         $this->_errores[] = "Debe indicar un código de artículo";
         return count($this->_errores) == 0;
     }
     //Para tener disponibles los datos de la
     //cabecera del albaran
     $psto = new PstoCab($this->IDPsto);
     // Compruebo la existencia del artículo y que pertenezca a
     // la sucursal de la cabecera del albaran.
     $articulo = new Articulos($this->IDArticulo);
     if ($articulo->getStatus() == 0) {
         $this->_errores[] = "El artículo indicado no existe o no pertenece a esta sucursal";
         unset($articulo);
     }
     // Si existe el articulo ...
     if (count($this->_errores) == 0) {
         $aviso = $articulo->getAvisosPresupuestos();
         if ($aviso) {
             $this->_alertas[] = $aviso;
         }
         // Si es version CRISTAL, comprueba multiplos y calcula medidas
         if ($_SESSION['ver'] == 1) {
             $this->checkMultiplos($articulo);
         }
         $this->checkPackingVentas($articulo);
         // Si la descripcion está vacia, pongo la del artículo
         // Si trae algo, la respeto.
         if ($this->Descripcion == '') {
             $this->setDescripcion($articulo->getDescripcion());
         }
         // Si hay promo, ver si se aplica en base a la cantidad mínima.
         // Si es aplicable, prevalece sobre el precio y dcto indicado y tambien
         // sobre la tarifa del cliente.
         $precios = $articulo->cotizar($psto);
         if ($precios['Promocion']) {
             $alerta = "Promocion hasta el " . $precios['Promocion']->getFinPromocion() . " y compra mínima " . $precios['Promocion']->getCantidadMinima();
             if ($precios['Promocion']->getIDFP()->getIDFP()) {
                 $alerta .= " y forma de pago " . $precios['Promocion']->getIDFP();
             }
             $this->_alertas[] = $alerta;
         }
         // Si hay promo, se aplica si se iguala o supera la cantidad mínima y si
         // no se restringe la forma de pago y en caso contrario la forma de pago
         // fijada para la promocion es igual a la del presupuesto
         if ($precios['Promocion'] and $this->getUnidades() >= $precios['Promocion']->getCantidadMinima() and (!$precios['Promocion']->getIDFP()->getIDFP() or $psto->getIDFP()->getIDFP() == $precios['Promocion']->getIDFP()->getIDFP())) {
             $this->IDPromocion = $precios['Promocion']->getIDPromocion();
             $this->Precio = $precios['Promo']['Precio'];
             $this->Descuento = $precios['Promo']['Descuento'];
         } else {
             // Si no hay promo, se aplica la tarifa, o se respeta el precio y descuento
             // indicado por el usuario si tiene permiso dependiendo de si su rol está
             // incluido en el parámetro ROLCP
             $this->IDPromocion = 0;
             if ($this->Precio == '' or !$_SESSION['usuarioPortal']['cambioPrecios']) {
                 $this->setPrecio($precios['Tarifa']['Precio']);
             }
             if ($this->Descuento == '' or !$_SESSION['usuarioPortal']['cambioPrecios']) {
                 $this->setDescuento($precios['Tarifa']['Descuento']);
             }
         }
         // Totalizar la linea
         $this->totalizaLinea($articulo);
         //Comprobar que no se venda por debajo del costo
         if ($this->Importe < $this->ImporteCosto) {
             $this->_alertas[] = "Venta negativa";
         }
         // Poner el mismo almacen y comercial de la cabecera del albarán
         $this->setIDAlmacen($psto->getIDAlmacen()->getIDAlmacen());
         $this->setIDComercial($psto->getIDComercial()->getIDAgente());
         $this->setIDAgente($_SESSION['usuarioPortal']['Id']);
         // Si el cliente no está sujeto a Iva, pongo a 0 el iva y el recargo
         if ($psto->getIDCliente()->getIva()->getIDTipo() == '0') {
             $this->setIva('0');
             $this->setRecargo('0');
         } else {
             // Si no se ha indicando iva, pongo el iva y recargo asociado al artículo,
             if ($this->Iva == '') {
                 $this->setIva($articulo->getIDIva()->getIva());
                 if ($psto->getIDCliente()->getRecargoEqu()->getIDTipo() == '1') {
                     $this->setRecargo($articulo->getIDIva()->getRecargo());
                 } else {
                     $this->setRecargo('0');
                 }
             }
         }
         // Si el artículo es inventariable:
         // Comprobar existencias sin tener en cuenta lote ni ubicación
         // de almacen. Solo se buscan existencias en el almacen indicado
         // en la línea del albarán
         if ($articulo->getInventario()->getIDTipo() == '1') {
             $existencias = new Existencias();
             $stock = $existencias->getStock($this->IDArticulo, $this->IDAlmacen);
             if ($stock['DI'] < $this->getUnidades()) {
                 $this->_alertas[] = "Stock insuficiente";
                 $this->_alertas[] = "------------------";
             }
             $this->_alertas[] = "Disponible: " . $stock['DI'];
             $this->_alertas[] = "Real: " . $stock['RE'];
             $this->_alertas[] = "Reservado: " . $stock['RV'];
             $this->_alertas[] = "Pte. Entrada: " . $stock['PE'];
         }
     }
     unset($articulo);
     unset($psto);
     unset($existencias);
     return count($this->_errores) == 0;
 }
 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;
 }
Exemplo n.º 11
0
 /**
  * Anula la confirmacion de la orden de traspaso, que consiste en:
  *
  *  1.- Quitar la reserva de mercancia en el registro de existencias sin indicar lote ni ubicacion
  *      solo para aquellos artículos que estén sujetos a inventario
  *  2.- Poner la cabecera de la orden de traspaso y sus lineas en estado PTE. DE CONFIRMAR (0)
  *
  */
 public function anulaConfirmacion()
 {
     // Si está confirmado
     if ($this->getIDEstado()->getIDTipo() == 1) {
         $em = new EntityManager($this->getConectionName());
         $query = "SELECT t1.IDArticulo, t1.IDAlmacen, t1.Unidades, t1.UnidadMedida\n                        FROM {$this->_dataBaseName}.ErpTraspasosLineas as t1, ErpArticulos as t2\n                        WHERE t1.IDTraspaso='{$this->IDTraspaso}'\n                            AND t1.Tipo='0'\n                            AND t1.IDEstado='1'\n                            AND t1.IDArticulo=t2.IDArticulo\n                            AND t2.Inventario='1'";
         $em->query($query);
         $rows = $em->fetchResult();
         $em->desConecta();
         // Quitar las reservas
         $exi = new Existencias();
         foreach ($rows as $row) {
             $exi->quitaReserva($row['IDAlmacen'], $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']);
         }
         unset($exi);
         // Poner en estado de PTE DE CONFIRMAR las líneas de la orden de traspaso de tipo 0 (salida)
         $lineas = new TraspasosLineas();
         $lineas->queryUpdate(array("IDEstado" => 0), "IDTraspaso='{$this->IDTraspaso}' and IDEstado='1' and Tipo='0'");
         unset($lineas);
         // Borrar las eventuales lineas de expedicion
         $expediciones = new Expediciones();
         $expediciones->queryDelete("Entidad='TraspasosCab' and IDEntidad='{$this->IDTraspaso}'");
         unset($expediciones);
         // Anular la reserva en la cabecera de la orden de traspaso
         $this->setIDEstado(0);
         $this->save();
     }
 }
Exemplo n.º 12
0
 /**
  * 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;
 }
Exemplo n.º 13
0
 /**
  * Anula la confirmación del pedido
  * Pasando del estado CONFIRMADO (1) a PTE. CONFIRMAR (0)
  * Solo se tienen en cuenta los artículos inventariables.
  * Anula del registro de existencias las cantidades pendientes de entrada
  */
 public function anulaConfirmacion()
 {
     // Si está confirmado
     if ($this->getIDEstado()->getIDTipo() == 1) {
         $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='1'\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();
         // Quitar previsión de entrada
         $exi = new Existencias();
         foreach ($rows as $row) {
             $exi->quitaEntrando($row['IDAlmacen'], $row['IDArticulo'], $row['Entrando'], $row['UnidadMedida'], $this->Deposito);
         }
         unset($exi);
         // Marcar como NO CONFIRMADAS las líneas de pedido y
         // quitar la eventual asignación de lotes y UnidadesRecbidas
         $lineas->queryUpdate(array("IDEstado" => 0), "IDPedido='{$this->IDPedido}' and IDEstado='1'");
         // Borrar las eventuales líneas de recepción
         $recepciones = new Recepciones();
         $recepciones->queryDelete("Entidad='PedidosCab' and IDEntidad='{$this->IDPedido}'");
         // Anular la reserva en la cabecera del pedido
         // y quitar la fecha prevista de entrega y las posibles incidencias
         $this->setIDEstado(0);
         $this->setFechaEntrega('00/00/0000');
         $this->setIncidencias('');
         $this->save();
     }
 }
Exemplo n.º 14
0
 /**
  * Valida la idoneidad del movimiento.
  *
  * Chequea si se aplica o no la trazabilidad, la ubicacion y el bloqueo de stock
  *
  * @param char $signo El signo del movimiento (E=Entrada, S=Salida)
  * @return boolean
  */
 private function validaMovimiento($signo)
 {
     $articulo = new Articulos($this->IDArticulo);
     $almacen = new Almacenes($this->IDAlmacen);
     $hayTrazabilidad = $articulo->getTrazabilidad()->getIDTipo();
     $hayBloqueoStock = $articulo->getBloqueoStock()->getIDTipo();
     $hayControlUbicaciones = $almacen->getControlUbicaciones()->getIDTipo();
     if ($hayBloqueoStock) {
         $exi = new Existencias();
         $stock = $exi->getStock($this->IDArticulo, $this->IDAlmacen, $this->IDLote, $this->IDUbicacion, '', 'UMA');
         unset($exi);
         switch ($signo) {
             case 'S':
                 $unidades = $this->UnidadesE + $this->UnidadesS;
                 if ($unidades < 0) {
                     $okBloqueoStock = true;
                 } else {
                     $okBloqueoStock = $stock['RE'] >= $unidades;
                 }
                 break;
             case 'E':
                 $unidades = $this->UnidadesE + $this->UnidadesS;
                 if ($unidades < 0) {
                     $okBloqueoStock = $unidades + $stock['RE'] >= 0;
                 } else {
                     $okBloqueoStock = true;
                 }
                 break;
         }
     } else {
         $okBloqueoStock = true;
     }
     $okTrazabilidad = (!$hayTrazabilidad or $this->IDLote != 0);
     $okUbicacion = (!$hayControlUbicaciones or $this->IDUbicacion != 0);
     if (!$okBloqueoStock) {
         $this->_errores[] = "No hay stock suficiente para " . $articulo->getDescripcion();
     }
     if (!$okTrazabilidad) {
         $this->_errores[] = "Debe indicar el lote para " . $articulo->getDescripcion();
     }
     if (!$okUbicacion) {
         $this->_errores[] = "Debe indicar la ubicación para " . $articulo->getDescripcion();
     }
     unset($articulo);
     unset($almacen);
     return count($this->_errores) == 0;
 }
 /**
  * Preasigna stock sin control de trazabilidad ni de ubicación
  *
  * Si hay stock pero no es suficiente, se crea la línea de expedición proponiendo el que hay.
  *
  * Si NO hay stock:
  *
  *   Caso 1) El artículo bloquea stock: no se crea la línea de expedición
  *   Caso 2) El artículo NO bloquea stock: se crea la línea de expedición proponiendo 0 unidades
  * 
  * @param AlbaranesLineas $lineaAlbaran
  * @param <type> $idRepartidor
  */
 private function preasignaStock($entidad, $idEntidad, $linea, $idRepartidor = '')
 {
     echo "asdfasdfasdfasdfasdf";
     $idLineaEntidad = $linea->getPrimaryKeyValue();
     $articulo = $linea->getIDArticulo();
     $idAlmacen = $linea->getIDAlmacen()->getIDAlmacen();
     $unidades = $linea->getUnidades();
     $unidadMedidaOrigen = $linea->getUnidadMedida();
     $unidadesAlmacen = $articulo->convertUnit($unidadMedidaOrigen, 'UMA', $unidades);
     $bloqueoStock = $articulo->getBloqueoStock()->getIDTipo() == '1';
     $exi = new Existencias();
     $existencias = $exi->getStock($articulo->getIDArticulo(), $idAlmacen);
     unset($exi);
     if ($existencias['RE'] >= $unidadesAlmacen) {
         $asignado = $articulo->convertUnit('UMA', $unidadMedidaOrigen, $unidadesAlmacen);
         $stockInsuficiente = false;
     } else {
         $stockInsuficiente = true;
         $asignado = $articulo->convertUnit('UMA', $unidadMedidaOrigen, $existencias['RE']);
     }
     if ($asignado <= 0 and !$bloqueoStock) {
         $asignado = 0;
     }
     $lineaExpedicion = new Expediciones();
     $lineaExpedicion->setEntidad($entidad);
     $lineaExpedicion->setIDEntidad($idEntidad);
     $lineaExpedicion->setIDLineaEntidad($idLineaEntidad);
     $lineaExpedicion->setIDAlmacen($idAlmacen);
     $lineaExpedicion->setIDAlmacenero($_SESSION['usuarioPortal']['Id']);
     $lineaExpedicion->setIDRepartidor($idRepartidor);
     $lineaExpedicion->setIDArticulo($articulo->getIDArticulo());
     if ($existencias['RE'] > 0) {
         $asignado = $existencias['RE'] > $unidadesAlmacen ? $unidadesAlmacen : $existencias['RE'];
     } else {
         $asignado = 0;
     }
     $asignado = $articulo->convertUnit('UMA', $unidadMedidaOrigen, $asignado);
     $lineaExpedicion->setUnidades($asignado);
     $lineaExpedicion->setUnidadMedida($unidadMedidaOrigen);
     $lineaExpedicion->setIDLote(0);
     $lineaExpedicion->setIDUbicacion(0);
     $lineaExpedicion->setFlagTrazabilidad(0);
     $lineaExpedicion->setFlagUbicacion(0);
     $lineaExpedicion->setFlagSinStock($stockInsuficiente);
     $lineaExpedicion->create();
 }
Exemplo n.º 16
0
 /**
  * Devuelve los artículos que son inventariables y están bajo mínimos
  * 
  * @return type
  */
 static function getRoturasStock()
 {
     $arti = new Articulos();
     $tablaArticulos = $arti->getDataBaseName() . "." . $arti->getTableName();
     $exi = new Existencias();
     $tablaExistencias = $exi->getDataBaseName() . "." . $exi->getTableName();
     $em = new EntityManager($arti->getConectionName());
     if ($em->getDbLink()) {
         $query = "select a.Codigo,a.Descripcion,a.StockMinimo,sum(e.Reales) as sumaReales,sum(e.Reservadas) as sumaReservadas,sum(e.Entrando) as sumaEntrando,a.StockMinimo-sum(e.Reales-e.Reservadas+e.Entrando) as pedidoMinimo\n                FROM {$tablaExistencias} as e left join {$tablaArticulos} as a on e.IDArticulo=a.IDArticulo\n                WHERE (a.Inventario='1')\n                GROUP BY e.IDArticulo\n                HAVING ( (a.StockMinimo>0) and (sumaReales < a.StockMinimo) ) or (sumaReales<0)\n                ORDER BY a.IDCategoria,a.Descripcion";
         $em->query($query);
         $rows = $em->fetchResult();
     }
     unset($em);
     unset($arti);
     unset($exi);
     return $rows;
 }