0, 'tipos' => collect() ]; $periodo = [ '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) ]; $saidasBuilder = DB::table('almoxarifado_saida_item_entrada_item as saida_item_entrada_item') ->join( 'almoxarifado_entrada_item as entrada_item', 'entrada_item.id', 'saida_item_entrada_item.entrada_item_id' ) ->join( 'almoxarifado_saida_item as saida_item', 'saida_item.id', 'saida_item_entrada_item.saida_item_id' ) ->join( 'cadastro_lotacao as saida_item_lotacao', 'saida_item_lotacao.id', 'saida_item.created_lotacao_id' ) ->join( 'cadastro_usuario as saida_item_usuario', 'saida_item_usuario.id', 'saida_item_lotacao.usuario_id' ) ->join( 'cadastro_cidadao as saida_item_cidadao', 'saida_item_cidadao.id', 'saida_item_usuario.cidadao_id' ) ->join( 'almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id' ) ->join( 'cadastro_centro_custo as saida_centro_custo', 'saida_centro_custo.id', 'saida.centro_custo_id' ) ->join( 'cadastro_setor as saida_setor', 'saida_setor.id', 'saida_centro_custo.setor_id' ) ->join( 'cadastro_infraestrutura as saida_infraestrutura', 'saida_infraestrutura.id', 'saida_centro_custo.infraestrutura_id' ) ->join( 'cadastro_unidade as saida_unidade', 'saida_unidade.id', 'saida_infraestrutura.unidade_id' ) ->join( 'almoxarifado_saida_tipo as saida_tipo', 'saida_tipo.id', 'saida.tipo_id' ) ->join( 'cadastro_material as material', 'material.id', 'saida_item.material_id' ) ->join( 'cadastro_apresentacao as apresentacao', 'apresentacao.id', 'material.apresentacao_id' ) ->join( 'cadastro_grupo as grupo', 'grupo.id', 'material.grupo_id' ) ->leftJoin( 'cadastro_subgrupo as subgrupo', 'subgrupo.id', 'material.subgrupo_id' ) ->leftJoin( 'almoxarifado_saida_baixa as saida_baixa', 'saida_baixa.saida_id', 'saida.id' ) ->leftJoin( 'almoxarifado_motivo_baixa as saida_baixa_motivo', 'saida_baixa_motivo.id', 'saida_baixa.motivo_id' ) ->leftJoin( 'cadastro_usuario as saida_baixa_usuario_requisitante', 'saida_baixa_usuario_requisitante.id', 'saida_baixa.usuario_solicitante_id' ) ->leftJoin( 'cadastro_cidadao as saida_baixa_cidadao_requisitante', 'saida_baixa_cidadao_requisitante.id', 'saida_baixa_usuario_requisitante.cidadao_id' ) ->leftJoin( 'almoxarifado_saida_requisicao as saida_requisicao', 'saida_requisicao.saida_id', 'saida.id' ) ->leftJoin( 'cadastro_centro_custo as saida_requisicao_centro_custo_requisitante', 'saida_requisicao_centro_custo_requisitante.id', 'saida_requisicao.centro_custo_id' ) ->leftJoin( 'cadastro_setor as saida_requisicao_setor_requisitante', 'saida_requisicao_setor_requisitante.id', 'saida_requisicao_centro_custo_requisitante.setor_id' ) ->leftJoin( 'cadastro_infraestrutura as saida_requisicao_infraestrutura_requisitante', 'saida_requisicao_infraestrutura_requisitante.id', 'saida_requisicao_centro_custo_requisitante.infraestrutura_id' ) ->leftJoin( 'cadastro_unidade as saida_requisicao_unidade_requisitante', 'saida_requisicao_unidade_requisitante.id', 'saida_requisicao_infraestrutura_requisitante.unidade_id' ) ->leftJoin( 'cadastro_usuario as saida_requisicao_usuario_requisitante', 'saida_requisicao_usuario_requisitante.id', 'saida_requisicao.usuario_id' ) ->leftJoin( 'cadastro_cidadao as saida_requisicao_cidadao_requisitante', 'saida_requisicao_cidadao_requisitante.id', 'saida_requisicao_usuario_requisitante.cidadao_id' ) ->leftJoin( 'almoxarifado_saida_transferencia as saida_transferencia', 'saida_transferencia.saida_id', 'saida.id' ) ->leftJoin( 'cadastro_centro_custo as saida_transferencia_centro_custo_requisitante', 'saida_transferencia_centro_custo_requisitante.id', 'saida_transferencia.centro_custo_id' ) ->leftJoin( 'cadastro_setor as saida_transferencia_setor_requisitante', 'saida_transferencia_setor_requisitante.id', 'saida_transferencia_centro_custo_requisitante.setor_id' ) ->leftJoin( 'cadastro_infraestrutura as saida_transferencia_infraestrutura_requisitante', 'saida_transferencia_infraestrutura_requisitante.id', 'saida_transferencia_centro_custo_requisitante.infraestrutura_id' ) ->leftJoin( 'cadastro_unidade as saida_transferencia_unidade_requisitante', 'saida_transferencia_unidade_requisitante.id', 'saida_transferencia_infraestrutura_requisitante.unidade_id' ) ->leftJoin( 'cadastro_usuario as saida_transferencia_usuario_requisitante', 'saida_transferencia_usuario_requisitante.id', 'saida_transferencia.usuario_id' ) ->leftJoin( 'cadastro_cidadao as saida_transferencia_cidadao_requisitante', 'saida_transferencia_cidadao_requisitante.id', 'saida_transferencia_usuario_requisitante.cidadao_id' ) ->leftJoin( 'almoxarifado_requisicao_resposta as requisicao_resposta', 'requisicao_resposta.saida_id', 'saida.id' ) ->leftJoin( 'almoxarifado_requisicao as requisicao', 'requisicao.id', 'requisicao_resposta.requisicao_id' ) ->leftJoin( 'cadastro_centro_custo as requisicao_centro_custo_requisitante', 'requisicao_centro_custo_requisitante.id', 'requisicao.created_centro_custo_id' ) ->leftJoin( 'cadastro_setor as requisicao_setor_requisitante', 'requisicao_setor_requisitante.id', 'requisicao_centro_custo_requisitante.setor_id' ) ->leftJoin( 'cadastro_infraestrutura as requisicao_infraestrutura_requisitante', 'requisicao_infraestrutura_requisitante.id', 'requisicao_centro_custo_requisitante.infraestrutura_id' ) ->leftJoin( 'cadastro_unidade as requisicao_unidade_requisitante', 'requisicao_unidade_requisitante.id', 'requisicao_infraestrutura_requisitante.unidade_id' ) ->leftJoin( 'cadastro_lotacao as requisicao_lotacao_requisitante', 'requisicao_lotacao_requisitante.id', 'requisicao.created_lotacao_id' ) ->leftJoin( 'cadastro_usuario as requisicao_usuario_requisitante', 'requisicao_usuario_requisitante.id', 'requisicao_lotacao_requisitante.usuario_id' ) ->leftJoin( 'cadastro_cidadao as requisicao_cidadao_requisitante', 'requisicao_cidadao_requisitante.id', 'requisicao_usuario_requisitante.cidadao_id' ) ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'material.apresentacao_unidade_medida_id' ) ->whereNull('saida_item.estornado_em') ->where('saida.finalizada', true) ->whereBetween('saida.created_at', $periodo) ->when(request()->tipo_id, fn ($q, $id) => $q->where('saida.tipo_id', $id), fn ($q) => $q->where('saida.tipo_id', '<>', SaidaTipoEnum::ESTORNO) ) ->when(request()->unidade_id, fn ($q, $id) => $q->where('saida_unidade.id', $id)) ->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('saida_infraestrutura.id', $id)) ->when(request()->centro_custo_id, fn ($q, $id) => $q->where('saida_centro_custo.id', $id)) ->when(request()->tipo_id, fn ($q, $id) => $q->where('saida_tipo.id', $id)) ->when(request()->motivo_id, fn ($q, $id) => $q->where('saida_baixa_motivo.id', $id)) ->when(request()->usuario_saida_id, fn ($q, $id) => $q->where('saida_item_usuario.id', $id)) ->when(request()->unidade_requisitante_id, fn ($q, $id) => $q->where(fn ($q) => $q ->where('saida_requisicao_unidade_requisitante.id', $id) ->orWhere('saida_transferencia_unidade_requisitante.id', $id) ->orWhere('requisicao_unidade_requisitante.id', $id) )) ->when(request()->infraestrutura_requisitante_id, fn ($q, $id) => $q->where(fn ($q) => $q ->where('saida_requisicao_infraestrutura_requisitante.id', $id) ->orWhere('saida_transferencia_infraestrutura_requisitante.id', $id) ->orWhere('requisicao_infraestrutura_requisitante.id', $id) )) ->when(request()->centro_custo_requisitante_id, fn ($q, $id) => $q->where(fn ($q) => $q ->where('saida_requisicao_centro_custo_requisitante.id', $id) ->orWhere('saida_transferencia_centro_custo_requisitante.id', $id) ->orWhere('requisicao_centro_custo_requisitante.id', $id) )) ->when(request()->usuario_requisitante_id, fn ($q, $id) => $q->where(fn ($q) => $q ->where('saida_baixa_usuario_requisitante.id', $id) ->orWhere('saida_requisicao_usuario_requisitante.id', $id) ->orWhere('saida_transferencia_usuario_requisitante.id', $id) ->orWhere('requisicao_usuario_requisitante.id', $id) )) ->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(" saida.created_at as data_hora_saida, COALESCE( CAST(requisicao.created_at AS DATE), saida_requisicao.data ) as data_requisicao, saida_tipo.id as tipo_id, saida_tipo.nome as tipo, material.codigo_material, " . MaterialService::getDescricaoCompletaRaw( 'material', 'apresentacao', 'apresentacao_unidade_medida' ) . " as material, entrada_item.lote, entrada_item.validade_lote as validade, grupo.nome as grupo, subgrupo.nome as subgrupo, saida_baixa_motivo.descricao as motivo, saida_baixa.justificativa, saida_unidade.nome_fantasia as unidade, COALESCE(saida_infraestrutura.nome, saida_unidade.nome_fantasia) as infraestrutura, saida_setor.nome as setor, saida_item_cidadao.nome as usuario_saida, COALESCE( saida_requisicao_unidade_requisitante.nome_fantasia, saida_transferencia_unidade_requisitante.nome_fantasia, requisicao_unidade_requisitante.nome_fantasia ) as unidade_requisitante, COALESCE ( COALESCE( saida_requisicao_infraestrutura_requisitante.nome, saida_requisicao_unidade_requisitante.nome_fantasia ), COALESCE( saida_transferencia_infraestrutura_requisitante.nome, saida_transferencia_unidade_requisitante.nome_fantasia ), COALESCE( requisicao_infraestrutura_requisitante.nome, requisicao_unidade_requisitante.nome_fantasia ) ) as infraestrutura_requisitante, COALESCE ( saida_requisicao_setor_requisitante.nome, saida_transferencia_setor_requisitante.nome, requisicao_setor_requisitante.nome ) as setor_requisitante, COALESCE ( saida_baixa_cidadao_requisitante.nome, saida_requisicao_cidadao_requisitante.nome, saida_transferencia_cidadao_requisitante.nome, requisicao_cidadao_requisitante.nome ) as usuario_requisitante, saida_item_entrada_item.quantidade_saida as quantidade ")); self::setOrderBy($saidasBuilder); $saidas = $saidasBuilder->get(); $saidas->each(function ($saida) use ($totalizadores) { $totalizadores->quantidade += $saida->quantidade; $totalizadorTipo = $totalizadores->tipos->where('id', $saida->tipo_id)->first(); if (is_null($totalizadorTipo)) { $totalizadorTipo = (object) [ 'id' => $saida->tipo_id, 'nome' => $saida->tipo, 'quantidade' => 0 ]; $totalizadores->tipos->push($totalizadorTipo); } $totalizadorTipo->quantidade += $saida->quantidade; unset($saida->tipo_id); }); $totalizadores->tipos = $totalizadores->tipos->sortBy('nome')->values(); return compact('saidas', 'totalizadores'); } private static function setOrderBy($builder) { if (is_null(request()->sortBy)) { $builder->orderByRaw('saida_item_entrada_item.saida_item_id, saida_item_entrada_item.entrada_item_id'); return; } $columns = [ 'data_hora_saida' => 'saida.created_at', 'data_requisicao' => 'COALESCE( requisicao.created_at, saida_requisicao.data )', 'tipo' => 'saida_tipo.nome', 'codigo_material' => 'material.codigo_material', 'material' => MaterialService::getDescricaoCompletaRaw( 'material', 'apresentacao', 'apresentacao_unidade_medida' ), 'lote' => 'entrada_item.lote', 'validade' => 'entrada_item.validade_lote', 'grupo' => 'grupo.nome', 'subgrupo' => 'subgrupo.nome', 'motivo' => 'saida_baixa_motivo.descricao', 'justificativa' => 'saida_baixa.justificativa', 'unidade' => 'saida_unidade.nome_fantasia', 'infraestrutura' => 'COALESCE( saida_infraestrutura.nome, saida_unidade.nome_fantasia )', 'setor' => 'saida_setor.nome', 'usuario_saida' => 'saida_item_cidadao.nome', 'unidade_requisitante' => 'COALESCE( saida_requisicao_unidade_requisitante.nome_fantasia, saida_transferencia_unidade_requisitante.nome_fantasia, requisicao_unidade_requisitante.nome_fantasia )', 'infraestrutura_requisitante' => 'COALESCE ( COALESCE( saida_requisicao_infraestrutura_requisitante.nome, saida_requisicao_unidade_requisitante.nome_fantasia ), COALESCE( saida_transferencia_infraestrutura_requisitante.nome, saida_transferencia_unidade_requisitante.nome_fantasia ), COALESCE( requisicao_infraestrutura_requisitante.nome, requisicao_unidade_requisitante.nome_fantasia ) )', 'setor_requisitante' => 'COALESCE ( saida_requisicao_setor_requisitante.nome, saida_transferencia_setor_requisitante.nome, requisicao_setor_requisitante.nome )', 'usuario_requisitante' => 'COALESCE ( saida_baixa_cidadao_requisitante.nome, saida_requisicao_cidadao_requisitante.nome, saida_transferencia_cidadao_requisitante.nome, requisicao_cidadao_requisitante.nome )', 'quantidade' => 'saida_item_entrada_item.quantidade_saida', ]; $column = $columns[request()->sortBy]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC'; $builder->orderByRaw( "{$column} {$direction}, 'saida_item_entrada_item.saida_item_id, saida_item_entrada_item.entrada_item_id'" ); } 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'] = $unidadesData['model']; }, 'infraestrutura' => function () use ($data, $params) { $infraestruturasData = self::getInfraestruturasData($params); $data->form['infraestruturas'] = $infraestruturasData['form']; $data->model['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'] = $centrosDeCustoData['model']; }, 'tipo' => function () use ($data, $params) { $tiposSaidaData = self::getTiposSaidaData($params); $data->form['tipos'] = $tiposSaidaData['form']; $data->model['tipo_id'] = $tiposSaidaData['model']; }, 'motivo' => function () use ($data, $params) { $motivosBaixaData = self::getMotivosBaixaData($params); $data->form['motivos'] = $motivosBaixaData['form']; $data->model['motivo_id'] = $motivosBaixaData['model']; }, 'usuario_saida' => function () use ($data, $params) { $usuariosQueRealizaramSaidaData = self::getUsuariosQueRealizaramSaidaData($params); $data->form['usuarios_saida'] = $usuariosQueRealizaramSaidaData['form']; $data->model['usuario_saida_id'] = $usuariosQueRealizaramSaidaData['model']; }, 'unidade_requisitante' => function () use ($data, $params) { $unidadesRequisitantesData = self::getUnidadesRequisitantesData($params); $data->form['unidades_requisitantes'] = $unidadesRequisitantesData['form']; $data->model['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'] = $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'] = $centrosDeCustoRequisitantesData['model']; }, 'usuario_requisitante' => function () use ($data, $params) { $usuariosRequisitantesData = self::getUsuariosRequisitantesData($params); $data->form['usuarios_requisitantes'] = $usuariosRequisitantesData['form']; $data->model['usuario_requisitante_id'] = $usuariosRequisitantesData['model']; }, 'grupo' => function () use ($data, $params) { $gruposData = self::getGruposData($params); $data->form['grupos'] = $gruposData['form']; $data->model['grupo_id'] = $gruposData['model']; }, 'subgrupo' => function () use ($data, $params) { $subgruposData = self::getSubgruposData($params); $data->form['subgrupos'] = $subgruposData['form']; $data->model['subgrupo_id'] = $subgruposData['model']; }, 'material' => function () use ($data) { $data->model['material'] = null; } ]; $load = is_null(request()->load_from); if ($load) { $data->additionals = [ 'data_atual' => Carbon::now()->format('d/m/Y'), 'is_almoxarifado' => self::getCurrentCentroCusto()->setor->tipo_id === SetorTipo::ALMOXARIFADO, ]; } 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 = request()->only([ 'periodo', 'unidade_id', 'infraestrutura_id', 'centro_custo_id', 'tipo_id', 'motivo_id', 'usuario_saida_id', 'unidade_requisitante_id', 'infraestrutura_requisitante_id', 'centro_custo_requisitante_id', 'usuario_requisitante_id', 'grupo_id', 'subgrupo_id', ]); 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; $centroCustoLogado = self::getCurrentCentroCusto(); $isAlmoxarifado = $centroCustoLogado->setor->tipo_id === SetorTipo::ALMOXARIFADO; if (!$isAlmoxarifado) { $unidades->push((object) [ 'id' => $centroCustoLogado->infraestrutura->unidade->id, 'nome_fantasia' => $centroCustoLogado->infraestrutura->unidade->nome_fantasia, ]); $id = $centroCustoLogado->infraestrutura->unidade->id; } else if (!is_null($params['periodo'])) { $unidades = Unidade::whereHas('infraestruturas', fn ($q) => $q ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoSaida($q, $params))) ->orderBy('nome_fantasia') ->get(['id', 'nome_fantasia']); } return ['form' => $unidades, 'model' => $id]; } private static function getInfraestruturasData($params) { $infraestruturas = collect(); $id = null; $centroCustoLogado = self::getCurrentCentroCusto(); $isAlmoxarifado = $centroCustoLogado->setor->tipo_id === SetorTipo::ALMOXARIFADO; if (!$isAlmoxarifado) { $infraestruturas->push((object) [ 'id' => $centroCustoLogado->infraestrutura->id, 'nome' => $centroCustoLogado->infraestrutura->nome, ]); $id = $centroCustoLogado->infraestrutura->id; } else if (!is_null($params['periodo']) && !is_null($params['unidade_id'])) { $infraestruturas = Infraestrutura::setEagerLoads([]) ->where('unidade_id', $params['unidade_id']) ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoSaida($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; $centroCustoLogado = self::getCurrentCentroCusto(); $isAlmoxarifado = $centroCustoLogado->setor->tipo_id === SetorTipo::ALMOXARIFADO; if (!$isAlmoxarifado) { $centrosCusto->push((object) [ 'id' => $centroCustoLogado->id, 'setor_nome' => $centroCustoLogado->setor->nome, ]); $id = $centroCustoLogado->id; } else if (!is_null($params['periodo']) && !is_null($params['infraestrutura_id'])) { $centrosCusto = CentroCusto::where('infraestrutura_id', $params['infraestrutura_id']) ->where(fn ($q) => self::setWhereForFilterCentroCustoSaida($q, $params)) ->get(['id', 'setor_id']) ->map(fn ($cc) => [ 'id' => $cc->id, 'setor_nome' => $cc->setor()->first(['nome'])->nome ]) ->sortBy('setor_nome') ->values(); } return ['form' => $centrosCusto, 'model' => $id]; } private static function setWhereForFilterCentroCustoSaida($query, $params) { return $query->whereHas('almoxarifadoSaidas', fn ($q) => $q ->where('finalizada', true) ->where('tipo_id', '<>', SaidaTipoEnum::ESTORNO) ->whereBetween('created_at', $params['periodo']) ->whereHas('itens', fn ($q) => $q->whereNull('estornado_em')) ); } private static function getTiposSaidaData($params) { $tipos = collect(); $id = null; if (!is_null($params['periodo'])) { $tipos = SaidaTipo::where('id', '<>', SaidaTipoEnum::ESTORNO) ->whereHas('saidas', fn ($q) => self::setWhereForSelectedCentroCustoSaida($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params['periodo']) ->whereHas('itens', fn ($q) => $q->whereNull('estornado_em')) ) ->orderBy('nome') ->get(['id', 'nome']); } return ['form' => $tipos, 'model' => $id]; } private static function getMotivosBaixaData($params) { $motivos = collect(); $id = null; if (!is_null($params['periodo']) && $params['tipo_id'] == SaidaTipoEnum::BAIXA) { $motivos = MotivoBaixa::whereHas('baixas', fn ($q) => $q ->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoSaida($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params['periodo']) ->whereHas('itens', fn ($q) => $q->whereNull('estornado_em')) )) ->orderBy('descricao') ->get(['id', 'tipo_id', 'descricao']); } return ['form' => $motivos, 'model' => $id]; } private static function getUsuariosQueRealizaramSaidaData($params) { $usuarios = collect(); $id = null; if (!is_null($params['periodo'])) { $usuarios = Usuario::setEagerLoads([]) ->whereHas('lotacoes', fn ($q) => $q ->whereHas('almoxarifadoSaidaItens', fn ($q) => $q ->whereNull('estornado_em') ->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoSaida($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params['periodo']) ->when($params['tipo_id'], fn ($q, $tipoId) => $q->where('tipo_id', $tipoId), fn ($q) => $q->where('tipo_id', '<>', SaidaTipoEnum::ESTORNO) ) ->when($params['motivo_id'], fn ($q, $motivoId) => $q ->whereHas('baixa', fn ($q) => $q->where('motivo_id', $motivoId)) ) ) ) ) ->get(['id', 'cidadao_id']) ->map(fn ($u) => [ 'id' => $u->id, 'nome' => $u->cidadao()->setEagerLoads([])->first(['nome'])->nome ]) ->sortBy('nome') ->values(); } return ['form' => $usuarios, 'model' => $id]; } private static function getUnidadesRequisitantesData($params) { $unidades = collect(); $id = null; $tipos = collect([ SaidaTipoEnum::INVENTARIO, SaidaTipoEnum::BAIXA, SaidaTipoEnum::DISPENSACAO_FARMACIA ]); if (!is_null($params['periodo']) && !$tipos->contains($params['tipo_id'])) { $unidades = Unidade::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::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()->first(['nome'])->nome ]) ->sortBy('setor_nome') ->values(); } return ['form' => $centrosCusto, 'model' => $id]; } private static function setWhereForFilterCentroCustoRequisitante($query, $params) { $setWhereSaida = fn ($query) => $query ->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoSaida($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params['periodo']) ->whereHas('itens', fn ($q) => $q ->whereNull('estornado_em') ->when($params['usuario_saida_id'], fn ($q, $usuarioId) => $q ->whereHas('createdLotacao', fn ($q) => $q->where('usuario_id', $usuarioId)) ) ) ); $setWhereSaidaManual = fn ($query) => $query ->whereHas('almoxarifadoSaidaRequisicoes', fn ($q) => $setWhereSaida($q)); $setWhereTransferencia = fn ($query) => $query ->whereHas('almoxarifadoSaidaTransferencias', fn ($q) => $setWhereSaida($q)); $setWhereRequisicao = fn ($query) => $query ->whereHas('almoxarifadoRequisicoesRequisitante', fn ($q) => $q ->whereHas('respostas', fn ($q) => $setWhereSaida($q)) ); return $query->when($params['tipo_id'], fn ($q, $tipoId) => $q ->when($tipoId == SaidaTipoEnum::MANUAL, fn ($q) => $setWhereSaidaManual($q)) ->when($tipoId == SaidaTipoEnum::TRANSFERENCIA, fn ($q) => $setWhereTransferencia($q)) ->when($tipoId == SaidaTipoEnum::REQUISICAO, fn ($q) => $setWhereRequisicao($q)), fn ($q) => $q->where(fn ($q) => $q ->where(fn ($q) => $setWhereSaidaManual($q)) ->orWhere(fn ($q) => $setWhereTransferencia($q)) ->orWhere(fn ($q) => $setWhereRequisicao($q)) ) ); } private static function getUsuariosRequisitantesData($params) { $usuarios = collect(); $id = null; $tipos = collect([ SaidaTipoEnum::INVENTARIO, SaidaTipoEnum::DISPENSACAO_FARMACIA ]); if (!is_null($params['periodo']) && !$tipos->contains($params['tipo_id']) && ($params['tipo_id'] != SaidaTipoEnum::BAIXA || ( $params['tipo_id'] == SaidaTipoEnum::BAIXA && ( is_null($params['motivo_id']) || (MotivoBaixa::find($params['motivo_id'])->tipo_id === MotivoBaixaTipo::CONSUMO_INTERNO) ) )) ) { $setWhereSaida = fn ($query) => $query->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoSaida($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params['periodo']) ->whereHas('itens', fn ($q) => $q ->whereNull('estornado_em') ->when($params['usuario_saida_id'], fn ($q, $usuarioId) => $q ->whereHas('createdLotacao', fn ($q) => $q->where('usuario_id', $usuarioId)) ) ) ); $setWhereSaidaManual = fn ($query) => $query ->whereHas('almoxarifadoSaidaRequisicoes', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($setWhereSaida($q), $params) ); $setWhereTransferencia = fn ($query) => $query ->whereHas('almoxarifadoSaidaTransferencias', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($setWhereSaida($q), $params) ); $setWhereRequisicao = fn ($query) => $query ->whereHas('lotacoes', fn ($q) => $q ->whereHas('almoxarifadoRequisicoesRequisitante', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($q, $params, true) ->whereHas('respostas', fn ($q) => $setWhereSaida($q)) ) ); $setWhereBaixa = fn ($query) => $query ->whereHas('almoxarifadoSaidaBaixas', fn ($q) => $setWhereSaida($q) ->when($params['motivo_id'], fn ($q, $motivoId) => $q->where('motivo_id', $motivoId)) ); $usuarios = Usuario::setEagerLoads([]) ->when($params['tipo_id'], fn ($q, $tipoId) => $q ->when($tipoId == SaidaTipoEnum::MANUAL, fn ($q) => $setWhereSaidaManual($q)) ->when($tipoId == SaidaTipoEnum::TRANSFERENCIA, fn ($q) => $setWhereTransferencia($q)) ->when($tipoId == SaidaTipoEnum::REQUISICAO, fn ($q) => $setWhereRequisicao($q)) ->when($tipoId == SaidaTipoEnum::BAIXA, fn ($q) => $setWhereBaixa($q)), fn ($q) => $q->where(fn ($q) => $q ->where(fn ($q) => $setWhereSaidaManual($q)) ->orWhere(fn ($q) => $setWhereTransferencia($q)) ->orWhere(fn ($q) => $setWhereRequisicao($q)) ->when(is_null($params['unidade_requisitante_id']), fn ($q) => $q ->orWhere(fn ($q) => $setWhereBaixa($q)) ) ) ) ->get(['id', 'cidadao_id']) ->map(fn ($u) => [ 'id' => $u->id, 'nome' => $u->cidadao()->setEagerLoads([])->first(['nome'])->nome ]) ->sortBy('nome') ->values(); } return ['form' => $usuarios, 'model' => $id]; } private static function getGruposData($params) { $grupos = collect(); $id = null; if (!is_null($params['periodo'])) { $grupos = Grupo::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::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 setWhereForFilterMaterial($query, $params) { $setWhereSaidaManual = fn ($query) => $query->whereHas('requisicao', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($q, $params) ->when($params['usuario_requisitante_id'], fn ($q, $usuarioId) => $q ->where('usuario_id', $usuarioId) ) ); $setWhereTransferencia = fn ($query) => $query->whereHas('transferencia', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($q, $params) ->when($params['usuario_requisitante_id'], fn ($q, $usuarioId) => $q ->where('usuario_id', $usuarioId) ) ); $setWhereRequisicao = fn ($query) => $query->whereHas('requisicaoResposta', fn ($q) => $q ->whereHas('requisicao', fn ($q) => self::setWhereForSelectedCentroCustoRequisitante($q, $params, true) ->when($params['usuario_requisitante_id'], fn ($q, $usuarioId) => $q ->whereHas('createdLotacao', fn ($q) => $q ->where('usuario_id', $usuarioId) ) ) ) ); $setWhereBaixa = fn ($query) => $query->whereHas('baixa', fn ($q) => $q ->when($params['motivo_id'], fn ($q, $motivoId) => $q->where('motivo_id', $motivoId)) ->when($params['usuario_requisitante_id'], fn ($q, $usuarioId) => $q ->where('usuario_solicitante_id', $usuarioId) ) ); $query->whereHas('almoxarifadoSaidaItens', fn ($q) => $q ->whereNull('estornado_em') ->when($params['usuario_saida_id'], fn ($q, $usuarioId) => $q ->whereHas('createdLotacao', fn ($q) => $q->where('usuario_id', $usuarioId)) ) ->whereHas('saida', fn ($q) => self::setWhereForSelectedCentroCustoSaida($q, $params) ->where('finalizada', true) ->whereBetween('created_at', $params['periodo']) ->when($params['tipo_id'], fn ($q, $tipoId) => $q ->where('tipo_id', $tipoId) ->when($tipoId == SaidaTipoEnum::MANUAL, fn ($q) => $setWhereSaidaManual($q)) ->when($tipoId == SaidaTipoEnum::TRANSFERENCIA, fn ($q) => $setWhereTransferencia($q)) ->when($tipoId == SaidaTipoEnum::REQUISICAO, fn ($q) => $setWhereRequisicao($q)) ->when($tipoId == SaidaTipoEnum::BAIXA, fn ($q) => $setWhereBaixa($q)), fn ($q) => $q ->where('tipo_id', '<>', SaidaTipoEnum::ESTORNO) ->when($params['usuario_requisitante_id'], fn ($q) => $q->where(fn ($q) => $q ->where(fn ($q) => $setWhereSaidaManual($q)) ->orWhere(fn ($q) => $setWhereTransferencia($q)) ->orWhere(fn ($q) => $setWhereRequisicao($q)) ->orWhere(fn ($q) => $setWhereBaixa($q)) ), fn ($q) => $q->when($params['unidade_requisitante_id'], fn ($q) => $q->where(fn ($q) => $q ->where(fn ($q) => $setWhereSaidaManual($q)) ->orWhere(fn ($q) => $setWhereTransferencia($q)) ->orWhere(fn ($q) => $setWhereRequisicao($q)) ), fn ($q) => $q ->where(fn ($q) => $q ->where('tipo_id', '<>', SaidaTipoEnum::MANUAL) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipoEnum::MANUAL) ->where(fn ($q) => $setWhereSaidaManual($q)) ) ) ->where(fn ($q) => $q ->where('tipo_id', '<>', SaidaTipoEnum::TRANSFERENCIA) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipoEnum::TRANSFERENCIA) ->where(fn ($q) => $setWhereTransferencia($q)) ) ) ->where(fn ($q) => $q ->where('tipo_id', '<>', SaidaTipoEnum::REQUISICAO) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipoEnum::REQUISICAO) ->where(fn ($q) => $setWhereRequisicao($q)) ) ) ->where(fn ($q) => $q ->where('tipo_id', '<>', SaidaTipoEnum::BAIXA) ->orWhere(fn ($q) => $q ->where('tipo_id', SaidaTipoEnum::BAIXA) ->where(fn ($q) => $setWhereBaixa($q)) ) ) ) ) ) ) ); } private static function setWhereForSelectedCentroCustoSaida($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, $isRequisicao = false) { $centroCustoField = $isRequisicao ? 'created_centro_custo_id' : 'centro_custo_id'; $centroCustoRelation = $isRequisicao ? 'createdCentroCusto' : 'centroCusto'; 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($centroCustoRelation, 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'])) ) ) ) ); } public static function autocompleteMaterial() { $params = self::getParams(); $materiais = Material::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', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " as descricao"), 'cadastro_material.possui_lote', ); return $materiais; } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['saidas']; $itens->each(function ($item) { $item->data_hora_saida = (new Carbon($item->data_hora_saida))->format('d/m/Y H:i'); if (!is_null($item->data_requisicao)) { $item->data_requisicao = (new Carbon($item->data_requisicao))->format('d/m/Y'); } if (!is_null($item->validade)) { $item->validade = (new Carbon($item->validade))->format('d/m/Y'); } }); $tipo = SaidaTipo::find(request()->tipo_id); $motivo = MotivoBaixa::find(request()->motivo_id); $unidade = Unidade::find(request()->unidade_id); $infraestrutura = Infraestrutura::find(request()->infraestrutura_id); $centroCusto = CentroCusto::find(request()->centro_custo_id); $usuarioSaida = Usuario::find(request()->usuario_saida_id); $unidadeRequisitante = Unidade::find(request()->unidade_requisitante_id); $infraestruturaRequisitante = Infraestrutura::find(request()->infraestrutura_requisitante_id); $centroCustoRequisitante = CentroCusto::find(request()->centro_custo_requisitante_id); $usuarioRequisitante = Usuario::find(request()->usuario_requisitante_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'], 'tipo' => $tipo->nome ?? 'Todos', 'motivo' => $motivo->descricao ?? 'Todos', 'unidade' => $unidade->nome_fantasia ?? 'Todas', 'infraestrutura' => $infraestrutura->nome ?? 'Todos', 'setor' => $centroCusto->setor->nome ?? 'Todos', 'usuarioSaida' => $usuarioSaida->cidadao->nome ?? 'Todos', 'unidadeRequisitante' => $unidadeRequisitante->nome_fantasia ?? 'Todas', 'infraestruturaRequisitante' => $infraestruturaRequisitante->nome ?? 'Todos', 'setorRequisitante' => $centroCustoRequisitante->setor->nome ?? 'Todos', 'usuarioRequisitante' => $usuarioRequisitante->nome ?? 'Todos', 'grupo' => $grupo->nome ?? 'Todos', 'subgrupo' => $subgrupo->nome ?? 'Todos', 'material' => $material->descricao_completa ?? 'Todos', 'colunas' => collect(request()->selectedCols), 'itens' => $itens, 'totalizadores' => $resultado['totalizadores'], ]; } }