/**
  * 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";
     }
     // Las unidades deben ser distintas a 0
     if ($this->Unidades == 0) {
         $this->_errores[] = "Debe indicar la cantidad";
     }
     // Compruebo la existencia del artículo
     $articulo = new Articulos($this->IDArticulo);
     if ($articulo->getStatus() == 0) {
         $this->_errores[] = "El artículo indicado no existe";
         unset($articulo);
     }
     // Si existe el articulo ...
     if (count($this->_errores) == 0) {
         // Si la descripcion está vacia, pongo la del artículo
         // Si trae algo, la respeto.
         if ($this->Descripcion == '') {
             $this->setDescripcion($articulo->getDescripcion());
         }
         if ($this->Precio == '') {
             $this->setPrecio($articulo->getPmc());
         }
         $this->TotalizaLinea();
         // Si el artículo es inventariable y la linea es de salida:
         // Comprobar existencias sin tener en cuenta lote y ubicación
         if ($articulo->getInventario()->getIDTipo() == '1' and $this->Tipo == '0') {
             $existencias = new Existencias();
             $stock = $existencias->getStock($this->IDArticulo, $this->IDAlmacen, 0, 0, -1, $this->UnidadMedida);
             if ($stock['RE'] < $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($existencias);
     return count($this->_errores) == 0;
 }
 /**
  * Realiza validaciones logicas antes de crear/actualizar el objeto:
  * 
  * 1.- Comprueba la existencia del lote y ubicación (si procede)
  * 2.- Agrupa con código de artículo, lote ubicación
  */
 public function validaLogico()
 {
     parent::validaLogico();
     // Control Lote y Ubicación
     $articulo = new Articulos($this->IDArticulo);
     if ($articulo->getStatus()) {
         $trazabilidad = $articulo->getTrazabilidad()->getIDTipo() == 1;
         $this->Descripcion = $articulo->getDescripcion();
     } else {
         $this->_errores[] = "El artículo no existe";
     }
     unset($articulo);
     $inventario = new InventariosCab($this->IDInventario);
     $controlUbicaciones = $inventario->getIDAlmacen()->getControlUbicaciones()->getIDTipo() == 1;
     unset($inventario);
     if ($trazabilidad) {
         if ($this->IDLote == 0) {
             $this->_errores[] = "Debe indicar un lote";
         } else {
             // Comprobar que el lote pertenezca al artículo
             $lote = new Lotes($this->IDLote);
             if ($lote->getIDArticulo()->getIDArticulo() != $this->IDArticulo) {
                 $this->_errores[] = "El lote no pertenece al artículo";
             }
             unset($lote);
         }
     }
     if ($controlUbicaciones and $this->IDUbicacion == 0) {
         $this->_errores[] = "Debe indicar la ubicación";
     }
     // Agrupar en la misma línea de inventario las entradas
     // que coinciden en el código de articulo, lote y ubicación
     $rows = $this->cargaCondicion("*", "IDArticulo='{$this->IDArticulo}' and IDLote='{$this->IDLote}' and IDUbicacion='{$this->IDUbicacion}' and IDInventario='{$this->IDInventario}'");
     if (count($rows)) {
         $this->_idLineaNueva = $rows[0]['IDLinea'];
         $this->Stock += $rows[0]['Stock'];
         $this->Cajas += $rows[0]['Cajas'];
         $this->Pales += $rows[0]['Pales'];
         $this->_flagAgrupa = true;
     }
 }
 /**
  * Validaciones antes de actualizar o crear
  */
 public function valida(array $rules)
 {
     unset($this->_errores);
     //Para tener disponibles los datos de la
     //cabecera del pedido
     $pedido = new PedidosCab($this->IDPedido);
     // Compruebo la existencia del artículo y que pertenezca a
     // la sucursal de la cabecera del pedido.
     if ($this->IDArticulo == '') {
         $this->_errores[] = "Debe indicar un código de artículo";
     } else {
         $articulo = new Articulos($this->IDArticulo);
         if ($articulo->getStatus() == 0) {
             $this->_errores[] = "El artículo indicado no existe";
             unset($articulo);
         }
     }
     // Si existe el articulo ...
     if (count($this->_errores) == 0) {
         $aviso = $articulo->getAvisosPedidos();
         if ($aviso) {
             $this->_alertas[] = $aviso;
         }
         $this->checkPackingCompras($articulo);
         // Si la descripcion está vacia, pongo la del artículo
         // Si trae algo, la respeto.
         if ($this->Descripcion == '') {
             $this->setDescripcion($articulo->getDescripcion());
         }
         // Si no se ha indicado precio, pongo el precio de costo de la ficha del articulo
         if ($this->Precio == '') {
             $this->setPrecio($articulo->getPrecioCosto());
         }
         // Totalizar la linea de pedido
         $this->setImporte($this->Unidades * $this->Precio * (1 - $this->Descuento / 100));
         //Comparar el precio respecto al PMC.
         //Si el importe neto (despues de dctos) unitario supera el P.M.C. se emite alerta
         if ($this->getImporte() / $this->getUnidades() > $articulo->getPmc()) {
             $this->_alertas[] = "El precio supera al Precio Medio de Compra: " . $articulo->getPmc();
         }
         // Poner el mismo almacen de la cabecera del pedido y el agente en curso
         $this->setIDAlmacen($pedido->getIDAlmacen()->getIDAlmacen());
         $this->setIDAgente($_SESSION['usuarioPortal']['Id']);
         // Si el proveedor no está sujeto a Iva, pongo a 0 el iva y el recargo
         if ($pedido->getIDProveedor()->getIva()->getIDTipo() == '0') {
             $this->setIva('0');
             $this->setRecargo('0');
         } else {
             // Si no se ha indicando iva, pongo el iva asociado al artículo,
             if ($this->Iva == '') {
                 $this->setIva($articulo->getIDIva()->getIva());
             }
         }
         // 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 pedido
         if ($articulo->getInventario()->getIDTipo() == '1') {
             $existencias = new Existencias();
             $stock = $existencias->getStock($this->IDArticulo, $this->IDAlmacen);
             // Se genera una alerta si hay stock disponible o pendiente de entrada
             if ($stock['PE'] > 0 or $stock['DI'] > 0) {
                 $this->_alertas[] = "Hay stock";
                 $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($pedido);
     unset($existencias);
     return count($this->_errores) == 0;
 }
Example #4
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;
 }
 /**
  * Validaciones antes de actualizar o crear
  */
 public function valida(array $rules = array())
 {
     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 albarán
     $albaran = new AlbaranesCab($this->IDAlbaran);
     // Compruebo la existencia del artículo
     $articulo = new Articulos($this->IDArticulo);
     if ($articulo->getStatus() == 0) {
         $this->_errores[] = "El artículo indicado no existe";
         unset($articulo);
     }
     // Si existe el articulo ...
     if (count($this->_errores) == 0) {
         $aviso = $articulo->getAvisosAlbaranes();
         if ($aviso) {
             $this->_alertas[] = $aviso;
         }
         // Si es version CRISTAL, comprueba múltiplos y calcula medidas
         if ($_SESSION['ver'] == 1) {
             $this->checkMultiplos($articulo);
         }
         $this->checkPackingVentas($articulo);
         // Pongo la descripcion del artículo si viene vacía o si el
         // usuario no tiene permiso para cambiarla. Ver parámetro ROLCP
         if ($this->Descripcion == '') {
             //or (!$_SESSION['usuarioPortal']['cambioPrecios']) )
             $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 también
         // sobre la tarifa del cliente.
         $precios = $articulo->cotizar($albaran, $this->Unidades);
         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 (is_object($precios['Promocion']) and $this->getUnidades() >= $precios['Promocion']->getCantidadMinima() and ($precios['Promocion']->getIDFP()->getIDFP() == 0 or $albaran->getIDFP()->getIDFP() == $precios['Promocion']->getIDFP()->getIDFP())) {
             $this->IDPromocion = $precios['Promocion']->getIDPromocion();
             $this->Precio = $precios['Promo']['Precio'];
             $this->Descuento = $precios['Promo']['Descuento'];
             $this->PvpVigente = $precios['Promo']['Precio'];
         } else {
             $this->PvpVigente = $precios['Tarifa']['Precio'];
             // 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 la VWP "rolesCambioPrecios"
             $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']);
             }
         }
         // Comprobar que no se venda por debajo del tope establecido para la familia o
         // el general establecido en VWP[erp][]
         $precioMinimo = $articulo->getPrecioMinimoVenta();
         if ($this->Precio < $precioMinimo) {
             $this->_alertas[] = "El precio indicado es inferior al permitido " . $precioMinimo;
             $this->_errores[] = "El precio indicado es inferior al permitido ";
         }
         // 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($albaran->getIDAlmacen()->getIDAlmacen());
         $this->setIDComercial($albaran->getIDComercial()->getIDAgente());
         $this->setIDAgente($_SESSION['usuarioPortal']['Id']);
         // Si el cliente no está sujeto a Iva, pongo a 0 el iva y el recargo
         if ($albaran->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 ($albaran->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' and $_SESSION['VARIABLES']['WebPro']['erp']['alertaStock']) {
             $existencias = new Existencias();
             $stock = $existencias->getStock($this->IDArticulo, $this->IDAlmacen, 0, 0, -1, $this->UnidadMedida);
             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($albaran);
     unset($existencias);
     return count($this->_errores) == 0;
 }