This commit is contained in:
@@ -0,0 +1,295 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\TransportePaciente\Relatorios;
|
||||
|
||||
use App\Enums\TransportePaciente\ViagemStatus as EnumViagemStatus;
|
||||
use App\Models\TransportePaciente\ViagemStatus;
|
||||
use App\Services\Service;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Carbon;
|
||||
|
||||
class EstatisticoService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
return [
|
||||
'model' => [
|
||||
'periodo' => [
|
||||
'start' => null,
|
||||
'end' => null
|
||||
],
|
||||
'motorista' => null,
|
||||
'municipio' => null,
|
||||
'destino' => null,
|
||||
'status' => null,
|
||||
'veiculo' => null,
|
||||
'motivo' => null,
|
||||
'prontuario' => null,
|
||||
'protocolo' => null
|
||||
],
|
||||
'form' => [
|
||||
'motoristas' => null,
|
||||
'municipios' => null,
|
||||
'destinos' => null,
|
||||
'status' => ViagemStatus::find([
|
||||
EnumViagemStatus::ABERTO,
|
||||
EnumViagemStatus::FINALIZADO,
|
||||
]),
|
||||
'veiculos' => null,
|
||||
'motivos' => null
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
private static function getViagens()
|
||||
{
|
||||
return DB::table('transporte_paciente_viagem as viagem')
|
||||
->join('transporte_paciente_condutor as condutor', 'viagem.condutor_id', 'condutor.id')
|
||||
->join('cadastro_usuario as usuario as usuario', 'condutor.usuario_id', 'usuario.id')
|
||||
->join('cadastro_cidadao as cidadao', 'usuario.cidadao_id', 'cidadao.id')
|
||||
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
|
||||
->join('cadastro_paciente as paciente', 'agendar.paciente_id', 'paciente.id')
|
||||
->join('cadastro_cidadao as paciente_cidadao', 'paciente.cidadao_id', 'paciente_cidadao.id')
|
||||
->join('transporte_paciente_motivo_viagem_procedimento as motivo', 'agendar.motivo_id', 'motivo.id')
|
||||
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
|
||||
->join('intranet.cadastro_municipio as municipio', 'destino.municipio_id', 'municipio.id')
|
||||
->join('transporte_paciente_veiculo as veiculo', 'agendar.veiculo_id', 'veiculo.id')
|
||||
->join('transporte_paciente_viagem_status as viagem_status', 'viagem.status_id', 'viagem_status.id')
|
||||
->select(
|
||||
'viagem.id',
|
||||
'viagem.condutor_id',
|
||||
'cidadao.nome as motorista',
|
||||
'municipio.nome as municipio',
|
||||
'viagem_status.descricao as status',
|
||||
'veiculo.descricao_modelo as veiculo',
|
||||
'veiculo.numero_capacidade as capacidade',
|
||||
'viagem.data as data',
|
||||
'destino.descricao_destino as destino',
|
||||
DB::raw('LPAD(paciente.prontuario, 6, 0) as prontuario'),
|
||||
'agendar.paciente_id',
|
||||
'paciente_cidadao.nome as paciente',
|
||||
'agendar.acompanhante',
|
||||
'motivo.descricao as motivo',
|
||||
DB::raw("TIME_FORMAT(viagem.horario_chegada, '%H:%i') as horario_chegada"),
|
||||
DB::raw("TIME_FORMAT(viagem.horario_saida_real, '%H:%i') as horario_saida"),
|
||||
'viagem.diaria',
|
||||
'viagem.protocolo'
|
||||
)
|
||||
->where('viagem.data', '>=', request()->data_inicial)
|
||||
->where('viagem.data', '<=', request()->data_final)
|
||||
->when(request()->motorista , function($query) {
|
||||
$query->where('viagem.condutor_id', request()->motorista);
|
||||
})
|
||||
->when(request()->municipio , function($query) {
|
||||
$query->where('destino.municipio_id', request()->municipio);
|
||||
})
|
||||
->when(request()->destino , function($query) {
|
||||
$query->where('agendar.destino_id', request()->destino);
|
||||
})
|
||||
->when(request()->veiculo , function($query) {
|
||||
$query->where('viagem.veiculo_id', request()->veiculo);
|
||||
})
|
||||
->when(request()->motivo , function($query) {
|
||||
$query->where('agendar.motivo_id', request()->motivo);
|
||||
})
|
||||
->where('viagem.status_id', '!=', EnumViagemStatus::CANCELADO)
|
||||
->when(request()->status, function($query) {
|
||||
$query->where('viagem.status_id', request()->status);
|
||||
})
|
||||
->when(request()->prontuario, function($query) {
|
||||
$query->where('paciente.prontuario', request()->prontuario);
|
||||
})
|
||||
->when(request()->protocolo, function($query) {
|
||||
$query->where('viagem.protocolo', request()->protocolo);
|
||||
})
|
||||
->orderBy('viagem.data')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getTotalGeral($viagens)
|
||||
{
|
||||
$pacientes = $viagens->count();
|
||||
$acompanhantes = $viagens->reduce(function ($carry, $item) {
|
||||
return $carry + $item->acompanhante;
|
||||
});
|
||||
$passageiros = $pacientes + $acompanhantes;
|
||||
return [
|
||||
'viagens' => $viagens->groupBy('id')->count(),
|
||||
'diarias' => $viagens->unique('id')->sum('diaria'),
|
||||
'pacientes' => $pacientes,
|
||||
'acompanhantes' => $acompanhantes ?? 0,
|
||||
'passageiros' => $passageiros,
|
||||
'porcentagem' => $passageiros != 0 ? round($acompanhantes / $passageiros * 100) : 0
|
||||
];
|
||||
}
|
||||
|
||||
private static function getTotalMotoristas($viagens)
|
||||
{
|
||||
$total = [];
|
||||
$viagens->groupBy('condutor_id')->each(function($item) use(&$total) {
|
||||
array_push($total, [
|
||||
'motorista' => $item[0]->motorista,
|
||||
'passageiros' => $item->sum('acompanhante') + $item->count(),
|
||||
'viagens' => $item->unique('id')->count(),
|
||||
'diarias' => $item->unique('id')->sum('diaria'),
|
||||
]);
|
||||
});
|
||||
return $total;
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
$viagens = self::getViagens();
|
||||
$total = self::getTotalGeral($viagens);
|
||||
$motoristas = self::getTotalMotoristas($viagens);
|
||||
return [
|
||||
'viagens' => $viagens,
|
||||
'total' => $total,
|
||||
'motoristas' => $motoristas,
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
public static function getPrintExportData()
|
||||
{
|
||||
$items = self::list();
|
||||
|
||||
$agrupados = collect($items['viagens'])->groupBy(function ($item) {
|
||||
return "{$item->motorista}-{$item->municipio}-{$item->status}-{$item->veiculo}-" . ($item->horario_saida ?? 'Sem horário');
|
||||
});
|
||||
|
||||
return [
|
||||
'data_inicial' => Carbon::parse(request()->data_inicial)->format('d/m/Y'),
|
||||
'data_final' => Carbon::parse(request()->data_final)->format('d/m/Y'),
|
||||
'motorista' => request()->filtro_motorista,
|
||||
'municipio' => request()->filtro_municipio,
|
||||
'destino' => request()->filtro_destino,
|
||||
'status' => request()->filtro_status,
|
||||
'veiculo' => request()->filtro_veiculo,
|
||||
'agrupados' => $agrupados,
|
||||
'motivo' => request()->filtro_motivo,
|
||||
'prontuario' => request()->prontuario,
|
||||
'items' => $items['viagens']->each(function($item) {
|
||||
$item->data = Carbon::parse($item->data)->format('d/m/Y');
|
||||
}),
|
||||
'motoristas' => $items['motoristas'],
|
||||
'total' => $items['total'],
|
||||
'colunas' => collect(request()->selectedCols),
|
||||
];
|
||||
}
|
||||
|
||||
public static function getMotoristas()
|
||||
{
|
||||
return DB::table('transporte_paciente_viagem as viagem')
|
||||
->join('transporte_paciente_condutor as condutor', 'viagem.condutor_id', 'condutor.id')
|
||||
->join('cadastro_usuario as usuario as usuario', 'condutor.usuario_id', 'usuario.id')
|
||||
->join('cadastro_cidadao as cidadao', 'usuario.cidadao_id', 'cidadao.id')
|
||||
->select('condutor.id', 'cidadao.nome')
|
||||
->where('viagem.data', '>=', request()->data_inicial)
|
||||
->where('viagem.data', '<=', request()->data_final)
|
||||
->when(request()->status, function($query) {
|
||||
$query->where('viagem.status_id', request()->status);
|
||||
})
|
||||
->orderBy('cidadao.nome')
|
||||
->distinct()
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getMunicipios()
|
||||
{
|
||||
return DB::table('transporte_paciente_viagem as viagem')
|
||||
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
|
||||
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
|
||||
->join('intranet.cadastro_municipio as municipio', 'destino.municipio_id', 'municipio.id')
|
||||
->select('municipio.id', 'municipio.nome')
|
||||
->where('viagem.data', '>=', request()->data_inicial)
|
||||
->where('viagem.data', '<=', request()->data_final)
|
||||
->when(request()->motorista, function($query) {
|
||||
$query->where('viagem.condutor_id', request()->motorista);
|
||||
})
|
||||
->when(request()->status, function($query) {
|
||||
$query->where('viagem.status_id', request()->status);
|
||||
})
|
||||
->orderBy('municipio.nome')
|
||||
->distinct()
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getDestinos()
|
||||
{
|
||||
return DB::table('transporte_paciente_viagem as viagem')
|
||||
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
|
||||
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
|
||||
->select('destino.id', 'destino.descricao_destino as descricao')
|
||||
->where('viagem.data', '>=', request()->data_inicial)
|
||||
->where('viagem.data', '<=', request()->data_final)
|
||||
->when(request()->motorista, function($query) {
|
||||
$query->where('viagem.condutor_id', request()->motorista);
|
||||
})
|
||||
->when(request()->municipio, function($query) {
|
||||
$query->where('destino.municipio_id', request()->municipio);
|
||||
})
|
||||
->when(request()->status, function($query) {
|
||||
$query->where('viagem.status_id', request()->status);
|
||||
})
|
||||
->orderBy('descricao')
|
||||
->distinct()
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getVeiculos()
|
||||
{
|
||||
return DB::table('transporte_paciente_viagem as viagem')
|
||||
->join('transporte_paciente_veiculo as veiculo', 'viagem.veiculo_id', 'veiculo.id')
|
||||
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
|
||||
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
|
||||
->select('veiculo.id', DB::raw('CONCAT(veiculo.numero_placa, " - ", veiculo.descricao_modelo) AS descricao'))
|
||||
->where('viagem.data', '>=', request()->data_inicial)
|
||||
->where('viagem.data', '<=', request()->data_final)
|
||||
->when(request()->motorista, function($query) {
|
||||
$query->where('viagem.condutor_id', request()->motorista);
|
||||
})
|
||||
->when(request()->municipio, function($query) {
|
||||
$query->where('destino.municipio_id', request()->municipio);
|
||||
})
|
||||
->when(request()->destino, function($query) {
|
||||
$query->where('destino.id', request()->destino);
|
||||
})
|
||||
->when(request()->status, function($query) {
|
||||
$query->where('viagem.status_id', request()->status);
|
||||
})
|
||||
->orderBy('descricao')
|
||||
->distinct()
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getMotivos()
|
||||
{
|
||||
return DB::table('transporte_paciente_viagem as viagem')
|
||||
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
|
||||
->join('transporte_paciente_destino as destino', 'agendar.destino_id', 'destino.id')
|
||||
->join('transporte_paciente_motivo_viagem_procedimento as motivo', 'agendar.motivo_id', 'motivo.id')
|
||||
->select('motivo.id', 'motivo.descricao')
|
||||
->where('viagem.data', '>=', request()->data_inicial)
|
||||
->where('viagem.data', '<=', request()->data_final)
|
||||
->when(request()->motorista, function($query) {
|
||||
$query->where('viagem.condutor_id', request()->motorista);
|
||||
})
|
||||
->when(request()->municipio, function($query) {
|
||||
$query->where('destino.municipio_id', request()->municipio);
|
||||
})
|
||||
->when(request()->destino, function($query) {
|
||||
$query->where('destino.id', request()->destino);
|
||||
})
|
||||
->when(request()->veiculo, function($query) {
|
||||
$query->where('viagem.veiculo_id', request()->veiculo);
|
||||
})
|
||||
->when(request()->status, function($query) {
|
||||
$query->where('viagem.status_id', request()->status);
|
||||
})
|
||||
->orderBy('motivo.descricao')
|
||||
->distinct()
|
||||
->get();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user