HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/gestor-horarios.bradford/app/helpers/load_movements_helper.php
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

function map_excel_data($rowData)
{
    return [
        'rut' => $rowData[0],
        'nombre_apellido' => $rowData[1],
        'fecha' => $rowData[3],
        'horario_evento' => $rowData[4],
        'minutos_descanso' => $rowData[5],
        'hora_inicio' => $rowData[6],
        'hora_termino' => $rowData[7],
        'entrada' => $rowData[8],
        'salida' => $rowData[9],
        'descanso_e' => $rowData[10],
        'descanso_s' => $rowData[11],
        'salida_especial' => $rowData[12],
        'jornada' => $rowData[13],
        'descanso' => $rowData[14],
        'atraso' => $rowData[15],
        'salida_temprana' => $rowData[16],
        'ausencia' => $rowData[17],
    ];
}

function get_or_create_trabajador($rut, $nombre_apellido)
{
    $trabajador = get_row_by_where('trabajadores', ['rut' => $rut]);

    if (empty($trabajador->id)) {
        list($nombre, $apellidos) = explode(' ', $nombre_apellido, 2);
        $trabajador_data = [
            'rut' => $rut,
            'centros_costos_id' => 0,
            'jefe_id' => 1,
            'nombres' => $nombre,
            'apellido_p' => $apellidos,
            'perfiles_id' => 101,
        ];
        insert('trabajadores', $trabajador_data);
        $trabajador = get_row_by_where('trabajadores', ['rut' => $rut]);
    }

    return $trabajador;
}


function prepare_insert_data($trabajador_id, $excel_data, $fecha)
{
    $diff_ingreso = calculate_time_difference($excel_data['entrada'], $excel_data['hora_inicio']);
    if ($diff_ingreso < 0) {
        $diff_ingreso = $diff_ingreso * -1;
    }

    $diff_salida = calculate_time_difference($excel_data['salida'], $excel_data['hora_termino']);
    if ($diff_salida < 0) {
        $diff_salida =  $diff_salida * -1;
    }


    $rut = str_replace('.', '', $excel_data['rut']);
    $insert = [
        'trabajadores_id' => $trabajador_id,
        'rut' => $rut,
        'fecha' => $fecha,
        'horario_evento' => $excel_data['horario_evento'],
        'minutos_descanso' => $excel_data['minutos_descanso'] ?: 0,
        'hora_inicio' => format_excel_time($excel_data['hora_inicio']),
        'hora_termino' => format_excel_time($excel_data['hora_termino']),
        'entrada' => handle_empty_time($excel_data['entrada'], $excel_data['hora_inicio'], 'Entrada', $rut),
        'salida' => handle_empty_time($excel_data['salida'], $excel_data['hora_termino'], 'Salida', $rut),
        'descanso_entrada' => format_excel_time($excel_data['descanso_e']),
        'descanso_salida' => format_excel_time($excel_data['descanso_s']),
        'salida_especial_registrada' => $excel_data['salida_especial'],
        'total_jornada' => format_optional_time($excel_data['jornada']),
        'descanso' => format_optional_time($excel_data['descanso']),
        'atraso' => format_optional_time($excel_data['atraso']),
        'salida_temprano' => format_optional_time($excel_data['salida_temprana']),
        'ausencia' => format_optional_time($excel_data['ausencia']),
        'diferencia_ingreso' => $diff_ingreso,
        'diferencia_salida' => $diff_salida,
        'total_jornada_efectiva' => calculate_total_jornada_efectiva($excel_data, $rut),
    ];
    return $insert;
}

function format_excel_time($excel_time)
{
    if (is_numeric($excel_time)) {
        return PHPExcel_Shared_Date::ExcelToPHPObject($excel_time)->format('H:i:s');
    }
    return date("H:i:s", strtotime($excel_time));
}

function format_optional_time($time)
{
    $datetime = DateTime::createFromFormat('H:i', $time);
    return $datetime ? $datetime->format('H:i:s') : '00:00:00';
}

function handle_empty_time($time, $default_time, $tipo_registro, $rut)
{

    if (empty($time) || $time == '00:00:00') {
        $where['tipo_registro'] = $tipo_registro;
        $where['rut'] = $rut;
        $registros_invalidos = get_row_by_where('registros_invalidos', $where);
        $return = !empty($registros_invalidos) ? format_excel_time($default_time) : '00:00:00';
    } else {
        $return = format_excel_time($time);
    }

    return $return;
}

function calculate_time_difference($start_time, $end_time)
{
    if (empty($start_time) || $start_time == '00:00:00') {
        return 0;
    }

    $datetime1 = new DateTime(format_excel_time($start_time));
    $datetime2 = new DateTime(format_excel_time($end_time));
    $diferencia = $datetime1->diff($datetime2);
    $minutos = ($diferencia->days * 24 * 60) + ($diferencia->h * 60) + $diferencia->i;

    return ($diferencia->invert) ? $minutos * -1 : $minutos;
}

function calculate_total_jornada_efectiva($excel_data, $rut)
{
   
    if (empty($excel_data['entrada']) || $excel_data['entrada'] == '00:00:00') {
        $hora_entrada = format_excel_time($excel_data['hora_inicio']);
    } else {
        $hora_entrada = format_excel_time($excel_data['entrada']);
    }

    if (empty($excel_data['salida']) || $excel_data['salida'] == '00:00:00') {
        $hora_salida = format_excel_time($excel_data['hora_termino']);
    } else {
        $hora_salida = format_excel_time($excel_data['salida']);
    }

    $hora_entrada_dt = new DateTime($hora_entrada);
    $hora_salida_dt = new DateTime($hora_salida);

    $diferencia = $hora_entrada_dt->diff($hora_salida_dt);
    $minutos_trabajados = ($diferencia->days * 24 * 60) + ($diferencia->h * 60) + $diferencia->i;
    list($hora_descanso, $minuto_descanso) = explode(':', $excel_data['descanso']);
    $minutos_descanso = ($hora_descanso * 60) + $minuto_descanso;
    if (empty($excel_data['entrada']) || $excel_data['entrada'] == '00:00:00' || empty($excel_data['salida']) || $excel_data['salida'] == '00:00:00') {
        list($hora_ausencia, $minuto_ausencia) = explode(':', $excel_data['ausencia']);
        $minutos_ausencia = ($hora_ausencia * 60) + $minuto_ausencia;
        $minutos_totales = $minutos_trabajados - $minutos_descanso - $minutos_ausencia;
    } else {
        $minutos_totales = $minutos_trabajados - $minutos_descanso;
    }

    $horas = floor($minutos_totales / 60);
    $minutos = $minutos_totales % 60;

    return sprintf("%02d:%02d:00", $horas, $minutos);
}