🌹🏠🌹？》《》？《》？<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Carbon;

class HojaRuta extends Model{
    protected $connection = 'sqlsrv_web_productivo';
    protected $table = 'hoja_ruta_app';

    protected $primaryKey = 'hruta_d';
    public $incrementing = true;
    protected $keyType = 'int';
    public $timestamps = false;

    protected $fillable = [
        'cod_prop',
        'cod_chof',
        'tractor',
        'fecha',
        'fecha_cert',
        'estado',
        'bultos',
        'unidades',
        'volumen',
        'otros',
        'reparto',
    ]; 

    protected function obtenerHojaRutaPorChofer($codigo_chofer) {

        $hoy = Carbon::today()->toDateString();
        $connection = $this->getConnectionName();

        $filas = DB::connection($connection)
            ->table('hoja_ruta_app as hr')
            ->leftJoin('hoja_ruta_app_det as det', 'det.hruta_d', '=', 'hr.hruta_d')
            ->leftJoin('empresa as emp', 'emp.empresa', '=', 'det.empresa')
            // No join con rem_cab_img aquí
            ->where('hr.cod_chof', $codigo_chofer)
            ->whereDate('hr.fecha', $hoy)
            ->select(
                'hr.*',
                'det.empresa as det_empresa',
                'det.tdoc as det_tdoc',
                'det.letra as det_letra',
                'det.sucur as det_sucur',
                'det.numero as det_numero',
                'det.cliente as det_cliente',
                'det.direccion as det_direccion',
                'det.cod_postal as det_cod_postal',
                'det.nro_item as det_nro_item',
                'emp.denominacion as det_empresa_nombre',
                'det.localidad as det_localidad',
            )
            ->orderBy('hr.hruta_d')
            ->orderBy('det.nro_item')
            ->get();

        $codigosLocalidad = $filas->pluck('det_localidad')->filter()->unique()->values()->toArray();
        $localidades = DB::connection($connection)
            ->table('localidad')
            ->whereIn('localidad', $codigosLocalidad)
            ->select('localidad', DB::raw('MIN(denominacion) as denominacion'))
            ->groupBy('localidad')
            ->pluck('denominacion', 'localidad');

        $hoja_ruta = $filas->groupBy('hruta_d')->map(function ($items) use ($connection, $localidades) {
            $hoja = $items->first();



            $detalles = $items->filter(function ($item) {
                return !is_null($item->det_cliente) || !is_null($item->det_direccion) || !is_null($item->det_cod_postal);
            })->map(function ($item) use ($connection, $localidades) {
                $remito = DB::connection($connection)
                    ->table('rem_cab')
                    ->where('empresa', $item->det_empresa)
                    ->where('tdoc',    $item->det_tdoc)
                    ->where('letra',   $item->det_letra)
                    ->where('sucur',   $item->det_sucur)
                    ->where('numero',  $item->det_numero)
                    ->value('fecha_conf_ent_app');

                // Obtener datos de imagen solo para el detalle
                $img = DB::connection($connection)
                    ->table('rem_cab_img')
                    ->whereRaw('RTRIM(empresa) = ?', [trim($item->det_empresa)])
                    ->whereRaw('RTRIM(tdoc) = ?', [trim($item->det_tdoc)])
                    ->whereRaw('RTRIM(letra) = ?', [trim($item->det_letra)])
                    ->whereRaw('RTRIM(sucur) = ?', [trim($item->det_sucur)])
                    ->whereRaw('RTRIM(CAST(numero AS VARCHAR)) = ?', [trim($item->det_numero)])
                    ->select('path as img_path', 'archivo as img_archivo', 'estado as img_estado', 'coordenadas', 'ubicacion')
                    ->first();

                $telefono = DB::connection($connection)
                    ->table('clientes_emp')
                    ->where('empresa', $item->det_empresa)
                    ->where('raz_soc', 'like', $item->det_cliente)
                    ->value('clientes_emp.tel');

                return (object) [
                    'cliente'    => $item->det_cliente,
                    'direccion'  => $item->det_direccion,
                    'cod_postal' => $item->det_cod_postal,
                    'empresa'         => $item->det_empresa,
                    'empresa_nombre'  => $item->det_empresa_nombre,
                    'tdoc'       => $item->det_tdoc,
                    'letra'      => $item->det_letra,
                    'sucur'      => $item->det_sucur,
                    'numero'     => $item->det_numero,
                    'confirmado' => !is_null($remito) && !str_starts_with($remito, '1900-01-01'),
                    'item'       => $item->det_nro_item,
                    'localidad'         => $item->det_localidad,
                    'localidad_nombre'  => $localidades[$item->det_localidad] ?? null,
                    'img_path'    => $img->img_path ?? null,
                    'img_archivo' => $img->img_archivo ?? null,
                    'img_estado'  => $img->img_estado ?? null,
                    'coordenadas' => $img->coordenadas ?? null,
                    'ubicacion'   => $img->ubicacion ?? null,
                    'telefono'    => $telefono ?? null,
                ];
            })->values();

            unset($hoja->det_cliente, $hoja->det_direccion, $hoja->det_cod_postal, $hoja->det_empresa, $hoja->det_tdoc, $hoja->det_letra, $hoja->det_sucur, $hoja->det_numero, $hoja->det_fecha_conf_ent_app, $hoja->det_nro_item);
            $hoja->detalles = $detalles;

            return $hoja;
        })->values();

        return $hoja_ruta;
    }
    protected function actualizarRemitoCabeceraAppFechaActual($hruta_d, $empresa, $tdoc, $letra, $sucursal, $numero, $usuario){
        $actualizacion = DB::connection($this->getConnectionName())
            ->table('rem_cab_app')
            ->where('empresa', $empresa)
            ->where('tdoc', $tdoc)
            ->where('letra', $letra)
            ->where('sucur', $sucursal)
            ->where('numero', $numero)
            ->where('hruta_d', $hruta_d)
            ->update(['estado_app' => '10', 'fecha_conf_ent' => Carbon::now(), 'fecha_proc' => Carbon::now(), 'usuario' => $usuario]);

        return $actualizacion > 0;
    }
    protected function insertarRemitoApp($empresa, $tdoc, $letra, $sucursal, $numero, $hruta_d, $usuario){
        $insercion = DB::connection($this->getConnectionName())
            ->table('rem_cab_app')
            ->insert([
                'empresa' => $empresa,
                'tdoc' => $tdoc,
                'letra' => $letra,
                'sucur' => $sucursal,
                'numero' => $numero,
                'hruta_d' => $hruta_d,
                'fecha_proc' => Carbon::now(),
                'estado_app' => '10',
                'estado_conf_ent' => '6',
                'usuario' => $usuario,
                'fecha_conf_ent' => Carbon::now()
            ]);

        return $insercion;
    }
    protected function actualizarRemitoAppFechaActual($empresa, $tdoc, $letra, $sucursal, $numero){
        $actualizacion = DB::connection($this->getConnectionName())
            ->table('rem_cab_app')
            ->where('empresa', $empresa)
            ->where('tdoc', $tdoc)
            ->where('letra', $letra)
            ->where('sucur', $sucursal)
            ->where('numero', $numero)
            ->update(['fecha_conf_ent_app' => Carbon::now()]);

        return $actualizacion > 0;
    }
    protected function buscarHojaRuta($empresa, $tdoc, $letra, $sucursal, $numero, $fecha){
        $hruta_d = DB::connection($this->getConnectionName())
            ->table('hoja_ruta_app_det as det')
            ->join('hoja_ruta_app as hr', 'det.hruta_d', '=', 'hr.hruta_d')
            ->where('det.empresa', $empresa)
            ->where('det.tdoc', $tdoc)
            ->where('det.letra', $letra)
            ->where('det.sucur', $sucursal)
            ->where('det.numero', $numero)
            ->whereDate('hr.fecha', $fecha)
            ->value('det.hruta_d');

        return $hruta_d;
    }
    protected function obtenerHojasRutasDiario($fecha_hoy){
        $connection = $this->getConnectionName();

        $filas = DB::connection($connection)
            ->table('hoja_ruta_app as hr')
            ->leftJoin('hoja_ruta_app_det as det', 'det.hruta_d', '=', 'hr.hruta_d')
            ->leftJoin('empresa as emp', 'emp.empresa', '=', 'det.empresa')
            ->whereDate('hr.fecha', $fecha_hoy)
            // ->whereNotIn(DB::raw('RTRIM(hr.cod_chof)'), ['RETI', 'JULI', 'RETO', 'RETP', 'RETU', 'URBA', 'DIST'])
            ->select(
                'hr.*',
                'det.empresa as det_empresa',
                'det.tdoc as det_tdoc',
                'det.letra as det_letra',
                'det.sucur as det_sucur',
                'det.numero as det_numero',
                'det.cliente as det_cliente',
                'det.direccion as det_direccion',
                'det.cod_postal as det_cod_postal',
                'det.nro_item as det_nro_item',
                'emp.denominacion as det_empresa_nombre',
                'det.localidad as det_localidad',
            )
            ->orderBy('hr.hruta_d')
            ->orderBy('det.nro_item')
            ->get();

        $codigosLocalidad = $filas->pluck('det_localidad')->filter()->unique()->values()->toArray();
        $localidades = DB::connection($connection)
            ->table('localidad')
            ->whereIn('localidad', $codigosLocalidad)
            ->select('localidad', DB::raw('MIN(denominacion) as denominacion'))
            ->groupBy('localidad')
            ->pluck('denominacion', 'localidad');

        $hoja_ruta = $filas->groupBy('hruta_d')->map(function ($items) use ($connection, $localidades) {
            $hoja = $items->first();

            $detalles = $items->filter(function ($item) {
                return !is_null($item->det_cliente) || !is_null($item->det_direccion) || !is_null($item->det_cod_postal);
            })->map(function ($item) use ($connection, $localidades) {
                $remito = DB::connection($connection)
                    ->table('rem_cab')
                    ->where('empresa', $item->det_empresa)
                    ->where('tdoc',    $item->det_tdoc)
                    ->where('letra',   $item->det_letra)
                    ->where('sucur',   $item->det_sucur)
                    ->where('numero',  $item->det_numero)
                    ->value('fecha_conf_ent_app');
                
                $img = DB::connection($connection)
                    ->table('rem_cab_img')
                    ->whereRaw('RTRIM(empresa) = ?', [trim($item->det_empresa)])
                    ->whereRaw('RTRIM(tdoc) = ?', [trim($item->det_tdoc)])
                    ->whereRaw('RTRIM(letra) = ?', [trim($item->det_letra)])
                    ->whereRaw('RTRIM(sucur) = ?', [trim($item->det_sucur)])
                    ->whereRaw('RTRIM(CAST(numero AS VARCHAR)) = ?', [trim($item->det_numero)])
                    ->select('path as img_path', 'archivo as img_archivo', 'estado as img_estado', 'coordenadas', 'ubicacion')
                    ->first();
                
                $telefono = DB::connection($connection)
                    ->table('clientes_emp')
                    ->where('empresa', $item->det_empresa)
                    ->where('raz_soc', 'like', $item->det_cliente)
                    ->value('clientes_emp.tel');

                return [
                    'cliente'    => $item->det_cliente,
                    'direccion'  => $item->det_direccion,
                    'cod_postal' => $item->det_cod_postal,
                    'empresa'         => $item->det_empresa,
                    'empresa_nombre'  => $item->det_empresa_nombre,
                    'tdoc'       => $item->det_tdoc,
                    'letra'      => $item->det_letra,
                    'sucur'      => $item->det_sucur,
                    'numero'     => $item->det_numero,
                    'confirmado' => !is_null($remito) && !str_starts_with($remito, '1900-01-01'),
                    'item'       => $item->det_nro_item,
                    'localidad'         => $item->det_localidad,
                    'localidad_nombre'  => $localidades[$item->det_localidad] ?? null,
                    'img_path'    => $img->img_path ?? null,
                    'img_archivo' => $img->img_archivo ?? null,
                    'img_estado'  => $img->img_estado ?? null,
                    'coordenadas' => $img->coordenadas ?? null,
                    'ubicacion'   => $img->ubicacion ?? null,
                    'telefono'    => $telefono ?? null,
                ];
            })->values();

            unset($hoja->det_cliente, $hoja->det_direccion, $hoja->det_cod_postal, $hoja->det_empresa, $hoja->det_tdoc, $hoja->det_letra, $hoja->det_sucur, $hoja->det_numero, $hoja->det_fecha_conf_ent_app, $hoja->det_nro_item);
            $hoja->detalles = $detalles;

            return $hoja;
        })->values();

        return $hoja_ruta;
    }
    protected function obtenerHojaRutaAyerPorChofer($codigo_chofer) {
        $ayer = Carbon::yesterday()->toDateString();
        $connection = $this->getConnectionName();

        $filas = DB::connection($connection)
            ->table('hoja_ruta_app as hr')
            ->leftJoin('hoja_ruta_app_det as det', 'det.hruta_d', '=', 'hr.hruta_d')
            ->leftJoin('empresa as emp', 'emp.empresa', '=', 'det.empresa')
            ->where('hr.cod_chof', $codigo_chofer)
            ->whereDate('hr.fecha', $ayer)
            ->select(
                'hr.*',
                'det.empresa as det_empresa',
                'det.tdoc as det_tdoc',
                'det.letra as det_letra',
                'det.sucur as det_sucur',
                'det.numero as det_numero',
                'det.cliente as det_cliente',
                'det.direccion as det_direccion',
                'det.cod_postal as det_cod_postal',
                'det.nro_item as det_nro_item',
                'emp.denominacion as det_empresa_nombre',
                'det.localidad as det_localidad',
            )
            ->orderBy('hr.hruta_d')
            ->orderBy('det.nro_item')
            ->get();

        $codigosLocalidad = $filas->pluck('det_localidad')->filter()->unique()->values()->toArray();
        $localidades = DB::connection($connection)
            ->table('localidad')
            ->whereIn('localidad', $codigosLocalidad)
            ->select('localidad', DB::raw('MIN(denominacion) as denominacion'))
            ->groupBy('localidad')
            ->pluck('denominacion', 'localidad');

        $hoja_ruta = $filas->groupBy('hruta_d')->map(function ($items) use ($connection, $localidades) {
            $hoja = $items->first();
            $detalles = $items->filter(function ($item) {
                return !is_null($item->det_cliente) || !is_null($item->det_direccion) || !is_null($item->det_cod_postal);
            })->map(function ($item) use ($connection, $localidades) {
                $remito = DB::connection($connection)
                    ->table('rem_cab')
                    ->where('empresa', $item->det_empresa)
                    ->where('tdoc',    $item->det_tdoc)
                    ->where('letra',   $item->det_letra)
                    ->where('sucur',   $item->det_sucur)
                    ->where('numero',  $item->det_numero)
                    ->value('fecha_conf_ent_app');

                // Obtener datos de imagen solo para el detalle
                $img = DB::connection($connection)
                    ->table('rem_cab_img')
                    ->whereRaw('RTRIM(empresa) = ?', [trim($item->det_empresa)])
                    ->whereRaw('RTRIM(tdoc) = ?', [trim($item->det_tdoc)])
                    ->whereRaw('RTRIM(letra) = ?', [trim($item->det_letra)])
                    ->whereRaw('RTRIM(sucur) = ?', [trim($item->det_sucur)])
                    ->whereRaw('RTRIM(CAST(numero AS VARCHAR)) = ?', [trim($item->det_numero)])
                    ->select('path as img_path', 'archivo as img_archivo', 'estado as img_estado', 'coordenadas', 'ubicacion')
                    ->first();

                $telefono = DB::connection($connection)
                    ->table('clientes_emp')
                    ->where('empresa', $item->det_empresa)
                    ->where('raz_soc', 'like', $item->det_cliente)
                    ->value('clientes_emp.tel');

                return (object) [
                    'cliente'    => $item->det_cliente,
                    'direccion'  => $item->det_direccion,
                    'cod_postal' => $item->det_cod_postal,
                    'empresa'         => $item->det_empresa,
                    'empresa_nombre'  => $item->det_empresa_nombre,
                    'tdoc'       => $item->det_tdoc,
                    'letra'      => $item->det_letra,
                    'sucur'      => $item->det_sucur,
                    'numero'     => $item->det_numero,
                    'confirmado' => !is_null($remito) && !str_starts_with($remito, '1900-01-01'),
                    'item'       => $item->det_nro_item,
                    'localidad'         => $item->det_localidad,
                    'localidad_nombre'  => $localidades[$item->det_localidad] ?? null,
                    'img_path'    => $img->img_path ?? null,
                    'img_archivo' => $img->img_archivo ?? null,
                    'img_estado'  => $img->img_estado ?? null,
                    'coordenadas' => $img->coordenadas ?? null,
                    'ubicacion'   => $img->ubicacion ?? null,
                    'telefono'    => $telefono ?? null,
                ];
            })->values();

            unset($hoja->det_cliente, $hoja->det_direccion, $hoja->det_cod_postal, $hoja->det_empresa, $hoja->det_tdoc, $hoja->det_letra, $hoja->det_sucur, $hoja->det_numero, $hoja->det_fecha_conf_ent_app, $hoja->det_nro_item);
            $hoja->detalles = $detalles;

            return $hoja;
        })->values();

        return $hoja_ruta;
    }
    protected function obtenerHojasRutasPorFecha($fecha, array $filtros = []){
        $connection = $this->getConnectionName();
        $hrutaBusqueda = isset($filtros['hruta_d']) ? trim((string) $filtros['hruta_d']) : '';
        $remitoBusqueda = isset($filtros['remito']) ? trim((string) $filtros['remito']) : '';
        $pendienteImagen = !empty($filtros['pendiente_imagen']);

        $filas = DB::connection($connection)
            ->table('hoja_ruta_app as hr')
            ->leftJoin('hoja_ruta_app_det as det', 'det.hruta_d', '=', 'hr.hruta_d')
            ->leftJoin('empresa as emp', 'emp.empresa', '=', 'det.empresa')
            ->whereDate('hr.fecha', $fecha)
            // ->whereNotIn(DB::raw('RTRIM(hr.cod_chof)'), ['RETI', 'JULI', 'RETO', 'RETP', 'RETU', 'URBA', 'DIST'])
            ->select(
                'hr.*',
                'det.empresa as det_empresa',
                'det.tdoc as det_tdoc',
                'det.letra as det_letra',
                'det.sucur as det_sucur',
                'det.numero as det_numero',
                'det.cliente as det_cliente',
                'det.direccion as det_direccion',
                'det.cod_postal as det_cod_postal',
                'det.nro_item as det_nro_item',
                'emp.denominacion as det_empresa_nombre',
                'det.localidad as det_localidad',
            )
            ->orderBy('hr.hruta_d')
            ->orderBy('det.nro_item')
            ->get();

        $codigosLocalidad = $filas->pluck('det_localidad')->filter()->unique()->values()->toArray();
        $localidades = DB::connection($connection)
            ->table('localidad')
            ->whereIn('localidad', $codigosLocalidad)
            ->select('localidad', DB::raw('MIN(denominacion) as denominacion'))
            ->groupBy('localidad')
            ->pluck('denominacion', 'localidad');

        $hoja_ruta = $filas->groupBy('hruta_d')->map(function ($items) use ($connection, $localidades) {
            $hoja = $items->first();

            $detalles = $items->filter(function ($item) {
                return !is_null($item->det_cliente) || !is_null($item->det_direccion) || !is_null($item->det_cod_postal);
            })->map(function ($item) use ($connection, $localidades) {
                $remito = DB::connection($connection)
                    ->table('rem_cab')
                    ->where('empresa', $item->det_empresa)
                    ->where('tdoc',    $item->det_tdoc)
                    ->where('letra',   $item->det_letra)
                    ->where('sucur',   $item->det_sucur)
                    ->where('numero',  $item->det_numero)
                    ->value('fecha_conf_ent_app');

                // Obtener datos de imagen solo para el detalle
                $img = DB::connection($connection)
                    ->table('rem_cab_img')
                    ->whereRaw('RTRIM(empresa) = ?', [trim($item->det_empresa)])
                    ->whereRaw('RTRIM(tdoc) = ?', [trim($item->det_tdoc)])
                    ->whereRaw('RTRIM(letra) = ?', [trim($item->det_letra)])
                    ->whereRaw('RTRIM(sucur) = ?', [trim($item->det_sucur)])
                    ->whereRaw('RTRIM(CAST(numero AS VARCHAR)) = ?', [trim($item->det_numero)])
                    ->select('path as img_path', 'archivo as img_archivo', 'estado as img_estado', 'coordenadas', 'ubicacion')
                    ->first();

                $telefono = DB::connection($connection)
                    ->table('clientes_emp')
                    ->where('empresa', $item->det_empresa)
                    ->where('raz_soc', 'like', $item->det_cliente)
                    ->value('clientes_emp.tel');

                return (object) [
                    'cliente'    => $item->det_cliente,
                    'direccion'  => $item->det_direccion,
                    'cod_postal' => $item->det_cod_postal,
                    'empresa'         => $item->det_empresa,
                    'empresa_nombre'  => $item->det_empresa_nombre,
                    'tdoc'       => $item->det_tdoc,
                    'letra'      => $item->det_letra,
                    'sucur'      => $item->det_sucur,
                    'numero'     => $item->det_numero,
                    'confirmado' => !is_null($remito) && !str_starts_with($remito, '1900-01-01'),
                    'item'       => $item->det_nro_item,
                    'localidad'         => $item->det_localidad,
                    'localidad_nombre'  => $localidades[$item->det_localidad] ?? null,
                    'img_path'    => $img->img_path ?? null,
                    'img_archivo' => $img->img_archivo ?? null,
                    'img_estado'  => $img->img_estado ?? null,
                    'coordenadas' => $img->coordenadas ?? null,
                    'ubicacion'   => $img->ubicacion ?? null,
                    'telefono'    => $telefono ?? null,
                ];
            })->values();

            unset($hoja->det_cliente, $hoja->det_direccion, $hoja->det_cod_postal, $hoja->det_empresa, $hoja->det_tdoc, $hoja->det_letra, $hoja->det_sucur, $hoja->det_numero, $hoja->det_fecha_conf_ent_app, $hoja->det_nro_item);
            $hoja->detalles = $detalles;

            return $hoja;
        })->filter(function ($hoja) use ($hrutaBusqueda, $remitoBusqueda, $pendienteImagen) {
            if ($hrutaBusqueda !== '' && !$this->hrutaCoincideConBusqueda($hoja->hruta_d ?? '', $hrutaBusqueda)) {
                return false;
            }

            if ($remitoBusqueda !== '') {
                $hoja->detalles = $hoja->detalles->filter(function ($detalle) use ($remitoBusqueda) {
                    return $this->remitoCoincideConBusqueda($detalle, $remitoBusqueda);
                })->values();
            }

            if ($pendienteImagen) {
                $hoja->detalles = $hoja->detalles->filter(function ($detalle) {
                    return !$this->imagenRemitoConfirmada($detalle->img_estado ?? null);
                })->values();
            }

            if (($remitoBusqueda !== '' || $pendienteImagen) && $hoja->detalles->isEmpty()) {
                return false;
            }

            return true;
        })->values();

        return $hoja_ruta;
    }

