aplicacion.control.HorarioEmpleadoController.java Source code

Java tutorial

Introduction

Here is the source code for aplicacion.control.HorarioEmpleadoController.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.util.Const;
import aplicacion.control.util.DiasSpinner;
import aplicacion.control.util.Fecha;
import aplicacion.control.util.Fechas;
import aplicacion.control.util.MaterialDesignButtonBlue;
import hibernate.HibernateSessionFactory;
import hibernate.dao.ControlDiarioDAO;
import hibernate.dao.RolClienteDAO;
import hibernate.model.Cliente;
import hibernate.model.ControlDiario;
import hibernate.model.Empresa;
import hibernate.model.Horario;
import hibernate.model.RolCliente;
import hibernate.model.Usuario;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Time;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javafx.application.Platform;
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.ContentDisplay;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
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.Pane;
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 org.joda.time.DateTime;

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

    private Stage stagePrincipal;

    private Usuario empleado;

    private ArrayList<Usuario> empleados;

    private ArrayList<ControlDiario> controls;

    private Empresa empresa;

    @FXML
    private TextField normales;

    @FXML
    private TextField suplementarias;

    @FXML
    private TextField sobreTiempo;

    @FXML
    private Button horarioButton;

    @FXML
    private Button clienteButton;

    @FXML
    private RadioButton marcarTrabajo;

    @FXML
    private RadioButton marcarLibre;

    @FXML
    private RadioButton marcarFalta;

    @FXML
    private RadioButton marcarEspecial;

    @FXML
    private RadioButton marcarPermiso;

    @FXML
    private RadioButton marcarVacaciones;

    @FXML
    private RadioButton marcarCM;

    @FXML
    private RadioButton marcarDM;

    @FXML
    private GridPane panelHoras;

    @FXML
    private GridPane panelEspecial;

    @FXML
    private GridPane panelHorario;

    @FXML
    private Label fechaLabel;

    @FXML
    private Label diaLabel;

    @FXML
    private Pane panelDias;

    private List<Cliente> clientes;

    private List<Horario> horarios;

    private Cliente cliente;

    @FXML
    private Button buttonBorrarHorario;

    @FXML
    private Button buttonBorrarCliente;

    @FXML
    private Button buttonInformacion;

    private Boolean editable;

    public Boolean multiple;

    DiasSpinner spinnder;

    ControlDiario controlEmpleadoToReturn;

    Stage stage;

    Dialog<Void> dialog;

    boolean medioDia;
    Time entrada = new Time(6, 0, 0);
    Time salida = new Time(14, 0, 0);

    private List<ControlDiario> ultimosRegistros;
    private HorasEmpleadosPorDiaController horasEmpleadosPorDiaController;
    private ControlDiario controlEmpleado;
    private Fecha fecha;

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

    public void setHorasEmpleadosPorDia(HorasEmpleadosPorDiaController horasEmpleadosPorDiaController) {
        this.horasEmpleadosPorDiaController = horasEmpleadosPorDiaController;
        this.clientes = horasEmpleadosPorDiaController.clientes;
        this.horarios = horasEmpleadosPorDiaController.horarios;
    }

    @FXML
    private void checkTrabajo(ActionEvent event) {
        panelHoras.setVisible(true);
        panelHorario.setVisible(true);
        panelEspecial.setVisible(false);
        verificarDia();
    }

    @FXML
    private void checkLibre(ActionEvent event) {
        panelHoras.setVisible(false);
        panelHorario.setVisible(false);
        panelEspecial.setVisible(false);
        medioDia = false;
    }

    @FXML
    private void checkFalta(ActionEvent event) {
        panelHoras.setVisible(false);
        panelHorario.setVisible(false);
        panelEspecial.setVisible(false);
        medioDia = false;
        verificarDia();
    }

    @FXML
    private void checkEspecial(ActionEvent event) {
        panelHoras.setVisible(false);
        panelHorario.setVisible(false);
        panelEspecial.setVisible(true);
        medioDia = false;
        verificarDia();
    }

    @FXML
    private void checkPermiso(ActionEvent event) {
        marcarEspecial.setSelected(true);
        panelHoras.setVisible(false);
        panelHorario.setVisible(false);
        panelEspecial.setVisible(true);
        medioDia = false;
        verificarDia();
    }

    @FXML
    private void checkVacaciones(ActionEvent event) {
        marcarEspecial.setSelected(true);
        panelHoras.setVisible(false);
        panelHorario.setVisible(false);
        panelEspecial.setVisible(true);
        medioDia = false;
        verificarDia();
    }

    @FXML
    private void checkCM(ActionEvent event) {
        marcarEspecial.setSelected(true);
        panelHoras.setVisible(false);
        panelHorario.setVisible(false);
        panelEspecial.setVisible(true);
        medioDia = false;
        verificarDia();
    }

    @FXML
    private void checkDM(ActionEvent event) {
        marcarEspecial.setSelected(true);
        panelHoras.setVisible(false);
        panelHorario.setVisible(false);
        panelEspecial.setVisible(true);
        medioDia = false;
        verificarDia();
    }

    private void verificarDia() {
        if (medioDia) {
            diaLabel.setText("medio dia");
        } else {
            diaLabel.setText("");
        }
    }

    private void loadingMode() {
        dialog = new Dialog<>();
        dialog.initModality(Modality.WINDOW_MODAL);
        dialog.initOwner(stage);//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;
        }
    }

    public void setStage(Stage stage) {
        this.stage = stage;
    }

    @FXML
    private void guardar(ActionEvent event) {
        if (horarioButton.getText().isEmpty() && marcarTrabajo.isSelected()) {
            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(20).children(new Text("Debes seleccionar un horario."), buttonOk)
                            .alignment(Pos.CENTER).padding(new Insets(10)).build()));
            buttonOk.setOnAction((ActionEvent e) -> {
                dialogStage.close();
            });
            buttonOk.setOnKeyPressed((KeyEvent event1) -> {
                dialogStage.close();
            });
            dialogStage.show();
        } else {
            if (!marcarTrabajo.isSelected()) {
                entrada = new Time(0, 0, 0);
                salida = new Time(0, 0, 0);
            }
            saveHorario();
        }
    }

    private void saveHorario() {
        if (marcarEspecial.isSelected() && !marcarPermiso.isSelected() && !marcarVacaciones.isSelected()
                && !marcarCM.isSelected() && !marcarDM.isSelected()) {
            // Nothing to do
        } else {
            if (multiple) {
                ExecutorService executor = Executors.newFixedThreadPool(1);
                Runnable worker = new HorarioEmpleadoController.DataBaseThread();
                executor.execute(worker);
                executor.shutdown();

                loadingMode();
            } else {
                if (editable) {

                    ExecutorService executor = Executors.newFixedThreadPool(1);
                    Runnable worker = new HorarioEmpleadoController.DataBaseThread();
                    executor.execute(worker);
                    executor.shutdown();

                    loadingMode();

                } 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 se puede cambiar porque ya se creo el rol."), 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 buscarRoles(Timestamp fecha, int dias) {
        DateTime tiempo = new DateTime(fecha.getTime());
        if (dias > 1) {
            int comienzoMes = empresa.getComienzoMes();
            tiempo.plusDays(1);
        }
    }

    public void dialogoCompletado() {
        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 Button("ok");
        dialogStage.setScene(new Scene(
                VBoxBuilder.create().spacing(20).children(new Text("Horario guardado con exito."), buttonOk)
                        .alignment(Pos.CENTER).padding(new Insets(10)).build()));
        buttonOk.setOnAction((ActionEvent e) -> {
            dialogStage.close();
        });
        buttonOk.setOnKeyPressed((KeyEvent event1) -> {
            dialogStage.close();
        });
        dialogStage.show();
    }

    @FXML
    private void informacion(ActionEvent event) {
        Stage dialogStage = new Stage();
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        dialogStage.setResizable(false);
        dialogStage.setTitle("Informacin");
        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("1 dia para que se guarde el horario para la fecha seleccionada unicamente."),
                        new Text("2 dias para que se guarde para la fecha seleccionada y el siguiente dia."),
                        new Text("3 dias para que se guarde para la fecha seleccionada y 2 dias siguientes."),
                        new Text("asi sucesivamente."), 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
    private void borrarHorario(ActionEvent event) {
        horarioButton.setText("");
        suplementarias.setText("0");
        sobreTiempo.setText("0");
    }

    @FXML
    private void borrarCliente(ActionEvent event) {
        this.cliente = null;
        clienteButton.setText("");
    }

    @FXML
    private void cambiarHorario(ActionEvent event) throws IOException {
        FXMLLoader loader = new FXMLLoader(
                AplicacionControl.class.getResource("ventanas/VentanaSeleccionarHorario.fxml"));
        AnchorPane ventanaRolDePago = (AnchorPane) loader.load();
        Stage ventana = new Stage();
        ventana.setTitle("");
        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);
        SeleccionarHorarioController controller = loader.getController();
        controller.setStagePrincipal(ventana);
        controller.setHorarioEmpleadoController(this);
        controller.setHorarios(horarios);
        ventana.show();
    }

    @FXML
    private void cambiarCliente(ActionEvent event) throws IOException {
        FXMLLoader loader = new FXMLLoader(
                AplicacionControl.class.getResource("ventanas/VentanaSeleccionarCliente.fxml"));
        AnchorPane ventanaRolDePago = (AnchorPane) loader.load();
        Stage ventana = new Stage();
        ventana.setTitle("");
        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);
        SeleccionarClienteController controller = loader.getController();
        controller.setStagePrincipal(ventana);
        controller.setHorarioEmpleadoController(this);
        controller.setClientes(clientes);
        ventana.show();
    }

    public void setHorario(Horario horario) {
        horarioButton.setText(getLapso(horario.getEntrada(), horario.getSalida()));
        normales.setText(horario.getNormales().toString());
        suplementarias.setText(horario.getRecargo().toString());
        sobreTiempo.setText(horario.getSobretiempo().toString());
        entrada = horario.getEntrada();
        salida = horario.getSalida();
        medioDia = horario.getMedioDia();
        verificarDia();
    }

    public String getLapso(Time entrada, Time salida) {

        String lapso = Fechas.getHora(entrada) + " - " + Fechas.getHora(salida);

        return lapso;
    }

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

    public void setEmpleado(Usuario empleado, ControlDiario controlEmpleado, Fecha fecha, Boolean editable) {
        multiple = false;
        this.empresa = empleado.getDetallesEmpleado().getEmpresa();
        this.empleado = empleado;
        this.controlEmpleado = controlEmpleado;
        this.fecha = fecha;
        this.editable = editable;
        if (controlEmpleado != null) {

            entrada = controlEmpleado.getEntrada();
            salida = controlEmpleado.getSalida();
            medioDia = controlEmpleado.getMedioDia();

            normales.setText(controlEmpleado.getNormales().toString());
            suplementarias.setText(controlEmpleado.getRecargo().toString());
            sobreTiempo.setText(controlEmpleado.getSobretiempo().toString());

            if (controlEmpleado.getCaso().equals(Const.LIBRE)) {
                marcarLibre.setSelected(true);
                checkLibre(null);
            } else if (controlEmpleado.getCaso().equals(Const.FALTA)) {
                marcarFalta.setSelected(true);
                checkFalta(null);
            } else if (controlEmpleado.getCaso().equals(Const.PERMISO)) {
                marcarPermiso.setSelected(true);
                checkPermiso(null);
            } else if (controlEmpleado.getCaso().equals(Const.VACACIONES)) {
                marcarVacaciones.setSelected(true);
                checkVacaciones(null);
            } else if (controlEmpleado.getCaso().equals(Const.CM)) {
                marcarCM.setSelected(true);
                checkCM(null);
            } else if (controlEmpleado.getCaso().equals(Const.DM)) {
                marcarDM.setSelected(true);
                checkDM(null);
            } else {
                horarioButton.setText(getLapso(controlEmpleado.getEntrada(), controlEmpleado.getSalida()));
            }

            if (controlEmpleado.getCliente() != null) {
                cliente = controlEmpleado.getCliente();
                clienteButton.setText(cliente.getNombre());
            }
        }

        fechaLabel.setText(Fechas.getFechaConMes(fecha));

        verificarDia();
    }

    public void setEmpleados(ArrayList<Usuario> empleados, ArrayList<ControlDiario> controls, Fecha fecha) {
        editable = true;
        multiple = true;
        empresa = empleados.get(0).getDetallesEmpleado().getEmpresa();
        this.empleados = new ArrayList<>();
        this.controls = new ArrayList<>();
        this.empleados.addAll(empleados);
        this.controls.addAll(controls);
        this.fecha = fecha;

        fechaLabel.setText(Fechas.getFechaConMes(fecha));
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        normales.setText("0");
        suplementarias.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilter());
        sobreTiempo.addEventFilter(KeyEvent.KEY_TYPED, numDecimalFilter());
        normales.setEditable(false);
        normales.setDisable(true);
        marcarTrabajo.setSelected(true);
        spinnder = new DiasSpinner();
        spinnder.setNumber(new BigDecimal(1));
        panelDias.getChildren().add(spinnder);
        buttonBorrarHorario.setTooltip(new Tooltip("Limpiar"));
        buttonBorrarHorario.setOnMouseEntered((MouseEvent t) -> {
            buttonBorrarHorario
                    .setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar_mini.png'); "
                            + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                            + "-fx-background-color: #29B6F6;");
        });
        buttonBorrarHorario.setOnMouseExited((MouseEvent t) -> {
            buttonBorrarHorario
                    .setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar_mini.png'); "
                            + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                            + "-fx-background-color: transparent;");
        });
        buttonBorrarCliente.setTooltip(new Tooltip("Limpiar"));
        buttonBorrarCliente.setOnMouseEntered((MouseEvent t) -> {
            buttonBorrarCliente
                    .setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar_mini.png'); "
                            + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                            + "-fx-background-color: #29B6F6;");
        });
        buttonBorrarCliente.setOnMouseExited((MouseEvent t) -> {
            buttonBorrarCliente
                    .setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_borrar_mini.png'); "
                            + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                            + "-fx-background-color: transparent;");
        });
        buttonInformacion.setTooltip(new Tooltip("Informacin"));
        buttonInformacion.setOnMouseEntered((MouseEvent t) -> {
            buttonInformacion
                    .setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_informacion.png'); "
                            + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                            + "-fx-background-color: #29B6F6;");
        });
        buttonInformacion.setOnMouseExited((MouseEvent t) -> {
            buttonInformacion
                    .setStyle("-fx-background-image: " + "url('aplicacion/control/imagenes/icon_informacion.png'); "
                            + "-fx-background-position: center center; " + "-fx-background-repeat: stretch; "
                            + "-fx-background-color: transparent;");
        });

        buttonBorrarHorario.setVisible(false);
    }

    public void updateWindows() {
        closeDialogMode();
        horasEmpleadosPorDiaController.cambiarUsuarioUltimoRegistro(controlEmpleadoToReturn);
        horasEmpleadosPorDiaController.cambiarControlEmpleado(controlEmpleadoToReturn);
        stagePrincipal.close();
        dialogoCompletado();
    }

    public void updateWindowsMultiple() {
        closeDialogMode();
        horasEmpleadosPorDiaController.setTableInfo(fecha);
        stagePrincipal.close();
        dialogoCompletado();
    }

    public static EventHandler<KeyEvent> numDecimalFilter() {

        EventHandler<KeyEvent> aux = (KeyEvent keyEvent) -> {
            if (!"0123456789.".contains(keyEvent.getCharacter())) {
                keyEvent.consume();
            }
        };
        return aux;
    }

    public static LocalDate getDateFromTimestamp(Timestamp timestamp) {
        if (timestamp == null) {
            return null;
        } else {
            DateTime dateTime = new DateTime(timestamp.getTime());
            return LocalDate.of(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth());
        }
    }

    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 crear los horarios por que hay un algun 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();
        });
    }

    public void hayRolCliente(ArrayList<Usuario> usuarios) {
        closeDialogMode();
        stagePrincipal.close();
        horasEmpleadosPorDiaController.marcarUsuariosConRol(usuarios);

        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 hacer el guardado de horarios,"),
                        new Text("Los siguiente empleados marcados en rojo tienen un rol cliente creado ya."),
                        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 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 class DataBaseThread implements Runnable {

        public DataBaseThread() {
        }

        @Override
        public void run() {

            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    cancel();
                    if (multiple)
                        saveMultiple();
                    else
                        saveSingle();
                }
            }, 1000, 1000);

        }

        public void saveMultiple() {
            System.out.println("Empezando guardado multiple");
            try {
                if (spinnder.getDias() == 1) {

                    for (Usuario usuario : empleados) {
                        ControlDiario controlEmpleadoNew = new ControlDiario();
                        controlEmpleadoNew.setFecha(fecha.getFecha());
                        if (marcarTrabajo.isSelected()) {
                            controlEmpleadoNew.setNormales(Double.valueOf(normales.getText()));
                            controlEmpleadoNew.setSobretiempo(Double.valueOf(sobreTiempo.getText()));
                            controlEmpleadoNew.setRecargo(Double.valueOf(suplementarias.getText()));
                            controlEmpleadoNew.setCaso(Const.TRABAJO);
                        } else if (marcarLibre.isSelected()) {
                            controlEmpleadoNew.setNormales(8d);
                            controlEmpleadoNew.setSobretiempo(0d);
                            controlEmpleadoNew.setRecargo(0d);
                            controlEmpleadoNew.setCaso(Const.LIBRE);
                        } else if (marcarFalta.isSelected()) {
                            controlEmpleadoNew.setNormales(0d);
                            controlEmpleadoNew.setSobretiempo(0d);
                            controlEmpleadoNew.setRecargo(0d);
                            controlEmpleadoNew.setCaso(Const.FALTA);
                        } else if (marcarPermiso.isSelected()) {
                            controlEmpleadoNew.setNormales(0d);
                            controlEmpleadoNew.setSobretiempo(0d);
                            controlEmpleadoNew.setRecargo(0d);
                            controlEmpleadoNew.setCaso(Const.PERMISO);
                        } else if (marcarVacaciones.isSelected()) {
                            controlEmpleadoNew.setNormales(0d);
                            controlEmpleadoNew.setSobretiempo(0d);
                            controlEmpleadoNew.setRecargo(0d);
                            controlEmpleadoNew.setCaso(Const.VACACIONES);
                        } else if (marcarCM.isSelected()) {
                            controlEmpleadoNew.setNormales(8d);
                            controlEmpleadoNew.setSobretiempo(0d);
                            controlEmpleadoNew.setRecargo(0d);
                            controlEmpleadoNew.setCaso(Const.CM);
                        } else if (marcarDM.isSelected()) {
                            controlEmpleadoNew.setNormales(8d);
                            controlEmpleadoNew.setSobretiempo(0d);
                            controlEmpleadoNew.setRecargo(0d);
                            controlEmpleadoNew.setCaso(Const.DM);
                        }
                        controlEmpleadoNew.setEntrada(entrada);
                        controlEmpleadoNew.setSalida(salida);
                        controlEmpleadoNew.setMedioDia(medioDia);
                        controlEmpleadoNew.setUsuario(usuario);
                        controlEmpleadoNew.setCliente(cliente);
                        System.out
                                .println("guardando control de: " + controlEmpleadoNew.getUsuario().getApellido());
                        new ControlDiarioDAO().save(controlEmpleadoNew);

                        // Registro para auditar
                        String detalles = "registro un horario para el empleado " + usuario.getApellido() + " "
                                + usuario.getNombre() + " del dia " + Fechas.getFechaConMes(fecha);
                        horasEmpleadosPorDiaController.aplicacionControl.au.saveAgrego(detalles,
                                horasEmpleadosPorDiaController.aplicacionControl.permisos.getUsuario());
                    }
                    for (ControlDiario controlDelete : controls) {
                        System.out.println("Borrando control de: " + controlDelete.getUsuario().getApellido());
                        new ControlDiarioDAO().delete(controlDelete);
                    }
                    HibernateSessionFactory.getSession().flush();
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            updateWindowsMultiple();
                        }
                    });
                } else {
                    System.out.println("Guardado para " + spinnder.getDias() + " dias");
                    Boolean cancelar = false;
                    ArrayList<Usuario> usuariosConRol = new ArrayList<>();
                    for (int i = 0; i < (spinnder.getDias() - 1); i++) {
                        Fecha fechaAConsultar = fecha.plusDays(i + 1);
                        RolClienteDAO rolClienteDAO = new RolClienteDAO();

                        List<RolCliente> rolClientes;
                        rolClientes = rolClienteDAO.findAllByEntreFechaAndEmpresaId(fechaAConsultar.getFecha(),
                                empresa.getId());
                        if (!rolClientes.isEmpty()) {
                            for (RolCliente rol : rolClientes) {
                                for (Usuario usuario : empleados) {
                                    if (rol.getUsuario().getId().equals(usuario.getId())) {
                                        usuariosConRol.add(usuario);
                                        cancelar = true;
                                    }
                                }
                            }
                        }
                    }
                    if (cancelar) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                hayRolCliente(usuariosConRol);
                            }
                        });
                    } else {
                        ArrayList<ControlDiario> controlsEncontrados = new ArrayList<>();
                        Fecha fechaLimite = new Fecha(fecha.getFecha());
                        Fecha fechaFin = new Fecha(fechaLimite.plusDays((spinnder.getDias() - 1)).getFecha());
                        for (Usuario usuario : empleados) {
                            controlsEncontrados.addAll(new ControlDiarioDAO().findAllByEmpleadoIdInDeterminateTime(
                                    usuario.getId(), fecha.getFecha(), fechaFin.getFecha()));
                        }
                        for (int i = 0; i < spinnder.getDias(); i++) {
                            for (Usuario usuario : empleados) {
                                ControlDiario controlEmpleadoNew = new ControlDiario();
                                controlEmpleadoNew.setFecha(fecha.plusDays(i).getFecha());
                                if (marcarTrabajo.isSelected()) {
                                    controlEmpleadoNew.setNormales(Double.valueOf(normales.getText()));
                                    controlEmpleadoNew.setSobretiempo(Double.valueOf(sobreTiempo.getText()));
                                    controlEmpleadoNew.setRecargo(Double.valueOf(suplementarias.getText()));
                                    controlEmpleadoNew.setCaso(Const.TRABAJO);
                                } else if (marcarLibre.isSelected()) {
                                    controlEmpleadoNew.setNormales(8d);
                                    controlEmpleadoNew.setSobretiempo(0d);
                                    controlEmpleadoNew.setRecargo(0d);
                                    controlEmpleadoNew.setCaso(Const.LIBRE);
                                } else if (marcarFalta.isSelected()) {
                                    controlEmpleadoNew.setNormales(0d);
                                    controlEmpleadoNew.setSobretiempo(0d);
                                    controlEmpleadoNew.setRecargo(0d);
                                    controlEmpleadoNew.setCaso(Const.FALTA);
                                } else if (marcarPermiso.isSelected()) {
                                    controlEmpleadoNew.setNormales(0d);
                                    controlEmpleadoNew.setSobretiempo(0d);
                                    controlEmpleadoNew.setRecargo(0d);
                                    controlEmpleadoNew.setCaso(Const.PERMISO);
                                } else if (marcarVacaciones.isSelected()) {
                                    controlEmpleadoNew.setNormales(0d);
                                    controlEmpleadoNew.setSobretiempo(0d);
                                    controlEmpleadoNew.setRecargo(0d);
                                    controlEmpleadoNew.setCaso(Const.VACACIONES);
                                } else if (marcarCM.isSelected()) {
                                    controlEmpleadoNew.setNormales(8d);
                                    controlEmpleadoNew.setSobretiempo(0d);
                                    controlEmpleadoNew.setRecargo(0d);
                                    controlEmpleadoNew.setCaso(Const.CM);
                                } else if (marcarDM.isSelected()) {
                                    controlEmpleadoNew.setNormales(8d);
                                    controlEmpleadoNew.setSobretiempo(0d);
                                    controlEmpleadoNew.setRecargo(0d);
                                    controlEmpleadoNew.setCaso(Const.DM);
                                }
                                controlEmpleadoNew.setEntrada(entrada);
                                controlEmpleadoNew.setSalida(salida);
                                controlEmpleadoNew.setMedioDia(medioDia);
                                controlEmpleadoNew.setUsuario(usuario);
                                controlEmpleadoNew.setCliente(cliente);
                                new ControlDiarioDAO().save(controlEmpleadoNew);

                                // Registro para auditar
                                String detalles = "registro horarios para el empleado " + usuario.getApellido()
                                        + " " + usuario.getNombre() + " desde el dia "
                                        + Fechas.getFechaConMes(fecha) + " hasta el dia "
                                        + Fechas.getFechaConMes(fechaFin);
                                horasEmpleadosPorDiaController.aplicacionControl.au.saveAgrego(detalles,
                                        horasEmpleadosPorDiaController.aplicacionControl.permisos.getUsuario());
                            }
                        }
                        for (ControlDiario controlEmpleadoDelete : controlsEncontrados) {
                            new ControlDiarioDAO().delete(controlEmpleadoDelete);
                        }
                        HibernateSessionFactory.getSession().flush();
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                updateWindowsMultiple();
                            }
                        });
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        error();
                    }
                });
            }
        }

        public void saveSingle() {
            System.out.println("Empezando guardado simple");
            try {
                if (spinnder.getDias() == 1) {
                    ControlDiario controlEmpleadoNew = new ControlDiario();
                    controlEmpleadoNew.setFecha(fecha.getFecha());
                    if (marcarTrabajo.isSelected()) {
                        controlEmpleadoNew.setNormales(Double.valueOf(normales.getText()));
                        controlEmpleadoNew.setSobretiempo(Double.valueOf(sobreTiempo.getText()));
                        controlEmpleadoNew.setRecargo(Double.valueOf(suplementarias.getText()));
                        controlEmpleadoNew.setCaso(Const.TRABAJO);
                    } else if (marcarLibre.isSelected()) {
                        controlEmpleadoNew.setNormales(8d);
                        controlEmpleadoNew.setSobretiempo(0d);
                        controlEmpleadoNew.setRecargo(0d);
                        controlEmpleadoNew.setCaso(Const.LIBRE);
                    } else if (marcarFalta.isSelected()) {
                        controlEmpleadoNew.setNormales(0d);
                        controlEmpleadoNew.setSobretiempo(0d);
                        controlEmpleadoNew.setRecargo(0d);
                        controlEmpleadoNew.setCaso(Const.FALTA);
                    } else if (marcarPermiso.isSelected()) {
                        controlEmpleadoNew.setNormales(0d);
                        controlEmpleadoNew.setSobretiempo(0d);
                        controlEmpleadoNew.setRecargo(0d);
                        controlEmpleadoNew.setCaso(Const.PERMISO);
                    } else if (marcarVacaciones.isSelected()) {
                        controlEmpleadoNew.setNormales(8d);
                        controlEmpleadoNew.setSobretiempo(0d);
                        controlEmpleadoNew.setRecargo(0d);
                        controlEmpleadoNew.setCaso(Const.VACACIONES);
                    } else if (marcarCM.isSelected()) {
                        controlEmpleadoNew.setNormales(8d);
                        controlEmpleadoNew.setSobretiempo(0d);
                        controlEmpleadoNew.setRecargo(0d);
                        controlEmpleadoNew.setCaso(Const.CM);
                    } else if (marcarDM.isSelected()) {
                        controlEmpleadoNew.setNormales(8d);
                        controlEmpleadoNew.setSobretiempo(0d);
                        controlEmpleadoNew.setRecargo(0d);
                        controlEmpleadoNew.setCaso(Const.DM);
                    }
                    controlEmpleadoNew.setEntrada(entrada);
                    controlEmpleadoNew.setSalida(salida);
                    controlEmpleadoNew.setMedioDia(medioDia);
                    controlEmpleadoNew.setUsuario(empleado);
                    controlEmpleadoNew.setCliente(cliente);
                    new ControlDiarioDAO().save(controlEmpleadoNew);
                    if (controlEmpleado != null
                            && controlEmpleado.getFecha().equals(controlEmpleadoNew.getFecha())) {
                        new ControlDiarioDAO().delete(controlEmpleado);
                    }
                    HibernateSessionFactory.getSession().flush();
                    controlEmpleadoToReturn = controlEmpleadoNew;

                    // Registro para auditar
                    String detalles = "registro un horario para el empleado " + empleado.getApellido() + " "
                            + empleado.getNombre() + " del dia " + Fechas.getFechaConMes(fecha);
                    horasEmpleadosPorDiaController.aplicacionControl.au.saveAgrego(detalles,
                            horasEmpleadosPorDiaController.aplicacionControl.permisos.getUsuario());

                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            updateWindows();
                        }
                    });
                } else {
                    Boolean cancelar = false;
                    for (int i = 0; i < (spinnder.getDias() - 1); i++) {
                        Fecha fechaAConsultar = new Fecha(fecha.plusDays(i + 1).getFecha());
                        RolClienteDAO rolClienteDAO = new RolClienteDAO();

                        List<RolCliente> rolClientes = rolClienteDAO.findAllByEntreFechaAndEmpresaIdAndEmpleadoId(
                                fechaAConsultar.getFecha(), empresa.getId(), empleado.getId());
                        if (!rolClientes.isEmpty()) {
                            cancelar = true;
                        }
                    }

                    if (cancelar) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                hayRolCliente();
                            }
                        });
                    } else {
                        controlEmpleadoToReturn = new ControlDiario();
                        Fecha fechaLimite = new Fecha(fecha.getFecha());
                        Fecha fechaFin = new Fecha(fechaLimite.plusDays((spinnder.getDias() - 1)).getFecha());
                        ArrayList<ControlDiario> controlsEncontrados = new ArrayList<>();
                        controlsEncontrados.addAll(new ControlDiarioDAO().findAllByEmpleadoIdInDeterminateTime(
                                empleado.getId(), fecha.getFecha(), fechaFin.getFecha()));
                        for (int i = 0; i < spinnder.getDias(); i++) {
                            ControlDiario controlEmpleadoNew = new ControlDiario();
                            controlEmpleadoNew.setFecha(fecha.plusDays(i).getFecha());
                            if (marcarTrabajo.isSelected()) {
                                controlEmpleadoNew.setNormales(Double.valueOf(normales.getText()));
                                controlEmpleadoNew.setSobretiempo(Double.valueOf(sobreTiempo.getText()));
                                controlEmpleadoNew.setRecargo(Double.valueOf(suplementarias.getText()));
                                controlEmpleadoNew.setCaso(Const.TRABAJO);
                            } else if (marcarLibre.isSelected()) {
                                controlEmpleadoNew.setNormales(8d);
                                controlEmpleadoNew.setSobretiempo(0d);
                                controlEmpleadoNew.setRecargo(0d);
                                controlEmpleadoNew.setCaso(Const.LIBRE);
                            } else if (marcarFalta.isSelected()) {
                                controlEmpleadoNew.setNormales(0d);
                                controlEmpleadoNew.setSobretiempo(0d);
                                controlEmpleadoNew.setRecargo(0d);
                                controlEmpleadoNew.setCaso(Const.FALTA);
                            } else if (marcarPermiso.isSelected()) {
                                controlEmpleadoNew.setNormales(0d);
                                controlEmpleadoNew.setSobretiempo(0d);
                                controlEmpleadoNew.setRecargo(0d);
                                controlEmpleadoNew.setCaso(Const.PERMISO);
                            } else if (marcarVacaciones.isSelected()) {
                                controlEmpleadoNew.setNormales(0d);
                                controlEmpleadoNew.setSobretiempo(0d);
                                controlEmpleadoNew.setRecargo(0d);
                                controlEmpleadoNew.setCaso(Const.VACACIONES);
                            } else if (marcarCM.isSelected()) {
                                controlEmpleadoNew.setNormales(8d);
                                controlEmpleadoNew.setSobretiempo(0d);
                                controlEmpleadoNew.setRecargo(0d);
                                controlEmpleadoNew.setCaso(Const.CM);
                            } else if (marcarDM.isSelected()) {
                                controlEmpleadoNew.setNormales(8d);
                                controlEmpleadoNew.setSobretiempo(0d);
                                controlEmpleadoNew.setRecargo(0d);
                                controlEmpleadoNew.setCaso(Const.DM);
                            }
                            controlEmpleadoNew.setEntrada(entrada);
                            controlEmpleadoNew.setSalida(salida);
                            controlEmpleadoNew.setMedioDia(medioDia);
                            controlEmpleadoNew.setUsuario(empleado);
                            controlEmpleadoNew.setCliente(cliente);
                            new ControlDiarioDAO().save(controlEmpleadoNew);
                            if (i == 0) {
                                controlEmpleadoToReturn = controlEmpleadoNew;
                            }
                        }
                        for (ControlDiario controlEmpleadoDelete : controlsEncontrados) {
                            new ControlDiarioDAO().delete(controlEmpleadoDelete);
                        }

                        HibernateSessionFactory.getSession().flush();

                        // Registro para auditar
                        String detalles = "registro horarios para el empleado " + empleado.getApellido() + " "
                                + empleado.getNombre() + " desde el dia " + Fechas.getFechaConMes(fecha)
                                + " hasta el dia " + Fechas.getFechaConMes(fechaFin);
                        horasEmpleadosPorDiaController.aplicacionControl.au.saveAgrego(detalles,
                                horasEmpleadosPorDiaController.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();
                    }
                });
            }
        }
    }
}