package com.rrhh.personal;


import com.contabilidad.EntConta.*;
import com.contabilidad.FacadeConta.*;
import com.cosmodas.EntCosmos.Sucursales;
import com.cosmodas.FacadeCosmos.SucursalesFacadeLocal;
import com.utilitarios.ConversorArchivosSO;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.commons.io.FileUtils;
import org.primefaces.PrimeFaces;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.CroppedImage;
import org.primefaces.model.StreamedContent;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.bean.ViewScoped;
import javax.imageio.stream.FileImageOutputStream;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.*;

/**
 * @author obper
 */
@ManagedBean
@ViewScoped
public class Bpersonal implements Serializable {
    //Injects
    @Inject
    private Personal empleado;

    private List<Personal> listapersonacarnet;

    @Inject
    private Departamentos departname;

    //Variables de datos
    private String sucursalCodigo;
    private String Departamento;
    private CroppedImage croppeFoto;
    private String imageTemp;
    private String fotoSubir;
    private StreamedContent fotoEmpleado;
    private String realPaht;
    private boolean renderDatosAdicionales;
    private CroppedImage ccarnetFoto;
    private JasperPrint jasperPrint;
    private String departjasper;
    private String archiNuevoPdf;
    private String pdfCarnetF;
    private String pdfCarnetB;
    private String contratoFrontal;
    private String contratoTrasero;
    private String archisicebackPdf;
    private Date fechaInicioTrabajo;
    private Date fechaFinTraabajo;
    private Boolean tipoPagoEmpBol;
    private ExternalContext exc;
    private HttpSession session;
    private String equipoACargo;

    //Listas
    private List<Personal> listaEmpeleados;
    private List<Departamentos> depart;
    private List<ContaCargos> cargosContaList;
    private DatosGeneralesContrato patrono;
    private Sucursales sucursal;

    public String getPdfCarnetF() {
        return pdfCarnetF;
    }

    public void setPdfCarnetF(String pdfCarnetF) {
        this.pdfCarnetF = pdfCarnetF;
    }

    public String getPdfCarnetB() {
        return pdfCarnetB;
    }

    public void setPdfCarnetB(String pdfCarnetB) {
        this.pdfCarnetB = pdfCarnetB;
    }

    public String getContratoFrontal() {
        return contratoFrontal;
    }

    public void setContratoFrontal(String contratoFrontal) {
        this.contratoFrontal = contratoFrontal;
    }

    public String getContratoTrasero() {
        return contratoTrasero;
    }

    public void setContratoTrasero(String contratoTrasero) {
        this.contratoTrasero = contratoTrasero;
    }

    public Boolean getTipoPagoEmpBol() {
        return tipoPagoEmpBol;
    }

    public void setTipoPagoEmpBol(Boolean tipoPagoEmpBol) {
        this.tipoPagoEmpBol = tipoPagoEmpBol;
    }

    public Date getFechaInicioTrabajo() {
        return fechaInicioTrabajo;
    }

    public void setFechaInicioTrabajo(Date fechaInicioTrabajo) {
        this.fechaInicioTrabajo = fechaInicioTrabajo;
    }

    public Date getFechaFinTraabajo() {
        return fechaFinTraabajo;
    }

    public void setFechaFinTraabajo(Date fechaFinTraabajo) {
        this.fechaFinTraabajo = fechaFinTraabajo;
    }

    @EJB
    private PersonalFacadeLocal pfl;
    @EJB
    private DepartamentosFacadeLocal dpf;
    @EJB
    private SucursalesFacadeLocal sfl;
    @EJB
    private ContaCargosFacadeLocal ccfl;
    @EJB
    private HistorialContratosFacadeLocal hcfl;
    @EJB
    private DatosContratoFacadeLocal dcfl;

    ////gs


    public boolean isRenderDatosAdicionales() {
        return renderDatosAdicionales;
    }

    public void setRenderDatosAdicionales(boolean renderDatosAdicionales) {
        this.renderDatosAdicionales = renderDatosAdicionales;
    }

    public List<Personal> getListapersonacarnet() {
        return listapersonacarnet;
    }

