0, 'saldo_atual' => 0, ]; $periodo = is_null(request()->periodo) ? null : [ 'start' => Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->setTime(0, 0, 0), 'end' => Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->setTime(23, 59, 59) ]; $intervaloMeses = $periodo['end']->copy()->floorMonth() ->diffInMonths($periodo['start']->copy()->floorMonth()) + 1; $isCalculoEspecifico = request()->tipo_calculo === 'especifico'; $whereSaida = function ($query) use ($periodo) { $query->where('saida.finalizada', true) ->whereBetween('saida.created_at', $periodo) ->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura_saida_almoxarifado.unidade_id', $id)) ->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura_saida_almoxarifado.id', $id)) ->when(request()->centro_custo_id, fn ($q, $id) => $q->where('centro_custo_saida_almoxarifado.id', $id)) ->where(fn ($q) => $q ->when(is_null(request()->unidade_requisitante_id) && is_null(request()->infraestrutura_requisitante_id) && is_null(request()->centro_custo_requisitante_id), fn ($q) => $q ->where('saida.tipo_id', SaidaTipo::DISPENSACAO_FARMACIA) ->orWhere(function ($query) { $query->where('saida.tipo_id', SaidaTipo::BAIXA) ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_saida_baixa as baixa') ->join( 'almoxarifado_motivo_baixa as motivo', 'motivo.id', 'baixa.motivo_id' ) ->whereColumn('baixa.saida_id', 'saida.id') ->where('motivo.tipo_id', MotivoBaixaTipo::CONSUMO_INTERNO); }); }) ) ->orWhere(function ($query) { $query->where('saida.tipo_id', SaidaTipo::MANUAL) ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_saida_requisicao as requisicao') ->join( 'cadastro_centro_custo as centro_custo', 'centro_custo.id', 'requisicao.centro_custo_id' ) ->join( 'cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id' ) ->whereColumn('requisicao.saida_id', 'saida.id') ->when(request()->unidade_requisitante_id, fn ($q, $id) => $q ->where('infraestrutura.unidade_id', $id)) ->when(request()->infraestrutura_requisitante_id, fn ($q, $id) => $q ->where('infraestrutura.id', $id)) ->when(request()->centro_custo_requisitante_id, fn ($q, $id) => $q ->where('centro_custo.id', $id)); }); }) ->orWhere(function ($query) { $query->where('saida.tipo_id', SaidaTipo::REQUISICAO) ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_requisicao_resposta_item as resposta_item') ->join( 'almoxarifado_requisicao_resposta as resposta', 'resposta.id', 'resposta_item.requisicao_resposta_id' ) ->join( 'almoxarifado_requisicao as requisicao', 'requisicao.id', 'resposta.requisicao_id' ) ->join( 'cadastro_centro_custo as centro_custo', 'centro_custo.id', 'requisicao.created_centro_custo_id' ) ->join( 'cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id' ) ->whereColumn('resposta_item.saida_item_id', 'saida_item.id') ->where('resposta.status_id', RequisicaoRespostaStatus::RECEBIDA) ->when(request()->unidade_requisitante_id, fn ($q, $id) => $q ->where('infraestrutura.unidade_id', $id)) ->when(request()->infraestrutura_requisitante_id, fn ($q, $id) => $q ->where('infraestrutura.id', $id)) ->when(request()->centro_custo_requisitante_id, fn ($q, $id) => $q ->where('centro_custo.id', $id)) ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_requisicao_resposta_item_recebimento as recebimento') ->whereColumn('recebimento.requisicao_resposta_item_id', 'resposta_item.id') ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('controlava_estoque') ->orWhere('controlava_estoque', false) ) ->where('quantidade', '>', 0) ); }); }); }) ); }; $materiais = DB::table('cadastro_material as material') ->join( 'cadastro_grupo as grupo', 'grupo.id', 'material.grupo_id' ) ->join( 'cadastro_apresentacao as apresentacao', 'apresentacao.id', 'material.apresentacao_id' ) ->leftJoin( 'cadastro_subgrupo as subgrupo', 'subgrupo.id', 'material.subgrupo_id' ) ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'material.apresentacao_unidade_medida_id' ) ->whereExists(function ($query) use ($whereSaida) { $query->select(DB::raw(1)) ->from('almoxarifado_saida_item as saida_item') ->join( 'almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id' ) ->join( 'cadastro_centro_custo as centro_custo_saida_almoxarifado', 'centro_custo_saida_almoxarifado.id', 'saida.centro_custo_id' ) ->join( 'cadastro_infraestrutura as infraestrutura_saida_almoxarifado', 'infraestrutura_saida_almoxarifado.id', 'centro_custo_saida_almoxarifado.infraestrutura_id' ) ->whereColumn('saida_item.material_id', 'material.id') ->whereNull('saida_item.estornado_em') ->where($whereSaida); }) ->when(request()->grupo_id, fn ($q, $id) => $q->where('grupo.id', $id)) ->when(request()->subgrupo_id, fn ($q, $id) => $q->where('subgrupo.id', $id)) ->when(request()->material_id, fn ($q, $id) => $q->where('material.id', $id)) ->select(DB::raw(" material.codigo_material, " . MaterialService::getDescricaoCompletaRaw( 'material', 'apresentacao', 'apresentacao_unidade_medida' ) . " as material, grupo.nome as grupo, subgrupo.nome as subgrupo ")) ->when($isCalculoEspecifico, function ($query) use ($whereSaida) { $query->addSelect([ 'meses_consumo' => function ($query) use ($whereSaida) { $query->select(DB::raw("COUNT(DISTINCT CONCAT( EXTRACT(YEAR FROM saida.created_at), EXTRACT(MONTH FROM saida.created_at) ))")) ->from('almoxarifado_saida_item as saida_item') ->join( 'almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id' ) ->join( 'cadastro_centro_custo as centro_custo_saida_almoxarifado', 'centro_custo_saida_almoxarifado.id', 'saida.centro_custo_id' ) ->join( 'cadastro_infraestrutura as infraestrutura_saida_almoxarifado', 'infraestrutura_saida_almoxarifado.id', 'centro_custo_saida_almoxarifado.infraestrutura_id' ) ->whereColumn('saida_item.material_id', 'material.id') ->whereNull('saida_item.estornado_em') ->where($whereSaida); }, ]); }) ->addSelect([ 'total' => function ($query) use ($whereSaida) { $query->select(DB::raw("COALESCE(SUM( IF(saida.tipo_id = " . SaidaTipo::REQUISICAO . ", ( SELECT COALESCE(SUM(recebimento.quantidade), 0) FROM almoxarifado_requisicao_resposta_item_recebimento as recebimento JOIN almoxarifado_requisicao_resposta_item as resposta_item ON resposta_item.id = recebimento.requisicao_resposta_item_id WHERE resposta_item.saida_item_id = saida_item.id ), ( SELECT COALESCE(SUM(saida_item_entrada_item.quantidade_saida), 0) FROM almoxarifado_saida_item_entrada_item as saida_item_entrada_item WHERE saida_item_entrada_item.saida_item_id = saida_item.id ) ) ), 0)")) ->from('almoxarifado_saida_item as saida_item') ->join( 'almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id' ) ->join( 'cadastro_centro_custo as centro_custo_saida_almoxarifado', 'centro_custo_saida_almoxarifado.id', 'saida.centro_custo_id' ) ->join( 'cadastro_infraestrutura as infraestrutura_saida_almoxarifado', 'infraestrutura_saida_almoxarifado.id', 'centro_custo_saida_almoxarifado.infraestrutura_id' ) ->whereColumn('saida_item.material_id', 'material.id') ->whereNull('saida_item.estornado_em') ->where($whereSaida); }, 'saldo_atual' => function ($query) { $query->select(DB::raw(" COALESCE(SUM( COALESCE(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 = entrada_item.id AND almoxarifado_saida.finalizada = 1 ), 0) ), 0) ")) ->from('almoxarifado_entrada_item as entrada_item') ->join( 'almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id' ) ->join( 'cadastro_centro_custo as centro_custo', 'centro_custo.id', 'entrada.centro_custo_id' ) ->join( 'cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id' ) ->whereColumn('entrada_item.material_id', 'material.id') ->where('entrada.finalizada', true) ->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id)) ->when(request()->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id)); } ]) ->orderByRaw(MaterialService::getDescricaoCompletaRaw( 'material', 'apresentacao', 'apresentacao_unidade_medida' )) ->get(); $materiais->each(function ($material) use ($totalizadores, $intervaloMeses, $isCalculoEspecifico) { $media = $material->total / ($isCalculoEspecifico ? $material->meses_consumo : $intervaloMeses); $material->media = number_format($media, 2, ',', '.'); $totalizadores->total += $material->total; $totalizadores->saldo_atual += $material->saldo_atual; }); return compact('materiais', 'totalizadores'); } public static function list() { $data = (object) [ 'additionals' => [], 'form' => [], 'model' => [], ]; $params = self::getParams(); $sets = [ 'periodo' => function () use ($data) { $data->model['periodo'] = ['start' => null, 'end' => null]; }, 'unidade' => function () use ($data, $params) { $unidadesData = self::getUnidadesData($params); $data->form['unidades'] = $unidadesData['form']; $data->model['unidade_id'] = $params->unidade_id = $unidadesData['model']; }, 'infraestrutura' => function () use ($data, $params) { $infraestruturasData = self::getInfraestruturasData($params); $data->form['infraestruturas'] = $infraestruturasData['form']; $data->model['infraestrutura_id'] = $params->infraestrutura_id = $infraestruturasData['model']; }, 'centro_custo' => function () use ($data, $params) { $centrosDeCustoData = self::getCentrosDeCustoData($params); $data->form['centros_custo'] = $centrosDeCustoData['form']; $data->model['centro_custo_id'] = $params->centro_custo_id = $centrosDeCustoData['model']; }, 'unidade_requisitante' => function () use ($data, $params) { $unidadesRequisitantesData = self::getUnidadesRequisitantesData($params); $data->form['unidades_requisitantes'] = $unidadesRequisitantesData['form']; $data->model['unidade_requisitante_id'] = $params->unidade_requisitante_id = $unidadesRequisitantesData['model']; }, 'infraestrutura_requisitante' => function () use ($data, $params) { $infraestruturasRequisitantesData = self::getInfraestruturasRequisitantesData($params); $data->form['infraestruturas_requisitantes'] = $infraestruturasRequisitantesData['form']; $data->model['infraestrutura_requisitante_id'] = $params->infraestrutura_requisitante_id = $infraestruturasRequisitantesData['model']; }, 'centro_custo_requisitante' => function () use ($data, $params) { $centrosDeCustoRequisitantesData = self::getCentrosDeCustoRequisitantesData($params); $data->form['centros_custo_requisitantes'] = $centrosDeCustoRequisitantesData['form']; $data->model['centro_custo_requisitante_id'] = $params->centro_custo_requisitante_id = $centrosDeCustoRequisitantesData['model']; }, 'grupo' => function () use ($data, $params) { $gruposData = self::getGruposData($params); $data->form['grupos'] = $gruposData['form']; $data->model['grupo_id'] = $params->grupo_id = $gruposData['model']; }, 'subgrupo' => function () use ($data, $params) { $subgruposData = self::getSubgruposData($params); $data->form['subgrupos'] = $subgruposData['form']; $data->model['subgrupo_id'] = $params->subgrupo_id = $subgruposData['model']; }, 'material' => function () use ($data, $params) { $data->model['material'] = $params->material_id = null; }, 'tipo_calculo' => function () use ($data, $params) { $tiposCalculoData = self::getTiposCalculoData(); $data->form['tipos_calculo'] = $tiposCalculoData['form']; $data->model['tipo_calculo'] = $params->tipo_calculo ?? $tiposCalculoData['model']; }, ]; $load = is_null(request()->load_from); if ($load) { $data->additionals = [ 'data_atual' => Carbon::now()->format('d/m/Y'), ]; } foreach ($sets as $field => $set) { if ($load) { $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([ 'periodo', 'unidade_id', 'infraestrutura_id', 'centro_custo_id', 'unidade_requisitante_id', 'infraestrutura_requisitante_id', 'centro_custo_requisitante_id', 'grupo_id', 'subgrupo_id', 'tipo_calculo', ]); if (isset($params->periodo) && !is_null($params->periodo['start']) && !is_null($params->periodo['end']) ) { $start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->setTime(0, 0, 0); $end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->setTime(23, 59, 59); $params->periodo['start'] = $start; $params->periodo['end'] = $end; } else { $params->periodo = null; } return $params; } private static function getUnidadesData($params) { $unidades = collect(); $id = null; if (!is_null($params->periodo)) { $unidades = Unidade::setEagerLoads([]) ->whereHas('infraestruturas', fn ($q) => $q ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoAlmoxarifado($q, $params)) ) ->orderBy('nome_fantasia') ->get(['id', 'nome_fantasia']); } return ['form' => $unidades, 'model' => $id]; } private static function getInfraestruturasData($params) { $infraestruturas = collect(); $id = null; if (!is_null($params->periodo) && !is_null($params->unidade_id)) { $infraestruturas = Infraestrutura::setEagerLoads([]) ->where('unidade_id', $params->unidade_id) ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoAlmoxarifado($q, $params)) ->get(['id', 'nome', 'principal', 'unidade_id']) ->map(fn ($i) => ['id' => $i->id, 'nome' => $i->nome]) ->sortBy('nome') ->values(); } return ['form' => $infraestruturas, 'model' => $id]; } private static function getCentrosDeCustoData($params) { $centrosCusto = collect(); $id = null; if (!is_null($params->periodo) && !is_null($params->infraestrutura_id)) { $centrosCusto = CentroCusto::setEagerLoads([]) ->where('infraestrutura_id', $params->infraestrutura_id) ->where(fn ($q) => self::setWhereForFilterCentroCustoAlmoxarifado($q, $params)) ->get(['id', 'setor_id']) ->map(fn ($cc) => [ 'id' => $cc->id, 'setor_nome' => $cc->setor()->setEagerLoads([])->first(['nome'])->nome ]) ->sortBy('setor_nome') ->values(); } return ['form' => $centrosCusto, 'model' => $id]; } private static function setWhereForFilterCentroCustoAlmoxarifado($query, $params) { return $query->whereHas('almoxarifadoSaidas', fn ($q) => $q ->where('finalizada', true) ->whereBetween('created_at', $params->periodo) ->whereHas('itens', fn ($q) => $q->whereNull('estornado_em')) ->where(fn ($q) => $q ->whereIn('tipo_id', [SaidaTipo::MANUAL, SaidaTipo::DISPENSACAO_FARMACIA]) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipo::BAIXA) ->whereHas('baixa', fn ($q) => $q ->whereHas('motivo', fn ($q) => $q ->where('tipo_id', MotivoBaixaTipo::CONSUMO_INTERNO) ) ) ) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipo::REQUISICAO) ->whereHas('requisicaoResposta', fn ($q) => $q ->where('status_id', RequisicaoRespostaStatus::RECEBIDA) ->whereHas('itens', fn ($q) => $q ->whereHas('recebimentos', fn ($q) => $q ->where(fn ($q) => $q ->whereNull('controlava_estoque') ->orWhere('controlava_estoque', false) ) ->where('quantidade', '>', 0) ) ) ) ) ) ); } private static function getUnidadesRequisitantesData($params) { $unidades = collect(); $id = null; if (!is_null($params->periodo)) { $unidades = Unidade::setEagerLoads([]) ->whereHas('infraestruturas', fn ($q) => $q ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoRequisitante($q, $params)) ) ->orderBy('nome_fantasia') ->get(['id', 'nome_fantasia']); } return ['form' => $unidades, 'model' => $id]; } private static function getInfraestruturasRequisitantesData($params) { $infraestruturas = collect(); $id = null; if (!is_null($params->periodo) && !is_null($params->unidade_requisitante_id)) { $infraestruturas = Infraestrutura::setEagerLoads([]) ->where('unidade_id', $params->unidade_requisitante_id) ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoRequisitante($q, $params)) ->get(['id', 'nome', 'principal', 'unidade_id']) ->map(fn ($i) => ['id' => $i->id, 'nome' => $i->nome]) ->sortBy('nome') ->values(); } return ['form' => $infraestruturas, 'model' => $id]; } private static function getCentrosDeCustoRequisitantesData($params) { $centrosCusto = collect(); $id = null; if (!is_null($params->periodo) && !is_null($params->infraestrutura_requisitante_id)) { $centrosCusto = CentroCusto::setEagerLoads([]) ->where('infraestrutura_id', $params->infraestrutura_requisitante_id) ->where(fn ($q) => self::setWhereForFilterCentroCustoRequisitante($q, $params)) ->get(['id', 'setor_id']) ->map(fn ($cc) => [ 'id' => $cc->id, 'setor_nome' => $cc->setor()->setEagerLoads([])->first(['nome'])->nome ]) ->sortBy('setor_nome') ->values(); } return ['form' => $centrosCusto, 'model' => $id]; } private static function setWhereForFilterCentroCustoRequisitante($query, $params) { return $query->whereHas('almoxarifadoSaidaRequisicoes', fn ($q) => $q ->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoAlmoxarifado($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params->periodo) ->whereHas('itens', fn ($q) => $q->whereNull('estornado_em')) ) ) ->orWhereHas('almoxarifadoRequisicoesRequisitante', fn ($q) => $q ->whereHas('respostas', fn ($q) => $q ->where('status_id', RequisicaoRespostaStatus::RECEBIDA) ->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoAlmoxarifado($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params->periodo) ->whereHas('itens', fn ($q) => $q->whereNull('estornado_em')) ) ->whereHas('itens', fn ($q) => $q ->whereHas('recebimentos', fn ($q) => $q ->where(fn ($q) => $q ->whereNull('controlava_estoque') ->orWhere('controlava_estoque', false) ) ->where('quantidade', '>', 0) ) ) ) ); } private static function getGruposData($params) { $grupos = collect(); $id = null; if (!is_null($params->periodo)) { $grupos = Grupo::setEagerLoads([]) ->whereHas('materiais', fn ($q) => self::setWhereForFilterMaterial($q, $params)) ->orderBy('nome') ->get(['id', 'nome']); } return ['form' => $grupos, 'model' => $id]; } private static function getSubgruposData($params) { $subgrupos = collect(); $id = null; if (!is_null($params->periodo) && !is_null($params->grupo_id)) { $subgrupos = Subgrupo::setEagerLoads([]) ->where('grupo_id', $params->grupo_id) ->whereHas('materiais', fn ($q) => self::setWhereForFilterMaterial($q, $params)) ->orderBy('nome') ->get(['id', 'nome']); } return ['form' => $subgrupos, 'model' => $id]; } public static function autocompleteMaterial() { $params = self::getParams(); $materiais = Material::setEagerLoads([]) ->when($params->grupo_id, fn ($q, $grupoId) => $q->where('grupo_id', $grupoId)) ->when($params->subgrupo_id, fn ($q, $subgrupoId) => $q->where('subgrupo_id', $subgrupoId)) ->where(fn ($q) => self::setWhereForFilterMaterial($q, $params)) ->getQuery() ->join( 'cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id' ) ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id' ) ->select( 'cadastro_material.id', 'cadastro_material.codigo_material', 'cadastro_material.descricao', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " as descricao"), ); return $materiais; } public static function setWhereForFilterMaterial($query, $params) { return $query->whereHas('almoxarifadoSaidaItens', fn ($q) => $q ->whereNull('estornado_em') ->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoAlmoxarifado($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params->periodo) ->where(fn ($q) => $q ->when(is_null($params->unidade_requisitante_id) && is_null($params->infraestrutura_requisitante_id) && is_null($params->centro_custo_requisitante_id), fn ($q) => $q ->where('tipo_id', SaidaTipo::DISPENSACAO_FARMACIA) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipo::BAIXA) ->whereHas('baixa', fn ($q) => $q ->whereHas('motivo', fn ($q) => $q ->where('tipo_id', MotivoBaixaTipo::CONSUMO_INTERNO) ) ) ) ) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipo::MANUAL) ->whereHas('requisicao', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($q, $params, 'centro_custo_id') ) ) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipo::REQUISICAO) ->whereHas('requisicaoResposta', fn ($q) => $q ->where('status_id', RequisicaoRespostaStatus::RECEBIDA) ->whereHas('requisicao', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($q, $params, 'created_centro_custo_id') ) ) ) ) ) ->where(fn ($q) => $q ->doesntHave('requisicaoRespostaItem') ->orWhereHas('requisicaoRespostaItem', fn ($q) => $q ->whereHas('recebimentos', fn ($q) => $q ->where(fn ($q) => $q ->whereNull('controlava_estoque') ->orWhere('controlava_estoque', false) ) ->where('quantidade', '>', 0) ) ) ) ); } private static function setWhereForSelectedCentroCustoAlmoxarifado($query, $params) { return $query->when($params->centro_custo_id, fn ($q, $centroCustoId) => $q->where('centro_custo_id', $centroCustoId), fn ($q) => $q->when(!is_null($params->infraestrutura_id) || !is_null($params->unidade_id), fn ($q) => $q->whereHas('centroCusto', fn ($q) => $q ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('infraestrutura_id', $infraestruturaId), fn ($q) => $q->whereHas('infraestrutura', fn ($q) => $q ->where('unidade_id', $params->unidade_id)) ) ) ) ); } private static function setWhereForSelectedCentroCustoRequisitante($query, $params, $centroCustoField) { return $query->when($params->centro_custo_requisitante_id, fn ($q, $centroCustoId) => $q->where($centroCustoField, $centroCustoId), fn ($q) => $q->when(!is_null($params->infraestrutura_requisitante_id) || !is_null($params->unidade_requisitante_id), fn ($q) => $q->whereHas('centroCusto', fn ($q) => $q ->when($params->infraestrutura_requisitante_id, fn ($q, $infraestruturaId) => $q->where('infraestrutura_id', $infraestruturaId), fn ($q) => $q->whereHas('infraestrutura', fn ($q) => $q ->where('unidade_id', $params->unidade_requisitante_id)) ) ) ) ); } private static function getTiposCalculoData() { return ['form' => self::getTiposCalculo(), 'model' => 'simples']; } private static function getTiposCalculo() { return collect([ (object) ['value' => 'especifico', 'text' => 'ESPECÍFICO'], (object) ['value' => 'simples', 'text' => 'SIMPLES'], ]); } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['materiais']; $unidade = Unidade::find(request()->unidade_id); $infraestrutura = Infraestrutura::find(request()->infraestrutura_id); $centroCusto = CentroCusto::find(request()->centro_custo_id); $unidadeRequisitante = Unidade::find(request()->unidade_requisitante_id); $infraestruturaRequisitante = Infraestrutura::find(request()->infraestrutura_requisitante_id); $centroCustoRequisitante = CentroCusto::find(request()->centro_custo_requisitante_id); $grupo = Grupo::find(request()->grupo_id); $subgrupo = Subgrupo::find(request()->subgrupo_id); $material = Material::find(request()->material_id); $tipoCalculo = self::getTiposCalculo()->where('value', request()->tipo_calculo)->first(); return [ 'inicio' => request()->periodo['start'], 'fim' => request()->periodo['end'], 'unidade' => $unidade->nome_fantasia ?? 'Todas', 'infraestrutura' => $infraestrutura->nome ?? 'Todos', 'setor' => $centroCusto->setor->nome ?? 'Todos', 'unidadeRequisitante' => $unidadeRequisitante->nome_fantasia ?? 'Todas', 'infraestruturaRequisitante' => $infraestruturaRequisitante->nome ?? 'Todos', 'setorRequisitante' => $centroCustoRequisitante->setor->nome ?? 'Todos', 'grupo' => $grupo->nome ?? 'Todos', 'subgrupo' => $subgrupo->nome ?? 'Todos', 'material' => $material->descricao_completa ?? 'Todos', 'tipoCalculo' => $tipoCalculo->text, 'colunas' => collect(request()->selectedCols), 'itens' => $itens, 'totalizadores' => $resultado['totalizadores'], ]; } }