$model, 'form' => $form, ]; } private static function getFormData() { return [ 'area' => [ 'tipos_area' => AreaTipo::all()->map(fn ($area) => [ 'id' => $area->id, 'descricao' => $area->sigla ? $area->sigla .' - '. $area->descricao : '', ])->toArray(), ], 'unidades' => self::obterUnidades()->toArray(), 'faturamento' => [ 'atendimento_domiciliar' => [ 'registro_tipo' => RegistroTipo::all()->toArray(), ], ], 'outros' => [ 'permissao' => [ 'ocupacoes' => Ocupacao::all(), ] ], ]; } private static function obterAreas() { return Area::with('microareas') ->get() ->map(function($area) { $tipo = AreaTipo::find($area->tipo_id); if ($tipo) { $area->tipo_descricao = $tipo->sigla ? $tipo->sigla . ' - ' . $tipo->descricao : '-'; } else { $area->tipo_descricao = ''; } return $area; }); } private static function obterUnidades() { return Unidade::orderBy('nome_fantasia') ->get() ->map(fn ($query) => [ 'id' => $query->id, 'descricao' => $query->nome_fantasia, 'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [ 'id' => $infraestrutura->id, 'nome' => $infraestrutura->nome, 'principal' => $infraestrutura->principal, ])->values() ]); } private static function obterEquipes() { $equipes = DB::table("atencao_basica_parametrizacao_equipe as parametrizacao_equipe") ->select( 'parametrizacao_equipe.id as equipe_id', 'parametrizacao_equipe.microarea_id', 'parametrizacao_area.id as area_id', 'parametrizacao_area.descricao as area_descricao', 'parametrizacao_area.numero_ine', 'parametrizacao_microarea.descricao as microarea_descricao', 'parametrizacao_area_tipo.sigla as area_tipo_sigla', 'parametrizacao_area_tipo.descricao as area_tipo_descricao', 'parametrizacao_unidade.id as unidade_id', 'parametrizacao_unidade.nome_fantasia as unidade_descricao', 'parametrizacao_infraestrutura.id as infraestrutura_id', DB::raw('COALESCE(parametrizacao_infraestrutura.nome, parametrizacao_infraestrutura_unidade.nome_fantasia) as infraestrutura_descricao'), 'parametrizacao_usuario.id as usuario_id', 'parametrizacao_cidadao.nome as usuario_nome', 'parametrizacao_equipe_usuario.ativo as usuario_ativo', 'sigtap_ocupacao.codigo as lotacao_codigo', 'sigtap_ocupacao.nome as lotacao_nome', ) ->join('atencao_basica_parametrizacao_area as parametrizacao_area', 'parametrizacao_area.id', 'parametrizacao_equipe.area_id') ->leftJoin('atencao_basica_parametrizacao_equipe_usuario as parametrizacao_equipe_usuario', 'parametrizacao_equipe_usuario.equipe_id', 'parametrizacao_equipe.id') ->leftJoin('cadastro_usuario as parametrizacao_usuario', 'parametrizacao_usuario.id', 'parametrizacao_equipe_usuario.usuario_id') ->leftJoin('cadastro_lotacao as parametrizacao_lotacao', 'parametrizacao_lotacao.usuario_id', 'parametrizacao_usuario.id') ->leftJoin('sigtap.ocupacao as sigtap_ocupacao', 'sigtap_ocupacao.id', 'parametrizacao_lotacao.ocupacao_id') ->leftJoin('cadastro_cidadao as parametrizacao_cidadao', 'parametrizacao_cidadao.id', 'parametrizacao_usuario.cidadao_id') ->leftJoin('cadastro_unidade as parametrizacao_unidade', 'parametrizacao_unidade.id', 'parametrizacao_equipe.unidade_id') ->leftJoin('atencao_basica_parametrizacao_microarea as parametrizacao_microarea', 'parametrizacao_microarea.id', 'parametrizacao_equipe.microarea_id') ->leftJoin('atencao_basica_parametrizacao_area_tipo as parametrizacao_area_tipo', 'parametrizacao_area_tipo.id', 'parametrizacao_area.tipo_id') ->leftJoin('cadastro_infraestrutura as parametrizacao_infraestrutura', 'parametrizacao_infraestrutura.id', 'parametrizacao_equipe.infraestrutura_id') ->leftJoin('cadastro_unidade as parametrizacao_infraestrutura_unidade', 'parametrizacao_infraestrutura_unidade.id', 'parametrizacao_infraestrutura.unidade_id') ->get() ->groupBy('equipe_id') ->map(function ($grupo) { $primeiro = collect($grupo)->first(); return [ 'id' => $primeiro->equipe_id, 'area_id' => $primeiro->area_id, 'area_descricao' => $primeiro->area_descricao, 'numero_ine' => $primeiro->numero_ine, 'microarea_id' => $primeiro->microarea_id, 'microarea_descricao' => $primeiro->microarea_descricao ?? 'Não informada', 'area_tipo' => $primeiro->area_tipo_sigla && $primeiro->area_tipo_descricao ? $primeiro->area_tipo_sigla . ' - ' . $primeiro->area_tipo_descricao : '', 'unidade_id' => $primeiro->unidade_id, 'unidade_descricao' => $primeiro->unidade_descricao, 'infraestrutura_id' => $primeiro->infraestrutura_id ?? null, 'infraestrutura_descricao' => $primeiro->infraestrutura_descricao ?? null, 'usuarios' => $grupo ->filter(fn($item) => !is_null($item->usuario_id)) ->groupBy('usuario_id') ->map(function ($usuarios) { $usuario = $usuarios->first(); $lotacoes = $usuarios->map(function ($item) { return "{$item->lotacao_codigo} - {$item->lotacao_nome}"; })->unique()->implode('
'); return [ 'id' => $usuario->usuario_id, 'nome' => $usuario->usuario_nome, 'ativo' => $usuario->usuario_ativo, 'lotacoes' => $lotacoes, ]; })->values() ]; }) ->values(); return $equipes; } public static function getOcupacoes() { return Lotacao::where('usuario_id', request()->usuario_id) ->whereHas('infraestrutura', function ($query) { $query->where('infraestrutura_id', request()->infraestrutura_id); }) ->get() ->map(fn ($lotacao) => $lotacao->ocupacao->codigo_nome) ->join('
'); } private static function obterFaturamentoAtendimentoDomiciliar() { $faturamentoAtendimentoDomiciliar = FaturamentoAtendimentoDomiciliar::select('registro_tipo_id') ->first() ->toArray(); return $faturamentoAtendimentoDomiciliar; } private static function obterOutrosSalarioMinimo() { $outrosSalarioMinimo = Outros::first() ->select('salario_minimo') ->get() ->toArray(); return $outrosSalarioMinimo[0]; } private static function obterSupervisores() { return OutrosSupervisor::with('usuarios') ->get() ->map(function ($supervisor) { $dadosUsuario = $supervisor->usuarios->map(fn ($usuario) => [ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); return [ 'id' => $supervisor->id, 'usuario_id' => $dadosUsuario[0]['id'], 'usuario_nome' => $dadosUsuario[0]['nome'], ]; }); } private static function getModelData() { return [ 'area' => [ 'areas' => self::obterAreas()->toArray(), ], 'equipe' => [ 'equipes' => self::obterEquipes()->toArray(), ], 'faturamento' => [ 'atendimento_domiciliar' => self::obterFaturamentoAtendimentoDomiciliar(), 'funcionalidades' => FaturamentoFuncionalidade::all() ->map(fn ($faturamentoFuncionalidade) => [ 'id' => $faturamentoFuncionalidade->id, 'descricao' => $faturamentoFuncionalidade->descricao, 'faturar' => $faturamentoFuncionalidade->faturar, ]), 'grupo_procedimentos' => FaturamentoProcedimentoGrupo::with('procedimentos') ->get() ->sortBy(['nome', 'competencia']) ->map(function($grupo) { $procedimentos = $grupo->procedimentos->map(function($procedimento) { $procedimentoSigtap = Procedimento::where('codigo', $procedimento->codigo) ->first('nome'); return [ 'id' => $procedimento->id, 'codigo' => $procedimento->codigo, 'descricao' => $procedimentoSigtap->nome, 'faturar' => $procedimento->faturar ]; }); return [ 'id' => $grupo->id, 'descricao' => $grupo->descricao, 'procedimentos' => $procedimentos, ]; }), ], 'outros' => [ 'salario_minimo' => self::obterOutrosSalarioMinimo(), 'supervisores' => self::obterSupervisores(), 'permissao' => self::obterPermissoes(), ], ]; } private static function obterNomeOcupacao($codigo) { $nome = Ocupacao::where('codigo', $codigo) ->get() ->map(fn ($ocupacao) => $ocupacao->nome); return $nome[0]; } private static function obterDescricaoOcupacao($codigo) { $descricao = Ocupacao::where('codigo', $codigo) ->get() ->map(fn ($ocupacao) => $ocupacao->getCodigoNomeAttribute()); return $descricao[0]; } private static function obterPermissoes() { $permissoes = OutrosPermissao::with('ocupacoes') ->get() ->map(function ($permissao) { $ocupacoes = $permissao->ocupacoes ->map(fn($permissaoOcupacao) => [ 'codigo' => $permissaoOcupacao->ocupacao, 'descricao' => self::obterDescricaoOcupacao($permissaoOcupacao->ocupacao), 'id' => $permissaoOcupacao->id, 'nome' => self::obterNomeOcupacao($permissaoOcupacao->ocupacao), ]); return [ 'id' => $permissao->id, 'descricao' => $permissao->descricao, 'ocupacoes' => $ocupacoes ]; }); return $permissoes; } private static function incluirArea($dados) { unset($dados['microareas']); $area = new Area; $area->descricao = $dados['descricao']; $area->numero_ine = $dados['numero_ine']; $area->tipo_id = $dados['tipo_id']; $area->save(); return $area->id; } private static function alterarArea($area) { unset($area['microareas']); $areaAntiga = Area::find($area['id']); if ( $areaAntiga->descricao != $area['descricao'] || $areaAntiga->numero_ine != $area['numero_ine'] || $areaAntiga->tipo_id != $area['tipo_id'] ) { Area::where('id', $area['id']) ->update($area); } } private static function excluirArea($ids = null) { if (!is_null($ids)) { self::excluirTodasMicroareasDaArea($ids); Area::whereIn('id', $ids)->delete(); } else { self::excluirTodasMicroareas(); Area::whereNotNull('id') ->delete(); } } private static function incluirMicroarea($areaId, $descricao) { $microarea = new Microarea; $microarea->descricao = (int) $descricao; $microarea->area_id = $areaId; $microarea->save(); return $microarea->id; } private static function excluirTodasMicroareas() { Microarea::whereNotNull('id') ->delete(); } private static function excluirTodasMicroareasDaArea($areaIds) { if (is_array($areaIds)) { Microarea::whereIn('area_id', $areaIds) ->delete(); } else { Microarea::where('area_id', $areaIds) ->delete(); } } private static function excluirMicroareasEspecificas($areaId, $microareaIds) { Microarea::where('area_id', $areaId) ->where('id', $microareaIds) ->delete(); } private static function obterMicroareasParaExcluir($areaId, $microareaIds) { return Microarea::where('area_id', $areaId) ->whereNotIn('id', $microareaIds) ->select('id') ->get() ->toArray(); } private static function salvarMicroarea($areaId = null, $microareas = []) { if (!is_null($areaId) && sizeof($microareas) > 0) { $ids = []; foreach ($microareas as $microarea) { if (is_null($microarea['id'])) { $id = self::incluirMicroarea($areaId, $microarea['descricao']); array_push($ids, $id); } else { array_push($ids, $microarea['id']); } } $idsParaExcluir = self::obterMicroareasParaExcluir($areaId, $ids); if (sizeof($idsParaExcluir) > 0) { self::excluirMicroareasEspecificas($areaId, $idsParaExcluir); } } elseif (!is_null($areaId)) { self::excluirTodasMicroareasDaArea($areaId); } else { self::excluirTodasMicroareas(); } } private static function obterAreasParaExcluir($areaIds) { return Area::whereNotIn('id', $areaIds) ->select('id') ->get() ->map(fn ($area) => $area->id) ->toArray(); } private static function salvarArea($areas) { if (sizeof($areas) > 0) { $ids = []; foreach ($areas as $area) { $id = null; if (!is_null($area['id'])) { self::alterarArea($area); $id = $area['id']; } else { $id = self::incluirArea($area); } self::salvarMicroarea($id, $area['microareas']); array_push($ids, $id); } $idsParaExcluir = self::obterAreasParaExcluir($ids); if (sizeof($idsParaExcluir) > 0) { self::excluirArea($idsParaExcluir); } } else { self::excluirArea(); } } private static function incluirEquipe($dados) { unset($dados['profissionais']); $equipe = new Equipe; $equipe->area_id = $dados['area_id']; $equipe->microarea_id = $dados['microarea_id']; $equipe->unidade_id = $dados['unidade_id']; $equipe->infraestrutura_id = $dados['infraestrutura_id']; $equipe->save(); return $equipe->id; } private static function excluirEquipe($ids = null) { if (is_null($ids)) { self::excluirTodosUsuariosEquipes(); Equipe::whereNotNull('id') ->delete(); } else { self::excluirTodosUsuariosEquipesDaEquipe($ids); Equipe::whereIn('id', $ids) ->delete(); } } private static function incluirEquipeUsuario($equipeId, $usuario) { if (!self::verificaSeProfissionalExisteEquipe($equipeId, $usuario['id'])) { $equipeUsuario = new EquipeUsuario; $equipeUsuario->equipe_id = $equipeId; $equipeUsuario->usuario_id = $usuario['id']; $equipeUsuario->ativo = $usuario['ativo']; $equipeUsuario->save(); } } private static function excluirTodosUsuariosEquipes() { EquipeUsuario::whereNotNull('equipe_id') ->delete(); } private static function excluirTodosUsuariosEquipesDaEquipe($equipeId) { if (is_array($equipeId)) { EquipeUsuario::whereIn('equipe_id', $equipeId) ->delete(); } else { EquipeUsuario::where('equipe_id', $equipeId) ->delete(); } } private static function excluirUsuariosEquipesEspecificos($equipeId, $usuarioIds) { EquipeUsuario::where('equipe_id', $equipeId) ->whereIn('usuario_id', $usuarioIds) ->delete(); } private static function obterEquipesUsuariosParaExcluir($equipeId, $usuarioIds) { return EquipeUsuario::where('equipe_id', $equipeId) ->whereNotIn('usuario_id', $usuarioIds) ->select(['equipe_id', 'usuario_id']) ->get() ->toArray(); } private static function verificaSeProfissionalExisteEquipe($equipeId, $usuarioId) { $profissional = EquipeUsuario::where('equipe_id', $equipeId) ->where('usuario_id', $usuarioId) ->select('usuario_id') ->get() ->toArray(); if (is_array($profissional) && sizeof($profissional) > 0) { return $profissional[0]['usuario_id'] === $usuarioId; } return false; } private static function salvarEquipeUsuario($equipeId = null, $profissionais = []) { if (!is_null($equipeId) && sizeof($profissionais) > 0) { $ids = []; foreach ($profissionais as $profissional) { $estadoAtual = self::obterEstadoProfissional($profissional['id'], $equipeId); if ($estadoAtual !== null && isset($estadoAtual['ativo'])) { self::atualizarEstadoProfissional($profissional['id'], $profissional['ativo'], $equipeId); } else { self::incluirEquipeUsuario($equipeId, $profissional); } array_push($ids, $profissional['id']); } $idsParaExcluir = self::obterEquipesUsuariosParaExcluir($equipeId, $ids); if (sizeof($idsParaExcluir) > 0) { foreach ($idsParaExcluir as $key => $id) { unset($idsParaExcluir[$key]['equipe_id']); }; self::excluirUsuariosEquipesEspecificos($equipeId, $idsParaExcluir); } } else if (!is_null($equipeId)) { self::excluirTodosUsuariosEquipesDaEquipe($equipeId); } else { self::excluirTodosUsuariosEquipes(); } } private static function obterEstadoProfissional($profissionalId, $equipeId) { $profissional = EquipeUsuario::where('usuario_id', $profissionalId) ->where('equipe_id', $equipeId) ->select('usuario_id', 'ativo', 'equipe_id') ->first(); return $profissional ? $profissional->toArray() : null; } private static function atualizarEstadoProfissional($profissionalId, $novoEstado, $equipeId) { $alteraAtivo = EquipeUsuario::where('usuario_id', $profissionalId) ->where('equipe_id', $equipeId) ->update(['ativo' => $novoEstado]); return $alteraAtivo; } private static function obterEquipesParaExcluir($equipeIds) { return Equipe::whereNotIn('id', $equipeIds) ->select(['id']) ->get() ->map(fn ($equipe) => $equipe->id) ->toArray(); } private static function salvarEquipe($equipes) { if (sizeof($equipes) > 0) { $ids = []; foreach ($equipes as $equipe) { if (is_null($equipe['id'])) { $id = self::incluirEquipe($equipe); } else { $id = $equipe['id']; } self::salvarEquipeUsuario($id, $equipe['profissionais']); array_push($ids, $id); } $idsParaExcluir = self::obterEquipesParaExcluir($ids); if (sizeof($idsParaExcluir) > 0) { self::excluirEquipe($idsParaExcluir); } } else { self::excluirEquipe(); } } private static function obterOcupacoesPermitidasFuncionalidade($permissaoFuncionalidadeId) { return OutrosPermissaoEsus::where('permissao_id', $permissaoFuncionalidadeId) ->select('codigo') ->get() ->map(fn ($permissao) => $permissao->codigo); } public static function autocomplete() { $ocupacoesPermitidasFuncionalidade = self::obterOcupacoesPermitidasFuncionalidade(request()->funcionalidade_id); $ocupacao = DB::table("sigtap.ocupacao") ->select( "sigtap.ocupacao.codigo", "sigtap.ocupacao.nome", DB::raw("CONCAT(sigtap.ocupacao.codigo, ' - ', sigtap.ocupacao.nome) AS descricao"), ) ->whereIn("codigo", $ocupacoesPermitidasFuncionalidade); return $ocupacao; } private static function salvarFaturamentoAtendimentoDomiciliar($dadosAtendimentoDomiciliar) { FaturamentoAtendimentoDomiciliar::where('id', 1) ->update($dadosAtendimentoDomiciliar); } private static function salvarFaturamentoFuncionalidades($dadosFuncionalidades) { foreach ($dadosFuncionalidades as $funcionalidade) { FaturamentoFuncionalidade::where('id', $funcionalidade['id']) ->update($funcionalidade); } } private static function salvarFaturamentoProcedimentos($dadosProcedimentos) { foreach ($dadosProcedimentos as $procedimento) { FaturamentoProcedimento::where('id', $procedimento['id']) ->update($procedimento); } } private static function salvarFaturamento($dadosFaturamento) { if (sizeof($dadosFaturamento) > 0) { self::salvarFaturamentoAtendimentoDomiciliar($dadosFaturamento['atendimento_domiciliar']); self::salvarFaturamentoFuncionalidades($dadosFaturamento['funcionalidades']); self::salvarFaturamentoProcedimentos($dadosFaturamento['procedimentos']); } } private static function salvarOutrosSalarioMinimo($dadosSalarioMinimo) { Outros::where('id', 1) ->update($dadosSalarioMinimo); } private static function obterSupervisoresParaExcluir($ids) { return OutrosSupervisor::whereNotIn('id', $ids) ->select(['id']) ->get() ->toArray(); } private static function incluirSupervisor($dadosSupervisor) { $supervisor = new OutrosSupervisor; $supervisor->usuario_id = $dadosSupervisor['usuario_id']; $supervisor->save(); return $supervisor->id; } private static function excluirSupervisores($ids) { if (sizeof($ids) > 0) { OutrosSupervisor::whereIn('id', $ids) ->delete(); } } private static function salvarOutrosSupervisores($dadosSupervisores) { $ids = []; foreach ($dadosSupervisores as $supervisor) { if (is_null($supervisor['id'])) { $id = self::incluirSupervisor($supervisor); } else { $id = $supervisor['id']; } array_push($ids, $id); } $idsParaExcluir = self::obterSupervisoresParaExcluir($ids); self::excluirSupervisores($idsParaExcluir); } private static function incluirPermissaoOcupacao($permissaoId, $codigo) { $ocupacao = new OutrosPermissaoOcupacao; $ocupacao->permissao_id = $permissaoId; $ocupacao->ocupacao = $codigo; $ocupacao->save(); return $ocupacao->id; } private static function excluirPermissaoOcupacao($permissaoId, $ocupacaoIds) { OutrosPermissaoOcupacao::where('permissao_id', $permissaoId) ->whereIn('id', $ocupacaoIds) ->delete(); } private static function obterIdentificacaoPermissaoOcupacao($permissaoId, $ocupacao) { $identificacao = OutrosPermissaoOcupacao::where('permissao_id', $permissaoId) ->where('ocupacao', $ocupacao) ->select('id') ->first(); return $identificacao->id ?? null; } private static function obterOcupacaoPermissaoParaExcluir($ids) { return OutrosPermissaoOcupacao::whereNotIn('id', $ids) ->select(['id']) ->get() ->toArray(); } private static function salvarOutrosPermissao($dadosPermissao) { foreach ($dadosPermissao as $permissao) { $ids = []; foreach ($permissao['ocupacoes'] as $ocupacao) { $permissaoOcupacaoId = self::obterIdentificacaoPermissaoOcupacao($permissao['id'], $ocupacao['ocupacao']); if (is_null($permissaoOcupacaoId)) { $id = self::incluirPermissaoOcupacao($permissao['id'], $ocupacao['ocupacao']); } else { $id = $permissaoOcupacaoId; } array_push($ids, $id); } $idsParaExcluir = self::obterOcupacaoPermissaoParaExcluir($ids); self::excluirPermissaoOcupacao($permissao['id'], $idsParaExcluir); } } private static function salvarOutros($dadosOutros) { if (sizeof($dadosOutros) > 0) { self::salvarOutrosSalarioMinimo($dadosOutros['salario_minimo']); self::salvarOutrosSupervisores($dadosOutros['supervisores']); self::salvarOutrosPermissao($dadosOutros['permissao']); } } public static function store($request) { self::salvarArea($request->areas); self::salvarEquipe($request->equipes); self::salvarFaturamento($request->faturamento); self::salvarOutros($request->outros); } }