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,474 @@
<?php
namespace App\Services\TransportePaciente\Escolher;
use App\Enums\TransportePaciente\Funcionalidade;
use App\Enums\TransportePaciente\Status;
use App\Exceptions\TransportePaciente\ExceededCapacidadeVeiculoException;
use App\Models\TransportePaciente\Agendar\Agendar;
use App\Models\TransportePaciente\Destino\Destino;
use App\Models\TransportePaciente\Parametrizacao\Parametrizacao;
use App\Models\TransportePaciente\Veiculo\Tipo;
use App\Models\TransportePaciente\Veiculo\TipoPassageiro;
use App\Models\TransportePaciente\Veiculo\Veiculo;
use App\Services\Service;
use App\Services\TransportePaciente\Agendar\HistoricoService;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class EscolherService extends Service
{
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('Y-m-d');
$agendamentos = DB::table('transporte_paciente_agendar_transporte')
->select([
'transporte_paciente_agendar_transporte.id',
'transporte_paciente_agendar_transporte.supervisor_id',
'transporte_paciente_agendar_transporte.jornada_id',
DB::raw('DATE_FORMAT(transporte_paciente_agendar_transporte.data, "%d/%m/%Y") AS data_consulta'),
DB::raw('DATE_FORMAT(transporte_paciente_agendar_transporte.data_saida, "%d/%m/%Y") AS data_saida'),
DB::raw('TIME_FORMAT(transporte_paciente_agendar_transporte.horario, "%H:%i") AS horario_consulta'),
DB::raw('COALESCE(
pre.observacao,
transporte_paciente_agendar_transporte.consulta_observacao,
NULL
) AS consulta_observacao'),
'transporte_paciente_agendar_transporte.horario_saida',
DB::raw('COALESCE(transporte_paciente_agendar_transporte.acompanhante, "NÃO") AS acompanhante'),
DB::raw('COALESCE(transporte_paciente_ponto.descricao, "CASA DO PACIENTE") AS ponto'),
DB::raw('COALESCE(transporte_paciente_destino.descricao_destino, "-") AS destino'),
'intranet.cadastro_municipio.nome AS municipio',
'cadastro_paciente.id AS paciente_id',
'cadastro_cidadao.nome AS paciente_nome',
'cadastro_cidadao.preferencia_nome_id AS paciente_preferencia_nome_id',
'cadastro_cidadao.nome_social AS paciente_nome_social',
'usuario_cidadao.nome AS profissional_nome',
'cadastro_cidadao.sexo_id AS paciente_sexo_id',
'transporte_paciente_agendar_transporte.status_id',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS paciente_nascimento'),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) as paciente_prontuario'),
DB::raw('CONCAT(TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, transporte_paciente_agendar_transporte.data), " anos") AS paciente_idade'),
DB::raw('false AS selecionado'),
DB::raw('null AS veiculo_id'),
DB::raw('"NÃO ATRIBUÍDO" AS veiculo_nome'),
'transporte_paciente_veiculo_tipo_passageiro.id AS tipo_passageiro_id',
'transporte_paciente_veiculo_tipo_passageiro.descricao AS tipo_passageiro_descricao',
])
->join('transporte_paciente_ponto', 'transporte_paciente_ponto.id', 'transporte_paciente_agendar_transporte.ponto_id')
->join('transporte_paciente_destino', 'transporte_paciente_destino.id', 'transporte_paciente_agendar_transporte.destino_id')
->join('intranet.cadastro_municipio', 'intranet.cadastro_municipio.id', 'transporte_paciente_agendar_transporte.municipio_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'transporte_paciente_agendar_transporte.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'transporte_paciente_agendar_transporte.created_lotacao_id'
)
->join(
'cadastro_usuario AS usuario_lotacao',
'usuario_lotacao.id',
'cadastro_lotacao.usuario_id'
)
->join(
'cadastro_cidadao AS usuario_cidadao',
'usuario_cidadao.id',
'usuario_lotacao.cidadao_id'
)
->leftJoin(
'transporte_paciente_pre_agendamento_transporte as pre',
'pre.id',
'transporte_paciente_agendar_transporte.pre_agendamento_id'
)
->leftJoin(
'transporte_paciente_veiculo_tipo_passageiro',
'transporte_paciente_veiculo_tipo_passageiro.id',
'transporte_paciente_agendar_transporte.tipo_passageiro_id'
);
$agendamentos->whereNull('transporte_paciente_agendar_transporte.veiculo_id');
$agendamentos = $agendamentos->whereIn('transporte_paciente_agendar_transporte.status_id', [Status::AGENDADO, Status::MODIFICADO, Status::REAGENDADO]);
if (request()->data_saida) {
$agendamentos->where('transporte_paciente_agendar_transporte.data_saida', request()->data_saida);
} else {
$agendamentos->where('transporte_paciente_agendar_transporte.data_saida', $currentDate);
}
if (request()->municipio_id) {
$agendamentos->where('transporte_paciente_agendar_transporte.municipio_id', request()->municipio_id);
}
if (request()->destino_id) {
$agendamentos->where('transporte_paciente_agendar_transporte.destino_id', request()->destino_id);
}
if (request()->tipo_passageiro_id) {
$agendamentos->where('transporte_paciente_agendar_transporte.tipo_passageiro_id', request()->tipo_passageiro_id);
}
if (request()->horario_saida) {
$agendamentos->where('transporte_paciente_agendar_transporte.horario_saida', request()->horario_saida);
}
if (request()->ordenacao) {
if (request()->ordenacao == 'paciente') {
$agendamentos = $agendamentos->orderBy('cadastro_cidadao.nome');
}
else if (request()->ordenacao == 'agendamento') {
$agendamentos = $agendamentos->orderBy('transporte_paciente_agendar_transporte.id');
}
else if (request()->ordenacao == 'data_consulta') {
$agendamentos = $agendamentos
->orderBy('transporte_paciente_agendar_transporte.data')
->orderBy('transporte_paciente_agendar_transporte.horario');
}
else if (request()->ordenacao == 'hora_saida') {
$agendamentos = $agendamentos
->orderBy('transporte_paciente_agendar_transporte.data_saida')
->orderBy('transporte_paciente_agendar_transporte.horario_saida');
}
else if (request()->ordenacao == 'local_consulta') {
$agendamentos = $agendamentos
->orderBy('transporte_paciente_destino.descricao_destino');
}
else if (request()->ordenacao == 'ponto_referencia') {
$agendamentos = $agendamentos
->orderBy(DB::raw('COALESCE(transporte_paciente_ponto.descricao, "CASA DO PACIENTE")'));
}
} else {
$agendamentos = $agendamentos
->orderBy('transporte_paciente_agendar_transporte.horario_saida');
}
$agendamentos = $agendamentos->get();
$parametrizacao = Parametrizacao::first();
return [
'veiculos' => self::getVeiculos($parametrizacao->agendar_transporte_jornada ?? null),
'jornadas' => self::getJornadas(),
'agendamentos' => $agendamentos,
'agendamentos_jornada' => self::getAgendadosPaciente()
];
}
public static function getAgendadosPaciente() {
return Agendar::where('data_saida', request()->data_saida)
->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);
})
->when(request()->horario_saida, function ($query) {
$query->where('horario_saida', request()->horario_saida);
})
->whereNotNull('veiculo_id')
->whereNotIn('status_id', [Status::CANCELADO, Status::TRANSPORTADO])
->get()
->map(fn($query) => [
'id' => $query->id ?? null,
'jornada_id' => $query->jornada_id ?? null,
'jornada_descricao' => $query->jornada_id
? (new Carbon($query->jornada->data_inicial))->format('d/m/Y H:i')
. ' - '
. (new Carbon($query->jornada->data_final))->format('d/m/Y H:i')
. ' - '
. $query->jornada_id
: null,
'paciente_id' => $query->paciente_id ?? null,
'paciente_nome' => $query->paciente->cidadao->nome ?? null,
'veiculo_id' => $query->veiculo_id ?? null,
'numero_placa' => $query->veiculo->numero_placa ?? null,
'descricao_modelo' => $query->veiculo->descricao_modelo ?? null,
'data_inicial' => $query->jornada->data_inicial ?? $query->data,
'data_final' => $query->jornada->data_final ?? $query->data,
'data' => (new Carbon($query->data))->format('d/m/Y') ?? null,
'horario' => (new Carbon($query->horario))->format('H:i') ?? null,
'destino' => $query->destino->descricao_destino ?? null,
'municipio' => $query->municipio->nome ?? null,
'uf' => $query->municipio->estado->uf ?? null,
'motivo' => $query->motivo->descricao ?? null,
'observacao' => $query->observacao,
]);
}
public static function loadFields()
{
return [
'form' => self::getFormData()
];
}
private static function getFormData()
{
$now = Carbon::now();
$currentDate = $now->format('Y-m-d');
$parametrizacao = Parametrizacao::first();
return [
'data_atual' => $now->format('d/m/Y'),
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'municipios' => self::getMunicipios(),
'destinos' => self::getDestinos(),
'horariosSaida' => self::getHorariosSaida(),
'tipos_passageiro' => TipoPassageiro::orderBy('descricao')->get(),
'tipos_veiculo' => Tipo::orderBy('descricao')->get(),
'horario_saida' => $parametrizacao->horario_saida ?? null,
'mensagem_protocolo' => $parametrizacao->mensagem_protocolo ?? null,
'agendar_transporte_jornada' => $parametrizacao->agendar_transporte_jornada ?? null,
'ordenacao' => [
['value' => 'agendamento', 'text' => 'AGENDAMENTO'],
['value' => 'data_consulta', 'text' => 'DATA / HORA DA CONSULTA'],
['value' => 'hora_saida', 'text' => 'HORÁRIO DE SAÍDA'],
['value' => 'local_consulta', 'text' => 'LOCAL DE CONSULTA'],
['value' => 'paciente', 'text' => 'PACIENTE'],
['value' => 'ponto_referencia', 'text' => 'PONTO DE REFERÊNCIA'],
],
];
}
public static function getVeiculos($jornada) {
if ($jornada) {
$veiculos = DB::table('transporte_paciente_veiculo as veiculo')
->join('transporte_paciente_jornada as jornada', 'veiculo.id', 'jornada.veiculo_id')
->when(request()->tipo_passageiro_id, function ($query) {
if (in_array(request()->tipo_passageiro_id, [3, 4])) {
$query->whereIn('veiculo.tipo_passageiro_id', [3, 4]);
} else {
$query->where('veiculo.tipo_passageiro_id', request()->tipo_passageiro_id);
}
})
->when(request()->horario_saida, function ($query) {
$query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%H:%i')"), '<=', request()->horario_saida)
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%H:%i')"), '>=', request()->horario_saida);
})
->when(request()->data_saida, function ($query) {
$query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), '<=', request()->data_saida)
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%Y-%m-%d')"), '>=', request()->data_saida);
})
->where('veiculo.bloqueado', false)
->select(
'veiculo.id',
DB::raw('CONCAT(
veiculo.numero_placa,
" - ",
veiculo.descricao_modelo
) AS descricao')
)
->orderBy('veiculo.numero_placa')
->groupBy('veiculo.id')
->get();
} else {
$veiculos = Veiculo::where('bloqueado', false)
->get()
->map(fn($query) => [
'id' => $query->id ?? null,
'descricao' => $query->numero_placa . ' - ' . $query->descricao_modelo,
'capacidade' => $query->numero_capacidade ?? null,
'tipo_id' => $query->tipo_id ?? null,
'agendados' => Agendar::where('veiculo_id', $query->id)
->whereNotIn('status_id', [Status::CANCELADO])
->when(request()->data_saida, function ($query) {
$query->where(DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d')"), request()->data_saida);
})
->select(
DB::raw('SUM(IFNULL(acompanhante, 0) + 1) AS quantidade'),
)
->groupBy('veiculo_id')
->first()
]);
}
return $veiculos;
}
public static function getJornadas()
{
$jornadas = DB::table('transporte_paciente_jornada as jornada')
->join('transporte_paciente_veiculo as veiculo', 'jornada.veiculo_id', 'veiculo.id')
->join('geral_dia_semana as dia_semana', 'jornada.geral_dia_semana_id', 'dia_semana.id')
->leftJoin(DB::raw(
'(
SELECT jornada_id, SUM(IFNULL(acompanhante, 0) + 1) AS total_agendados
FROM transporte_paciente_agendar_transporte
where status_id NOT IN ('.Status::CANCELADO.')
GROUP BY jornada_id
) AS agendamentos
'),
'jornada.id',
'agendamentos.jornada_id'
)
->when(request()->veiculo_id, fn ($query) => $query->where('jornada.veiculo_id', request()->veiculo_id))
->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), '<=', request()->data_saida)
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%Y-%m-%d')"), '>=', request()->data_saida)
->select(
'jornada.id',
'jornada.data_inicial',
'jornada.data_final',
'veiculo.id as veiculo_id',
'veiculo.numero_placa',
'veiculo.numero_capacidade',
'veiculo.tipo_id',
'dia_semana.id as geral_dia_semana_id',
'dia_semana.descricao as geral_dia_semana_descricao',
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"),
DB::raw('COALESCE(agendamentos.total_agendados, 0) as total_agendados')
)
->orderBy('jornada.data_inicial')
->get();
return $jornadas;
}
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')
->whereNotIn('status_id', [Status::CANCELADO, Status::TRANSPORTADO])
->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::leftJoin('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')
->whereNotIn('transporte_paciente_agendar_transporte.status_id', [Status::CANCELADO, Status::TRANSPORTADO])
->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::leftJoin('transporte_paciente_agendar_transporte', 'transporte_paciente_agendar_transporte.destino_id', '=', 'transporte_paciente_destino.id')
->whereNull('transporte_paciente_agendar_transporte.veiculo_id')
->whereNotIn('transporte_paciente_agendar_transporte.status_id', [Status::CANCELADO, Status::TRANSPORTADO])
->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();
}
private static function getModelData($destino = null)
{
$destino = [
'id' => $destino->id ?? null,
'municipio_id' => $destino->municipio_id ?? null,
'destino_id' => $destino->destino_id ?? null,
'data_saida' => $destino->data_saida ?? null,
'horario_saida' => $destino->horario_saida ?? null,
'jornada_id' => $destino->jornada_id ?? null,
'veiculo_id' => $destino->veiculo_id ?? null,
'ordenacao' => $destino->ordenacao ?? null,
'total_agendados' => $destino->total_agendados ?? null,
'capacidade' => $destino->capacidade ?? null,
'tipo_veiculo_id' => $destino->tipo_veiculo_id ?? null,
'tipo_passageiro_id' => $destino->tipo_passageiro_id ?? null,
'supervisor_id' => $destino->supervisor_id ?? null,
'total_agendados' => $destino->total_agendados ?? null,
'capacidade' => $destino->capacidade ?? null,
];
return $destino;
}
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function store()
{
foreach (request()->all() as $params) {
if ($params['supervisor_id'] === null && $params['veiculo_id'] !== null) {
$capacidade = intval($params['capacidade']) ?? 0;
$agendados = intval($params['total_agendados']) ?? 0;
if ($agendados > $capacidade ) {
throw new ExceededCapacidadeVeiculoException;
}
}
$escolher = Agendar::where('id', $params['id'])->first();
$escolher->veiculo_id = $params['veiculo_id'];
$escolher->horario_saida = $params['horario_saida'];
$escolher->supervisor_id = $params['supervisor_id'];
$escolher->jornada_id = $params['jornada_id'];
$escolher->veiculo_edited_by = self::getCurrentLotacao()->usuario->id;
$escolher->veiculo_edited_at = Carbon::now();
$escolher->funcionalidade_origem = Funcionalidade::ESCOLHER_VEICULO;
$escolher->save();
HistoricoService::create($escolher, Status::MODIFICADO, $escolher->updated_lotacao_id);
}
}
}