/**
   * Procede con el proceso de pago con otros una vez que se localizaron los pagos con disponible
   *
   * @param c
   * @param pagos
   * @param ventas
   */
  private void procedePagoConOtros(
      final Cliente c, final List<PagoM> pagos, final List<Venta> ventas) {
    CXCFiltros.filtrarVentasConSaldo(ventas);
    final PagoM origen = Selectores.seleccionarPagoM(c, pagos);
    if (origen != null) {

      final PagoConOtros pago = getPagosFactory().crearPago(origen, ventas);
      if (pago != null) {
        pago.setOrigen(origen);
        pago.setCliente(origen.getCliente());
        final PagoConOtrosModelImpl model = new PagoConOtrosModelImpl(true, pago);
        final PagoConOtrosForm form = new PagoConOtrosForm(model);
        form.open();
        if (!form.hasBeenCanceled()) {
          getPagosManager().salvarGrupoDePagos(pago);
          final List<Venta> ventasResultantes = PagosUtils.extraerVentas(pago);
          for (Venta vv : ventasResultantes) {
            getVentasManager().refresh(vv);
          }
          completar(pago);
        }
      } else {
        MessageUtils.showMessage("La selección de ventas no califica para el pago", "Pagos");
      }
    }
  }
 /**
  * Completa el proceso de pago genrando descuentos y realizando pagos automaticos cuando estos
  * apliquen
  *
  * @param ventas
  */
 public List<Venta> completar(final PagoM pago) {
   final List<Venta> ventasResultantes = PagosUtils.extraerVentas(pago);
   if (!ventasResultantes.isEmpty() && procedeDescuento(pago)) {
     List<NotaDeCredito> descuentos =
         aplicarNotaDeDescuento(pago.getCliente(), ventasResultantes, pago.getFecha());
     /**
      * if(!descuentos.isEmpty()){ List<NotaDeCredito>
      * resNotas=Browsers.seleccionarNotasParaSuImpresion(descuentos); for(NotaDeCredito
      * nota:resNotas){ getNotasManager().imprimirNotaDeDescuento(nota); } }
      */
   }
   if (!ventasResultantes.isEmpty() && (!pago.getTipoDeDocumento().equals("X"))) {
     registrarPagoAutomatico(ventasResultantes);
   }
   return ventasResultantes;
 }
  /**
   * Genera un pago con {@link NotaDeCredito} a un grupo de ventas
   *
   * @param c
   * @param ventas
   */
  public List<Venta> registrarPagoConNota(final Cliente c, final List<Venta> ventas) {

    // Filtramos las ventas con saldo
    CXCFiltros.filtrarVentasConSaldo(ventas);
    final List<Venta> afectadas = new ArrayList<Venta>();

    if (ventas.isEmpty()) {
      MessageUtils.showMessage("El grupo de ventas selccionadas no tiene saldo", "Pago con nota");
      return ventas;
    }

    // Obtener una lista de las posibles notas de credito para el pago para que el usuario
    // seleccione una
    final EventList<NotaDeCredito> notas =
        GlazedLists.eventList(getNotasManager().buscarNotasDeCreditoDisponibles(c));

    if (notas.isEmpty()) {
      MessageUtils.showMessage(
          MessageFormat.format(
              "El cliente {0} ({1})\n No tiene notas disponibles para usar como forma de pago",
              c.getNombre(), c.getClave()),
          "Notas disponibles");
      return afectadas;
    }
    final NotaDeCredito origen = Selectores.seleccionarNotaDeCredito(c, notas);
    // Procedemos con el pago
    if (origen != null) {
      final PagoConNota pago = getPagosFactory().crearPagoConNota(origen, ventas);
      final PagoFormModel model = new DefaultPagoFormModelImpl(pago);
      final PagoConNotaForm form = new PagoConNotaForm(model);
      form.open();
      if (!form.hasBeenCanceled()) {
        try {
          getPagosManager().salvarGrupoDePagos(pago);
          final List<Venta> ventasResultantes = PagosUtils.extraerVentas(pago);
          for (Venta vv : ventasResultantes) {
            getVentasManager().refresh(vv);
          }
          afectadas.addAll(ventasResultantes);
          completar(pago);
        } catch (Exception e) {
          MessageUtils.showError("Error al salvar pago", e);
        }
      }
    }
    return afectadas;
  }