0]; $validadeMaterialBuilder = DB::table('almoxarifado_entrada_item') ->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_entrada.centro_custo_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_material', 'cadastro_material.id', 'almoxarifado_entrada_item.material_id') ->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('almoxarifado_entrada_item.estornado_em') ->where('almoxarifado_entrada.finalizada', true) ->whereNotNull('almoxarifado_entrada_item.lote') ->when(request()->periodo['start'], fn ($q, $data) => $q ->where('almoxarifado_entrada_item.validade_lote', '>=', Carbon::createFromFormat('d/m/Y', $data) ->setTime(0, 0, 0)) ) ->when(request()->periodo['end'], fn ($q, $data) => $q ->where('almoxarifado_entrada_item.validade_lote', '<=', Carbon::createFromFormat('d/m/Y', $data) ->setTime(23, 59, 59)) ) ->when(request()->query('unidade_id'), fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id)) ->when(request()->query('infraestrutura_id'), fn ($q, $id) => $q->where('cadastro_infraestrutura.id', $id)) ->when(request()->query('centro_custo_id'), fn ($q, $id) => $q->where('cadastro_centro_custo.id', $id)) ->when(request()->query('grupo_id'), fn ($q, $id) => $q->where('cadastro_grupo.id', $id)) ->when(request()->query('subgrupo_id'), fn ($q, $id) => $q->where('cadastro_subgrupo.id', $id)) ->when(request()->query('material_id'), fn ($q, $id) => $q->where('cadastro_material.id', $id)) ->when(request()->query('situacao'), fn ($q, $situacao) => $q ->whereRaw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 1, 2) = {$situacao}") ) ->groupBy( 'cadastro_material.id', 'cadastro_material.codigo_material', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' )), 'almoxarifado_entrada_item.lote', 'almoxarifado_entrada_item.validade_lote', 'cadastro_grupo.nome', 'cadastro_subgrupo.nome', DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1") ) ->select( 'cadastro_material.id', 'cadastro_material.codigo_material', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " AS descricao"), 'almoxarifado_entrada_item.lote', DB::raw("almoxarifado_entrada_item.validade_lote AS validade"), DB::raw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 'A Vencer', 'Vencido') AS situacao"), 'cadastro_grupo.nome AS grupo', 'cadastro_subgrupo.nome AS subgrupo', DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1 AS tempo_validade"), DB::raw("COALESCE(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) ), 0) AS estoque") ); self::setOrderBy($validadeMaterialBuilder); $validadeMaterialBuilder->havingRaw('estoque > 0'); $entradasItens = $validadeMaterialBuilder->get(); $totalizadores = [ 'total' => $entradasItens->sum('estoque'), ]; return ['entradas_itens' => $entradasItens, 'totalizadores' => $totalizadores]; } private static function setOrderBy($builder) { if (is_null(request()->sortBy)) { $builder->orderBy('almoxarifado_entrada_item.id'); return; } $columns = [ 'validade' => 'almoxarifado_entrada_item.validade_lote', 'codigo_material' => 'cadastro_material.codigo_material', 'descricao' => MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ), 'lote' => 'almoxarifado_entrada_item.lote', 'tempo_validade' => DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1"), 'situacao' => DB::raw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 'A Vencer', 'Vencido')"), 'estoque' => DB::raw("COALESCE(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) ), 0)"), 'grupo' => 'cadastro_grupo.nome', 'subgrupo' => 'cadastro_subgrupo.nome' ]; $column = $columns[request()->sortBy]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC'; $builder->orderByRaw("{$column} {$direction}, almoxarifado_entrada_item.id"); } public static function list() { $now = Carbon::now(); $dataAtual = $now->format('d/m/Y'); $dataValidade = $now->addDays(90)->format('d/m/Y'); $currentLotacao = self::getCurrentLotacao(); return [ 'additionals' => [], 'form' => [ 'data_atual' => request()->dispensacao == 'true' ? $dataAtual : null, 'data_validade' => request()->dispensacao == 'true' ? $dataValidade : null, 'unidades' => Unidade::orderBy('nome_fantasia') ->whereHas('infraestruturas', function ($query) { $query->whereHas('centrosCusto'); }) ->get() ->map(fn ($unidade) => [ 'id' => $unidade->id, 'nome_fantasia' => $unidade->nome_fantasia, 'infraestruturas' => $unidade->infraestruturas() ->whereHas('centrosCusto') ->get() ->sortBy('nome') ->map(fn ($infraestrutura) => [ 'id' => $infraestrutura->id, 'nome' => $infraestrutura->nome, 'centros_custo' => $infraestrutura->centrosCusto() ->get() ->map(fn ($centroCusto) => [ 'id' => $centroCusto->id, 'setor_nome' => $centroCusto->setor->nome, ]) ->sortBy('setor_nome') ->values() ]) ->values() ]), 'grupos' => Grupo::orderBy('nome') ->get() ->map(fn ($grupo) => [ 'id' => $grupo->id, 'nome' => $grupo->nome, 'subgrupos' => $grupo->subgrupos()->orderBy('nome')->get(['id', 'nome']) ]), 'situacoes' => [ ['text' => 'A vencer', 'value' => '1'], ['text' => 'Vencido', 'value' => '2'], ], ], 'model' => [ 'periodo' => [ 'start' => null, 'end' => null, ], 'unidade_id' => request()->dispensacao == 'true' ? $currentLotacao->infraestrutura->unidade->id : null, 'infraestrutura_id' => null, 'centro_custo_id' => null, 'grupo_id' => null, 'subgrupo_id' => null, 'material' => null, 'situacao' => null, ], ]; } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['entradas_itens']; $itens->each(function ($item) { $item->validade = (new Carbon($item->validade))->format('d/m/Y'); $item->situacao = $item->tempo_validade > 0 ? 'A vencer' : 'Vencido'; }); $unidade = Unidade::find(request()->unidade_id); $infraestrutura = Infraestrutura::find(request()->infraestrutura_id); $centroCusto = CentroCusto::find(request()->centro_custo_id); $grupo = Grupo::find(request()->grupo_id); $subgrupo = Subgrupo::find(request()->subgrupo_id); $material = Material::find(request()->material_id); return [ 'inicio' => request()->periodo['start'], 'fim' => request()->periodo['end'], 'unidade' => $unidade->nome_fantasia ?? 'Todas', 'infraestrutura' => $infraestrutura->nome ?? 'Todas', 'setor' => $centroCusto->setor->nome ?? 'Todos', 'grupo' => $grupo->nome ?? 'Todos', 'subgrupo' => $subgrupo->nome ?? 'Todos', 'material' => $material->descricao_completa ?? 'Todos', 'colunas' => collect(request()->selectedCols), 'itens' => $itens, 'totalizadores' => $resultado['totalizadores'], ]; } }