format('Y-m-d'); $parametrizacao = Parametrizacao::first(); $paciente = Paciente::with([ 'unidade:id,nome_fantasia', 'cidadao' => function ($query) { $query->select('id', 'nome', 'nome_social', 'preferencia_nome_id', 'data_nascimento', 'cpf', 'sexo_id', 'domicilio_id', 'raca_cor_id', 'nacionalidade_id', 'cns') ->with([ 'carteiraIdentidade:id,cidadao_id,numero', 'conveniosMedico:id,nome', 'situacaoFamiliarConjugal:id,descricao', 'telefones:id,cidadao_id,numero' ]); }, 'classificacao:id,descricao' ])->findOrFail($id); $cidadao = $paciente->cidadao; $endereco = $paciente->cidadao->domicilio->endereco ?? null; $cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail(); $currentLotacao = self::getCurrentLotacao(); $tipoPassageiro = DB::table('transporte_paciente_veiculo_tipo_passageiro') ->orderBy('descricao') ->get(); $tipo = DB::table('transporte_paciente_veiculo_tipo') ->orderBy('descricao') ->get(); $relacoes = DB::table('transporte_paciente_acompanhante_relacao') ->get(); $telefones = DB::table('cadastro_cidadao_telefone') ->select(DB::raw("CONCAT(SUBSTR(numero, 1, 2), ' ', SUBSTR(numero, 3)) as numero_formatado")) ->where('cidadao_id', $paciente->cidadao->id) ->get(); return [ 'data_atual' => $now->format('d/m/Y'), 'periodo' => [ 'start' => $currentDate, 'end' => $currentDate, ], 'municipios' => self::getMunicipios(), 'destinos' => self::getDestinos(), 'municipios_destinos' => Cache::remember('municipios_destinos', 60, function () { return DB::table('transporte_paciente_destino as destino') ->select('municipio.id', 'municipio.nome') ->join('intranet.cadastro_municipio as municipio', 'destino.municipio_id', 'municipio.id') ->where('bloqueado', false) ->groupBy('destino.municipio_id') ->get(); }), 'pontos' => AgendarService::getPontos(), 'horariosSaida' => self::getHorariosSaida(), 'tipos_passageiro' => $tipoPassageiro, 'veiculo_obrigatorio' => $parametrizacao->veiculo ?? null, 'tipos_veiculo' => $tipo, 'horario_saida' => $parametrizacao->horario_saida ?? null, 'mensagem_protocolo' => $parametrizacao->mensagem_protocolo ?? null, 'agendar_transporte_jornada' => $parametrizacao->agendar_transporte_jornada ?? null, 'comprovante_acompanhante' => $parametrizacao->comprovante_acompanhante ?? null, 'relacoes' => $relacoes, 'paciente' => [ 'id' => $paciente->id ?? null, 'nome' => $cidadao->nome ?? null, 'nome_social' => $cidadao->nome_social, 'prefere_nome_social' => $paciente->cidadao ->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL, 'data_nascimento' => $cidadao->data_nascimento ? $cidadao->data_nascimento->format('d/m/Y') : '', 'cpf' => $cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null, 'rg' => $cidadao->carteiraIdentidade->numero ?? null, 'convenio_medico_nome' => $cidadao->conveniosMedico->first()->nome ?? null, 'situacao_familiar' => $cidadao->situacaoFamiliarConjugal->descricao ?? null, 'prontuario' => $paciente->prontuario, 'unidade' => $paciente->unidade->nome_fantasia ?? null, 'sexo' => $cidadao->sexo ?? '-', 'domicilio_id' => $cidadao->domicilio_id ?? null, 'raca_cor_id' => $cidadao->raca_cor_id ?? null, 'nacionalidade_id' => $cidadao->nacionalidade_id ?? null, 'classificacao_id' => $paciente->classificacao_id ?? '-', 'classificacao_nome' => $paciente->classificacao->descricao ?? '-', 'cns' => $cidadao->cns ? MaskUtil::getCnsMasked($cidadao->cns) : '', 'idade' => $cidadao->data_nascimento ? "{$cidadao->idade['anos']} ano(s), " . "{$cidadao->idade['meses']} mês(es) e " . "{$cidadao->idade['dias']} dia(s) " : 'NÃO INFORMADA', 'telefones' => $telefones ], 'endereco' => [ 'estado_id' => $endereco ? $endereco->logradouro->municipio->estado->id : null, 'municipio' => $endereco ? $endereco->logradouro->municipio : null, 'logradouro' => $endereco ? $endereco->logradouro : null, 'cep' => $endereco ? MaskUtil::getCepMasked($endereco->logradouro->cep) : null, 'numero' => $endereco ? $endereco->numero : null, 'sem_numero' => $endereco ? $endereco->sem_numero : null, 'complemento' => $endereco ? $endereco->complemento ?? '' : null, 'zona_id' => $endereco ? $endereco->zona_id : null, ], 'cliente' => [ 'sistema' => [ 'ramo_atividade' => [ 'nome' => $cliente->sistema->ramoAtividade->nome ?? null, ], 'nome' => $cliente->sistema->nome ?? null, 'versao' => $cliente->sistema->versao ?? null, ], 'municipio' => [ 'estado' => [ 'uf' => $cliente->municipio->estado->uf ?? null, ], 'nome' => $cliente->municipio->nome ?? null, ], 'nome' => $cliente->nome ?? null, 'email' => $cliente->email ?? null, 'site' => $cliente->site ?? null, 'logotipo' => $cliente->logotipo ?? null, ], 'usuario' => $currentLotacao->usuario->cidadao->nome, ]; } private static function getModelData($id) { $destino = [ 'agendamentos' => self::getAgendamentos($id) ]; return $destino; } public static function show($id) { return [ 'form' => self::getFormData($id), 'model' => self::getModelData($id), ]; } public static function store() { $ids = []; foreach (request()->agendar as $params) { $escolher = Agendar::where('id', $params['id'])->first(); $status = $params["data_saida"] === $escolher->data_saida ? Status::MODIFICADO : Status::REAGENDADO; if($params['veiculo_id'] != $escolher->veiculo_id) { $escolher->veiculo_edited_by = self::getCurrentLotacao()->usuario->id; $escolher->veiculo_edited_at = Carbon::now(); $escolher->funcionalidade_origem = Funcionalidade::GERENCIAMENTO_VIAGEM; } $escolher->fill($params); $escolher->acompanhante_1_id = $params['acompanhante1_id']; $escolher->acompanhante_2_id = $params['acompanhante2_id']; $escolher->save(); HistoricoService::create($escolher, $status, $escolher->updated_lotacao_id); if (isset($params['acompanhante1'])) { $acompanhante1 = Acompanhante::where('id', $params['acompanhante1']['id'])->first() ?? new Acompanhante; $acompanhante1->relacao_id = $params['acompanhante1']['relacao_id'] ?? null; $acompanhante1->usuario_id = $params['acompanhante1']['usuario_id'] ?? null; if (!$acompanhante1->usuario_id) { if (isset($params['acompanhante1']['nome'])) { if (is_array($params['acompanhante1']['nome'])) { $acompanhante1->nome = $params['acompanhante1']['nome']['cidadao']['nome'] ?? null; } else { $acompanhante1->nome = $params['acompanhante1']['nome']; } } else { $acompanhante1->nome = null; } $acompanhante1->telefone = isset($params['acompanhante1']['telefone']) ? preg_replace('/\D/', '', $params['acompanhante1']['telefone']) : null; } $acompanhante1->save(); $agendar = Agendar::where('id', $params['id'])->first(); $agendar->acompanhante_1_id = $acompanhante1->id; $agendar->save(); HistoricoService::create($agendar, Status::MODIFICADO, $agendar->updated_lotacao_id); } if (isset($params['acompanhante2'])) { $acompanhante2 = Acompanhante::where('id', $params['acompanhante2']['id'])->first() ?? new Acompanhante; $acompanhante2->relacao_id = $params['acompanhante2']['relacao_id'] ?? null; $acompanhante2->usuario_id = $params['acompanhante2']['usuario_id'] ?? null; if (!$acompanhante2->usuario_id) { if (isset($params['acompanhante2']['nome'])) { if (is_array($params['acompanhante2']['nome'])) { $acompanhante2->nome = $params['acompanhante2']['nome']['cidadao']['nome'] ?? null; } else { $acompanhante2->nome = $params['acompanhante2']['nome']; } } else { $acompanhante2->nome = null; } $acompanhante2->telefone = isset($params['acompanhante2']['telefone']) ? preg_replace('/\D/', '', $params['acompanhante2']['telefone']) : null; } $acompanhante2->save(); $agendar = Agendar::where('id', $params['id'])->first(); $agendar->acompanhante_2_id = $acompanhante2->id; $agendar->save(); HistoricoService::create($agendar, Status::MODIFICADO, $agendar->updated_lotacao_id); } $ids[] = $escolher->id; } if(!isset(request()->ids_cancelado)){ return; } $agendar = Agendar::where('paciente_id', request()->paciente_id) ->whereIn('id', request()->ids_cancelado); $transportes = $agendar->get(); if($transportes->isNotEmpty()){ $agendar->update(['status_id' => Status::CANCELADO]); foreach($transportes as $transporte) { HistoricoService::create($transporte, Status::CANCELADO, $transporte->updated_lotacao_id); } } } public static function update() { foreach (request()->agendar as $params) { $update = Agendar::find($params['id']); if (isset($update)) { $status = $params["data_saida"] === $update->data_saida ? Status::MODIFICADO : Status::REAGENDADO; if($params['veiculo_id'] != $update->veiculo_id) { $update->veiculo_edited_by = self::getCurrentLotacao()->usuario->id; $update->veiculo_edited_at = Carbon::now(); $update->funcionalidade_origem = Funcionalidade::GERENCIAMENTO_VIAGEM; } $update->motivo_id = $params['motivo']; $update->horario = $params['horario']; $update->municipio_id = $params['municipio']; $update->destino_id = $params['destino']; $update->consulta_observacao = $params['consulta_observacao']; $update->observacao = $params['observacao']; $update->acompanhante = $params['acompanhante']; $update->ponto_id = $params['ponto']; $update->horario_saida = $params['horario_saida']; $update->tipo_passageiro_id = $params['tipo_passageiro']; $update->veiculo_id = $params['veiculo_id']; $update->jornada_id = (isset($params['jornada_id']) && !empty($params['jornada_id'])) ? $params['jornada_id'] : null; $update->acompanhante_1_id = $params['acompanhante'] >= 1 ? $params['acompanhante1_id'] : null; $update->acompanhante_2_id = $params['acompanhante'] == 2 ? $params['acompanhante2_id'] : null; $update->status_id = $status; $update->updated_lotacao_id = self::getCurrentLotacao()->usuario->id; if (!$params['items_selecionados']) { $update->data = $params['data']; $update->data_saida = $params['data_saida']; } $update->save(); HistoricoService::create($update, $status, $update->updated_lotacao_id); if(isset($params['acompanhante1']) && $params['acompanhante'] >= 1) { $acompanhante1 = Acompanhante::where('id', $params['acompanhante1']['id'])->first() ?? new Acompanhante; $acompanhante1->relacao_id = $params['acompanhante1']['relacao_id'] ?? null; $acompanhante1->usuario_id = $params['acompanhante1']['usuario_id'] ?? null; if(!$acompanhante1->usuario_id) { if (isset($params['acompanhante1']['nome'])) { if (is_array($params['acompanhante1']['nome'])) { $acompanhante1->nome = $params['acompanhante1']['nome']['cidadao']['nome'] ?? null; } else { $acompanhante1->nome = $params['acompanhante1']['nome']; } } else { $acompanhante1->nome = null; } $acompanhante1->telefone = isset($params['acompanhante1']['telefone']) ? preg_replace('/\D/', '', $params['acompanhante1']['telefone']) : null; } $acompanhante1->save(); $agendar = Agendar::where('id', $params['id'])->first(); $agendar->acompanhante_1_id = $acompanhante1->id; $agendar->save(); } if(isset($params['acompanhante2']) && $params['acompanhante'] == 2) { $acompanhante2 = Acompanhante::where('id', $params['acompanhante2']['id'])->first() ?? new Acompanhante; $acompanhante2->relacao_id = $params['acompanhante2']['relacao_id'] ?? null; $acompanhante2->usuario_id = $params['acompanhante2']['usuario_id'] ?? null; if(!$acompanhante2->usuario_id) { if (isset($params['acompanhante2']['nome'])) { if (is_array($params['acompanhante2']['nome'])) { $acompanhante2->nome = $params['acompanhante2']['nome']['cidadao']['nome'] ?? null; } else { $acompanhante2->nome = $params['acompanhante2']['nome']; } } else { $acompanhante2->nome = null; } $acompanhante2->telefone = isset($params['acompanhante2']['telefone']) ? preg_replace('/\D/', '', $params['acompanhante2']['telefone']) : null; } $acompanhante2->save(); $agendar = Agendar::where('id', $params['id'])->first(); $agendar->acompanhante_2_id = $acompanhante2->id; $agendar->save(); } } } } public static function getHorariosSaida() { $now = Carbon::now(); $currentDate = $now->format('Y-m-d'); $data_saida = request()->data_saida ?? $currentDate; return Agendar::where('data_saida', $data_saida) ->whereNotNull('horario_saida') ->whereNull('veiculo_id') ->when(request()->municipio_id, function ($query) { $query->where('municipio_id', request()->municipio_id); }) ->when(request()->destino_id, function ($query) { $query->where('destino_id', request()->destino_id); }) ->select(DB::raw("TIME_FORMAT(horario_saida, '%H:%i') as horario_saida")) ->distinct() ->orderBy('horario_saida') ->get(); } public static function getMunicipios() { $now = Carbon::now(); $currentDate = $now->format('Y-m-d'); $data_saida = request()->data_saida ?? $currentDate; return Agendar::join('intranet.cadastro_municipio', 'intranet.cadastro_municipio.id', '=', 'transporte_paciente_agendar_transporte.municipio_id') ->where('transporte_paciente_agendar_transporte.data_saida', $data_saida) ->whereNull('transporte_paciente_agendar_transporte.veiculo_id') ->select('intranet.cadastro_municipio.id','intranet.cadastro_municipio.nome') ->distinct() ->get(); } public static function getDestinos() { $now = Carbon::now(); $currentDate = $now->format('Y-m-d'); $data_saida = request()->data_saida ?? $currentDate; return Destino::join('transporte_paciente_agendar_transporte', 'transporte_paciente_agendar_transporte.destino_id', '=', 'transporte_paciente_destino.id') ->whereNull('transporte_paciente_agendar_transporte.veiculo_id') ->where('transporte_paciente_destino.municipio_id', request()->municipio_id) ->where('transporte_paciente_agendar_transporte.data_saida', $data_saida) ->where('transporte_paciente_destino.bloqueado', false) ->select('transporte_paciente_destino.id','transporte_paciente_destino.descricao_destino as descricao') ->distinct() ->get(); } public static function getAgendamentos($id) { $parametrizacao = Parametrizacao::first(); if(!$parametrizacao->campo_livre){ return DB::table('transporte_paciente_agendar_transporte') ->leftJoin('transporte_paciente_jornada as jornadas', 'transporte_paciente_agendar_transporte.jornada_id', 'jornadas.id') ->leftJoin('intranet.cadastro_municipio as municipios', 'transporte_paciente_agendar_transporte.municipio_id', 'municipios.id') ->leftJoin('intranet.cadastro_estado as estados', 'municipios.estado_id', 'estados.id') ->leftJoin('transporte_paciente_veiculo as veiculos', 'transporte_paciente_agendar_transporte.veiculo_id', 'veiculos.id') ->leftJoin('transporte_paciente_motivo_viagem_procedimento as motivos', 'transporte_paciente_agendar_transporte.motivo_id', '=', 'motivos.id') ->leftJoin('transporte_paciente_ponto as pontos', 'transporte_paciente_agendar_transporte.ponto_id', 'pontos.id') ->leftJoin('transporte_paciente_viagem as viagens', 'transporte_paciente_agendar_transporte.viagem_id', 'viagens.id') ->leftJoin('cadastro_lotacao as lotacoes', 'transporte_paciente_agendar_transporte.created_lotacao_id', 'lotacoes.id') ->leftJoin('cadastro_usuario as agendadores', 'lotacoes.usuario_id', 'agendadores.id') ->leftJoin('cadastro_cidadao as agendador_cidadaos', 'agendadores.cidadao_id', 'agendador_cidadaos.id') ->leftJoin('cadastro_infraestrutura as infraestruturas', 'lotacoes.infraestrutura_id', 'infraestruturas.id') ->leftJoin('cadastro_unidade as unidades', 'infraestruturas.unidade_id', 'unidades.id') ->leftJoin('transporte_paciente_veiculo_tipo_passageiro as tipo_passageiro', 'tipo_passageiro.id', 'transporte_paciente_agendar_transporte.tipo_passageiro_id') ->leftJoin('transporte_paciente_destino as paciente_destino', 'paciente_destino.id', 'transporte_paciente_agendar_transporte.destino_id') ->leftJoin('transporte_paciente_acompanhante as paciente_acompanhante_1', 'paciente_acompanhante_1.id', 'transporte_paciente_agendar_transporte.acompanhante_1_id') ->leftJoin('cadastro_paciente as cadastro_paciente_acompanhante_1', 'cadastro_paciente_acompanhante_1.id', 'paciente_acompanhante_1.usuario_id') ->leftJoin('cadastro_cidadao as cadastro_cidadao_acompanhante_1', 'cadastro_paciente_acompanhante_1.cidadao_id', 'cadastro_cidadao_acompanhante_1.id') ->leftJoin('cadastro_cidadao_telefone as telefone_acompanhante_1', function ($join) { $join->on('cadastro_cidadao_acompanhante_1.id', '=', 'telefone_acompanhante_1.cidadao_id') ->whereNull('telefone_acompanhante_1.deleted_at') ->where('telefone_acompanhante_1.principal', true); }) ->leftJoin('transporte_paciente_acompanhante as paciente_acompanhante_2', 'paciente_acompanhante_2.id', 'transporte_paciente_agendar_transporte.acompanhante_2_id') ->leftJoin('cadastro_paciente as cadastro_paciente_acompanhante_2', 'cadastro_paciente_acompanhante_2.id', 'paciente_acompanhante_2.usuario_id') ->leftJoin('cadastro_cidadao as cadastro_cidadao_acompanhante_2', 'cadastro_paciente_acompanhante_2.cidadao_id', 'cadastro_cidadao_acompanhante_2.id') ->leftJoin('cadastro_cidadao_telefone as telefone_acompanhante_2', function ($join) { $join->on('cadastro_cidadao_acompanhante_2.id', '=', 'telefone_acompanhante_2.cidadao_id') ->whereNull('telefone_acompanhante_2.deleted_at') ->where('telefone_acompanhante_2.principal', true); }) ->where('transporte_paciente_agendar_transporte.paciente_id', $id) ->where(function ($query) { $query->whereNotIn('transporte_paciente_agendar_transporte.status_id', [Status::CANCELADO]) ->orWhereNull('transporte_paciente_agendar_transporte.status_id'); }) ->select( 'transporte_paciente_agendar_transporte.*', 'jornadas.data_inicial', 'jornadas.data_final', 'municipios.nome as municipio_nome', 'estados.uf as estado_uf', 'veiculos.numero_placa', 'veiculos.descricao_modelo', 'motivos.descricao as motivo_descricao', 'pontos.casa_paciente', 'pontos.descricao as ponto_descricao', 'viagens.protocolo', 'agendador_cidadaos.nome as agendador_nome', 'unidades.nome_fantasia as unidade_agendadora', 'tipo_passageiro.descricao as tipo_passageiro_descricao', 'paciente_destino.descricao_destino as destino_descricao', 'paciente_acompanhante_1.id as acompanhante_1_id', 'paciente_acompanhante_1.usuario_id as acompanhante_1_usuario_id', 'cadastro_cidadao_acompanhante_1.nome as acompanhante_1_nome', 'cadastro_cidadao_acompanhante_1.cns as acompanhante_1_cns', 'telefone_acompanhante_1.numero as acompanhante_1_telefone', 'paciente_acompanhante_1.relacao_id as acompanhante_1_relacao_id', 'paciente_acompanhante_2.id as acompanhante_2_id', 'paciente_acompanhante_2.usuario_id as acompanhante_2_usuario_id', 'cadastro_cidadao_acompanhante_2.nome as acompanhante_2_nome', 'cadastro_cidadao_acompanhante_2.cns as acompanhante_2_cns', 'telefone_acompanhante_2.numero as acompanhante_2_telefone', 'paciente_acompanhante_2.relacao_id as acompanhante_2_relacao_id', ) ->get() ->map(function ($query) { return [ 'id' => $query->id ?? null, 'selecionado' => false, 'alterado' => false, 'jornada_id' => $query->jornada_id ?? null, 'paciente_id' => $query->paciente_id ?? null, 'acompanhante1_id' => $query->acompanhante_1_id ?? null, 'acompanhante2_id' => $query->acompanhante_2_id ?? null, 'paciente_nome' => $query->paciente_nome ?? null, 'numero_placa' => $query->numero_placa ?? null, 'descricao_modelo' => $query->descricao_modelo ?? null, 'consulta_observacao' => $query->consulta_observacao ?? null, 'observacao' => $query->observacao ?? null, 'supervisor_id' => $query->supervisor_id ?? null, 'data' => $query->data ?? null, 'data_saida' => $query->data_saida ?? null, 'acompanhante' => $query->acompanhante ?? null, 'horario' => (new Carbon($query->horario))->format('H:i') ?? null, 'horario_saida' => $query->horario_saida ? (new Carbon($query->horario_saida))->format('H:i') : null, 'uf' => $query->estado_uf ?? null, 'municipio' => [ 'id' => $query->municipio_id, 'nome' => $query->municipio_nome ?? null, ], 'acompanhante1' => [ 'nome' => [ 'cidadao' => [ 'nome' => $query->acompanhante_1_nome ?? null, ] ], 'id' => $query->acompanhante_1_id ?? null, 'usuario_id' => $query->acompanhante_1_usuario_id ?? null, 'cns' => $query->acompanhante_1_cns ?? null, 'telefone' => $query->acompanhante_1_telefone ?? null, 'relacao_id' => $query->acompanhante_1_relacao_id ?? null, ], 'acompanhante2' => [ 'nome' => [ 'cidadao' => [ 'nome' => $query->acompanhante_2_nome ?? null, ] ], 'id' => $query->acompanhante_2_id ?? null, 'usuario_id' => $query->acompanhante_2_usuario_id ?? null, 'cns' => $query->acompanhante_2_cns ?? null, 'telefone' => $query->acompanhante_2_telefone ?? null, 'relacao_id' => $query->acompanhante_2_relacao_id ?? null, ], 'destino_id' => $query->destino_id ?? null, 'veiculo_id' => $query->veiculo_id ?? null, 'veiculo' => [ 'descricao' => $query->numero_placa . ' - ' . $query->descricao_modelo, ], 'jornada_id' => $query->jornada_id ?? null, 'jornada' => [ 'descricao' => $query->data_inicial . ' - ' . $query->data_final, ], 'ponto_id' => $query->ponto_id ?? null, 'tipo_passageiro_id' => $query->tipo_passageiro_id ?? null, 'tipo_passageiro' => [ 'descricao' => strtoupper($query->tipo_passageiro_descricao ?? null), ], 'status_id' => $query->status_id ?? null, 'destino' => $query->destino_descricao ?? null, 'ponto' => $query->ponto_descricao ?? null, 'motivo' => [ 'id' => $query->motivo_id ?? null, 'descricao' => $query->motivo_descricao ?? null, ], 'protocolo' => $query->protocolo ?? '-', 'data_agendamento' => (new Carbon($query->created_at))->format('d/m/Y'), 'agendador' => $query->agendador_nome ?? null, 'unidade_agendadora' => $query->unidade_agendadora ?? null, ]; }); } else { return DB::table('transporte_paciente_agendar_transporte') ->leftJoin('transporte_paciente_jornada as jornadas', 'transporte_paciente_agendar_transporte.jornada_id', 'jornadas.id') ->leftJoin('intranet.cadastro_municipio as municipios', 'transporte_paciente_agendar_transporte.municipio_id', 'municipios.id') ->leftJoin('intranet.cadastro_estado as estados', 'municipios.estado_id', 'estados.id') ->leftJoin('transporte_paciente_veiculo as veiculos', 'transporte_paciente_agendar_transporte.veiculo_id', 'veiculos.id') ->leftJoin('transporte_paciente_motivo_viagem_procedimento as motivos', 'transporte_paciente_agendar_transporte.motivo_id', '=', 'motivos.id') ->leftJoin('transporte_paciente_ponto as pontos', 'transporte_paciente_agendar_transporte.ponto_id', 'pontos.id') ->leftJoin('transporte_paciente_viagem as viagens', 'transporte_paciente_agendar_transporte.viagem_id', 'viagens.id') ->leftJoin('cadastro_lotacao as lotacoes', 'transporte_paciente_agendar_transporte.created_lotacao_id', 'lotacoes.id') ->leftJoin('cadastro_usuario as agendadores', 'lotacoes.usuario_id', 'agendadores.id') ->leftJoin('cadastro_cidadao as agendador_cidadaos', 'agendadores.cidadao_id', 'agendador_cidadaos.id') ->leftJoin('cadastro_infraestrutura as infraestruturas', 'lotacoes.infraestrutura_id', 'infraestruturas.id') ->leftJoin('cadastro_unidade as unidades', 'infraestruturas.unidade_id', 'unidades.id') ->leftJoin('transporte_paciente_veiculo_tipo_passageiro as tipo_passageiro', 'tipo_passageiro.id', 'transporte_paciente_agendar_transporte.tipo_passageiro_id') ->leftJoin('transporte_paciente_destino as paciente_destino', 'paciente_destino.id', 'transporte_paciente_agendar_transporte.destino_id') ->leftJoin('transporte_paciente_acompanhante as paciente_acompanhante_1', 'paciente_acompanhante_1.id', 'transporte_paciente_agendar_transporte.acompanhante_1_id') ->leftJoin('transporte_paciente_acompanhante as paciente_acompanhante_2', 'paciente_acompanhante_2.id', 'transporte_paciente_agendar_transporte.acompanhante_2_id') ->leftJoin('cadastro_paciente as cadastro_paciente_acompanhante_2', 'cadastro_paciente_acompanhante_2.id', 'paciente_acompanhante_2.usuario_id') ->where('transporte_paciente_agendar_transporte.paciente_id', $id) ->where(function ($query) { $query->whereNotIn('transporte_paciente_agendar_transporte.status_id', [Status::CANCELADO]) ->orWhereNull('transporte_paciente_agendar_transporte.status_id'); }) ->select( 'transporte_paciente_agendar_transporte.*', 'jornadas.data_inicial', 'jornadas.data_final', 'municipios.nome as municipio_nome', 'estados.uf as estado_uf', 'veiculos.numero_placa', 'veiculos.descricao_modelo', 'motivos.descricao as motivo_descricao', 'pontos.casa_paciente', 'pontos.descricao as ponto_descricao', 'viagens.protocolo', 'agendador_cidadaos.nome as agendador_nome', 'unidades.nome_fantasia as unidade_agendadora', 'tipo_passageiro.descricao as tipo_passageiro_descricao', 'paciente_destino.descricao_destino as destino_descricao', 'paciente_acompanhante_1.id as acompanhante_1_id', 'paciente_acompanhante_1.nome as acompanhante_1_nome', 'paciente_acompanhante_1.telefone as acompanhante_1_telefone', 'paciente_acompanhante_1.relacao_id as acompanhante_1_relacao_id', 'paciente_acompanhante_2.id as acompanhante_2_id', 'paciente_acompanhante_2.nome as acompanhante_2_nome', 'paciente_acompanhante_2.telefone as acompanhante_2_telefone', 'paciente_acompanhante_2.relacao_id as acompanhante_2_relacao_id', ) ->get() ->map(function ($query) { return [ 'id' => $query->id ?? null, 'selecionado' => false, 'alterado' => false, 'jornada_id' => $query->jornada_id ?? null, 'paciente_id' => $query->paciente_id ?? null, 'acompanhante1_id' => $query->acompanhante_1_id ?? null, 'acompanhante2_id' => $query->acompanhante_2_id ?? null, 'paciente_nome' => $query->paciente_nome ?? null, 'numero_placa' => $query->numero_placa ?? null, 'descricao_modelo' => $query->descricao_modelo ?? null, 'consulta_observacao' => $query->consulta_observacao ?? null, 'observacao' => $query->observacao ?? null, 'supervisor_id' => $query->supervisor_id ?? null, 'data' => $query->data ?? null, 'data_saida' => $query->data_saida ?? null, 'acompanhante' => $query->acompanhante ?? null, 'horario' => (new Carbon($query->horario))->format('H:i') ?? null, 'horario_saida' => $query->horario_saida ? (new Carbon($query->horario_saida))->format('H:i') : null, 'uf' => $query->estado_uf ?? null, 'municipio' => [ 'id' => $query->municipio_id, 'nome' => $query->municipio_nome ?? null, ], 'acompanhante1' => [ 'id' => $query->acompanhante_1_id ?? null, 'usuario_id' => $query->acompanhante_1_usuario_id ?? null, 'nome' => $query->acompanhante_1_nome ?? null, 'cns' => $query->acompanhante_1_cns ?? null, 'telefone' => $query->acompanhante_1_telefone ?? null, 'relacao_id' => $query->acompanhante_1_relacao_id ?? null, ], 'acompanhante2' => [ 'id' => $query->acompanhante_2_id ?? null, 'usuario_id' => $query->acompanhante_2_usuario_id ?? null, 'nome' => $query->acompanhante_2_nome ?? null, 'cns' => $query->acompanhante_2_cns ?? null, 'telefone' => $query->acompanhante_2_telefone ?? null, 'relacao_id' => $query->acompanhante_2_relacao_id ?? null, ], 'destino_id' => $query->destino_id ?? null, 'veiculo_id' => $query->veiculo_id ?? null, 'veiculo' => [ 'descricao' => $query->numero_placa . ' - ' . $query->descricao_modelo, ], 'jornada_id' => $query->jornada_id ?? null, 'jornada' => [ 'descricao' => $query->data_inicial . ' - ' . $query->data_final, ], 'ponto_id' => $query->ponto_id ?? null, 'tipo_passageiro_id' => $query->tipo_passageiro_id ?? null, 'tipo_passageiro' => [ 'descricao' => strtoupper($query->tipo_passageiro_descricao ?? null), ], 'status_id' => $query->status_id ?? null, 'destino' => $query->destino_descricao ?? null, 'ponto' => $query->ponto_descricao ?? null, 'motivo' => [ 'id' => $query->motivo_id ?? null, 'descricao' => $query->motivo_descricao ?? null, ], 'protocolo' => $query->protocolo ?? '-', 'data_agendamento' => (new Carbon($query->created_at))->format('d/m/Y'), 'agendador' => $query->agendador_nome ?? null, 'unidade_agendadora' => $query->unidade_agendadora ?? null, ]; }); } } public static function datatable() { $parametrizacao = ParametrizacaoCadastro::first(); $quantidadeDias = $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? 0; $provisorioBloqueado = $parametrizacao->cadastro_paciente_provisorio_bloqueado ?? false; $provisorioQuantidadeDias = $parametrizacao->cadastro_paciente_provisorio_quantidade_dias ?? 0; $pacientes = DB::table('cadastro_paciente') ->distinct() ->join('transporte_paciente_agendar_transporte', 'transporte_paciente_agendar_transporte.paciente_id', 'cadastro_paciente.id') ->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->leftJoin( 'cadastro_carteira_identidade', function ($leftJoin) { $leftJoin->on('cadastro_carteira_identidade.cidadao_id', 'cadastro_cidadao.id') ->whereNull('cadastro_carteira_identidade.deleted_at') ->whereRaw('cadastro_carteira_identidade.id = ( SELECT id FROM cadastro_carteira_identidade WHERE cadastro_carteira_identidade.cidadao_id = cadastro_cidadao.id ORDER BY cadastro_carteira_identidade.id LIMIT 1 )'); } ) ->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao.domicilio_id') ->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id') ->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id') ->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id') ->leftJoin('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id') ->leftJoin('cadastro_obito', function ($join) { $join->on('cadastro_cidadao.id', '=', 'cadastro_obito.cidadao_id') ->whereNull('cadastro_obito.deleted_at'); }) ->whereNull('cadastro_paciente.deleted_at') ->whereNull('cadastro_paciente.sequencial_desconhecido_em') ->whereIn('transporte_paciente_agendar_transporte.status_id', [1, 5, 6]) ->select( 'cadastro_paciente.id', 'cadastro_paciente.bloqueado', 'cadastro_paciente.classificacao_id', 'cadastro_paciente.subclassificacao_id', 'cadastro_cidadao.nome', 'cadastro_cidadao.nome_social', 'cadastro_cidadao.preferencia_nome_id', 'cadastro_cidadao.data_nascimento', 'cadastro_cidadao.nome_mae', 'cadastro_cidadao.cpf', 'cadastro_cidadao.cns', 'cadastro_carteira_identidade.numero AS rg', 'cadastro_obito.obito_em', DB::raw('LPAD(cadastro_paciente.prontuario,7,0) as prontuario'), 'cadastro_municipio.nome as municipio_nome', 'cadastro_estado.uf as uf', DB::raw('GREATEST(cadastro_paciente.updated_at, cadastro_cidadao.updated_at) AS updated_at'), DB::raw(' CASE WHEN cadastro_paciente.updated_at IS NULL AND cadastro_cidadao.updated_at IS NULL THEN 1 WHEN cadastro_paciente.updated_at IS NOT NULL AND (cadastro_cidadao.updated_at IS NULL OR cadastro_paciente.updated_at > cadastro_cidadao.updated_at) THEN CASE WHEN ' . ($quantidadeDias > 0 ? 'DATE_ADD(cadastro_paciente.updated_at, INTERVAL ' . $quantidadeDias . ' DAY) < NOW()' : 'false') . ' THEN DATEDIFF(NOW(), DATE_ADD(cadastro_paciente.updated_at, INTERVAL ' . $quantidadeDias . ' DAY)) ELSE 0 END WHEN cadastro_cidadao.updated_at IS NOT NULL AND (cadastro_paciente.updated_at IS NULL OR cadastro_cidadao.updated_at > cadastro_paciente.updated_at) THEN CASE WHEN ' . ($quantidadeDias > 0 ? 'DATE_ADD(cadastro_cidadao.updated_at, INTERVAL ' . $quantidadeDias . ' DAY) < NOW()' : 'false') . ' THEN DATEDIFF(NOW(), DATE_ADD(cadastro_cidadao.updated_at, INTERVAL ' . $quantidadeDias . ' DAY)) ELSE 0 END ELSE 0 END as dias_cadastro_desatualizado ') ); if (DataUtil::isStringTrue(request()->with_prontuario_unidade)) { $pacientes->addSelect([ 'prontuario_unidade' => function ($query) { $query->select('cadastro_prontuario_unidade.prontuario') ->from('cadastro_prontuario_unidade') ->whereColumn('cadastro_prontuario_unidade.paciente_id', 'cadastro_paciente.id') ->where( 'cadastro_prontuario_unidade.unidade_id', self::getCurrentCentroCusto()->infraestrutura->unidade_id ); } ]); } if (!DataUtil::isStringTrue(request()->with_paciente_bloqueado)) { $pacientes->where(function ($query) { $query ->where('cadastro_paciente.bloqueado', false) ->orWhereNull('cadastro_paciente.bloqueado'); }); } if (!DataUtil::isStringTrue(request()->with_paciente_provisorio) && $provisorioBloqueado) { $pacientes->where(function ($query) use ($provisorioQuantidadeDias) { $query->where('cadastro_paciente.subclassificacao_id', '!=', Subclassificacao::TEMPORARIO) ->orWhere(function ($query) use ($provisorioQuantidadeDias) { $query->where('cadastro_paciente.subclassificacao_id', Subclassificacao::TEMPORARIO) ->where(function ($query) use ($provisorioQuantidadeDias) { $query->where(function ($query) { $query->whereNull('cadastro_paciente.validade_inicio') ->orWhereDate('cadastro_paciente.validade_inicio', '<=', Carbon::now()->format('Y-m-d')); }); $query->where(function ($query) use ($provisorioQuantidadeDias) { $query->whereNull('cadastro_paciente.validade_fim') ->orWhere(function ($query) use ($provisorioQuantidadeDias) { if (!is_null($provisorioQuantidadeDias) && $provisorioQuantidadeDias > 0) { $query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d')) ->orWhereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->subDays($provisorioQuantidadeDias)->format('Y-m-d')); } else { $query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d')); } }); }); }); }) ->orWhereNull('cadastro_paciente.subclassificacao_id'); }); } return datatables() ->of($pacientes) ->filterColumn('cadastro_paciente.prontuario', function ($query, $keyword) { $query->whereRaw('LPAD(cadastro_paciente.prontuario,7,0) like ?', ["%{$keyword}%"]); }) ->filterColumn('cadastro_prontuario_unidade.prontuario', function ($query, $keyword) { $query->whereRaw('( SELECT cadastro_prontuario_unidade.prontuario FROM cadastro_prontuario_unidade WHERE cadastro_prontuario_unidade.paciente_id = cadastro_paciente.id AND cadastro_prontuario_unidade.unidade_id = ' . self::getCurrentCentroCusto()->infraestrutura->unidade_id . ' ) like ?', ["%{$keyword}%"]); }) ->filterColumn('cadastro_cidadao.cpf', function ($query, $keyword) { $query ->whereRaw("cadastro_cidadao.cpf like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(cadastro_cidadao.cpf,1,3), '.', SUBSTR(cadastro_cidadao.cpf,4,3), '.', SUBSTR(cadastro_cidadao.cpf,7,3), '-', SUBSTR(cadastro_cidadao.cpf,10,2) ) like ?", ["%{$keyword}%"] ); }) ->filterColumn('cadastro_cidadao.data_nascimento', function ($query, $keyword) { $query ->whereRaw("DATE_FORMAT(cadastro_cidadao.data_nascimento, '%d/%m/%Y') like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(cadastro_cidadao.data_nascimento,9,2), SUBSTR(cadastro_cidadao.data_nascimento,6,2), SUBSTR(cadastro_cidadao.data_nascimento,1,4) ) like ?", ["%{$keyword}%"] ); }) ->skipTotalRecords() ->toJson(); } }