/**
   * Generamos items de aplicación en cuenta corriente a partir de un movimiento ya generado o
   * persistido.
   *
   * @param m Movimiento de proveedor a generar
   */
  public void generarItemsCuentaCorrienteReversionMovimiento(MovimientoProveedor m) {

    List<AplicacionCuentaCorrienteProveedor> itemsCuentaCorriente =
        m.getMovimientoReversion().getItemCuentaCorriente();

    m.getItemCuentaCorriente().clear();

    for (AplicacionCuentaCorrienteProveedor iacc : itemsCuentaCorriente) {

      BigDecimal importe = iacc.getImporte().add(iacc.getImporteRetencion()).negate();

      AplicacionCuentaCorrienteProveedor icc = new AplicacionCuentaCorrienteProveedor();
      icc.setMovimiento(m);
      icc.setMovimientoAplicacion(iacc.getMovimientoAplicacion());
      icc.setCuota(iacc.getCuota());
      icc.setProveedor(m.getProveedor());
      icc.setNroSubcuenta(m.getProveedorCuentaCorriente().getNrocta());
      icc.setCodigoImputacion("CC");
      icc.setMonedaSecundaria(m.getMonedaSecundaria());
      icc.setCotizacion(m.getCotizacion());

      icc.setImporte(importe);
      icc.setImporteSecundario(importe.divide(m.getCotizacion(), RoundingMode.UP));

      icc.setFechaAplicacion(new Date());
      icc.setFechaVencimiento(iacc.getFechaVencimiento());

      m.getItemCuentaCorriente().add(icc);
    }
  }
  public void generarItemCuentaCorriente(MovimientoProveedor m) throws ExcepcionGeneralSistema {

    if (m.getCondicionDePago() == null) {
      throw new ExcepcionGeneralSistema("La condición de pago no puede estar vacía");
    }

    if (m.getItemTotal() == null || m.getItemTotal().isEmpty()) {
      throw new ExcepcionGeneralSistema(
          "Item total no fue generado, nada para agregar a la cuenta corriente");
    }

    m.getItemCuentaCorriente().clear();

    BigDecimal importeTotal = m.getItemTotal().get(0).getImporte();
    //
    //        System.err.println("importeTotal para cuenta corriente"+importeTotal);

    for (ItemCondicionPagoProveedor icp : m.getCondicionDePago().getCuotas()) {

      BigDecimal impoteCuota =
          importeTotal.multiply(icp.getPorcentaje()).divide(new BigDecimal(100), RoundingMode.UP);
      Calendar fechaVencimiento = Calendar.getInstance();
      fechaVencimiento.add(Calendar.DAY_OF_YEAR, icp.getDiasDePago());

      AplicacionCuentaCorrienteProveedor icc = new AplicacionCuentaCorrienteProveedor();
      icc.setMovimiento(m);
      icc.setMovimientoAplicacion(m);
      icc.setCuota(icp.getCuotas());
      icc.setProveedor(m.getProveedor());
      icc.setNroSubcuenta(m.getProveedorCuentaCorriente().getNrocta());
      icc.setCodigoImputacion("CC");
      icc.setMonedaSecundaria(m.getMonedaSecundaria());
      icc.setCotizacion(m.getCotizacion());

      if (m.getComprobante().getSignoAplicacionCuentaCorriente().equals("+")) {

        icc.setImporte(impoteCuota);
        icc.setImporteSecundario(impoteCuota.divide(m.getCotizacion(), RoundingMode.UP));

      } else {

        icc.setImporte(importeTotal.negate());
        icc.setImporteSecundario((impoteCuota.divide(m.getCotizacion(), RoundingMode.UP)).negate());
      }

      icc.setFechaAplicacion(new Date());
      icc.setFechaVencimiento(fechaVencimiento.getTime());

      m.getItemCuentaCorriente().add(icc);
    }
  }
  /**
   * Se utiliza para generar cuenta corriente cuando el comprobante qeu se ingresa no aplica ningún
   * movimiento.
   *
   * @param m Movimiento de proveedor
   * @throws ExcepcionGeneralSistema
   */
  @Deprecated
  public void generarItemCuentaCorrienteAnticipo(MovimientoProveedor m)
      throws ExcepcionGeneralSistema {

    if (m.getItemTotal() == null || m.getItemTotal().isEmpty()) {
      throw new ExcepcionGeneralSistema(
          "Item total no fue generado, nada para agregar a la cuenta corriente");
    }
    m.getItemCuentaCorriente().clear();

    BigDecimal importeTotal = m.getItemTotal().get(0).getImporte();
    AplicacionCuentaCorrienteProveedor icc = new AplicacionCuentaCorrienteProveedor();
    icc.setMovimiento(m);
    icc.setMovimientoAplicacion(m);
    icc.setCuota(1);
    icc.setProveedor(m.getProveedor());
    icc.setNroSubcuenta(m.getProveedorCuentaCorriente().getNrocta());
    icc.setCodigoImputacion("CC");
    icc.setMonedaSecundaria(m.getMonedaSecundaria());
    icc.setCotizacion(m.getCotizacion());

    if (m.getComprobante().getSignoAplicacionCuentaCorriente().equals("+")) {

      icc.setImporte(importeTotal);
      icc.setImporteSecundario(importeTotal.divide(m.getCotizacion(), RoundingMode.UP));

    } else {

      icc.setImporte(importeTotal.negate());
      icc.setImporteSecundario((importeTotal.divide(m.getCotizacion(), RoundingMode.UP)).negate());
    }

    icc.setFechaAplicacion(new Date());
    icc.setFechaVencimiento(m.getFechaVencimiento());

    m.getItemCuentaCorriente().add(icc);
  }
  /**
   * Generamos los items de aplicación a la cuenta corriente
   *
   * @param m
   * @param creditosPendientes
   * @param debitosPendientes
   */
  public void generarItemAplicacionCuentaCorriente(
      MovimientoProveedor m,
      List<ItemPendienteCuentaCorrienteProveedor> creditosPendientes,
      List<ItemPendienteCuentaCorrienteProveedor> debitosPendientes) {

    if (creditosPendientes != null) {
      for (ItemPendienteCuentaCorrienteProveedor ic : creditosPendientes) {

        if (ic.isSeleccionado()) {

          MovimientoProveedor mAplicado;
          BigDecimal importeAplicado;

          /**
           * ******************************************************************************************
           * Si es una orden de pago con retenciones se hace lo siguiente: - Si es anticipo, sumamos
           * las retenciones al importe total a pargar - Si no es anticipo restamos el importe a
           * aplicar para luego aplicarlo con al retención
           * *******************************************************************************************
           */
          if (m.isEsAnticipo()) {
            mAplicado = m;
            importeAplicado = ic.getImporteAplicar();
          } else {
            mAplicado = movimientoProveedorRN.getMovimiento(ic.getId());
            importeAplicado = ic.getImporteAplicar().add(ic.getImporteRetencion().negate());
          }

          BigDecimal importeRetencion = ic.getImporteRetencion();

          AplicacionCuentaCorrienteProveedor icc = new AplicacionCuentaCorrienteProveedor();

          icc.setMovimiento(m);
          icc.setMovimientoAplicacion(mAplicado);
          icc.setCuota(1);
          icc.setProveedor(m.getProveedor());
          icc.setNroSubcuenta(m.getProveedorCuentaCorriente().getNrocta());
          icc.setCodigoImputacion("CC");
          icc.setMonedaSecundaria(m.getMonedaSecundaria());
          icc.setCotizacion(m.getCotizacion());

          icc.setImporte(importeAplicado);
          icc.setImporteSecundario(importeAplicado.divide(m.getCotizacion(), RoundingMode.UP));
          icc.setImporteRetencion(importeRetencion);

          icc.setFechaAplicacion(new Date());
          icc.setFechaVencimiento(ic.getFechaVencimiento());

          m.getItemCuentaCorriente().add(icc);

          /** Esto es provisorio, para metalurgica avellaneda */
          if (m.getRetenciones() == null || m.getRetenciones().isEmpty()) {
            continue;
          }

          // Si existen retenciones, generamos los items cuenta corriente
          for (MovimientoProveedor r : m.getRetenciones()) {

            importeAplicado = ic.getImporteRetencion();
            icc = new AplicacionCuentaCorrienteProveedor();

            // Si es anticipo viene id de movimiento nulo, aplicamos el mismo comprobante
            if (ic.getId() == null) {
              mAplicado = r;
            }

            icc.setMovimiento(r);
            icc.setMovimientoAplicacion(mAplicado);
            icc.setCuota(1);
            icc.setProveedor(r.getProveedor());
            icc.setNroSubcuenta(r.getProveedorCuentaCorriente().getNrocta());
            icc.setCodigoImputacion("CC");
            icc.setMonedaSecundaria(r.getMonedaSecundaria());
            icc.setCotizacion(r.getCotizacion());

            icc.setImporte(importeAplicado);
            icc.setImporteSecundario(importeAplicado.divide(m.getCotizacion(), RoundingMode.UP));

            icc.setFechaAplicacion(new Date());
            icc.setFechaVencimiento(ic.getFechaVencimiento());

            r.getItemCuentaCorriente().add(icc);
          }
        }
      }
    }

    if (debitosPendientes != null) {
      for (ItemPendienteCuentaCorrienteProveedor id : debitosPendientes) {
        if (id.isSeleccionado()) {
          /*
          Buscamos el movimiento que vamos a aplicar en cta cte.
          Si el id del pendiente es null, el comprobante aplica a si mismo
          */
          MovimientoProveedor mAplicado;

          if (id.getId() != null) {
            mAplicado = movimientoProveedorRN.getMovimiento(id.getId());
          } else {
            mAplicado = m;
          }

          BigDecimal importe = id.getImporteAplicar().negate();

          AplicacionCuentaCorrienteProveedor icc = new AplicacionCuentaCorrienteProveedor();
          icc.setMovimiento(m);
          icc.setMovimientoAplicacion(mAplicado);
          icc.setCuota(id.getCuotas());
          icc.setProveedor(m.getProveedor());
          icc.setNroSubcuenta(m.getProveedorCuentaCorriente().getNrocta());
          icc.setCodigoImputacion("CC");
          icc.setMonedaSecundaria(m.getMonedaSecundaria());
          icc.setCotizacion(m.getCotizacion());

          icc.setImporte(importe);
          icc.setImporteSecundario(importe.divide(m.getCotizacion(), RoundingMode.UP));

          icc.setFechaAplicacion(new Date());
          icc.setFechaVencimiento(id.getFechaVencimiento());

          m.getItemCuentaCorriente().add(icc);
        }
      }
    }
  }