Files
rkm-conectasus-ci-sandbox/api/app/Services/Cadastro/Parametrizacao/ParametrizacaoService.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

248 lines
10 KiB
PHP

<?php
namespace App\Services\Cadastro\Parametrizacao;
use App\Models\Cadastro\Parametrizacao\Parametrizacao;
use App\Models\Cadastro\Parametrizacao\ParametrizacaoPacienteAba;
use App\Models\Cadastro\Parametrizacao\ParametrizacaoPermissaoOcupacao;
use App\Models\Cadastro\Parametrizacao\ParametrizacaoPermissaoUsuario;
use App\Models\Cadastro\ParametrizacaoMaterial;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
class ParametrizacaoService extends Service
{
public static function create()
{
return [
'form' => self::getDadosForm(),
'model' => self::getDadosModel(),
];
}
private static function getDadosForm()
{
return [
'unidades' => self::getUnidades(),
'infraestruturas' => [],
'usuarios' => [],
'paciente_abas' => ParametrizacaoPacienteAba::orderBy('nome')->get(['id', 'nome']),
];
}
private static function getUnidades()
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->orderBy('nome_fantasia')
->get();
}
public static function getInfraestruturas()
{
return DB::table('cadastro_infraestrutura')
->select([
'cadastro_infraestrutura.id',
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS nome"),
])
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('cadastro_infraestrutura.unidade_id', request()->unidade_id)
->whereNull('cadastro_infraestrutura.deleted_at')
->orderByRaw('CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END')
->get();
}
public static function getUsuarios()
{
return DB::table('cadastro_usuario')
->select([
'cadastro_usuario.id',
'cadastro_cidadao.nome',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_lotacao')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
->when(request()->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
)
->orderBy('cadastro_cidadao.nome')
->get();
}
private static function getDadosModel()
{
$parametrizacao = Parametrizacao::first();
$ocupacoes = ParametrizacaoPermissaoOcupacao::get();
$usuarios = self::getParametrizacaoPermissaoUsuario();
$parametrizacaoMaterial = self::getParametrizacaoMaterial();
return [
'ocupacao' => null,
'unidade_id' => null,
'infraestrutura_id' => null,
'usuario_id' => null,
'paciente_abas' => [],
'ocupacoes' => $ocupacoes->map(fn ($ocupacao) => [
'id' => $ocupacao->ocupacao_id,
'codigo' => $ocupacao->ocupacao->codigo,
'nome' => $ocupacao->ocupacao->nome,
]),
'usuarios' => $usuarios->map(function ($usuario) {
return [
'usuario_id' => $usuario->usuario_id,
'usuario_nome' => $usuario->usuario_nome,
'unidade_id' => $usuario->unidade_id,
'unidade_nome_fantasia' => $usuario->unidade_nome_fantasia,
'infraestrutura_id' => $usuario->infraestrutura_id,
'infraestrutura_nome' => $usuario->infraestrutura_nome,
'municipe' => $usuario->municipe,
'provisorio' => $usuario->provisorio,
'outro_municipio' => $usuario->outro_municipio,
'desbloquear_usuario' => $usuario->desbloquear_usuario,
'paciente_abas' => $usuario->paciente_abas ?? [],
];
}),
'municipe' => false,
'provisorio' => false,
'outro_municipio' => false,
'desbloquear_usuario' => false,
'cadastro_paciente_desatualizado_quantidade_dias' => $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? null,
'exibe_alerta_paciente_cns_temporario_invalido' => $parametrizacao->exibe_alerta_paciente_cns_temporario_invalido ?? false,
'cadastro_paciente_provisorio_bloqueado' => $parametrizacao->cadastro_paciente_provisorio_bloqueado ?? false,
'cadastro_paciente_provisorio_quantidade_dias' => $parametrizacao->cadastro_paciente_provisorio_quantidade_dias ?? null,
'material' => [
'gera_codigo_automatico' => $parametrizacaoMaterial->gera_codigo_automatico ?? false,
],
'validacoes' =>[
'exige_cpf_paciente' => isset($parametrizacao) ? ($parametrizacao->exige_cpf_paciente ?? false) : true,
'exige_cns_paciente' => isset($parametrizacao) ? ($parametrizacao->exige_cns_paciente ?? false) : true,
]
];
}
public static function getParametrizacaoPermissaoUsuario()
{
$permissoes = DB::table('cadastro_parametrizacao_permissao_usuario as permissao')
->select([
'permissao.id',
'permissao.usuario_id',
'cidadao.nome as usuario_nome',
'unidade.id as unidade_id',
'unidade.nome_fantasia as unidade_nome_fantasia',
'infraestrutura.id as infraestrutura_id',
'infraestrutura.nome as infraestrutura_nome',
'permissao.municipe',
'permissao.provisorio',
'permissao.outro_municipio',
'permissao.desbloquear_usuario',
])
->join('cadastro_usuario as usuario', 'usuario.id', 'permissao.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->join('cadastro_infraestrutura as infraestrutura', function ($join) {
$join->on('infraestrutura.id', 'permissao.infraestrutura_id')
->whereNull('infraestrutura.deleted_at');
})
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->get();
$abas = DB::table('cadastro_parametrizacao_permissao_usuario_paciente_aba as p_aba')
->join('cadastro_parametrizacao_paciente_aba as aba', 'aba.id', 'p_aba.paciente_aba_id')
->whereIn('p_aba.parametrizacao_id', $permissoes->pluck('id'))
->select(
'p_aba.parametrizacao_id',
'aba.id',
'aba.nome'
)
->orderBy('aba.nome')
->get()
->groupBy('parametrizacao_id');
return $permissoes->map(function ($p) use ($abas) {
$p->paciente_abas = optional($abas->get($p->id))->values() ?? collect();
return $p;
});
}
public static function store()
{
DB::transaction(function () {
$parametrizacao = Parametrizacao::firstOrNew();
$parametros = [
'cadastro_paciente_desatualizado_quantidade_dias' => request()->cadastro_paciente_desatualizado_quantidade_dias,
'exibe_alerta_paciente_cns_temporario_invalido' => request()->exibe_alerta_paciente_cns_temporario_invalido,
'cadastro_paciente_provisorio_bloqueado' => request()->cadastro_paciente_provisorio_bloqueado,
'cadastro_paciente_provisorio_quantidade_dias' => request()->cadastro_paciente_provisorio_quantidade_dias,
'exige_cpf_paciente' => request()->validacoes['exige_cpf_paciente'],
'exige_cns_paciente' => request()->validacoes['exige_cns_paciente'],
];
$parametrizacao->fill($parametros);
$parametrizacao->save();
$ocupacoes = collect(request()->ocupacoes);
ParametrizacaoPermissaoOcupacao::whereNotIn(
'ocupacao_id',
$ocupacoes->pluck('id')
)->delete();
$ocupacoes->each(function ($data) {
ParametrizacaoPermissaoOcupacao::updateOrCreate(
['ocupacao_id' => $data['id']]
);
});
$usuarios = collect(request()->usuarios);
ParametrizacaoPermissaoUsuario::query()->delete();
$usuarios->each(function ($data) {
$parametrizacaoUsuario = ParametrizacaoPermissaoUsuario::create([
'usuario_id' => $data['usuario_id'],
'infraestrutura_id' => $data['infraestrutura_id'],
'municipe' => (bool) $data['municipe'],
'provisorio' => (bool) $data['provisorio'],
'outro_municipio' => (bool) $data['outro_municipio'],
'desbloquear_usuario' => (bool) $data['desbloquear_usuario'],
]);
$parametrizacaoUsuario->pacienteAbas()->sync($data['paciente_abas']);
});
$parametrizacaoMaterial = self::getParametrizacaoMaterial();
if (is_null($parametrizacaoMaterial)) {
ParametrizacaoMaterial::create([
'gera_codigo_automatico' => request()->material['gera_codigo_automatico']
]);
} else {
$parametrizacaoMaterial->update([
'gera_codigo_automatico' => request()->material['gera_codigo_automatico']
]);
}
});
return [];
}
public static function getParametrizacaoMaterial()
{
return ParametrizacaoMaterial::first();
}
}