Files
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

276 lines
8.6 KiB
PHP

<?php
namespace App\Services\TransportePaciente\Jornada;
use App\Enums\TransportePaciente\Status;
use App\Enums\Administracao\Modulo;
use App\Exceptions\Model\DeletingModelException;
use App\Models\Cadastro\Feriado\Feriado;
use App\Models\Geral\DiaSemana;
use App\Models\TransportePaciente\Agendar\Agendar;
use App\Models\TransportePaciente\Jornada\Jornada;
use App\Models\TransportePaciente\Viagem;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class JornadaService extends Service
{
private static function obterInformacoesVeiculo($idVeiculo)
{
$veiculo = DB::table('transporte_paciente_veiculo as veiculo')
->join(
'transporte_paciente_veiculo_tipo_passageiro as tipo_passageiro',
'veiculo.tipo_passageiro_id',
'tipo_passageiro.id'
)
->join(
'transporte_paciente_veiculo_cor as cor',
'veiculo.cor_id',
'cor.id'
)
->join(
'transporte_paciente_veiculo_marca as marca',
'veiculo.marca_id',
'marca.id'
)
->join(
'transporte_paciente_veiculo_tipo as tipo',
'veiculo.tipo_id',
'tipo.id'
)
->where('veiculo.id', $idVeiculo)
->select(
'veiculo.id',
'veiculo.numero_placa',
'veiculo.descricao_modelo',
'veiculo.ano_fabricacao',
'veiculo.numero_capacidade',
'marca.descricao as descricao_marca',
'tipo.descricao as descricao_tipo',
'tipo_passageiro.descricao as passageiro_descricao_tipo',
'cor.descricao as descricao_cor',
)
->first(1);
$veiculo->numero_placa = MaskUtil::getPlacaMasked($veiculo->numero_placa);
return $veiculo;
}
private static function obterJornadas($idVeiculo)
{
$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')
->where('jornada.veiculo_id', $idVeiculo)
->select(
'jornada.id',
'jornada.data_inicial',
'jornada.data_final',
'veiculo.numero_placa',
'dia_semana.id as geral_dia_semana_id',
'dia_semana.descricao as geral_dia_semana_descricao',
DB::raw('false AS selecionado'),
DB::raw('(SELECT agendar.id FROM transporte_paciente_agendar_transporte as agendar
WHERE agendar.jornada_id = jornada.id AND (agendar.status_id != "' . Status::CANCELADO . '"
OR agendar.status_id IS NULL) LIMIT 1) as vinculo'
)
)
->orderBy('jornada.data_inicial')
->get();
return $jornadas;
}
private static function getFormData($idVeiculo = null)
{
return [
'veiculo' => self::obterInformacoesVeiculo($idVeiculo),
'dias_semana' => self::obterDiasSemana(),
'data_atual' => Carbon::now()->format('Y-m-d'),
'feriados' => self::getFeriados(),
'tipo_jornada' => [
['value' => 'unica', 'text' => 'Única'],
],
];
}
private static function getFeriados()
{
return Feriado::whereHas('modulos', fn ($q) => $q
->where('identificador', Modulo::TRANSPORTE_PACIENTE)
)
->orderBy('id')
->get()
->map(fn ($feriado) => (object) [
'id' => $feriado->id,
'data' => (new Carbon($feriado->data))->format('d/m/Y') ?? null,
'tipo_nome' => $feriado->tipo->descricao,
'observacao' => $feriado->observacao,
'modulos' => $feriado->modulos->pluck('id'),
]);
}
private static function obterDiasSemana()
{
return DiaSemana::get()
->map(fn ($feriado) => [
'id' => $feriado->id,
'descricao' => $feriado->descricao,
'disabled' => true,
]);
}
private static function getModelData($idVeiculo = null)
{
return [
'jornadas' => self::obterJornadas($idVeiculo),
'jornadasNotSave' => null,
];
}
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function edit($idVeiculo)
{
return [
'form' => self::getFormData($idVeiculo),
'model' => self::getModelData($idVeiculo),
];
}
public static function destroySelected()
{
try {
$ids = request()->ids;
$deletarVariasJornadas = Agendar::where('jornada_id', $ids)
->where(function ($query) {
$query->whereNotIn('status_id', [Status::CANCELADO])
->orWhereNull('status_id');
})->get();
if ($deletarVariasJornadas) {
Agendar::where('jornada_id', $ids)->update(['jornada_id' => null]);
}
DB::transaction(function () use ($ids) {
Viagem::whereIn('jornada_id', $ids)->delete();
Jornada::whereIn('id', $ids)->delete();
});
} catch (\Throwable $th) {
throw new DeletingModelException;
}
}
public static function destroy($id)
{
try {
$deletarJornada = Agendar::where('jornada_id', $id)
->where(function ($query) {
$query->whereNotIn('status_id', [Status::CANCELADO])
->orWhereNull('status_id');
})->get();
if ($deletarJornada) {
Agendar::where('jornada_id', $id)->update(['jornada_id' => null]);
}
DB::transaction(function () use ($id) {
Viagem::where('jornada_id', $id)->delete();
Jornada::destroy($id);
});
} catch (\Throwable $th) {
throw new DeletingModelException;
}
}
public static function store()
{
self::validate();
DB::transaction(function () {
foreach (request()->jornadas as $jornada) {
if (is_numeric($jornada['id'])) {
$existingJornada = Jornada::find($jornada['id']);
if ($existingJornada) {
$existingJornada->update($jornada);
}
} else {
unset($jornada['id']);
Jornada::create($jornada);
}
}
});
return response()->json(null, Response::HTTP_NO_CONTENT);
}
public static function datatable()
{
$veiculos = DB::table('transporte_paciente_veiculo as veiculo')
->join(
'transporte_paciente_veiculo_cor as cor',
'veiculo.cor_id',
'cor.id'
)
->join(
'transporte_paciente_veiculo_marca as marca',
'veiculo.marca_id',
'marca.id'
)
->join(
'transporte_paciente_veiculo_tipo as tipo',
'veiculo.tipo_id',
'tipo.id'
)
->where('veiculo.bloqueado', false)
->select(
'veiculo.id',
'veiculo.numero_placa',
'veiculo.descricao_modelo',
'veiculo.descricao_modelo',
'marca.descricao as descricao_marca',
'tipo.descricao as descricao_tipo',
'veiculo.ano_fabricacao',
'cor.descricao as descricao_cor',
);
return $veiculos;
}
private static function validate()
{
return request()->validate(
[
'jornadas.*.veiculo_id' => ['required',],
'jornadas.*.data_inicial' => ['required',],
'jornadas.*.data_final' => ['required',],
'jornadas.*.geral_dia_semana_id' => ['required',],
]
);
}
}