This commit is contained in:
@@ -0,0 +1,307 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Imunizacao;
|
||||
|
||||
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
|
||||
use App\Models\Cadastro\Estabelecimento\Unidade;
|
||||
use App\Models\Cadastro\Vacina;
|
||||
use App\Services\Cadastro\VacinaService;
|
||||
use App\Services\Service;
|
||||
use App\Utils\DataUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class RelatorioFaltosoAprazamentoService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$params = self::getParams();
|
||||
|
||||
$aprazamentosBuilder = DB::table('imunizacao_registro_aprazamento AS aprazamento')
|
||||
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
|
||||
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
|
||||
->join('cadastro_paciente AS paciente', 'paciente.id', 'aprazamento.paciente_id')
|
||||
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
||||
->join('cadastro_vacina AS vacina', 'vacina.id', 'aprazamento.vacina_id')
|
||||
->whereNull('aprazamento.registro_aplicacao_id')
|
||||
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
|
||||
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
|
||||
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
|
||||
->when(isset($params->idade['de']), fn ($q) => $q
|
||||
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= {$params->idade['de']}")
|
||||
)
|
||||
->when(isset($params->idade['ate']), fn ($q) => $q
|
||||
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= {$params->idade['ate']}")
|
||||
)
|
||||
->when($params->vacina_id, fn ($q, $id) => $q->where('aprazamento.vacina_id', $id))
|
||||
->select(
|
||||
'unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS infraestrutura_nome"),
|
||||
'cidadao.nome AS paciente_nome',
|
||||
'cidadao.data_nascimento AS paciente_data_nascimento',
|
||||
DB::raw("LPAD(paciente.prontuario, 7, '0') AS paciente_prontuario"),
|
||||
DB::raw(VacinaService::getDescricaoRaw() . ' AS vacina_descricao'),
|
||||
'aprazamento.data_aprazamento'
|
||||
);
|
||||
|
||||
self::setOrderBy($aprazamentosBuilder);
|
||||
|
||||
$aprazamentos = $aprazamentosBuilder->get();
|
||||
|
||||
return compact('aprazamentos');
|
||||
}
|
||||
|
||||
private static function setOrderBy($builder)
|
||||
{
|
||||
if (is_null(request()->sortBy)) {
|
||||
|
||||
$builder->orderBy('aprazamento.id');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$columns = [
|
||||
'unidade_nome_fantasia' => 'unidade.nome_fantasia',
|
||||
'infraestrutura_nome' => "COALESCE(infraestrutura.nome, unidade.nome_fantasia)",
|
||||
'paciente_nome' => 'cidadao.nome',
|
||||
'paciente_data_nascimento' => 'cidadao.data_nascimento',
|
||||
'paciente_prontuario' => "LPAD(paciente.prontuario, 7, '0')",
|
||||
'vacina_descricao' => DB::raw(VacinaService::getDescricaoRaw()),
|
||||
'data_aprazamento' => 'aprazamento.data_aprazamento',
|
||||
];
|
||||
|
||||
$column = $columns[request()->sortBy];
|
||||
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
|
||||
|
||||
$builder->orderByRaw("{$column} {$direction}, aprazamento.id");
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
$data = (object) [
|
||||
'form' => [],
|
||||
'model' => [],
|
||||
];
|
||||
|
||||
$params = self::getParams();
|
||||
|
||||
$sets = [
|
||||
'periodo' => function () use ($data, $params) {
|
||||
|
||||
$data->model['periodo'] = ['start' => null, 'end' => null];
|
||||
|
||||
$params->periodo = $data->model['periodo'];
|
||||
},
|
||||
'unidade' => function () use ($data, $params) {
|
||||
|
||||
$unidadesData = self::getUnidadesData($params);
|
||||
|
||||
$data->form['unidades'] = $unidadesData['form'];
|
||||
$data->model['unidade_id'] = $unidadesData['model'];
|
||||
|
||||
$params->unidade_id = $data->model['unidade_id'];
|
||||
},
|
||||
'infraestrutura' => function () use ($data, $params) {
|
||||
|
||||
$infraestruturasData = self::getInfraestruturasData($params);
|
||||
|
||||
$data->form['infraestruturas'] = $infraestruturasData['form'];
|
||||
$data->model['infraestrutura_id'] = $infraestruturasData['model'];
|
||||
|
||||
$params->infraestrutura_id = $data->model['infraestrutura_id'];
|
||||
},
|
||||
'idade' => function () use ($data, $params) {
|
||||
|
||||
$data->model['idade'] = ['de' => null, 'ate' => null];
|
||||
|
||||
$params->idade = $data->model['idade'];
|
||||
},
|
||||
'vacina' => function () use ($data) {
|
||||
|
||||
$data->model['vacina'] = null;
|
||||
}
|
||||
];
|
||||
|
||||
$firstLoad = $load = is_null(request()->load_from);
|
||||
|
||||
foreach ($sets as $field => $set) {
|
||||
|
||||
if ($load) {
|
||||
|
||||
if (!$firstLoad && collect(['idade'])->contains($field)) {
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$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',
|
||||
'idade',
|
||||
'vacina_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 = DB::table('cadastro_unidade AS unidade')
|
||||
->whereNull('unidade.deleted_at')
|
||||
->whereExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('cadastro_infraestrutura AS infraestrutura')
|
||||
->whereColumn('infraestrutura.unidade_id', 'unidade.id')
|
||||
->whereNull('infraestrutura.deleted_at')
|
||||
->whereExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('imunizacao_registro_aprazamento AS aprazamento')
|
||||
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
|
||||
->whereColumn('centro_custo.infraestrutura_id', 'infraestrutura.id')
|
||||
->whereNull('aprazamento.registro_aplicacao_id')
|
||||
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
|
||||
)
|
||||
)
|
||||
->select('unidade.id', 'unidade.nome_fantasia')
|
||||
->orderBy('unidade.nome_fantasia')
|
||||
->get();
|
||||
}
|
||||
|
||||
return ['form' => $unidades, 'model' => $id];
|
||||
}
|
||||
|
||||
private static function getInfraestruturasData($params)
|
||||
{
|
||||
$infraestruturas = collect();
|
||||
$id = null;
|
||||
|
||||
if (!is_null($params->unidade_id)) {
|
||||
|
||||
$infraestruturas = DB::table('cadastro_infraestrutura AS infraestrutura')
|
||||
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
|
||||
->whereNull('infraestrutura.deleted_at')
|
||||
->where('infraestrutura.unidade_id', $params->unidade_id)
|
||||
->whereExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('imunizacao_registro_aprazamento AS aprazamento')
|
||||
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
|
||||
->whereColumn('centro_custo.infraestrutura_id', 'infraestrutura.id')
|
||||
->whereNull('aprazamento.registro_aplicacao_id')
|
||||
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
|
||||
)
|
||||
->select(
|
||||
'infraestrutura.id',
|
||||
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS nome")
|
||||
)
|
||||
->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)")
|
||||
->get();
|
||||
}
|
||||
|
||||
return ['form' => $infraestruturas, 'model' => $id];
|
||||
}
|
||||
|
||||
public static function autocompleteVacina()
|
||||
{
|
||||
$params = self::getParams();
|
||||
|
||||
return DB::table('cadastro_vacina AS vacina')
|
||||
->whereExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('imunizacao_registro_aprazamento AS aprazamento')
|
||||
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
|
||||
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
|
||||
->join('cadastro_paciente AS paciente', 'paciente.id', 'aprazamento.paciente_id')
|
||||
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
|
||||
->whereColumn('aprazamento.vacina_id', 'vacina.id')
|
||||
->whereNull('aprazamento.registro_aplicacao_id')
|
||||
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
|
||||
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
|
||||
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
|
||||
->when(isset($params->idade['de']), fn ($q) => $q
|
||||
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= {$params->idade['de']}")
|
||||
)
|
||||
->when(isset($params->idade['ate']), fn ($q) => $q
|
||||
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= {$params->idade['ate']}")
|
||||
)
|
||||
)
|
||||
->select(
|
||||
'vacina.id',
|
||||
DB::raw(VacinaService::getDescricaoRaw() . ' AS descricao')
|
||||
);
|
||||
}
|
||||
|
||||
public static function getPrintExportData()
|
||||
{
|
||||
$resultado = self::index();
|
||||
$itens = $resultado['aprazamentos'];
|
||||
|
||||
$itens->each(function ($item) {
|
||||
|
||||
if ($item->paciente_data_nascimento) {
|
||||
|
||||
$item->paciente_data_nascimento = (new Carbon($item->paciente_data_nascimento))->format('d/m/Y');
|
||||
}
|
||||
|
||||
$item->data_aprazamento = (new Carbon($item->data_aprazamento))->format('d/m/Y');
|
||||
});
|
||||
|
||||
$unidade = request()->unidade_id ? Unidade::find(request()->unidade_id) : null;
|
||||
$infraestrutura = request()->infraestrutura_id ? Infraestrutura::find(request()->infraestrutura_id) : null;
|
||||
$vacina = request()->vacina_id ? Vacina::find(request()->vacina_id) : null;
|
||||
|
||||
return [
|
||||
'inicio' => request()->periodo['start'],
|
||||
'fim' => request()->periodo['end'],
|
||||
'unidade' => $unidade->nome_fantasia ?? 'Todas',
|
||||
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
|
||||
'idadeDe' => request()->idade['de'],
|
||||
'idadeAte' => request()->idade['ate'],
|
||||
'vacina' => $vacina ? VacinaService::getDescricao($vacina) : 'Todas',
|
||||
'colunas' => collect(request()->selectedCols),
|
||||
'itens' => $itens,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user