function accionEliminar() { sesionNivel('a', 'g'); $modelo = $this->modelo; include 'Modelos/VentaProducto.php'; include 'Modelos/Producto.php'; include_once 'Modelos/' . $modelo . '.php'; if (isset($_POST[Venta::$array[0][0]])) { $ventaProductos = VentaProducto::obtenerTodos(' where id_venta=?', array(&$_POST['id_venta']), 'i'); $n_ventaProductos = count($ventaProductos); for ($i = 0; $i < $n_ventaProductos; $i++) { Producto::modificarExistencias($ventaProductos[$i]->id_producto, $ventaProductos[$i]->cantidad); } if ($modelo::eliminar($_POST[Venta::$array[0][0]]) == 0) { echo "0"; } else { echo "1"; } } else { echo "-4"; } }
private static function Cotizar($descuento, $id_comprador_venta, $impuesto, $subtotal, $tipo_venta, $total, $datos_cheque = null, $detalle_orden = null, $detalle_paquete = null, $detalle_venta = null, $id_sucursal = null, $saldo = "0", $tipo_de_pago = null) { Logger::log("Cotizando ...."); //Se obtiene el id del usuario actualmente logueado $aS = SesionController::Actual(); $id_usuario = $aS["id_usuario"]; //Se busca al usuario comprador $usuario = UsuarioDAO::getByPK($id_comprador_venta); if (!is_null($id_sucursal)) { $sucursal = SucursalDAO::getByPK($id_sucursal); if (is_null($sucursal)) { Logger::error("La sucursal " . $id_sucursal . " no existe"); throw new InvalidDataException("La sucursal no existe", 901); } if (!$sucursal->getActiva()) { Logger::error("La sucursal " . $id_sucursal . " esta desactivada"); throw new InvalidDataException("La sucursal esta desactivada", 901); } } //Se inicializa la venta con los parametros obtenidos $venta = new Venta(); $venta->setRetencion(0); $venta->setEsCotizacion(true); $venta->setIdCompradorVenta($id_comprador_venta); $venta->setSubtotal($subtotal); $venta->setImpuesto($impuesto); $venta->setTotal($total); $venta->setDescuento($descuento); $venta->setTipoDeVenta($tipo_venta); $venta->setIdCaja(null); $venta->setIdSucursal($id_sucursal); $venta->setIdUsuario($id_usuario); $venta->setIdVentaCaja(NULL); $venta->setCancelada(0); $venta->setTipoDePago(null); $venta->setSaldo(0); $venta->setFecha(time()); DAO::transBegin(); try { VentaDAO::save($venta); } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo realizar la venta: " . $e); throw new Exception("No se pudo realizar la venta", 901); } //Si el detalle de las ordenes compradas, el detalle de los paquetes y el detalle de los productos //son nulos, manda error. if (is_null($detalle_orden) && is_null($detalle_paquete) && is_null($detalle_venta)) { throw new InvalidDataException("No se recibieron ni paquetes ni productos ni servicios para esta venta", 901); } //Por cada detalle, se valida la informacion recibida, se guarda en un registro //que contiene el id de la venta generada y se guarda el detalle en su respectiva tabla. if (!is_null($detalle_venta)) { $detalle_producto = object_to_array($detalle_venta); if (!is_array($detalle_producto)) { throw new Exception("El detalle del producto es invalido", 901); } foreach ($detalle_producto as $d_p) { $d_producto = new VentaProducto(); $d_producto->setIdVenta($venta->getIdVenta()); if (!array_key_exists("id_producto", $d_p) || !array_key_exists("cantidad", $d_p) || !array_key_exists("precio", $d_p) || !array_key_exists("descuento", $d_p) || !array_key_exists("impuesto", $d_p) || !array_key_exists("retencion", $d_p) || !array_key_exists("id_unidad", $d_p)) { throw new Exception("El detalle del producto es invalido", 901); } Logger::log("Insertando venta_producto:"); $d_producto->setCantidad($d_p["cantidad"]); $d_producto->setDescuento($d_p["descuento"]); $d_producto->setIdProducto($d_p["id_producto"]); $d_producto->setIdUnidad($d_p["id_unidad"]); $d_producto->setImpuesto($d_p["impuesto"]); $d_producto->setPrecio($d_p["precio"]); $d_producto->setRetencion($d_p["retencion"]); Logger::log($d_producto); try { VentaProductoDAO::save($d_producto); } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo realizar la venta: " . $e); throw new Exception("No se pudo realizar la venta", 901); } } } /* Fin de if para detalle_producto */ DAO::transEnd(); Logger::log("====== Cotizacion realizada exitosamente ======== "); return array("id_venta" => $venta->getIdVenta()); }
/** * *Cancela una compra * * @param id_compra int Id de la compra a cancelar **/ public static function Cancelar($id_compra, $billetes = null, $id_caja = null) { Logger::log("Cancenlando compra " . $id_compra); //valida que la compra exista y que este activa $compra = CompraDAO::getByPK($id_compra); if ($compra == null) { throw new Exception("La compra con id: " . $id_compra . " no existe", 901); } if ($compra->getCancelada()) { Logger::warn("La compra ya ha sido cancelada"); return; } //Obtiene al usuario al que se le compro $usuario = UsuarioDAO::getByPK($compra->getIdVendedorCompra()); if ($usuario == null) { throw new Exception("FATAL!!! Esta compra apunta a un usuario que no existe", 901); } //Deja la compra como cancelada y la guarda. $compra->setCancelada(1); DAO::transBegin(); try { $com_prod = new CompraProducto(); $com_prod->setIdCompra($id_compra); $prods_compra = CompraProductoDAO::search($com_prod); foreach ($prods_compra as $p) { //De que almacen/inventario lo descuento? , del almacen de la empresa? como identifico el lote de entrada prod? continue; $ven_prod = new VentaProducto(); $ven_prod->setIdProducto(); $ven_prod->setCantidad($p->getCantidad()); $ven_prod->setPrecio($p->getPrecio()); $ven_prod->setDescuento($p->getDescuento()); SucursalesController::DescontarDeAlmacenes($ven_prod, $compra->getIdSucursal()); } CompraDAO::save($compra); //Si la compra fue a credito, se cancelan todos los abonos hechos al mismo y el dinero se queda a cuenta del usuario. if ($compra->getTipoDeCompra() == "credito") { $abono_compra = new AbonoCompra(); $abono_compra->setIdCompra($id_compra); $abonos = AbonoCompraDAO::search($abono_compra); foreach ($abonos as $abono) { if (!$abono->getCancelado()) { CargosYAbonosController::EliminarAbono($abono->getIdAbonoCompra(), "Compra cancelada", 1, 0, 0, null, null); } } $usuario->setSaldoDelEjercicio($usuario->getSaldoDelEjercicio() - $compra->getTotal()); UsuarioDAO::save($usuario); } else { if ($compra->getTipoDeCompra() == "contado" && !is_null($id_caja)) { CajasController::modificarCaja($id_caja, 1, $billetes, $compra->getTotal()); } } } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo cancelar la compra: " . $e); throw new Exception("No se pudo cancelar la compra, consulte a su administrador de sistema", 901); } DAO::transEnd(); Logger::log("Compra cancelada exitosamente"); }
private static function DescontarDeAlmacenes2(VentaProducto $detalle_producto, $id_sucursal) { Logger::log("DescontarDeAlmacenes( Sucursal={$id_sucursal} )"); //se buscan los almacenes de la sucursal $almacenes = AlmacenDAO::search(new Almacen(array("id_sucursal" => $id_sucursal))); Logger::log("\tExisten " . count($almacenes) . " almacenes en esta sucursa."); //Arreglo que contendra los almacenes con el producto que buscamos. $productos_almacen = array(); //El total de productos en existencia en todos los almacenes $total = 0; //por cada almacen en la sucursal que no sea de consignacion se busca el producto en dicho almacen, //si el producto fue encontrado se ingresa en el arreglo de productos_almacen y si su existencia es mayor a 0 //se lleva incrementa el total de productos en existencia por parte de todos los almacenes foreach ($almacenes as $almacen) { if ($almacen->getIdTipoAlmacen() == 2) { continue; } $producto_almacen = ProductoAlmacenDAO::getByPK($detalle_producto->getIdProducto(), $almacen->getIdAlmacen(), $detalle_producto->getIdUnidad()); if (!is_null($producto_almacen)) { if ($producto_almacen->getCantidad() > 0) { $total += $producto_almacen->getCantidad(); } array_push($productos_almacen, $producto_almacen); } } //Si productos_almacen queda vacío, quiere decir que no se encontro el producto en ningún almacen de esta sucursal if (empty($productos_almacen)) { Logger::log("No se encontro el producto en los almacenes de esta sucursal"); throw new BusinessLogicException("No se encontro el producto en los almacenes de esta sucursal"); } //La cantidad de producto que estamos buscando vender $n = $detalle_producto->getCantidad(); //El numero de almacenes que cuentan con el producto $n_almacenes = count($productos_almacen); /* * Este algoritmo se basa en dos casos posibles * * 1. Que el numero de elementos vendidos sea mayor o igual al total de elementos encontrados en los almacenes * * 2. Que el numero de elementos vendidos sean menor al total de elementos encontrados * * Caso 1: * * Dejamos la posibilidad abierta de que los almacenes queden con cantidad negativa, pues como es una * venta en mostrador, para vender el producto tiene que estar fisicamente ahi, y no se pretende evitar la venta * de un producto que fisicamente esta presente pero no lo esta en el sistema. * * Así pues, como de cualqueir manera todos los almacenes van a quedar con ese elemento en cantidades negativas o en ceros * cuando el numero de elementos sea igual al total, dejamos en ceros las existencias y empezamos a restar uniformemente * en cada almacen hasta cubrir la diferencia entre el numero de elementos vendidos con el numero de elementos encontrados. * * Caso 2: * * Se tiene que empezar a descontar del almacen que cuenta con mas existencia del elemento vendido * hasta que su existencia sea igual a la del segundo almacen que cuenta con mas existencia. A partir de ahi * se descontara de dos almacenes en lugar de uno, y asi hasta llegar al almacen co nmenos existencia. * * Para lograr esto, se ordena el arreglo de almacenes con sus productos y se guarda un arreglo de diferencias, * que indicara cuantas veces podremos restar de un almacen hasta tener que pasar al siguiente y restar de ambos. * Un contador nos indica a cuantos almacenes le estamso restando producto hasta que se cubre la demanda de elementos. * * En ambos casos se mantiene la uniformidad de existencia del elemento en los almacenes. El metodo funciona tanto para * las unidades que aceptan decimales como aquellas que solo son enteros. */ //caso 1 if ($n >= $total) { $n -= $total; if ($unidad->getEsEntero()) { $mod = $n % $n_almacenes; $cantidad = floor($n / $n_almacenes); } else { $mod = 0; $cantidad = $n / $n_almacenes; } DAO::transBegin(); try { foreach ($productos_almacen as $p) { $temp = $cantidad; if ($mod > 0) { $temp++; $mod--; } $p->setCantidad(0 - $temp); ProductoAlmacenDAO::save($p); } } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo actualizar la cantidad de producto en almacen: " . $e); throw new Exception("No se pudo actualizar la cantidad de producto en almacen"); } DAO::transEnd(); } else { $productos_almacen = self::OrdenarProductosAlmacen($productos_almacen); $diferencia = array(); for ($i = 0; $i < $n_almacenes - 1; $i++) { $diferencia[$i] = $productos_almacen[$i]->getCantidad() - $productos_almacen[$i + 1]->getCantidad(); } $diferencia[$i] = $productos_almacen[$i]->getCantidad(); for ($i = 0; $n > 0 && $i < $n_almacenes; $i++) { if ($n / ($i + 1) <= $diferencia[$i] * ($i + 1)) { if ($unidad->getEsEntero()) { $mod = $n % ($i + 1); $cantidad = floor($n / ($i + 1)); } else { $mod = 0; $cantidad = $n / ($i + 1); } DAO::transBegin(); try { for ($j = $i; $j >= 0; $j--) { $temp = $cantidad; if ($mod > 0) { $temp++; $mod--; } $productos_almacen[$j]->setCantidad($productos_almacen[$j]->getCantidad() - $temp); ProductoAlmacenDAO::save($productos_almacen[$j]); } } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo actualizar la cantidad de producto en almacen: " . $e); throw new Exception("No se pudo actualizar la cantidad de producto en almacen"); } DAO::transEnd(); } else { for ($j = $i; $j >= 0; $j--) { $productos_almacen[$j]->setCantidad($productos_almacen[$j]->getCantidad() - $diferencia[$i]); } } $n -= $diferencia[$i] * ($i + 1); } /* Fin del for */ } /* Fin del caso 2 */ }
public function postRenovacion() { $precio = Precio::where('producto_id', Input::get('producto_id'))->where('activo', 1)->firstorfail(); $mtto_detalle = VistaDetalleMantenimiento::find(Input::get('id')); $mtto_catalogo = Mantenimiento::where('producto_id', Input::get('producto_id'))->firstorfail(); //para obtener los meses a sumar en el mantenimiento renovado $vencimiento_actual = $mtto_detalle->fecha_fin; $vencimiento_actual_carbon = Carbon::parse($vencimiento_actual); //validar formulario $rules = array('forma_pago' => 'required'); if (Input::get('valor_efectivo') == 1 and Input::has('efectivo')) { $rules['efectivo'] = 'required|numeric|integer'; } if (Input::get('valor_credito') == 1 and Input::has('credito')) { $rules['credito'] = 'required|numeric|integer'; } if (Input::get('valor_debito') == 1 and Input::has('debito')) { $rules['debito'] = 'required|numeric|integer'; } $messages = array('required' => 'Capture :attribute', 'numeric' => 'solo números', 'integer' => 'solo se aceptan valores enteros'); $validator = Validator::make(Input::all(), $rules, $messages); if ($validator->fails()) { return Redirect::back()->withInput()->withErrors($validator); } //mantenimiento vencido toma la fecha de hoy if ($mtto_detalle->vencido == 1 and $mtto_detalle->venta_mantenimiento_activo == 1) { $inicio_renovacion_carbon = Carbon::now()->toDateString(); $vencimiento_renovacion_carbon = Carbon::parse($inicio_renovacion_carbon)->addMonths($mtto_catalogo->meses)->toDateString(); } elseif ($mtto_detalle->vencido == 0 and $mtto_detalle->venta_mantenimiento_activo == 1) { $inicio_renovacion_carbon = $vencimiento_actual_carbon->addDays(1)->toDateString(); $vencimiento_renovacion_carbon = Carbon::parse($inicio_renovacion_carbon)->addMonths($mtto_catalogo->meses)->toDateString(); } /*"precio"." ".$precio->monto*1.16." "."vencimiento actual "." ".$vencimiento_actual." ". "vencimiento contratado "." ". $vencimiento_renovacion_carbon ." "."meses"." ".$mtto_catalogo->meses." "."inicio del nuevo mantenimiento "." ". $inicio_renovacion_carbon;*/ //registrar venta $venta = new Venta(); $venta->cliente_id = Input::get('cliente_id'); $venta->folio_solicitud = Input::get('folio_solicitud'); $venta->total = $precio->monto * Input::get('iva'); if (Input::get('comentarios')) { $venta->comentarios = Input::get('comentarios'); } $venta->save(); //registrar detalle de venta $venta_producto = new VentaProducto(); $venta_producto->venta_id = $venta->id; $venta_producto->producto_id = Input::get('producto_id'); $venta_producto->cantidad = 1; $venta_producto->total = $precio->monto * Input::get('iva'); $venta_producto->precio_unitario = $precio->monto; $venta_producto->iva = (Input::get('iva') - 1) * 100; $venta_producto->save(); //registra venta de mantenimiento $venta_mantenimiento = new VentaMantenimiento(); $venta_mantenimiento->venta_producto_id = $venta_producto->id; $venta_mantenimiento->empleado_id = 4; $venta_mantenimiento->lote_id = Input::get('lote_id'); $venta_mantenimiento->fecha_inicio = $inicio_renovacion_carbon; $venta_mantenimiento->fecha_fin = $vencimiento_renovacion_carbon; $venta_mantenimiento->nuevo = 0; $venta_mantenimiento->activo = 1; $venta_mantenimiento->save(); //genera recibo $recibo = new Recibo(); $recibo->venta_id = $venta->id; $recibo->fecha_limite = $inicio_renovacion_carbon; $recibo->monto = $venta_producto->total; $recibo->cancelado = 0; $recibo->pagado = 1; $recibo->mensajero = 0; $recibo->save(); //registra pago(s) if (Input::has('efectivo')) { $efectivo = Input::get('efectivo'); $pago_efectivo = new Pago(); $pago_efectivo->recibo_id = $recibo->id; $pago_efectivo->forma_pago_id = 1; $pago_efectivo->monto = $efectivo; $pago_efectivo->usuario_id = Auth::user()->id; $pago_efectivo->save(); } if (Input::has('credito')) { $efectivo = Input::get('credito'); $pago_efectivo = new Pago(); $pago_efectivo->recibo_id = $recibo->id; $pago_efectivo->forma_pago_id = 2; $pago_efectivo->monto = $efectivo; $pago_efectivo->usuario_id = Auth::user()->id; $pago_efectivo->save(); } if (Input::has('debito')) { $efectivo = Input::get('debito'); $pago_efectivo = new Pago(); $pago_efectivo->recibo_id = $recibo->id; $pago_efectivo->forma_pago_id = 5; $pago_efectivo->monto = $efectivo; $pago_efectivo->usuario_id = Auth::user()->id; $pago_efectivo->save(); } //actualiza registro anterior de venta de mantenimiento ya que dejará de ser "nuevo" $venta_mantenimiento_actualiza = VentaMantenimiento::find($mtto_detalle->id); $venta_mantenimiento_actualiza->nuevo = 0; $venta_mantenimiento_actualiza->activo = 0; $venta_mantenimiento_actualiza->save(); //actualiza el ultimo consecutivo de folios de mantenimiento en tabla de configuracion general $config_gral = ConfiguracionGeneral::find(Input::get('config_gral_id')); $config_gral->folio_mtto = Input::get('folio_solicitud'); $config_gral->save(); return Redirect::to('mantenimiento'); }