/*
 * 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.rrhh.IngresoPagos;
import com.cosmodas.EntCosmos.*;
import com.contabilidad.EntConta.*;


import com.contabilidad.FacadeConta.*;
import com.cosmodas.validaciones.*;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.commons.io.FileUtils;

/**
 * @author obper
 */
@Named
@ViewScoped
public class ingresoHorasEventuales implements Serializable {

    private List<PagoTemporales> listadoIngresadoTemporales;
    private List<HorasEventuales> horasTemporalesSelect;
    private List<VPagoEventual> listPagoEventuales;
    private List<VEmpleadoseventuales> empleados;
    private List<HorasDeTrabajoTemporal> horasEventuales;
    private String archiNuevoPdf;
    private Integer turnosPagar;
    private SalariosEventuale salarioEventual;

    private ExternalContext exc;
    private JasperPrint jasperPrint;
    private HttpSession session;

    private Boolean corrido;
    private Date fechaHoraInicio, fechaHorafin;
    @Inject
    private PagoTemporales pagoTemporal;
    @Inject
    private HorasEventuales horaNueva;
    @Inject
    private VPagoEventual pagoEventual;
    @Inject
    private VEmpleadoseventuales empleado;
    @Inject
    private HorasDeTrabajoTemporal horaNuevaTemp;
    @Inject
    private Sucursales sucursal;


    @EJB
    PagoTemporalesFacadeLocal ptfl;
    @EJB
    HorasEventualesFacadeLocal hefl;
    @EJB
    VPagoEventualFacadeLocal vpefl;
    @EJB
    VEmpleadoseventualesFacadeLocal veefl;
    @EJB
    HorasDeTrabajoTemporalFacadeLocal hdttfl;


    public SalariosEventuale getSalarioEventual() {
        return salarioEventual;
    }

    public void setSalarioEventual(SalariosEventuale salarioEventual) {
        this.salarioEventual = salarioEventual;
    }

    public Integer getTurnosPagar() {
        return turnosPagar;
    }

    public void setTurnosPagar(Integer turnosPagar) {
        this.turnosPagar = turnosPagar;
    }

    public String getArchiNuevoPdf() {
        return archiNuevoPdf;
    }

    public void setArchiNuevoPdf(String archiNuevoPdf) {
        this.archiNuevoPdf = archiNuevoPdf;
    }

    public List<HorasDeTrabajoTemporal> getHorasEventuales() {
        return horasEventuales;
    }

    public void setHorasEventuales(List<HorasDeTrabajoTemporal> horasEventuales) {
        this.horasEventuales = horasEventuales;
    }

    public HorasDeTrabajoTemporal getHoraNuevaTemp() {
        return horaNuevaTemp;
    }

    public void setHoraNuevaTemp(HorasDeTrabajoTemporal horaNuevaTemp) {
        this.horaNuevaTemp = horaNuevaTemp;
    }

    public List<VEmpleadoseventuales> getEmpleados() {
        return empleados;
    }

    public void setEmpleados(List<VEmpleadoseventuales> empleados) {
        this.empleados = empleados;
    }

    public VEmpleadoseventuales getEmpleado() {
        return empleado;
    }

    public void setEmpleado(VEmpleadoseventuales empleado) {
        this.empleado = empleado;
    }

    public Boolean getCorrido() {
        return corrido;
    }

    public void setCorrido(Boolean corrido) {
        this.corrido = corrido;
    }

    public Date getFechaHoraInicio() {
        return fechaHoraInicio;
    }

    public void setFechaHoraInicio(Date fechaHoraInicio) {
        this.fechaHoraInicio = fechaHoraInicio;
    }

    public Date getFechaHorafin() {
        return fechaHorafin;
    }

    public void setFechaHorafin(Date fechaHorafin) {
        this.fechaHorafin = fechaHorafin;
    }

    public List<VPagoEventual> getListPagoEventuales() {
        return listPagoEventuales;
    }

    public void setListPagoEventuales(List<VPagoEventual> listPagoEventuales) {
        this.listPagoEventuales = listPagoEventuales;
    }

    public VPagoEventual getPagoEventual() {
        return pagoEventual;
    }

    public void setPagoEventual(VPagoEventual pagoEventual) {
        this.pagoEventual = pagoEventual;
    }

    public List<PagoTemporales> getListadoIngresadoTemporales() {
        return listadoIngresadoTemporales;
    }

