Files
rkm-conectasus-ci-sandbox/api/app/Services/TransportePaciente/Relatorios/ViagemVeiculoService.php
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

232 lines
12 KiB
PHP

<?php
namespace App\Services\TransportePaciente\Relatorios;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Carbon;
use App\Models\TransportePaciente\ViagemStatus;
use App\Enums\TransportePaciente\ViagemStatus as EnumViagemStatus;
class ViagemVeiculoService extends Service
{
public static function index()
{
return [
'form' => [
'status' => ViagemStatus::find([
EnumViagemStatus::ABERTO,
EnumViagemStatus::FINALIZADO,
]),
'veiculos' => [],
],
'model' => [
'ano' => null,
'periodo' => [
'start' => null,
'end' => null,
],
'veiculo' => null,
'status' => null,
],
];
}
public static function getVeiculos()
{
return DB::table('transporte_paciente_viagem as viagem')
->join('transporte_paciente_veiculo as veiculo', 'veiculo.id', 'viagem.veiculo_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)
->where('viagem.status_id', '!=', EnumViagemStatus::CANCELADO)
->when(request()->status, function ($query) {
$query->where('viagem.status_id', request()->status);
})
->groupBy('viagem.veiculo_id')
->get();
}
public static function list()
{
return [
'resultado' => DB::table('transporte_paciente_viagem as viagem')
->join('transporte_paciente_veiculo as veiculo', 'veiculo.id', 'viagem.veiculo_id')
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
->leftJoin('transporte_paciente_destino as destino', 'destino.id', 'agendar.destino_id')
->leftJoin('intranet.cadastro_municipio as municipio', 'municipio.id', 'destino.municipio_id')
->leftJoin('intranet.cadastro_estado as estado', 'estado.id', 'municipio.estado_id')
->select(
'viagem.veiculo_id',
'destino.municipio_id',
'agendar.destino_id',
DB::raw("CONCAT(veiculo.descricao_modelo, ' - ',veiculo.numero_placa) as veiculo"),
DB::raw("CONCAT(municipio.nome, ' - ',estado.uf) as municipio"),
DB::raw("COUNT(*) as total"),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 1 THEN 1 END) AS total_janeiro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 2 THEN 1 END) AS total_fevereiro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 3 THEN 1 END) AS total_marco'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 4 THEN 1 END) AS total_abril'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 5 THEN 1 END) AS total_maio'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 6 THEN 1 END) AS total_junho'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 7 THEN 1 END) AS total_julho'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 8 THEN 1 END) AS total_agosto'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 9 THEN 1 END) AS total_setembro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 10 THEN 1 END) AS total_outubro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 11 THEN 1 END) AS total_novembro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 12 THEN 1 END) AS total_dezembro'),
)
->where('viagem.data', '>=', request()->data_inicial)
->where('viagem.data', '<=', request()->data_final)
->when(request()->veiculo, function ($query) {
$query->where('viagem.veiculo_id', request()->veiculo);
})
->where('viagem.status_id', '!=', EnumViagemStatus::CANCELADO)
->when(request()->status, function ($query) {
$query->where('viagem.status_id', request()->status);
})
->groupByRaw('viagem.veiculo_id, destino.municipio_id')
->orderBy('veiculo')
->get(),
'veiculos' => DB::table('transporte_paciente_viagem as viagem')
->join('transporte_paciente_veiculo as veiculo', 'veiculo.id', 'viagem.veiculo_id')
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
->select(
'viagem.veiculo_id',
DB::raw("CONCAT(veiculo.descricao_modelo, ' - ',veiculo.numero_placa) as veiculo"),
DB::raw("COUNT(*) as total"),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 1 THEN 1 END) AS total_janeiro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 2 THEN 1 END) AS total_fevereiro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 3 THEN 1 END) AS total_marco'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 4 THEN 1 END) AS total_abril'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 5 THEN 1 END) AS total_maio'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 6 THEN 1 END) AS total_junho'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 7 THEN 1 END) AS total_julho'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 8 THEN 1 END) AS total_agosto'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 9 THEN 1 END) AS total_setembro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 10 THEN 1 END) AS total_outubro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 11 THEN 1 END) AS total_novembro'),
DB::raw('COUNT(CASE WHEN MONTH(viagem.data) = 12 THEN 1 END) AS total_dezembro'),
)
->where('viagem.data', '>=', request()->data_inicial)
->where('viagem.data', '<=', request()->data_final)
->where('viagem.status_id', '!=', EnumViagemStatus::CANCELADO)
->when(request()->status, function ($query) {
$query->where('viagem.status_id', request()->status);
})
->when(request()->veiculo, function ($query) {
$query->where('viagem.veiculo_id', request()->veiculo);
})
->groupBy('viagem.veiculo_id')
->get(),
'totais' => DB::table('transporte_paciente_viagem as viagem')
->join('transporte_paciente_agendar_transporte as agendar', 'agendar.viagem_id', 'viagem.id')
->select(
DB::raw("MONTH(viagem.data) as mes"),
DB::raw("COUNT(viagem.id) as total"),
)
->where('viagem.data', '>=', request()->data_inicial)
->where('viagem.data', '<=', request()->data_final)
->where('viagem.status_id', '!=', EnumViagemStatus::CANCELADO)
->when(request()->veiculo, function($query) {
$query->where('viagem.veiculo_id', request()->veiculo);
})
->when(request()->status, function ($query) {
$query->where('viagem.status_id', request()->status);
})
->groupByRaw('mes')
->get()
];
}
public static function getPrintExportData()
{
$data = self::list();
$items = $data['resultado']->map(fn($item) => [
'veiculo' => $item->veiculo,
'municipio' => $item->municipio,
'total' => $item->total,
'jan' =>$item->total_janeiro ?? 0,
'fev' =>$item->total_fevereiro ?? 0,
'mar' =>$item->total_marco ?? 0,
'abr' =>$item->total_abril ?? 0,
'mai' =>$item->total_maio ?? 0,
'jun' =>$item->total_junho ?? 0,
'jul' =>$item->total_julho ?? 0,
'ago' =>$item->total_agosto ?? 0,
'set' => $item->total_setembro ?? 0,
'out' => $item->total_outubro ?? 0,
'nov' => $item->total_novembro ?? 0,
'dez' => $item->total_dezembro ?? 0,
]);
$veiculos = $data['veiculos']->map(fn($item) => [
'veiculo' => $item->veiculo,
'municipio' => 'TODOS',
'total' => $item->total,
'jan' =>$item->total_janeiro ?? 0,
'fev' =>$item->total_fevereiro ?? 0,
'mar' =>$item->total_marco ?? 0,
'abr' =>$item->total_abril ?? 0,
'mai' =>$item->total_maio ?? 0,
'jun' =>$item->total_junho ?? 0,
'jul' =>$item->total_julho ?? 0,
'ago' =>$item->total_agosto ?? 0,
'set' => $item->total_setembro ?? 0,
'out' => $item->total_outubro ?? 0,
'nov' => $item->total_novembro ?? 0,
'dez' => $item->total_dezembro ?? 0,
]);
$totais = [
'jan' => $data['totais']->contains('mes', 1) ? $data['totais']->first(function($item) {
return $item->mes == 1;
})->total : null,
'fev' => $data['totais']->contains('mes', 2) ? $data['totais']->first(function($item) {
return $item->mes == 2;
})->total : null,
'mar' => $data['totais']->contains('mes', 3) ? $data['totais']->first(function($item) {
return $item->mes == 3;
})->total : null,
'abr' => $data['totais']->contains('mes', 4) ? $data['totais']->first(function($item) {
return $item->mes == 4;
})->total : null,
'mai' => $data['totais']->contains('mes', 5) ? $data['totais']->first(function($item) {
return $item->mes == 5;
})->total : null,
'jun' => $data['totais']->contains('mes', 6) ? $data['totais']->first(function($item) {
return $item->mes == 6;
})->total : null,
'jul' => $data['totais']->contains('mes', 7) ? $data['totais']->first(function($item) {
return $item->mes == 7;
})->total : null,
'ago' => $data['totais']->contains('mes', 8) ? $data['totais']->first(function($item) {
return $item->mes == 8;
})->total : null,
'set' => $data['totais']->contains('mes', 9) ? $data['totais']->first(function($item) {
return $item->mes == 9;
})->total : null,
'out' => $data['totais']->contains('mes', 10) ? $data['totais']->first(function($item) {
return $item->mes == 10;
})->total : null,
'nov' => $data['totais']->contains('mes', 11) ? $data['totais']->first(function($item) {
return $item->mes == 11;
})->total : null,
'dez' => $data['totais']->contains('mes', 12) ? $data['totais']->first(function($item) {
return $item->mes == 12;
})->total : null,
'total' => $data['totais']->sum('total')
];
return [
'data_inicial' => Carbon::parse(request()->data_inicial)->format('d/m/Y'),
'data_final' => Carbon::parse(request()->data_final)->format('d/m/Y'),
'filtro_veiculo' => request()->filtro_veiculo ? request()->filtro_veiculo : 'Todos',
'filtro_status' => request()->filtro_status ? request()->filtro_status : 'Todos',
'items' => $items,
'veiculos' => $veiculos,
'totais' => $totais,
'colunas' => collect(request()->selectedCols),
'colunasTotal' => collect(request()->selectedCols)->splice(2)
];
}
}