all(); self::adjustPeriod($params); $idadeDe = $params['idade_de'] ?? null; $idadeAte = $params['idade_ate'] ?? null; $procedimentosAtendimentos = DB::table('pronto_atendimento_atendimento_procedimento') ->select( DB::raw( 'SUM(pronto_atendimento_atendimento_procedimento.quantidade) as quantidade', ), 'sigtap_procedimento.nome as procedimento_nome', 'sigtap_procedimento.codigo as procedimento_codigo', 'sigtap_ocupacao.nome as ocupacao_nome', 'sigtap_ocupacao.codigo as ocupacao_codigo', 'profissional.nome as profissional_nome', DB::raw("CASE WHEN pronto_atendimento_faa.finalizado = 1 THEN 'FINALIZADO' ELSE 'EM ABERTO' END AS status"), ) ->join( 'sigtap.procedimento as sigtap_procedimento', 'sigtap_procedimento.id', 'pronto_atendimento_atendimento_procedimento.procedimento_id' ) ->join( 'cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_atendimento_procedimento.lotacao_id' ) ->join( 'sigtap.ocupacao as sigtap_ocupacao', 'sigtap_ocupacao.id', 'cadastro_lotacao.ocupacao_id' ) ->join( 'pronto_atendimento_atendimento', 'pronto_atendimento_atendimento.id', 'pronto_atendimento_atendimento_procedimento.atendimento_id' ) ->join( 'pronto_atendimento_faa', 'pronto_atendimento_faa.id', 'pronto_atendimento_atendimento.faa_id' ) ->join( 'cadastro_centro_custo', 'cadastro_centro_custo.id', 'pronto_atendimento_atendimento.created_centro_custo_id' ) ->join( 'cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id' ) ->join( 'cadastro_paciente', 'cadastro_paciente.id', 'pronto_atendimento_faa.paciente_id' ) ->join( 'cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id' ) ->join( 'cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id' ) ->join( 'cadastro_cidadao as profissional', 'profissional.id', 'cadastro_usuario.cidadao_id' ) ->whereBetween( 'pronto_atendimento_faa.created_at', [ $params['periodo']['date']['start'] ?? null, $params['periodo']['date']['end'] ?? null ] ) ->where('pronto_atendimento_faa.cancelado', 0) ->whereNull('pronto_atendimento_faa.deleted_at') ->whereNull('pronto_atendimento_atendimento_procedimento.deleted_at') ->groupBy( 'sigtap_procedimento.codigo', 'sigtap_ocupacao.codigo', DB::raw("CASE WHEN pronto_atendimento_faa.finalizado = 1 THEN 'FINALIZADO' ELSE 'EM ABERTO' END"), ) ->orderBy('sigtap_procedimento.nome'); if (!is_null($params['unidade_id'] ?? null)) { $procedimentosAtendimentos->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']); } if (!is_null($params['local_atendimento_id'] ?? null)) { $procedimentosAtendimentos->where('cadastro_infraestrutura.id', $params['local_atendimento_id']); } if (!is_null($idadeDe)) { $procedimentosAtendimentos->whereRaw("(TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, CURRENT_DATE)) >= $idadeDe"); } if (!is_null($idadeAte)) { $procedimentosAtendimentos->whereRaw("(TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, CURRENT_DATE)) <= $idadeAte"); } if (!is_null($params['ocupacao_id'] ?? null)) { $procedimentosAtendimentos->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']); } if (!is_null($params['usuario_id'] ?? null)) { $procedimentosAtendimentos->where('cadastro_lotacao.usuario_id', $params['usuario_id']); } if (!is_null($params['procedimento_id'] ?? null)) { $procedimento = Procedimento::findOrFail($params['procedimento_id']); $procedimentosAtendimentos->where('sigtap_procedimento.codigo', $procedimento->codigo); } if (!is_null($params['status'] ?? null)) { $procedimentosAtendimentos->where('pronto_atendimento_faa.finalizado', $params['status']); } $procedimentosAtendimentos = $procedimentosAtendimentos->get(); $quantidadeTotal = 0; $result = []; $index = 1; foreach ($procedimentosAtendimentos as $procedimentoAtendimento) { $procedimentoAtendimento->index = $index; $procedimentoCodigo = Format::getProcedimentoFormated($procedimentoAtendimento->procedimento_codigo); $procedimentoAtendimento->procedimento_codigo_nome = "{$procedimentoCodigo} - {$procedimentoAtendimento->procedimento_nome}"; $procedimentoAtendimento->ocupacao_codigo_nome = "{$procedimentoAtendimento->ocupacao_codigo} - {$procedimentoAtendimento->ocupacao_nome}"; $quantidadeTotal += $procedimentoAtendimento->quantidade; $index++; } return [ 'procedimentos_atendimentos' => $procedimentosAtendimentos, 'quantidade_total' => $quantidadeTotal, ]; } public static function list() { return [ 'form' => self::getForm(), 'model' => self::getModel(), 'additionals' => [ 'data_atual' => Carbon::today()->format('d/m/Y'), ] ]; } private static function getForm() { $params = request()->all(); $lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id')); self::adjustPeriod($params); return [ 'unidades' => self::getUnidades($params), 'locais_atendimento' => self::getLocaisAtendimento($params), 'ocupacoes' => self::getOcupacoes($params), 'procedimentos' => self::getProcedimentos($params), 'usuarios' => self::getUsuarios($params), 'status' => self::getStatus($params), 'unidade_logada' => [ 'unidade_id' => $lotacao->infraestrutura->unidade->id, 'infraestrutura_id' => $lotacao->infraestrutura->id, ], ]; } private static function adjustPeriod(&$params) { if (!is_null($params['periodo']['date']['start'] ?? null) && $params['periodo']['date']['end']) { $params['periodo']['date']['start'] = (Carbon::createFromFormat('d/m/Y', "{$params['periodo']['date']['start']}"))->startOfDay(); $params['periodo']['date']['end'] = (Carbon::createFromFormat('d/m/Y', "{$params['periodo']['date']['end']}"))->endOfDay(); } } private static function getUnidades($params) { return DB::table('cadastro_unidade') ->select( 'cadastro_unidade.id', 'cadastro_unidade.nome_fantasia' ) ->whereExists(function ($query) use ($params) { $query->select(DB::raw(1)) ->from('pronto_atendimento_faa') ->join( 'cadastro_centro_custo', 'cadastro_centro_custo.id', '=', 'pronto_atendimento_faa.created_centro_custo_id' ) ->join( 'pronto_atendimento_atendimento', 'pronto_atendimento_atendimento.faa_id', '=', 'pronto_atendimento_faa.id' ) ->join( 'pronto_atendimento_atendimento_procedimento', 'pronto_atendimento_atendimento_procedimento.atendimento_id', '=', 'pronto_atendimento_atendimento.id' ) ->join( 'cadastro_infraestrutura', 'cadastro_infraestrutura.id', '=', 'cadastro_centro_custo.infraestrutura_id' ) ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ->whereBetween( 'pronto_atendimento_faa.created_at', [ $params['periodo']['date']['start'] ?? null, $params['periodo']['date']['end'] ?? null ] ); }) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getLocaisAtendimento($params) { $locaisAtendimento = DB::table('cadastro_infraestrutura') ->select( 'cadastro_infraestrutura.id', DB::raw( "CASE WHEN cadastro_infraestrutura.nome IS NOT NULL THEN cadastro_infraestrutura.nome ELSE cadastro_unidade.nome_fantasia END AS nome" ), ) ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->whereExists(function ($query) use ($params) { $query->select(DB::raw(1)) ->from('pronto_atendimento_faa') ->join( 'cadastro_centro_custo', 'cadastro_centro_custo.id', '=', 'pronto_atendimento_faa.created_centro_custo_id' ) ->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id') ->whereBetween( 'pronto_atendimento_faa.created_at', [ $params['periodo']['date']['start'] ?? null, $params['periodo']['date']['end'] ?? null ] ); }); if (!is_null($params['unidade_id'] ?? null)) { $locaisAtendimento->where('cadastro_unidade.id', $params['unidade_id']); } return $locaisAtendimento->orderBy( DB::raw( "CASE WHEN cadastro_infraestrutura.nome IS NOT NULL THEN cadastro_infraestrutura.nome ELSE cadastro_unidade.nome_fantasia END" )) ->get(); } private static function getOcupacoes($params) { $ocupacoes = DB::table('sigtap.ocupacao as ocupacao') ->select( 'ocupacao.id', 'ocupacao.nome', 'ocupacao.codigo', ) ->whereExists(function ($query) use ($params) { $idadeDe = $params['idade_de'] ?? null; $idadeAte = $params['idade_ate'] ?? null; $query->select(DB::raw(1)) ->from('pronto_atendimento_atendimento_procedimento') ->join( 'cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_atendimento_procedimento.lotacao_id' ) ->join( 'pronto_atendimento_atendimento', 'pronto_atendimento_atendimento.id', 'pronto_atendimento_atendimento_procedimento.atendimento_id' ) ->join( 'pronto_atendimento_faa', 'pronto_atendimento_faa.id', 'pronto_atendimento_atendimento.faa_id' ) ->join( 'cadastro_centro_custo', 'cadastro_centro_custo.id', 'pronto_atendimento_atendimento.created_centro_custo_id' ) ->join( 'cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id' ) ->join( 'cadastro_paciente', 'cadastro_paciente.id', 'pronto_atendimento_faa.paciente_id' ) ->join( 'cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id' ) ->whereBetween( 'pronto_atendimento_faa.created_at', [ $params['periodo']['date']['start'] ?? null, $params['periodo']['date']['end'] ?? null ] ) ->whereColumn('cadastro_lotacao.ocupacao_id', 'ocupacao.id'); if (!is_null($params['unidade_id'] ?? null)) { $query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']); } if (!is_null($params['local_atendimento_id'] ?? null)) { $query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']); } if (!is_null($idadeDe)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) >= $idadeDe"); } if (!is_null($idadeAte)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) <= $idadeAte"); } }); $ocupacoes = $ocupacoes ->orderBy('ocupacao.nome') ->get(); foreach ($ocupacoes as $ocupacaoAtendimento) { $ocupacaoCodigo = Format::getProcedimentoFormated($ocupacaoAtendimento->codigo); $ocupacaoAtendimento->ocupacao_codigo_nome = "{$ocupacaoCodigo} - {$ocupacaoAtendimento->nome}"; } return $ocupacoes; } private static function getUsuarios($params) { $usuarios = DB::table('cadastro_usuario') ->select( 'cadastro_usuario.id', 'cadastro_cidadao.nome' ) ->join( 'cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id' ) ->whereExists(function ($query) use ($params) { $idadeDe = $params['idade_de'] ?? null; $idadeAte = $params['idade_ate'] ?? null; $query->select(DB::raw(1)) ->from('pronto_atendimento_atendimento_procedimento') ->join( 'pronto_atendimento_atendimento', 'pronto_atendimento_atendimento.id', 'pronto_atendimento_atendimento_procedimento.atendimento_id' ) ->join( 'cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_atendimento_procedimento.lotacao_id' ) ->join( 'pronto_atendimento_faa', 'pronto_atendimento_faa.id', 'pronto_atendimento_atendimento.faa_id' ) ->join( 'cadastro_centro_custo', 'cadastro_centro_custo.id', 'pronto_atendimento_atendimento.created_centro_custo_id' ) ->join( 'cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id' ) ->join( 'cadastro_paciente', 'cadastro_paciente.id', 'pronto_atendimento_faa.paciente_id' ) ->join( 'cadastro_cidadao as paciente', 'paciente.id', 'cadastro_paciente.cidadao_id' ) ->whereBetween( 'pronto_atendimento_faa.created_at', [ $params['periodo']['date']['start'] ?? null, $params['periodo']['date']['end'] ?? null ] ) ->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id'); if (!is_null($params['unidade_id'] ?? null)) { $query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']); } if (!is_null($params['local_atendimento_id'] ?? null)) { $query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']); } if (!is_null($idadeDe)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(paciente.data_nascimento)) >= $idadeDe"); } if (!is_null($idadeAte)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(paciente.data_nascimento)) <= $idadeAte"); } if (!is_null($params['ocupacao_id'] ?? null)) { $query->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']); } }); return $usuarios ->orderBy('cadastro_cidadao.nome') ->get(); } private static function getProcedimentos($params) { $procedimentos = DB::table('sigtap.procedimento as procedimento') ->select( 'procedimento.id', 'procedimento.nome', 'procedimento.codigo', ) ->whereExists(function ($query) use ($params) { $idadeDe = $params['idade_de'] ?? null; $idadeAte = $params['idade_ate'] ?? null; $query->select(DB::raw(1)) ->from('pronto_atendimento_atendimento_procedimento') ->join( 'pronto_atendimento_atendimento', 'pronto_atendimento_atendimento.id', 'pronto_atendimento_atendimento_procedimento.atendimento_id' ) ->join( 'cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_atendimento_procedimento.lotacao_id' ) ->join( 'pronto_atendimento_faa', 'pronto_atendimento_faa.id', 'pronto_atendimento_atendimento.faa_id' ) ->join( 'cadastro_centro_custo', 'cadastro_centro_custo.id', 'pronto_atendimento_atendimento.created_centro_custo_id' ) ->join( 'cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id' ) ->join( 'cadastro_paciente', 'cadastro_paciente.id', 'pronto_atendimento_faa.paciente_id' ) ->join( 'cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id' ) ->whereBetween( 'pronto_atendimento_faa.created_at', [ $params['periodo']['date']['start'] ?? null, $params['periodo']['date']['end'] ?? null ] ) ->whereColumn('pronto_atendimento_atendimento_procedimento.procedimento_id', 'procedimento.id'); if (!is_null($params['unidade_id'] ?? null)) { $query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']); } if (!is_null($params['local_atendimento_id'] ?? null)) { $query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']); } if (!is_null($idadeDe)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) >= $idadeDe"); } if (!is_null($idadeAte)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) <= $idadeAte"); } if (!is_null($params['ocupacao_id'] ?? null)) { $query->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']); } }); $procedimentos = $procedimentos ->groupBy('procedimento.codigo') ->orderBy('procedimento.nome') ->get(); foreach ($procedimentos as $procedimentoAtendimento) { $procedimentoCodigo = Format::getProcedimentoFormated($procedimentoAtendimento->codigo); $procedimentoAtendimento->procedimento_codigo_nome = "{$procedimentoCodigo} - {$procedimentoAtendimento->nome}"; } return $procedimentos; } private static function getStatus($params) { return DB::table('pronto_atendimento_faa as paf') ->select( 'paf.finalizado', ) ->distinct() ->whereExists(function($query) use ($params) { $idadeDe = $params['idade_de'] ?? null; $idadeAte = $params['idade_ate'] ?? null; $query->select(DB::raw(1)) ->from('pronto_atendimento_atendimento') ->join( 'pronto_atendimento_faa', 'pronto_atendimento_faa.id', 'pronto_atendimento_atendimento.faa_id' ) ->join( 'pronto_atendimento_atendimento_procedimento', 'pronto_atendimento_atendimento_procedimento.atendimento_id', 'pronto_atendimento_atendimento.id' ) ->join( 'cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_atendimento_procedimento.lotacao_id' ) ->join( 'cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id' ) ->join( 'cadastro_paciente', 'cadastro_paciente.id', 'pronto_atendimento_faa.paciente_id' ) ->join( 'cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id' ) ->whereColumn( 'pronto_atendimento_atendimento.faa_id', 'paf.id' ) ->whereBetween( 'paf.created_at', [ $params['periodo']['date']['start'] ?? null, $params['periodo']['date']['end'] ?? null ] ); if (!is_null($params['unidade_id'] ?? null)) { $query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']); } if (!is_null($params['local_atendimento_id'] ?? null)) { $query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']); } if (!is_null($idadeDe)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) >= $idadeDe"); } if (!is_null($idadeAte)) { $query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) <= $idadeAte"); } if (!is_null($params['ocupacao_id'] ?? null)) { $query->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']); } if (!is_null($params['procedimento_id'] ?? null)) { $query->where('pronto_atendimento_atendimento_procedimento.procedimento_id', $params['procedimento_id']); } }) ->get() ->map(function($status) { return [ 'valor' => $status->finalizado ?? false, 'nome' => $status->finalizado ? 'FINALIZADO' : 'EM ABERTO', ]; }); } private static function getModel() { return [ 'periodo' => [ 'date' => [ 'start' => $params['periodo']['date']['start'] ?? null, 'end' => $params['periodo']['date']['end'] ?? null, ], 'time' => [ 'start' => $params['periodo']['time']['start'] ?? null, 'end' => $params['periodo']['time']['end'] ?? null, ] ], 'unidade_id' => null, 'localAtendimento_id' => null, 'ocupacao_id' => null, 'usuario_id' => null, 'procedimento_id' => null, 'idade_de' => null, 'idade_ate' => null, 'status' => null, ]; } }