init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,914 @@
<?php
namespace App\Services\TransportePaciente\Gerenciamento;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\SujeitoAtencao\Subclassificacao;
use App\Enums\TransportePaciente\Funcionalidade;
use App\Enums\TransportePaciente\Status;
use App\Models\Cadastro\Parametrizacao\Parametrizacao as ParametrizacaoCadastro;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Intranet\Cliente;
use App\Models\TransportePaciente\Acompanhante;
use App\Models\TransportePaciente\Agendar\Agendar;
use App\Models\TransportePaciente\Destino\Destino;
use App\Models\TransportePaciente\Parametrizacao\Parametrizacao;
use App\Services\Service;
use App\Services\TransportePaciente\Agendar\AgendarService;
use App\Services\TransportePaciente\Agendar\HistoricoService;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class GerenciamentoService extends Service
{
private static function getFormData($id)
{
$now = Carbon::now();
$currentDate = $now->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();
}
}