Exemplo n.º 1
0
 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";
     }
 }
Exemplo n.º 2
0
 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());
 }
Exemplo n.º 3
0
 /**
  *
  *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");
 }
Exemplo n.º 4
0
 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');
 }