aplicacion.control.RolDePagoClienteController.java Source code

Java tutorial

Introduction

Here is the source code for aplicacion.control.RolDePagoClienteController.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 aplicacion.control;

import aplicacion.control.tableModel.ControlTable;
import aplicacion.control.util.Const;
import aplicacion.control.util.Fecha;
import aplicacion.control.util.Fechas;
import aplicacion.control.util.MaterialDesignButtonBlue;
import aplicacion.control.util.Permisos;
import hibernate.HibernateSessionFactory;
import hibernate.dao.ActuarialesDAO;
import hibernate.dao.ClienteDAO;
import hibernate.dao.ConstanteDAO;
import hibernate.dao.HorarioDAO;
import hibernate.dao.RolClienteDAO;
import hibernate.dao.RolIndividualDAO;
import hibernate.dao.SeguroDAO;
import hibernate.dao.UniformeDAO;
import hibernate.model.Actuariales;
import hibernate.model.Cliente;
import hibernate.model.Constante;
import hibernate.model.Horario;
import hibernate.model.RolCliente;
import hibernate.model.RolIndividual;
import hibernate.model.Seguro;
import hibernate.model.Uniforme;
import hibernate.model.Usuario;
import java.io.IOException;
import java.net.URL;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.sql.Date;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.ResourceBundle;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.layout.VBoxBuilder;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import hibernate.dao.BonosDAO;
import hibernate.dao.DiasVacacionesDAO;
import hibernate.model.Bonos;
import hibernate.model.DiasVacaciones;
import static aplicacion.control.util.Numeros.round;
import hibernate.dao.ControlDiarioDAO;
import hibernate.dao.ControlExtrasDAO;
import hibernate.model.ControlDiario;
import hibernate.model.ControlExtras;
import javafx.scene.control.ChoiceBox;
import org.joda.time.DateTime;
import org.joda.time.Days;

/**
 *
 * @author Yornel
 */
public class RolDePagoClienteController implements Initializable {

    private Stage stagePrincipal;

    public AplicacionControl aplicacionControl;

    private Usuario empleado;

    public ArrayList<ControlDiario> controlesEmpleado;
    public ArrayList<ControlExtras> controlesHoras;
    private ArrayList<ControlTable> controlesDiarios;
    private ArrayList<ControlTable> controlesExtras;
    ////////////////////////////////////////////////////////////////////////////
    @FXML
    private TableView empleadosTableView;

    @FXML
    private TableColumn fechaColumna;

    @FXML
    private TableColumn clienteColumna;

    @FXML
    private TableColumn normalesColumna;

    @FXML
    private TableColumn observacionColumna;

    @FXML
    private TableColumn<ControlTable, ControlTable> marcarColumna;
    ////////////////////////////////////////////////////////////////////////////
    @FXML
    private TableView horasExtrasView;

    @FXML
    private TableColumn fechaColumnaE;

    @FXML
    private TableColumn clienteColumnaE;

    @FXML
    private TableColumn sobreTiempoColumna;

    @FXML
    private TableColumn recargoColumna;

    @FXML
    private TableColumn<ControlTable, ControlTable> marcarColumnaE;
    ////////////////////////////////////////////////////////////////////////////

    @FXML
    private Label totalDias;

    @FXML
    private Label totalHorasN;

    @FXML
    private Label totalHorasST;

    @FXML
    private Label totalHorasRC;

    @FXML
    private Label totalHorasExtras;

    @FXML
    private Label totalSalario;

    @FXML
    private Label totalSobreTiempo;

    @FXML
    private Label totalRecargo;

    @FXML
    private Label totalBonos;

    @FXML
    private Label subTotal;

    @FXML
    private Label totalReserva;

    @FXML
    private Label totalIngresos;

    @FXML
    private Button leyenda1;

    @FXML
    private Button leyenda2;

    @FXML
    private Button leyenda3;

    @FXML
    private Button expandirButton;

    @FXML
    private GridPane gridPaneTotal;

    @FXML
    private Button buttonAnterior;

    @FXML
    private Button buttonSiguiente;

    @FXML
    private Button buttonHorario;

    @FXML
    private Button buttonBorrar;

    @FXML
    private Button buttonHorarioE;

    @FXML
    private Button buttonBorrarE;

    @FXML
    private Button buttonGenerarRol;

    @FXML
    private CheckBox checkBoxMarcarTodos;

    @FXML
    private CheckBox checkBoxMarcarTodosE;

    @FXML
    private TextField bonoField;

    @FXML
    private TextField transporteField;

    @FXML
    private TextField vacacionesField;

    @FXML
    private TextField decimo3Field;

    @FXML
    private TextField decimo4Field;

    @FXML
    private TextField jubilacionField;

    @FXML
    private TextField aporteField;

    @FXML
    private TextField segurosField;

    @FXML
    private TextField uniformeField;

    @FXML
    private CheckBox checkBoxCasoEspecial;

    @FXML
    private ChoiceBox selectorDiaDe;

    @FXML
    private ChoiceBox selectorMesDe;

    @FXML
    private ChoiceBox selectorAnoDe;

    @FXML
    private ChoiceBox selectorDiaHa;

    @FXML
    private ChoiceBox selectorMesHa;

    @FXML
    private ChoiceBox selectorAnoHa;

    @FXML
    private Label indicacion1;

    public Cliente cliente;

    private ObservableList<ControlTable> data;

    private ObservableList<ControlTable> dataExtras;

    ArrayList<Usuario> usuarios;

    private RolCliente pago;

    private Boolean editable = true;

    private Button buttonchangeBono;

    List<Horario> horarios;
    List<Cliente> clientes;

    Fecha fin;
    Fecha inicio;

    Dialog<Void> dialog;
    private Uniforme uniforme;
    private Seguro seguro;
    private Bonos bonos;
    private Actuariales actuariales;
    private Constante constDecimoCuarto;
    private DiasVacaciones diasVacaciones;

    private Boolean casoEspecial = false;
    private Boolean variableVacaciones = false;

    public void setStagePrincipal(Stage stagePrincipal) {
        this.stagePrincipal = stagePrincipal;
    }

    public void setProgramaPrincipal(AplicacionControl aplicacionControl) {
        this.aplicacionControl = aplicacionControl;
    }

    @FXML
    public void cambiarBono(ActionEvent event) {

    }

    @FXML
    private void expandir(ActionEvent event) {
        if (expandirButton.getText().equalsIgnoreCase("Expandir")) {
            empleadosTableView.setPrefHeight(475);
            horasExtrasView.setPrefHeight(475);
            expandirButton.setText("Contraer");
            gridPaneTotal.setVisible(false);
        } else {
            empleadosTableView.setPrefHeight(240);
            horasExtrasView.setPrefHeight(240);
            expandirButton.setText("Expandir");
            gridPaneTotal.setVisible(true);
        }
    }

    @FXML
    public void onClickMore(ActionEvent event) {
        inicio = inicio.plusMonths(1);
        fin = fin.plusMonths(1);
        inicio.setToSpinner(selectorAnoDe, selectorMesDe, selectorDiaDe);
        fin.setToSpinner(selectorAnoHa, selectorMesHa, selectorDiaHa);
        mostrarRegistro();
    }

    @FXML
    public void onClickLess(ActionEvent event) {
        inicio = inicio.minusMonths(1);
        fin = fin.minusMonths(1);
        inicio.setToSpinner(selectorAnoDe, selectorMesDe, selectorDiaDe);
        fin.setToSpinner(selectorAnoHa, selectorMesHa, selectorDiaHa);
        mostrarRegistro();
    }

    @FXML
    public void onClickPago(ActionEvent event) {
        if (indicacion1.getText().equals("")) {
            if (editable) {
                if (aplicacionControl.permisos == null) {
                    aplicacionControl.noLogeado();
                } else {
                    if (aplicacionControl.permisos.getPermiso(Permisos.ROLES, Permisos.Nivel.CREAR)) {

                        String faltantes = "";

                        if (pago.getBono().equals(0d)) {
                            faltantes += "Sin bono.";
                        }
                        if (pago.getTransporte().equals(0d)) {
                            faltantes += " Sin transporte.";
                        }

                        Stage dialogStage = new Stage();
                        dialogStage.initModality(Modality.APPLICATION_MODAL);
                        dialogStage.setResizable(false);
                        dialogStage.setTitle("Pago " + new Fecha(pago.getInicio()).toStringInverse() + " a "
                                + new Fecha(pago.getFinalizo()).toStringInverse());
                        String stageIcon = AplicacionControl.class.getResource("imagenes/admin.png")
                                .toExternalForm();
                        dialogStage.getIcons().add(new Image(stageIcon));
                        Button buttonOk = new Button("ok");
                        Text falta = new Text(faltantes);
                        falta.setFill(Color.RED);
                        Text clienteText = new Text("para el cliente " + pago.getClienteNombre() + "?");
                        if (cliente == null)
                            clienteText.setText("Administrativo");
                        dialogStage
                                .setScene(new Scene(VBoxBuilder.create().spacing(15)
                                        .children(new Text("Desea generar el rol de pago del empleado "
                                                + pago.getEmpleado()), clienteText, falta, buttonOk)
                                        .alignment(Pos.CENTER).padding(new Insets(10)).build()));
                        buttonOk.setPrefWidth(50);
                        dialogStage.show();
                        buttonOk.setOnAction((ActionEvent e) -> {
                            generarPago();
                            dialogStage.close();

                        });

                    } else {
                        aplicacionControl.noPermitido();
                    }
                }
            } else {
                dialogError();
            }
        } else {
            Stage dialogStage = new Stage();
            dialogStage.initModality(Modality.APPLICATION_MODAL);
            dialogStage.setResizable(false);
            dialogStage.setTitle("");
            String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
            dialogStage.getIcons().add(new Image(stageIcon));
            Button buttonOk = new Button("ok");
            dialogStage.setScene(new Scene(VBoxBuilder.create().spacing(15)
                    .children(new Text("Despues de escribir los montos presiona enter."), buttonOk)
                    .alignment(Pos.CENTER).padding(new Insets(10)).build()));
            dialogStage.show();
            buttonOk.setOnAction((ActionEvent e) -> {
                dialogStage.close();
            });
        }
    }

