276 lines
8.6 KiB
PHP
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',],
|
|
]
|
|
);
|
|
}
|
|
}
|