com.web.chon.bean.BeanBuscaCredito.java Source code

Java tutorial

Introduction

Here is the source code for com.web.chon.bean.BeanBuscaCredito.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.web.chon.bean;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;

import com.web.chon.dominio.AbonoCredito;
import com.web.chon.dominio.Caja;
import com.web.chon.dominio.Cliente;
import com.web.chon.dominio.Credito;
import com.web.chon.dominio.CuentaBancaria;
import com.web.chon.dominio.Documento;
import com.web.chon.dominio.OperacionesCaja;
import com.web.chon.dominio.OperacionesCuentas;
import com.web.chon.dominio.PagosBancarios;
import com.web.chon.dominio.SaldosDeudas;
import com.web.chon.dominio.TipoAbono;
import com.web.chon.dominio.UsuarioDominio;
import com.web.chon.security.service.PlataformaSecurityContext;
import com.web.chon.service.IfaceAbonoCredito;
import com.web.chon.service.IfaceCaja;
import com.web.chon.service.IfaceCatCliente;
import com.web.chon.service.IfaceCredito;
import com.web.chon.service.IfaceCuentasBancarias;
import com.web.chon.service.IfaceDocumentos;
import com.web.chon.service.IfaceOperacionesCaja;
import com.web.chon.service.IfaceOperacionesCuentas;
import com.web.chon.service.IfacePagosBancarios;
import com.web.chon.service.IfaceTipoAbono;
import com.web.chon.util.Constantes;
import com.web.chon.util.JasperReportUtil;
import com.web.chon.util.JsfUtil;
import com.web.chon.util.NumeroALetra;
import com.web.chon.util.TiempoUtil;
import com.web.chon.util.UtilUpload;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;
import org.primefaces.model.StreamedContent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 *
 * @author JesusAlfredo
 */
@Component
@Scope("view")
public class BeanBuscaCredito implements Serializable {

    private static final long serialVersionUID = 1L;
    @Autowired
    private IfaceCatCliente ifaceCatCliente;
    @Autowired
    private IfaceCredito ifaceCredito;
    @Autowired
    private IfaceTipoAbono ifaceTipoAbono;
    @Autowired
    private IfaceAbonoCredito ifaceAbonoCredito;
    @Autowired
    private IfaceDocumentos ifaceDocumentos;
    @Autowired
    private PlataformaSecurityContext context;
    @Autowired
    IfaceCaja ifaceCaja;
    @Autowired
    private IfaceOperacionesCaja ifaceOperacionesCaja;
    @Autowired
    private IfaceOperacionesCuentas ifaceOperacionesCuentas;
    @Autowired
    private IfaceCuentasBancarias ifaceCuentasBancarias;

    @Autowired
    private IfacePagosBancarios ifacePagosBancarios;

    private BigDecimal idCliente;
    private String nombreCompletoCliente;
    private String rfcCliente;
    private BigDecimal creditoAutorizado;
    private BigDecimal creditoUtilizado;
    private BigDecimal creditoDisponible;
    private String tipoCliente;
    private String title;
    private String viewEstate;
    private BigDecimal totalCreditos;
    private BigDecimal totalAbonado;

    private ArrayList<SaldosDeudas> modelo;
    private ArrayList<TipoAbono> lstTipoAbonos;
    private ArrayList<Cliente> lstCliente;
    private ArrayList<AbonoCredito> chequesPendientes;
    private ArrayList<AbonoCredito> selectedchequesPendientes;
    private ArrayList<CuentaBancaria> listaCuentas;
    private SaldosDeudas saldosDeudasEdit;

    private SaldosDeudas dataAbonar;
    private AbonoCredito abono;
    private Cliente cliente;
    private String viewCheque;
    private Caja caja;

    private UsuarioDominio usuarioDominio;
    private boolean bandera;
    private Date fechaMasProximaPago;
    private BigDecimal minimoPago;
    private BigDecimal saldoParaLiquidar;

    //------------variables para generar el ticket----------//
    private StreamedContent media;
    private ByteArrayOutputStream outputStream;
    private Map paramReport = new HashMap();
    private String number;
    private String rutaPDF;
    private String pathFileJasper = "C:/Users/Juan/Documents/NetBeansProjects/Chonajos-V2/ticket.jasper";

    //------------variables para generar el ticket----------//
    //---Constantes---//
    private static final BigDecimal CREDITOFINALIZADO = new BigDecimal(2);
    private static final BigDecimal CREDITOACTIVO = new BigDecimal(1);
    private static final BigDecimal ABONOREALIZADO = new BigDecimal(1);
    private static final BigDecimal ABONOPENDIENTE = new BigDecimal(2);
    private static final BigDecimal DOCUMENTOACTIVO = new BigDecimal(1);
    private static final BigDecimal DOCUMENTOTIPOCHEQUE = new BigDecimal(1);
    private static final BigDecimal CERO = new BigDecimal(0).setScale(2, RoundingMode.CEILING);

    //----Constantes--//
    private static final BigDecimal TIPO = new BigDecimal(1);

    //--Datos para Operaciones Caja---//
    private OperacionesCaja opcaja;
    private static final BigDecimal entradaSalida = new BigDecimal(1);
    private static final BigDecimal statusOperacionRealizada = new BigDecimal(1);
    private static final BigDecimal statusOperacionPendiente = new BigDecimal(2);
    private static final BigDecimal statusOperacionRechazada = new BigDecimal(3);

    private static final BigDecimal concepto = new BigDecimal(7);
    private static final BigDecimal conceptoMontoCheques = new BigDecimal(12);

    private static final BigDecimal conceptoAbonoEfectivo = new BigDecimal(7);
    private static final BigDecimal conceptoAbonoTransferencia = new BigDecimal(12);
    private static final BigDecimal conceptoAbonoCheque = new BigDecimal(30);
    private static final BigDecimal conceptoAbonoDeposito = new BigDecimal(31);

    //--Variables para datos Bancarios---//
    private static final BigDecimal entradaCuenta = new BigDecimal(1);
    private static final BigDecimal idStatusCuenta = new BigDecimal(1);
    private static final BigDecimal idConceptoCuenta = new BigDecimal(15);
    private OperacionesCuentas opcuenta;
    private BigDecimal idCuentaDestinoBean;
    private BigDecimal comboFiltro;
    private boolean habilitaBotones;
    private boolean botonCancelar;
    private boolean botonActualizar;

    private PagosBancarios pagoBancario;

    @PostConstruct
    public void init() {
        pagoBancario = new PagosBancarios();
        botonCancelar = true;
        botonActualizar = true;
        caja = new Caja();
        idCuentaDestinoBean = new BigDecimal(0);
        minimoPago = new BigDecimal(0);
        bandera = false;
        fechaMasProximaPago = new Date();
        abono = new AbonoCredito();
        abono.setIdtipoAbonoFk(new BigDecimal(1));

        usuarioDominio = context.getUsuarioAutenticado();
        dataAbonar = new SaldosDeudas();
        modelo = new ArrayList<SaldosDeudas>();
        chequesPendientes = new ArrayList<AbonoCredito>();
        selectedchequesPendientes = new ArrayList<AbonoCredito>();
        lstTipoAbonos = ifaceTipoAbono.getAll();
        saldoParaLiquidar = new BigDecimal(0);
        setTitle("Abono de Crditos");
        setViewEstate("init");
        setViewCheque("init");
        caja = ifaceCaja.getCajaByIdUsuarioPk(usuarioDominio.getIdUsuario());
        opcaja = new OperacionesCaja();
        opcaja.setIdCajaFk(caja.getIdCajaPk());
        opcaja.setIdUserFk(usuarioDominio.getIdUsuario());
        opcaja.setEntradaSalida(entradaSalida);

        opcaja.setIdSucursalFk(new BigDecimal(usuarioDominio.getSucId()));
        //-- Datos para Transferencias Bancarias o Dpositos Bancarios--//
        listaCuentas = ifaceCuentasBancarias.getCuentas();
        opcuenta = new OperacionesCuentas();
        opcuenta.setIdUserFk(usuarioDominio.getIdUsuario());
        opcuenta.setIdStatusFk(idStatusCuenta);
        opcuenta.setEntradaSalida(entradaCuenta);
        opcuenta.setIdConceptoFk(idConceptoCuenta);
        comboFiltro = new BigDecimal(1);
        habilitaBotones = true;
        idCuentaDestinoBean = new BigDecimal(1);
    }