    public void setListadoIngresadoTemporales(List<PagoTemporales> listadoIngresadoTemporales) {
        this.listadoIngresadoTemporales = listadoIngresadoTemporales;
    }

    public List<HorasEventuales> getHorasTemporalesSelect() {
        return horasTemporalesSelect;
    }

    public void setHorasTemporalesSelect(List<HorasEventuales> horasTemporalesSelect) {
        this.horasTemporalesSelect = horasTemporalesSelect;
    }

    public PagoTemporales getPagoTemporal() {
        return pagoTemporal;
    }

    public void setPagoTemporal(PagoTemporales pagoTemporal) {
        this.pagoTemporal = pagoTemporal;
    }

    public HorasEventuales getHoraNueva() {
        return horaNueva;
    }

    public void setHoraNueva(HorasEventuales horaNueva) {
        this.horaNueva = horaNueva;
    }

    @PostConstruct
    public void init() {

        this.horasTemporalesSelect = hefl.findAll();
        this.empleados = veefl.findAll();
        this.corrido = false;
        this.turnosPagar = 0;
        this.session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        exc = FacesContext.getCurrentInstance().getExternalContext();
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        System.out.println("sucursal pagos "+sucursal.getSucursalCodigo());
        listPagoEventuales = vpefl.obtnerHorasCal(new Date(), sucursal.getSucursalCodigo());

    }

    public void agregarHora() {

        hdttfl.ingresarHora(empleado.getCodigoEmpleado(), fechaHoraInicio, fechaHorafin, getCorrido());
        this.horasEventuales = hdttfl.obtnerHoras(empleado.getCodigoEmpleado());

        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Hora Agregada Exitosamente"));

    }

    public void actualizaList(VEmpleadoseventuales e) {

        this.horasEventuales = hdttfl.obtnerHoras(e.getCodigoEmpleado());
    }

    public void calculoHorasNuevo(String e, List<HorasDeTrabajoTemporal> i) {

        SalariosEventuale sa = new SalariosEventuale();
        sa = hdttfl.busq();
        System.out.println(sa.getHoraDiurna());


        //   String e= getEmpleado().getCodigoEmpleado();
        Date fecha = new Date();

        VCalculohorassumas calHoras = hdttfl.obtnerHorasCal(e, fecha).get(0);
        PagoTemporales pag = new PagoTemporales();
        PagoTemporalesPK pagPK = new PagoTemporalesPK();

        String horasD[] = calHoras.getHorasDiurnas().split(":");
        String horasN[] = calHoras.getHorasNocturnas().split(":");
        String horasT[] = calHoras.getTotalHoras().split(":");

        Integer horasDiurnas = Integer.parseInt(horasD[0]);
        Integer minutosDiurnos = Integer.parseInt(horasD[1]);

        Integer horasNocturnas = Integer.parseInt(horasN[0]);
        Integer minutosNocturnos = Integer.parseInt(horasN[1]);

        Integer horasTotal = Integer.parseInt(horasT[0]);

        Integer turnosExtra = 0;
        Integer horasAdicionalesDiurnos = horasDiurnas % 8;

        Double pagoPorHora = sa.getHoraDiurna();
        Double pagoPorHoraNocturna =sa.getHoraNocturna();

        Double pagoTurnos = turnosPagar * sa.getTurnoExtra();

        Double pagoDiurnos = horasDiurnas * pagoPorHora;
        Double pagoDiurnosMinutos = minutosDiurnos * pagoPorHora / 60;
        Double pagoDiurnoTotal = pagoDiurnos + pagoDiurnosMinutos;
        Double pagoNocturnos = horasNocturnas * pagoPorHoraNocturna;
        Double pagoNocturnosMinutos = minutosNocturnos * pagoPorHoraNocturna / 60;
        Double pagoNocturnosTotal = pagoNocturnos + pagoNocturnosMinutos;
        Double subtotalPago = pagoTurnos + pagoDiurnoTotal + pagoNocturnosTotal;
        Double renta = subtotalPago * 0.10;


        BigDecimal pagoTurnoBD = new BigDecimal(pagoTurnos.toString());
        BigDecimal pagoTurnoBDS = pagoTurnoBD.setScale(2, pagoTurnoBD.ROUND_HALF_UP);

        BigDecimal pagoDiurnoBD = new BigDecimal(pagoDiurnoTotal.toString());
        BigDecimal pagoDiurnoBDS = pagoDiurnoBD.setScale(2, pagoDiurnoBD.ROUND_HALF_UP);

        BigDecimal pagoDiurnosMinutosBD = new BigDecimal(pagoDiurnosMinutos.toString());
        BigDecimal pagoDiurnosMinutosBDS = pagoDiurnosMinutosBD.setScale(2, pagoDiurnosMinutosBD.ROUND_HALF_UP);

        BigDecimal pagoNocturnosBD = new BigDecimal(pagoNocturnosTotal.toString());
        BigDecimal pagoNocturnosBDS = pagoNocturnosBD.setScale(2, pagoNocturnosBD.ROUND_HALF_UP);

        BigDecimal subtotalBD = new BigDecimal(subtotalPago.toString());
        BigDecimal subtotalBDS = subtotalBD.setScale(2, subtotalBD.ROUND_HALF_UP);

        BigDecimal rentaBD = new BigDecimal(renta.toString());
        BigDecimal rentaBDS = rentaBD.setScale(2, rentaBD.ROUND_HALF_UP);

        Double totalAPagar = subtotalBDS.doubleValue() - rentaBDS.doubleValue();

        BigDecimal totalPagoBD = new BigDecimal(totalAPagar.toString());
        BigDecimal totalPagoBDS = totalPagoBD.setScale(2, totalPagoBD.ROUND_HALF_UP);

        pagPK.setEmpCod(e);
        pagPK.setFecha(fecha);
        pagPK.setPagoDiurno(pagoDiurnoBDS);

        pag.setPagoTemporalesPK(pagPK);
        pag.setPagoMinutos(pagoDiurnosMinutosBDS);
        pag.setPagoNocturno(pagoNocturnosBDS);
        pag.setPagoTurno(pagoTurnoBDS);
        pag.setRenta(rentaBDS);
        pag.setSubTotal(subtotalBDS);
        pag.setSucursal(sucursal.getSucursalCodigo());
        pag.setTotalPago(totalPagoBDS);
        pag.setIdDePago(i.get(0).getIdPago());
        FacesContext context = FacesContext.getCurrentInstance();

        try {
            ptfl.create(pag);

            context.addMessage(null, new FacesMessage("Exito", "Pago Ingresado Exitosamente"));
        } catch (Exception ex) {
            context.addMessage(null, new FacesMessage("ERROR", "Pago No Ingresado"));
        }

        this.listPagoEventuales = vpefl.obtnerHorasCal(new Date(), sucursal.getSucursalCodigo());

    }