    public void setListapersonacarnet(List<Personal> listapersonacarnet) {
        this.listapersonacarnet = listapersonacarnet;
    }

    public List<ContaCargos> getCargosList() {
        return cargosContaList;
    }

    public void setCargosList(List<ContaCargos> cargosContaList) {
        this.cargosContaList = cargosContaList;
    }

    public StreamedContent getFotoEmpleado() {
        return fotoEmpleado;
    }

    public void setFotoEmpleado(StreamedContent fotoEmpleado) {
        this.fotoEmpleado = fotoEmpleado;
    }

    public String getRealPaht() {
        return realPaht;
    }

    public void setRealPaht(String realPaht) {
        this.realPaht = realPaht;
    }

    public String getFotoSubir() {
        return fotoSubir;
    }

    public void setFotoSubir(String fotoSubir) {
        this.fotoSubir = fotoSubir;
    }

    public CroppedImage getCroppeFoto() {
        return croppeFoto;
    }

    public void setCroppeFoto(CroppedImage croppeFoto) {
        this.croppeFoto = croppeFoto;
    }

    public CroppedImage getCcarnetFoto() {
        return ccarnetFoto;
    }

    public void setCcarnetFoto(CroppedImage ccarnetFoto) {
        this.ccarnetFoto = ccarnetFoto;
    }

    public String getImageTemp() {
        return imageTemp;
    }

    public void setImageTemp(String imageTemp) {
        this.imageTemp = imageTemp;
    }

    public Personal getEmpleado() {
        return empleado;
    }

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

    public String getSucursalCodigo() {
        return sucursalCodigo;
    }

    public void setSucursalCodigo(String sucursalCodigo) {
        this.sucursalCodigo = sucursalCodigo;
    }

    public String getDepartamento() {
        return Departamento;
    }

    public void setDepartamento(String departamento) {
        Departamento = departamento;
    }

    public List<Personal> getListaEmpeleados() {
        return listaEmpeleados;
    }

    public void setListaEmpeleados(List<Personal> listaEmpeleados) {
        this.listaEmpeleados = listaEmpeleados;
    }

    public List<Departamentos> getDepart() {
        return depart;
    }

    public void setDepart(List<Departamentos> depart) {
        this.depart = depart;
    }

    public JasperPrint getJasperPrint() {
        return jasperPrint;
    }

    public void setJasperPrint(JasperPrint jasperPrint) {
        this.jasperPrint = jasperPrint;
    }

    public String getArchiNuevoPdf() {
        return archiNuevoPdf;
    }

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

    public String getArchisicebackPdf() {
        return archisicebackPdf;
    }

    public void setArchisicebackPdf(String archisicebackPdf) {
        this.archisicebackPdf = archisicebackPdf;
    }

    public String getDepartjasper() {
        return departjasper;
    }

    public void setDepartjasper(String departjasper) {
        this.departjasper = departjasper;
    }

    public Departamentos getDepartname() {
        return departname;
    }

    public void setDepartname(Departamentos departname) {
        this.departname = departname;
    }

    public String obtenerdepartamento(String dep) {
        String rs = "";
        try {
            rs = dpf.find(dep).getNombreDepartamento();
        } catch (Exception e) {

        }

        return rs;
    }

    @PostConstruct
    public void init() {

        this.listaEmpeleados = pfl.findAll();
        ConversorArchivosSO co = new ConversorArchivosSO();
        this.fotoEmpleado = co.datosPersonal("default.jpg");
        this.depart = dpf.findAll();
        this.empleado = new Personal();
        this.cargosContaList = ccfl.findAll();
        this.tipoPagoEmpBol = true;
        this.patrono = dcfl.findAll().get(0);
        exc = FacesContext.getCurrentInstance().getExternalContext();
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");

    }

    public Bpersonal() {
    }

    public void actionClose() {
        FacesContext.getCurrentInstance().addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Boleta En sistema", "la imagen ha sido cargada"));
    }


    public String obtenerNombreSucursal(String sucursalCodigo) {


        String rs = "NOHAY";
        try {

            rs = sfl.find(sucursalCodigo).getSalaNombreCorto();
        } catch (Exception e) {

        }
        return rs;

    }

