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);
}