This commit is contained in:
@@ -0,0 +1,303 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Farmacia;
|
||||
|
||||
use App\Enums\Farmacia\AltoCusto\ProcessoItemMesStatus;
|
||||
use App\Models\Cadastro\Estabelecimento\CentroCusto;
|
||||
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
|
||||
use App\Models\Cadastro\Estabelecimento\Unidade;
|
||||
use App\Models\Sigtap\Cid;
|
||||
use App\Services\Service;
|
||||
use App\Utils\MaskUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class RelatorioAltoCustoEstatisticoCidService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$periodo = [
|
||||
'start' => Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->setTime(0, 0, 0),
|
||||
'end' => Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->setTime(23, 59, 59)
|
||||
];
|
||||
|
||||
$totalizadores = (object) ['quantidade_processos' => 0];
|
||||
|
||||
$meses = DB::table('farmacia_alto_custo_processo as processo')
|
||||
->join(
|
||||
'cadastro_centro_custo as centro_custo',
|
||||
'centro_custo.id',
|
||||
'processo.created_centro_custo_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_infraestrutura as infraestrutura',
|
||||
'infraestrutura.id',
|
||||
'centro_custo.infraestrutura_id'
|
||||
)
|
||||
->join(
|
||||
'sigtap.cid as cid',
|
||||
'cid.id',
|
||||
'processo.cid_id'
|
||||
)
|
||||
->whereBetween('processo.solicitado_em', $periodo)
|
||||
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
|
||||
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id))
|
||||
->when(request()->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id))
|
||||
->select(DB::raw("
|
||||
DATE_FORMAT(processo.solicitado_em, '%m/%Y') as mes_ano,
|
||||
cid.codigo as cid_codigo,
|
||||
cid.nome as cid_nome,
|
||||
COUNT(processo.id) as quantidade_processos
|
||||
"))
|
||||
->groupBy(DB::raw("
|
||||
DATE_FORMAT(processo.solicitado_em, '%m/%Y'),
|
||||
cid.codigo,
|
||||
cid.nome
|
||||
"))
|
||||
->get();
|
||||
|
||||
$meses->each(function ($mes) use ($totalizadores) {
|
||||
|
||||
$mes->cid = MaskUtil::getCidMasked($mes->cid_codigo) . " - {$mes->cid_nome}";
|
||||
|
||||
unset($mes->cid_codigo, $mes->cid_nome);
|
||||
|
||||
$totalizadores->quantidade_processos += $mes->quantidade_processos;
|
||||
});
|
||||
|
||||
return compact('meses', 'totalizadores');
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
$data = (object) [
|
||||
'additionals' => [],
|
||||
'form' => [],
|
||||
'model' => [],
|
||||
];
|
||||
|
||||
$params = self::getParams();
|
||||
|
||||
$sets = [
|
||||
'periodo' => function () use ($data) {
|
||||
|
||||
$data->model['periodo'] = ['start' => null, 'end' => null];
|
||||
},
|
||||
'unidade' => function () use ($data, $params) {
|
||||
|
||||
$unidadesData = self::getUnidadesData($params);
|
||||
|
||||
$data->form['unidades'] = $unidadesData['form'];
|
||||
$data->model['unidade_id'] = $params->unidade_id = $unidadesData['model'];
|
||||
},
|
||||
'infraestrutura' => function () use ($data, $params) {
|
||||
|
||||
$infraestruturasData = self::getInfraestruturasData($params);
|
||||
|
||||
$data->form['infraestruturas'] = $infraestruturasData['form'];
|
||||
$data->model['infraestrutura_id'] = $params->infraestrutura_id = $infraestruturasData['model'];
|
||||
},
|
||||
'centro_custo' => function () use ($data, $params) {
|
||||
|
||||
$centrosCustoData = self::getCentrosDeCustoData($params);
|
||||
|
||||
$data->form['centros_custo'] = $centrosCustoData['form'];
|
||||
$data->model['centro_custo_id'] = $params->centro_custo_id = $centrosCustoData['model'];
|
||||
},
|
||||
'cid' => function () use ($data) {
|
||||
|
||||
$data->model['cid'] = null;
|
||||
}
|
||||
];
|
||||
|
||||
$load = is_null(request()->load_from);
|
||||
|
||||
if ($load) {
|
||||
|
||||
$data->additionals = [
|
||||
'data_atual' => Carbon::now()->format('d/m/Y'),
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($sets as $field => $set) {
|
||||
|
||||
if ($load) {
|
||||
|
||||
$set();
|
||||
}
|
||||
else if ($field === request()->load_from) {
|
||||
|
||||
$load = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($data as $property => $itens) {
|
||||
|
||||
if (empty($itens)) {
|
||||
|
||||
unset($data->{$property});
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
private static function getParams()
|
||||
{
|
||||
$params = (object) request()->only([
|
||||
'periodo',
|
||||
'unidade_id',
|
||||
'infraestrutura_id',
|
||||
'centro_custo_id',
|
||||
'cid_id',
|
||||
]);
|
||||
|
||||
if (isset($params->periodo)
|
||||
&& !is_null($params->periodo['start'])
|
||||
&& !is_null($params->periodo['end'])
|
||||
) {
|
||||
|
||||
$start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->setTime(0, 0, 0);
|
||||
$end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->setTime(23, 59, 59);
|
||||
|
||||
$params->periodo['start'] = $start;
|
||||
$params->periodo['end'] = $end;
|
||||
}
|
||||
else {
|
||||
|
||||
$params->periodo = null;
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
private static function getUnidadesData($params)
|
||||
{
|
||||
$unidades = collect();
|
||||
$id = null;
|
||||
|
||||
if (!is_null($params->periodo)) {
|
||||
|
||||
$unidades = Unidade::setEagerLoads([])
|
||||
->whereHas('infraestruturas', fn ($q) => $q
|
||||
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
||||
)
|
||||
->orderBy('nome_fantasia')
|
||||
->get(['id', 'nome_fantasia']);
|
||||
}
|
||||
|
||||
return ['form' => $unidades, 'model' => $id];
|
||||
}
|
||||
|
||||
private static function getInfraestruturasData($params)
|
||||
{
|
||||
$infraestruturas = collect();
|
||||
$id = null;
|
||||
|
||||
if (!is_null($params->periodo) && !is_null($params->unidade_id)) {
|
||||
|
||||
$infraestruturas = Infraestrutura::setEagerLoads([])
|
||||
->where('unidade_id', $params->unidade_id)
|
||||
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
||||
->get(['id', 'nome', 'principal', 'unidade_id'])
|
||||
->map(fn ($i) => [
|
||||
'id' => $i->id,
|
||||
'nome' => $i->nome
|
||||
])
|
||||
->sortBy('nome')
|
||||
->values();
|
||||
}
|
||||
|
||||
return ['form' => $infraestruturas, 'model' => $id];
|
||||
}
|
||||
|
||||
private static function getCentrosDeCustoData($params)
|
||||
{
|
||||
$centrosCusto = collect();
|
||||
$id = null;
|
||||
|
||||
if (!is_null($params->periodo) && !is_null($params->infraestrutura_id)) {
|
||||
|
||||
$centrosCusto = CentroCusto::setEagerLoads([])
|
||||
->where('infraestrutura_id', $params->infraestrutura_id)
|
||||
->where(fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
||||
->get(['id', 'setor_id'])
|
||||
->map(fn ($cc) => [
|
||||
'id' => $cc->id,
|
||||
'setor_nome' => $cc->setor()->setEagerLoads([])->first(['nome'])->nome
|
||||
])
|
||||
->sortBy('setor_nome')
|
||||
->values();
|
||||
}
|
||||
|
||||
return ['form' => $centrosCusto, 'model' => $id];
|
||||
}
|
||||
|
||||
private static function setWhereForFilterCentroCusto($query, $params)
|
||||
{
|
||||
return $query->whereHas('farmaciaAltoCustoProcessos', fn ($q) => $q
|
||||
->whereBetween('solicitado_em', $params->periodo)
|
||||
->whereNotNull('cid_id')
|
||||
);
|
||||
}
|
||||
|
||||
public static function autocompleteCid()
|
||||
{
|
||||
return DB::table('sigtap.cid as cid')
|
||||
->whereExists(function ($query) {
|
||||
|
||||
$params = self::getParams();
|
||||
|
||||
$query->select(DB::raw(1))
|
||||
->from('farmacia_alto_custo_processo as processo')
|
||||
->join(
|
||||
'cadastro_centro_custo as centro_custo',
|
||||
'centro_custo.id',
|
||||
'processo.created_centro_custo_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_infraestrutura as infraestrutura',
|
||||
'infraestrutura.id',
|
||||
'centro_custo.infraestrutura_id'
|
||||
)
|
||||
->whereColumn('processo.cid_id', 'cid.id')
|
||||
->whereBetween('processo.solicitado_em', $params->periodo)
|
||||
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
|
||||
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id))
|
||||
->when($params->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id));
|
||||
})
|
||||
->select(DB::raw("
|
||||
cid.id,
|
||||
cid.codigo,
|
||||
cid.nome
|
||||
"));
|
||||
}
|
||||
|
||||
public static function getPrintExportData()
|
||||
{
|
||||
$resultado = self::index();
|
||||
$itens = $resultado['meses'];
|
||||
|
||||
$unidade = Unidade::find(request()->unidade_id);
|
||||
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
|
||||
$centroCusto = CentroCusto::find(request()->centro_custo_id);
|
||||
$cid = Cid::find(request()->cid_id);
|
||||
|
||||
if (!is_null($cid)) {
|
||||
|
||||
$cid = MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}";
|
||||
}
|
||||
|
||||
return [
|
||||
'inicio' => request()->periodo['start'],
|
||||
'fim' => request()->periodo['end'],
|
||||
'unidade' => $unidade->nome_fantasia ?? 'Todas',
|
||||
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
|
||||
'setor' => $centroCusto->setor->nome ?? 'Todos',
|
||||
'cid' => $cid ?? 'Todos',
|
||||
'colunas' => collect(request()->selectedColumns),
|
||||
'itens' => $itens,
|
||||
'totalizadores' => $resultado['totalizadores']
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user