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,708 @@
<?php
namespace App\Services\TransportePaciente;
use App\Enums\TransportePaciente\Status as EnumAgendaStatus;
use App\Enums\TransportePaciente\Status as EnumTransporteStatus;
use App\Enums\TransportePaciente\ViagemStatus as EnumStatus;
use App\Models\Intranet\Cliente;
use App\Models\TransportePaciente\Agendar\Agendar;
use App\Models\TransportePaciente\Jornada\Jornada;
use App\Models\TransportePaciente\Parametrizacao\Parametrizacao;
use App\Models\TransportePaciente\Viagem;
use App\Models\TransportePaciente\ViagemStatus;
use App\Services\Service;
use App\Services\TransportePaciente\Agendar\HistoricoService;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class ViagemService extends Service
{
public static function index()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(),
'parametrizacao' => Parametrizacao::first()->agendar_transporte_jornada ?? null,
];
}
public static function store($request)
{
self::validate();
$data = $request->all();
if (!is_null(request()->diaria)) {
$data['diaria'] = str_replace('.', '', $data['diaria']);
$data['diaria'] = str_replace(',', '.', $data['diaria']);
}
$viagem = Viagem::where('veiculo_id', $data['veiculo_id'])
->when($data['jornada_id'] ?? null, function($query, $data) {
$query->where('jornada_id', $data);
})
->when($data['destino_id'] ?? null, function($query, $data) {
$query->where('destino_id', $data);
})
->where('data', request()->data)
->first();
if ($viagem) {
if(is_null($viagem->protocolo)) {
$data['protocolo'] = Viagem::max('protocolo') + 1;
}
$currentLotacao = self::getCurrentLotacao();
$viagem->update($data);
$agendamentos = self::getPacientes();
$agendamentos->each(function ($agendamento) use ($viagem, $currentLotacao) {
$agendamento->lotacao_id = $currentLotacao->infraestrutura->unidade->id;
$agendamento->ocupacao_id = $currentLotacao->ocupacao_id;
$agendamento->usuario_id = $currentLotacao->usuario_id;
$agendar = Agendar::where('id', $agendamento->id);
$agendar->update([
'viagem_id' => $viagem->id,
'lotacao_id' => $currentLotacao->infraestrutura->unidade->id,
'ocupacao_id' => $currentLotacao->ocupacao_id,
'usuario_id' => $currentLotacao->usuario_id,
'procedimento_id' => $agendamento->procedimento_id,
]);
$transporte = $agendar->first();
HistoricoService::create($transporte, EnumTransporteStatus::MODIFICADO, $transporte->updated_lotacao_id);
});
return $viagem;
} else {
$data = $request->all();
$data['protocolo'] = Viagem::max('protocolo') + 1;
if (!is_null(request()->diaria)) {
$data['diaria'] = str_replace('.', '', $data['diaria']);
$data['diaria'] = str_replace(',', '.', $data['diaria']);
}
$currentLotacao = self::getCurrentLotacao();
$viagem = Viagem::create($data)->fresh();
$agendamentos = self::getPacientes();
$agendamentos->each(function ($agendamento) use ($viagem, $currentLotacao) {
$agendamento->lotacao_id = $currentLotacao->infraestrutura->unidade->id;
$agendamento->ocupacao_id = $currentLotacao->ocupacao_id;
$agendamento->usuario_id = $currentLotacao->usuario_id;
$agendar = Agendar::where('id', $agendamento->id);
$agendar->update([
'viagem_id' => $viagem->id,
'lotacao_id' => $currentLotacao->infraestrutura->unidade->id,
'ocupacao_id' => $currentLotacao->ocupacao_id,
'usuario_id' => $currentLotacao->usuario_id,
'procedimento_id' => $agendamento->procedimento_id
]);
$transporte = $agendar->first();
HistoricoService::create($transporte, EnumTransporteStatus::MODIFICADO, $transporte->updated_lotacao_id);
});
return $viagem;
}
}
private static function validate()
{
$rules = [
'data' => [
'date',
],
'condutor_id' => [
'exists:transporte_paciente_condutor,id',
],
'veiculo_id' => [
'exists:transporte_paciente_veiculo,id',
],
'status_id' => [
'required',
]
];
return request()->validate($rules);
}
private static function getFormData()
{
$parametrizacao = Parametrizacao::first();
return [
"status" => ViagemStatus::find([
EnumStatus::ABERTO,
EnumStatus::FINALIZADO,
]),
"municipios" => [],
"bairros" => [],
"veiculos" => [],
"jornadas" => [],
"motoristas" => self::getMotoristas(),
"agrupar" => [
[
"id" => 1,
"descricao" => "Destino"
],
[
"id" => 2,
"descricao" => "Município de destino"
],
[
"id" => 3,
"descricao" => "Ponto"
]
],
"ordenar" => [
[
"id" => 1,
"descricao" => "Destino"
],
[
"id" => 2,
"descricao" => "Endereço do paciente"
],
[
"id" => 3,
"descricao" => "Horário da consulta"
],
[
"id" => 4,
"descricao" => "Horário de saída"
],
[
"id" => 5,
"descricao" => "Município de Destino"
],
[
"id" => 6,
"descricao" => "Nome do paciente"
],
[
"id" => 7,
"descricao" => "Ponto"
]
],
'exibir_observacao_transporte' => $parametrizacao->exibir_observacao_transporte ?? null,
];
}
private static function getModelData()
{
return [
"status_id" => 1,
"data" => null,
"veiculo_id" => null,
"municipio_id" => null,
"nome_bairro" => null,
"jornada_id" => null,
"horario_saida" => null,
"diaria" => null,
"motorista_id" => null,
"agrupar" => 1,
"ordenar" => 7,
];
}
public static function getVeiculos()
{
if(request()->status_id == EnumStatus::FINALIZADO) {
return DB::table('transporte_paciente_viagem as viagem')
->join('transporte_paciente_veiculo as veiculo', 'veiculo.id', 'viagem.veiculo_id')
->select(
'veiculo.id',
DB::raw('CONCAT(veiculo.numero_placa, " - ", veiculo.descricao_modelo) AS descricao')
)
->orderBy('veiculo.numero_placa')
->groupBy('veiculo.id')
->where('veiculo.bloqueado', false)
->where('viagem.data', request()->data)
->where('viagem.status_id', request()->status_id)
->get();
}
else {
return DB::table('transporte_paciente_veiculo as veiculo')
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.veiculo_id', 'veiculo.id')
->where(DB::raw("DATE_FORMAT(agendar.data_saida, '%Y-%m-%d')"), request()->data)
->where('veiculo.bloqueado', false)
->whereIn('agendar.status_id', [EnumStatus::ABERTO, EnumStatus::REAGENDADO, EnumStatus::MODIFICADO ])
->select(
'veiculo.id',
DB::raw('CONCAT(veiculo.numero_placa, " - ", veiculo.descricao_modelo) AS descricao')
)
->orderBy('veiculo.numero_placa')
->groupBy('veiculo.id')
->get();
}
}
public static function getMunicipios()
{
if(request()->status_id == EnumStatus::FINALIZADO) {
return DB::table('transporte_paciente_agendar_transporte as agendar')
->select('municipio.id', 'municipio.nome')
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
->join('intranet.cadastro_municipio as municipio', 'municipio.id', 'destino.municipio_id')
->where('agendar.veiculo_id', request()->veiculo_id)
->where('agendar.data_saida', request()->data)
->whereIn('agendar.status_id', [EnumAgendaStatus::TRANSPORTADO, EnumAgendaStatus::FALTOU])
->orderBy('nome')
->groupBy('municipio.id')
->get();
}
else {
return DB::table('transporte_paciente_agendar_transporte as agendar')
->select('municipio.id', 'municipio.nome')
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
->join('intranet.cadastro_municipio as municipio', 'municipio.id', 'destino.municipio_id')
->where('agendar.veiculo_id', request()->veiculo_id)
->where('agendar.data_saida', request()->data)
->where('agendar.status_id', EnumAgendaStatus::AGENDADO)
->orderBy('nome')
->groupBy('municipio.id')
->get();
}
}
public static function getBairros()
{
if(request()->status_id == EnumStatus::FINALIZADO) {
return DB::table('transporte_paciente_agendar_transporte as agendar')
->select('destino.id', 'destino.nome_bairro as nome', 'destino.municipio_id')
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
->where('agendar.veiculo_id', request()->veiculo_id)
->where('agendar.data_saida', request()->data)
->whereIn('agendar.status_id', [EnumAgendaStatus::TRANSPORTADO, EnumAgendaStatus::FALTOU])
->whereNotNull('destino.nome_bairro')
->when(request()->municipio_id, function($query) {
$query->where('destino.municipio_id', request()->municipio_id);
})
->orderBy('nome')
->groupBy('nome')
->get();
}
else {
return DB::table('transporte_paciente_agendar_transporte as agendar')
->select('destino.id', 'destino.nome_bairro as nome', 'destino.municipio_id')
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
->where('agendar.veiculo_id', request()->veiculo_id)
->where('agendar.data_saida', request()->data)
->where('agendar.status_id', EnumAgendaStatus::AGENDADO)
->whereNotNull('destino.nome_bairro')
->when(request()->municipio_id, function($query) {
$query->where('destino.municipio_id', request()->municipio_id);
})
->orderBy('nome')
->groupBy('nome')
->get();
}
}
public static function getJornadas()
{
if(request()->status_id == EnumStatus::FINALIZADO) {
return DB::table('transporte_paciente_viagem as viagem')
->join('transporte_paciente_jornada as jornada', 'viagem.jornada_id', 'jornada.id')
->join('transporte_paciente_veiculo as veiculo', 'jornada.veiculo_id', 'veiculo.id')
->where('viagem.status_id', EnumStatus::FINALIZADO)
->where('veiculo.id', request()->veiculo_id)
->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), request()->data)
->select(
'jornada.id',
DB::raw("CONCAT(
DATE_FORMAT(jornada.data_inicial, '%d/%m/%Y %H:%i'),
' - ',
DATE_FORMAT(jornada.data_final, '%d/%m/%Y %H:%i'),
' - ',
jornada.id
) AS descricao"),
)
->orderBy('jornada.data_inicial')
->groupBy('jornada.id')
->get();
} else {
return DB::table('transporte_paciente_jornada as jornada')
->join('transporte_paciente_veiculo as veiculo', 'jornada.veiculo_id', 'veiculo.id')
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.jornada_id', 'jornada.id')
->whereIn('agendar.status_id', [EnumAgendaStatus::AGENDADO, EnumAgendaStatus::MODIFICADO, EnumAgendaStatus::REAGENDADO])
->where('agendar.veiculo_id', request()->veiculo_id)
->where(DB::raw("DATE_FORMAT(agendar.data_saida, '%Y-%m-%d')"), request()->data)
->select(
'jornada.id',
DB::raw("CONCAT(
DATE_FORMAT(jornada.data_inicial, '%d/%m/%Y %H:%i'),
' - ',
DATE_FORMAT(jornada.data_final, '%d/%m/%Y %H:%i'),
' - ',
jornada.id
) AS descricao"),
)
->orderBy('jornada.data_inicial')
->groupBy('jornada.id')
->get();
}
}
public static function getMotoristas()
{
return DB::table('transporte_paciente_condutor as condutor')
->select('condutor.id', 'cidadao.nome')
->join('cadastro_usuario as usuario', 'usuario.id', 'condutor.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->orderBy('cidadao.nome')
->get();
}
public static function search()
{
return [
'pacientes' => self::getPacientes(),
'viagem' => self::getViagem(),
'ordenacao' => request()->ordenar,
'total' => array_reduce(self::getPacientes()->toArray(), function($carry, $item) {
if($item->acompanhante != null) {
$carry += $item->acompanhante;
}
return $carry + 1;
}, 0)
];
}
private static function getPacientes()
{
return DB::table('transporte_paciente_agendar_transporte as agendar')
->leftJoin('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
->leftJoin('transporte_paciente_ponto as ponto', 'agendar.ponto_id', 'ponto.id')
->leftJoin('transporte_paciente_motivo_viagem_procedimento as motivo', 'agendar.motivo_id', 'motivo.id')
->leftJoin('cadastro_paciente as paciente', 'agendar.paciente_id', 'paciente.id')
->leftJoin('cadastro_cidadao as cidadao', 'paciente.cidadao_id', 'cidadao.id')
->leftJoin('cadastro_cidadao_telefone as telefone', 'cidadao.id', 'telefone.cidadao_id')
->leftJoin('intranet.cadastro_municipio as municipio', 'destino.municipio_id', 'municipio.id')
->leftJoin('cadastro_domicilio as domicilio', 'cidadao.domicilio_id', 'domicilio.id')
->leftJoin('cadastro_endereco as endereco', 'domicilio.endereco_id', 'endereco.id')
->leftJoin('cadastro_logradouro as logradouro', 'endereco.logradouro_id', 'logradouro.id')
->leftJoin('cadastro_logradouro_tipo as tipo_logradouro', 'logradouro.tipo_id', 'tipo_logradouro.id')
->leftJoin('cadastro_bairro as bairro', 'logradouro.bairro_id', 'bairro.id')
->leftJoin('cadastro_logradouro as logradouro_referencia', 'ponto.logradouro_id', 'logradouro_referencia.id')
->leftJoin('cadastro_logradouro_tipo as tipo_logradouro_referencia', 'logradouro_referencia.tipo_id', 'tipo_logradouro_referencia.id')
->leftJoin('cadastro_bairro as bairro_referencia', 'logradouro_referencia.bairro_id', 'bairro_referencia.id')
->leftJoin('transporte_paciente_acompanhante', 'transporte_paciente_acompanhante.id', 'agendar.acompanhante_1_id')
->leftJoin('cadastro_paciente as paciente_acompanhante_1', 'transporte_paciente_acompanhante.usuario_id', 'paciente_acompanhante_1.id')
->leftJoin('cadastro_cidadao as cidadao_acompanhante_1', 'paciente_acompanhante_1.cidadao_id', 'cidadao_acompanhante_1.id')
->leftJoin('cadastro_cidadao_telefone as telefone_acompanhante_1', 'cidadao_acompanhante_1.id', 'telefone_acompanhante_1.cidadao_id')
->leftJoin('transporte_paciente_acompanhante AS acompanhante_dois', 'acompanhante_dois.id', 'agendar.acompanhante_2_id')
->leftJoin('cadastro_paciente as paciente_acompanhante_2', 'acompanhante_dois.usuario_id', 'paciente_acompanhante_2.id')
->leftJoin('cadastro_cidadao as cidadao_acompanhante_2', 'paciente_acompanhante_2.cidadao_id', 'cidadao_acompanhante_2.id')
->leftJoin('cadastro_cidadao_telefone as telefone_acompanhante_2', 'cidadao_acompanhante_2.id', 'telefone_acompanhante_2.cidadao_id')
->leftJoin('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'motivo.codigo_procedimento')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->leftJoin('transporte_paciente_viagem as viagem', 'viagem.id', 'agendar.viagem_id')
->leftJoin('transporte_paciente_status as status', 'agendar.status_id', 'status.id')
->leftJoin('transporte_paciente_condutor as condutor', 'viagem.condutor_id', 'condutor.id')
->leftJoin('cadastro_usuario as usuario', 'usuario.id', 'condutor.usuario_id')
->leftJoin('cadastro_cidadao as motorista', 'motorista.id', 'usuario.cidadao_id')
->select(
'agendar.id',
'agendar.viagem_id',
DB::raw("CONCAT_WS(
', ',
NULLIF(destino.descricao_destino, ''),
IF(destino.nome_logradouro != '', CONCAT('Logradouro: ', destino.nome_logradouro), NULL),
IF(destino.numero_logradouro != '', CONCAT('Nº: ', destino.numero_logradouro), NULL),
IF(destino.nome_complemento != '', CONCAT('Complemento: ', destino.nome_complemento), NULL),
IF(destino.nome_bairro != '', CONCAT('Bairro: ', destino.nome_bairro), NULL),
IF(destino.numero_cep != '', CONCAT('CEP: ', destino.numero_cep), NULL),
IF(destino.observacao != '', CONCAT('Observação: ', destino.observacao), NULL)
) as destino"),
'municipio.nome as municipio',
'cidadao.nome as nome',
'cidadao.data_nascimento as cidadao_data_nascimento',
DB::raw('TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) AS idade'),
DB::raw("CONCAT(logradouro.nome,' - ',IF(endereco.numero, endereco.numero, 'Sem número')) as endereco"),
'bairro.nome as bairro',
'bairro_referencia.nome as bairro_referencia',
DB::raw('GROUP_CONCAT(DISTINCT telefone.numero) as telefones'),
'motivo.descricao as motivo',
'motivo.codigo_procedimento as codigo_procedimento',
'agendar.horario_saida',
'agendar.horario as horario_consulta',
'agendar.acompanhante',
'agendar.observacao',
'agendar.consulta_observacao',
DB::raw("
CASE
WHEN ponto.descricao IS NULL THEN CONCAT('CASA DO PACIENTE - ', tipo_logradouro.descricao, ' ', logradouro.nome, ' ', IF(endereco.numero, endereco.numero, 'S/N'))
ELSE ponto.descricao
END as ponto
"),
'endereco.complemento',
'agendar.lotacao_id',
'agendar.ocupacao_id',
'agendar.usuario_id',
'sigtap.procedimento.nome as procedimento_nome',
'sigtap.procedimento.id as procedimento_id',
'motorista.nome as motorista',
'status.descricao as status',
'transporte_paciente_acompanhante.id as acompanhante_1',
'cidadao_acompanhante_1.nome as acompanhante_nome_1',
'transporte_paciente_acompanhante.nome as nome_1',
'cidadao_acompanhante_1.cns as acompanhante_cns_1',
DB::raw('GROUP_CONCAT(DISTINCT telefone_acompanhante_1.numero) as telefones_acompanhante_1'),
'acompanhante_dois.id as acompanhante_2',
'cidadao_acompanhante_2.nome as acompanhante_nome_2',
'acompanhante_dois.nome as nome_2',
'cidadao_acompanhante_2.cns as acompanhante_cns_2',
DB::raw('GROUP_CONCAT(DISTINCT telefone_acompanhante_2.numero) as telefones_acompanhante_2'),
'destino.distancia',
'agendar.consulta_observacao',
)
->where('agendar.data_saida', request()->data)
->where('agendar.veiculo_id', request()->veiculo_id)
->when(request()->status_id == EnumStatus::ABERTO, function ($query) {
$query->whereIn('agendar.status_id', [
EnumAgendaStatus::AGENDADO,
EnumAgendaStatus::MODIFICADO,
EnumAgendaStatus::REAGENDADO
]);
})
->when(request()->status_id == EnumStatus::FINALIZADO, function ($query) {
$query->whereIn('agendar.status_id', [
EnumAgendaStatus::TRANSPORTADO,
EnumAgendaStatus::FALTOU,
EnumAgendaStatus::MODIFICADO
]);
})
->when(request()->municipio_id, function ($query) {
$query->where('agendar.municipio_id', request()->municipio_id);
})
->when(request()->jornada_id, function ($query) {
$query->where('agendar.jornada_id', request()->jornada_id);
})
->when(request()->nome_bairro, function($query) {
$query->where('destino.nome_bairro', '=', request()->nome_bairro);
})
->when(request()->veiculo_id, function ($query) {
$query->where('agendar.veiculo_id', request()->veiculo_id);
})
->whereNull('telefone.deleted_at')
->groupBy('agendar.id')
->orderBy('agendar.horario_saida', 'asc')
->orderBy('horario_consulta','asc')
->get();
}
private static function getViagem()
{
return DB::table('transporte_paciente_viagem as viagem')
->select(
'viagem.protocolo',
'viagem.diaria',
'viagem.condutor_id',
'cidadao.nome',
'viagem.horario_saida_temp as horarioSaida'
)
->leftJoin('transporte_paciente_condutor as condutor', 'viagem.condutor_id', 'condutor.id')
->leftJoin('cadastro_usuario as usuario', 'usuario.id', 'condutor.id')
->leftJoin('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->leftJoin('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
->leftJoin('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
->where('viagem.veiculo_id', request()->veiculo_id)
->where('viagem.data', request()->data)
->when(request()->jornada_id, function ($query) {
$query->where('viagem.jornada_id', request()->jornada_id);
})
->when(request()->nome_bairro, function($query) {
$query->where('destino.nome_bairro', request()->nome_bairro);
})
->where('viagem.status_id', request()->status_id)
->first();
}
public static function print()
{
$pacientes = self::getPacientes();
$pacientes->each(function ($paciente) {
$telefones = explode(',', $paciente->telefones);
$telefonesComMascara = [];
foreach($telefones as $telefone) {
array_push($telefonesComMascara, MaskUtil::getPhoneMasked($telefone));
}
$paciente->telefones = implode(', ', $telefonesComMascara);
$telefonesAcompanhante = explode(',', $paciente->telefones_acompanhante_1);
$telefonesAcompanhanteComMascara = [];
foreach($telefonesAcompanhante as $telefone) {
array_push($telefonesAcompanhanteComMascara, MaskUtil::getPhoneMasked($telefone));
}
$paciente->telefones_acompanhante_1 = implode(', ', $telefonesAcompanhanteComMascara);
$telefonesAcompanhante = explode(',', $paciente->telefones_acompanhante_2);
$telefonesAcompanhanteComMascara = [];
foreach($telefonesAcompanhante as $telefone) {
array_push($telefonesAcompanhanteComMascara, MaskUtil::getPhoneMasked($telefone));
}
$paciente->telefones_acompanhante_2 = implode(', ', $telefonesAcompanhanteComMascara);
$paciente->cidadao_idade_anos = $paciente->cidadao_data_nascimento
? (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%y')
: 0;
$paciente->cidadao_idade_meses = $paciente->cidadao_data_nascimento ?
(int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%m')
: 0;
$paciente->cidadao_idade_dias = $paciente->cidadao_data_nascimento
? (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%d')
: 0;
$paciente->cidadao_idade_meses = $paciente->cidadao_data_nascimento
? str_pad($paciente->cidadao_idade_meses, 2, '0', STR_PAD_LEFT)
: null;
$paciente->cidadao_idade_dias = $paciente->cidadao_data_nascimento
? str_pad($paciente->cidadao_idade_dias, 2, '0', STR_PAD_LEFT)
: null;
$paciente->acompanhante_cns_1 = $paciente->acompanhante_cns_1 ? MaskUtil::getCnsMasked($paciente->acompanhante_cns_1 ) : '';
$paciente->acompanhante_cns_2 = $paciente->acompanhante_cns_2 ? MaskUtil::getCnsMasked($paciente->acompanhante_cns_2 ) : '';
});
$total = array_reduce($pacientes->toArray(), function($carry, $item) {
if($item->acompanhante != null) {
$carry += $item->acompanhante;
}
return $carry + 1;
}, 0);
$viagem = DB::table('transporte_paciente_viagem as viagem')
->select(
'viagem.protocolo',
'viagem.status_id as status',
DB::raw("DATE_FORMAT(viagem.data, '%d/%m/%Y') as data"),
'viagem.horario_saida_temp as horario_saida',
DB::raw('CONCAT(veiculo.descricao_modelo, " - ", veiculo.numero_placa) AS veiculo'),
'motorista.nome as motorista',
'condutor.matricula as matricula',
'viagem.diaria',
'viagem.horario_saida_temp',
'viagem.horario_chegada',
'viagem.horario_chegada_destino',
'viagem.horario_saida_destino',
'viagem.km_saida',
'viagem.km_chegada',
DB::raw("CONCAT(
DATE_FORMAT(jornada.data_inicial, '%d/%m/%Y %H:%i'),
' - ',
DATE_FORMAT(jornada.data_final, '%d/%m/%Y %H:%i')) AS jornada"),
'viagem.refeicao',
'viagem.pernoite',
'viagem.combustivel',
'viagem.pedagio',
'viagem.outras_despesas',
'viagem.total_despesa',
DB::raw("
CASE WHEN (
SELECT agendar_transporte_jornada
FROM transporte_paciente_parametrizacao) = 1
THEN DATE_FORMAT(jornada.data_inicial, '%H:%i')
END as jornada_horario_inicial
")
)
->leftJoin('transporte_paciente_veiculo as veiculo', 'viagem.veiculo_id', 'veiculo.id')
->leftJoin('transporte_paciente_condutor as condutor', 'viagem.condutor_id', 'condutor.id')
->leftJoin('transporte_paciente_jornada as jornada', 'viagem.jornada_id', 'jornada.id')
->leftJoin('cadastro_usuario as usuario', 'usuario.id', 'condutor.usuario_id')
->leftJoin('cadastro_cidadao as motorista', 'motorista.id', 'usuario.cidadao_id')
->where('viagem.veiculo_id', request()->veiculo_id)
->where('viagem.data', request()->data)
->when(request()->jornada_id, function($query) {
$query->where('viagem.jornada_id', request()->jornada_id);
})
->when(request()->destino_id, function($query) {
$query->where('viagem.destino_id', request()->destino_id);
})
->where('viagem.status_id', request()->status_id)
->first();
$currentLotacao = self::getCurrentLotacao();
$cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail();
$exibir = Parametrizacao::first();
$exibirObservacaoPaciente = $exibir ? $exibir->exibir_observacao_paciente : false;
return [
'unidade_nome' => request()->unidade_nome ?? 'TODAS',
'infraestrutura_nome' => request()->infraestrutura_nome ?? 'TODOS',
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'unidade_id' => $currentLotacao->infraestrutura->unidade->id,
'infraestrutura_id' => $currentLotacao->infraestrutura->id,
'infraestrutura' => $currentLotacao->infraestrutura->nome,
'sistema' => [
'ramo_atividade' => [
'nome' => $cliente->sistema->ramoAtividade->nome ?? null,
],
'nome' => $cliente->sistema->nome ?? null,
'versao' => $cliente->sistema->versao ?? null,
],
'pacientes' => $pacientes,
'viagem' => $viagem,
'exibir_observacao_paciente' => $exibirObservacaoPaciente,
'agrupar' => request()->agrupar,
'ordenar' => request()->ordenar,
'total' => $total,
];
}
public static function checkMotorista()
{
$viagens = Viagem::where('data', request()->data)
->where('condutor_id', request()->condutor_id)
->get();
if($viagens) {
$jornada = Jornada::find(request()->jornada_id);
foreach($viagens as $viagem) {
$viagemStart = Carbon::createFromFormat('Y-m-d H:i:s', $viagem->jornada->data_inicial);
$viagemEnd = Carbon::createFromFormat('Y-m-d H:i:s', $viagem->jornada->data_final);
$jornadaStart = Carbon::createFromFormat('Y-m-d H:i:s', $jornada->data_inicial);
$jornadaEnd = Carbon::createFromFormat('Y-m-d H:i:s', $jornada->data_final);
if($jornadaStart->lt($viagemEnd) && $jornadaEnd->gt($viagemStart)) {
return [
'isValid' => false
];
}
}
}
return [
'isValid' => true
];
}
}