    public void cancelarAbonar() {
        abono.reset();
        for (int i = 0; i < modelo.size(); i++) {
            SaldosDeudas item = modelo.get(i);
            item.setAbonarTemporal(null);
        }
        botonCancelar = true;
        botonActualizar = true;
        habilitaBotones = false;
        abono.setIdtipoAbonoFk(new BigDecimal(1));
        addView();
        JsfUtil.addSuccessMessageClean("Se ha cancelado el abono");

    }

    public void actualizarCreditos() {
        BigDecimal totalAabonar = new BigDecimal(0);
        boolean bandera = false;
        for (SaldosDeudas fila : modelo) {
            if (fila.getAbonarTemporal() != null) {
                totalAabonar = totalAabonar.add(fila.getAbonarTemporal(), MathContext.UNLIMITED);
                if (fila.getSaldoLiquidar().setScale(2, RoundingMode.CEILING)
                        .compareTo(fila.getAbonarTemporal().setScale(2, RoundingMode.CEILING)) == -1) {

                    System.out.println("Fila: " + fila.getSaldoLiquidar().setScale(2, RoundingMode.CEILING));
                    System.out.println("Temporal: " + fila.getAbonarTemporal().setScale(2, RoundingMode.CEILING));
                    bandera = true;
                }
            }
        }
        //        System.out.println("Abono: " + abono.getMontoAbono());
        //        System.out.println("TotalLista: " + totalAabonar);
        if (abono.getMontoAbono().setScale(2, RoundingMode.CEILING)
                .equals(totalAabonar.setScale(2, RoundingMode.CEILING))) {
            if (!bandera) {
                System.out.println("La suma es exacta");
                abonarCreditos();
                botonCancelar = true;
                botonActualizar = true;
                habilitaBotones = false;
            } else {
                JsfUtil.addErrorMessageClean("No puedes abonar un credito con mas dinero del que liquida");
            }
        } else {
            System.out.println("error de suma");
            JsfUtil.addErrorMessageClean("La suma de los abonos no corresponde con el monto del abono total = $"
                    + abono.getMontoAbono());
        }
        //Vertificar el monto total del abono que no sobre y que no falte ni un peso
        // verificar el combo hacia que forma se haran los abonos.

    }

    public void onRowEdit(RowEditEvent event) {
        saldosDeudasEdit = new SaldosDeudas();
        saldosDeudasEdit = (SaldosDeudas) event.getObject();

        System.out.println("editado " + saldosDeudasEdit.toString());
        //updatePrecio();

    }

    public void onRowCancel(RowEditEvent event) {
        System.out.println("cancel");

    }

    private void setParameterTicket(AbonoCredito ac, Cliente c) {
        NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.getDefault());
        DecimalFormat df = new DecimalFormat("###.##");
        Date date = new Date();
        NumeroALetra numeroLetra = new NumeroALetra();
        String totalVentaStr = numeroLetra.Convertir(df.format(ac.getMontoAbono()), true);
        paramReport.put("labelSucursal", usuarioDominio.getNombreSucursal());
        paramReport.put("labelEstatus", "Abono Pagado");
        paramReport.put("fecha", TiempoUtil.getFechaDDMMYYYYHHMM(date));
        paramReport.put("numeroCliente", c.getId_cliente().toString());
        paramReport.put("nombreCliente", c.getNombreCompleto());
        paramReport.put("recibimos", nf.format(ac.getMontoAbono()));
        paramReport.put("totalLetra", totalVentaStr);
        paramReport.put("fechaProximoPago", TiempoUtil.getFechaDDMMYYYYHHMM(date));
        paramReport.put("montoliquidar",
                nf.format(saldoParaLiquidar.subtract(ac.getMontoAbono(), MathContext.UNLIMITED)));
        paramReport.put("montoMinimo", nf.format(ac.getMontoAbono()));
        paramReport.put("nombreAtendedor", usuarioDominio.getNombreCompleto());
        /* Parametros para ticket de Cheque*/
        switch (ac.getIdtipoAbonoFk().intValue()) {
        case 1:
            paramReport.put("folio", ac.getIdAbonoCreditoPk().toString());
            System.out.println("Efectivo sin Datos extra");
            break;
        case 2:
            System.out.println("Entro a Ticket Transferencia");
            paramReport.put("folio", ac.getIdAbonoCreditoPk().toString());
            paramReport.put("nreferencia", ac.getReferencia());
            paramReport.put("concepto", ac.getConcepto());
            paramReport.put("fechaTrans", TiempoUtil.getFechaDDMMYYYYHHMM(ac.getFechaTransferencia()));
            break;
        case 3:
            System.out.println("Entro a Cheque");
            paramReport.put("folio", ac.getIdAbonoCreditoPk().toString());
            paramReport.put("numeroCheque", ac.getNumeroCheque().toString());
            paramReport.put("banco", ac.getBanco());
            paramReport.put("fechaCobro", TiempoUtil.getFechaDDMMYYYYHHMM(ac.getFechaCobro()));
            break;
        case 4:
            //paramReport.put("folio", ac.getIdAbonoCreditoPk().toString());
            System.out.println("Entro a Ticket Deposito Bancario");
            paramReport.put("folioElectronico",
                    ac.getFolioElectronico() == null ? "-----" : ac.getFolioElectronico().toString());
            paramReport.put("cuenta", idCuentaDestinoBean.toString());
            paramReport.put("fecha", TiempoUtil.getFechaDDMMYYYYHHMM(ac.getFechaCobro()));
            break;
        //            case 5:
        //                paramReport.put("labelEstatus", "PAGO A CUENTA");
        //                paramReport.put("folio", ac.getIdCreditoFk().toString());
        //                paramReport.put("montoliquidar", nf.format(saldoParaLiquidar));

        default:
            JsfUtil.addErrorMessageClean("Ocurrio un error contactar al administrador");
            break;
        }

        /* Parametros para ticket de Cheque*/
        /* Parametros para ticket de Transferencia*/

