public function addProduct($idArticulo, $unidades) { $ok = false; $filtro = "session='{$_SESSION['IdSesion']}' and IDArticulo='{$idArticulo}'"; $rows = $this->cargaCondicion("Id", $filtro); if ($rows[0]['Id']) { $carrito = new Carrito($rows[0]['Id']); $carrito->setUnidades($carrito->getUnidades() + $unidades); $carrito->setImporte($carrito->getUnidades() * $carrito->getPrecio() * (1 - $carrito->getDescuento() / 100)); $ok = $carrito->save(); unset($carrito); } else { $articulo = new Articulos($idArticulo); $this->sesion = $_SESSION['IdSesion']; $this->IpOrigen = $_SERVER['REMOTE_ADDR']; $this->UserAgent = $_SERVER['HTTP_USER_AGENT']; $this->IDArticulo = $idArticulo; $this->Descripcion = $articulo->getDescripcion(); $this->Unidades = $unidades; $this->UnidadMedida = $articulo->getUnidadMedida("UMV"); $this->Precio = $articulo->getPrecioVentaConImpuestos(); $this->Descuento = 0; $this->Importe = $this->Unidades * $this->Precio * (1 - $this->Descuento / 100); $this->Iva = $articulo->getIDIva()->getIva(); $this->Recargo = $articulo->getIDIva()->getRecargo(); $this->Estado = 0; $ok = $this->create() > 0; unset($articulo); } return $ok; }
private function generaCombinaciones($idArticulo, $combinaciones) { foreach ($combinaciones as $value) { $nuevo = new Articulos($idArticulo); $nuevo->setIDArticulo(''); $nuevo->setDescripcion($nuevo->getDescripcion() . " " . $value); $nuevo->setBelongsTo($idArticulo); $nuevo->setPrimaryKeyMD5(''); $nuevo->setNivelJerarquico($nuevo->getNivelJerarquico() + 1); $nuevo->create(); } }
/** * 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; } }
/** * Devuelve un array con los artículos que forman * parte del escandallo del articulo actual * * array('IDArticulo'=>,'Codigo'=>,'Descripcion'=>,'Unidades'=>,'UMV'=>) * * @return array \Articulos */ public function getEscandallo() { $escan = new ArticulosEscandallos(); $filtro = "IDArticuloOrigen='{$this->IDArticulo}' and IDArticuloDestino<>'0'"; $rows = $escan->cargaCondicion("IDArticuloDestino,Unidades", $filtro, "Id ASC"); unset($escan); $array = array(); foreach ($rows as $row) { $articulo = new Articulos($row['IDArticuloDestino']); $array[] = array('IDArticulo' => $articulo->getIDArticulo(), 'Codigo' => $articulo->getCodigo(), 'Descripcion' => $articulo->getDescripcion(), 'Unidades' => $row['Unidades'], 'UMV' => $articulo->getUMV()->getUnidadMedida()); unset($articulo); } return $array; }
/** * Recalcula los precios de costo y de venta de los articulos * obtenidos en la elaboración, prorrateando el costo total de * la elaboración entre las UMAs obtenidas de cada producto * * Este proceso se hace con las líneas de tipo 1 que estén recepcionadas (Estado=3) * y en base a la política de recálculo de precios definida con el parámetro ACTU_PRECIOS */ public function CotizarAction() { if ($this->values['permisos']['permisosModulo']['UP']) { $idManufac = $this->request['ManufacCab']['IDManufac']; $datos = new ManufacCab($idManufac); if ($datos->getKilosDestino() != 0) { $totalCoste = $datos->getTotalCoste(); $totalUMAObtenidos = $datos->getKilosDestino(); $costePorUMA = $totalCoste / $datos->getKilosDestino(); //Recorrer las lineas de elaboracion tipo 1 $lineas = new ManufacLineas(); $rows = $lineas->cargaCondicion("*", "IDManufac='{$idManufac}' and Tipo='1' and IDEstado='3'"); unset($lineas); foreach ($rows as $row) { $articulo = new Articulos($row['IDArticulo']); if ($articulo->actualizaPrecios($row['Unidades'], $costePorUMA)) { $this->values['alertas'][] = "Se actualizó: " . $articulo->getCodigo() . " " . $articulo->getDescripcion(); } else { $this->values['alertas'][] = "NO Se actualizó: " . $articulo->getCodigo() . " " . $articulo->getDescripcion(); } } unset($articulo); } $this->values['datos'] = $datos; $this->values['errores'] = $datos->getErrores(); unset($datos); return array('template' => $this->entity . '/edit.html.twig', 'values' => $this->values); } else { return array('template' => '_global/forbiden.html.twig'); } }
/** * Genera los ordenes del articulo $idArticulo en base * a todas las reglas aplicables al mismo * * @param int $idArticulo El id del artículo * @return void */ public function aplicaReglasArticulo($idArticulo) { $articulo = new Articulos($idArticulo); $reglas = $this->getReglasArticulo($idArticulo); foreach ($reglas as $regla) { $orden = new OrdenesArticulos(); $filtro = "IDRegla='{$regla}' AND IDArticulo='{$articulo->getIDArticulo()}'"; $rows = $orden->cargaCondicion("Id", $filtro); if (!$rows[0]["Id"]) { $orden->setIDRegla($regla); $orden->setIDArticulo($articulo->getIDArticulo()); $orden->setObservations($articulo->getDescripcion()); $orden->create(); } } unset($articulo); }
/** * 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; }