    public String corri(boolean i) {

        if (i) {
            return "CORRIDO";
        } else {
            return "NORMAL";
        }

    }

    public void borrarHora(String h) {
        hdttfl.borrarHora(h);
        this.horasEventuales = hdttfl.obtnerHoras(empleado.getCodigoEmpleado());
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Eliminado Exitosamente"));
    }

    public void borrarHoraPago(VPagoEventual h) {

        PagoTemporalesPK pagPK = new PagoTemporalesPK();
        pagPK.setEmpCod(h.getEmpCod());
        pagPK.setFecha(h.getFecha());
        pagPK.setPagoDiurno(h.getPagoDiurno());

        ptfl.remove(ptfl.find(pagPK));

        FacesContext context = FacesContext.getCurrentInstance();
        this.listPagoEventuales = vpefl.obtnerHorasCal(new Date(), sucursal.getSucursalCodigo());

        context.addMessage(null, new FacesMessage("Exito", "Eliminado Exitosamente"));

    }

    public void reemplazarDatos(List<HorasDeTrabajoTemporal> i) {

        ptfl.elimiminarPago(i.get(0).getIdPago());

        FacesContext context = FacesContext.getCurrentInstance();
        this.listPagoEventuales = vpefl.obtnerHorasCal(new Date(), sucursal.getSucursalCodigo());

        calculoHorasNuevo(i.get(0).getEmpCod(), hdttfl.obtnerHorasIdPag(i.get(0).getIdPago()));

        context.addMessage(null, new FacesMessage("Exito", "Modificado Exitosamente"));

    }