    @FXML
    public void marcarCasoEspecial(ActionEvent event) {
        if (editable) {
            if (checkBoxCasoEspecial.isSelected()) {
                casoEspecial = true;
                enableCasoEspecial();
            } else {
                casoEspecial = false;
                disableCasoEspecial();
                setToTable(false);
            }
        }
    }

    public void generarPago() {

        pago.setCasoEspecial(casoEspecial);
        pago.setDetalles("");
        new RolClienteDAO().save(pago);

        // Registro para auditar
        String detalles;
        if (cliente != null)
            detalles = "genero un rol de pago al empleado " + empleado.getNombre() + " " + empleado.getApellido()
                    + " para el cliente " + pago.getClienteNombre();
        else
            detalles = "genero un rol de pago al empleado administrativo " + empleado.getNombre() + " "
                    + empleado.getApellido();

        aplicacionControl.au.saveAgrego(detalles, aplicacionControl.permisos.getUsuario());

        dialogCompletado();

    }

    public void dialogCompletado() {
        Stage dialogStage = new Stage();
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        dialogStage.setResizable(false);
        dialogStage.setTitle("Completado");
        String stageIcon = AplicacionControl.class.getResource("imagenes/completado.png").toExternalForm();
        dialogStage.getIcons().add(new Image(stageIcon));
        Button buttonOk = new Button("ok");
        dialogStage.setScene(new Scene(VBoxBuilder.create().spacing(15)
                .children(new Text("Rol de cliente guardado satisfactoriamente."), buttonOk).alignment(Pos.CENTER)
                .padding(new Insets(10)).build()));
        dialogStage.show();
        buttonOk.setOnAction((ActionEvent e) -> {
            dialogStage.close();
            stagePrincipal.close();
        });
    }

    public void dialogError() {
        Stage dialogStage = new Stage();
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        dialogStage.setResizable(false);
        dialogStage.setTitle("");
        String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
        dialogStage.getIcons().add(new Image(stageIcon));
        Button buttonOk = new Button("ok");
        dialogStage.setScene(new Scene(
                VBoxBuilder.create().spacing(15).children(new Text("No se puede editar este registro."), buttonOk)
                        .alignment(Pos.CENTER).padding(new Insets(10)).build()));
        dialogStage.show();
        buttonOk.setOnAction((ActionEvent e) -> {
            dialogStage.close();
        });
    }

