[ 'periodo' => [ 'start' => null, 'end' => null ], 'motorista' => null, 'municipio' => null, 'destino' => null, 'status' => null, 'veiculo' => null, 'motivo' => null, 'prontuario' => null, 'protocolo' => null ], 'form' => [ 'motoristas' => null, 'municipios' => null, 'destinos' => null, 'status' => ViagemStatus::find([ EnumViagemStatus::ABERTO, EnumViagemStatus::FINALIZADO, ]), 'veiculos' => null, 'motivos' => null ] ]; } private static function getViagens() { return DB::table('transporte_paciente_viagem as viagem') ->join('transporte_paciente_condutor as condutor', 'viagem.condutor_id', 'condutor.id') ->join('cadastro_usuario as usuario as usuario', 'condutor.usuario_id', 'usuario.id') ->join('cadastro_cidadao as cidadao', 'usuario.cidadao_id', 'cidadao.id') ->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id') ->join('cadastro_paciente as paciente', 'agendar.paciente_id', 'paciente.id') ->join('cadastro_cidadao as paciente_cidadao', 'paciente.cidadao_id', 'paciente_cidadao.id') ->join('transporte_paciente_motivo_viagem_procedimento as motivo', 'agendar.motivo_id', 'motivo.id') ->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id') ->join('intranet.cadastro_municipio as municipio', 'destino.municipio_id', 'municipio.id') ->join('transporte_paciente_veiculo as veiculo', 'agendar.veiculo_id', 'veiculo.id') ->join('transporte_paciente_viagem_status as viagem_status', 'viagem.status_id', 'viagem_status.id') ->select( 'viagem.id', 'viagem.condutor_id', 'cidadao.nome as motorista', 'municipio.nome as municipio', 'viagem_status.descricao as status', 'veiculo.descricao_modelo as veiculo', 'veiculo.numero_capacidade as capacidade', 'viagem.data as data', 'destino.descricao_destino as destino', DB::raw('LPAD(paciente.prontuario, 6, 0) as prontuario'), 'agendar.paciente_id', 'paciente_cidadao.nome as paciente', 'agendar.acompanhante', 'motivo.descricao as motivo', DB::raw("TIME_FORMAT(viagem.horario_chegada, '%H:%i') as horario_chegada"), DB::raw("TIME_FORMAT(viagem.horario_saida_real, '%H:%i') as horario_saida"), 'viagem.diaria', 'viagem.protocolo' ) ->where('viagem.data', '>=', request()->data_inicial) ->where('viagem.data', '<=', request()->data_final) ->when(request()->motorista , function($query) { $query->where('viagem.condutor_id', request()->motorista); }) ->when(request()->municipio , function($query) { $query->where('destino.municipio_id', request()->municipio); }) ->when(request()->destino , function($query) { $query->where('agendar.destino_id', request()->destino); }) ->when(request()->veiculo , function($query) { $query->where('viagem.veiculo_id', request()->veiculo); }) ->when(request()->motivo , function($query) { $query->where('agendar.motivo_id', request()->motivo); }) ->where('viagem.status_id', '!=', EnumViagemStatus::CANCELADO) ->when(request()->status, function($query) { $query->where('viagem.status_id', request()->status); }) ->when(request()->prontuario, function($query) { $query->where('paciente.prontuario', request()->prontuario); }) ->when(request()->protocolo, function($query) { $query->where('viagem.protocolo', request()->protocolo); }) ->orderBy('viagem.data') ->get(); } private static function getTotalGeral($viagens) { $pacientes = $viagens->count(); $acompanhantes = $viagens->reduce(function ($carry, $item) { return $carry + $item->acompanhante; }); $passageiros = $pacientes + $acompanhantes; return [ 'viagens' => $viagens->groupBy('id')->count(), 'diarias' => $viagens->unique('id')->sum('diaria'), 'pacientes' => $pacientes, 'acompanhantes' => $acompanhantes ?? 0, 'passageiros' => $passageiros, 'porcentagem' => $passageiros != 0 ? round($acompanhantes / $passageiros * 100) : 0 ]; } private static function getTotalMotoristas($viagens) { $total = []; $viagens->groupBy('condutor_id')->each(function($item) use(&$total) { array_push($total, [ 'motorista' => $item[0]->motorista, 'passageiros' => $item->sum('acompanhante') + $item->count(), 'viagens' => $item->unique('id')->count(), 'diarias' => $item->unique('id')->sum('diaria'), ]); }); return $total; } public static function list() { $viagens = self::getViagens(); $total = self::getTotalGeral($viagens); $motoristas = self::getTotalMotoristas($viagens); return [ 'viagens' => $viagens, 'total' => $total, 'motoristas' => $motoristas, ]; } public static function getPrintExportData() { $items = self::list(); $agrupados = collect($items['viagens'])->groupBy(function ($item) { return "{$item->motorista}-{$item->municipio}-{$item->status}-{$item->veiculo}-" . ($item->horario_saida ?? 'Sem horĂ¡rio'); }); return [ 'data_inicial' => Carbon::parse(request()->data_inicial)->format('d/m/Y'), 'data_final' => Carbon::parse(request()->data_final)->format('d/m/Y'), 'motorista' => request()->filtro_motorista, 'municipio' => request()->filtro_municipio, 'destino' => request()->filtro_destino, 'status' => request()->filtro_status, 'veiculo' => request()->filtro_veiculo, 'agrupados' => $agrupados, 'motivo' => request()->filtro_motivo, 'prontuario' => request()->prontuario, 'items' => $items['viagens']->each(function($item) { $item->data = Carbon::parse($item->data)->format('d/m/Y'); }), 'motoristas' => $items['motoristas'], 'total' => $items['total'], 'colunas' => collect(request()->selectedCols), ]; } public static function getMotoristas() { return DB::table('transporte_paciente_viagem as viagem') ->join('transporte_paciente_condutor as condutor', 'viagem.condutor_id', 'condutor.id') ->join('cadastro_usuario as usuario as usuario', 'condutor.usuario_id', 'usuario.id') ->join('cadastro_cidadao as cidadao', 'usuario.cidadao_id', 'cidadao.id') ->select('condutor.id', 'cidadao.nome') ->where('viagem.data', '>=', request()->data_inicial) ->where('viagem.data', '<=', request()->data_final) ->when(request()->status, function($query) { $query->where('viagem.status_id', request()->status); }) ->orderBy('cidadao.nome') ->distinct() ->get(); } public static function getMunicipios() { return DB::table('transporte_paciente_viagem as viagem') ->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id') ->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id') ->join('intranet.cadastro_municipio as municipio', 'destino.municipio_id', 'municipio.id') ->select('municipio.id', 'municipio.nome') ->where('viagem.data', '>=', request()->data_inicial) ->where('viagem.data', '<=', request()->data_final) ->when(request()->motorista, function($query) { $query->where('viagem.condutor_id', request()->motorista); }) ->when(request()->status, function($query) { $query->where('viagem.status_id', request()->status); }) ->orderBy('municipio.nome') ->distinct() ->get(); } public static function getDestinos() { return DB::table('transporte_paciente_viagem as viagem') ->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id') ->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id') ->select('destino.id', 'destino.descricao_destino as descricao') ->where('viagem.data', '>=', request()->data_inicial) ->where('viagem.data', '<=', request()->data_final) ->when(request()->motorista, function($query) { $query->where('viagem.condutor_id', request()->motorista); }) ->when(request()->municipio, function($query) { $query->where('destino.municipio_id', request()->municipio); }) ->when(request()->status, function($query) { $query->where('viagem.status_id', request()->status); }) ->orderBy('descricao') ->distinct() ->get(); } public static function getVeiculos() { return DB::table('transporte_paciente_viagem as viagem') ->join('transporte_paciente_veiculo as veiculo', 'viagem.veiculo_id', 'veiculo.id') ->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id') ->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id') ->select('veiculo.id', DB::raw('CONCAT(veiculo.numero_placa, " - ", veiculo.descricao_modelo) AS descricao')) ->where('viagem.data', '>=', request()->data_inicial) ->where('viagem.data', '<=', request()->data_final) ->when(request()->motorista, function($query) { $query->where('viagem.condutor_id', request()->motorista); }) ->when(request()->municipio, function($query) { $query->where('destino.municipio_id', request()->municipio); }) ->when(request()->destino, function($query) { $query->where('destino.id', request()->destino); }) ->when(request()->status, function($query) { $query->where('viagem.status_id', request()->status); }) ->orderBy('descricao') ->distinct() ->get(); } public static function getMotivos() { return DB::table('transporte_paciente_viagem as viagem') ->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id') ->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id') ->join('transporte_paciente_motivo_viagem_procedimento as motivo', 'agendar.motivo_id', 'motivo.id') ->select('motivo.id', 'motivo.descricao') ->where('viagem.data', '>=', request()->data_inicial) ->where('viagem.data', '<=', request()->data_final) ->when(request()->motorista, function($query) { $query->where('viagem.condutor_id', request()->motorista); }) ->when(request()->municipio, function($query) { $query->where('destino.municipio_id', request()->municipio); }) ->when(request()->destino, function($query) { $query->where('destino.id', request()->destino); }) ->when(request()->veiculo, function($query) { $query->where('viagem.veiculo_id', request()->veiculo); }) ->when(request()->status, function($query) { $query->where('viagem.status_id', request()->status); }) ->orderBy('motivo.descricao') ->distinct() ->get(); } }