    public void setSelectEmpleado(Personal p) {
        ConversorArchivosSO co = new ConversorArchivosSO();
        try {
            this.fotoEmpleado = co.datosPersonal("FOT-" + p.getCodigoEmpleado() + ".jpg");
        } catch (Exception e) {
            this.fotoEmpleado = co.datosPersonal("default.jpg");
        }


        setEmpleado(p);

    }

    public void selectTipoPagoEmp(Personal p) {
        tipoPagoEmpBol = p.getTipoPago() == 2 ? false : true;
    }

    public void nuevoEmpelado() {
        ConversorArchivosSO co = new ConversorArchivosSO();
        this.fotoEmpleado = co.datosPersonal("default.jpg");

        this.empleado = new Personal();

    }

    public void idcarnet(Personal idper) {
        this.empleado = idper;
    }

    //************* Cargar Foto para Carnet ********************//
    public void guardarfotocarnet() {
        String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/personal/");
        String archivo = path + File.separator + getImageTemp();
        realPaht = archivo;
        String nameFotof = getImageTemp();
        String rutadepicture = path + File.separator;

        try {

            if (ccarnetFoto != null) {
                FileImageOutputStream imageOutput = new FileImageOutputStream(new File(archivo));
                imageOutput.write(ccarnetFoto.getBytes(), 0, ccarnetFoto.getBytes().length);
                imageOutput.close();
            } else {
                OutputStream outStream = new FileOutputStream(new File(archivo));
                InputStream inputStream = new FileInputStream(path + "/temp/" + this.getImageTemp());
                byte[] buffer = new byte[6124];
                int bulk;
                while (true) {
                    bulk = inputStream.read(buffer);
                    if (bulk < 0) {
                        break;
                    }
                    outStream.write(buffer, 0, bulk);
                    outStream.flush();
                }
                outStream.close();
                inputStream.close();
            }
            actionPictures();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ConversorArchivosSO co = new ConversorArchivosSO();
        this.fotoEmpleado = co.datosPersonal(rutadepicture, nameFotof);
        System.out.println(fotoEmpleado);
    }

    public void actionPictures() {
        this.ccarnetFoto = null;
        this.imageTemp = null;
    }

    //*************************************************************************//
    public void actionGuardarFoto() {

        String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/personal/");
        String archivo = path + File.separator + getImageTemp();
        realPaht = archivo;
        String nombreFotof = getImageTemp();
        String rutadef = path + File.separator;

        try {

            if (croppeFoto != null) {
                FileImageOutputStream imageOutput = new FileImageOutputStream(new File(archivo));
                imageOutput.write(croppeFoto.getBytes(), 0, croppeFoto.getBytes().length);
                imageOutput.close();
            } else {
                OutputStream outStream = new FileOutputStream(new File(archivo));
                InputStream inputStream = new FileInputStream(path + "/temp/" + this.getImageTemp());
                byte[] buffer = new byte[6124];
                int bulk;
                while (true) {
                    bulk = inputStream.read(buffer);
                    if (bulk < 0) {
                        break;
                    }
                    outStream.write(buffer, 0, bulk);
                    outStream.flush();
                }
                outStream.close();
                inputStream.close();
            }

            actionFoto();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        ConversorArchivosSO co = new ConversorArchivosSO();
        this.fotoEmpleado = co.datosPersonal(rutadef, nombreFotof);

        System.out.println(fotoEmpleado);
    }

    public void guardarInfoBasica(Personal on) {

        Personal ne = getEmpleado();
        if(!Objects.isNull(equipoACargo)|| !equipoACargo.isEmpty()) {
            ne.setOtrosDatosIdentificacion(equipoACargo);
        }
        ne.setOtrosDatosIdentificacion(equipoACargo);
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        String realPath = ctx.getRealPath("/");
        String path = realPath + "personal/";

        if (Objects.isNull(ne.getCodigoEmpleado())) {
            String letraApellido = ne.getApellidoEmpleado();
            String nuevoCodigo = pfl.obtenerNuevoCodigoEmp(letraApellido);
            ne.setDui(ne.getDui().replace("-", ""));
            ne.setNit(ne.getNit().replace("-", ""));

            ne.setCodigoEmpleado(nuevoCodigo);

            if (!Objects.isNull(realPaht)) {
                File source = new File(realPaht);
                File dest = new File("/opt/personal/" + "FOT-" + ne.getCodigoEmpleado() + ".jpg");
                try {
                    FileUtils.copyFile(source, dest, false);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            pfl.create(ne);

            if (ne.getTipoPago() == 2) {

                HistorialContratos h = new HistorialContratos();
                h.setEmpleadoCodigo(ne.getCodigoEmpleado());
                h.setFechaFinPeriodo(getFechaFinTraabajo());
                h.setFechaInicioPeriodo(getFechaInicioTrabajo());

                hcfl.create(h);

            }

            addMessage(FacesMessage.SEVERITY_INFO, "Ingresado", ne.getNombreEmpleado() + "Empleado en sistema");
            PrimeFaces.current().executeScript("PF('nuevoEmpleadWV').hide();");
        } else {

            ne.setDui(ne.getDui().replace("-", ""));
            ne.setNit(ne.getNit().replace("-", ""));


            if (!Objects.isNull(realPaht)) {

                File source = new File(realPaht);
                File dest = new File("/opt/personal/" + "FOT-" + ne.getCodigoEmpleado() + ".jpg");
                try {
                    FileUtils.copyFile(source, dest, false);
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }

            pfl.edit(ne);

            HistorialContratos h = new HistorialContratos();
            h.setEmpleadoCodigo(ne.getCodigoEmpleado());
            h.setFechaFinPeriodo(getFechaFinTraabajo());
            h.setFechaInicioPeriodo(getFechaInicioTrabajo());

            hcfl.create(h);

            this.realPaht = new String();
            this.empleado = new Personal();
            this.listaEmpeleados = pfl.findAll();
            addMessage(FacesMessage.SEVERITY_INFO, "Editado", ne.getNombreEmpleado() + " Editado!!");
            PrimeFaces.current().executeScript("PF('nuevoEmpleadWV').hide();");


        }


    }
    public void soloValida(String dato){
        System.out.println("salida de validacion = " + dato);
        equipoACargo = dato;
        empleado.setOtrosDatosIdentificacion(dato);
    }

    public void guardarEmpleadoTotal(Personal ne) {

        if (ne.isFijo()) {
            PrimeFaces.current().executeScript("PF('empeladoFijo').show();");
        } else {
           // guardarInfoBasica();
        }


    }


    public void tipoEmpeleado() {
        System.out.println("es fijo");
        renderDatosAdicionales = true;
    }

    public void uploadFile(FileUploadEvent event) {
        try {

            ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                    .getExternalContext().getContext();
            String realPath = ctx.getRealPath("/");
            String path = realPath + "personal/temp/";

            File f = new File(path);

            if (f.mkdirs()) {
                System.out.println("Directory is created");
            } else {
                System.out.println("Directory cannot be created");
            }

            String archivo = path + File.separator + event.getFile().getFileName();

            FileOutputStream fileOutputStream = new FileOutputStream(archivo);
            byte[] buffer = new byte[6124];
            int bulk;
            InputStream inputStream = event.getFile().getInputstream();
            while (true) {
                bulk = inputStream.read(buffer);
                if (bulk < 0) {
                    break;
                }
                fileOutputStream.write(buffer, 0, bulk);
                fileOutputStream.flush();
            }
            fileOutputStream.close();
            inputStream.close();

            this.setImageTemp(event.getFile().getFileName());

        } catch (IOException e) {
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Error al subir el archivo"));
        }
    }

    public void addMessage(FacesMessage.Severity severity, String summary, String detail) {
        FacesContext.getCurrentInstance().
                addMessage(null, new FacesMessage(severity, summary, detail));
    }


    public void actionFoto() {
        this.croppeFoto = null;
        this.imageTemp = null;
    }

    ////****************************** REPORTE DE CARNET ***************************//////
    public void carnetPersonal(Personal p) throws JRException {
        String dpst = dpf.find(p.getDepartamento()).getNombreDepartamento();
        p.setDepartamento(dpst);
        List<Personal> listaPersonal = new ArrayList<>();

        listaPersonal.add(p);

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(listaPersonal);
        String reportPath = "/opt/reportesJasper/carnetA.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map pas = new HashMap();
        pas.put("departamento", "hola");

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

    //****** Back Side Card ********//
    public void carnetPersonalB(Personal p) throws JRException {
        List<Personal> listaPersonalb = new ArrayList<>();
        listaPersonalb.add(p);
        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(listaPersonalb);
        String reportPath = "/opt/reportesJasper/carnetB.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);

        Map parametros = new HashMap();
        parametros.put("nombreEmpleado", "hola");

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

    public void PDFPersonalCarnetB(Personal p) throws JRException, IOException {
        carnetPersonalB(p);
        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/carnets/carnetB" + p.getCodigoEmpleado() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

    }

    public void openCarnetB(Personal p) throws IOException, JRException {
        PDFPersonalCarnetB(p);
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        String realPath = ctx.getRealPath("/");

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

        File source = new File("/opt/carnets/carnetB" + p.getCodigoEmpleado() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/" + p.getCodigoEmpleado() + ".pdf");
        pdfCarnetB = "./pdf/" + p.getCodigoEmpleado() + ".pdf";
        FileUtils.copyFile(source, dest, false);
    }
    //********************************//

    public void abrirCarnets(Personal p) throws JRException, IOException {
        openCarnetF(p);
        openCarnetB(p);
    }

    public void openCarnetF(Personal p) throws IOException, JRException {
        PDFPersonalCarnet(p);

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

        System.out.println("direccion = " + realPath);
        File source = new File("/opt/carnets/carnetF" + p.getCodigoEmpleado() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/" + p.getCodigoEmpleado() + ".pdf");
        pdfCarnetF = "./pdf/" + p.getCodigoEmpleado() + ".pdf";
        FileUtils.copyFile(source, dest, false);
    }
    ///////////////////////////////////////////////////////

    public void fillReportACarnet(Personal p) throws JRException {

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(listapersonacarnet);
        String reportPath = "/opt/reportesJasper/carnetA.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();

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

    public void openPDF(Personal pl) throws IOException, JRException {
        try {
            fillReportACarnet(pl);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pedidos/" + pl.getCodigoEmpleado() + ".pdf");
        } catch (Exception e) {
            throw e;
        }
    }
    //*********************************************************************************//


    public void PDFPersonalCarnet(Personal p) throws JRException, IOException {
        carnetPersonal(p);
        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/carnets/carnetF" + p.getCodigoEmpleado() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

    }

    public ExternalContext getExc() {
        return exc;
    }

    public void abrirContratos(Personal p) throws JRException, IOException {
        openContratoFrontal(p);
        openContratoTrasero(p);
    }

    public void openContratoFrontal(Personal p) throws IOException, JRException {
        CreaContratoPDF(p);

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

        System.out.println("direccion = " + realPath);
        File source = new File("/opt/contratos/ContF-" + p.getCodigoEmpleado() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/ContF-" + p.getCodigoEmpleado() + ".pdf");
        contratoFrontal = "./pdf/ContF-" + p.getCodigoEmpleado() + ".pdf";
        FileUtils.copyFile(source, dest, false);
    }

    public void openContratoTrasero(Personal p) throws IOException, JRException {
        CreaContratoTrPDF(p);

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

        System.out.println("direccion = " + realPath);
        File source = new File("/opt/contratos/ContT-" + p.getCodigoEmpleado() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/ContT-" + p.getCodigoEmpleado() + ".pdf");
        contratoTrasero = "./pdf/ContT-" + p.getCodigoEmpleado() + ".pdf";
        FileUtils.copyFile(source, dest, false);
    }

    public void fillContratoFrontral(Personal p) throws JRException {

        ContaCargos cargoEmpleado = new ContaCargos();
        cargoEmpleado = ccfl.find(p.getCargoContrato());
        String sexoString = p.getSexo() ? "MASCULINO" : "FEMENINO";
        CuerpoContratoFrontal ccf = new CuerpoContratoFrontal();


        ccf.setTnombre(p.getNombreEmpleado().trim() + " " + p.getApellidoEmpleado().trim());
        ccf.setTsexo(sexoString);
        ccf.setTedad(calculaEdad(p.getFechaNacimiento()));
        ccf.setTestadocivil(p.getEstadoCivil());
        ccf.setTprofesion(p.getProfesion());
        ccf.setTdepartamento(p.getDomicilio());
        ccf.setTdireccion(p.getDireccion());
        ccf.setTnacionalidad(p.getNacionalidad());
        ccf.setTdui(p.getDui());
        ccf.setTduiexpedido(p.getExpedicionDui());
        ccf.setOtrosdatost(p.getOtrosDatosIdentificacion());
        ccf.setTfechadui(convertFechasLetras(p.getFechaDui()));

        ccf.setFechaContrato(convertFechasLetras(p.getFechaContrato()));
        ccf.setTcargo(cargoEmpleado.getNombreCargo());
        ccf.setObligacionescontratos(cargoEmpleado.getObligaciones());
        ccf.setLugarServicios(departamentoPorSalas(p.getSucursalCodigo()));
        ccf.setLugarPagos(departamentoPorSalas(p.getSucursalCodigo()));
        ccf.setTipoPago(tipoPagos(p.getTipoPago()));
        ccf.setSalario("$ " + p.getSalario().toString());
        ccf.setTiempocontrato(p.getDuracionContrato());


        //

        ccf.setPnombre(patrono.getNomprep().trim() + " " + patrono.getApellidop().trim());
        ccf.setPsexo("MASCULINO");
        ccf.setPedad(calculaEdad(patrono.getFechaNacimientop()));
        ccf.setPestadocivil("CASADO");
        ccf.setPprofesion(patrono.getProfesionp());
        ccf.setPnacionalidad(patrono.getNacionalidadp());
        ccf.setPdui(patrono.getDuip());
        ccf.setPduiexpedido(patrono.getDuiExpedicion());
        ccf.setOtrosdatosp(patrono.getOtrosDatosIdentificacion());
        ccf.setPdepartamento(patrono.getDomiciliop());
        ccf.setPduiexpedido(patrono.getDuiExpedicion());
        ccf.setPdireccion(patrono.getResidenciap());
        ccf.setPfechadui(convertFechasLetras(patrono.getDuiFecha()));


        List<CuerpoContratoFrontal> con = new ArrayList<>();
        con.add(ccf);


        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(con);
        String reportPath = "/opt/reportesJasper/fcontrato.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();

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


    public void CreaContratoPDF(Personal p) throws JRException, IOException {

        fillContratoFrontral(p);

        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/contratos/ContF-" + p.getCodigoEmpleado() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    }


    /////contrato trasero-------------------------

    public void fillContratoTrasero(Personal p) throws JRException {


        List<Dependientes> deps = new ArrayList<Dependientes>();
        deps = dcfl.obtenerDependientes(p.getCodigoEmpleado());
        if (deps.isEmpty()) {
            Dependientes de = new Dependientes();
            de.setCodigoEmpleado(p.getCodigoEmpleado());
            de.setNombres(" ");
            de.setEdad("  ");
            de.setApellidos("  ");
            de.setDireccion("");
            deps.add(de);

        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(deps);
        String reportPath = "/opt/reportesJasper/tcontrato.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("dia", String.valueOf(cal.get(Calendar.DAY_OF_MONTH)));
        parametros.put("mes", obtenerMEs(new Date()));
        parametros.put("vanno", String.valueOf(cal.get(Calendar.YEAR)));
        parametros.put("departamento", departamentoPorSalas(sucursal.getSucursalCodigo()));
       if(Objects.isNull(p.getOtrosDatosIdentificacion())){
            parametros.put("maquinaria", "-");
        }else{ parametros.put("maquinaria", p.getOtrosDatosIdentificacion());}



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


    public void CreaContratoTrPDF(Personal p) throws JRException, IOException {

        fillContratoTrasero(p);

        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/contratos/ContT-" + p.getCodigoEmpleado() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    }

    private String calculaEdad(Date fechaNacimiento) {

        String rs = "0";
        LocalDate fechaNac = fechaNacimiento.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate ahora = LocalDate.now();

        Period periodo = Period.between(fechaNac, ahora);

        rs = periodo.getYears() + " AÑOS";

        return rs;
    }

    public String convertFechas(Date f) {

        DateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
        String rs = dateFormat.format(f);

        return rs;
    }


    public String convertFechasLetras(Date f) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(f);

        String mes = "";

        int month = cal.get(Calendar.MONTH);

        if (month == Calendar.JANUARY) {
            mes = "ENERO";
        }
        if (month == Calendar.FEBRUARY) {
            mes = "FEBRERO";
        }
        if (month == Calendar.MARCH) {
            mes = "MARZO";
        }
        if (month == Calendar.APRIL) {
            mes = "ABRIL";
        }
        if (month == Calendar.MAY) {
            mes = "MAYO";
        }
        if (month == Calendar.JUNE) {
            mes = "JUNIO";
        }
        if (month == Calendar.JULY) {
            mes = "JULIO";
        }
        if (month == Calendar.AUGUST) {
            mes = "AGOSTO";
        }
        if (month == Calendar.SEPTEMBER) {
            mes = "SEPTIEMBRE";
        }
        if (month == Calendar.OCTOBER) {
            mes = "OCTUBRE";
        }
        if (month == Calendar.NOVEMBER) {
            mes = "NOVIEMBRE";
        }
        if (month == Calendar.DECEMBER) {
            mes = "DICIEMBRE";
        }

        String rs = cal.get(Calendar.DAY_OF_MONTH) + " DE " + mes + " DE " + cal.get(Calendar.YEAR);

        return rs;
    }


    public String obtenerMEs(Date f) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(f);

        String mes = "";

        int month = cal.get(Calendar.MONTH);

        if (month == Calendar.JANUARY) {
            mes = "ENERO";
        }
        if (month == Calendar.FEBRUARY) {
            mes = "FEBRERO";
        }
        if (month == Calendar.MARCH) {
            mes = "MARZO";
        }
        if (month == Calendar.APRIL) {
            mes = "ABRIL";
        }
        if (month == Calendar.MAY) {
            mes = "MAYO";
        }
        if (month == Calendar.JUNE) {
            mes = "JUNIO";
        }
        if (month == Calendar.JULY) {
            mes = "JULIO";
        }
        if (month == Calendar.AUGUST) {
            mes = "AGOSTO";
        }
        if (month == Calendar.SEPTEMBER) {
            mes = "SEPTIEMBRE";
        }
        if (month == Calendar.OCTOBER) {
            mes = "OCTUBRE";
        }
        if (month == Calendar.NOVEMBER) {
            mes = "NOVIEMBRE";
        }
        if (month == Calendar.DECEMBER) {
            mes = "DICIEMBRE";
        }

        String rs = mes;

        return rs;
    }

    private String departamentoPorSalas(String sucursalCodigo) {

        String rs = "SAN SALVADOR";


        switch (sucursalCodigo) {
            case "03":
                rs = "SOYAPANGO";
                break;
            case "04":
                rs = "SAN MIGUEL";
                break;
            case "05":
                rs = "USULUTAN";
                break;
            case "06":
                rs = "ZACATECOLUCA";
                break;
            case "07":
                rs = "SANTA ANA";
                break;
            case "08":
                rs = "SONSONATE";
                break;
            case "11":
                rs = "APOPA";
                break;
            default:
                break;

        }
        return rs;
    }

    private String tipoPagos(int tipoPago) {

        String rs = "";

        switch (tipoPago) {
            case 0:
                rs = "POR PLANILLA QUINCENAL";
                break;
            case 1:
                rs = "POR PLANILLA MENSUAL";
                break;
            case 2:
                rs = "POR PLANILLA QUINCENAL";//eventualplanilla
                break;
            default:
                break;
        }
        return rs;

    }

}