    private void mostrarRegistro() {
        try {
            setControlEmpleadoInfo(empleado, inicio, fin);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @FXML
    public void cambiarHorarioVarios(ActionEvent event) throws IOException {
        ArrayList<ControlTable> diasMarcados = new ArrayList<>();
        for (ControlTable diaMarcado : (List<ControlTable>) data) {
            if (diaMarcado.getMarcar()) {
                diasMarcados.add(diaMarcado);
            }
        }

        if (!diasMarcados.isEmpty())
            abrirCambioMultiple(diasMarcados);
        else {
            Stage dialogStage = new Stage();
            dialogStage.initModality(Modality.APPLICATION_MODAL);
            dialogStage.setResizable(false);
            dialogStage.setTitle("");
            String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
            dialogStage.getIcons().add(new Image(stageIcon));
            Button buttonOk = new MaterialDesignButtonBlue("ok");
            dialogStage.setScene(new Scene(
                    VBoxBuilder.create().spacing(18).children(new Text("No has seleccionado ningun dia."), buttonOk)
                            .alignment(Pos.CENTER).padding(new Insets(20)).build()));
            dialogStage.show();
            buttonOk.setMaxWidth(60);
            buttonOk.setOnAction((ActionEvent e) -> {
                dialogStage.close();
            });
            buttonOk.setOnKeyPressed((KeyEvent event1) -> {
                dialogStage.close();
            });
        }
    }

    @FXML
    public void cambiarHorarioVariosE(ActionEvent event) throws IOException {
        ArrayList<ControlTable> diasMarcados = new ArrayList<>();
        for (ControlTable diaMarcado : (List<ControlTable>) dataExtras) {
            if (diaMarcado.getMarcar()) {
                diasMarcados.add(diaMarcado);
            }
        }

        if (!diasMarcados.isEmpty())
            abrirCambioMultipleExtras(diasMarcados);
        else {
            Stage dialogStage = new Stage();
            dialogStage.initModality(Modality.APPLICATION_MODAL);
            dialogStage.setResizable(false);
            dialogStage.setTitle("");
            String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
            dialogStage.getIcons().add(new Image(stageIcon));
            Button buttonOk = new MaterialDesignButtonBlue("ok");
            dialogStage.setScene(new Scene(
                    VBoxBuilder.create().spacing(18).children(new Text("No has seleccionado ningun dia."), buttonOk)
                            .alignment(Pos.CENTER).padding(new Insets(20)).build()));
            dialogStage.show();
            buttonOk.setMaxWidth(60);
            buttonOk.setOnAction((ActionEvent e) -> {
                dialogStage.close();
            });
            buttonOk.setOnKeyPressed((KeyEvent event1) -> {
                dialogStage.close();
            });
        }
    }

    public void abrirCambioMultiple(ArrayList<ControlTable> diasMarcados) throws IOException {
        if (editable) {
            if (aplicacionControl.permisos == null) {
                aplicacionControl.noLogeado();
            } else {
                if (aplicacionControl.permisos.getPermiso(Permisos.HORAS, Permisos.Nivel.VER)) {

                    FXMLLoader loader = new FXMLLoader(
                            AplicacionControl.class.getResource("ventanas/VentanaHorarioEmpleadoCliente.fxml"));
                    AnchorPane ventanaRolDePago = (AnchorPane) loader.load();
                    Stage ventana = new Stage();
                    ventana.setTitle("Multiples dias");
                    String stageIcon = AplicacionControl.class.getResource("imagenes/security_dialog.png")
                            .toExternalForm();
                    ventana.getIcons().add(new Image(stageIcon));
                    ventana.setResizable(false);
                    ventana.initOwner(stagePrincipal);
                    Scene scene = new Scene(ventanaRolDePago);
                    ventana.setScene(scene);
                    HorarioEmpleadoClienteController controller = loader.getController();
                    controller.setStagePrincipal(ventana);
                    controller.setRolDePagoCliente(this);
                    controller.setCliente(cliente);
                    controller.setEmpleadoMultiplesDias(empleado, diasMarcados, inicio, fin);
                    ventana.show();

                } else {
                    aplicacionControl.noPermitido();
                }
            }
        } else {
            dialogError();
        }
    }

    public void abrirCambioMultipleExtras(ArrayList<ControlTable> diasMarcados) throws IOException {
        if (editable) {
            if (aplicacionControl.permisos == null) {
                aplicacionControl.noLogeado();
            } else {
                if (aplicacionControl.permisos.getPermiso(Permisos.HORAS, Permisos.Nivel.VER)) {

                    FXMLLoader loader = new FXMLLoader(
                            AplicacionControl.class.getResource("ventanas/VentanaHorarioEmpleadoCliente.fxml"));
                    AnchorPane ventanaRolDePago = (AnchorPane) loader.load();
                    Stage ventana = new Stage();
                    ventana.setTitle("Multiples dias");
                    String stageIcon = AplicacionControl.class.getResource("imagenes/security_dialog.png")
                            .toExternalForm();
                    ventana.getIcons().add(new Image(stageIcon));
                    ventana.setResizable(false);
                    ventana.initOwner(stagePrincipal);
                    Scene scene = new Scene(ventanaRolDePago);
                    ventana.setScene(scene);
                    HorarioEmpleadoClienteController controller = loader.getController();
                    controller.setStagePrincipal(ventana);
                    controller.setRolDePagoCliente(this);
                    controller.setCliente(cliente);
                    controller.setEmpleadoMultiplesDiasExtras(empleado, diasMarcados, inicio, fin);
                    ventana.show();

                } else {
                    aplicacionControl.noPermitido();
                }
            }
        } else {
            dialogError();
        }
    }

    @FXML
    public void borrarHorarios(ActionEvent event) {
        ArrayList<ControlTable> diasMarcados = new ArrayList<>();
        for (ControlTable diaMarcado : (List<ControlTable>) data) {
            if (diaMarcado.getMarcar()) {
                diasMarcados.add(diaMarcado);
            }
        }

        if (!diasMarcados.isEmpty()) {
            borrarHoras(diasMarcados);
        } else {
            Stage dialogStage = new Stage();
            dialogStage.initModality(Modality.APPLICATION_MODAL);
            dialogStage.setResizable(false);
            dialogStage.setTitle("");
            String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
            dialogStage.getIcons().add(new Image(stageIcon));
            Button buttonOk = new MaterialDesignButtonBlue("ok");
            dialogStage.setScene(new Scene(
                    VBoxBuilder.create().spacing(18).children(new Text("No has seleccionado ningun dia."), buttonOk)
                            .alignment(Pos.CENTER).padding(new Insets(20)).build()));
            dialogStage.show();
            buttonOk.setMaxWidth(60);
            buttonOk.setOnAction((ActionEvent e) -> {
                dialogStage.close();
            });
            buttonOk.setOnKeyPressed((KeyEvent event1) -> {
                dialogStage.close();
            });
        }
    }

    @FXML
    public void borrarHorariosE(ActionEvent event) {
        ArrayList<ControlTable> diasMarcados = new ArrayList<>();
        for (ControlTable diaMarcado : (List<ControlTable>) dataExtras) {
            if (diaMarcado.getMarcar()) {
                diasMarcados.add(diaMarcado);
            }
        }
        if (!diasMarcados.isEmpty()) {
            borrarHorasExtras(diasMarcados);
        } else {
            Stage dialogStage = new Stage();
            dialogStage.initModality(Modality.APPLICATION_MODAL);
            dialogStage.setResizable(false);
            dialogStage.setTitle("");
            String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
            dialogStage.getIcons().add(new Image(stageIcon));
            Button buttonOk = new MaterialDesignButtonBlue("ok");
            dialogStage.setScene(new Scene(
                    VBoxBuilder.create().spacing(18).children(new Text("No has seleccionado ningun dia."), buttonOk)
                            .alignment(Pos.CENTER).padding(new Insets(20)).build()));
            dialogStage.show();
            buttonOk.setMaxWidth(60);
            buttonOk.setOnAction((ActionEvent e) -> {
                dialogStage.close();
            });
            buttonOk.setOnKeyPressed((KeyEvent event1) -> {
                dialogStage.close();
            });
        }
    }

    private void loadingMode() {
        dialog = new Dialog<>();
        dialog.initModality(Modality.WINDOW_MODAL);
        dialog.initOwner(stagePrincipal);//stage here is the stage of your webview
        dialog.initStyle(StageStyle.TRANSPARENT);
        Label loader = new Label("   Cargando, por favor espere...");
        loader.setContentDisplay(ContentDisplay.LEFT);
        loader.setGraphic(new ProgressIndicator());
        dialog.getDialogPane().setGraphic(loader);
        dialog.getDialogPane().setStyle("-fx-background-color: #E0E0E0;");
        dialog.getDialogPane().setPrefSize(250, 75);
        DropShadow ds = new DropShadow();
        ds.setOffsetX(1.3);
        ds.setOffsetY(1.3);
        ds.setColor(Color.DARKGRAY);
        dialog.getDialogPane().setEffect(ds);
        dialog.show();
    }

    public void closeDialogMode() {
        if (dialog != null) {
            Stage toClose = (Stage) dialog.getDialogPane().getScene().getWindow();
            toClose.close();
            dialog.close();
            dialog = null;
        }
    }

    @FXML
    public void marcarTodos(ActionEvent event) {
        for (ControlTable control : (List<ControlTable>) empleadosTableView.getItems()) {
            if (checkBoxMarcarTodos.isSelected()) {
                control.setMarcar(true);
            } else {
                control.setMarcar(false);
            }
            data.set(data.indexOf(control), control);
        }
    }

    @FXML
    public void marcarTodosE(ActionEvent event) {
        for (ControlTable control : (List<ControlTable>) horasExtrasView.getItems()) {
            if (checkBoxMarcarTodosE.isSelected()) {
                control.setMarcar(true);
            } else {
                control.setMarcar(false);
            }
            dataExtras.set(dataExtras.indexOf(control), control);
        }
    }

    private void horarioEmpleado(ControlDiario controlEmpleado, Fecha fecha) throws IOException {
        if (editable) {
            if (aplicacionControl.permisos == null) {
                aplicacionControl.noLogeado();
            } else {
                if (aplicacionControl.permisos.getPermiso(Permisos.HORAS, Permisos.Nivel.VER)) {

                    FXMLLoader loader = new FXMLLoader(
                            AplicacionControl.class.getResource("ventanas/VentanaHorarioEmpleadoCliente.fxml"));
                    AnchorPane ventanaRolDePago = (AnchorPane) loader.load();
                    Stage ventana = new Stage();
                    ventana.setTitle("Empleado: " + empleado.getApellido() + " " + empleado.getNombre());
                    String stageIcon = AplicacionControl.class.getResource("imagenes/security_dialog.png")
                            .toExternalForm();
                    ventana.getIcons().add(new Image(stageIcon));
                    ventana.setResizable(false);
                    ventana.initOwner(stagePrincipal);
                    Scene scene = new Scene(ventanaRolDePago);
                    ventana.setScene(scene);
                    HorarioEmpleadoClienteController controller = loader.getController();
                    controller.setStagePrincipal(ventana);
                    controller.setRolDePagoCliente(this);
                    controller.setStage(ventana);
                    controller.setCliente(cliente);
                    controller.setEmpleado(empleado, controlEmpleado, fecha, editable, inicio);
                    ventana.show();

                } else {
                    aplicacionControl.noPermitido();
                }
            }
        } else {
            dialogError();
        }
    }

    private void horarioExtras(ControlExtras controlExtras, DateTime dateTime) throws IOException {
        if (editable) {
            if (aplicacionControl.permisos == null) {
                aplicacionControl.noLogeado();
            } else {
                if (aplicacionControl.permisos.getPermiso(Permisos.HORAS, Permisos.Nivel.VER)) {

                    FXMLLoader loader = new FXMLLoader(
                            AplicacionControl.class.getResource("ventanas/VentanaHorarioEmpleadoCliente.fxml"));
                    AnchorPane ventanaRolDePago = (AnchorPane) loader.load();
                    Stage ventana = new Stage();
                    ventana.setTitle("Empleado: " + empleado.getApellido() + " " + empleado.getNombre());
                    String stageIcon = AplicacionControl.class.getResource("imagenes/security_dialog.png")
                            .toExternalForm();
                    ventana.getIcons().add(new Image(stageIcon));
                    ventana.setResizable(false);
                    ventana.initOwner(stagePrincipal);
                    Scene scene = new Scene(ventanaRolDePago);
                    ventana.setScene(scene);
                    HorarioEmpleadoClienteController controller = loader.getController();
                    controller.setStagePrincipal(ventana);
                    controller.setRolDePagoCliente(this);
                    controller.setStage(ventana);
                    controller.setCliente(cliente);
                    controller.setEmpleado(empleado, controlExtras, dateTime, editable, inicio);
                    ventana.show();

                } else {
                    aplicacionControl.noPermitido();
                }
            }
        } else {
            dialogError();
        }
    }

    private void borrarHoras(ArrayList<ControlTable> diasMarcados) {
        if (editable)
            if (aplicacionControl.permisos == null) {
                aplicacionControl.noLogeado();
            } else {
                Stage dialogStage = new Stage();
                dialogStage.initModality(Modality.APPLICATION_MODAL);
                dialogStage.setResizable(false);
                dialogStage.setTitle("");
                String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
                dialogStage.getIcons().add(new Image(stageIcon));
                MaterialDesignButtonBlue buttonOk = new MaterialDesignButtonBlue("Si");
                MaterialDesignButtonBlue buttonNo = new MaterialDesignButtonBlue("no");
                HBox hBox = HBoxBuilder.create().spacing(10.0) //In case you are using HBoxBuilder
                        .padding(new Insets(5, 5, 5, 5)).alignment(Pos.CENTER).children(buttonOk, buttonNo).build();
                hBox.maxWidth(120);
                dialogStage.setScene(new Scene(VBoxBuilder.create().spacing(15)
                        .children(new Text("Seguro que desea borrar estos horarios?"), hBox).alignment(Pos.CENTER)
                        .padding(new Insets(20)).build()));
                buttonOk.setMinWidth(50);
                buttonNo.setMinWidth(50);
                buttonOk.setOnAction((ActionEvent e) -> {
                    ExecutorService executor = Executors.newFixedThreadPool(1);
                    Runnable worker = new RolDePagoClienteController.DataBaseThread(1);
                    executor.execute(worker);
                    executor.shutdown();

                    loadingMode();
                    dialogStage.close();
                });
                buttonNo.setOnAction((ActionEvent e) -> {
                    dialogStage.close();
                });
                dialogStage.showAndWait();
            }
        else {
            dialogError();
        }
    }

    private void borrarHorasExtras(ArrayList<ControlTable> diasMarcados) {
        if (editable)
            if (aplicacionControl.permisos == null) {
                aplicacionControl.noLogeado();
            } else {
                Stage dialogStage = new Stage();
                dialogStage.initModality(Modality.APPLICATION_MODAL);
                dialogStage.setResizable(false);
                dialogStage.setTitle("");
                String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
                dialogStage.getIcons().add(new Image(stageIcon));
                MaterialDesignButtonBlue buttonOk = new MaterialDesignButtonBlue("Si");
                MaterialDesignButtonBlue buttonNo = new MaterialDesignButtonBlue("no");
                HBox hBox = HBoxBuilder.create().spacing(10.0) //In case you are using HBoxBuilder
                        .padding(new Insets(5, 5, 5, 5)).alignment(Pos.CENTER).children(buttonOk, buttonNo).build();
                hBox.maxWidth(120);
                dialogStage.setScene(new Scene(VBoxBuilder.create().spacing(15)
                        .children(new Text("Seguro que desea borrar estos horarios?"), hBox).alignment(Pos.CENTER)
                        .padding(new Insets(20)).build()));
                buttonOk.setMinWidth(50);
                buttonNo.setMinWidth(50);
                buttonOk.setOnAction((ActionEvent e) -> {
                    ExecutorService executor = Executors.newFixedThreadPool(1);
                    Runnable worker = new RolDePagoClienteController.DataBaseThread(2);
                    executor.execute(worker);
                    executor.shutdown();

                    loadingMode();
                    dialogStage.close();
                });
                buttonNo.setOnAction((ActionEvent e) -> {
                    dialogStage.close();
                });
                dialogStage.showAndWait();
            }
        else {
            dialogError();
        }
    }

    public void guardarRegistro(Usuario empleado, Double suplementarias, Double sobreTiempo, Cliente cliente,
            Fecha fecha, Boolean libre, Boolean falta) throws ParseException {
        ControlDiarioDAO controlEmpleadoDAO = new ControlDiarioDAO();
        ControlDiario controlEmpleado = new ControlDiario();
        controlEmpleado.setFecha(fecha.getFecha());
        controlEmpleado.setUsuario(empleado);
        controlEmpleado.setSobretiempo(sobreTiempo);
        controlEmpleado.setRecargo(suplementarias);
        controlEmpleado.setCliente(cliente);
        controlEmpleadoDAO.save(controlEmpleado);
        setControlEmpleadoInfo(this.empleado, new Fecha(selectorAnoDe, selectorMesDe, selectorDiaDe),
                new Fecha(selectorAnoHa, selectorMesHa, selectorDiaHa));

        // Registro para auditar
        String detalles = "agrego un registro diario al empleado " + empleado.getNombre() + " "
                + empleado.getApellido() + " con fecha " + fecha.toStringInverse();
        aplicacionControl.au.saveAgrego(detalles, aplicacionControl.permisos.getUsuario());
    }

    public void cambiarControlEmpleado(ControlDiario control) {
        Boolean agregar = true;
        for (ControlDiario controlEmpleado : controlesEmpleado) {
            if (controlEmpleado.getFecha().equals(control.getFecha())) {
                controlesEmpleado.set(controlesEmpleado.indexOf(controlEmpleado), control);
                agregar = false;
            }
        }
        if (agregar)
            controlesEmpleado.add(control);

        clearControlesDiarios();
        setToTable(false);
    }

    public void cambiarControlExtras(ControlExtras control) {
        Boolean agregar = true;
        for (ControlExtras controlEmpleado : controlesHoras) {
            if (controlEmpleado.getFecha().getTime() == control.getFecha().getTime()) {
                controlesHoras.set(controlesHoras.indexOf(controlEmpleado), control);
                agregar = false;
            }
        }
        if (agregar)
            controlesHoras.add(control);

        clearControlesExtras();
        setToTable(false);
    }

    public void quitarControlEmpleado(ControlTable controlTableDelete) {
        System.out.println("borrando control " + controlTableDelete.getFechaString());
        ControlDiario control = controlTableDelete.getControlDiario();

        for (ControlTable controlTable : controlesDiarios) {
            if (controlTable.getFecha().getFecha().equals(control.getFecha())) {
                ControlTable controlDiarioEmpty = new ControlTable();
                controlDiarioEmpty.setMarcar(controlTableDelete.getMarcar());
                controlDiarioEmpty.setFecha(controlTableDelete.getFecha());
                controlDiarioEmpty.setFechaString(controlDiarioEmpty.getFecha().toStringInverse());
                controlDiarioEmpty.setDia(controlDiarioEmpty.getFecha().getMonthName());
                controlesDiarios.set(controlesDiarios.indexOf(controlTable), controlDiarioEmpty);
            }
        }
        controlesEmpleado.remove(control);
    }

    public void quitarControlEmpleadoExtras(ControlTable controlTableDelete) {
        System.out.println("borrando control extras " + controlTableDelete.getFechaString());
        ControlExtras control = controlTableDelete.getControlExtras();

        for (ControlTable controlTable : controlesExtras) {
            if (controlTable.getFechaExtra().getMillis() == control.getFecha().getTime()) {
                ControlTable controlDiarioEmpty = new ControlTable();
                controlDiarioEmpty.setMarcar(controlTableDelete.getMarcar());
                controlDiarioEmpty.setFechaExtra(controlTableDelete.getFechaExtra());
                controlDiarioEmpty.setFechaString(controlTableDelete.getFechaExtra().toString("dd-MM-yyyy")); // QUITADO
                controlesExtras.set(controlesExtras.indexOf(controlTable), controlDiarioEmpty);
            }
        }
        controlesHoras.remove(control);
    }

    @FXML
    public void calcularVacaciones(ActionEvent event) {
        if (casoEspecial) {
            variableVacaciones = true;
            casoEspecial = false;
            setToTable(false);
            variableVacaciones = false;
            casoEspecial = true;
        } else {
            setToTable(false);
        }
    }

    @FXML
    public void calcularHoras(ActionEvent event) {
        setToTable(false);
    }

    public void setEmpleado(Usuario empleado, Cliente cliente, Fecha inicio, Fecha fin) throws ParseException {
        this.empleado = empleado;
        this.cliente = cliente;
        this.inicio = inicio;
        this.fin = fin;

        inicio.setToSpinner(selectorAnoDe, selectorMesDe, selectorDiaDe);
        fin.setToSpinner(selectorAnoHa, selectorMesHa, selectorDiaHa);

        horarios = (List<Horario>) new HorarioDAO().findAll();
        clientes = new ClienteDAO().findAllActivo();

        setControlEmpleadoInfo(empleado, inicio, fin);
    }

    public void setControlEmpleadoInfo(Usuario empleado, Fecha inicio, Fecha fin) {

        ControlDiarioDAO controlDAO = new ControlDiarioDAO();
        ControlExtrasDAO extrasDAO = new ControlExtrasDAO();

        Fecha fechaInicial = new Fecha(inicio.getFecha()); // dias anteriores de horas extras 
        Fecha fechaFinal = new Fecha(fin.getFecha());

        int days = (int) fechaInicial.daysDifference(fechaFinal);

        controlesDiarios = new ArrayList<>();

        for (int i = 0; i <= days; i++) {
            ControlTable controlTable = new ControlTable();
            controlTable.setFecha(fechaInicial.plusDays(i));
            controlTable.setFechaString(controlTable.getFecha().toStringInverse());
            controlTable.setDia(controlTable.getFecha().getMonthName());
            controlesDiarios.add(controlTable);
        }

        System.out.println("dias " + controlesDiarios.size());
        controlesEmpleado = new ArrayList<>();
        controlesEmpleado.addAll(controlDAO.findAllByEmpleadoIdInDeterminateTime(empleado.getId(),
                fechaInicial.getFecha(), fechaFinal.getFecha()));

        ////////////////////////////////////////////////////////////////////////////////////////
        Date fechaInicialExtra = fechaInicial.minusDays(7).getDate(); // dias anteriores de horas extras 
        Date fechaFinalExtra = fechaFinal.minusDays(7).getDate();
        System.out.println("fecha inicio a mostrar para horas extras " + fechaInicialExtra.toString());
        System.out.println("fecha final a mostrar para horas extras " + fechaFinalExtra.toString());
        DateTime dateA = new DateTime(fechaInicialExtra.getTime());
        DateTime dateB = new DateTime(fechaFinalExtra.getTime());

        int daysE = Days.daysBetween(dateA.withTimeAtStartOfDay(), dateB.withTimeAtStartOfDay()).getDays();

        controlesExtras = new ArrayList<>();

        for (int i = 0; i <= daysE; i++) {
            ControlTable controlTable = new ControlTable();
            controlTable.setFechaExtra(dateA.plusDays(i));
            controlTable.setFechaString(dateA.plusDays(i).toString("dd-MM-yyyy")); // QUITADO extrano problema en java.sql.date que lo deja con un mes mas del real, se deberia optimizar y acomodar el error, de momento se solvento diminuyendo un mes antes de pasar a string
            controlesExtras.add(controlTable);
        }

        controlesHoras = new ArrayList<>();
        controlesHoras.addAll(extrasDAO.findAllByEmpleadoIdInDeterminateTime(empleado.getId(), fechaInicialExtra,
                fechaFinalExtra));
        System.out.println("cantidad de controles de horas extras " + controlesHoras.size());
        setToTable(true);
    }

    void setToTable(Boolean searchRol) {

        Double dias = 0d;
        Double diasDecimo4to = 0d;
        Double diasJubilacion = 0d;
        Double normales = 0d;
        Double sobreTiempo = 0d;
        Double suplementarias = 0d;
        Integer medioDias = 0;
        int descansosMedicos = 0;

        for (ControlTable controlDiario : controlesDiarios) {

            for (ControlDiario control : controlesEmpleado) {
                if (controlDiario.getFecha().getFecha().equals(control.getFecha())) {

                    controlDiario.setControlEmpleado(control);

                    controlDiario.setId(control.getId());
                    if (control.getCliente() != null) {
                        controlDiario.setCliente(control.getCliente().getNombre());
                    }

                    controlDiario.setNormales(control.getNormales());
                    controlDiario.setSobreTiempo(control.getSobretiempo());
                    controlDiario.setRecargo(control.getRecargo());

                    if (!control.getCaso().equals(Const.DM)) {
                        descansosMedicos = 0;
                    }

                    if (control.getCaso().equals(Const.LIBRE)) {
                        controlDiario.setObservacion("Libre");
                    } else if (control.getCaso().equals(Const.FALTA)) {
                        controlDiario.setObservacion("Falta");
                    } else if (control.getCaso().equals(Const.VACACIONES)) {
                        controlDiario.setObservacion("Vacaciones");
                    } else if (control.getCaso().equals(Const.PERMISO)) {
                        controlDiario.setObservacion("Permiso");
                    } else if (control.getCaso().equals(Const.DM)) {
                        controlDiario.setObservacion("D. Medico");
                        descansosMedicos++;

                        if (descansosMedicos > 3) {
                            controlDiario.setNormales(0d);
                            controlDiario.setSobreTiempo(0d);
                            controlDiario.setRecargo(0d);
                        }
                    } else if (control.getCaso().equals(Const.CM)) {
                        controlDiario.setObservacion("C. Medica");
                    } else if (control.getMedioDia()) {
                        controlDiario.setObservacion("1/2 Dia");
                    }

                    if (cliente == null && control.getCliente() == null
                            || cliente != null && control.getCliente() != null
                                    && cliente.getId().equals(control.getCliente().getId())) {

                        if (control.getMedioDia()) {
                            medioDias++;
                        }

                        if (control.getCaso().equalsIgnoreCase(Const.TRABAJO)
                                || control.getCaso().equalsIgnoreCase(Const.LIBRE)
                                || control.getCaso().equalsIgnoreCase(Const.CM)) {

                            dias += 1;
                            normales = control.getMedioDia() ? normales + 4 : normales + 8;

                        } else if (control.getCaso().equalsIgnoreCase(Const.DM)) {
                            if (descansosMedicos <= 3) {
                                dias += 1;
                                normales = control.getMedioDia() ? normales + 4 : normales + 8;
                            }
                        }

                        if (control.getCaso().equalsIgnoreCase(Const.TRABAJO)
                                || control.getCaso().equalsIgnoreCase(Const.VACACIONES)
                                || control.getCaso().equalsIgnoreCase(Const.PERMISO)
                                || control.getCaso().equalsIgnoreCase(Const.LIBRE)
                                || control.getCaso().equalsIgnoreCase(Const.CM)
                                || control.getCaso().equalsIgnoreCase(Const.DM)) {

                            diasJubilacion += 1;

                        }

                        if (control.getCaso().equalsIgnoreCase(Const.TRABAJO)
                                || control.getCaso().equalsIgnoreCase(Const.VACACIONES)
                                || control.getCaso().equalsIgnoreCase(Const.LIBRE)
                                || control.getCaso().equalsIgnoreCase(Const.CM)
                                || control.getCaso().equalsIgnoreCase(Const.DM)) {

                            diasDecimo4to += 1;

                        }

                        controlDiario.setSobreTiempo(null);
                        controlDiario.setRecargo(null);

                    } else {
                        controlDiario.setAjeno(true);
                    }
                }
            }
        }

        data = FXCollections.observableArrayList();
        data.addAll(controlesDiarios);
        empleadosTableView.setItems(data);

        /////////////////////////////////////////////////////////////////////////

        for (ControlTable controlExtra : controlesExtras) {

            for (ControlExtras control : controlesHoras) {
                DateTime fechaActual = new DateTime(control.getFecha().getTime());
                if (controlExtra.getFechaExtra().getMillis() == fechaActual.getMillis()) {

                    controlExtra.setControlExtras(control);
                    controlExtra.setId(control.getId());
                    if (control.getCliente() != null) {
                        controlExtra.setCliente(control.getCliente().getNombre());
                    }

                    controlExtra.setSobreTiempo(control.getSobretiempo());
                    controlExtra.setRecargo(control.getRecargo());

                    if (cliente == null && control.getCliente() == null
                            || cliente != null && control.getCliente() != null
                                    && cliente.getId().equals(control.getCliente().getId())) {

                        sobreTiempo += control.getSobretiempo();
                        suplementarias += control.getRecargo();
                    } else {
                        controlExtra.setAjeno(true);
                    }
                }
            }
        }

        dataExtras = FXCollections.observableArrayList();
        dataExtras.addAll(controlesExtras);
        horasExtrasView.setItems(dataExtras);

        indicacion1.setText("");
        calcularPago(dias, diasDecimo4to, diasJubilacion, normales, sobreTiempo, suplementarias, searchRol,
                medioDias);
    }

    public void calcularPago(Double dias, Double diasDecimo4to, Double diasJubilacion, Double normales,
            Double sobreTiempo, Double suplementarias, Boolean searchRol, Integer medioDias) {

        pago = null;

        Double sueldoDia = empleado.getDetallesEmpleado().getSueldo() / 30d;
        Double sueldoHoras = empleado.getDetallesEmpleado().getSueldo() / 240d;

        normales = round(normales);
        sobreTiempo = round(sobreTiempo);
        suplementarias = round(suplementarias);

        totalDias.setText(dias.intValue() + "");
        totalHorasN.setText(normales.toString());
        totalHorasRC.setText(suplementarias.toString());
        totalHorasST.setText(sobreTiempo.toString());
        totalHorasExtras.setText(round(sobreTiempo + suplementarias).toString());

        // Salario
        Double totalSalarioDouble = round(sueldoHoras * normales);
        totalSalario.setText(totalSalarioDouble.toString());
        Double totalSobreTiempoDouble = round(sueldoHoras * sobreTiempo);
        totalSobreTiempo.setText(totalSobreTiempoDouble.toString());
        Double totalRecargoDouble = round(sueldoHoras * suplementarias);
        totalRecargo.setText(totalRecargoDouble.toString());
        Double totalBonoDouble = round(getBono(searchRol));
        bonoField.setText(totalBonoDouble.toString());
        Double totalTransporteDouble = round(getTransporte(searchRol));
        transporteField.setText(totalTransporteDouble.toString());
        Double totalBonosDouble = round(totalBonoDouble + totalTransporteDouble);
        totalBonos.setText(totalBonosDouble.toString());
        Double totalVacacionesDouble;
        Double sueldoSinVacaciones = totalSalarioDouble + totalSobreTiempoDouble + totalRecargoDouble
                + totalBonoDouble + totalTransporteDouble;
        if (variableVacaciones)
            totalVacacionesDouble = round(vacacionesField.getText());
        else
            totalVacacionesDouble = casoEspecial ? round(vacacionesField.getText())
                    : round(getVacaciones(sueldoSinVacaciones, searchRol));
        vacacionesField.setText(totalVacacionesDouble.toString());
        Double subTotalDouble = round(totalSalarioDouble + totalSobreTiempoDouble + totalRecargoDouble
                + totalBonosDouble + totalVacacionesDouble);
        subTotal.setText(subTotalDouble.toString());
        ////////////////////////////////////////////////////
        Double decimoTercero = casoEspecial ? round(decimo3Field.getText()) : round(subTotalDouble / 12d);
        decimo3Field.setText(decimoTercero.toString());
        Double decimoCuarto = casoEspecial ? round(decimo4Field.getText())
                : round(getDecimoCuarto(searchRol) / 30d * diasDecimo4to);
        decimo4Field.setText(decimoCuarto.toString());
        totalReserva.setText(decimoTercero.toString());
        Double jubilacionPatronal = casoEspecial ? round(jubilacionField.getText())
                : round((getActuariales(empleado.getId(), searchRol) / 360d) * diasJubilacion);
        jubilacionField.setText(jubilacionPatronal.toString());
        Double aportePatronal = casoEspecial ? round(aporteField.getText()) : round(subTotalDouble * 12.15d / 100d);
        aporteField.setText(aportePatronal.toString());
        Double segurosDecimal = casoEspecial ? round(segurosField.getText()) : round(getSeguro(searchRol) * dias);
        segurosField.setText(segurosDecimal.toString());
        Double uniformeDecimal = casoEspecial ? round(uniformeField.getText())
                : round(getUniforme(searchRol) * dias);
        uniformeField.setText(uniformeDecimal.toString());

        Double ingresoTotal = round(subTotalDouble + decimoTercero + decimoCuarto + decimoTercero
                + jubilacionPatronal + aportePatronal + segurosDecimal + uniformeDecimal);
        totalIngresos.setText(ingresoTotal.toString());

        if (searchRol) {
            if (cliente != null)
                pago = new RolClienteDAO().findByFechaAndEmpleadoIdAndClienteId(inicio.getFecha(),
                        this.empleado.getId(), this.cliente.getId());
            else
                pago = new RolClienteDAO().findByFechaAndEmpleadoIdSinCliente(inicio.getFecha(),
                        this.empleado.getId());
        }

        if (pago == null) {

            RolIndividual rolIndividual = null;

            if (searchRol) {
                rolIndividual = new RolIndividualDAO().findByFechaAndEmpleadoIdAndDetalles(inicio.getFecha(),
                        empleado.getId(), Const.ROL_PAGO_INDIVIDUAL);
            }

            if (rolIndividual == null) {
                pago = new RolCliente();
                pago.setFecha(Fechas.getToday());
                pago.setInicio(inicio.getFecha());
                pago.setFinalizo(fin.getFecha());
                pago.setDias(dias);
                pago.setHorasNormales(normales);
                pago.setHorasSuplementarias(suplementarias); // RC
                pago.setHorasSobreTiempo(sobreTiempo); // ST
                pago.setTotalHorasExtras(sobreTiempo + suplementarias);
                pago.setSalario(totalSalarioDouble);
                pago.setMontoHorasSuplementarias(totalRecargoDouble);
                pago.setMontoHorasSobreTiempo(totalSobreTiempoDouble);
                pago.setBono(totalBonoDouble);
                pago.setTransporte(totalTransporteDouble);
                pago.setTotalBonos(totalBonosDouble);
                pago.setVacaciones(totalVacacionesDouble);
                pago.setSubtotal(subTotalDouble);
                pago.setDecimoTercero(decimoTercero);
                pago.setDecimoCuarto(decimoCuarto);
                pago.setJubilacionPatronal(jubilacionPatronal);
                pago.setAportePatronal(aportePatronal);
                pago.setSeguros(segurosDecimal);
                pago.setUniformes(uniformeDecimal);
                pago.setTotalIngreso(ingresoTotal);
                pago.setEmpleado(empleado.getNombre() + " " + empleado.getApellido());
                pago.setCedula(empleado.getCedula());
                pago.setEmpresa(empleado.getDetallesEmpleado().getEmpresa().getNombre());
                pago.setSueldo(empleado.getDetallesEmpleado().getSueldo());
                pago.setUsuario(empleado);
                pago.setCliente(cliente);
                if (cliente != null)
                    pago.setClienteNombre(this.cliente.getNombre());

                checkBoxCasoEspecial.setDisable(false);
                editable = true;
            } else {
                checkBoxCasoEspecial.setDisable(true);
                editable = false;
            }
        } else {
            editable = false;
            vacacionesField.setText(pago.getVacaciones().toString());
            bonoField.setText(pago.getBono().toString());
            transporteField.setText(pago.getTransporte().toString());
            totalBonos.setText(pago.getTotalBonos().toString());
            subTotal.setText(pago.getSubtotal().toString());
            decimo3Field.setText(pago.getDecimoTercero().toString());
            decimo4Field.setText(pago.getDecimoCuarto().toString());
            totalReserva.setText(pago.getDecimoTercero().toString());
            jubilacionField.setText(pago.getJubilacionPatronal().toString());
            aporteField.setText(pago.getAportePatronal().toString());
            segurosField.setText(pago.getSeguros().toString());
            uniformeField.setText(pago.getUniformes().toString());
            totalIngresos.setText(pago.getTotalIngreso().toString());
            if (pago.getCasoEspecial())
                checkBoxCasoEspecial.setSelected(true);
            else
                checkBoxCasoEspecial.setSelected(false);

            checkBoxCasoEspecial.setDisable(true);
        }

        buttonGenerarRol.setVisible(editable);
        if (editable) {
            bonoField.setEditable(false);
            transporteField.setEditable(false);
            bonoField.setDisable(true);
            transporteField.setDisable(true);
        } else {
            bonoField.setEditable(false);
            transporteField.setEditable(true);
            bonoField.setDisable(true);
            transporteField.setDisable(true);
        }
    }

    void clearControlesDiarios() {
        for (ControlTable controlTable : controlesDiarios) {
            ControlTable controlDiarioEmpty = new ControlTable();
            controlDiarioEmpty.setMarcar(controlTable.getMarcar());
            controlDiarioEmpty.setFecha(controlTable.getFecha());
            controlDiarioEmpty.setFechaString(controlDiarioEmpty.getFecha().toStringInverse());
            controlDiarioEmpty.setDia(controlDiarioEmpty.getFecha().getMonthName());
            controlesDiarios.set(controlesDiarios.indexOf(controlTable), controlDiarioEmpty);
        }
    }

    void clearControlesExtras() {
        for (ControlTable controlTable : controlesExtras) {
            ControlTable controlDiarioEmpty = new ControlTable();
            controlDiarioEmpty.setMarcar(controlTable.getMarcar());
            controlDiarioEmpty.setFechaExtra(controlTable.getFechaExtra());
            controlDiarioEmpty.setFechaString(controlTable.getFechaExtra().toString("dd-MM-yyyy")); // QUITADO igual momentaneo
            controlesExtras.set(controlesExtras.indexOf(controlTable), controlDiarioEmpty);
        }
    }

    public void updateWindows() {
        closeDialogMode();
        calcularHoras(null);
        borradoCompletado();
    }

    public void borradoCompletado() {
        Stage dialogStage = new Stage();
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        dialogStage.setResizable(false);
        dialogStage.setTitle("");
        String stageIcon = AplicacionControl.class.getResource("imagenes/completado.png").toExternalForm();
        dialogStage.getIcons().add(new Image(stageIcon));
        Button buttonOk = new MaterialDesignButtonBlue("ok");
        dialogStage.setScene(new Scene(
                VBoxBuilder.create().spacing(20).children(new Text("Se borraron los horarios con exito."), buttonOk)
                        .alignment(Pos.CENTER).padding(new Insets(10)).build()));
        buttonOk.setMaxWidth(50);
        buttonOk.setOnAction((ActionEvent e) -> {
            dialogStage.close();
        });
        buttonOk.setOnKeyPressed((KeyEvent event1) -> {
            dialogStage.close();
        });
        dialogStage.show();
    }

    public void error() {
        closeDialogMode();

        Stage dialogStage = new Stage();
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        dialogStage.setResizable(false);
        dialogStage.setTitle("");
        String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
        dialogStage.getIcons().add(new Image(stageIcon));
        Button buttonOk = new MaterialDesignButtonBlue("ok");
        dialogStage.setScene(new Scene(
                VBoxBuilder.create().spacing(18).children(new Text("Hubo un error en el proceso."), buttonOk)
                        .alignment(Pos.CENTER).padding(new Insets(20)).build()));
        dialogStage.show();
        buttonOk.setMaxWidth(60);
        buttonOk.setOnAction((ActionEvent e) -> {
            dialogStage.close();
        });
        buttonOk.setOnKeyPressed((KeyEvent event1) -> {
            dialogStage.close();
        });
    }

    public void hayRolCliente() {
        closeDialogMode();

        Stage dialogStage = new Stage();
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        dialogStage.setResizable(false);
        dialogStage.setTitle("");
        String stageIcon = AplicacionControl.class.getResource("imagenes/icon_error.png").toExternalForm();
        dialogStage.getIcons().add(new Image(stageIcon));
        Button buttonOk = new MaterialDesignButtonBlue("ok");
        dialogStage.setScene(new Scene(VBoxBuilder.create().spacing(18)
                .children(new Text("No se puede eliminar los horarios por que hay un rol cliente generado."),
                        buttonOk)
                .alignment(Pos.CENTER).padding(new Insets(20)).build()));
        dialogStage.show();
        buttonOk.setMaxWidth(60);
        buttonOk.setOnAction((ActionEvent e) -> {
            dialogStage.close();
        });
        buttonOk.setOnKeyPressed((KeyEvent event1) -> {
            dialogStage.close();
        });
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        empleadosTableView.setEditable(Boolean.FALSE);
        horasExtrasView.setEditable(Boolean.FALSE);

        bonoField.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        transporteField.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        vacacionesField.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        decimo3Field.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        decimo4Field.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        jubilacionField.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        aporteField.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        segurosField.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());
        uniformeField.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilterAndUpdate());

        disableCasoEspecial();

        buttonAnterior.setTooltip(new Tooltip("Mes Anterior"));
        buttonAnterior.setOnMouseEntered((MouseEvent t) -> {
            buttonAnterior.setStyle("-fx-background-color: #29B6F6;");
        });
        buttonAnterior.setOnMouseExited((MouseEvent t) -> {
            buttonAnterior.setStyle("-fx-background-color: #039BE5;");
        });
        buttonSiguiente.setTooltip(new Tooltip("Mes Siguiente"));
        buttonSiguiente.setOnMouseEntered((MouseEvent t) -> {
            buttonSiguiente.setStyle("-fx-background-color: #29B6F6;");
        });
        buttonSiguiente.setOnMouseExited((MouseEvent t) -> {
            buttonSiguiente.setStyle("-fx-background-color: #039BE5;");
        });

        buttonHorario.setTooltip(new Tooltip("Cambiar horario a varios"));
        buttonHorario.setOnMouseEntered((MouseEvent t) -> {
            buttonHorario.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_reloj.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: #29B6F6;");
        });
        buttonHorario.setOnMouseExited((MouseEvent t) -> {
            buttonHorario.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_reloj.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: transparent;");
        });
        buttonBorrar.setOnMouseEntered((MouseEvent t) -> {
            buttonBorrar.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: #29B6F6;");
        });
        buttonBorrar.setOnMouseExited((MouseEvent t) -> {
            buttonBorrar.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: transparent;");
        });
        /////////////////////////////////////////////////////////////////
        buttonHorarioE.setTooltip(new Tooltip("Cambiar horario a varios"));
        buttonHorarioE.setOnMouseEntered((MouseEvent t) -> {
            buttonHorarioE.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_reloj.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: #29B6F6;");
        });
        buttonHorarioE.setOnMouseExited((MouseEvent t) -> {
            buttonHorarioE.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_reloj.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: transparent;");
        });
        buttonBorrarE.setOnMouseEntered((MouseEvent t) -> {
            buttonBorrarE.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: #29B6F6;");
        });
        buttonBorrarE.setOnMouseExited((MouseEvent t) -> {
            buttonBorrarE.setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar.png'); "
                    + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                    + "-fx-background-color: transparent;");
        });