    private function hrutaCoincideConBusqueda($hrutaD, string $busqueda): bool
    {
        $q = preg_replace('/\s+/', '', $busqueda) ?? '';
        $valor = preg_replace('/\s+/', '', trim((string) $hrutaD)) ?? '';

        return $q !== '' && str_contains($valor, $q);
    }

    private function imagenRemitoConfirmada($estado): bool
    {
        if ($estado === true) {
            return true;
        }

        return is_numeric($estado) && (int) $estado === 1;
    }

    /**
     * Coincide búsqueda flexible: número solo, letra-sucur-numero, etc.
     */
    private function remitoCoincideConBusqueda(object $detalle, string $busqueda): bool
    {
        $qRaw = strtoupper(trim($busqueda));
        $qCompact = preg_replace('/[\s\-_\/]+/', '', $qRaw) ?? '';
        if ($qCompact === '') {
            return true;
        }

        $letra = strtoupper(trim((string) ($detalle->letra ?? '')));
        $sucur = trim((string) ($detalle->sucur ?? ''));
        $numero = trim((string) ($detalle->numero ?? ''));
        $sucurNorm = ltrim($sucur, '0');
        $numeroNorm = ltrim($numero, '0');
        if ($sucurNorm === '') {
            $sucurNorm = '0';
        }
        if ($numeroNorm === '') {
            $numeroNorm = '0';
        }

        $candidatos = [
            $numero,
            $numeroNorm,
            "{$letra}-{$sucur}-{$numero}",
            "{$letra}-{$sucurNorm}-{$numeroNorm}",
            "{$letra}/{$sucur}/{$numero}",
            "{$letra}{$sucur}{$numero}",
            "{$letra}{$sucurNorm}{$numeroNorm}",
        ];

        foreach ($candidatos as $candidato) {
            $texto = strtoupper($candidato);
            $compacto = preg_replace('/[\s\-_\/]+/', '', $texto) ?? '';
            if (str_contains($texto, $qRaw) || str_contains($compacto, $qCompact)) {
                return true;
            }
        }

        return false;
    }
    protected function filtrarHojasRuta($hruta_d, $cod_chof, $fecha){
        $hruta_d = $hruta_d == 0 ? null : $hruta_d;
        $cod_chof = $cod_chof == 'TODOS' ? null : $cod_chof;

        $connection = $this->getConnectionName();
        $filas = DB::connection($connection)
            ->table('hoja_ruta_app as hr')
            ->leftJoin('hoja_ruta_app_det as det', 'det.hruta_d', '=', 'hr.hruta_d')
            ->leftJoin('empresa as emp', 'emp.empresa', '=', 'det.empresa')
            ->whereDate('hr.fecha', $fecha)
            ->when($hruta_d, function ($query) use ($hruta_d) {
                return $query->where('hr.hruta_d', $hruta_d);
            })
            ->when($cod_chof, function ($query) use ($cod_chof) {
                return $query->where('hr.cod_chof', $cod_chof);
            })
            ->select(
                'hr.*',
                'det.empresa as det_empresa',
                'det.tdoc as det_tdoc',
                'det.letra as det_letra',
                'det.sucur as det_sucur',
                'det.numero as det_numero',
                'det.cliente as det_cliente',
                'det.direccion as det_direccion',
                'det.cod_postal as det_cod_postal',
                'det.nro_item as det_nro_item',
                'emp.denominacion as det_empresa_nombre',
                'det.localidad as det_localidad',
            )
            ->orderBy('hr.hruta_d')
            ->orderBy('det.nro_item')
            ->get();

        $codigosLocalidad = $filas->pluck('det_localidad')->filter()->unique()->values()->toArray();
        $localidades = DB::connection($connection)
            ->table('localidad')
            ->whereIn('localidad', $codigosLocalidad)
            ->select('localidad', DB::raw('MIN(denominacion) as denominacion'))
            ->groupBy('localidad')
            ->pluck('denominacion', 'localidad');

        $hoja_ruta = $filas->groupBy('hruta_d')->map(function ($items) use ($connection, $localidades) {
            $hoja = $items->first();

            $detalles = $items->filter(function ($item) {
                return !is_null($item->det_cliente) || !is_null($item->det_direccion) || !is_null($item->det_cod_postal);
            })->map(function ($item) use ($connection, $localidades) {
                $remito = DB::connection($connection)
                    ->table('rem_cab')
                    ->where('empresa', $item->det_empresa)
                    ->where('tdoc',    $item->det_tdoc)
                    ->where('letra',   $item->det_letra)
                    ->where('sucur',   $item->det_sucur)
                    ->where('numero',  $item->det_numero)
                    ->value('fecha_conf_ent_app');
                
                $img = DB::connection($connection)
                    ->table('rem_cab_img')
                    ->whereRaw('RTRIM(empresa) = ?', [trim($item->det_empresa)])
                    ->whereRaw('RTRIM(tdoc) = ?', [trim($item->det_tdoc)])
                    ->whereRaw('RTRIM(letra) = ?', [trim($item->det_letra)])
                    ->whereRaw('RTRIM(sucur) = ?', [trim($item->det_sucur)])
                    ->whereRaw('RTRIM(CAST(numero AS VARCHAR)) = ?', [trim($item->det_numero)])
                    ->select('path as img_path', 'archivo as img_archivo', 'estado as img_estado', 'coordenadas', 'ubicacion')
                    ->first();
                
                $telefono = DB::connection($connection)
                    ->table('clientes_emp')
                    ->where('empresa', $item->det_empresa)
                    ->where('raz_soc', 'like', $item->det_cliente)
                    ->value('clientes_emp.tel');

                return [
                    'cliente'    => $item->det_cliente,
                    'direccion'  => $item->det_direccion,
                    'cod_postal' => $item->det_cod_postal,
                    'empresa'         => $item->det_empresa,
                    'empresa_nombre'  => $item->det_empresa_nombre,
                    'tdoc'       => $item->det_tdoc,
                    'letra'      => $item->det_letra,
                    'sucur'      => $item->det_sucur,
                    'numero'     => $item->det_numero,
                    'confirmado' => !is_null($remito) && !str_starts_with($remito, '1900-01-01'),
                    'item'       => $item->det_nro_item,
                    'localidad'         => $item->det_localidad,
                    'localidad_nombre'  => $localidades[$item->det_localidad] ?? null,
                    'img_path'    => $img->img_path ?? null,
                    'img_archivo' => $img->img_archivo ?? null,
                    'img_estado'  => $img->img_estado ?? null,
                    'coordenadas' => $img->coordenadas ?? null,
                    'ubicacion'   => $img->ubicacion ?? null,
                    'telefono'    => $telefono ?? null,
                ];
            })->values();

            unset($hoja->det_cliente, $hoja->det_direccion, $hoja->det_cod_postal, $hoja->det_empresa, $hoja->det_tdoc, $hoja->det_letra, $hoja->det_sucur, $hoja->det_numero, $hoja->det_fecha_conf_ent_app, $hoja->det_nro_item);
            $hoja->detalles = $detalles;

            return $hoja;
        })->values();

        return $hoja_ruta;
    }
}