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