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' ) ->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); }); }); }) ->whereNotExists(function ($query) { $query ->select(DB::raw(1)) ->from('almoxarifado_entrada_item') ->join( 'almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id' ) ->whereColumn('almoxarifado_entrada_item.material_id', 'cadastro_material.id') ->where('almoxarifado_entrada.finalizada', true) ->where('almoxarifado_entrada.centro_custo_id', self::getCurrentCentroCusto()->id); }) ->select( 'cadastro_material.id', 'cadastro_material.codigo_material', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " as descricao"), 'cadastro_material.possui_lote', 'cadastro_material.is_ativo', 'cadastro_grupo.nome AS grupo', 'cadastro_subgrupo.nome AS subgrupo', DB::raw("IF(cadastro_material.material_bnafar_id IS NULL, 0, 1) as has_vinculo_bnafar") ) ->distinct(); return datatables() ->of($materiais) ->filterColumn('descricao', function ($query, $keyword) { $query->whereRaw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " like ?", ["%{$keyword}%"]); }) ->skipTotalRecords() ->toJson(); } public static function store() { self::validate(); DB::transaction(function () { AlmoxarifadoService::saveEntradaInicial(self::getParams()); }); } public static function list() { switch (request()->listar) { case 'integracao-bnafar-medicamentos': return self::getIntegracaoBnafarMedicamentos(request()->material_id); break; } } private static function getParams() { return collect(request()->entradas)->map(fn ($entrada) => [ 'material_id' => request()->material_id, 'integracao_bnafar_medicamento_id' => $entrada['integracao_bnafar_medicamento_id'], 'quantidade' => $entrada['quantidade'], 'lote' => $entrada['lote'] ? Str::upper($entrada['lote']) : null, 'validade_lote' => $entrada['validade_lote'] ? Carbon::createFromFormat('d/m/Y', $entrada['validade_lote']) : null, 'valor_unitario' => $entrada['valor_unitario'], 'valor_total' => $entrada['valor_total'], 'codigo_barras' => $entrada['codigo_barras'], 'fabricante_id' => $entrada['fabricante_id'], 'fornecedor_id' => $entrada['fornecedor_id'], ]); } private static function validate() { $material = is_null(request()->material_id) ? null : Material::find(request()->material_id); $possuiLote = $material->possui_lote ?? null; $hasVinculoBnafar = !is_null($material->material_bnafar_id ?? null); $rules = [ 'material_id' => [ 'required', 'integer', Rule::exists(Material::class, 'id'), ], 'entradas' => [ 'required', 'array', ], 'entradas.*.quantidade' => [ 'required', 'integer', 'between:1,99999999' ], 'entradas.*.lote' => [ 'nullable', Rule::requiredIf(fn () => $possuiLote), 'string', 'max:15', ], 'entradas.*.validade_lote' => [ 'nullable', Rule::requiredIf(fn () => $possuiLote), 'date_format:d/m/Y', ], 'entradas.*.valor_total' => [ 'required', 'numeric', 'min:0.000000', 'max:99999999.999999' ], 'entradas.*.valor_unitario' => [ 'required', 'numeric', 'min:0.000000', 'max:99999999.999999' ], 'entradas.*.codigo_barras' => [ 'nullable', 'digits:13', ], 'entradas.*.fabricante_id' => [ 'nullable', Rule::requiredIf(fn () => $hasVinculoBnafar), 'integer', Rule::exists(Fabricante::class, 'id'), ], 'entradas.*.fornecedor_id' => [ 'nullable', 'integer', Rule::exists(Fornecedor::class, 'id'), ], ]; $messages = []; request()->validate($rules, $messages); } private static function getIntegracaoBnafarMedicamentos($materialId) { return DB::table('integracao_bnafar_medicamento') ->select([ 'integracao_bnafar_medicamento.id', 'integracao_bnafar_medicamento.descricao', ]) ->whereExists(function ($query) use ($materialId) { $query->select(DB::raw(1)) ->from('cadastro_material_integracao_bnafar_medicamento') ->where('cadastro_material_integracao_bnafar_medicamento.material_id', $materialId) ->whereColumn('cadastro_material_integracao_bnafar_medicamento.medicamento_id', 'integracao_bnafar_medicamento.id'); }) ->get(); } }