This commit is contained in:
@@ -0,0 +1,684 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\TransportePaciente\Transferencia;
|
||||
|
||||
use App\Enums\TransportePaciente\Funcionalidade;
|
||||
use App\Enums\TransportePaciente\Status;
|
||||
use App\Enums\TransportePaciente\ViagemStatus;
|
||||
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\Models\TransportePaciente\Viagem;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class TransferenciaService 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_viagem.protocolo',
|
||||
'transporte_paciente_agendar_transporte.supervisor_id',
|
||||
'transporte_paciente_viagem.jornada_id',
|
||||
'cadastro_cidadao.nome AS motorista_nome',
|
||||
'intranet.cadastro_municipio.nome AS municipio_nome',
|
||||
'transporte_paciente_condutor.id AS motorista_id',
|
||||
DB::raw('IF(transporte_paciente_viagem.diaria IS NOT NULL, FORMAT(transporte_paciente_viagem.diaria, 2, "pt_BR"), NULL) AS diaria'),
|
||||
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(SUM(transporte_paciente_agendar_transporte.acompanhante), 0) AS quantidade_acompanhantes'),
|
||||
DB::raw('COUNT(transporte_paciente_agendar_transporte.id) AS quantidade_pacientes'),
|
||||
DB::raw('transporte_paciente_veiculo.id AS veiculo_id'),
|
||||
DB::raw('transporte_paciente_veiculo.numero_capacidade AS capacidade'),
|
||||
DB::raw('CONCAT(
|
||||
transporte_paciente_veiculo.numero_placa,
|
||||
" - ",
|
||||
transporte_paciente_veiculo.descricao_modelo
|
||||
) AS veiculo_nome'),
|
||||
DB::raw('IFNULL(
|
||||
IF(
|
||||
transporte_paciente_veiculo.numero_capacidade - (
|
||||
COALESCE(SUM(transporte_paciente_agendar_transporte.acompanhante), 0) + COUNT(transporte_paciente_agendar_transporte.id)
|
||||
) < 0,
|
||||
0,
|
||||
transporte_paciente_veiculo.numero_capacidade - (
|
||||
COALESCE(SUM(transporte_paciente_agendar_transporte.acompanhante), 0) + COUNT(transporte_paciente_agendar_transporte.id)
|
||||
)
|
||||
),
|
||||
transporte_paciente_veiculo.numero_capacidade
|
||||
) AS vagas_disponiveis'),
|
||||
DB::raw("CASE
|
||||
WHEN transporte_paciente_viagem.jornada_id IS NULL THEN 'SEM JORNADA'
|
||||
ELSE CONCAT(
|
||||
DATE_FORMAT(transporte_paciente_jornada.data_inicial, '%d/%m/%Y %H:%i'),
|
||||
' - ',
|
||||
DATE_FORMAT(transporte_paciente_jornada.data_final, '%d/%m/%Y %H:%i'),
|
||||
' - ',
|
||||
transporte_paciente_jornada.id
|
||||
) END AS jornada"
|
||||
),
|
||||
DB::raw('
|
||||
CASE
|
||||
WHEN transporte_paciente_viagem.horario_saida_real IS NOT NULL THEN
|
||||
TIME_FORMAT(transporte_paciente_viagem.horario_saida_real, "%H:%i")
|
||||
WHEN transporte_paciente_viagem.horario_saida_temp IS NOT NULL THEN
|
||||
TIME_FORMAT(transporte_paciente_viagem.horario_saida_temp, "%H:%i")
|
||||
ELSE
|
||||
"-"
|
||||
END AS horario_saida
|
||||
')
|
||||
])
|
||||
->join(
|
||||
'transporte_paciente_veiculo',
|
||||
'transporte_paciente_veiculo.id',
|
||||
'transporte_paciente_agendar_transporte.veiculo_id'
|
||||
)
|
||||
->join(
|
||||
'transporte_paciente_viagem',
|
||||
'transporte_paciente_viagem.veiculo_id',
|
||||
'transporte_paciente_veiculo.id'
|
||||
)
|
||||
->join(
|
||||
'transporte_paciente_condutor',
|
||||
'transporte_paciente_condutor.id',
|
||||
'transporte_paciente_viagem.condutor_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_usuario',
|
||||
'cadastro_usuario.id',
|
||||
'transporte_paciente_condutor.usuario_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_cidadao',
|
||||
'cadastro_cidadao.id',
|
||||
'cadastro_usuario.cidadao_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'transporte_paciente_destino as destino',
|
||||
'transporte_paciente_agendar_transporte.destino_id',
|
||||
'destino.id'
|
||||
)
|
||||
->join(
|
||||
'intranet.cadastro_municipio',
|
||||
'intranet.cadastro_municipio.id',
|
||||
'transporte_paciente_agendar_transporte.municipio_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'transporte_paciente_jornada',
|
||||
'transporte_paciente_jornada.id',
|
||||
'transporte_paciente_viagem.jornada_id'
|
||||
)
|
||||
->whereColumn('transporte_paciente_viagem.id', '=', 'transporte_paciente_agendar_transporte.viagem_id')
|
||||
->when(request()->municipio_id, function ($query) {
|
||||
$query->where('destino.municipio_id', request()->municipio_id);
|
||||
})
|
||||
->when(request()->destino_id, function ($query) {
|
||||
$query->where('destino.id', request()->destino_id);
|
||||
});
|
||||
|
||||
$agendamentos = $agendamentos->whereIn('transporte_paciente_agendar_transporte.status_id', [Status::AGENDADO, Status::MODIFICADO, Status::REAGENDADO]);
|
||||
|
||||
if (request()->data_saida) {
|
||||
|
||||
$agendamentos = $agendamentos->where('transporte_paciente_agendar_transporte.data_saida', request()->data_saida);
|
||||
$agendamentos = $agendamentos->where('transporte_paciente_viagem.data', request()->data_saida);
|
||||
} else {
|
||||
|
||||
$agendamentos = $agendamentos->where('transporte_paciente_agendar_transporte.data_saida', $currentDate);
|
||||
$agendamentos = $agendamentos->where('transporte_paciente_viagem.data', $currentDate);
|
||||
}
|
||||
|
||||
$agendamentos = $agendamentos->groupBy(
|
||||
'transporte_paciente_veiculo.id',
|
||||
'transporte_paciente_condutor.id',
|
||||
'transporte_paciente_viagem.jornada_id'
|
||||
);
|
||||
|
||||
$agendamentos = $agendamentos->get();
|
||||
|
||||
return [
|
||||
'veiculos' => self::getVeiculos(),
|
||||
'agendamentos' => $agendamentos,
|
||||
'agendamentos_jornada' => self::getAgendadosPaciente()
|
||||
];
|
||||
}
|
||||
|
||||
public static function index()
|
||||
{
|
||||
$now = Carbon::now();
|
||||
$currentDate = $now->format('Y-m-d');
|
||||
$parametrizacao = Parametrizacao::first();
|
||||
|
||||
$agendamentos = DB::table('transporte_paciente_agendar_transporte')
|
||||
->select([
|
||||
'transporte_paciente_viagem.protocolo',
|
||||
'transporte_paciente_agendar_transporte.id',
|
||||
'transporte_paciente_agendar_transporte.supervisor_id',
|
||||
'transporte_paciente_agendar_transporte.jornada_id',
|
||||
'transporte_paciente_agendar_transporte.consulta_observacao as observacao',
|
||||
'transporte_paciente_condutor.id AS motorista_id',
|
||||
'cidadao_condutor.nome AS motorista_nome',
|
||||
DB::raw('IF(transporte_paciente_viagem.diaria IS NOT NULL, FORMAT(transporte_paciente_viagem.diaria, 2, "pt_BR"), NULL) AS diaria'),
|
||||
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'),
|
||||
'transporte_paciente_agendar_transporte.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',
|
||||
'transporte_paciente_veiculo.id AS viagem_id',
|
||||
DB::raw('false AS selecionado'),
|
||||
DB::raw('false AS atribuido'),
|
||||
DB::raw('transporte_paciente_veiculo.id AS veiculo_id'),
|
||||
DB::raw('CONCAT(
|
||||
transporte_paciente_veiculo.numero_placa,
|
||||
" - ",
|
||||
transporte_paciente_veiculo.descricao_modelo
|
||||
) AS veiculo_nome'),
|
||||
DB::raw("CASE
|
||||
WHEN transporte_paciente_viagem.jornada_id IS NULL THEN 'SEM JORNADA'
|
||||
ELSE CONCAT(
|
||||
DATE_FORMAT(transporte_paciente_jornada.data_inicial, '%d/%m/%Y %H:%i'),
|
||||
' - ',
|
||||
DATE_FORMAT(transporte_paciente_jornada.data_final, '%d/%m/%Y %H:%i'),
|
||||
' - ',
|
||||
transporte_paciente_jornada.id
|
||||
) END AS jornada"
|
||||
),
|
||||
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
|
||||
DB::raw('IF (cadastro_cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
|
||||
DB::raw(
|
||||
'(
|
||||
CASE WHEN cadastro_cidadao.nome_mae IS NULL THEN
|
||||
"Não informado"
|
||||
ELSE
|
||||
cadastro_cidadao.nome_mae
|
||||
END
|
||||
) as nome_mae'
|
||||
),
|
||||
])
|
||||
->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(
|
||||
'transporte_paciente_veiculo',
|
||||
'transporte_paciente_veiculo.id',
|
||||
'transporte_paciente_agendar_transporte.veiculo_id'
|
||||
)
|
||||
->join(
|
||||
'transporte_paciente_viagem',
|
||||
'transporte_paciente_viagem.veiculo_id',
|
||||
'transporte_paciente_veiculo.id'
|
||||
)
|
||||
->join(
|
||||
'transporte_paciente_condutor',
|
||||
'transporte_paciente_condutor.id',
|
||||
'transporte_paciente_viagem.condutor_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_usuario',
|
||||
'cadastro_usuario.id',
|
||||
'transporte_paciente_condutor.usuario_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_cidadao as cidadao_condutor',
|
||||
'cidadao_condutor.id',
|
||||
'cadastro_usuario.cidadao_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'transporte_paciente_jornada',
|
||||
'transporte_paciente_jornada.id',
|
||||
'transporte_paciente_viagem.jornada_id'
|
||||
)
|
||||
->whereColumn('transporte_paciente_viagem.id', '=', 'transporte_paciente_agendar_transporte.viagem_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()->motorista_id) {
|
||||
|
||||
$agendamentos->where('transporte_paciente_condutor.id', request()->motorista_id);
|
||||
}
|
||||
|
||||
if (request()->veiculo_id) {
|
||||
|
||||
$agendamentos->where('transporte_paciente_agendar_transporte.veiculo_id', request()->veiculo_id);
|
||||
}
|
||||
|
||||
$agendamentos = $agendamentos->get();
|
||||
|
||||
$parametrizacao = Parametrizacao::first();
|
||||
|
||||
return [
|
||||
'veiculos' => self::getVeiculos(),
|
||||
'agendamentos' => $agendamentos,
|
||||
'agendamentos_jornada' => self::getAgendadosPaciente(),
|
||||
'motoristas' => self::getMotoristas(),
|
||||
'tipos_veiculo' => Tipo::orderBy('descricao')->get(),
|
||||
'agendar_transporte_jornada' => $parametrizacao->agendar_transporte_jornada ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
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')
|
||||
->groupBy('condutor.id')
|
||||
->orderBy('cidadao.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
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')
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'id' => $query->id ?? null,
|
||||
'jornada_id' => $query->jornada_id ?? null,
|
||||
'paciente_id' => $query->paciente_id ?? null,
|
||||
'paciente_nome' => $query->paciente->cidadao->nome ?? 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,
|
||||
]);
|
||||
}
|
||||
|
||||
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,
|
||||
'veiculos' => self::getVeiculos(),
|
||||
];
|
||||
}
|
||||
|
||||
public static function getVeiculos() {
|
||||
$parametrizacao = Parametrizacao::first();
|
||||
if($parametrizacao && $parametrizacao->agendar_transporte_jornada) {
|
||||
$veiculos = Veiculo::where('bloqueado', false)
|
||||
->where(function ($query) {
|
||||
$query->where('transporte_paciente_viagem.status_id', ViagemStatus::ABERTO)
|
||||
->orWhereNull('transporte_paciente_viagem.status_id')
|
||||
->orWhereNull('transporte_paciente_viagem.id');
|
||||
})
|
||||
->leftJoin(
|
||||
'transporte_paciente_jornada',
|
||||
'transporte_paciente_jornada.veiculo_id',
|
||||
'transporte_paciente_veiculo.id'
|
||||
)
|
||||
->leftJoin(
|
||||
'transporte_paciente_viagem',
|
||||
'transporte_paciente_viagem.jornada_id',
|
||||
'transporte_paciente_jornada.id'
|
||||
)
|
||||
->select(
|
||||
'transporte_paciente_veiculo.id as veiculo_id',
|
||||
'transporte_paciente_veiculo.numero_placa as numero_placa',
|
||||
'transporte_paciente_veiculo.descricao_modelo as descricao_modelo',
|
||||
'transporte_paciente_veiculo.numero_capacidade as numero_capacidade',
|
||||
'transporte_paciente_veiculo.tipo_id as tipo_id',
|
||||
'transporte_paciente_viagem.diaria as diaria',
|
||||
'transporte_paciente_viagem.id as viagem_id',
|
||||
)
|
||||
->when(request()->data_saida, function ($query) {
|
||||
$query->where(DB::raw("DATE_FORMAT(transporte_paciente_jornada.data_inicial, '%Y-%m-%d')"), '<=', request()->data_saida);
|
||||
})
|
||||
->when(request()->data_saida, function ($query) {
|
||||
$query->where(DB::raw("DATE_FORMAT(transporte_paciente_jornada.data_final, '%Y-%m-%d')"), '>=', request()->data_saida);
|
||||
})
|
||||
->groupBy('veiculo_id')
|
||||
->orderBy('numero_placa')
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'id' => $query->veiculo_id ?? null,
|
||||
'descricao' => $query->numero_placa . ' - ' . $query->descricao_modelo,
|
||||
'capacidade' => $query->numero_capacidade ?? null,
|
||||
'tipo_id' => $query->tipo_id ?? null,
|
||||
'viagem_id' => $query->viagem_id ?? null,
|
||||
'protocolo' => $query->viagem_id ? Viagem::find($query->viagem_id)->protocolo ?? '-' : '-',
|
||||
'diaria' => $query->diaria ? number_format($query->diaria, 2, ',', '.') : null,
|
||||
'agendados' => Agendar::where('veiculo_id', $query->veiculo_id)
|
||||
->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()
|
||||
]);
|
||||
} else {
|
||||
$veiculos = Veiculo::where('bloqueado', false)
|
||||
->leftJoin(
|
||||
'transporte_paciente_viagem',
|
||||
'transporte_paciente_viagem.veiculo_id',
|
||||
'transporte_paciente_veiculo.id'
|
||||
)
|
||||
->select(
|
||||
'transporte_paciente_veiculo.id as veiculo_id',
|
||||
'transporte_paciente_veiculo.numero_placa as numero_placa',
|
||||
'transporte_paciente_veiculo.descricao_modelo as descricao_modelo',
|
||||
'transporte_paciente_veiculo.numero_capacidade as numero_capacidade',
|
||||
'transporte_paciente_veiculo.tipo_id as tipo_id',
|
||||
'transporte_paciente_viagem.diaria as diaria',
|
||||
'transporte_paciente_viagem.id as viagem_id',
|
||||
)
|
||||
->groupBy('veiculo_id')
|
||||
->orderBy('numero_placa')
|
||||
->get()
|
||||
->map(function ($query) {
|
||||
$veiculo_id = $query->veiculo_id;
|
||||
$veiculo = Veiculo::where('bloqueado', false)
|
||||
->where('transporte_paciente_viagem.status_id', ViagemStatus::ABERTO)
|
||||
->leftJoin(
|
||||
'transporte_paciente_viagem',
|
||||
'transporte_paciente_viagem.veiculo_id',
|
||||
'transporte_paciente_veiculo.id'
|
||||
)
|
||||
->select(
|
||||
'transporte_paciente_viagem.id as viagem_id',
|
||||
)
|
||||
->when(request()->data_saida, function($query) {
|
||||
$query->where('transporte_paciente_viagem.data', request()->data_saida);
|
||||
})
|
||||
->when($query->veiculo_id, function($query) use ($veiculo_id) {
|
||||
$query->where('transporte_paciente_viagem.veiculo_id', $veiculo_id);
|
||||
})
|
||||
->first();
|
||||
return [
|
||||
'id' => $query->veiculo_id ?? null,
|
||||
'descricao' => $query->numero_placa . ' - ' . $query->descricao_modelo,
|
||||
'capacidade' => $query->numero_capacidade ?? null,
|
||||
'tipo_id' => $query->tipo_id ?? null,
|
||||
'viagem_id' => $veiculo ? $veiculo->viagem_id : null,
|
||||
'protocolo' => $veiculo ? Viagem::find($veiculo->viagem_id)->protocolo ?? '-' : '-',
|
||||
'diaria' => $query->diaria ? number_format($query->diaria, 2, ',', '.') : null,
|
||||
'agendados' => Agendar::where('veiculo_id', $query->veiculo_id)
|
||||
->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(
|
||||
'transporte_paciente_viagem',
|
||||
'transporte_paciente_viagem.jornada_id',
|
||||
'jornada.id'
|
||||
)
|
||||
->leftJoin(DB::raw(
|
||||
'(
|
||||
SELECT jornada_id, SUM(IFNULL(acompanhante, 0) + 1) AS total_agendados
|
||||
FROM transporte_paciente_agendar_transporte
|
||||
GROUP BY jornada_id
|
||||
) AS agendamentos
|
||||
'),
|
||||
'jornada.id',
|
||||
'agendamentos.jornada_id'
|
||||
)
|
||||
->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(
|
||||
'transporte_paciente_viagem.protocolo',
|
||||
'jornada.id',
|
||||
'jornada.data_inicial',
|
||||
'jornada.data_final',
|
||||
'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',
|
||||
'transporte_paciente_viagem.id as viagem_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"),
|
||||
DB::raw('COALESCE(agendamentos.total_agendados, 0) as total_agendados')
|
||||
)
|
||||
->orderByRaw('CASE WHEN transporte_paciente_viagem.id IS NOT NULL THEN 0 ELSE 1 END')
|
||||
->orderBy('jornada.data_inicial')
|
||||
->groupBy('jornada.id')
|
||||
->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)
|
||||
->where('transporte_paciente_agendar_transporte.status_id', Status::AGENDADO)
|
||||
->whereNotNull('horario_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);
|
||||
})
|
||||
->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::join('intranet.cadastro_municipio', 'intranet.cadastro_municipio.id', '=', 'transporte_paciente_agendar_transporte.municipio_id')
|
||||
->whereIn('transporte_paciente_agendar_transporte.status_id', [Status::AGENDADO, Status::MODIFICADO])
|
||||
->where('transporte_paciente_agendar_transporte.data_saida', $data_saida)
|
||||
->whereNotNull('transporte_paciente_agendar_transporte.viagem_id')
|
||||
->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::join('transporte_paciente_agendar_transporte', 'transporte_paciente_agendar_transporte.destino_id', '=', 'transporte_paciente_destino.id')
|
||||
->whereIn('transporte_paciente_agendar_transporte.status_id', [Status::AGENDADO, Status::MODIFICADO])
|
||||
->where('transporte_paciente_destino.municipio_id', request()->municipio_id)
|
||||
->where('transporte_paciente_agendar_transporte.data_saida', $data_saida)
|
||||
->where('transporte_paciente_destino.bloqueado', false)
|
||||
->whereNotNull('transporte_paciente_agendar_transporte.viagem_id')
|
||||
->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,
|
||||
'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()
|
||||
{
|
||||
$viagens = [];
|
||||
foreach (request()->all() as $params) {
|
||||
|
||||
if ($params['atribuido'] === true) {
|
||||
|
||||
$escolher = Agendar::where('id', $params['id'])->first();
|
||||
if($escolher->veiculo_id != $params['veiculo_id']) {
|
||||
$escolher->veiculo_edited_by = self::getCurrentLotacao()->usuario->id;
|
||||
$escolher->veiculo_edited_at = Carbon::now();
|
||||
$escolher->funcionalidade_origem = Funcionalidade::TRANSFERENCIA_VEICULO;
|
||||
}
|
||||
$escolher->veiculo_id = $params['veiculo_id'];
|
||||
$escolher->supervisor_id = $params['supervisor_id'];
|
||||
$escolher->jornada_id = $params['jornada_id'];
|
||||
$viagem_id = $escolher->viagem_id;
|
||||
|
||||
$viagem = Viagem::where('id', $params['viagem_id'])->where('status_id', ViagemStatus::ABERTO)->first();
|
||||
if($viagem) {
|
||||
$viagem->diaria = $params['diaria'];
|
||||
$viagem->jornada_id = $params['jornada_id'];
|
||||
if (!is_null($params['diaria'])) {
|
||||
$viagem->diaria = str_replace('.', '', $viagem->diaria);
|
||||
$viagem->diaria = str_replace(',', '.', $viagem->diaria);
|
||||
}
|
||||
$viagem->condutor_id = $params['motorista_id'];
|
||||
$viagem->save();
|
||||
$escolher->viagem_id = $params['viagem_id'];
|
||||
} else {
|
||||
$atual = Viagem::where('id', $escolher->viagem_id)->where('status_id', ViagemStatus::ABERTO)->first();
|
||||
$viagem = Viagem::create([
|
||||
'condutor_id' => $params['motorista_id'],
|
||||
'veiculo_id' => $params['veiculo_id'],
|
||||
'data' => Carbon::createFromFormat('d/m/Y', $params['data_saida']),
|
||||
'horario_saida_temp' => $atual->horario_saida_temp,
|
||||
'diaria' => $atual->diaria,
|
||||
'jornada_id' => $params['jornada_id'],
|
||||
'status' => ViagemStatus::ABERTO,
|
||||
])->fresh();
|
||||
$escolher->viagem_id = $viagem->id;
|
||||
array_push($viagens, $viagem->id);
|
||||
}
|
||||
$escolher->save();
|
||||
|
||||
if(Agendar::where('viagem_id', $viagem_id)->get()->count() == 0) {
|
||||
$viagem_anterior = Viagem::find($viagem_id);
|
||||
$viagem_anterior->status_id = ViagemStatus::CANCELADO;
|
||||
if(is_null($viagem->protocolo)) {
|
||||
$viagem->protocolo = $viagem_anterior->protocolo;
|
||||
$viagem->save();
|
||||
}
|
||||
$viagem_anterior->protocolo = Viagem::max('protocolo') + 1;
|
||||
$viagem_anterior->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($viagens as $viagem_id) {
|
||||
$viagem = Viagem::find($viagem_id);
|
||||
if(is_null($viagem->protocolo)) {
|
||||
$viagem->protocolo = Viagem::max('protocolo') + 1;
|
||||
$viagem->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user