/**
   * Crea las lineas de los totales de la factura. En el vector de lineas se agregan las lineas
   * generadas.
   *
   * @param ventaActual Venta a partir de la cual se generaran los totales.
   * @param lineas Vector de las lineas actuales de la factura.
   */
  private static void crearTotalesFiscal(Apartado apartado, double totalAbonosActivos) {
    if (logger.isDebugEnabled()) {
      logger.debug("crearTotalesFiscal(Apartado, double) - start");
    }

    DecimalFormat precio = new DecimalFormat("#,##0.00");
    double cargoServicio = 0;

    if (apartado.getEstadoServicio() == Sesion.APARTADO_ANULADO_CON_CARGO)
      cargoServicio = apartado.calcularMtoCargoPorServicio();

    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha(
            justificar("SUB MONTO          : ", precio.format(apartado.getMontoBase()), 35),
            columnasImpresoraFiscal),
        0);
    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha(
            justificar("IMPUESTO           : ", precio.format(apartado.getMontoImpuesto()), 35),
            columnasImpresoraFiscal),
        0);
    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha("--------------------", columnasImpresoraFiscal), 0);
    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha(
            justificar("MONTO APARTADO     : ", precio.format(apartado.consultarMontoServ()), 35),
            columnasImpresoraFiscal),
        0);
    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        crearLineaDeDivision(columnasImpresoraFiscal), 0);
    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha(
            justificar("ABONOS REALIZADOS  : ", precio.format(totalAbonosActivos), 35),
            columnasImpresoraFiscal),
        0);

    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha(
            justificar("CARGO POR SERVICIO : ", "(-)" + precio.format(cargoServicio), 35),
            columnasImpresoraFiscal),
        0);

    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha("--------------------", columnasImpresoraFiscal), 0);
    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        alinearDerecha(
            justificar(
                "MONTO ANULACIÓN    : ", precio.format(totalAbonosActivos - cargoServicio), 35),
            columnasImpresoraFiscal),
        0);
    Sesion.crFiscalPrinterOperations.enviarLineaNoFiscal(
        crearLineaDeDivision(columnasImpresoraFiscal), 0);

    if (logger.isDebugEnabled()) {
      logger.debug("crearTotalesFiscal(Apartado, double) - end");
    }
  }
  /**
   * Método imprimirComprobante Realiza la impresion de la factura de Venta indicada como parametro.
   *
   * @param apartado
   * @param totalAbonosActivos
   */
  public static void imprimirComprobante(Apartado apartado, double totalAbonosActivos) {
    if (logger.isDebugEnabled()) {
      logger.debug("imprimirComprobante(Apartado, double) - start");
    }

    DecimalFormat df = new DecimalFormat("#,##0.00");
    // ********
    // Se verifica si la gaveta se abre por impresora o por el visor. Si es por impresora debemos
    // abrir
    // primero la gaveta antes de enviar a imprimir porque si no, se queda la gaveta cerrada hasta
    // que termina la impresion.

    if (Sesion.aperturaGavetaPorImpresora) {
      try {
        CR.me.abrirGaveta(false);
      } catch (Exception e) {
        logger.error("imprimirFactura(Venta)", e);
      }
    }
    // ********
    if (Sesion.impresoraFiscal) {
      // Sesion.crFiscalPrinterOperations.activarSlip();
      try {
        // Sesion.crFiscalPrinterOperations.commit();
        // MensajesVentanas.aviso("Impresión de Comprobante de Anulación de Apartado\nIntroduzca el
        // documento en la impresora");

        // Cadenas de secciones de la factura
        Sesion.crFiscalPrinterOperations.abrirDocumentoNoFiscal();
        UtilesReportes.crearEncabezadoNoFiscal();
        crearEncabezadoFiscal(apartado);
        crearDetallesFiscal(apartado);
        crearTotalesFiscal(apartado, totalAbonosActivos);
        crearPieDePaginaFiscal();
        Sesion.crFiscalPrinterOperations.cerrarDocumentoNoFiscal();
        Sesion.crFiscalPrinterOperations.cortarPapel();
        Sesion.crFiscalPrinterOperations.commit();
      } catch (PrinterNotConnectedException e) {
        logger.error("imprimirComprobante(Apartado, double)", e);
      }
    } else {
      // Esta Implementaccion no maneja Impresora NoFiscal
    }
    if (apartado.getEstadoServicio() == Sesion.APARTADO_ANULADO_EXONERADO) {
      // ****Se muestra el vuelto por visor y por pantalla
      // Se muestra el monto del vuelto al cliente por el visor
      double saldo;
      if (totalAbonosActivos * 100 < 1) saldo = 0;
      else saldo = totalAbonosActivos;
      try {
        CR.crVisor.enviarString("SALDO CLIENTE", 0, df.format(saldo), 2);
      } catch (Exception e) {
        logger.error("imprimirComprobante(Apartado, double)", e);
      }

      // Se muestra el mensaje del vuelto al cajero
      PantallaVuelto pantallaVuelto = new PantallaVuelto(saldo, true);
      MensajesVentanas.centrarVentanaDialogo(pantallaVuelto);
      // ***
    } else if (apartado.getEstadoServicio() == Sesion.APARTADO_ANULADO_CON_CARGO) {
      // ****Se muestra el vuelto por visor y por pantalla
      // Se muestra el monto del vuelto al cliente por el visor
      double saldo;
      if ((totalAbonosActivos - apartado.calcularMtoCargoPorServicio()) * 100 < 1) saldo = 0;
      else saldo = totalAbonosActivos - apartado.calcularMtoCargoPorServicio();
      try {
        CR.crVisor.enviarString("SALDO CLIENTE", 0, df.format(saldo), 2);
      } catch (Exception e) {
        logger.error("imprimirComprobante(Apartado, double)", e);
      }

      // Se muestra el mensaje del vuelto al cajero
      PantallaVuelto pantallaVuelto = new PantallaVuelto(saldo, true);
      MensajesVentanas.centrarVentanaDialogo(pantallaVuelto);
      // ***
    }

    if (logger.isDebugEnabled()) {
      logger.debug("imprimirComprobante(Apartado, double) - end");
    }
  }