248 lines
10 KiB
PHP
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();
|
|
}
|
|
}
|