This commit is contained in:
@@ -0,0 +1,231 @@
|
||||
<?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)
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user