select([ 'cadastro_material.id', 'cadastro_material.codigo_material', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'cadastro_unidade_medida' ) . ' AS material_descricao'), 'cadastro_grupo.nome AS grupo_nome', 'cadastro_subgrupo.nome AS subgrupo_nome', 'cadastro_receita_tipo.nome AS receita_tipo_nome', 'cadastro_livro_registro.nome AS livro_nome', 'cadastro_livro_registro_tipo.nome AS livro_tipo_nome', 'cadastro_forma_farmaceutica.nome AS forma_farmaceutica_nome', DB::raw(" CONCAT_WS( ', ', CASE WHEN is_alto_custo THEN 'Alto custo' END, CASE WHEN is_programa_remedio_em_casa THEN 'Programa remédio em casa' END, CASE WHEN is_acao_judicial THEN 'Ação judicial' END, CASE WHEN is_remume THEN 'REMUME' END ) AS programa_acao "), DB::raw("CASE WHEN is_ativo = 1 THEN 'Ativo' ELSE 'Inativo' END AS status"), DB::raw("CASE WHEN possui_lote = 1 THEN 'Sim' ELSE 'Não' END AS possui_lote"), 'cadastro_material_bnafar.codigo AS material_bnafar_codigo', DB::raw(" ( SELECT GROUP_CONCAT(integracao_bnafar_medicamento.codigo SEPARATOR ', ') FROM integracao_bnafar_medicamento INNER JOIN cadastro_material_integracao_bnafar_medicamento ON cadastro_material_integracao_bnafar_medicamento.medicamento_id = integracao_bnafar_medicamento.id WHERE cadastro_material_integracao_bnafar_medicamento.material_id = cadastro_material.id ) AS material_obm_codigo "), ]) ->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id') ->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id') ->leftJoin('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id') ->leftJoin('cadastro_subgrupo', 'cadastro_subgrupo.id', 'cadastro_material.subgrupo_id') ->leftJoin('cadastro_receita_tipo', 'cadastro_receita_tipo.id', 'cadastro_material.receita_tipo_id') ->leftJoin('cadastro_livro_registro', 'cadastro_livro_registro.id', 'cadastro_material.livro_registro_id') ->leftJoin('cadastro_livro_registro_tipo', 'cadastro_livro_registro_tipo.id', 'cadastro_material.livro_registro_tipo_id') ->leftJoin('cadastro_forma_farmaceutica', 'cadastro_forma_farmaceutica.id', 'cadastro_material.forma_farmaceutica_id') ->leftJoin('cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id') ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->when($params->programas_acoes, function ($q) use ($params) { foreach ($params->programas_acoes as $programaAcao) { $q->orWhere("cadastro_material.{$programaAcao}", true); } }) ->when($params->status, fn ($q) => $q->where('cadastro_material.is_ativo', $params->status)) ->when($params->material_id, fn ($q) => $q->where('cadastro_material.id', $params->material_id)) ->orderBy('cadastro_material.descricao'); self::setOrderBy($itens); $itens = $itens->get(); return $itens; } public static function create() { $params = self::getParams(); return [ 'form' => [ 'grupos' => self::getGrupos(), 'subgrupos' => self::getSubgrupos($params), 'receita_tipos' => self::getReceitaTipos($params), 'livros' => self::getLivros($params), 'livro_tipos' => self::getLivroTipos($params), 'formas_farmaceuticas' => self::getFormasFarmaceuticas($params), 'programas_acoes' => self::getProgramasAcoes($params), 'status' => self::getStatus($params), ], 'model' => [ 'grupo_id' => null, 'subgrupo_id' => null, 'receita_tipo_id' => null, 'livro_id' => null, 'livro_tipo_id' => null, 'forma_farmaceutica_id' => null, 'programas_acoes' => [], 'status' => null, 'material' => null, ], ]; } public static function autocomplete() { $params = self::getParams(); return DB::table('cadastro_material') ->select([ 'cadastro_material.id', 'cadastro_material.codigo_material', 'cadastro_material.descricao', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'cadastro_unidade_medida' ) . ' AS material_descricao'), ]) ->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id') ->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id') ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->when($params->programas_acoes, function ($query) use ($params) { foreach ($params->programas_acoes as $programaAcao) { $query->orWhere("cadastro_material.{$programaAcao}", true); } }) ->when($params->status, fn ($q) => $q->where('cadastro_material.is_ativo', $params->status)) ->orderBy('cadastro_material.descricao'); } public static function list() { $params = self::getParams(); switch (request()->listar) { case 'subgrupos': { return [ 'subgrupos' => self::getSubgrupos($params), 'receita_tipos' => self::getReceitaTipos($params), 'livros' => self::getLivros($params), 'livro_tipos' => self::getLivroTipos($params), 'formas_farmaceuticas' => self::getFormasFarmaceuticas($params), 'programas_acoes' => self::getProgramasAcoes($params), 'status' => self::getStatus($params), ]; } case 'receita-tipos': { return [ 'receita_tipos' => self::getReceitaTipos($params), 'livros' => self::getLivros($params), 'livro_tipos' => self::getLivroTipos($params), 'formas_farmaceuticas' => self::getFormasFarmaceuticas($params), 'programas_acoes' => self::getProgramasAcoes($params), 'status' => self::getStatus($params), ]; } case 'livros': { return [ 'livros' => self::getLivros($params), 'livro_tipos' => self::getLivroTipos($params), 'formas_farmaceuticas' => self::getFormasFarmaceuticas($params), 'programas_acoes' => self::getProgramasAcoes($params), 'status' => self::getStatus($params), ]; } case 'livro-tipos': { return [ 'livro_tipos' => self::getLivroTipos($params), 'formas_farmaceuticas' => self::getFormasFarmaceuticas($params), 'programas_acoes' => self::getProgramasAcoes($params), 'status' => self::getStatus($params), ]; } case 'formas-farmaceuticas': { return [ 'formas_farmaceuticas' => self::getFormasFarmaceuticas($params), 'programas_acoes' => self::getProgramasAcoes($params), 'status' => self::getStatus($params), ]; } case 'programas-acoes': { return [ 'programas_acoes' => self::getProgramasAcoes($params), 'status' => self::getStatus($params), ]; } case 'status': { return [ 'status' => self::getStatus($params), ]; } } } private static function getParams() { return (object) [ 'grupo_id' => request()->get('grupo_id'), 'subgrupo_id' => request()->get('subgrupo_id'), 'receita_tipo_id' => request()->get('receita_tipo_id'), 'livro_id' => request()->get('livro_id'), 'livro_tipo_id' => request()->get('livro_tipo_id'), 'forma_farmaceutica_id' => request()->get('forma_farmaceutica_id'), 'programas_acoes' => request()->get('programas_acoes'), 'status' => request()->get('status'), 'material_id' => request()->get('material_id'), ]; } private static function getGrupos() { return DB::table('cadastro_grupo') ->select([ 'cadastro_grupo.id', 'cadastro_grupo.grupo_tipo_id', 'cadastro_grupo.nome', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_material') ->whereColumn('cadastro_material.grupo_id', 'cadastro_grupo.id') ) ->orderBy('cadastro_grupo.nome') ->get(); } private static function getSubgrupos($params) { return DB::table('cadastro_subgrupo') ->select([ 'cadastro_subgrupo.id', 'cadastro_subgrupo.nome', ]) ->when($params->grupo_id, fn ($q) => $q->where('cadastro_subgrupo.grupo_id', $params->grupo_id)) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_material') ->whereColumn('cadastro_material.subgrupo_id', 'cadastro_subgrupo.id') ) ->orderBy('cadastro_subgrupo.nome') ->get(); } private static function getReceitaTipos($params) { return DB::table('cadastro_receita_tipo') ->select([ 'cadastro_receita_tipo.id', 'cadastro_receita_tipo.nome', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_material') ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->whereColumn('cadastro_material.receita_tipo_id', 'cadastro_receita_tipo.id') ) ->orderBy('cadastro_receita_tipo.nome') ->get(); } private static function getLivros($params) { return DB::table('cadastro_livro_registro') ->select([ 'cadastro_livro_registro.id', 'cadastro_livro_registro.nome', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_material') ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->whereColumn('cadastro_material.livro_registro_id', 'cadastro_livro_registro.id') ) ->orderBy('cadastro_livro_registro.nome') ->get(); } private static function getLivroTipos($params) { return DB::table('cadastro_livro_registro_tipo') ->select([ 'cadastro_livro_registro_tipo.id', 'cadastro_livro_registro_tipo.nome', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_material') ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->whereColumn('cadastro_material.livro_registro_tipo_id', 'cadastro_livro_registro_tipo.id') ) ->orderBy('cadastro_livro_registro_tipo.nome') ->get(); } private static function getFormasFarmaceuticas($params) { return DB::table('cadastro_forma_farmaceutica') ->select([ 'cadastro_forma_farmaceutica.id', 'cadastro_forma_farmaceutica.nome', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_material') ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->whereColumn('cadastro_material.forma_farmaceutica_id', 'cadastro_forma_farmaceutica.id') ) ->orderBy('cadastro_forma_farmaceutica.nome') ->get(); } private static function getProgramasAcoes($params) { $programasAcoes = collect(); $isAltoCusto = DB::table('cadastro_material') ->where('cadastro_material.is_alto_custo', true) ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->exists(); if ($isAltoCusto) { $programasAcoes->push(['value' => 'is_alto_custo', 'text' => 'Alto custo']); } $isProgramaRemedioEmCasa = DB::table('cadastro_material') ->where('cadastro_material.is_programa_remedio_em_casa', true) ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->exists(); if ($isProgramaRemedioEmCasa) { $programasAcoes->push(['value' => 'is_programa_remedio_em_casa', 'text' => 'Programa remédio em casa']); } $isAcaoJudicial = DB::table('cadastro_material') ->where('cadastro_material.is_acao_judicial', true) ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->exists(); if ($isAcaoJudicial) { $programasAcoes->push(['value' => 'is_acao_judicial ', 'text' => 'Ação judicial']); } $isRemume = DB::table('cadastro_material') ->where('cadastro_material.is_remume', true) ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->exists(); if ($isRemume) { $programasAcoes->push(['value' => 'is_remume', 'text' => 'REMUME']); } return $programasAcoes; } private static function getStatus($params) { $status = collect(); $ativo =DB::table('cadastro_material') ->where('cadastro_material.is_ativo', true) ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->when($params->programas_acoes, function ($q) use ($params) { foreach ($params->programas_acoes as $programaAcao) { $q->orWhere("cadastro_material.{$programaAcao}", true); } }) ->exists(); if ($ativo) { $status->push(['value' => true, 'text' => 'Ativo']); } $inativo =DB::table('cadastro_material') ->where('cadastro_material.is_ativo', false) ->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id)) ->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id)) ->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)) ->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id)) ->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id)) ->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id)) ->when($params->programas_acoes, function ($q) use ($params) { foreach ($params->programas_acoes as $programaAcao) { $q->orWhere("cadastro_material.{$programaAcao}", true); } }) ->exists(); if ($inativo) { $status->push(['value' => false, 'text' => 'Inativo']); } return $status; } private static function setOrderBy($builder) { $columns = [ 'codigo_material' => 'codigo_material', 'material_descricao' => 'material_descricao', 'grupo_nome' => 'grupo_nome', 'subgrupo_nome' => 'subgrupo_nome', 'receita_tipo_nome' => 'receita_tipo_nome', 'livro_nome' => 'livro_nome', 'livro_tipo_nome' => 'livro_tipo_nome', 'forma_farmaceutica_nome' => 'forma_farmaceutica_nome', 'programa_acao' => 'programa_acao', 'status' => 'status', 'possui_lote' => 'possui_lote', 'material_bnafar_codigo' => 'material_bnafar_codigo', 'material_obm_codigo' => 'material_obm_codigo', ]; if (is_null(request()->sort_by)) { $builder->orderByRaw(join(', ', $columns)); return; } $column = $columns[request()->sort_by]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'DESC' : 'ASC'; unset($columns[request()->sort_by]); $builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns)); } }