self::getFormData(), 'model' => self::getModelData(), ]; } public static function store($request) { self::validate($request); $parametrizacao = null; DB::transaction(function() use ($request, &$parametrizacao) { $parametrizacao = Parametrizacao::first(); if (is_null($parametrizacao)) { $parametrizacao = Parametrizacao::create($request->all())->fresh(); } else { $parametrizacao = $parametrizacao->update($request->all()); } ParametrizacaoOcupacao::truncate(); foreach($request['ocupacoes'] as $ocupacao) { ParametrizacaoOcupacao::create(['ocupacao_id' => $ocupacao['ocupacao_id']]); } ParametrizacaoSupervisor::truncate(); foreach($request['supervisores'] as $supervisor) { ParametrizacaoSupervisor::create([ 'usuario_id' => $supervisor['usuario_id'], 'sala_vacinacao_id' => $supervisor['sala_vacinacao_id'], ]); } }); return $parametrizacao; } public static function list() { switch (request()->get('listar')) { case 'salas_vacinacao': return self::getSalasVacinacao(request()->get('unidade_id')); break; default: return []; break; } } private static function validate($request) { return $request->validate([ 'parametrizacao_descricao_vacina_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\ParametrizacaoDescricaoVacina,id', ], 'perfil_campanha' => [ 'required', 'boolean', ], 'usa_ultimo_frasco' => [ 'required', 'boolean', ], 'cns_cpf_obrigatorio' => [ 'required', 'boolean', ], 'aprazamento_dias_antes' => [ 'required_if:aprazamento_ativo,true', 'nullable', 'integer', $request['aprazamento_dias_depois'] == 0 ? 'min:1' : 'min:0', 'max:365', ], 'aprazamento_dias_depois' => [ 'required_if:aprazamento_ativo,true', 'nullable', 'integer', $request['aprazamento_dias_antes'] == 0 ? 'min:1' : 'min:0', 'max:365', ], 'aprazamento_ativo' => [ 'required', 'boolean', ], 'ocupacoes' => [ 'nullable', 'array', ], 'ocupacoes.*.ocupacao_id' => [ 'required', 'integer', 'exists:\App\Models\Sigtap\Ocupacao,id', ], ]); } private static function getParametrizacaoDescricoesVacina() { return DB::table('imunizacao_parametrizacao_descricao_vacina') ->select([ 'id', 'nome', ]) ->orderBy('nome') ->get(); } private static function getUnidades() { return DB::table('cadastro_unidade') ->select([ 'id', 'nome_fantasia', ]) ->whereExists(function($query) { $query->select(DB::raw(1)) ->from('cadastro_infraestrutura') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id') ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ->where('imunizacao_sala_vacinacao.ativo', true); }) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getSalasVacinacao($unidadeId) { return DB::table('imunizacao_sala_vacinacao') ->select([ 'imunizacao_sala_vacinacao.id', DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS nome"), ]) ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('imunizacao_sala_vacinacao.ativo', true) ->where('cadastro_infraestrutura.unidade_id', $unidadeId) ->orderByRaw('CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END') ->get(); } private static function getOcupacoes() { return DB::table('imunizacao_parametrizacao_ocupacao') ->select([ 'ocupacao.id', 'ocupacao.codigo', 'ocupacao.nome', ]) ->join('sigtap.ocupacao', 'ocupacao.id', 'imunizacao_parametrizacao_ocupacao.ocupacao_id') ->get(); } private static function getSupervisores() { return DB::table('imunizacao_parametrizacao_supervisor') ->select([ 'cadastro_usuario.id AS usuario_id', 'cadastro_cidadao.nome AS usuario_nome', 'cadastro_unidade.id AS unidade_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', 'imunizacao_sala_vacinacao.id AS sala_vacinacao_id', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS sala_vacinacao_nome"), ]) ->join('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_parametrizacao_supervisor.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_parametrizacao_supervisor.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->get(); } private static function getFormData() { return [ 'parametrizacao_descricoes_vacina' => self::getParametrizacaoDescricoesVacina(), 'unidades' => self::getUnidades(), 'salas_vacinacao' => [], ]; } private static function getModelData() { $parametrizacao = Parametrizacao::first(); $ocupacoes = self::getOcupacoes(); $supervisores = self::getSupervisores(); return [ 'parametrizacao_descricao_vacina_id' => $parametrizacao->parametrizacao_descricao_vacina_id ?? ParametrizacaoDescricaoVacina::DESCRICAO, 'perfil_campanha' => $parametrizacao->perfil_campanha ?? false, 'usa_ultimo_frasco' => $parametrizacao->usa_ultimo_frasco ?? false, 'cns_cpf_obrigatorio' => $parametrizacao->cns_cpf_obrigatorio ?? false, 'aprazamento_dias_antes' => $parametrizacao->aprazamento_dias_antes ?? null, 'aprazamento_dias_depois' => $parametrizacao->aprazamento_dias_depois ?? null, 'aprazamento_ativo' => $parametrizacao->aprazamento_ativo ?? false, 'aplicacao_data_retroativa' => $parametrizacao->aplicacao_data_retroativa ?? false, 'cadastro_outro_municipio' => $parametrizacao->cadastro_outro_municipio ?? false, 'cadastro_provisorio' => $parametrizacao->cadastro_provisorio ?? false, 'cadastro_bloqueado' => $parametrizacao->cadastro_bloqueado ?? false, 'cadastro_desatualizado' => $parametrizacao->cadastro_desatualizado ?? false, 'ocupacoes' => $ocupacoes ?? [], 'supervisores' => $supervisores ?? [], ]; } }