    public void openPDF(VPagoEventual p) throws IOException, JRException {

        List<VPagoEventual> lsi = new ArrayList<>();
        List<HorasDeTrabajoTemporal> lsi2 = new ArrayList<>();
        lsi2 = hdttfl.obtnerHorasIdPag(p.getIdDePago());
        lsi.add(p);

        CreaPDF(lsi2, lsi);
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        String realPath = ctx.getRealPath("/");

        System.out.println("direccion = " + realPath);

        File source = new File("/opt/pagoEventual/p" + p.getIdDePago() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/p" + p.getIdDePago() + ".pdf");
        archiNuevoPdf = "./pdf/p" + p.getIdDePago() + ".pdf";
        FileUtils.copyFile(source, dest, false);

        //ppfl.editaImpresion(p.getIdpp());
    }

    public void openPDFHORAS(VPagoEventual p) throws IOException, JRException {
        List<HorasDeTrabajoTemporal> lsi = new ArrayList<>();
        lsi = hdttfl.obtnerHorasIdPag(p.getIdDePago());

        CreaPDFHoras(lsi, p);
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        String realPath = ctx.getRealPath("/");

        System.out.println("direccion = " + realPath);

        File source = new File("/opt/pagoEventual/" + p.getIdDePago() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/" + p.getIdDePago() + ".pdf");
        archiNuevoPdf = "./pdf/" + p.getIdDePago() + ".pdf";
        FileUtils.copyFile(source, dest, false);

        //ppfl.editaImpresion(p.getIdpp());
    }

    public void CreaPDFHoras(List<HorasDeTrabajoTemporal> p, VPagoEventual v) throws JRException, IOException {

        fillReportHoras(p, v);

        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pagoEventual/" + p.get(0).getIdPago() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    }

    public void CreaPDF(List<HorasDeTrabajoTemporal> v, List<VPagoEventual> p) throws JRException, IOException {

        fillReport(v, p);

        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pagoEventual/p" + p.get(0).getIdDePago() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    }

    public ingresoHorasEventuales() {
    }

    public void fillReport(List<HorasDeTrabajoTemporal> v, List<VPagoEventual> p) throws JRException {

        Calendar calIni = Calendar.getInstance();
        Calendar calFin = Calendar.getInstance();

        Calendar cal = Calendar.getInstance();

        calIni.setTime(v.get(0).getFecha());
        calFin.setTime(v.get(v.size() - 1).getFecha());

        Integer diaIni = calIni.get(Calendar.DAY_OF_MONTH);
        Integer diaFin = calFin.get(Calendar.DAY_OF_MONTH);

        NumeroALetras nu = new NumeroALetras();
        obternerMes om = new obternerMes();

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(p);
        String reportPath = "/opt/reportesJasper/reciboDePago.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("pagoALetras", nu.Convertir(p.get(0).getSubTotal().toString(), true));
        if (p.get(0).getFecha().getDay() > 15) {
            parametros.put("quincena", "Segunda");
        } else {
            parametros.put("quincena", "Primera");
        }
        ;
        parametros.put("diaInicio", diaIni.toString());
        parametros.put("diaFin", diaFin.toString());
        parametros.put("anio", String.valueOf(cal.get(Calendar.YEAR)));
        parametros.put("mes", om.obtenerMes(p.get(0).getFecha().getMonth() + 1));
        parametros.put("fechaF", om.obtenerFechaFormateada());
        parametros.put("sucursal", sucursal.getSalaNombreCorto());
        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }

    public void fillReportHoras(List<HorasDeTrabajoTemporal> p, VPagoEventual v) throws JRException {

        NumeroALetras nu = new NumeroALetras();
        obternerMes om = new obternerMes();
        VCalculohorassumas calHoras = hdttfl.obtnerHorasCal(p.get(0).getEmpCod(), p.get(0).getFecha()).get(0);
        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(p);
        String reportPath = "/opt/reportesJasper/horas.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("nombre", v.getNombre());
        parametros.put("totalDiurnas", calHoras.getHorasDiurnas());
        parametros.put("totalNoct", calHoras.getHorasNocturnas());
        parametros.put("totalHor", calHoras.getTotalHoras());

        //--------------------------------------------------------------------------------------------------
        parametros.put("pagoDi", v.getPagoDiurno().toString());
        parametros.put("pagoMi", v.getPagoMinutos().toString());
        parametros.put("pagoNoc", v.getPagoNocturno().toString());
        parametros.put("pagoExt", v.getPagoTurno().toString());
        parametros.put("subTo", v.getSubTotal().toString());
        parametros.put("renta", v.getRenta().toString());
        parametros.put("totalApa", v.getTotalPago().toString());
        parametros.put("sucursal", sucursal.getSalaNombreCorto());

        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }

}
