0, ]; $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) ]; $dispensacoes = DB::table('farmacia_receita_item_entrega as entrega') ->join( 'cadastro_centro_custo as centro_custo', 'centro_custo.id', 'entrega.created_centro_custo_id' ) ->join( 'cadastro_setor as setor', 'setor.id', 'centro_custo.setor_id' ) ->join( 'cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id' ) ->join( 'cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id' ) ->join( 'farmacia_receita_item as item', 'item.id', 'entrega.receita_item_id' ) ->join( 'cadastro_material as material', 'material.id', 'item.material_id' ) ->join( 'cadastro_apresentacao as apresentacao', 'apresentacao.id', 'material.apresentacao_id' ) ->join( 'cadastro_grupo as grupo', 'grupo.id', 'material.grupo_id' ) ->join( 'farmacia_receita as receita', 'receita.id', 'item.receita_id' ) ->join( 'cadastro_usuario as usuario_solicitante', 'usuario_solicitante.id', 'receita.usuario_id' ) ->join( 'cadastro_cidadao as cidadao_solicitante', 'cidadao_solicitante.id', 'usuario_solicitante.cidadao_id' ) ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'material.apresentacao_unidade_medida_id' ) ->leftJoin( 'cadastro_subgrupo as subgrupo', 'subgrupo.id', 'material.subgrupo_id' ) ->where('entrega.pendente', false) ->where('entrega.estornado', false) ->whereBetween('entrega.created_at', $periodo) ->when(request()->is_receita_sus, fn ($q, $value) => $q->where('receita.is_receita_sus', DataUtil::getBooleanValueFromStringBoolean($value)) ) ->when(request()->unidade_id, fn ($q, $id) => $q->where('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)) ->when(request()->usuario_solicitante_id, fn ($q, $id) => $q->where('usuario_solicitante.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(" IF (receita.is_receita_sus = 1, 'SUS', 'OUTRAS') as tipo_receita, unidade.nome_fantasia as unidade, COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura, setor.nome as setor, cidadao_solicitante.nome as usuario_solicitante, grupo.nome as grupo, subgrupo.nome as subgrupo, " . MaterialService::getDescricaoCompletaRaw( 'material', 'apresentacao', 'apresentacao_unidade_medida' ) . " as material, entrega.quantidade ")) ->get(); $dispensacoes->each(function ($dispensacao) use ($totalizadores) { $totalizadores->quantidade += $dispensacao->quantidade; }); return compact('dispensacoes', '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'] = $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']; }, 'usuario_solicitante' => function () use ($data, $params) { $usuariosData = self::getUsuariosSolicitantesData($params); $data->form['usuarios_solicitantes'] = $usuariosData['form']; $data->model['usuario_solicitante_id'] = $usuariosData['model']; }, 'tipo_receita' => function () use ($data, $params) { $tiposReceitaData = self::getTiposReceitaData($params); $data->form['tipos_receita'] = $tiposReceitaData['form']; $data->model['is_receita_sus'] = $tiposReceitaData['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'), ]; } 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', 'usuario_solicitante_id', 'is_receita_sus', '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; } if (isset($params['is_receita_sus'])) { $params['is_receita_sus'] = DataUtil::getBooleanValueFromStringBoolean($params['is_receita_sus']); } return $params; } private static function getUnidadesData($params) { $unidades = collect(); $id = null; if (!is_null($params['periodo'])) { $unidades = Unidade::whereHas('infraestruturas', fn ($q) => $q ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($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::where('unidade_id', $params['unidade_id']) ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($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::where('infraestrutura_id', $params['infraestrutura_id']) ->where(fn ($q) => self::setWhereForFilterCentroCusto($q, $params)) ->get(['id', 'setor_id']) ->map(fn ($cc) => ['id' => $cc->id, 'setor_nome' => $cc->setor->nome]) ->sortBy('setor_nome') ->values(); } return ['form' => $centrosCusto, 'model' => $id]; } private static function setWhereForFilterCentroCusto($query, $params) { return $query->whereHas('farmaciaReceitaEntregas', fn ($q) => $q ->where('pendente', false) ->where('estornado', false) ->whereBetween('dispensado_em', $params['periodo']) ); } private static function getUsuariosSolicitantesData($params) { $usuarios = collect(); $id = null; if (!is_null($params['periodo'])) { $usuarios = Usuario::whereHas('farmaciaReceitas', fn ($q) => $q ->whereHas('itens', fn ($q) => $q ->whereHas('entregas', fn ($q) => self::setWhereForSelectedCentroCusto($q, $params) ->where('pendente', false) ->where('estornado', false) ->whereBetween('dispensado_em', $params['periodo']) ) ) ) ->get(['id', 'cidadao_id']) ->map(fn ($u) => ['id' => $u->id, 'nome' => $u->cidadao->nome]) ->sortBy('nome') ->values(); } return ['form' => $usuarios, 'model' => $id]; } private static function getTiposReceitaData($params) { $tipos = collect(); $isReceitaSus = null; if (!is_null($params['periodo'])) { $hasDispensacoes = function ($isReceitaSus) use ($params) { return Receita::where('is_receita_sus', $isReceitaSus) ->whereHas('itens', fn ($q) => $q ->whereHas('entregas', fn ($q) => self::setWhereForSelectedCentroCusto($q, $params) ->where('pendente', false) ->where('estornado', false) ->whereBetween('dispensado_em', $params['periodo']) ) ) ->when($params['usuario_solicitante_id'], fn ($q) => $q ->where('usuario_id', $params['usuario_solicitante_id']) ) ->exists(); }; if ($hasDispensacoes(true)) { $tipos->push(['value' => true, 'text' => 'SUS']); } if ($hasDispensacoes(false)) { $tipos->push(['value' => false, 'text' => 'OUTRAS']); } } return ['form' => $tipos, 'model' => $isReceitaSus]; } 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) { $query->whereHas('farmaciaReceitaItens', fn ($q) => $q ->whereHas('entregas', fn ($q) => self::setWhereForSelectedCentroCusto($q, $params) ->where('pendente', false) ->where('estornado', false) ->whereBetween('dispensado_em', $params['periodo']) ) ->whereHas('receita', fn ($q) => $q ->when($params['usuario_solicitante_id'], fn ($q) => $q ->where('usuario_id', $params['usuario_solicitante_id']) ) ->when(!is_null($params['is_receita_sus']), fn ($q) => $q ->where('is_receita_sus', $params['is_receita_sus']) ) ) ); } private static function setWhereForSelectedCentroCusto($query, $params) { return $query->when($params['centro_custo_id'], fn ($q, $centroCustoId) => $q->where('created_centro_custo_id', $centroCustoId), fn ($q) => $q->when(!is_null($params['infraestrutura_id']) || !is_null($params['unidade_id']), fn ($q) => $q->whereHas('createdCentroCusto', 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'])) ) ) ) ); } 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', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " as descricao"), ); return $materiais; } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['dispensacoes']; $unidade = Unidade::find(request()->unidade_id); $infraestrutura = Infraestrutura::find(request()->infraestrutura_id); $centroCusto = CentroCusto::find(request()->centro_custo_id); $usuarioSolicitante = Usuario::find(request()->usuario_solicitante_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 ?? 'Todos', 'setor' => $centroCusto->setor->nome ?? 'Todos', 'usuarioSolicitante' => $usuarioSolicitante->cidadao->nome ?? 'Todos', 'tipoReceita' => is_null(request()->is_receita_sus) ? 'Todos' : (DataUtil::getBooleanValueFromStringBoolean(request()->is_receita_sus) ? 'SUS' : 'OUTRAS'), 'grupo' => $grupo->nome ?? 'Todos', 'subgrupo' => $subgrupo->nome ?? 'Todos', 'material' => $material->descricao_completa ?? 'Todos', 'colunas' => collect(request()->selectedColumns), 'itens' => $itens, 'totalizadores' => $resultado['totalizadores'], ]; } }