/** * *Metodo que cancela una venta * * @param id_venta string Id de la venta a cancelar **/ public static function Cancelar($id_venta, $billetes = null, $id_caja = null) { Logger::log("======= Cancenlando venta " . $id_venta . " ==========="); //valida que la venta exista y que este activa $venta = VentaDAO::getByPK($id_venta); if ($venta == null) { Logger::error("La venta con id: " . $id_venta . " no existe"); throw new Exception("La venta con id: " . $id_venta . " no existe"); } if ($venta->getCancelada()) { Logger::warn("La venta ya ha sido cancelada"); return; } //Deja la venta como cancelada y la guarda. $venta->setCancelada(1); //Obtiene al usuario al que se le vendio $usuario = UsuarioDAO::getByPK($venta->getIdCompradorVenta()); if ($usuario == null) { Logger::error("FATAL!!! Esta venta apunta a un usuario que no existe"); throw new Exception("FATAL!!! Esta venta apunta a un usuario que no existe"); } DAO::transBegin(); // regresar de almacenes // obtener los productos que se vendieron // insertalos como neuvo ingreso $detalle = VentaProductoDAO::search(new VentaProducto(array("id_venta" => $id_venta))); for ($detalleIterator = 0; $detalleIterator < sizeof($detalle); $detalleIterator++) { //por cada producto // --- procesos --- // -insertar en productoempresa // -insertar en loteproducto // -insertar en entradalote // -si el tipo de precio de venta es costo, actualizar // -insertar compra producto $p = $detalle[$detalleIterator]; try { /* ProductoEmpresaDAO::save( new ProductoEmpresa( array( "id_empresa" => $id_empresa, "id_producto" => $p->getIdProducto() ) ) ); if(is_null($p->lote)){ throw new InvalidDataException("No selecciono a que lote ira el producto " . $p->id_producto); } if(strlen($p->lote) == 0){ throw new InvalidDataException("No selecciono a que lote ira el producto " . $p->id_producto); } */ //busquemos el id del lote $l = LoteDAO::getByPk(1); //busquemos la unidad que nos mandaron $uResults = UnidadMedidaDAO::search(new UnidadMedida(array("id_unidad_medida" => $p->getIdUnidad(), "activa" => 1))); if (sizeof($uResults) != 1) { throw new InvalidDataException("La unidad de medida `" . $p->id_unidad . "` no existe, o no esta activa."); } //busequemos si este producto ya existe en este lote $lp = LoteProductoDAO::getByPK($l->getIdLote(), $p->getIdProducto()); if (is_null($lp)) { //no existe, insertar $loteProducto = new LoteProducto(array("id_lote" => $l->getIdLote(), "id_producto" => $p->getIdProducto(), "cantidad" => $p->getCantidad(), "id_unidad" => $p->getIdUnidad())); LoteProductoDAO::save($loteProducto); } else { //ya existe, sumar //revisemos si es de la misma unidad if ($lp->getIdUnidad() == $p->getIdUnidad()) { //es igual, solo hay que sumar $lp->setCantidad($lp->getCantidad() + $p->getCantidad()); } else { //no es igual, hay que convertir try { $r = UnidadMedidaDAO::convertir($p->getIdUnidad(), $lp->getIdUnidad(), $p->getCantidad()); } catch (BusinessLogicException $ide) { //no se pudo convertir porque son de //diferentes categorias throw $ide; //mostrar una excpetion mas fresona } $lp->setCantidad($lp->getCantidad() + $r); } //$lp->setCantidad( $lp->getCantidad() + $p->cantidad ); LoteProductoDAO::save($lp); } $s = SesionController::getCurrentUser(); $loteEntrada = new LoteEntrada(array("id_lote" => $l->getIdLote(), "id_usuario" => $s->getIdUsuario(), "fecha_registro" => time(), "motivo" => "Venta (" . $id_venta . ") Cancelada")); LoteEntradaDAO::save($loteEntrada); LoteEntradaProductoDAO::save(new LoteEntradaProducto(array("id_lote_entrada" => $loteEntrada->getIdLoteEntrada(), "id_producto" => $p->getIdProducto(), "id_unidad" => $p->getIdUnidad(), "cantidad" => $p->getCantidad()))); /* $compraProducto = new CompraProducto(array( "id_compra" => $compra->getIdCompra(), "id_producto" => $p->id_producto, "cantidad" => $p->cantidad, "precio" => $p->precio, "descuento" => 0, "impuesto" => 0, "id_unidad" => $p->id_unidad, "retencion" => 0 ) ); CompraProductoDAO::save ( $compraProducto); */ } catch (InvalidDataException $e) { Logger::error($e); DAO::transRollback(); throw $e; } catch (exception $e) { Logger::error($e); DAO::transRollback(); throw new InvalidDatabaseOperationException($e); } } try { VentaDAO::save($venta); //Si la venta fue a credito, se cancelan todos los abonos hechos al mismo y el dinero se queda a cuenta del usuario. if ($venta->getTipoDeVenta() == "credito") { $abono_venta = new AbonoVenta(); $abono_venta->setIdVenta($id_venta); $abonos = AbonoVentaDAO::search($abono_venta); foreach ($abonos as $abono) { if (!$abono->getCancelado()) { CargosYAbonosController::EliminarAbono($abono->getIdAbonoVenta(), "Venta cancelada", 0, 1, 0, null, null); } } $usuario->setSaldoDelEjercicio($usuario->getSaldoDelEjercicio() + $venta->getTotal()); UsuarioDAO::save($usuario); } else { if ($venta->getTipoDeVenta() == "contado" && !is_null($id_caja)) { CajasController::modificarCaja($id_caja, 1, $billetes, $venta->getTotal()); } } } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo cancelar la venta: " . $e); throw new Exception("No se pudo cancelar la venta"); } DAO::transEnd(); Logger::log("Venta cancelada exitosamente"); }
protected function GenerateResponse() { try { $this->response = CargosYAbonosController::EliminarAbono(isset($_POST['id_abono']) ? $_POST['id_abono'] : null, isset($_POST['billetes']) ? json_decode($_POST['billetes']) : null, isset($_POST['compra']) ? $_POST['compra'] : null, isset($_POST['id_caja']) ? $_POST['id_caja'] : null, isset($_POST['motivo_cancelacion']) ? $_POST['motivo_cancelacion'] : null, isset($_POST['prestamo']) ? $_POST['prestamo'] : null, isset($_POST['venta']) ? $_POST['venta'] : null); } catch (Exception $e) { //Logger::error($e); throw new ApiException($this->error_dispatcher->invalidDatabaseOperation($e->getMessage())); } }
/** * *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"); }