query('show_all')) ?? false; $loadEntradas = is_null(request()->query('load_entradas')) ? true : DataUtil::getBooleanValueFromStringBoolean(request()->query('load_entradas')); $materiais = DB::table('cadastro_material') ->join( 'cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id' ) ->join( 'cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id' ) ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id' ) ->leftJoin( 'cadastro_subgrupo', 'cadastro_subgrupo.id', 'cadastro_material.subgrupo_id' ) ->leftJoin( 'cadastro_via_administracao', 'cadastro_via_administracao.id', 'cadastro_material.via_administracao_id' ) ->leftJoin( 'cadastro_forma_farmaceutica', 'cadastro_forma_farmaceutica.id', 'cadastro_material.forma_farmaceutica_id' ) ->leftJoin( 'cadastro_receita_tipo', 'cadastro_receita_tipo.id', 'cadastro_material.receita_tipo_id' ) ->leftJoin( 'cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id' ) ->when($loadEntradas, function ($query) { $query->leftJoin('almoxarifado_entrada_item', function ($join) { $join ->on('almoxarifado_entrada_item.material_id', 'cadastro_material.id') ->whereExists(function ($query) { $query ->select(DB::raw('1')) ->from('almoxarifado_entrada') ->whereColumn('almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id') ->where('almoxarifado_entrada.finalizada', true) ->where('almoxarifado_entrada.centro_custo_id', self::getCurrentCentroCusto()->id); }); }); }) ->when(!is_null(request()->query('is_exibir_receita')), function ($query) { $query->where('cadastro_material.is_exibir_receita', true); }) ->when(!$showAll, function ($query) { $query->where('cadastro_material.is_ativo', true); }) ->when(!is_null(request()->query('possui_lote')), function ($query) { $query->where( 'cadastro_material.possui_lote', DataUtil::getBooleanValueFromStringBoolean(request()->query('possui_lote')) ); }) ->when(!is_null(request()->query('not_id')), function ($query) { $query->whereNotIn('cadastro_material.id', request()->query('not_id')); }) ->when(!is_null(request()->query('grupo_id')), function ($query) { $query->where('cadastro_grupo.id', request()->query('grupo_id')); }) ->when(!is_null(request()->query('grupo_tipo_id')), function ($query) { $query->where('cadastro_grupo.grupo_tipo_id', request()->query('grupo_tipo_id')); }) ->when(!is_null(request()->query('subgrupo_id')), function ($query) { $query->where('cadastro_subgrupo.id', request()->query('subgrupo_id')); }) ->when(DataUtil::isStringTrue(request()->query('is_programa_remedio_em_casa')), function ($query) { $query->where('cadastro_material.is_programa_remedio_em_casa', true); }) ->when(DataUtil::isStringTrue(request()->query('is_alto_custo')), function ($query) { $query->where('cadastro_material.is_alto_custo', true); }) ->when(DataUtil::isStringTrue(request()->query('almoxarifado_check_controle_estoque')), function ($query) { $query->where(function ($query) { $query->where(function ($query) { $query ->whereNull('cadastro_material.subgrupo_id') ->whereExists(function ($query) { $query ->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_controle_estoque_grupo') ->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id') ->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id); }); })->orWhere(function ($query) { $query ->whereNotNull('cadastro_material.subgrupo_id') ->whereExists(function ($query) { $query ->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_controle_estoque_subgrupo') ->join( 'almoxarifado_parametrizacao_controle_estoque_grupo', 'almoxarifado_parametrizacao_controle_estoque_grupo.id', 'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id' ) ->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id') ->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id); }); }); }); }) ->when(!is_null(request()->query('almoxarifado_check_controle_estoque_centro_custo_id')), function ($query) { $query->where(function ($query) { $query->where(function ($query) { $query ->whereNull('cadastro_material.subgrupo_id') ->whereExists(function ($query) { $query ->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_controle_estoque_grupo') ->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id') ->where( 'almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', request()->query('almoxarifado_check_controle_estoque_centro_custo_id') ); }); })->orWhere(function ($query) { $query ->whereNotNull('cadastro_material.subgrupo_id') ->whereExists(function ($query) { $query ->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_controle_estoque_subgrupo') ->join( 'almoxarifado_parametrizacao_controle_estoque_grupo', 'almoxarifado_parametrizacao_controle_estoque_grupo.id', 'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id' ) ->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id') ->where( 'almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', request()->query('almoxarifado_check_controle_estoque_centro_custo_id') ); }); }); }); }) ->when(request()->almoxarifado_check_dispensacao_materiais, function($query) { $query->where(function($query) { $query->where(function($query) { $query->whereExists(function($query) { $query->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_dispensacao') ->whereColumn('almoxarifado_parametrizacao_dispensacao.grupo_id', 'cadastro_material.grupo_id'); }); })->orWhere(function($query) { $query->whereExists(function($query) { $query->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_dispensacao') ->whereColumn('almoxarifado_parametrizacao_dispensacao.material_id', 'cadastro_material.id'); }); }); })->whereExists(function($query) { $query->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_dispensacao_unidade') ->where('almoxarifado_parametrizacao_dispensacao_unidade.centro_custo_id', self::getCurrentCentroCusto()->id); }); }) ->when(!is_null(request()->query('allowed_to_request_to_centro_custo_id')), function ($query) { $query->whereExists(function ($query) { $centroCustoId = request()->query('allowed_to_request_to_centro_custo_id'); $query->select(DB::raw(1)) ->from('almoxarifado_requisicao_permissao') ->whereColumn('almoxarifado_requisicao_permissao.material_id', 'cadastro_material.id') ->where('almoxarifado_requisicao_permissao.centro_custo_requisitante_id', self::getCurrentCentroCusto()->id) ->where('almoxarifado_requisicao_permissao.created_centro_custo_id', $centroCustoId); }); }) ->when(!is_null(request()->query('with_estoque_greater_than_zero_to_centro_custo_id')), function ($query) { $centroCustoId = request()->query('with_estoque_greater_than_zero_to_centro_custo_id'); $query->whereRaw("COALESCE(( SELECT SUM( COALESCE(almoxarifado_entrada_item.quantidade, 0) - COALESCE(( SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida) FROM almoxarifado_saida_item_entrada_item JOIN almoxarifado_saida_item ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id JOIN almoxarifado_saida ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id AND almoxarifado_saida.finalizada = 1 ), 0) - COALESCE(( SELECT SUM(almoxarifado_reserva_item_entrada_item.quantidade_saida) FROM almoxarifado_reserva_item_entrada_item JOIN almoxarifado_reserva_item ON almoxarifado_reserva_item.id = almoxarifado_reserva_item_entrada_item.reserva_item_id WHERE almoxarifado_reserva_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id ), 0) ) FROM almoxarifado_entrada_item JOIN almoxarifado_entrada ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id WHERE almoxarifado_entrada.finalizada = 1 AND almoxarifado_entrada_item.material_id = cadastro_material.id AND almoxarifado_entrada.centro_custo_id = {$centroCustoId} ), 0) > 0"); }) ->when(!is_null(request()->query('somente_material')), function ($query) { $query->where('cadastro_grupo.grupo_tipo_id', GrupoTipo::MATERIAL); }) ->whereNull('cadastro_material.deleted_at') ->when(!is_null(request()->query('visualizar_remume')) && DataUtil::isStringTrue(request()->query('visualizar_remume')), function ($query) { $query->where('cadastro_material.is_remume', true); }) ->orderBy('cadastro_material.descricao') ->select( 'cadastro_material.id', 'cadastro_material.codigo_material', 'cadastro_material.prescricao_unidade_medida_id', 'cadastro_material.descricao', 'cadastro_material.receita_tipo_id', 'cadastro_receita_tipo.nome as receita_tipo', 'cadastro_grupo.grupo_tipo_id', 'cadastro_grupo.nome AS grupo', 'cadastro_subgrupo.nome AS subgrupo', DB::raw('UPPER(cadastro_apresentacao.nome) as apresentacao_nome'), DB::raw('UPPER(cadastro_apresentacao.sigla) as apresentacao_sigla'), DB::raw('CAST(cadastro_material.quantidade AS INTEGER) as quantidade'), DB::raw('UPPER(apresentacao_unidade_medida.nome) as apresentacao_unidade_medida_nome'), DB::raw('UPPER(apresentacao_unidade_medida.id) as apresentacao_unidade_medida_id'), DB::raw('UPPER(apresentacao_unidade_medida.sigla) as apresentacao_unidade_medida_sigla'), 'cadastro_material.possui_lote', 'cadastro_material.is_ativo', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " AS descricao_completa"), DB::raw('cadastro_via_administracao.nome as via_administracao'), DB::raw('cadastro_forma_farmaceutica.nome as forma_farmaceutica'), DB::raw("IF(cadastro_material.material_bnafar_id IS NULL, 0, 1) as has_vinculo_bnafar"), DB::raw("CASE WHEN cadastro_material.is_alto_custo = 0 THEN '' ELSE 'ALTO CUSTO' END AS alto_custo"), DB::raw("CASE WHEN cadastro_material.is_programa_remedio_em_casa = 0 THEN '' ELSE 'PROGRAMA REMÉDIO EM CASA' END AS programa_remedio_em_casa"), DB::raw("CASE WHEN cadastro_material.is_acao_judicial = 0 THEN '' ELSE 'AÇÃO JUDICIAL' END AS acao_judicial"), DB::raw("CASE WHEN cadastro_material.is_remume = 0 THEN '' ELSE 'REMUME' END AS remume"), 'cadastro_material_bnafar.id AS material_bnafar_id', 'cadastro_material_bnafar.codigo AS material_bnafar_codigo', 'cadastro_material_bnafar.descricao AS material_bnafar_descricao', 'cadastro_material_bnafar.tipo AS material_bnafar_tipo', ) ->when($loadEntradas, function ($query) { $query->addSelect(DB::raw("IF(almoxarifado_entrada_item.id IS NULL, 0, 1) AS has_entradas")); }); if (!is_null(request()->query('with_requisicao_que_nao_concluiu_entrega_from_centro_custo_id'))) { $materiais->addSelect([ 'requisicao_que_nao_concluiu_entrega' => function ($query) { $centroCustoId = request()->query('with_requisicao_que_nao_concluiu_entrega_from_centro_custo_id'); $query->select('almoxarifado_requisicao.numero') ->from('almoxarifado_requisicao_item') ->join( 'almoxarifado_requisicao', 'almoxarifado_requisicao.id', 'almoxarifado_requisicao_item.requisicao_id', ) ->whereColumn('almoxarifado_requisicao_item.material_id', 'cadastro_material.id') ->where('almoxarifado_requisicao.centro_custo_id', $centroCustoId) ->where('almoxarifado_requisicao.created_centro_custo_id', self::getCurrentCentroCusto()->id) ->whereIn('almoxarifado_requisicao.status_id', [ RequisicaoStatus::ABERTA, RequisicaoStatus::RESPOSTA_INICIADA, ]) ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_requisicao_resposta_item') ->join( 'almoxarifado_requisicao_resposta', 'almoxarifado_requisicao_resposta.id', 'almoxarifado_requisicao_resposta_item.requisicao_resposta_id', ) ->whereColumn( 'almoxarifado_requisicao_resposta_item.requisicao_item_id', 'almoxarifado_requisicao_item.id' ) ->where( 'almoxarifado_requisicao_resposta.status_id', RequisicaoRespostaStatus::RECEBIDA ) ->where(function ($query) { $query ->whereNull('almoxarifado_requisicao_resposta_item.motivo_id') ->orWhereNotIn('almoxarifado_requisicao_resposta_item.motivo_id', [ RequisicaoRespostaItemMotivo::ENTREGA_PARCIAL, RequisicaoRespostaItemMotivo::PENDENTE_DE_ENTREGA, ]); }); }); } ]); } if ($loadEntradas) { $materiais = $materiais->distinct(); } return $materiais; } public static function datatable() { $materiais = DB::table('cadastro_material') ->select( 'cadastro_material.id', 'cadastro_material.codigo_material', 'cadastro_material.descricao', DB::raw("CONCAT( UPPER(cadastro_apresentacao.nome), ' ', CAST(cadastro_material.quantidade AS INTEGER), ' ', UPPER(COALESCE(apresentacao_unidade_medida.nome, '')) ) AS apresentacao"), 'cadastro_grupo.nome AS grupo', 'cadastro_subgrupo.nome AS subgrupo', ) ->join( 'cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id', ) ->join( 'cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id' ) ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id' ) ->leftJoin( 'cadastro_subgrupo', 'cadastro_subgrupo.id', 'cadastro_material.subgrupo_id' ) ->leftJoin( 'cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id' ) ->whereNull('cadastro_material.deleted_at') ->where(function ($query) { $query->where(function ($query) { $query ->whereNull('cadastro_material.subgrupo_id') ->whereExists(function ($query) { $query ->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_controle_estoque_grupo') ->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id') ->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id); }); })->orWhere(function ($query) { $query ->whereNotNull('cadastro_material.subgrupo_id') ->whereExists(function ($query) { $query ->select(DB::raw(1)) ->from('almoxarifado_parametrizacao_controle_estoque_subgrupo') ->join( 'almoxarifado_parametrizacao_controle_estoque_grupo', 'almoxarifado_parametrizacao_controle_estoque_grupo.id', 'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id' ) ->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id') ->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id); }); }); }) ->when(DataUtil::isStringBoolean(request()->query('is_programa_remedio_em_casa')), function ($query) { $isProgramaRemedioEmCasa = DataUtil::getBooleanValueFromStringBoolean(request()->query('is_programa_remedio_em_casa')); if ($isProgramaRemedioEmCasa) { $query->where('cadastro_material.is_programa_remedio_em_casa', $isProgramaRemedioEmCasa); } }); return $materiais; } public static function getEstoque($materialId, $centroCustoId = null) { $material = Material::with('grupo')->findOrFail($materialId); $materialId = $material->id; if (!is_null($centroCustoId)) { $centroCustoId = CentroCusto::findOrFail($centroCustoId)->id; } $estoque = AlmoxarifadoService::getEstoque($materialId, $centroCustoId); $possuiEntradaComLote = !is_null(collect($estoque['por_entrada']) ->whereNotNull('lote') ->first()); $programa = collect([]); if($material->grupo->grupo_tipo_id === GrupoTipo::MEDICAMENTO) { if($material->is_programa_remedio_em_casa) $programa->push("Programa remédio em casa"); if($material->is_alto_custo) $programa->push("Alto custo"); if($material->is_acao_judicial) $programa->push("Ação judicial"); if($material->is_remume) $programa->push("REMUME"); } $material->programa = $programa->isNotEmpty() ? implode(', ', $programa->toArray()) : '-'; return [ 'total' => $estoque['total'], 'por_entrada' => $estoque['por_entrada'], 'possui_entrada_com_lote' => $possuiEntradaComLote, 'programa' => $material->programa ]; } public static function create() { $material = new Material; $material->fill(array_fill_keys($material->getFillable(), null)); $material->is_ativo = 1; $material->is_exibir_receita = false; $material->is_exibir_prescricao_interna = false; $material->is_alto_custo = false; $material->is_programa_remedio_em_casa = false; $material->is_acao_judicial = false; $material->is_remume = false; $material->material_bnafar = null; $material->possui_lote = false; $material->integracao_bnafar_medicamentos = []; return [ 'additionals' => self::getAdditionals(), 'form' => self::getFormData(), 'model' => $material->makeHidden(['id']) ]; } public static function store() { self::validate(); $material = null; DB::transaction(function() use (&$material) { $parametrizacaoMaterial = ParametrizacaoService::getParametrizacaoMaterial(); if (!is_null($parametrizacaoMaterial) && $parametrizacaoMaterial->gera_codigo_automatico) { if (is_null(request()->get('codigo_material'))) { $codigoMaterial = Material::max('codigo_material'); request()['codigo_material'] = (int) $codigoMaterial + 1; } } $material = Material::create(request()->all()); $material->integracaoBnafarMedicamentos()->sync(self::getMedicamentosIds(request()->integracao_bnafar_medicamentos)); $material = $material->fresh(); }); return $material; } public static function edit($id) { $material = Material::with('materialBnafar')->findOrFail($id); $material->material_bnafar = null; $material->integracao_bnafar_medicamentos = DB::table('cadastro_material_integracao_bnafar_medicamento') ->select([ 'integracao_bnafar_medicamento.id AS medicamento_id', 'integracao_bnafar_medicamento.codigo AS medicamento_codigo', 'integracao_bnafar_medicamento.descricao AS medicamento_descricao', ]) ->join('integracao_bnafar_medicamento', 'integracao_bnafar_medicamento.id', 'cadastro_material_integracao_bnafar_medicamento.medicamento_id') ->where('material_id', $material->id) ->get(); return [ 'additionals' => self::getAdditionals(), 'form' => self::getFormData($material), 'model' => $material->makeHidden(['id']) ]; } private static function getAdditionals() { $parametrizacaoMaterial = ParametrizacaoService::getParametrizacaoMaterial(); return [ 'gera_codigo_automatico' => $parametrizacaoMaterial->gera_codigo_automatico ?? false, ]; } private static function getFormData($material = null) { return [ 'apresentacoes' => self::getApresentacoes(), 'apresentacao_unidades_medida' => self::getApresentacaoUnidadesMedida(), 'unidades_medida' => self::getUnidadesMedida(), 'grupos' => self::getGrupos(), 'subgrupos' => self::getSubgrupos(), 'receita_tipos' => self::getReceitaTipos(), 'livros_registro' => self::getLivrosRegistro(), 'livro_registro_tipos' => self::getLivroRegistroTipos(), 'formas_farmaceutica' => self::getFormasFarmaceutica(), 'vias_administracao' => self::getViasAdministracao(), 'has_vinculo_livro' => is_null($material) ? false : $material->farmaciaLivroPagina()->exists(), ]; } private static function getApresentacoes() { return DB::table('cadastro_apresentacao') ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } private static function getApresentacaoUnidadesMedida() { return DB::table('cadastro_unidade_medida') ->whereIn('id', [ UnidadeMedida::MILIGRAMAS, UnidadeMedida::GRAMAS, UnidadeMedida::QUILOGRAMAS, UnidadeMedida::CENTIMETROS, UnidadeMedida::METROS, UnidadeMedida::UNIDADES, UnidadeMedida::NAO_DEFINIDO, UnidadeMedida::LITROS, UnidadeMedida::MILILITROS, UnidadeMedida::UNIDADES_INTERNACIONAIS, UnidadeMedida::MICROGRAMAS, UnidadeMedida::DOSE, UnidadeMedida::COMPRIMIDO, UnidadeMedida::FRASCO, UnidadeMedida::AMPOLA, UnidadeMedida::ADESIVO, UnidadeMedida::ANEL, UnidadeMedida::APLICACAO, UnidadeMedida::BARRA, UnidadeMedida::BASTAO, UnidadeMedida::BISNAGA, UnidadeMedida::BLISTER, UnidadeMedida::BOLSA, UnidadeMedida::CAIXA, UnidadeMedida::CAPSULA, UnidadeMedida::CAPSULA_INALANTE, UnidadeMedida::CARPULE, UnidadeMedida::CARTAO, UnidadeMedida::CARTELA, UnidadeMedida::DRAGEA, UnidadeMedida::EMPLASTRO, UnidadeMedida::ENVELOPE, UnidadeMedida::FLACONETE, UnidadeMedida::FRASCO_AMPOLA, UnidadeMedida::GLOBULO, UnidadeMedida::LATA, UnidadeMedida::OVULO, UnidadeMedida::PASTILHA, UnidadeMedida::PILULA, UnidadeMedida::POTE, UnidadeMedida::SACHE, UnidadeMedida::SERINGA, UnidadeMedida::SUPOSITORIO, UnidadeMedida::TABLETE, UnidadeMedida::TUBETE, UnidadeMedida::TUBO, UnidadeMedida::GOTAS, ]) ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } private static function getUnidadesMedida() { return DB::table('cadastro_unidade_medida') ->whereIn('id', [ UnidadeMedida::MILIGRAMAS, UnidadeMedida::GRAMAS, UnidadeMedida::QUILOGRAMAS, UnidadeMedida::PORCENTAGEM, UnidadeMedida::NAO_DEFINIDO, UnidadeMedida::LITROS, UnidadeMedida::MILILITROS, UnidadeMedida::MICROGRAMAS, UnidadeMedida::DOSE, UnidadeMedida::COMPRIMIDO, ]) ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } private static function getGrupos() { return DB::table('cadastro_grupo') ->select( 'id', 'nome', 'grupo_tipo_id' ) ->whereIn('cadastro_grupo.grupo_tipo_id', [IdentificacaoGrupo::ID_GRUPO_MATERIAL, IdentificacaoGrupo::ID_GRUPO_MEDICAMENTOS]) ->whereNull('deleted_at') ->orWhere(function ($query) { $query->whereNull('deleted_at') ->whereNull('cadastro_grupo.grupo_tipo_id'); }) ->orderBy('nome') ->get(); } private static function getSubgrupos() { return DB::table('cadastro_subgrupo') ->select( 'id', 'nome', 'grupo_id' ) ->whereNull('deleted_at') ->orderBy('nome') ->get(); } private static function getReceitaTipos() { return DB::table('cadastro_receita_tipo') ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } private static function getLivrosRegistro() { return DB::table('cadastro_livro_registro') ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } private static function getLivroRegistroTipos() { return DB::table('cadastro_livro_registro_tipo') ->select( 'id', 'nome' ) ->whereNotIn('id', [ LivroRegistroTipo::A_BASE, LivroRegistroTipo::ESPECIFICO, ]) ->orderBy('nome') ->get(); } private static function getFormasFarmaceutica() { return DB::table('cadastro_forma_farmaceutica') ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } private static function getViasAdministracao() { return DB::table('cadastro_via_administracao') ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } public static function update($id) { self::validate(); $material = null; DB::transaction(function() use ($id, &$material) { $parametrizacaoMaterial = ParametrizacaoService::getParametrizacaoMaterial(); if (!is_null($parametrizacaoMaterial) && $parametrizacaoMaterial->gera_codigo_automatico) { if (is_null(request()->get('codigo_material'))) { $codigoMaterial = DB::table('cadastro_material')->select(DB::raw('MAX(CAST(codigo_material AS INTEGER)) AS codigo_material'))->first()->codigo_material ?? 0; request()['codigo_material'] = (int) $codigoMaterial + 1; } } $material = tap(Material::findOrFail($id))->update(request()->all()); $material->integracaoBnafarMedicamentos()->sync(self::getMedicamentosIds(request()->integracao_bnafar_medicamentos)); $material = $material->fresh(); }); return $material; } public static function validate() { $params = request()->all(); $rules = [ 'codigo_material' => [ 'nullable', 'string', 'max:10', 'unique:\App\Models\Cadastro\Material\Material,codigo_material, '.(request()->route('material') ?? null).',id,deleted_at,null' ], 'descricao' => [ 'required', 'string', 'between:3,100', Rule::unique(Material::class, 'descricao') ->ignore(request()->route('material')) ->whereNull('deleted_at'), ], 'grupo_id' => [ 'required', 'integer' ], 'subgrupo_id' => [ 'nullable', 'integer' ], 'apresentacao_id' => [ 'required', 'integer' ], 'quantidade' => [ 'required', 'numeric', ], 'apresentacao_unidade_medida_id' => [ 'required', 'integer' ], 'possui_lote' => [ 'required', 'boolean' ], 'is_ativo' => [ 'required', 'boolean' ], 'receita_tipo_id' => [ 'nullable', 'integer', Rule::requiredIf(fn () => DataUtil::isStringTrue($params['is_medicamento'])), ], 'livro_registro_id' => [ 'nullable', 'integer' ], 'livro_registro_tipo_id' => [ 'nullable', 'integer' ], 'forma_farmaceutica_id' => [ 'nullable', 'integer', Rule::requiredIf(fn () => DataUtil::isStringTrue($params['is_medicamento'])), ], 'via_administracao_id' => [ 'nullable', 'integer', Rule::requiredIf(fn () => DataUtil::isStringTrue($params['is_medicamento'])), ], 'exibir_receita' => [ 'nullable', 'boolean' ], 'exibir_prescricao_interna' => [ 'nullable', 'boolean' ], 'alto_custo' => [ 'nullable', 'boolean' ], 'programa_remedio_em_casa' => [ 'nullable', 'boolean' ], 'acao_judicial' => [ 'nullable', 'boolean' ], 'remume' => [ 'nullable', 'boolean' ], 'quantidade_gotas_ml' => [ 'nullable', 'numeric', 'max:999.999' ] ]; $messages = [ 'descricao.unique' => 'A descrição já foi inserida anteriormente.', 'codigo_material.unique' => 'O código do material já foi inserido anteriormente.', ]; request()->validate($rules, $messages); } public static function validateMaterialBnafar() { $rules = [ 'material_bnafar_id' => [ 'required', 'integer', ], ]; request()->validate($rules); } public static function validateIntegracaoBnafarMedicamentos() { $rules = [ '.*' => [ 'required', 'integer', ], ]; request()->validate($rules); } public static function destroy($id) { Material::findOrFail($id)->delete(); return null; } private static function getMedicamentosIds($medicamentos) { $ids = []; foreach ($medicamentos as $value) { $ids[] = $value['medicamento_id']; } return $ids; } public static function editMaterialBnafar($materialId) { $material = Material::with('materialBnafar')->findOrFail($materialId); return [ 'id' => $material->materialBnafar->id ?? null, 'codigo' => $material->materialBnafar->codigo ?? null, 'descricao' => $material->materialBnafar->descricao ?? null, 'tipo' => $material->materialBnafar->tipo ?? null, ]; } public static function updateMaterialBnafar($materialId) { self::validateMaterialBnafar(); $material = Material::findOrFail($materialId); $material->material_bnafar_id = request()->material_bnafar_id; $material->save(); return $material->fresh()->materialBnafar; } public static function storeIntegracaoBnafarMedicamentos($materialId) { $material = Material::findOrFail($materialId); self::validateIntegracaoBnafarMedicamentos(); DB::transaction(function() use ($material) { $material->integracaoBnafarMedicamentos()->sync(request()->all()); }); $material = $material->fresh(); return $material; } }