<?php
class MovimientoEmpleado
{
    public $coddepartamento;
    public $codempleado;
    public $codproyecto;
    public $codproyectoMovimiento;
    public $codpuesto;
    public $codsucursal;
    public $codsucursalMovimiento;
    public $codtipoplanilla;
    public $comentarios;
    public $fechaEfectiva;
    public $fechaRegistro;
    public $fechaRetorno;
    public $id;
    public $idOficina;
    public $idTipoMovimiento;
    public $nombreCompleto;
    public $nombreOficina;
    public $nombreProyecto;
    public $nombreProyectoMovimiento;
    public $nombreSucursal;
    public $nombreSucursalMovimiento;
    public $seguimiento = null;
    public $tipoMovimiento;
    public $usuario;

    public function __construct()
    {
        !empty($this->fechaEfectiva) && $this->fechaEfectiva = date("d-m-Y", strtotime($this->fechaEfectiva));
        !empty($this->fechaRetorno) && $this->fechaRetorno = date("d-m-Y", strtotime($this->fechaRetorno));
        !empty($this->fechaRegistro) && $this->fechaRegistro = date("d-m-Y h:i a", strtotime($this->fechaRegistro));
    }

    public static function obtenerTodos($db = null): object
    {
        try {
            if (empty($db)) $db = obtenerConexion();

            $query = "SELECT * FROM rrhh.view_movimientosEmpleados WHERE estado = 1 ORDER BY fechaEfectiva DESC";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);

            $stmt->execute();

            $data = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

            return (object)[
                'status' => 200,
                'data' => $data
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function obtenerPorTipoPlanilla($codtipoplanilla, $db = null): object
    {
        try {
            if (empty($db)) $db = obtenerConexion();

            $fechaActual = date("Y-m-d");

            $query = "SELECT * FROM rrhh.view_movimientosEmpleados WHERE codtipoplanilla = :codtipoplanilla AND estado = 1 AND (fechaRetorno is null OR fechaRetorno >= :fechaActual) ORDER BY fechaEfectiva DESC";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':codtipoplanilla', $codtipoplanilla, PDO::PARAM_INT);
            $stmt->bindParam(':fechaActual', $fechaActual, PDO::PARAM_STR);

            $stmt->execute();

            $data = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

            return (object)[
                'status' => 200,
                'data' => $data
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public function guardar($db = null): object
    {
        try {
            if (empty($db)) $db = obtenerConexion();

            $respuesta = null;
            $id = null;
            $usuario = App::obtenerIdUsuario();

            $this->fechaEfectiva = !empty($this->fechaEfectiva) ? date("Y-m-d", strtotime($this->fechaEfectiva)) : null;
            $this->fechaRetorno = !empty($this->fechaRetorno) ? date("Y-m-d", strtotime($this->fechaRetorno)) : null;
            $this->comentarios = !empty($this->comentarios) ? trim($this->comentarios) : null;

            $query = "EXEC rrhh.sp_guardarMovimientoEmpleado :id,:codtipoplanilla,:codempleado,:nombreCompleto,:codsucursal,:codproyecto,:coddepartamento,:codpuesto,:codsucursalMovimiento,:codproyectoMovimiento,:idOficina,:idTipoMovimiento,:fechaEfectiva,:fechaRetorno,:comentarios,:usuario,:seguimiento,:respuesta,:idSalida;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);

            $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
            $stmt->bindParam(':codtipoplanilla', $this->codtipoplanilla, PDO::PARAM_INT);
            $stmt->bindParam(':codempleado', $this->codempleado, PDO::PARAM_STR);
            $stmt->bindParam(':nombreCompleto', $this->nombreCompleto, PDO::PARAM_STR);
            $stmt->bindParam(':codsucursal', $this->codsucursal, PDO::PARAM_INT);
            $stmt->bindParam(':codproyecto', $this->codproyecto, PDO::PARAM_INT);
            $stmt->bindParam(':coddepartamento', $this->coddepartamento, PDO::PARAM_INT);
            $stmt->bindParam(':codpuesto', $this->codpuesto, PDO::PARAM_INT);
            $stmt->bindParam(':codsucursalMovimiento', $this->codsucursalMovimiento, PDO::PARAM_INT);
            $stmt->bindParam(':codproyectoMovimiento', $this->codproyectoMovimiento, PDO::PARAM_INT);
            $stmt->bindParam(':idOficina', $this->idOficina, PDO::PARAM_INT);
            $stmt->bindParam(':idTipoMovimiento', $this->idTipoMovimiento, PDO::PARAM_INT);
            $stmt->bindParam(':fechaEfectiva', $this->fechaEfectiva, PDO::PARAM_STR);
            $stmt->bindParam(':fechaRetorno', $this->fechaRetorno, PDO::PARAM_STR);
            $stmt->bindParam(':comentarios', $this->comentarios, PDO::PARAM_STR);
            $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
            $stmt->bindParam(':seguimiento', $this->seguimiento, PDO::PARAM_INT);
            $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
            $stmt->bindParam(':idSalida', $id, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 30);

            $stmt->execute();

            return (object)[
                'status' => 200,
                'message' => $respuesta,
                'data' => (object)[
                    'id' => $id
                ]
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public function finalizar($db = null): object
    {
        try {
            if (empty($db)) $db = obtenerConexion();

            $respuesta = null;

            $usuario = App::obtenerIdUsuario();

            $query = 'EXEC rrhh.sp_finalizarMovimientoEmpleado :id,:usuario,:respuesta;';
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
            $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
            $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

            $stmt->execute();

            return (object)[
                'status' => 200,
                'message' => $respuesta
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public function eliminar($db = null): object
    {
        try {
            if (empty($db)) $db = obtenerConexion();

            $respuesta = null;
            $usuario = App::obtenerIdUsuario();

            $query = "EXEC rrhh.sp_eliminarMovimientoEmpleado :id,:usuario,:respuesta;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
            $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
            $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

            $stmt->execute();

            return (object)[
                'status' => 200,
                'message' => $respuesta
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }
}