        fechaColumna.setCellValueFactory(new PropertyValueFactory<>("fechaString"));

        clienteColumna.setCellValueFactory(new PropertyValueFactory<>("cliente"));

        normalesColumna.setCellValueFactory(new PropertyValueFactory<>("normales"));

        observacionColumna.setCellValueFactory(new PropertyValueFactory<>("observacion"));

        marcarColumna.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()));
        marcarColumna.setCellFactory(param -> new TableCell<ControlTable, ControlTable>() {
            private final CheckBox checkBoxMarcar = new CheckBox();

            @Override
            protected void updateItem(ControlTable controlTable, boolean empty) {
                super.updateItem(controlTable, empty);

                if (controlTable == null) {
                    setGraphic(null);
                    getTableRow().setStyle("");
                    return;
                }

                setGraphic(checkBoxMarcar);

                checkBoxMarcar.setOnAction(event -> {
                    controlTable.setMarcar(checkBoxMarcar.isSelected());
                });

                if (controlTable.getMarcar()) {
                    checkBoxMarcar.setSelected(true);
                } else {
                    checkBoxMarcar.setSelected(false);
                }

                if (controlTable.esAjeno()) {
                    getTableRow().setStyle("-fx-background-color:lightcoral");
                } else if (controlTable.getNormales() == null) {
                    getTableRow().setStyle("-fx-background-color:#dddddd");
                } else {
                    getTableRow().setStyle("");
                }
            }
        });

        empleadosTableView.setRowFactory((Object tv) -> {
            TableRow<ControlTable> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                    ControlTable rowData = row.getItem();
                    try {
                        horarioEmpleado(rowData.getControlDiario(), new Fecha(rowData.getFecha().getFecha()));
                    } catch (IOException ex) {
                        Logger.getLogger(RolDePagoClienteController.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
            return row;
        });
        empleadosTableView.getColumns().remove(marcarColumna);
        empleadosTableView.getColumns().add(0, marcarColumna);
        ////////////////////////////////////////////////////////////////////////
        fechaColumnaE.setCellValueFactory(new PropertyValueFactory<>("fechaString"));

        clienteColumnaE.setCellValueFactory(new PropertyValueFactory<>("cliente"));

        sobreTiempoColumna.setCellValueFactory(new PropertyValueFactory<>("sobreTiempo"));

        recargoColumna.setCellValueFactory(new PropertyValueFactory<>("recargo"));

        marcarColumnaE.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()));
        marcarColumnaE.setCellFactory(param -> new TableCell<ControlTable, ControlTable>() {
            private final CheckBox checkBoxMarcar = new CheckBox();

            @Override
            protected void updateItem(ControlTable controlTable, boolean empty) {
                super.updateItem(controlTable, empty);

                if (controlTable == null) {
                    setGraphic(null);
                    getTableRow().setStyle("");
                    return;
                }

                setGraphic(checkBoxMarcar);

                checkBoxMarcar.setOnAction(event -> {
                    controlTable.setMarcar(checkBoxMarcar.isSelected());
                });

                if (controlTable.getMarcar()) {
                    checkBoxMarcar.setSelected(true);
                } else {
                    checkBoxMarcar.setSelected(false);
                }

                if (controlTable.esAjeno()) {
                    getTableRow().setStyle("-fx-background-color:lightcoral");
                } else if (controlTable.getSobreTiempo() == null) {
                    getTableRow().setStyle("-fx-background-color:#dddddd");
                } else {
                    getTableRow().setStyle("");
                }
            }
        });

        horasExtrasView.setRowFactory((Object tv) -> {
            TableRow<ControlTable> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                    ControlTable rowData = row.getItem();
                    try {
                        horarioExtras(rowData.getControlExtras(), rowData.getFechaExtra());
                    } catch (IOException ex) {
                        Logger.getLogger(RolDePagoClienteController.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
            return row;
        });

        leyenda1.setTooltip(new Tooltip("Dia trabajado a otro cliente"));
        leyenda2.setTooltip(new Tooltip("Dia sin horario"));
        leyenda3.setTooltip(new Tooltip("Dia con horario creado"));

        selectorDiaDe.setItems(Fechas.arraySpinnerDia());
        selectorMesDe.setItems(Fechas.arraySpinnerMes());
        selectorAnoDe.setItems(Fechas.arraySpinnerAno());
        selectorDiaHa.setItems(Fechas.arraySpinnerDia());
        selectorMesHa.setItems(Fechas.arraySpinnerMes());
        selectorAnoHa.setItems(Fechas.arraySpinnerAno());

        selectorDiaDe.setDisable(true);
        selectorMesDe.setDisable(true);
        selectorAnoDe.setDisable(true);
        selectorDiaHa.setDisable(true);
        selectorMesHa.setDisable(true);
        selectorAnoHa.setDisable(true);
    }

    private void enableCasoEspecial() {

        vacacionesField.setEditable(true);
        decimo3Field.setEditable(true);
        decimo4Field.setEditable(true);
        jubilacionField.setEditable(true);
        aporteField.setEditable(true);
        segurosField.setEditable(true);
        uniformeField.setEditable(true);

        vacacionesField.setDisable(false);
        decimo3Field.setDisable(false);
        decimo4Field.setDisable(false);
        jubilacionField.setDisable(false);
        aporteField.setDisable(false);
        segurosField.setDisable(false);
        uniformeField.setDisable(false);
    }

    private void disableCasoEspecial() {

        vacacionesField.setEditable(false);
        decimo3Field.setEditable(false);
        decimo4Field.setEditable(false);
        jubilacionField.setEditable(false);
        aporteField.setEditable(false);
        segurosField.setEditable(false);
        uniformeField.setEditable(false);

        vacacionesField.setDisable(true);
        decimo3Field.setDisable(true);
        decimo4Field.setDisable(true);
        jubilacionField.setDisable(true);
        aporteField.setDisable(true);
        segurosField.setDisable(true);
        uniformeField.setDisable(true);
    }

    public static String getMonthName(int month) {
        Calendar cal = Calendar.getInstance();
        // Calendar numbers months from 0
        cal.set(Calendar.MONTH, month - 1);
        return cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
    }

    public Double getDecimoCuarto(Boolean buscar) {
        if (buscar)
            constDecimoCuarto = (Constante) new ConstanteDAO().findUniqueResultByNombre(Const.DECIMO_CUARTO);
        if (constDecimoCuarto == null) {
            return 30.5d;
        } else {
            return Double.valueOf(constDecimoCuarto.getValor());
        }
    }

    public Double getActuariales(Integer empleadoId, Boolean buscar) {
        if (buscar)
            actuariales = new ActuarialesDAO().findByEmpleadoId(empleadoId);
        if (actuariales == null) {
            return 0d;
        } else {
            return actuariales.getPrimario() + actuariales.getSecundario();
        }
    }

    public Double getSeguro(Boolean buscar) {
        if (buscar) {
            if (cliente != null) {
                seguro = new SeguroDAO().findByClienteId(cliente.getId());
            } else {
                seguro = new SeguroDAO().findAdministrativo();
            }
        }
        if (seguro == null) {
            return 0d;
        } else {
            return seguro.getValor();
        }
    }

    public Double getUniforme(Boolean buscar) {
        if (buscar) {
            if (cliente != null) {
                uniforme = new UniformeDAO().findByClienteId(cliente.getId());
            } else {
                uniforme = new UniformeDAO().findAdministrativo();
            }
        }
        if (uniforme == null) {
            return 0d;
        } else {
            return uniforme.getValor();
        }
    }

    public Double getBono(Boolean buscar) {
        if (buscar) {
            if (cliente != null) {
                bonos = new BonosDAO().findByClienteIdAndEmpleadoId(cliente.getId(), empleado.getId(),
                        inicio.getFecha());
            } else {
                bonos = new BonosDAO().findByClienteNullAndEmpleadoId(empleado.getId(), inicio.getFecha());
            }
        }
        if (bonos == null) {
            return 0d;
        } else {
            return bonos.getBono();
        }
    }

    public Double getTransporte(Boolean buscar) {
        if (buscar) {
            if (cliente != null) {
                bonos = new BonosDAO().findByClienteIdAndEmpleadoId(cliente.getId(), empleado.getId(),
                        inicio.getFecha());
            } else {
                bonos = new BonosDAO().findByClienteNullAndEmpleadoId(empleado.getId(), inicio.getFecha());
            }
        }
        if (bonos == null) {
            return 0d;
        } else {
            return bonos.getTransporte();
        }
    }
    /*
    public Double getBono() {
    if (bonoField.getText().isEmpty()) {
        return 0d;
    } else {
        return round(bonoField.getText());
    }
    }
        
    public Double getTransporte() {
    if (transporteField.getText().isEmpty()) {
        return 0d;
    } else {
        return round(transporteField.getText());
    }
    }*/

    public Double getVacaciones(Double sueldoSinVacaciones, Boolean buscar) {
        if (buscar)
            diasVacaciones = new DiasVacacionesDAO().findByEmpleadoId(empleado.getId());
        if (diasVacaciones == null) {
            return 0d;
        } else {
            Integer diasDerecho = diasVacaciones.getDias();
            Double sueldoNeto = sueldoSinVacaciones;
            Double vacaciones = (sueldoNeto / 360d) * diasDerecho.doubleValue();
            return vacaciones;
        }
    }
    /*
    public Double getVacaciones(Double sueldoSinVacaciones) {
        
    try {
        DateTime fechaInicial = new DateTime(getToday().getTime());
        DateTime fechaFinal = new DateTime(empleado.getDetallesEmpleado().getFechaContrato().getTime());
        int years = Years.yearsBetween(fechaFinal.withTimeAtStartOfDay(), 
                fechaInicial.withTimeAtStartOfDay()).getYears();
        System.out.println("inicio " + fechaInicial);
        System.out.println("Final " + fechaFinal);
        int diasExtras;
        if (years >= 5) {
            diasExtras = years - 5;
        } else {
            diasExtras = 0;
        }
        System.out.println("dias extras " + diasExtras);
        Integer diasDerecho = 16 + diasExtras;
        Double sueldoNeto = sueldoSinVacaciones;
        Double vacaciones = (sueldoNeto / 360d) * diasDerecho.doubleValue();
        
        return vacaciones;
    } catch (Exception e) {
        e.printStackTrace();
        return 0d;
    }
    }*/

    public EventHandler<KeyEvent> numDecimalFilterAndUpdate() {

        EventHandler<KeyEvent> aux = (KeyEvent keyEvent) -> {

            if (!"0123456789.".contains(keyEvent.getCharacter())) {
                keyEvent.consume();
            }
            String[] strArray = new String[] { keyEvent.getCharacter() };
            int letterCount = 0;
            for (String letter : strArray) {
                if (letter.equalsIgnoreCase("."))
                    letterCount++;
            }
            if (letterCount >= 2) {
                keyEvent.consume();
            }

            if (!keyEvent.getCharacter().equalsIgnoreCase("\r"))
                indicacion1.setText("Presione enter al terminar de escribir");
            else
                buttonGenerarRol.requestFocus();
        };
        return aux;
    }

    public class DataBaseThread implements Runnable {

        public final Integer BORRAR = 1;
        public final Integer BORRAR_EXTRAS = 2;

        Integer opcion;

        public DataBaseThread(Integer opcion) {
            this.opcion = opcion;
        }

        @Override
        public void run() {

            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    cancel();
                    if (Objects.equals(opcion, BORRAR)) {
                        borrar();
                    } else if (Objects.equals(opcion, BORRAR_EXTRAS)) {
                        borrarExtras();
                    }
                }
            }, 1000, 1000);

        }

        public void borrar() {
            System.out.println("Comenzado borrado");
            try {
                Boolean cancelar = false;
                List<RolCliente> rolClientes = new RolClienteDAO().findAllByFechaAndEmpleadoId(inicio.getFecha(),
                        empleado.getId());
                for (ControlTable controlTable : (List<ControlTable>) data) {
                    if (controlTable.getMarcar()) {
                        ControlDiario controlEmpleadoDelete = controlTable.getControlDiario();
                        if (controlEmpleadoDelete != null) {

                            for (RolCliente rolCliente : rolClientes) {
                                if (rolCliente.getCliente() != null && controlEmpleadoDelete.getCliente() != null) {
                                    if (controlEmpleadoDelete.getCliente().getId()
                                            .equals(rolCliente.getCliente().getId())) {
                                        cancelar = true;
                                    }
                                } else if (rolCliente.getCliente() == null
                                        && controlEmpleadoDelete.getCliente() == null) {
                                    cancelar = true;
                                }
                            }
                        }
                    }
                }

                if (cancelar) {
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            hayRolCliente();
                        }
                    });
                } else {
                    for (ControlTable controlTable : (List<ControlTable>) data) {
                        if (controlTable.getMarcar()) {
                            ControlDiario controlEmpleadoDelete = controlTable.getControlDiario();
                            if (controlEmpleadoDelete != null) {
                                new ControlDiarioDAO().delete(controlEmpleadoDelete);
                                HibernateSessionFactory.getSession().flush();
                                quitarControlEmpleado(controlTable);

                                // Registro para auditar
                                String detalles = "elimino el horario del empleado " + empleado.getApellido() + " "
                                        + empleado.getNombre() + "del dia "
                                        + Fechas.getFechaConMes(new Fecha(controlEmpleadoDelete.getFecha()));
                                aplicacionControl.au.saveElimino(detalles, aplicacionControl.permisos.getUsuario());
                            }
                        }
                    }
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            updateWindows();
                        }
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        error();
                    }
                });
            }
        }

        public void borrarExtras() {
            System.out.println("Comenzado borrado extras");
            try {
                Boolean cancelar = false;
                List<RolCliente> rolClientes = new RolClienteDAO().findAllByFechaAndEmpleadoId(inicio.getFecha(),
                        empleado.getId());
                for (ControlTable controlTable : (List<ControlTable>) dataExtras) {
                    if (controlTable.getMarcar()) {
                        ControlDiario controlEmpleadoDelete = controlTable.getControlDiario();
                        if (controlEmpleadoDelete != null) {

                            for (RolCliente rolCliente : rolClientes) {
                                if (rolCliente.getCliente() != null && controlEmpleadoDelete.getCliente() != null) {
                                    if (controlEmpleadoDelete.getCliente().getId()
                                            .equals(rolCliente.getCliente().getId())) {
                                        cancelar = true;
                                    }
                                } else if (rolCliente.getCliente() == null
                                        && controlEmpleadoDelete.getCliente() == null) {
                                    cancelar = true;
                                }
                            }
                        }
                    }
                }

                if (cancelar) {
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            hayRolCliente();
                        }
                    });
                } else {
                    for (ControlTable controlTable : (List<ControlTable>) dataExtras) {
                        if (controlTable.getMarcar()) {
                            ControlExtras controlEmpleadoDelete = controlTable.getControlExtras();
                            if (controlEmpleadoDelete != null) {
                                new ControlExtrasDAO().delete(controlEmpleadoDelete);
                                HibernateSessionFactory.getSession().flush();
                                quitarControlEmpleadoExtras(controlTable);

                                // Registro para auditar
                                String detalles = "elimino las horas extras del empleado " + empleado.getApellido()
                                        + " " + empleado.getNombre() + "del dia "
                                        + Fechas.getFechaConMes(controlEmpleadoDelete.getFecha());
                                aplicacionControl.au.saveElimino(detalles, aplicacionControl.permisos.getUsuario());
                            }
                        }
                    }
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            updateWindows();
                        }
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        error();
                    }
                });
            }
        }

    }
}