0, ]; $params = self::getParams(); $procedimentosBuilder = DB::table('bpa_procedimento as bpa_procedimento') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'bpa_procedimento.procedimento_id') ->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id') ->join('cadastro_unidade as unidade', 'unidade.id', 'bpa_procedimento.unidade_id') ->leftJoin('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'bpa_procedimento.ocupacao_id') ->where('bpa_procedimento.competencia_id', $params->competencia_id) ->where('registro.codigo', Registro::BPA_CONSOLIDADO) ->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id)) ->when($params->ocupacao_id, fn ($q, $id) => $q->where('bpa_procedimento.ocupacao_id', $id)) ->when($params->procedimento_codigo, fn ($q, $codigo) => $q->where('procedimento.codigo', $codigo)) ->when($params->com_inconsistencia === true, fn ($q) => $q->whereExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia') ->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id') )) ->when($params->com_inconsistencia === false, fn ($q) => $q->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia') ->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id') )) ->when(isset($params->idade['de']), fn ($q) => $q->where(fn ($q) => $q ->whereRaw("bpa_procedimento.idade >= {$params->idade['de']}") )) ->when(isset($params->idade['ate']), fn ($q) => $q->where(fn ($q) => $q ->whereRaw("bpa_procedimento.idade <= {$params->idade['ate']}") )) ->selectRaw(" procedimento.id as procedimento_id, procedimento.codigo as procedimento_codigo, procedimento.nome as procedimento_nome, unidade.id as unidade_id, CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes))) as unidade_descricao, ocupacao.id as ocupacao_id, ocupacao.codigo as ocupacao_codigo, ocupacao.nome as ocupacao_nome, bpa_procedimento.idade, IF (EXISTS( SELECT 1 FROM bpa_procedimento_inconsistencia as procedimento_inconsistencia WHERE procedimento_inconsistencia.procedimento_id = bpa_procedimento.id ), 1, 0 ) as com_inconsistencia, bpa_procedimento.origem as origem, SUM(bpa_procedimento.quantidade) as quantidade ") ->groupByRaw(" procedimento.id, procedimento.codigo, procedimento.nome, unidade.id, CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes))), ocupacao.id, ocupacao.codigo, ocupacao.nome, bpa_procedimento.idade, com_inconsistencia, origem "); self::setOrderBy($procedimentosBuilder); $procedimentos = $procedimentosBuilder->get(); $procedimentos->each(function ($item) use ($totalizadores) { $item->procedimento_codigo = MaskUtil::getProcedimentoMasked($item->procedimento_codigo); $item->procedimento_descricao = "{$item->procedimento_codigo} - {$item->procedimento_nome}"; $item->ocupacao_descricao = "{$item->ocupacao_codigo} - {$item->ocupacao_nome}"; $item->com_inconsistencia_value = (bool) $item->com_inconsistencia; $item->com_inconsistencia = $item->com_inconsistencia_value ? 'SIM' : 'NÃO'; unset( $item->procedimento_codigo, $item->procedimento_nome, $item->ocupacao_codigo, $item->ocupacao_nome, ); $totalizadores->quantidade += $item->quantidade; }); return compact('procedimentos', 'totalizadores'); } private static function setOrderBy($builder) { $columns = [ 'procedimento_descricao' => "CONCAT(procedimento.codigo, ' - ', procedimento.nome)", 'unidade_descricao' => "CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes)))", 'ocupacao_descricao' => "CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)", 'idade' => 'bpa_procedimento.idade', 'com_inconsistencia' => 'com_inconsistencia', 'origem' => 'bpa_procedimento.origem', 'quantidade' => 'quantidade' ]; if (is_null(request()->sortBy)) { $builder->orderByRaw(join(', ', $columns)); return; } $column = $columns[request()->sortBy]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC'; unset($columns[request()->sortBy]); $builder->orderByRaw( "{$column} {$direction}, " . join(', ', $columns) ); } public static function list() { $data = (object) [ 'form' => [], 'model' => [], ]; $params = self::getParams(); $sets = [ 'ano' => function () use ($data, $params) { $anosData = self::getAnosData(); $data->form['anos'] = $anosData['form']; $data->model['ano'] = $anosData['model']; $params->ano = $data->model['ano']; }, 'competencia' => function () use ($data, $params) { $competenciasData = self::getCompetenciasData($params); $data->form['competencias'] = $competenciasData['form']; $data->model['competencia_id'] = $competenciasData['model']; $params->competencia_id = $data->model['competencia_id']; }, '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']; }, 'ocupacao' => function () use ($data, $params) { $ocupacoesData = self::getOcupacoesData($params); $data->form['ocupacoes'] = $ocupacoesData['form']; $data->model['ocupacao_id'] = $ocupacoesData['model']; $params->ocupacao_id = $data->model['ocupacao_id']; }, 'procedimento' => function () use ($data, $params) { $procedimentosData = self::getProcedimentosData($params); $data->form['procedimentos'] = $procedimentosData['form']; $data->model['procedimento_codigo'] = $procedimentosData['model']; $params->procedimento_codigo = $data->model['procedimento_codigo']; }, 'inconsistencia' => function () use ($data, $params) { $inconsistenciasData = self::getInconsistenciasData($params); $data->form['inconsistencias'] = $inconsistenciasData['form']; $data->model['com_inconsistencia'] = $inconsistenciasData['model']; $params->com_inconsistencia = $data->model['com_inconsistencia']; }, 'idade' => function () use ($data, $params) { $data->model['idade'] = ['de' => null, 'ate' => null]; $params->idade = $data->model['idade']; }, ]; $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([ 'ano', 'competencia_id', 'unidade_id', 'ocupacao_id', 'procedimento_codigo', 'com_inconsistencia', 'idade', ]); if (isset($params->com_inconsistencia)) { $params->com_inconsistencia = DataUtil::isStringBoolean($params->com_inconsistencia) ? DataUtil::getBooleanValueFromStringBoolean($params->com_inconsistencia) : null; } return $params; } private static function getAnosData() { $anos = DB::table('sigtap.competencia as competencia') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento as bpa_procedimento') ->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id') ->whereColumn('bpa_procedimento.competencia_id', 'competencia.id') ->where('registro.codigo', Registro::BPA_CONSOLIDADO) ) ->selectRaw(" SUBSTRING(competencia.valor, 1, 4) as ano ") ->orderByRaw("SUBSTRING(competencia.valor, 1, 4) DESC") ->distinct() ->get(); $ano = null; return ['form' => $anos, 'model' => $ano]; } private static function getCompetenciasData($params) { $competencias = collect(); $id = null; if (!is_null($params->ano)) { $competencias = DB::table('sigtap.competencia as competencia') ->whereRaw("SUBSTRING(competencia.valor, 1, 4) = '{$params->ano}'") ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento as bpa_procedimento') ->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id') ->whereColumn('bpa_procedimento.competencia_id', 'competencia.id') ->where('registro.codigo', Registro::BPA_CONSOLIDADO) ) ->selectRaw(" competencia.id, SUBSTRING(competencia.valor, 5, 7) as mes ") ->orderByRaw("SUBSTRING(competencia.valor, 5, 7)") ->get(); } return ['form' => $competencias, 'model' => $id]; } private static function getUnidadesData($params) { $unidades = collect(); $id = null; if (!is_null($params->competencia_id)) { $unidades = DB::table('cadastro_unidade as unidade') ->whereNull('unidade.deleted_at') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento as bpa_procedimento') ->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id') ->whereColumn('bpa_procedimento.unidade_id', 'unidade.id') ->where('bpa_procedimento.competencia_id', $params->competencia_id) ->where('registro.codigo', Registro::BPA_CONSOLIDADO) ) ->selectRaw(" unidade.id, CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes))) as descricao ") ->orderByRaw("CONCAT(unidade.nome_fantasia, IF (unidade.cnes IS NULL, '', CONCAT(' - ', unidade.cnes)))") ->get(); } return ['form' => $unidades, 'model' => $id]; } private static function getOcupacoesData($params) { $ocupacoes = collect(); $id = null; if (!is_null($params->competencia_id)) { $ocupacoes = DB::table('sigtap.ocupacao as ocupacao') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento as bpa_procedimento') ->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id') ->whereColumn('bpa_procedimento.ocupacao_id', 'ocupacao.id') ->where('bpa_procedimento.competencia_id', $params->competencia_id) ->where('registro.codigo', Registro::BPA_CONSOLIDADO) ->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id)) ) ->selectRaw(" ocupacao.id, CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) as descricao ") ->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)") ->get(); } return ['form' => $ocupacoes, 'model' => $id]; } private static function getProcedimentosData($params) { $procedimentos = collect(); $codigo = null; if (!is_null($params->competencia_id)) { $procedimentos = DB::table('sigtap.procedimento as procedimento') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento as bpa_procedimento') ->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id') ->whereColumn('bpa_procedimento.procedimento_id', 'procedimento.id') ->where('bpa_procedimento.competencia_id', $params->competencia_id) ->where('registro.codigo', Registro::BPA_CONSOLIDADO) ->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id)) ->when($params->ocupacao_id, fn ($q, $id) => $q->where('bpa_procedimento.ocupacao_id', $id)) ) ->selectRaw(" procedimento.codigo, procedimento.nome ") ->orderByRaw("CONCAT(procedimento.codigo, ' - ', procedimento.nome)") ->distinct() ->get() ->map(fn ($procedimento) => (object) [ 'codigo' => $procedimento->codigo, 'descricao' => MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}", ]); } return ['form' => $procedimentos, 'model' => $codigo]; } private static function getInconsistenciasData($params) { $inconsistencias = collect(); $value = null; if (!is_null($params->competencia_id)) { $exists = function ($comInconsistencia) use ($params) { return DB::table('bpa_procedimento as bpa_procedimento') ->join('sigtap.registro as registro', 'registro.id', 'bpa_procedimento.registro_id') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'bpa_procedimento.procedimento_id') ->where('bpa_procedimento.competencia_id', $params->competencia_id) ->where('registro.codigo', Registro::BPA_CONSOLIDADO) ->when($params->unidade_id, fn ($q, $id) => $q->where('bpa_procedimento.unidade_id', $id)) ->when($params->ocupacao_id, fn ($q, $id) => $q->where('bpa_procedimento.ocupacao_id', $id)) ->when($params->procedimento_codigo, fn ($q, $codigo) => $q->where('procedimento.codigo', $codigo)) ->when($comInconsistencia, fn ($q) => $q->whereExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia') ->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id') ), fn ($q) => $q->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('bpa_procedimento_inconsistencia as procedimento_inconsistencia') ->whereColumn('procedimento_inconsistencia.procedimento_id', 'bpa_procedimento.id') ) ) ->exists(); }; if ($exists(false)) { $inconsistencias->push((object) ['value' => false, 'text' => 'NÃO']); } if ($exists(true)) { $inconsistencias->push((object) ['value' => true, 'text' => 'SIM']); } } return ['form' => $inconsistencias->sortBy('text')->values(), 'model' => $value]; } public static function getInconsistencias() { return DB::table('bpa_inconsistencia as inconsistencia') ->join( 'bpa_procedimento_inconsistencia as procedimento_inconsistencia', 'procedimento_inconsistencia.inconsistencia_id', 'inconsistencia.id' ) ->join( 'bpa_procedimento as bpa_procedimento', 'bpa_procedimento.id', 'procedimento_inconsistencia.procedimento_id' ) ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'bpa_procedimento.procedimento_id') ->where('bpa_procedimento.competencia_id', request()->competencia_id) ->where('bpa_procedimento.unidade_id', request()->unidade_id) ->where('procedimento.codigo', request()->procedimento_codigo) ->where('bpa_procedimento.ocupacao_id', request()->ocupacao_id) ->where('bpa_procedimento.idade', request()->idade) ->where('bpa_procedimento.origem', request()->origem) ->selectRaw(" inconsistencia.id, inconsistencia.descricao ") ->orderBy('inconsistencia.descricao') ->distinct() ->get(); } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['procedimentos']; $params = self::getParams(); $competencia = Competencia::find($params->competencia_id); $unidade = $params->unidade_id ? Unidade::find($params->unidade_id) : null; $ocupacao = $params->ocupacao_id ? Ocupacao::find($params->ocupacao_id) : null; $procedimento = $params->procedimento_codigo ? Procedimento::where('competencia_id', '<=', $params->competencia_id) ->where('codigo', $params->procedimento_codigo) ->orderByDesc('competencia_id') ->first() : null; return [ 'ano' => Str::substr($competencia->valor, 0, 4), 'mes' => Str::substr($competencia->valor, 4, 2), 'unidade' => $unidade ? ($unidade->nome_fantasia . ($unidade->cnes ? " - {$unidade->cnes}": '')) : 'Todas', 'ocupacao' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : 'Todas', 'procedimento' => $procedimento ? MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}" : 'Todos', 'comInconsistencia' => $params->com_inconsistencia === null ? 'Todas' : ($params->com_inconsistencia ? 'SIM' : 'NÃO'), 'idadeDe' => $params->idade['de'], 'idadeAte' => $params->idade['ate'], 'colunas' => collect(request()->selectedCols), 'itens' => $itens, 'totalizadores' => $resultado['totalizadores'], ]; } }