475 lines
21 KiB
PHP
475 lines
21 KiB
PHP
<?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);
|
|
}
|
|
}
|
|
}
|