        /* Parametros para ticket de Transferencia*/
        paramReport.put("telefonos", "Para cualquier duda o comentario estamos a sus rdenes al telfono:"
                + usuarioDominio.getTelefonoSucursal());

    }

    public void generateReport(int folio, String nombreTipoTicket) {
        JRExporter exporter = null;

        try {
            ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext()
                    .getContext();
            String temporal = "";
            if (servletContext.getRealPath("") == null) {
                temporal = Constantes.PATHSERVER;
            } else {
                temporal = servletContext.getRealPath("");
            }
            System.out.println("reporte de credito contado");
            pathFileJasper = temporal + File.separatorChar + "resources" + File.separatorChar + "report"
                    + File.separatorChar + "ticketAbonos" + File.separatorChar + nombreTipoTicket;

            JasperPrint jp = JasperFillManager.fillReport(getPathFileJasper(), paramReport,
                    new JREmptyDataSource());
            outputStream = JasperReportUtil.getOutputStreamFromReport(paramReport, getPathFileJasper());
            exporter = new JRPdfExporter();

            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
            //            exporter.setParameter(JRPdfExporterParameter.PDF_JAVASCRIPT, "this.print();");
            byte[] bytes = outputStream.toByteArray();

            rutaPDF = UtilUpload.saveFileTemp(bytes, "ticketPdf", folio, usuarioDominio.getSucId());
            System.out.println("Ruutttaaa: " + rutaPDF);
        } catch (Exception exception) {
            System.out.println("Error >" + exception.getMessage());
            JsfUtil.addErrorMessage("Error al Generar el Ticket de Venta.");
        }

    }

    public void buscaCheques() {

        chequesPendientes = ifaceAbonoCredito.getByIdCredito(dataAbonar.getFolioCredito());

        setTitle("Cheques por cobrar");
        setViewEstate("cheques");
    }

    public void activaBandera() {
        bandera = true;
    }

    public void addView() {

        if (abono.getIdtipoAbonoFk().intValue() == 3) {
            setViewCheque("true");
        } else if (abono.getIdtipoAbonoFk().intValue() == 2) {
            setViewCheque("trans");
        } else if (abono.getIdtipoAbonoFk().intValue() == 4) {
            setViewCheque("deposito");
        } else {
            setViewCheque("init");
        }

    }

    public void clearlista() {
        for (int i = 0; i < modelo.size(); i++) {
            SaldosDeudas item = modelo.get(i);
            item.setAbonarTemporal(CERO);
        }
    }

    public String validarCampos() {
        String cadena = "";
        switch (abono.getIdtipoAbonoFk().intValue()) {
        case 1:
            System.out.println("Pago en Efectivo sin campos requeridos");
            break;
        case 2:
            System.out.println("Pago en Transferencia Bancaria");
            if (idCuentaDestinoBean == null || abono.getReferencia() == null || abono.getConcepto() == null
                    || abono.getFechaTransferencia() == null) {
                cadena = "Faltan algunos campos en transferencia bancaria";
            }
            /*Campos Requeridos
            idCuentaBancariaFk
            numero de referencia
            concepto
            fechaTransferencia
             */
            break;
        case 3:
            System.out.println("Pago en Cheques");
            /*
            Campos Requeridos
            importe
            numero de cheque
            fecha de cobro
            librador
            banco emisor
             */
            if (abono.getMontoAbono() == null || abono.getNumeroCheque() == null || abono.getFechaCobro() == null
                    || abono.getLibrador() == null || abono.getBanco() == null) {
                cadena = "Faltan algunos campos en Pago con cheques";
            }
            break;
        case 4:
            System.out.println("Pago en Deposito Bancario");
            if (idCuentaDestinoBean == null || abono.getFolioElectronico() == null
                    || abono.getFechaTransferencia() == null) {
                cadena = "Faltan algunos datos en Deposito a Cuentas Bancarias";
            }
            break;
        default:
            break;

        }
        return cadena;
    }

    public void prepararAbono() {
        String cadena = validarCampos();
        if (verificarMaximoAbono()) {
            if (cadena.equals("")) {
                JsfUtil.addSuccessMessageClean("Abono Preparado");
                System.out.println("Abono: " + abono);
                BigDecimal to = abono.getMontoAbono().setScale(2, RoundingMode.CEILING);
                System.out.println("Monto abono: " + to);
                clearlista();
                if (to != null) {
                    switch (comboFiltro.intValue()) {
                    case 1:
                        System.out.println("Entro a case 1");
                        for (int i = 0; i < modelo.size(); i++) {
                            SaldosDeudas item = modelo.get(i);

                            BigDecimal deuda = item.getSaldoAtrasado().setScale(2, RoundingMode.CEILING);
                            System.out.println("Abono: " + to);
                            System.out.println("Deuda: " + deuda);

                            if (deuda.compareTo(to) < 1) {
                                System.out.println("La deuda es meno al abono por lo tanto abonar.");
                                to = to.subtract(item.getSaldoAtrasado().setScale(2, RoundingMode.CEILING),
                                        MathContext.UNLIMITED);
                                item.setAbonarTemporal(item.getSaldoAtrasado().setScale(2, RoundingMode.CEILING));
                            } else {
                                System.out.println(
                                        "La deuda es mayor al monto del abono por lo tanto es sobrante de abono.");
                                item.setAbonarTemporal(to.setScale(2, RoundingMode.CEILING));
                                to = to.subtract(to.setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                                break;

                            }
                            //                            for (int i = 0; i < modelo.size(); i++)
                            //                            {
                            //                                SaldosDeudas item = modelo.get(i);
                            //
                            //                                to = to.subtract(item.getSaldoAtrasado().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                if (to.compareTo(new BigDecimal(0).setScale(2, RoundingMode.CEILING)) >= 0) {
                            //                                    item.setAbonarTemporal(item.getSaldoAtrasado().setScale(2, RoundingMode.CEILING));
                            //                                } else {
                            //                                    to = to.add(item.getSaldoAtrasado().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                    item.setAbonarTemporal(to.setScale(2, RoundingMode.CEILING));
                            //                                    //to = to.subtract(item.getSaldoAtrasado().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                    break;
                            //                                }
                        }
                        break;
                    case 2:
                        System.out.println("Entro a case 2");
                        for (int i = 0; i < modelo.size(); i++) {
                            SaldosDeudas item = modelo.get(i);

                            BigDecimal deuda = item.getMinimoPago().setScale(2, RoundingMode.CEILING);
                            System.out.println("Abono: " + to);
                            System.out.println("Deuda: " + deuda);

                            if (deuda.compareTo(to) < 1) {
                                System.out.println("La deuda es meno al abono por lo tanto abonar.");
                                to = to.subtract(item.getMinimoPago().setScale(2, RoundingMode.CEILING),
                                        MathContext.UNLIMITED);
                                item.setAbonarTemporal(item.getMinimoPago().setScale(2, RoundingMode.CEILING));
                            } else {
                                System.out.println(
                                        "La deuda es mayor al monto del abono por lo tanto es sobrante de abono.");
                                item.setAbonarTemporal(to.setScale(2, RoundingMode.CEILING));
                                to = to.subtract(to.setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                                break;

                            }
                            //
                            //                                SaldosDeudas item = modelo.get(i);
                            //                                to = to.subtract(item.getMinimoPago().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                if (to.compareTo(new BigDecimal(0).setScale(2, RoundingMode.CEILING)) >= 0) {
                            //
                            //                                    item.setAbonarTemporal(item.getMinimoPago().setScale(2, RoundingMode.CEILING));
                            //                                } else {
                            //                                    to = to.add(item.getMinimoPago().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                    item.setAbonarTemporal(to.setScale(2, RoundingMode.CEILING));
                            //                                    //to = to.subtract(item.getMinimoPago().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                    break;
                            //                                }
                        }

                        break;
                    case 3:

                        System.out.println("Entro a case 3");
                        for (int i = 0; i < modelo.size(); i++) {
                            SaldosDeudas item = modelo.get(i);

                            BigDecimal deuda = item.getSaldoLiquidar().setScale(2, RoundingMode.CEILING);
                            System.out.println("Abono: " + to);
                            System.out.println("Deuda: " + deuda);

                            if (deuda.compareTo(to) < 1) {
                                System.out.println("La deuda es meno al abono por lo tanto abonar.");
                                to = to.subtract(item.getSaldoLiquidar().setScale(2, RoundingMode.CEILING),
                                        MathContext.UNLIMITED);
                                item.setAbonarTemporal(item.getSaldoLiquidar().setScale(2, RoundingMode.CEILING));
                            } else {
                                System.out.println(
                                        "La deuda es mayor al monto del abono por lo tanto es sobrante de abono.");
                                item.setAbonarTemporal(to.setScale(2, RoundingMode.CEILING));
                                to = to.subtract(to.setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                                break;

                            }

                            //                                if (to.compareTo(new BigDecimal(0).setScale(2, RoundingMode.CEILING)) >= 0) {
                            //                                    item.setAbonarTemporal(item.getSaldoLiquidar().setScale(2, RoundingMode.CEILING));
                            //                                } else {
                            //                                    to = to.add(item.getSaldoLiquidar().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                    item.setAbonarTemporal(to.setScale(2, RoundingMode.CEILING));
                            //                                    //to = to.subtract(item.getSaldoLiquidar().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
                            //                                    break;
                            //                                }
                        }
                        break;
                    default:
                        JsfUtil.addErrorMessageClean("Ocurrio un error, contactar al administrador");
                        break;
                    }
                    //                    if(to.compareTo(CERO)==1)
                    //                    {
                    //                        abonarRestante(to);
                    //                    }

                    //llamar a funcion llenadora de datos
                    System.out.println("================Sobrante: " + to);
                    abonarRestante(to);
                    botonCancelar = false;
                    botonActualizar = false;
                    habilitaBotones = true;
                } else {
                    JsfUtil.addErrorMessageClean("Primero debes agregar la forma de pago");
                }
            } else {
                JsfUtil.addErrorMessageClean(cadena);
            }
        } else {
            JsfUtil.addErrorMessageClean(
                    "No puedes abonar con mas dinero del saldo a liquidar, an no no existe saldo a favor");
        }
    }

    public boolean verificarMaximoAbono() {
        System.out.println("Abono: " + abono.getMontoAbono().setScale(2, RoundingMode.CEILING));
        System.out.println("Saldo para Liquidar:" + saldoParaLiquidar.setScale(2, RoundingMode.CEILING));

        if (abono.getMontoAbono().setScale(2, RoundingMode.CEILING)
                .compareTo(saldoParaLiquidar.setScale(2, RoundingMode.CEILING)) == 1) {
            return false;
        } else {
            return true;
        }
    }

    public void abonarRestante(BigDecimal saldoSobrante) {
        System.out.println("Entro a funcion llenadora");
        System.out.println("Abono Sobrante: " + saldoSobrante);

        for (int i = 0; i < modelo.size(); i++) {
            SaldosDeudas item = modelo.get(i);
            BigDecimal minimoPago = CERO;
            minimoPago = item.getMinimoPago().setScale(2, RoundingMode.CEILING);
            if (minimoPago.compareTo(saldoSobrante.setScale(2, RoundingMode.CEILING)) <= 0) {
                //falta opci{on que valide el maximo a abonar.
                if (item.getAbonarTemporal().add(minimoPago, MathContext.UNLIMITED)
                        .compareTo(item.getSaldoLiquidar()) <= 0) {
                    item.setAbonarTemporal(item.getAbonarTemporal().add(minimoPago, MathContext.UNLIMITED));
                    saldoSobrante = saldoSobrante.subtract(minimoPago, MathContext.UNLIMITED);
                    System.out.println("sobrante: " + saldoSobrante);
                }
            } else {
                if (saldoSobrante.compareTo(CERO) == 1) {
                    item.setAbonarTemporal(item.getAbonarTemporal().add(saldoSobrante, MathContext.UNLIMITED));
                    saldoSobrante = saldoSobrante.subtract(minimoPago, MathContext.UNLIMITED);
                }
            }
        }

        //        for (int i = 0; i < modelo.size(); i++) {
        //            SaldosDeudas item = modelo.get(i);
        //            BigDecimal resta = item.getSaldoLiquidar().setScale(2, RoundingMode.CEILING).subtract(item.getAbonarTemporal().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
        //            System.out.println("Resta: " + resta);
        //            if ((resta).compareTo(CERO) <= 0) {
        //                System.out.println("Ya no se le puede abonar ms a este folio");
        //            } else if (resta.compareTo(saldoSobrante) >= 0) {
        //                System.out.println("Si se le puede abonar mas a este folio");
        //                item.setAbonarTemporal(item.getAbonarTemporal().setScale(2, RoundingMode.CEILING).add(resta.setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED));
        //            } else {
        //                System.out.println("Se le abona el total + saldo sobrante");
        //                saldoSobrante = saldoSobrante.subtract(resta, MathContext.UNLIMITED);
        //                if (saldoSobrante.compareTo(CERO) > 0) {
        //                    BigDecimal suma = item.getAbonarTemporal().setScale(2, RoundingMode.CEILING).add(resta.setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED);
        //                    System.out.println("SUMA: " + suma);
        //                    //saldoSobrante = saldoSobrante.subtract(resta, MathContext.UNLIMITED);
        //                    item.setAbonarTemporal(resta);
        //                }
        //
        //            }
        //
        //        }
        System.out.println("FIN  Abono Sobrante: " + saldoSobrante);

    }

    public void abonarCreditos() {
        if (abono.getIdtipoAbonoFk() != null && opcaja.getIdCajaFk() != null) {
            AbonoCredito ac = new AbonoCredito();
            //ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
            //ac.setIdCreditoFk(dataAbonar.getFolioCredito());
            //ac.setMontoAbono(abono.getMontoAbono());
            ac.setIdUsuarioFk(usuarioDominio.getIdUsuario()); //aqui poner el usuario looggeado
            ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());

            switch (abono.getIdtipoAbonoFk().intValue()) {
            case 1:
                System.out.println("Contado");
                for (SaldosDeudas sd : modelo) {
                    if (sd.getAbonarTemporal() != null
                            && sd.getAbonarTemporal().setScale(2, RoundingMode.CEILING) != CERO) {
                        ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
                        ac.setIdCreditoFk(sd.getFolioCredito());
                        ac.setMontoAbono(sd.getAbonarTemporal());
                        ac.setEstatusAbono(ABONOREALIZADO);
                        System.out.println("Abono: " + ac.toString());
                        if ((sd.getTotalAbonado().setScale(2, RoundingMode.CEILING))
                                .add(ac.getMontoAbono().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED)
                                .compareTo(sd.getSaldoTotal()) == 0) {
                            System.out.println("Se libera el credito");

                            if (ifaceCredito.updateStatus(ac.getIdCreditoFk(), CREDITOFINALIZADO) == 1) {
                                JsfUtil.addSuccessMessage("Se ha liquidado el crdito total  con el folio: "
                                        + ac.getIdCreditoFk() + " exitosamente");
                            } else {
                                JsfUtil.addErrorMessageClean(
                                        "Se ha producido un error al liquidar todo el folio de credito: "
                                                + ac.getIdCreditoFk());
                            }
                        } else {
                            System.out.println("Aun no se libera el credito");
                        }
                        //insertar el abono
                        if (ifaceAbonoCredito.insert(ac) == 1) {
                            JsfUtil.addSuccessMessage("Se ha realizado un abono existosamente");

                        } else {
                            JsfUtil.addErrorMessageClean(
                                    "Ocurrio un error al intentar registrar el abono con el folio: "
                                            + ac.getIdAbonoCreditoPk());
                        }
                    }

                } //fin for

                ac.setMontoAbono(abono.getMontoAbono());
                opcaja.setIdConceptoFk(conceptoAbonoEfectivo);
                opcaja.setIdOperacionesCajaPk(new BigDecimal(ifaceOperacionesCaja.getNextVal()));
                opcaja.setMonto(ac.getMontoAbono());
                opcaja.setIdStatusFk(statusOperacionRealizada);
                opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + " | FC: " + ac.getIdCreditoFk() + " | C:"
                        + cliente.getNombreCompleto());

                if (ifaceOperacionesCaja.insertaOperacion(opcaja) == 1) {
                    JsfUtil.addSuccessMessageClean("Se ha registrado el abono correctamente");
                } else {
                    JsfUtil.addErrorMessageClean("Ocurri un error al registrar el pago de la venta");
                }
                finAbonar(ac);

                break;
            case 2:
                System.out.println("Transferencia");
                for (SaldosDeudas sd : modelo) {
                    if (sd.getAbonarTemporal() != null
                            && sd.getAbonarTemporal().setScale(2, RoundingMode.CEILING) != CERO) {
                        ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
                        ac.setIdCreditoFk(sd.getFolioCredito());
                        ac.setMontoAbono(sd.getAbonarTemporal());
                        ac.setEstatusAbono(ABONOREALIZADO);
                        ac.setConcepto(abono.getConcepto());
                        ac.setReferencia(abono.getReferencia());
                        ac.setFechaTransferencia(abono.getFechaTransferencia());
                        System.out.println("Abono: " + ac.toString());
                        if ((sd.getTotalAbonado().setScale(2, RoundingMode.CEILING))
                                .add(ac.getMontoAbono().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED)
                                .compareTo(sd.getSaldoTotal()) == 0) {
                            System.out.println("Se libera el credito");

                            if (ifaceCredito.updateStatus(ac.getIdCreditoFk(), CREDITOFINALIZADO) == 1) {
                                JsfUtil.addSuccessMessage("Se ha liquidado el crdito total  con el folio: "
                                        + ac.getIdCreditoFk() + " exitosamente");
                            } else {
                                JsfUtil.addErrorMessageClean(
                                        "Se ha producido un error al liquidar todo el folio de credito: "
                                                + ac.getIdCreditoFk());
                            }
                        } else {
                            System.out.println("Aun no se libera el credito");
                        }
                        //insertar el abono
                        if (ifaceAbonoCredito.insert(ac) == 1) {
                            JsfUtil.addSuccessMessage("Se ha realizado un abono existosamente");

                        } else {
                            JsfUtil.addErrorMessageClean(
                                    "Ocurrio un error al intentar registrar el abono con el folio: "
                                            + ac.getIdAbonoCreditoPk());
                        }
                    }

                } //fin for
                ac.setMontoAbono(abono.getMontoAbono());
                ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());
                opcaja.setIdConceptoFk(conceptoAbonoTransferencia);
                opcaja.setIdOperacionesCajaPk(new BigDecimal(ifaceOperacionesCaja.getNextVal()));
                opcaja.setMonto(ac.getMontoAbono());
                opcaja.setIdStatusFk(statusOperacionRealizada);
                opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + " | FC: " + ac.getIdCreditoFk() + " | C:"
                        + cliente.getNombreCompleto());

                if (ifaceOperacionesCaja.insertaOperacion(opcaja) == 1) {
                    JsfUtil.addSuccessMessageClean("Se ha registrado el abono correctamente");
                } else {
                    JsfUtil.addErrorMessageClean("Ocurri un error al registrar el pago de la venta");
                }
                ac.setMontoAbono(abono.getMontoAbono());
                pagoBancario.setIdCajaFk(opcaja.getIdCajaFk());
                pagoBancario.setComentarios("");
                pagoBancario.setFechaDeposito(ac.getFechaTransferencia());
                pagoBancario.setFechaTranferencia(ac.getFechaTransferencia());
                pagoBancario.setFolioElectronico(ac.getFolioElectronico());
                pagoBancario.setIdConceptoFk(opcaja.getIdConceptoFk());
                pagoBancario.setIdCuentaFk(idCuentaDestinoBean);
                pagoBancario.setIdStatusFk(new BigDecimal(2));
                pagoBancario.setIdTipoFk(ac.getIdtipoAbonoFk());
                pagoBancario.setIdTransBancariasPk(new BigDecimal(ifacePagosBancarios.getNextVal()));
                pagoBancario.setIdUserFk(usuarioDominio.getIdUsuario());
                pagoBancario.setMonto(ac.getMontoAbono());
                pagoBancario.setReferencia(ac.getReferencia());
                pagoBancario.setIdOperacionCajaFk(opcaja.getIdOperacionesCajaPk());

                if (ac.getIdtipoAbonoFk().intValue() == 2 || ac.getIdtipoAbonoFk().intValue() == 4) {
                    if (ifacePagosBancarios.insertaPagoBancario(pagoBancario) == 1) {
                        System.out.println("Se ingreso correctamente un deposito bancario");
                    } else {
                        System.out.println("Ocurrio un error");
                    }
                }
                finAbonar(ac);
                break;
            case 3:
                System.out.println("Cheque");
                for (SaldosDeudas sd : modelo) {
                    if (sd.getAbonarTemporal() != null
                            && sd.getAbonarTemporal().setScale(2, RoundingMode.CEILING) != CERO) {
                        ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
                        ac.setIdCreditoFk(sd.getFolioCredito());
                        ac.setMontoAbono(sd.getAbonarTemporal());
                        ac.setEstatusAbono(ABONOREALIZADO);
                        ac.setNumeroCheque(abono.getNumeroCheque());
                        ac.setLibrador(abono.getLibrador());
                        ac.setFechaCobro(abono.getFechaCobro());
                        ac.setBanco(abono.getBanco());
                        ac.setFactura(abono.getFactura());
                        System.out.println("Abono: " + ac.toString());
                        if ((sd.getTotalAbonado().setScale(2, RoundingMode.CEILING))
                                .add(ac.getMontoAbono().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED)
                                .compareTo(sd.getSaldoTotal()) == 0) {
                            System.out.println("Se libera el credito");

                            if (ifaceCredito.updateStatus(ac.getIdCreditoFk(), CREDITOFINALIZADO) == 1) {
                                JsfUtil.addSuccessMessage("Se ha liquidado el crdito total  con el folio: "
                                        + ac.getIdCreditoFk() + " exitosamente");
                            } else {
                                JsfUtil.addErrorMessageClean(
                                        "Se ha producido un error al liquidar todo el folio de credito: "
                                                + ac.getIdCreditoFk());
                            }
                        } else {
                            System.out.println("Aun no se libera el credito");
                        }
                        //insertar el abono
                        if (ifaceAbonoCredito.insert(ac) == 1) {
                            JsfUtil.addSuccessMessage("Se ha realizado un abono existosamente");

                        } else {
                            JsfUtil.addErrorMessageClean(
                                    "Ocurrio un error al intentar registrar el abono con el folio: "
                                            + ac.getIdAbonoCreditoPk());
                        }
                    }

                } //fin for
                ac.setMontoAbono(abono.getMontoAbono());
                ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());
                opcaja.setIdConceptoFk(conceptoAbonoCheque);
                opcaja.setIdOperacionesCajaPk(new BigDecimal(ifaceOperacionesCaja.getNextVal()));
                opcaja.setMonto(ac.getMontoAbono());
                opcaja.setIdStatusFk(statusOperacionRealizada);
                opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + " | FC: " + ac.getIdCreditoFk() + " | C:"
                        + cliente.getNombreCompleto());

                if (ifaceOperacionesCaja.insertaOperacion(opcaja) == 1) {
                    JsfUtil.addSuccessMessageClean("Se ha registrado el abono correctamente");
                } else {
                    JsfUtil.addErrorMessageClean("Ocurri un error al registrar el pago de la venta");
                }
                //--- Insertar Documento -- //
                Documento d = new Documento();
                d.setIdDocumentoPk(new BigDecimal(ifaceDocumentos.getNextVal()));
                d.setIdAbonoFk(ac.getIdAbonoCreditoPk());
                d.setFechaCobro(ac.getFechaCobro());
                Credito c = ifaceCredito.getById(ac.getIdCreditoFk());
                d.setIdClienteFk(c.getIdClienteFk());
                d.setIdStatusFk(DOCUMENTOACTIVO);
                d.setIdTipoDocumento(DOCUMENTOTIPOCHEQUE);
                d.setMonto(ac.getMontoAbono());
                d.setNumeroCheque(ac.getNumeroCheque());
                d.setFactura(ac.getFactura());
                d.setBanco(ac.getBanco());
                d.setLibrador(ac.getLibrador());
                d.setIdFormaCobroFk(new BigDecimal(1));
                System.out.println("Documento: " + d.toString());
                //--- Insertar Documento -- //
                if (ifaceDocumentos.insertarDocumento(d) == 1) {
                    System.out.println("Se ingreso corractamente el documento por cobrar");

                } else {
                    JsfUtil.addErrorMessageClean("Ocurri un error al registrar el documento por cobrar");
                }

                finAbonar(ac);

                break;
            case 4:
                System.out.println("Deposito");
                for (SaldosDeudas sd : modelo) {
                    if (sd.getAbonarTemporal() != null
                            && sd.getAbonarTemporal().setScale(2, RoundingMode.CEILING) != CERO) {
                        ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
                        ac.setIdCreditoFk(sd.getFolioCredito());
                        ac.setMontoAbono(sd.getAbonarTemporal());
                        ac.setFolioElectronico(abono.getFolioElectronico());
                        ac.setReferencia(abono.getFolioElectronico().toString());

                        for (CuentaBancaria cu : listaCuentas) {
                            if (idCuentaDestinoBean.intValue() == cu.getIdCuentaBancariaPk().intValue()) {
                                ac.setBanco(cu.getNombreBanco());
                            }
                        }

                        ac.setBanco(abono.getBanco());
                        ac.setFechaTransferencia(abono.getFechaTransferencia());
                        ac.setEstatusAbono(ABONOREALIZADO);
                        System.out.println("Abono: " + ac.toString());
                        if ((sd.getTotalAbonado().setScale(2, RoundingMode.CEILING))
                                .add(ac.getMontoAbono().setScale(2, RoundingMode.CEILING), MathContext.UNLIMITED)
                                .compareTo(sd.getSaldoTotal()) == 0) {
                            System.out.println("Se libera el credito");

                            if (ifaceCredito.updateStatus(ac.getIdCreditoFk(), CREDITOFINALIZADO) == 1) {
                                JsfUtil.addSuccessMessage("Se ha liquidado el crdito total  con el folio: "
                                        + ac.getIdCreditoFk() + " exitosamente");
                            } else {
                                JsfUtil.addErrorMessageClean(
                                        "Se ha producido un error al liquidar todo el folio de credito: "
                                                + ac.getIdCreditoFk());
                            }
                        } else {
                            System.out.println("Aun no se libera el credito");
                        }
                        //insertar el abono
                        if (ifaceAbonoCredito.insert(ac) == 1) {
                            JsfUtil.addSuccessMessage("Se ha realizado un abono existosamente");

                        } else {
                            JsfUtil.addErrorMessageClean(
                                    "Ocurrio un error al intentar registrar el abono con el folio: "
                                            + ac.getIdAbonoCreditoPk());
                        }
                    }

                } //fin for
                ac.setMontoAbono(abono.getMontoAbono());
                ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());
                opcaja.setIdConceptoFk(conceptoAbonoDeposito);
                opcaja.setIdOperacionesCajaPk(new BigDecimal(ifaceOperacionesCaja.getNextVal()));
                opcaja.setMonto(ac.getMontoAbono());
                opcaja.setIdStatusFk(statusOperacionRealizada);
                opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + " | FC: " + ac.getIdCreditoFk() + " | C:"
                        + cliente.getNombreCompleto());
                if (ifaceOperacionesCaja.insertaOperacion(opcaja) == 1) {
                    JsfUtil.addSuccessMessageClean("Se ha registrado el abono correctamente");
                } else {
                    JsfUtil.addErrorMessageClean("Ocurri un error al registrar el pago de la venta");
                }
                ac.setMontoAbono(abono.getMontoAbono());
                pagoBancario.setIdCajaFk(opcaja.getIdCajaFk());
                pagoBancario.setComentarios("");
                pagoBancario.setFechaDeposito(ac.getFechaTransferencia());
                pagoBancario.setFechaTranferencia(ac.getFechaTransferencia());
                pagoBancario.setFolioElectronico(ac.getFolioElectronico());
                pagoBancario.setIdConceptoFk(opcaja.getIdConceptoFk());
                pagoBancario.setIdCuentaFk(idCuentaDestinoBean);
                pagoBancario.setIdStatusFk(new BigDecimal(2));
                pagoBancario.setIdTipoFk(ac.getIdtipoAbonoFk());
                pagoBancario.setIdTransBancariasPk(new BigDecimal(ifacePagosBancarios.getNextVal()));
                pagoBancario.setIdUserFk(usuarioDominio.getIdUsuario());
                pagoBancario.setMonto(ac.getMontoAbono());
                pagoBancario.setReferencia(ac.getReferencia());
                pagoBancario.setIdOperacionCajaFk(opcaja.getIdOperacionesCajaPk());

                if (ac.getIdtipoAbonoFk().intValue() == 2 || ac.getIdtipoAbonoFk().intValue() == 4) {
                    if (ifacePagosBancarios.insertaPagoBancario(pagoBancario) == 1) {
                        System.out.println("Se ingreso correctamente un deposito bancario");
                    } else {
                        System.out.println("Ocurrio un error");
                    }
                }
                finAbonar(ac);
                break;
            default:
                System.out.println("Ocurrio un error");
                break;
            }

        } else {
            JsfUtil.addErrorMessageClean(
                    "Selecione un tipo de abono, o no tiene caja para realizar este movimiento");
        }

    }

    public void finAbonar(AbonoCredito ac) {
        setParameterTicket(ac, cliente);
        String nombreReporte = "";
        switch (ac.getIdtipoAbonoFk().intValue()) {
        case 1:
            System.out.println("Efectivo");
            nombreReporte = "abono.jasper";
            break;
        case 2:
            nombreReporte = "abonoTransferencia.jasper";
            break;
        case 3:
            nombreReporte = "abonoCheque.jasper";
            break;
        case 4:
            nombreReporte = "abonoDeposito.jasper";
            break;
        default:
            System.out.println("Ocurrio un error");
            break;
        }
        generateReport(ac.getIdAbonoCreditoPk().intValue(), nombreReporte);
        System.out.println("Ruta: " + rutaPDF);
        RequestContext.getCurrentInstance().execute("window.frames.miFrame.print();");
        abono.reset();
        dataAbonar.reset();
        saldoParaLiquidar = new BigDecimal(0);
        searchByIdCliente();

    }

    public void abonar() {
        AbonoCredito ac = new AbonoCredito();
        if (abono.getIdtipoAbonoFk() != null && opcaja.getIdCajaFk() != null) {
            switch (abono.getIdtipoAbonoFk().intValue()) {
            /*
            ===============
            1.- Contado
            2.- Transferencia
            3.- Cheque
            4.- Deposito 
            5.- A cuenta
            ===============
            Estatus de los Creditos
            1.- Activo
            2.- Finalizado
            ===============
            Estatus de Abonos
            1.- Se realizo
            2.- Esta pendiente (cheques)
             */
            case 1:
                System.out.println("Ejecuto Pago de Contado");
                if (abono.getMontoAbono() == null) {
                    JsfUtil.addErrorMessageClean("ingrese un monto de abono");
                    break;
                }
                ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
                ac.setIdCreditoFk(dataAbonar.getFolioCredito());
                ac.setMontoAbono(abono.getMontoAbono());
                ac.setIdUsuarioFk(usuarioDominio.getIdUsuario()); //aqui poner el usuario looggeado
                ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());
                ac.setEstatusAbono(ABONOREALIZADO);

                /*variable temporal creada para sumar el total Abonado y el nuevo abono
                en caso de que sea igual o mayor el temporal al saldo de la cuenta, liberar el credito.
                 */
                BigDecimal temporal = dataAbonar.getTotalAbonado().add(abono.getMontoAbono(),
                        MathContext.UNLIMITED);

                if ((temporal).compareTo(dataAbonar.getSaldoTotal()) >= 0) {

                    if (ifaceCredito.updateStatus(ac.getIdCreditoFk(), CREDITOFINALIZADO) == 1) {
                        JsfUtil.addSuccessMessage("Se ha liquidado el crdito total  con el folio: "
                                + ac.getIdCreditoFk() + " exitosamente");
                    } else {
                        JsfUtil.addErrorMessageClean(
                                "Se ha producido un error al liquidar todo el folio de credito: "
                                        + ac.getIdCreditoFk());
                    }
                }
                if (ifaceAbonoCredito.insert(ac) == 1) {
                    JsfUtil.addSuccessMessage("Se ha realizado un abono existosamente");
                    opcaja.setIdConceptoFk(concepto);
                    opcaja.setIdOperacionesCajaPk(new BigDecimal(ifaceOperacionesCaja.getNextVal()));
                    opcaja.setMonto(ac.getMontoAbono());
                    opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + " | FC: " + ac.getIdCreditoFk()
                            + " | C:" + cliente.getNombreCompleto());

                    if (ifaceOperacionesCaja.insertaOperacion(opcaja) == 1) {
                        setParameterTicket(ac, cliente);
                        generateReport(ac.getIdAbonoCreditoPk().intValue(), "abono.jasper");
                        abono.reset();
                        dataAbonar.reset();
                        saldoParaLiquidar = new BigDecimal(0);
                        searchByIdCliente();
                        RequestContext.getCurrentInstance().execute("window.frames.miFrame.print();");
                    } else {
                        JsfUtil.addErrorMessageClean("Ocurri un error al registrar el pago de la venta");
                    }

                } else {
                    JsfUtil.addErrorMessageClean("Ocurrio un error al intentar registrar el abono con el folio: "
                            + ac.getIdAbonoCreditoPk());
                }

                break;
            case 2:

                System.out.println("Ejecuto Transferencia");
                if (abono.getMontoAbono() == null || abono.getReferencia() == null || abono.getConcepto() == null
                        || abono.getFechaTransferencia() == null) {
                    JsfUtil.addErrorMessageClean("Ingrese el valor en todos los campos");
                    break;
                }
                ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
                ac.setIdCreditoFk(dataAbonar.getFolioCredito());
                ac.setMontoAbono(abono.getMontoAbono());
                ac.setIdUsuarioFk(usuarioDominio.getIdUsuario()); //aqui poner el usuario looggeado
                ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());
                ac.setEstatusAbono(ABONOREALIZADO);
                ac.setConcepto(abono.getConcepto());
                ac.setReferencia(abono.getReferencia());
                ac.setFechaTransferencia(abono.getFechaTransferencia());

                /*variable temporal creada para sumar el total Abonado y el nuevo abono
                en caso de que sea igual o mayor el temporal al saldo de la cuenta, liberar el credito.
                 */
                BigDecimal temporal1 = dataAbonar.getTotalAbonado().add(abono.getMontoAbono(),
                        MathContext.UNLIMITED);
                if ((temporal1).compareTo(dataAbonar.getSaldoTotal()) >= 0) {

                    if (ifaceCredito.updateStatus(ac.getIdCreditoFk(), CREDITOFINALIZADO) == 1) {
                        JsfUtil.addSuccessMessage("Se ha liquidado el crdito total  con el folio: "
                                + ac.getIdCreditoFk() + " exitosamente");
                    } else {
                        JsfUtil.addErrorMessageClean(
                                "Se ha producido un error al liquidar todo el folio de credito: "
                                        + ac.getIdCreditoFk());
                    }

                }
                if (ifaceAbonoCredito.insert(ac) == 1) {

                    opcuenta.setIdOperacionCuenta(new BigDecimal(ifaceOperacionesCuentas.getNextVal()));
                    opcuenta.setIdStatusFk(idStatusCuenta);
                    opcuenta.setMonto(ac.getMontoAbono());
                    opcuenta.setIdCuentaFk(idCuentaDestinoBean);
                    opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + "| FC: " + ac.getIdCreditoFk()
                            + " | C:" + cliente.getNombreCompleto());
                    if (ifaceOperacionesCuentas.insertaOperacion(opcuenta) == 1) {
                        JsfUtil.addSuccessMessageClean("Se ha recibido el la Transferencia Correctamente");
                        setParameterTicket(ac, cliente);
                        generateReport(ac.getIdAbonoCreditoPk().intValue(), "abonoTransferencia.jasper");
                        abono.reset();
                        dataAbonar.reset();
                        saldoParaLiquidar = new BigDecimal(0);
                        searchByIdCliente();
                        RequestContext.getCurrentInstance().execute("window.frames.miFrame.print();");
                    } else {
                        JsfUtil.addErrorMessageClean("Ocurri un error al recibir el Depsito");
                    }
                } else {
                    JsfUtil.addErrorMessageClean("Ocurrio un error al intentar registrar el abono con el folio: "
                            + ac.getIdAbonoCreditoPk());
                }

                break;
            case 3:

                System.out.println("Ejecuto CHEQUE");
                if (abono.getMontoAbono() == null || abono.getNumeroCheque() == null || abono.getLibrador() == null
                        || abono.getFechaCobro() == null || abono.getBanco() == null
                        || abono.getFactura() == null) {
                    JsfUtil.addErrorMessageClean("Ingrese el valor en todos los campos");
                    break;
                }
                ac.setIdAbonoCreditoPk(new BigDecimal(ifaceAbonoCredito.getNextVal()));
                ac.setIdCreditoFk(dataAbonar.getFolioCredito());
                ac.setMontoAbono(abono.getMontoAbono());
                ac.setIdUsuarioFk(usuarioDominio.getIdUsuario()); //aqui poner el usuario looggeado
                ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());
                ac.setEstatusAbono(ABONOREALIZADO);
                ac.setNumeroCheque(abono.getNumeroCheque());
                ac.setLibrador(abono.getLibrador());
                ac.setFechaCobro(abono.getFechaCobro());
                ac.setBanco(abono.getBanco());
                ac.setFactura(abono.getFactura());
                /*variable temporal creada para sumar el total Abonado y el nuevo abono
                en caso de que sea igual o mayor el temporal al saldo de la cuenta, liberar el credito.
                 */
                if (ifaceAbonoCredito.insert(ac) == 1) {
                    JsfUtil.addSuccessMessage("Se ha realizado un abono existosamente");
                    Documento d = new Documento();
                    d.setIdDocumentoPk(new BigDecimal(ifaceDocumentos.getNextVal()));
                    d.setIdAbonoFk(ac.getIdAbonoCreditoPk());
                    d.setFechaCobro(ac.getFechaCobro());
                    Credito c = ifaceCredito.getById(ac.getIdCreditoFk());
                    d.setIdClienteFk(c.getIdClienteFk());
                    d.setIdStatusFk(DOCUMENTOACTIVO);
                    d.setIdTipoDocumento(DOCUMENTOTIPOCHEQUE);
                    d.setMonto(ac.getMontoAbono());
                    d.setNumeroCheque(ac.getNumeroCheque());
                    d.setFactura(ac.getFactura());
                    d.setBanco(ac.getBanco());
                    d.setLibrador(ac.getLibrador());
                    d.setIdFormaCobroFk(new BigDecimal(1));
                    System.out.println("Documento: " + d.toString());
                    BigDecimal temporal2 = dataAbonar.getTotalAbonado().add(abono.getMontoAbono(),
                            MathContext.UNLIMITED);
                    if ((temporal2).compareTo(dataAbonar.getSaldoTotal()) >= 0) {

                        if (ifaceCredito.updateStatus(ac.getIdCreditoFk(), CREDITOFINALIZADO) == 1) {
                            JsfUtil.addSuccessMessage("Se ha liquidado el crdito total  con el folio: "
                                    + ac.getIdCreditoFk() + " exitosamente");
                        } else {
                            JsfUtil.addErrorMessageClean(
                                    "Se ha producido un error al liquidar todo el folio de credito: "
                                            + ac.getIdCreditoFk());
                        }
                    }
                    if (ifaceDocumentos.insertarDocumento(d) == 1) {
                        opcaja.setIdOperacionesCajaPk(new BigDecimal(ifaceOperacionesCaja.getNextVal()));
                        opcaja.setIdConceptoFk(conceptoMontoCheques);
                        opcaja.setMonto(ac.getMontoAbono());
                        opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + " | FC: " + ac.getIdCreditoFk()
                                + " | C:" + cliente.getNombreCompleto());

                        if (ifaceOperacionesCaja.insertaOperacion(opcaja) == 1) {
                            setParameterTicket(ac, cliente);
                            generateReport(ac.getIdAbonoCreditoPk().intValue(), "abonoCheque.jasper");
                            abono.reset();
                            dataAbonar.reset();
                            saldoParaLiquidar = new BigDecimal(0);
                            searchByIdCliente();
                            setViewCheque("init");

                            RequestContext.getCurrentInstance().execute("window.frames.miFrame.print();");
                        } else {
                            JsfUtil.addErrorMessageClean("Ocurri un error al registrar el pago de la venta");
                        }
                        System.out.println("Se ingreso corractamente el documento por cobrar");
                    } else {
                        System.out.println("Ocurrio un error al ingresar documento por cobrar");
                    }

                } else {
                    JsfUtil.addErrorMessageClean("Ocurrio un error al intentar registrar el abono con el folio: "
                            + ac.getIdAbonoCreditoPk());
                }

                break;
            case 4:
                break;
            case 5:
                Credito c = new Credito();

                c.setIdCreditoPk(dataAbonar.getFolioCredito());
                c.setStatusACuenta(new BigDecimal(1));
                if (ifaceCredito.updateACuenta(c) == 1) {
                    JsfUtil.addSuccessMessageClean("Monto a Cuenta Registrado");
                    opcaja.setIdOperacionesCajaPk(new BigDecimal(ifaceOperacionesCaja.getNextVal()));
                    opcaja.setMonto(dataAbonar.getSaldoACuenta());
                    opcaja.setIdConceptoFk(concepto);
                    opcaja.setComentarios("FA: " + ac.getIdAbonoCreditoPk() + " | FC: " + ac.getIdCreditoFk()
                            + " | C:" + cliente.getNombreCompleto());
                    if (ifaceOperacionesCaja.insertaOperacion(opcaja) == 1) {
                        ac.setIdCreditoFk(c.getIdCreditoPk());
                        ac.setMontoAbono(dataAbonar.getSaldoACuenta());
                        ac.setIdtipoAbonoFk(abono.getIdtipoAbonoFk());
                        setParameterTicket(ac, cliente);
                        generateReport(ac.getIdCreditoFk().intValue(), "abonoCuenta.jasper");
                        RequestContext.getCurrentInstance().execute("window.frames.miFrame.print();");
                    } else {
                        JsfUtil.addErrorMessageClean("Ocurri un error al registrar el pago de la venta");
                    }

                } else {
                    JsfUtil.addErrorMessageClean("Ocurrio un problema");
                }
                break;
            }
            saldoParaLiquidar = new BigDecimal(0);
            abono = new AbonoCredito();
            searchByIdCliente();
        } else {
            JsfUtil.addErrorMessageClean("Su usuario no cuenta con caja asignada o no selecciono un tipo de abono");
        }
    }

    public void pagarCheques() {
        if (!selectedchequesPendientes.isEmpty()) {
            for (AbonoCredito abonoCheque : selectedchequesPendientes) {
                System.out.println("===============================================");
                System.out.println("Cheque: " + abonoCheque);
                abonoCheque.setEstatusAbono(new BigDecimal(1));
                BigDecimal totalAbonado = new BigDecimal(0);
                BigDecimal totalVenta = new BigDecimal(0);
                if (ifaceAbonoCredito.update(abonoCheque) == 1) {
                    //enseguida buscar si ya se libero el credito de ese abono.
                    modelo = ifaceCredito.getCreditosActivos(cliente.getId_cliente(), null);
                    for (SaldosDeudas sd : modelo) {
                        if (sd.getFolioCredito().intValue() == abonoCheque.getIdCreditoFk().intValue()) {
                            totalVenta = sd.getSaldoTotal();
                            totalAbonado = totalAbonado.add(sd.getTotalAbonado(), MathContext.UNLIMITED);
                        }
                    }
                    if (totalAbonado.compareTo(totalVenta) >= 0) {
                        ifaceCredito.updateStatus(abonoCheque.getIdCreditoFk(), CREDITOFINALIZADO);
                        JsfUtil.addSuccessMessageClean("Se ha liquidado el crdito exitosamente");
                        // Se liquido con un cheque todo ese credito 
                    }
                    JsfUtil.addSuccessMessageClean("Cheque Cobrado Existosamente");
                    chequesPendientes = ifaceAbonoCredito.getByIdCredito(dataAbonar.getFolioCredito());
                } else {
                    JsfUtil.addErrorMessageClean("Ocurrio un problema al cobrar los cheques");
                }
            }
            selectedchequesPendientes = new ArrayList<AbonoCredito>();
            saldoParaLiquidar = new BigDecimal(0);
            searchByIdCliente();
        } else {
            JsfUtil.addErrorMessageClean("No existen cheques activos o no se ha seleccionado ninguno");
        }

    }

    public void preProcessPDF(Object document) throws IOException, BadElementException, DocumentException {
        Document pdf = (Document) document;
        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext()
                .getContext();
        String logo = servletContext.getRealPath("") + File.separator + "resources" + File.separator + "img"
                + File.separator + "pdf.png";
        pdf.addTitle("Estado de Cuenta " + cliente.getNombreCompleto());
    }

    public void backView() {
        setTitle("Historial de Compras");
        setViewEstate("init");
        setViewCheque("init");
    }

    public void searchByIdCliente() {
        saldoParaLiquidar = new BigDecimal(0);
        abono.reset();
        dataAbonar.reset();

        abono.setIdtipoAbonoFk(new BigDecimal(1));
        botonActualizar = true;
        botonCancelar = true;

        cliente = ifaceCatCliente.getCreditoClienteByIdCliente(cliente.getId_cliente());
        if (cliente != null && cliente.getId_cliente() != null) {
            modelo = ifaceCredito.getCreditosActivos(cliente.getId_cliente(), null);
            for (SaldosDeudas sd : modelo) {
                saldoParaLiquidar = saldoParaLiquidar.add(sd.getSaldoLiquidar(), MathContext.UNLIMITED);
            }
            habilitaBotones = false;

        } else {
            JsfUtil.addWarnMessage("El cliente no cuenta con creditos activos");
            modelo = new ArrayList<SaldosDeudas>();
            habilitaBotones = true;

            //cliente = new Cliente();
        }
        addView();

    }

    public ArrayList<Cliente> autoCompleteCliente(String nombreCliente) {
        lstCliente = ifaceCatCliente.getClienteByNombreCompleto(nombreCliente.toUpperCase());
        return lstCliente;

    }

    public BigDecimal getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(BigDecimal idCliente) {
        this.idCliente = idCliente;
    }

    public String getNombreCompletoCliente() {
        return nombreCompletoCliente;
    }

    public void setNombreCompletoCliente(String nombreCompletoCliente) {
        this.nombreCompletoCliente = nombreCompletoCliente;
    }

    public String getRfcCliente() {
        return rfcCliente;
    }

    public void setRfcCliente(String rfcCliente) {
        this.rfcCliente = rfcCliente;
    }

    public BigDecimal getCreditoAutorizado() {
        return creditoAutorizado;
    }

    public void setCreditoAutorizado(BigDecimal creditoAutorizado) {
        this.creditoAutorizado = creditoAutorizado;
    }

    public BigDecimal getCreditoUtilizado() {
        return creditoUtilizado;
    }

    public void setCreditoUtilizado(BigDecimal creditoUtilizado) {
        this.creditoUtilizado = creditoUtilizado;
    }

    public BigDecimal getCreditoDisponible() {
        return creditoDisponible;
    }

    public void setCreditoDisponible(BigDecimal creditoDisponible) {
        this.creditoDisponible = creditoDisponible;
    }

    public String getTipoCliente() {
        return tipoCliente;
    }

    public void setTipoCliente(String tipoCliente) {
        this.tipoCliente = tipoCliente;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getViewEstate() {
        return viewEstate;
    }

    public void setViewEstate(String viewEstate) {
        this.viewEstate = viewEstate;
    }

    public ArrayList<SaldosDeudas> getModelo() {
        return modelo;
    }

    public void setModelo(ArrayList<SaldosDeudas> modelo) {
        this.modelo = modelo;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public SaldosDeudas getDataAbonar() {
        return dataAbonar;
    }

    public void setDataAbonar(SaldosDeudas dataAbonar) {
        this.dataAbonar = dataAbonar;
    }

    public BigDecimal getTotalCreditos() {
        return totalCreditos;
    }

    public void setTotalCreditos(BigDecimal totalCreditos) {
        this.totalCreditos = totalCreditos;
    }

    public BigDecimal getTotalAbonado() {
        return totalAbonado;
    }

    public void setTotalAbonado(BigDecimal totalAbonado) {
        this.totalAbonado = totalAbonado;
    }

    public ArrayList<TipoAbono> getLstTipoAbonos() {
        return lstTipoAbonos;
    }

    public void setLstTipoAbonos(ArrayList<TipoAbono> lstTipoAbonos) {
        this.lstTipoAbonos = lstTipoAbonos;
    }

    public AbonoCredito getAbono() {
        return abono;
    }

    public void setAbono(AbonoCredito abono) {
        this.abono = abono;
    }

    public String getViewCheque() {
        return viewCheque;
    }

    public void setViewCheque(String viewCheque) {
        this.viewCheque = viewCheque;
    }

    public UsuarioDominio getUsuarioDominio() {
        return usuarioDominio;
    }

    public void setUsuarioDominio(UsuarioDominio usuarioDominio) {
        this.usuarioDominio = usuarioDominio;
    }

    public boolean isBandera() {
        return bandera;
    }

    public void setBandera(boolean bandera) {
        this.bandera = bandera;
    }

    public ArrayList<Cliente> getLstCliente() {
        return lstCliente;
    }

    public void setLstCliente(ArrayList<Cliente> lstCliente) {
        this.lstCliente = lstCliente;
    }

    public ArrayList<AbonoCredito> getChequesPendientes() {
        return chequesPendientes;
    }

    public void setChequesPendientes(ArrayList<AbonoCredito> chequesPendientes) {
        this.chequesPendientes = chequesPendientes;
    }

    public ArrayList<AbonoCredito> getSelectedchequesPendientes() {
        return selectedchequesPendientes;
    }

    public void setSelectedchequesPendientes(ArrayList<AbonoCredito> selectedchequesPendientes) {
        this.selectedchequesPendientes = selectedchequesPendientes;
    }

    public StreamedContent getMedia() {
        return media;
    }

    public void setMedia(StreamedContent media) {
        this.media = media;
    }

    public ByteArrayOutputStream getOutputStream() {
        return outputStream;
    }

    public void setOutputStream(ByteArrayOutputStream outputStream) {
        this.outputStream = outputStream;
    }

    public Map getParamReport() {
        return paramReport;
    }

    public void setParamReport(Map paramReport) {
        this.paramReport = paramReport;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getRutaPDF() {
        return rutaPDF;
    }

    public void setRutaPDF(String rutaPDF) {
        this.rutaPDF = rutaPDF;
    }

    public String getPathFileJasper() {
        return pathFileJasper;
    }

    public void setPathFileJasper(String pathFileJasper) {
        this.pathFileJasper = pathFileJasper;
    }

    public Date getFechaMasProximaPago() {
        return fechaMasProximaPago;
    }

    public void setFechaMasProximaPago(Date fechaMasProximaPago) {
        this.fechaMasProximaPago = fechaMasProximaPago;
    }

    public BigDecimal getMinimoPago() {
        return minimoPago;
    }

    public void setMinimoPago(BigDecimal minimoPago) {
        this.minimoPago = minimoPago;
    }

    public BigDecimal getSaldoParaLiquidar() {
        return saldoParaLiquidar;
    }

    public void setSaldoParaLiquidar(BigDecimal saldoParaLiquidar) {
        this.saldoParaLiquidar = saldoParaLiquidar;
    }

    public ArrayList<CuentaBancaria> getListaCuentas() {
        return listaCuentas;
    }

    public void setListaCuentas(ArrayList<CuentaBancaria> listaCuentas) {
        this.listaCuentas = listaCuentas;
    }

    public Caja getCaja() {
        return caja;
    }

    public void setCaja(Caja caja) {
        this.caja = caja;
    }

    public OperacionesCaja getOpcaja() {
        return opcaja;
    }

    public void setOpcaja(OperacionesCaja opcaja) {
        this.opcaja = opcaja;
    }

    public OperacionesCuentas getOpcuenta() {
        return opcuenta;
    }

    public void setOpcuenta(OperacionesCuentas opcuenta) {
        this.opcuenta = opcuenta;
    }

    public BigDecimal getIdCuentaDestinoBean() {
        return idCuentaDestinoBean;
    }

    public void setIdCuentaDestinoBean(BigDecimal idCuentaDestinoBean) {
        this.idCuentaDestinoBean = idCuentaDestinoBean;
    }

    public SaldosDeudas getSaldosDeudasEdit() {
        return saldosDeudasEdit;
    }

    public void setSaldosDeudasEdit(SaldosDeudas saldosDeudasEdit) {
        this.saldosDeudasEdit = saldosDeudasEdit;
    }

    public BigDecimal getComboFiltro() {
        return comboFiltro;
    }

    public void setComboFiltro(BigDecimal comboFiltro) {
        this.comboFiltro = comboFiltro;
    }

    public boolean isHabilitaBotones() {
        return habilitaBotones;
    }

    public void setHabilitaBotones(boolean habilitaBotones) {
        this.habilitaBotones = habilitaBotones;
    }

    public boolean isBotonCancelar() {
        return botonCancelar;
    }

    public void setBotonCancelar(boolean botonCancelar) {
        this.botonCancelar = botonCancelar;
    }

    public boolean isBotonActualizar() {
        return botonActualizar;
    }

    public void setBotonActualizar(boolean botonActualizar) {
        this.botonActualizar = botonActualizar;
    }

}