init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,998 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\Administracao\Modulo;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\ExameImagem\Parametrizacao\Agendamento\AgendamentoStatus;
use App\Enums\ExameImagem\Parametrizacao\ControleJornada\Tipo as ControleJornadaTipo;
use App\Enums\ExameImagem\Tipo;
use App\Enums\Regulacao\StatusTipo as RegulacaoStatusTipo;
use App\Exceptions\ExameImagem\ExceededVagaJornadaException;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Feriado\Feriado;
use App\Models\Cadastro\SujeitoAtencao\Cidadao;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Agendamento\AgendamentoHistoricoExclusao;
use App\Models\ExameImagem\CotaPrestador;
use App\Models\ExameImagem\Jornada\Jornada;
use App\Models\ExameImagem\Parametrizacao\MensagemProtocolo;
use App\Models\ExameImagem\Parametrizacao\Supervisor;
use App\Models\Intranet\Cliente;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Administracao\ModuloService;
use App\Services\Integracao\CnsService;
use App\Services\Regulacao\SolicitacaoService as RegulacaoSolicitacaoService;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class AgendamentoRetroativoService extends Service
{
public static function datatable()
{
$gerenciamentoJornadas = DB::table('cadastro_usuario')
->select(
'cadastro_usuario.id',
'cadastro_cidadao.nome',
'cadastro_cidadao.cpf',
'cadastro_usuario.bloqueado',
'cadastro_lotacao.usuario_id',
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'ocupacao.nome AS ocupacao_nome',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") as data_nascimento')
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'exame_imagem_parametrizacao_ocupacao',
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'cadastro_lotacao.ocupacao_id'
)
->where('cadastro_usuario.bloqueado', '=', '0')
->whereNull('cadastro_lotacao.deleted_at')
->whereNull('exame_imagem_parametrizacao_ocupacao.deleted_at');
return $gerenciamentoJornadas;
}
private static function getUsuarios($ids)
{
return Usuario::whereIn('id', $ids)->without(['registroTipo', 'cidadao'])->get();
}
private static function getCidadao($cidadao_id)
{
return Cidadao::where('id', $cidadao_id)
->without([
'carteiraIdentidade',
'carteiraHabilitacao',
'carteiraTrabalho',
'estrangeiroEntradaBrasil',
'tituloEleitor',
'certidao',
'telefones',
'conveniosMedico',
'domicilio',
'fatoresRisco',
'alergias',
'obito',
'sexo',
])->first();
}
private static function getAgendamentos($field, $ids)
{
return Agendamento::whereIn($field, $ids)
->whereHas('agendamentoExame', function ($query) {
$query->where(function ($q) {
$q->whereNotIn('status_id', [Status::CANCELADO])
->orWhereNull('status_id');
});
})
->get();
}
public static function show($id)
{
$mensagemProtocolo = MensagemProtocolo::select('mensagem')->first();
$centroCustroLogado = self::getCentroCustoLogado();
$currentLotacao = self::getCurrentLotacao();
$cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail();
$paciente = Paciente::where('id', $id)->first();
$unidades = DB::table('cadastro_unidade')->orderBy('nome_fantasia')->get();
$idsUnidades = $unidades->pluck('id')->all();
$infraestruturas = DB::table('cadastro_infraestrutura')->whereIn('unidade_id', $idsUnidades)->get();
$centroCustoLogado = self::getCurrentCentroCusto();
$centroCustoLogadoInfraestrutura = $infraestruturas->firstWhere('id', $centroCustoLogado->infraestrutura_id);
$currentLotacao = self::getCurrentLotacao();
$usuario = self::getUsuarios([$currentLotacao->usuario_id])->first();
$agendamentosPaciente = self::getAgendamentos('paciente_id', [$id]);
return [
'additionals' => [
'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(),
],
'form' => [
'paciente' => [
'id' => $paciente->id,
'classificacao_id' => $paciente->classificacao_id,
'unidade_id' => $paciente->unidade_id,
'observacao' => $paciente->observacao,
'prontuario' => $paciente->prontuario,
'is_desconhecido' => $paciente->is_desconhecido,
'unidade' => $unidades->where('id', $paciente->unidade_id)->first(),
'cidadao' => $paciente->cidadao
],
'cliente' => [
'sistema' => [
'ramo_atividade' => [
'nome' => $cliente->sistema->ramoAtividade->nome ?? null,
],
'nome' => $cliente->sistema->nome ?? null,
'versao' => $cliente->sistema->versao ?? null,
],
'municipio' => [
'estado' => [
'uf' => $cliente->municipio->estado->uf ?? null,
],
'nome' => $cliente->municipio->nome ?? null,
],
'nome' => $cliente->nome ?? null,
'email' => $cliente->email ?? null,
'site' => $cliente->site ?? null,
'logotipo' => $cliente->logotipo ?? null,
],
'data_atual' => Carbon::now()->format('d/m/Y'),
'unidade_logada' => $centroCustroLogado->infraestrutura->unidade->id,
'local_atendimento_logado' => $centroCustroLogado->infraestrutura->id,
'unidade_logada_nome' => Unidade::where('id', $centroCustoLogadoInfraestrutura->unidade_id)
->pluck('nome_fantasia')
->first(),
'usuario' => $usuario->cidadao->nome,
'usuario_nome_social' => $usuario->cidadao->nome_social ?? null,
'usuario_sistema_id' => $currentLotacao->usuario_id,
'mensagem_protocolo' => $mensagemProtocolo->mensagem,
'unidade_executante' => self::getUnidadeExecutante(),
'unidades' => Unidade::whereHas('parametrizacaoExameImagem', function ($query) {
$query->where('executante', true);
})
->get(),
'unidades_prestadoras' => Unidade::whereHas('parametrizacaoExameImagem', function ($query) {
$query->where('prestador', true);
})
->get()
->map(fn ($unidade) => [
'id' => $unidade->id,
'nome' => $unidade->nome_fantasia,
'infraestrutura_id' => $unidade->parametrizacaoExameImagem->infraestrutura_id,
'infraestrutura_nome' => $unidade->nome_fantasia,
'endereco' => $unidade->parametrizacaoExameImagem->infraestrutura->endereco->logradouro->nome,
'numero_endereco' => $unidade->parametrizacaoExameImagem->infraestrutura->numero,
'bairro' => $unidade->parametrizacaoExameImagem->infraestrutura->endereco->logradouro->bairro->nome,
'telefone' => $unidade->parametrizacaoExameImagem->infraestrutura->telefone ?
MaskUtil::getPhoneMasked($unidade->parametrizacaoExameImagem->infraestrutura->telefone) : 'NÃO INFORMADO',
]),
'feriados' => Feriado::orderBy('id')
->whereHas('modulos', function ($query) {
$query->where('id', ModuloService::getId(Modulo::EXAME_IMAGEM));
})
->get()
->map(fn($feriado) => [
'id' => $feriado->id,
'data' => (new Carbon($feriado->data))->format('d/m/Y') ?? null,
'tipo_id' => $feriado->tipo_id,
'tipo_nome' => $feriado->tipo->descricao,
'observacao' => $feriado->observacao,
]),
'cotas_prestadores' => CotaPrestador::orderBy('id')
->get()
->map(fn ($cotas) => [
'id' => $cotas->id ?? null,
'cota_tipo_id' => $cotas->cota_tipo_id ?? null,
'cota_tipo_nome' => $cotas->cota_tipo_id == Tipo::VALOR
? 'Valor' : 'Quantidade',
"periodo" => [
'start' => (new Carbon($cotas->inicio))->format('d/m/Y') ?? null,
'end' => (new Carbon($cotas->fim))->format('d/m/Y') ?? null,
],
'cota' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'saldo' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'utilizada' => "0",
'cota_unidade' => $cotas->cota_unidade ?? null,
'cota_valor' => $cotas->cota_valor ?? null,
'observacao' => $cotas->observacao ?? null,
'unidade_id' => $cotas->unidade->id ?? null,
'nome_fantasia' => $cotas->unidade->nome_fantasia ?? null,
'prestador' => "true",
])->values(),
],
'model' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'agendamentos' => $agendamentosPaciente
->map(function ($agendamento) use ($currentLotacao) {
$medico_nome = self::getCidadao(self::getUsuarios([$agendamento->medico_id])->first()->cidadao_id)->nome;
return [
'from_regulacao' => !is_null($agendamento->regulacao_solicitacao_id),
'alterar' => false,
'impressao' => false,
'agendamento_id' => $agendamento->id,
'agendamento_numero' => $agendamento->agendamento_numero,
'cotas_prestadores' => CotaPrestador::where('unidade_id', $agendamento->unidade_id)
->get()
->map(fn ($cotas) => [
'id' => $cotas->id ?? null,
'cota_tipo_id' => $cotas->cota_tipo_id ?? null,
'cota_tipo_nome' => $cotas->cota_tipo_id == Tipo::VALOR
? 'Valor' : 'Quantidade',
"periodo" => [
'start' => (new Carbon($cotas->inicio))->format('d/m/Y') ?? null,
'end' => (new Carbon($cotas->fim))->format('d/m/Y') ?? null,
],
'cota' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'saldo' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'utilizada' => "0",
'cota_unidade' => $cotas->cota_unidade ?? null,
'cota_valor' => number_format($cotas->cota_valor, 2, ',', '.') ?? null,
'observacao' => $cotas->observacao ?? null,
'prestador' => "true",
])->values(),
'controle_jornada_id' => $agendamento->jornada->controle_jornada_id,
'data' => (new Carbon($agendamento->data))->format('Y-m-d') ?? null,
'data_menstruacao' => (new Carbon($agendamento->data_menstruacao))->format('Y-m-d') ?? null,
'dias_semana' => [$agendamento->exame_id],
'grupo_exame_id' => $agendamento->exame_id,
'grupo_exame_nome' => $agendamento->grupo->nome ?? null,
'gestante' => $agendamento->gestante ?? false,
'hora_exame' => (new Carbon($agendamento->hora_exame))->format('H:i') ?? null,
'incluido' => AgendamentoExame::where('agendamento_id', $agendamento->id)
->get()
->map(function ($query) use ($agendamento) {
return [
'id' => $query->id,
'exame_id' => $query->exame_id,
'nome' => $query->exame->nome,
'codigo' => $query->exame->codigo ?? null,
'hora_exame' => (new Carbon($agendamento->hora_exame))->format('H:i') ?? null,
'observacao' => $query->exame->observacao,
'status_id' => $query->status_id ?? null,
'valor' => $query->exame->valor_sigtap ? $query->exame->procedimento->valor_servico_ambilatorial : $query->exame->valor,
'faturamento' => DB::table('exame_imagem_fechamento_faturamento')
->where('agendamento_id', $query->agendamento_id)
->where('exame_id', $query->exame_id)
->first() ? true : false,
];
})
->values(),
'pedido' => AgendamentoExame::where('agendamento_id', $agendamento->id)
->where(function ($query) {
$query->whereNull('status_id')
->orWhere('status_id', Status::AGENDADO);
})
->exists() ? false : true,
'infraestrutura_id' => $agendamento->infraestrutura_id,
'infraestrutura_nome' => $agendamento->infraestrutura->nome,
'infraestrutura_endereco' => $agendamento->infraestrutura->endereco->logradouro->nome,
'infraestrutura_numero' => $agendamento->infraestrutura->endereco->numero,
'infraestrutura_bairro' => $agendamento->infraestrutura->endereco->logradouro->bairro->nome,
'infraestrutura_telefone' => $agendamento->infraestrutura->telefone ? MaskUtil::getPhoneMasked($agendamento->infraestrutura->telefone) : 'NÃO INFORMADO',
'jornada_id' => $agendamento->jornada_id,
'medico_id' => $agendamento->medico_id,
'medico_nome' => $medico_nome,
'medico_solicitante' => [
'id' => $agendamento->medico_id,
'nome' => $medico_nome,
],
'nome_responsavel' => $agendamento->nome_responsavel,
'observacao' => $agendamento->observacao,
'paciente_id' => $agendamento->paciente_id,
'paciente_nome' => $agendamento->paciente->cidadao->nome,
'periodo' => [
'start' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
'end' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
],
'profissional_id' => $agendamento->profissional_id,
'profissional_nome' => $agendamento->jornada->usuario->nome,
'selecionado' => false,
'supervisor_id' => $agendamento->supervisor_id ?? null,
'unidade_id' => $agendamento->unidade_id,
'unidade_nome' => $agendamento->unidade->nome_fantasia,
'unidade_solicitante_id' => $agendamento->unidade_solicitante_id,
'unidade_solicitante_nome' => $agendamento->unidadeSolicitante->nome_fantasia,
'infraestrutura_solicitante_id' => $agendamento->infraestrutura_solicitante_id,
'urgente' => $agendamento->urgente ?? false,
'retroativo' => $agendamento->retroativo,
'agendador_id' => $agendamento->agendador_id ?? null,
'agendador_nome' => $currentLotacao->usuario->cidadao->nome ?? null,
];
})
->sortBy('data')
->values(),
'agendamentosNotSave' => null,
'statusExames' => null,
'periodo' => [
'start' => Carbon::now()->format('d/m/Y'),
'end' => Carbon::now()->format('d/m/Y'),
],
'agendamentos_cancelados' => Agendamento::where('paciente_id', $id)
->whereHas('agendamentoExame', function ($query) {
$query->where('status_id', Status::CANCELADO);
})
->orderBy('data', 'asc')
->get()
->map(function ($cancelados) {
$medico_nome = self::getCidadao(self::getUsuarios([$cancelados->medico_id])->first()->cidadao_id)->nome;
return [
'data' => (new Carbon($cancelados->data))->format('d/m/Y') ?? null,
'agendamento_numero' => $cancelados->agendamento_numero,
'grupo_exame_id' => $cancelados->exame_id,
'grupo_exame_nome' => $cancelados->grupo->nome ?? null,
'unidade_id' => $cancelados->unidade_id,
'unidade_nome' => $cancelados->unidade->nome_fantasia,
'unidade_solicitante_id' => $cancelados->unidade_solicitante_id,
'unidade_solicitante_nome' => $cancelados->unidadeSolicitante->nome_fantasia,
'infraestrutura_solicitante_id' => $cancelados->infraestrutura_solicitante_id,
'infraestrutura_id' => $cancelados->infraestrutura_id,
'infraestrutura_nome' => $cancelados->infraestrutura->nome,
'hora_exame' => (new Carbon($cancelados->hora_exame))->format('H:i') ?? null,
'profissional_id' => $cancelados->profissional_id,
'profissional_nome' => $cancelados->jornada->usuario->nome ?? null,
'medico_id' => $cancelados->medico_id,
'medico_nome' => $medico_nome ?? null,
'exames' => AgendamentoExame::where('agendamento_id', $cancelados->id)
->get()
->map(function ($query) {
$lotacaoCancelado = Lotacao::where('usuario_id', $query->usuario_id_cancelado)->first();
$usuarioCancelado = null;
if ($lotacaoCancelado && $lotacaoCancelado->usuario && $lotacaoCancelado->usuario->cidadao) {
$usuarioCancelado = $lotacaoCancelado->usuario->cidadao->nome;
}
return [
'exame_id' => $query->exame_id,
'nome_exame' => $query->exame->nome,
'usuario_id_cancelado' => $query->usuario_id_cancelado ?? null,
'usuario_cancelado_nome' => $usuarioCancelado ?? null,
'data_hora_cancelado' => $query->data_hora_cancelado
? (new Carbon($query->data_hora_cancelado))->format('d/m/Y H:i') : null,
];
})
->values(),
];
}),
'agendamentos_excluidos' => AgendamentoHistoricoExclusao::where('paciente_id', $id)
->get()
->groupBy('agendamento_id')
->map(function ($groupedItems) {
$agendamento = $groupedItems->first();
$lotacao = Lotacao::where('usuario_id', $agendamento->agendamento_agendador_id)->first();
$usuarioAgendador = $lotacao->usuario->cidadao->nome;
$usuarioExclusao = Lotacao::find($agendamento->created_lotacao_id)->usuario->cidadao->nome;
return [
'id' => $agendamento->id,
'agendamento_id' => $agendamento->agendamento_id,
'agendamento_agendador_id' => $agendamento->agendamento_agendador_id,
'usuario_agendador' => $usuarioAgendador,
'agendamento_numero' => $agendamento->agendamento_numero,
'data_hora_criacao' => $agendamento->data_hora_criacao
? (new Carbon($agendamento->data_hora_criacao))->format('d/m/Y H:i') : null,
'paciente_id' => $agendamento->paciente_id,
'created_lotacao_id' => $agendamento->created_lotacao_id,
'usuario_exclusao' => $usuarioExclusao,
'data_hora_exclusao' => $agendamento->data_hora_exclusao
? (new Carbon($agendamento->data_hora_exclusao))->format('d/m/Y H:i') : null,
'exames' => $groupedItems->map(function ($query) {
return [
'exame_id' => $query->exame_id,
'nome_exame' => $query->exame->nome,
];
})->values(),
];
})
->values(),
],
];
}
public static function getUnidadeExecutante()
{
$unidade = DB::table('exame_imagem_jornada as unidade_executante')
->select([
'unidade_executante.id as unidade_executante_id',
'cadastro_unidade.id AS unidade_id',
'cadastro_unidade.nome_fantasia as unidade_nome',
'cadastro_infraestrutura.id AS infraestrutura_id',
DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL THEN
cadastro_infraestrutura.nome
ELSE
cadastro_unidade.nome_fantasia
END AS nome_infraestrutura
"),
'cadastro_infraestrutura.principal as principal',
'cadastro_logradouro.nome as endereco',
'cadastro_endereco.numero as numeroEndereco',
'cadastro_bairro.nome as bairro',
'cadastro_infraestrutura.telefone AS telefone',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'unidade_executante.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_infraestrutura.endereco_id')
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
->leftJoin('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->whereNull('unidade_executante.deleted_at')
->whereNull('cadastro_infraestrutura.deleted_at')
->where('unidade_executante.data', '<', now())
->groupBy('cadastro_infraestrutura.id')
->orderBy('unidade_nome')
->get();
if ($unidade->isEmpty()) {
return [];
}
foreach ($unidade as $item) {
$unidadeId = $item->unidade_id;
$infraestruturaId = $item->infraestrutura_id;
$nomeInfraestrutura = $item->nome_infraestrutura;
if (!isset($resultadoAgrupado[$unidadeId])) {
$resultadoAgrupado[$unidadeId] = [
'unidadeId' => $unidadeId,
'unidade_nome' => $item->unidade_nome ?? null,
'infraestruturas' => []
];
}
$resultadoAgrupado[$unidadeId]['infraestruturas'][] = [
'infraestruturaId' => $infraestruturaId,
'nomeInfraestrutura' => $nomeInfraestrutura,
'principal' => $item->principal,
'endereco' => $item->endereco ?? null,
'numeroEndereco' => $item->numeroEndereco ?? null,
'bairro' => $item->bairro ?? null,
'telefone' => $item->telefone ?? null,
];
}
usort($resultadoAgrupado, function ($a, $b) {
return strcmp($a['unidade_nome'], $b['unidade_nome']);
});
return $resultadoAgrupado;
}
public static function getGrupo($request)
{
$grupo = DB::table('exame_imagem_jornada as jornada_grupo')
->select([
'jornada_grupo.exame_id AS exame_id',
'grupo.nome AS exame_nome',
])
->leftJoin('cadastro_grupo AS grupo', 'grupo.id', 'jornada_grupo.exame_id')
->where('jornada_grupo.unidade_id', $request->unidade_id)
->where('jornada_grupo.infraestrutura_id', $request->infraestrutura_id)
->groupBy([
'exame_id',
])
->whereNull('grupo.deleted_at');
$grupo = $grupo->get()->toArray();
return $grupo;
}
public static function getProfissional($request)
{
$profissional = DB::table('cadastro_usuario')
->select([
'cadastro_usuario.usuario AS usuario',
'cadastro_usuario.id AS profissional_id',
'cadastro_cidadao.nome AS profissional_nome'
])
->leftJoin('exame_imagem_jornada', 'exame_imagem_jornada.usuario_id', 'cadastro_usuario.id')
->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->where('exame_imagem_jornada.unidade_id', $request->unidade_id)
->where('exame_imagem_jornada.infraestrutura_id', $request->infraestrutura_id)
->where('exame_imagem_jornada.exame_id', $request->exame_id)
->groupBy([
'cadastro_usuario.id',
]);
$profissional = $profissional->get()->toArray();
return $profissional;
}
private static function getCentroCustoLogado()
{
return CentroCusto::findOrFail(auth()->payload()->get('centro_custo_id'));
}
public static function getValorUtilizadoPeriodo($request)
{
return [
'valor_utilizado_periodo' => DB::table('exame_imagem_agendamento_exame')
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.id', '=', 'exame_imagem_agendamento_exame.agendamento_id')
->join('parametrizacao_exame', 'parametrizacao_exame.id', '=', 'exame_imagem_agendamento_exame.exame_id')
->whereYear('exame_imagem_agendamento.data', $request->ano)
->whereMonth('exame_imagem_agendamento.data', $request->mes)
->where('exame_imagem_agendamento.infraestrutura_id', $request->infraestrutura_id)
->whereIn('exame_imagem_agendamento_exame.status_id', [AgendamentoStatus::REALIZADO, AgendamentoStatus::AGENDADO])
->selectRaw('SUM(parametrizacao_exame.valor) AS valor')
->value('valor'),
];
}
public static function getJornadas($request)
{
$dataAtual = Carbon::today();
return [
'agendamentos' => DB::table('exame_imagem_agendamento as agendamento')
->leftJoin('exame_imagem_jornada as jornada', 'jornada.id', 'agendamento.jornada_id')
->leftJoin('parametrizacao_exame as exame', 'exame.id', 'agendamento.exame_id')
->leftJoin('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->leftJoin('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'agendamento.infraestrutura_id')
->leftJoin('cadastro_usuario as usuario_medico', 'usuario_medico.id', 'agendamento.medico_id')
->leftJoin('cadastro_cidadao as medico', 'medico.id', 'usuario_medico.cidadao_id')
->leftJoin('cadastro_cidadao as profissional', 'profissional.id', 'agendamento.profissional_id')
->leftJoin('cadastro_unidade as unidade', 'unidade.id', 'agendamento.unidade_id')
->select([
'agendamento.id',
'agendamento.agendamento_numero',
'jornada.controle_jornada_id as controle_jornada_id',
'grupo.nome as exame_nome',
'agendamento.data',
'agendamento.data_menstruacao',
'agendamento.exame_id',
'agendamento.hora_exame',
'agendamento.infraestrutura_id',
'infraestrutura.nome as infraestrutura_nome',
'agendamento.jornada_id',
'agendamento.medico_id',
'medico.nome as medico_nome',
'agendamento.nome_responsavel',
'agendamento.observacao',
'agendamento.paciente_id',
'agendamento.profissional_id',
'profissional.nome as profissional_nome',
'agendamento.unidade_id',
'unidade.nome_fantasia as unidade_nome_fantasia',
'grupo.id as grupo_id',
])
->where('agendamento.data', '<', $dataAtual->format('Y-m-d'))
->where('agendamento.profissional_id', $request->profissional_id)
->where('agendamento.unidade_id', $request->unidade_id)
->where('agendamento.exame_id', $request->exame_id)
->get()
->map(fn ($agendamento) => [
'alterar' => false,
'agendamento_id' => $agendamento->id,
'agendamento_numero' => $agendamento->agendamento_numero,
'controle_jornada_id' => $agendamento->controle_jornada_id,
'data' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
'data_menstruacao' => (new Carbon($agendamento->data_menstruacao))->format('Y-m-d') ?? null,
'dias_semana' => [$agendamento->exame_id],
'exame' => DB::table('parametrizacao_exame as exame')
->select([
'exame.id',
'exame.nome',
])
->where('exame.grupo_tipo_id', $agendamento->grupo_id)
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome' => $query->nome,
];
})
->values(),
'exame_id' => $agendamento->exame_id,
'exame_nome' => $agendamento->exame_nome,
'gestante' => $agendamento->gestante ?? false,
'hora_exame' => (new Carbon($agendamento->hora_exame))->format('H:i') ?? null,
'incluido' => AgendamentoExame::where('agendamento_id', $agendamento->id)
->get()
->map(function ($query) use ($agendamento) {
return [
'id' => $query->id,
'exame_id' => $query->exame_id,
'nome' => $query->exame->nome,
'codigo' => $query->exame->codigo ?? null,
'hora_exame' => (new Carbon($agendamento->hora_exame))->format('H:i') ?? null,
'observacao' => $query->exame->observacao,
'valor' => $query->exame->valor_sigtap ? $query->exame->procedimento->valor_servico_ambilatorial : $query->exame->valor,
];
})
->values(),
'infraestrutura_id' => $agendamento->infraestrutura_id,
'infraestrutura_nome' => $agendamento->infraestrutura_nome,
'jornada_id' => $agendamento->jornada_id,
'medico_id' => $agendamento->medico_id,
'medico_nome' => $agendamento->medico_nome,
'medico_solicitante' => [
'id' => $agendamento->medico_id,
'nome' => $agendamento->medico_nome,
],
'nome_responsavel' => $agendamento->nome_responsavel,
'observacao' => $agendamento->observacao,
'paciente_id' => $agendamento->paciente_id,
'periodo' => [
'start' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
'end' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
],
'profissional_id' => $agendamento->profissional_id,
'profissional_nome' => $agendamento->profissional_nome,
'selecionado' => false,
'supervisor_id' => $agendamento->supervisor_id ?? null,
'unidade_id' => $agendamento->unidade_id,
'unidade_nome' => $agendamento->unidade_nome_fantasia,
'urgente' => $agendamento->urgente ?? false,
'retroativo' => $agendamento->retroativo ?? false,
])
->sortBy('data')
->values(),
'jornadas' => DB::table('exame_imagem_jornada as jornada')
->leftJoin('parametrizacao_exame as exame', 'exame.id', 'jornada.exame_id')
->leftJoin('cadastro_grupo as grupo', 'grupo.id', 'jornada.exame_id')
->leftJoin('cadastro_usuario as usuario_jornada', 'usuario_jornada.id', 'jornada.prestador_id')
->leftJoin('cadastro_cidadao as cidadao_jornada', 'cidadao_jornada.id', 'usuario_jornada.cidadao_id')
->leftJoin('cadastro_unidade as unidade', 'unidade.id', 'jornada.unidade_id')
->leftJoin('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'jornada.infraestrutura_id')
->select([
'jornada.id',
'jornada.unidade_id',
'jornada.controle_jornada_id',
'jornada.exame_id',
'grupo.nome as grupo_nome',
'jornada.usuario_id',
'jornada.prestador_id',
'jornada.infraestrutura_id',
'jornada.semana_id',
'jornada.vagas',
'jornada.vagas_app',
'jornada.tipo_id',
'jornada.tempo_atendimento',
'jornada.data',
'jornada.hora_inicial',
'jornada.hora_fim',
'cidadao_jornada.nome as usuario_nome',
'unidade.nome_fantasia',
'infraestrutura.nome as infraestrutura_nome',
'grupo.id as grupo_id',
])
->where('jornada.data', '<', $dataAtual->format('Y-m-d'))
->where('jornada.unidade_id', $request->unidade_id)
->where('jornada.usuario_id', $request->profissional_id)
->where('jornada.exame_id', $request->exame_id)
->get()
->map(fn ($jornada) => [
'jornada_id' => $jornada->id,
'unidade_id' => $jornada->unidade_id,
'controle_jornada_id' => $jornada->controle_jornada_id,
'jornada_id' => $jornada->id,
'exame_id' => $jornada->exame_id,
'exame_nome' => $jornada->grupo_nome,
'profissional_id' => $jornada->usuario_id,
'profissional_nome' => $jornada->usuario_nome,
'prestador_id' => $jornada->prestador_id,
'prestador_nome' => $jornada->nome_fantasia,
'unidade_id' => $jornada->unidade_id,
'unidade_nome' => $jornada->nome_fantasia,
'infraestrutura_id' => $jornada->infraestrutura_id,
'infraestrutura_nome' => $jornada->infraestrutura_nome,
'semana_id' => $jornada->semana_id,
'data' => (new Carbon($jornada->data))->format('d/m/Y') ?? null,
'vagas' => $jornada->vagas ?? null,
'vagas_app' => $jornada->vagas_app ?? null,
'tipo_id' => $jornada->tipo_id,
'tempo_atendimento' => $jornada->tempo_atendimento,
'selecionado' => false,
'hora_inicial' => (new Carbon($jornada->hora_inicial))->format('H:i') ?? null,
'hora_fim' => (new Carbon($jornada->hora_fim))->format('H:i') ?? null,
])
->sortBy('data')
->sortBy('hora_inicial')
->values(),
];
}
public static function getSupervisores($request)
{
return [
'supervisores' => Supervisor::where('usuario_id', $request->supervisor_id)
->get()
->map(fn ($supervisor) => [
'id' => $supervisor->id,
'usuario_id' => $supervisor->usuario_id,
'nome' => $supervisor->usuario->cidadao->nome,
'cpf' => $supervisor->usuario->cidadao->cpf,
]),
];
}
public static function store(Request $request)
{
self::validate($request);
return self::saveAgendamento($request);
}
private static function saveAgendamento($request)
{
$ids = [];
$idsSms = [];
foreach ($request->agendamentos as $params) {
if ($params['agendamento_id'] && is_numeric($params['agendamento_id'])) {
$tipo = Agendamento::where('id', $params['agendamento_id'])->first();
} else {
$tipo = new Agendamento();
}
$tipo->agendamento_numero = $params['agendamento_numero'];
$tipo->paciente_id = $params['paciente_id'];
$tipo->jornada_id = $params['jornada_id'];
$tipo->medico_id = $params['medico_id'];
$tipo->profissional_id = $params['profissional_id'];
$tipo->data = $params['data'];
$tipo->exame_id = $params['grupo_exame_id'];
$tipo->hora_exame = $params['hora_exame'];
$tipo->unidade_id = $params['unidade_id'];
$tipo->unidade_solicitante_id = $params['unidade_solicitante_id'];
$tipo->infraestrutura_solicitante_id = $params['infraestrutura_solicitante_id'];
$tipo->infraestrutura_id = $params['infraestrutura_id'];
$tipo->nome_responsavel = $params['nome_responsavel'];
$tipo->observacao = $params['observacao'];
$tipo->gestante = $params['gestante'];
$tipo->urgente = $params['urgente'];
$tipo->supervisor_id = $params['supervisor_id'];
$tipo->retroativo = $params['retroativo'];
$tipo->agendador_id = $params['agendador_id'];
if ($params['impressao'] == true && $params['supervisor_id'] == null) {
self::verifyJornada($params);
}
$tipo->save();
$ids[] = $tipo->id;
$paciente_id = $tipo->paciente_id;
$agendamento_id = $tipo->id;
if ($params['impressao'] == true) {
$idsSms[] = $tipo->id;
$impressao_agendamento_numero = $tipo->agendamento_numero;
}
foreach ($params['incluido'] as $param_exame) {
if ($param_exame['id'] && is_numeric($param_exame['id'])) {
$exame = AgendamentoExame::where('id', $param_exame['id'])->first();
} else {
$exame = new AgendamentoExame();
}
$exame->agendamento_id = $agendamento_id;
$exame->exame_id = $param_exame['exame_id'];
$exame->paciente_id = $paciente_id;
$exame->save();
$idsExame[] = $exame->id;
}
}
foreach ($idsSms as $idSms) {
if ($params['agendamento_id'] && is_numeric($params['agendamento_id'])) {
(new SmsService($idSms))->cancel();
}
(new SmsService($idSms))->send();
}
if (isset($impressao_agendamento_numero)){
return [
'impressao_agendamento_numero' => $impressao_agendamento_numero,
];
}
}
private static function verifyJornada($params)
{
if($params['controle_jornada_id'] == ControleJornadaTipo::EXAME){
$agendamentoExames = Agendamento::where('data', '=', $params['data'])
->where('profissional_id', $params['profissional_id'])
->where('unidade_id', $params['unidade_id'])
->where('infraestrutura_id', $params['infraestrutura_id'])
->where('exame_id', $params['grupo_exame_id'])
->get();
$agendamentoCadastrado = 0;
foreach ($agendamentoExames as $param_exames) {
$agendamentoCadastrado = $agendamentoCadastrado +
AgendamentoExame::where('agendamento_id', $param_exames['id'])
->count('id') ?? 0;
}
if(is_numeric($params['agendamento_id'])){
$agendamentoExamesIncluidos = AgendamentoExame::where('agendamento_id', $params['agendamento_id'])
->count('id') ?? 0;
$agendamentoCadastrado = ($agendamentoCadastrado-$agendamentoExamesIncluidos) + count($params['incluido']);
} else {
$agendamentoCadastrado = $agendamentoCadastrado + count($params['incluido']);
}
} else {
$agendamentoCadastrado = Agendamento::where('data', '=', $params['data'])
->where('profissional_id', $params['profissional_id'])
->where('unidade_id', $params['unidade_id'])
->where('infraestrutura_id', $params['infraestrutura_id'])
->where('exame_id', $params['grupo_exame_id'])
->count('id') ?? 0;
}
$jornada = Jornada::where('unidade_id', $params['unidade_id'])
->where('infraestrutura_id', $params['infraestrutura_id'])
->where('usuario_id', $params['profissional_id'])
->where('exame_id', $params['grupo_exame_id'])
->where('data', '=', $params['data'])
->selectRaw('SUM(vagas + COALESCE(vagas_app, 0)) as total_vagas')
->value('total_vagas') ?? 0;
if ($agendamentoCadastrado > $jornada) {
throw new ExceededVagaJornadaException;
}
}
private static function validate($request)
{
$validations = [
'unidade_id' => [
'integer',
],
'incluido' => [
'array',
]
];
$messages = [
'unidade_id' => 'Necessário informar unidade.',
];
return $request->validate($validations, $messages);
}
private static function getPermissoesAtualizacaoCadastroPaciente()
{
$parametrizacao = CnsService::getParametrizacao();
if (!is_null($parametrizacao)) {
$lotacao = self::getCurrentLotacao();
return DB::table('cadastro_parametrizacao_permissao_usuario')
->select([
'municipe',
'provisorio',
'outro_municipio',
])
->where('infraestrutura_id', $lotacao->infraestrutura_id)
->where('usuario_id', $lotacao->usuario_id)
->get()
->first();
}
return null;
}
public static function cancel($id)
{
$agendamento = Agendamento::findOrFail($id);
$usuarioCancelado = self::getCurrentLotacao();
AgendamentoExame::where('agendamento_id', $agendamento->id)
->update([
'status_id' => Status::CANCELADO,
'usuario_id_cancelado' => $usuarioCancelado->usuario_id,
'data_hora_cancelado' => now(),
]);
if (!is_null($agendamento->regulacao_solicitacao_id)) {
RegulacaoSolicitacaoService::updateStatus(
$agendamento->regulacao_solicitacao_id,
RegulacaoStatusTipo::CANCELADO,
['justificativa' => 'Cancelado automaticamente pela funcionalidade Agendamento'],
);
}
(new SmsService($id))->cancel();
return $agendamento->fresh();
}
public static function destroy($id)
{
$agendamento = Agendamento::findOrFail($id);
$exames = AgendamentoExame::where('agendamento_id', $id)->get();
foreach ($exames as $exame) {
AgendamentoHistoricoExclusao::create([
'agendamento_id' => $agendamento->id,
'agendamento_agendador_id' => $agendamento->agendador_id,
'data_hora_criacao' => $agendamento->created_at,
'paciente_id' => $agendamento->paciente_id,
'agendamento_numero' => $agendamento->agendamento_numero,
'exame_id' => $exame->exame_id,
'data_hora_exclusao' => Carbon::now()->format('Y-m-d H:i:s'),
]);
}
(new SmsService($id))->cancel();
AgendamentoExame::where('agendamento_id', $id)->delete();
$agendamento = Agendamento::findOrFail($id);
$agendamento->delete();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,285 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Parametrizacao\Exame\Exame;
use App\Models\Cadastro\SujeitoAtencao\Sexo;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Fechamento\Faturamento;
use App\Models\ExameImagem\Fechamento\StatusFechamento;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class AlteracaoExameFinalizadoService extends Service
{
public static function index()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'unidades' => [],
'profissionais' => [],
'grupoExames' => [],
'exames' => [],
'itens' => [],
'infraestrutura' => $currentLotacao->infraestrutura->nome,
'status' => StatusFechamento::orderBy('id')
->get()
->map(fn ($status) => [
'id' => $status->id,
'nome' => $status->nome
]),
],
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'agendamentos' => [],
'agendamentosNotSave' => null,
'unidade_id' => null,
'especialidade_id' => null,
'usuario_id' => null,
'profissional_id' => null,
'grupo_exame_id' => null,
'exame_id' => null,
'agendamento_numero' => null,
'prontuario' => null,
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function list()
{
$agendamentos = self::getAgendamentos();
return $agendamentos;
}
public static function getUnidades()
{
$start_date = request()->data_inicio;
$end_date = request()->data_fim;
return Unidade::whereHas('agendamentosExameImagem', function ($query) use ($start_date, $end_date) {
$query->whereBetween('data', [$start_date, $end_date])
->whereHas('agendamentoExame', function ($query) {
$query->whereIn('status_id', [Status::REALIZADO, Status::FALTOU]);
});
})
->get()
->map(function ($query){
return [
'unidade_id' => $query->id,
'nome_fantasia' => $query->nome_fantasia,
];
});
}
public static function getProfissional()
{
$start_date = request()->data_inicio;
$end_date = request()->data_fim;
$unidade = request()->unidade_id;
return DB::table('cadastro_usuario as usuario')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('exame_imagem_agendamento as agendamento')
->join('exame_imagem_agendamento_exame as exame', 'agendamento.id', 'exame.agendamento_id')
->whereBetween('data', [$start_date, $end_date])
->whereColumn('agendamento.profissional_id', 'usuario.id')
->whereIn('exame.status_id', [Status::REALIZADO, Status::FALTOU])
->where('agendamento.unidade_id', $unidade)
)
->select(DB::raw("
usuario.id as profissional_id,
cidadao.nome as profissional_nome
"))
->get();
}
public static function getGrupoExames()
{
$start_date = request()->data_inicio;
$end_date = request()->data_fim;
$unidade = request()->unidade_id;
$profissional = request()->profissional_id;
return DB::table('cadastro_grupo as grupo')
->join('parametrizacao_exame as parametrizacao', 'parametrizacao.grupo_tipo_id', 'grupo.id')
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('exame_imagem_agendamento as agendamento')
->join('exame_imagem_agendamento_exame as exame', 'agendamento.id', 'exame.agendamento_id')
->whereBetween('data', [$start_date, $end_date])
->whereIn('exame.status_id', [Status::REALIZADO, Status::FALTOU])
->where('agendamento.profissional_id', $profissional)
->where('agendamento.unidade_id', $unidade)
->whereColumn('exame.exame_id', 'parametrizacao.id')
)
->whereNull('grupo.deleted_at')
->select(DB::raw("
grupo.id as grupo_exame_id,
grupo.nome as grupo_nome
"))
->get()
->unique();
}
public static function getExames()
{
$start_date = request()->data_inicio;
$end_date = request()->data_fim;
$unidade = request()->unidade_id;
$profissional = request()->profissional_id;
$grupo = request()->grupo_exame_id;
return Exame::whereHas('agendamentoExameImagem', function ($query) use ($start_date, $end_date, $unidade, $profissional) {
$query->whereIn('status_id', [Status::REALIZADO, Status::FALTOU])
->whereHas('agendamento', function ($query) use ($start_date, $end_date, $unidade, $profissional) {
$query->whereBetween('data', [$start_date, $end_date]);
$query->where('profissional_id', $profissional);
$query->where('unidade_id', $unidade);
});
})
->where('grupo_tipo_id', $grupo)
->get()
->map(function ($query){
return [
'exame_id' => $query->id,
'exame_nome' => $query->nome,
];
});
}
private static function getAgendamentos()
{
return AgendamentoExame::with([
'exame.procedimento',
'agendamento.jornada.usuario',
'agendamento.unidade',
'agendamento.medico',
'agendamento.grupo',
'paciente.cidadao',
])
->whereHas('agendamento', function ($query) {
$query->whereBetween('data', [request()->data_inicio, request()->data_fim]);
$query->where('profissional_id', request()->profissional_id);
$query->where('unidade_id', request()->unidade_id)
->when(request()->agendamento_numero, fn ($query) => $query->where('agendamento_numero', request()->agendamento_numero))
->when(request()->prontuario, fn ($query) => $query->whereHas('Paciente', function ($query) {
$query->where('prontuario', request()->prontuario);
}));
})
->when(request()->exame_id, fn ($query) => $query->where('exame_id', request()->exame_id))
->when(request()->paciente, fn ($query) => $query->where('paciente_id', request()->paciente))
->when(request()->has('status'), function ($query) {
$status = request()->status;
if ($status == Status::REALIZADO) {
$query->where('status_id', Status::REALIZADO);
} elseif ($status == Status::FALTOU) {
$query->where('status_id', Status::FALTOU);
} elseif ($status == Status::FALTA_MEDICA) {
$query->where('status_id', Status::FALTA_MEDICA);
} else {
$query->whereIn('status_id', [Status::REALIZADO, Status::FALTOU, Status::FALTA_MEDICA]);
}
})
->get()
->map(function ($query){
return [
'agendamento_id' => $query->agendamento_id,
'exame_id' => $query->exame_id,
'exame_nome' => $query->exame->nome,
'data' => (new Carbon($query->agendamento->data))->format('d/m/Y') ?? null,
'grupo_exame' => $query->agendamento->grupo->nome,
'grupo_exame_id' => $query->agendamento->exame_id,
'procedimento' => [
'id' => $query->exame->procedimento->id ?? null,
'codigo' => $query->exame->procedimento->codigo ?? null,
'nome' => $query->exame->procedimento->nome ?? null,
],
'unidade_id' => $query->agendamento->unidade->id,
'paciente_id' => $query->agendamento->paciente_id,
'profissional_id' => $query->agendamento->profissional_id,
'profissional_nome' => $query->agendamento->jornada->usuario->nome,
'status_troca' => $query->status_troca,
'status_salvo' => $query->status_id ?? null,
'status_id' => $query->status_id ?? null,
'selecionado' => false,
'agendamento_numero' => $query->agendamento->agendamento_numero,
'id' => $query->id,
'grupo_exame' => $query->agendamento->grupo->nome,
'grupo_exame_id' => $query->agendamento->exame_id,
'medico_id' => $query->agendamento->medico_id,
'medico_nome' => $query->agendamento->medico->nome,
'nome_responsavel' => $query->agendamento->nome_responsavel,
'paciente_id' => $query->paciente_id,
'paciente_nome' => $query->paciente->cidadao->nome,
'paciente' => Paciente::where('id', $query->paciente_id)
->with('unidade')
->first(),
'prontuario' => $query->paciente->prontuario,
'profissional_id' => $query->agendamento->profissional_id,
'profissional_nome' => $query->agendamento->jornada->usuario->nome,
'unidade_id' => $query->agendamento->unidade_id,
'unidade_nome' => $query->agendamento->unidade->nome_fantasia,
'urgente' => $query->urgente ?? false,
];
});
}
public static function store(Request $request)
{
return self::saveStatusExame($request);
}
private static function saveStatusExame()
{
foreach (request()->all() as $params) {
$exame = AgendamentoExame::where('agendamento_id', $params['agendamento_id'])
->where('exame_id', $params['exame_id'])
->first();
if ($params['status_id'] == Status::AGENDADO) {
$exame->status_id = Status::AGENDADO;
$exame->arquivo = null;
$exame->laudo_nome = null;
$exame->status_troca = false;
Faturamento::destroy(Faturamento::where('agendamento_exame_id', $exame->id)->pluck('id'));
} else {
$exame->status_id = $params['status_id'];
}
$exame->save();
}
}
}

View File

@@ -0,0 +1,443 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Agendamento\AgendamentoHistorico;
use App\Services\Service;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class AlteracaoResultadoLancamentoService extends Service
{
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'infraestrutura' => $currentLotacao->infraestrutura->nome,
],
'model' => [
'periodo' => [
'start' => Carbon::now()->format('d/m/Y'),
'end' => Carbon::now()->format('d/m/Y'),
],
'lancamentos' => self::getLancamentos(),
'usuario_sistema' => $currentLotacao->usuario->cidadao->nome,
'usuario_id' => $currentLotacao->usuario->id,
],
'additionals' => [
'data_atual' => Carbon::now()->format('d/m/Y')
],
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento_exame.status_troca AS troca',
'exame_imagem_fechamento_status.id AS status_id',
'exame_imagem_fechamento_status.nome AS status_nome',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.urgente',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS nome_social',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->orWhere(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->where('exame_imagem_agendamento_exame.status_troca', true);
})
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
])
->when($request->data_nascimento, function ($query, $value) {
$query->whereDate('cidadao.data_nascimento', Carbon::createFromFormat('d/m/Y', $value));
});
if ($request->prontuario) {
$agendamentos->where('cadastro_paciente.prontuario', $request->prontuario);
}
if ($request->paciente) {
$agendamentos->where('exame_imagem_agendamento.paciente_id', $request->paciente);
}
if ($request->exame_id) {
$agendamentos->where('exame_imagem_agendamento_exame.exame_id', $request->exame_id);
}
$agendamentos = $agendamentos->get();
return $agendamentos;
}
public static function edit($id)
{
$lancamento = AgendamentoExame::findOrFail($id);
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'paciente' => Paciente::where('id', $lancamento->paciente_id)
->with('unidade')
->first(),
'usuario_sistema' => $currentLotacao->usuario->cidadao->nome,
'usuario_id' => $currentLotacao->usuario->id,
'agendamento' => Agendamento::where('id', $lancamento->agendamento_id)
->get()
->map(function ($query) {
return [
'agendamento_numero' => $query->agendamento_numero,
'data' => (new Carbon($query->data))->format('Y-m-d') ?? null,
'id' => $query->id,
'grupo_exame' => $query->grupo->nome,
'grupo_exame_id' => $query->exame_id,
'medico_id' => $query->medico_id,
'medico_nome' => $query->medico->nome,
'nome_responsavel' => $query->nome_responsavel,
'profissional_id' => $query->profissional_id,
'profissional_nome' => $query->jornada->usuario->nome,
'unidade_id' => $query->unidade_id,
'unidade_nome' => $query->unidade->nome_fantasia,
'unidade_solicitante_id' => $query->unidade_solicitante_id,
'unidade_solicitante_nome' => $query->unidadeSolicitante->nome_fantasia,
'urgente' => $query->urgente ?? false,
];
})
->sortBy('data')
->values()
->first(),
],
'model' => [
'exame_id' => $lancamento->exame_id,
'exame_nome' => $lancamento->exame->nome,
'data_atual' => Carbon::now()->format('Y-m-d'),
'id_paciente' => $lancamento->id,
'laudos' => AgendamentoHistorico::whereNotNull('arquivo')
->where('agendamento_exame_id', $lancamento->id)
->groupBy('laudo_nome')
->orderBy('created_at', 'desc')
->limit(1)
->get()
->map(function ($agendamento) {
return [
'arquivo' => $agendamento->arquivo,
'id' => $agendamento->id,
'laudo_nome' => $agendamento->laudo_nome ?? null,
'laudo_data' => (new Carbon($agendamento->created_at))->format('d/m/Y') ?? null,
'laudo_hora' => (new Carbon($agendamento->created_at))->format('H:i') ?? null,
'salvo' => true,
];
})
->values(),
'resultado' => $lancamento->resultado,
'resultado_parametrizacao' => $lancamento->exame->resultado,
'status_id' => $lancamento->status_id ?? null,
'status_troca' => $lancamento->status_troca,
'principal' => $lancamento->principal,
'historico' => AgendamentoHistorico::whereNotNull('resultado')
->where('agendamento_exame_id', $lancamento->id)
->get()
->map(function ($query) {
return [
'data' => (new Carbon($query->created_at))->format('d/m/Y') ?? null,
'horario' => (new Carbon($query->created_at))->format('H:i') ?? null,
'resultado' => $query->resultado,
'arquivo_pdf' => $query->laudo_nome,
];
})
->values(),
'usuario_id' => $lancamento->usuario_id,
]
];
}
public static function store($request)
{
self::validate($request);
try {
$lancamento = AgendamentoExame::findOrFail($request['id']);
DB::transaction(function () use ($request, $lancamento) {
$lancamento->status_troca = true;
$lancamento->principal = true;
if ($lancamento['status_id'] == Status::RESULTADO) {
$lancamento->status_troca = true;
}
$lancamento->update($request->all());
if($request->files->get('laudos') != ''){
foreach ($request->files->get('laudos') as $laudo) {
$arquivo = strtoupper($laudo->getClientOriginalName());
$pasta = storage_path('app' . DIRECTORY_SEPARATOR . 'exame-imagem' . DIRECTORY_SEPARATOR . 'laudos' . DIRECTORY_SEPARATOR . app('config')->get('database.default'));
$laudo->move($pasta, $arquivo);
}
}
$historico = new AgendamentoHistorico();
$historico->agendamento_exame_id = $lancamento['id'];
$historico->agendamento_id = $lancamento['agendamento_id'];
$historico->paciente_id = $lancamento['paciente_id'];
$historico->resultado = $lancamento['resultado'];
$historico->usuario_id = $lancamento['usuario_id'];
if ($request->files->get('laudos') != '') {
$historico->arquivo = $lancamento['arquivo'];
$historico->laudo_nome = $lancamento['laudo_nome'];
}
$historico->save();
$idsHistorico[] = $historico->id;
});
} catch (Exception $error) {
return response()->json(['error' => $error->getMessage()], Response::HTTP_BAD_REQUEST);
}
return $lancamento;
}
public static function download($id)
{
$laudo = AgendamentoHistorico::findOrFail($id);
return [
'nome' => $laudo->arquivo,
'arquivo' => Storage::path('exame-imagem' . DIRECTORY_SEPARATOR . 'laudos' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . $laudo->arquivo),
];
}
private static function getLancamentos()
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_fechamento_status.id AS status_id',
'exame_imagem_fechamento_status.nome AS status_nome',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.urgente',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'cadastro_usuario_registro_tipo.id AS registro_id',
'cadastro_usuario_registro_tipo.descricao AS registro_nome',
'cadastro_usuario_registro_tipo.sigla AS registro_sigla',
'profissional_cidadao.registro_numero AS registro_numero',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS nome_social',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw('
(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->orWhere(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->where('exame_imagem_agendamento_exame.status_troca', true);
})
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
);
$agendamentos = $agendamentos->get();
return $agendamentos;
}
private static function validate($request)
{
$validations = [
'resultado' => [
'nullable',
'string',
'max:3500',
],
];
$messages = [
'resultado.max' => 'A quantidade máxima de caracteres foi excedida.'
];
return $request->validate($validations, $messages);
}
}

View File

@@ -0,0 +1,587 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ExameAgendadoRealizadoService extends Service
{
public static function index($idPaciente)
{
$agendamentosBuilder = self::getAgendamentosBuilder($idPaciente);
$agendamentosBuilder = $agendamentosBuilder
->select(
'exame_imagem_agendamento.id AS atendimento_id',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.exame_id AS grupo_id',
'exame_imagem_agendamento.urgente',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.nome_responsavel',
'exame_imagem_agendamento.urgente',
'exame_imagem_agendamento.observacao',
'exame_imagem_agendamento.hora_exame',
'cadastro_unidade.nome_fantasia',
'cadastro_infraestrutura.telefone AS telefone',
'cadastro_endereco.id AS endereco_id',
'cadastro_endereco.numero AS endereco_numero',
'cadastro_logradouro.id AS logradouro_id',
'cadastro_logradouro.nome AS logradouro_nome',
'cadastro_bairro.id AS bairro_id',
'cadastro_bairro.nome AS bairro_nome',
'medico_cidadao.nome AS medico_solicitante',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS nome_social',
'cidadao.preferencia_nome_id AS preferencia_nome_id',
'cadastro_grupo.nome AS grupo',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'profissional.nome AS profissional_nome',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
);
return $agendamentosBuilder
->get()
->map(function ($plantao) {
return [
'data' => $plantao->data,
'paciente_nome' => $plantao->paciente_nome,
'hora_exame' => $plantao->hora_exame,
'nome_fantasia' => $plantao->nome_fantasia,
'profissional_nome' => $plantao->profissional_nome,
'exames_incluidos' => AgendamentoExame::where('agendamento_id', $plantao->atendimento_id)
->get()
->map(function ($query) {
return [
'id' => $query->id,
'exame_id' => $query->exame_id,
'nome' => $query->exame->nome,
'codigo' => $query->exame->codigo ?? null,
'observacao' => $query->exame->observacao,
'status_id' => $query->status_id,
'valor' => $query->exame->procedimento->valor_servico_ambilatorial ?? null,
];
}),
];
});
}
private static function getAgendamentosBuilder($idPaciente)
{
$agendamentos = DB::table('exame_imagem_agendamento')
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_endereco',
'cadastro_endereco.id',
'cadastro_infraestrutura.endereco_id'
)
->join(
'cadastro_logradouro',
'cadastro_logradouro.id',
'cadastro_endereco.logradouro_id'
)
->join(
'cadastro_bairro',
'cadastro_bairro.id',
'cadastro_logradouro.bairro_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'parametrizacao_exame.grupo_tipo_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->where('exame_imagem_agendamento.paciente_id', $idPaciente)
->orderBy('data');
return $agendamentos;
}
public static function getDados($idPaciente)
{
$paciente = DB::table('exame_imagem_agendamento')
->select(
'cadastro_paciente.id AS id_paciente',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS nome_social',
'cadastro_sexo_paciente.descricao AS sexo',
'cadastro_unidade.nome_fantasia AS unidade_referencia',
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'cadastro_sexo AS cadastro_sexo_paciente',
'cadastro_sexo_paciente.id',
'cidadao.sexo_id'
)
->leftJoin(
'cadastro_cidadao_telefone AS telefone',
'telefone.cidadao_id',
'cidadao.id'
)
->leftJoin(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_paciente.unidade_id'
)
->where('exame_imagem_agendamento.paciente_id', $idPaciente)
->orderBy('data')
->first();
return $paciente;
}
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'infraestrutura' => $currentLotacao->infraestrutura->nome,
],
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'atendimento' => null,
'prontuario' => null,
'data_nascimento' => null,
'paciente' => null,
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.retroativo',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.jornada_id AS jornada_agendamento',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS nome_social',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame',
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%Y/%m/%d') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw("
(
SELECT GROUP_CONCAT(cadastro_cidadao_telefone.numero SEPARATOR ', ')
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
) AS paciente_telefone
"),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->leftJoin(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->leftJoin(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->leftJoin(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->leftJoin(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->leftJoin(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->leftJoin(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->leftJoin(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->leftJoin(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->leftJoin(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->leftJoin(
'cadastro_cidadao AS cadastro_cidadao_usuario',
'cadastro_cidadao_usuario.id',
'cadastro_usuario.cidadao_id'
)
->leftJoin(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftJoin(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->leftJoin(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->groupBy('paciente_id')
->orderBy('cidadao.nome')
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
});
if ($request->paciente_id) {
$agendamentos->where('exame_imagem_agendamento.paciente_id', $request->paciente_id);
}
if ($request->prontuario) {
$agendamentos->where('cadastro_paciente.prontuario', $request->prontuario);
}
if ($request->data_nascimento) {
$agendamentos->where('cidadao.data_nascimento', $request->data_nascimento);
}
$agendamentos = $agendamentos->get();
return $agendamentos;
}
public static function show($id)
{
$agendamento = Agendamento::where('paciente_id', $id)->firstOrFail();
return [
'form' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'paciente' => [
'nome' => $agendamento->paciente->cidadao->nome ?? null,
'nomeSocial' => $agendamento->paciente->cidadao->nome_social,
'prefereNomeSocial' => $agendamento->paciente->cidadao
->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'data_nascimento' => $agendamento->paciente->cidadao->data_nascimento
? $agendamento->paciente->cidadao->data_nascimento->format('d/m/Y')
: '',
'cpf' => $agendamento->paciente->cidadao->cpf
? MaskUtil::getCpfMasked($agendamento->paciente->cidadao->cpf) : null,
'rg' => $agendamento->paciente->cidadao->carteiraIdentidade->numero ?? null,
'convenio_medico_nome' => $agendamento->paciente->cidadao->conveniosMedico->first()->nome ?? null,
'situacao_familiar' => $agendamento->paciente->cidadao->situacaoFamiliarConjugal->descricao ?? null,
'prontuario' => $agendamento->paciente->prontuario,
'unidade' => $agendamento->paciente->unidade->nome_fantasia ?? null,
'sexo' => $agendamento->paciente->cidadao->sexo ?? '-',
'classificacao_id' => $agendamento->paciente->classificacao_id ?? '-',
'classificacao_nome' => $agendamento->paciente->classificacao->descricao ?? '-',
'cns' => $agendamento->paciente->cidadao->cns ? MaskUtil::getCnsMasked($agendamento->paciente->cidadao->cns) : '',
'telefone' => MaskUtil::getPhoneMasked($agendamento->paciente->cidadao->telefone_principal->numero ?? ''),
],
'endereco' => [
'estado_id' => isset($agendamento->paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->id)
? $agendamento->paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->id
: '',
'municipio' => isset($agendamento->paciente->cidadao->domicilio->endereco->logradouro->municipio)
? $agendamento->paciente->cidadao->domicilio->endereco->logradouro->municipio
: '',
'logradouro' => isset($agendamento->paciente->cidadao->domicilio->endereco->logradouro)
? $agendamento->paciente->cidadao->domicilio->endereco->logradouro
: '',
'cep' => isset($agendamento->paciente->cidadao->domicilio->endereco->logradouro->cep)
? MaskUtil::getCepMasked($agendamento->paciente->cidadao->domicilio->endereco->logradouro->cep)
: '',
'numero' => isset($agendamento->paciente->cidadao->domicilio->endereco->numero)
? $agendamento->paciente->cidadao->domicilio->endereco->numero
: '',
'sem_numero' => isset($agendamento->paciente->cidadao->domicilio->endereco->sem_numero)
? $agendamento->paciente->cidadao->domicilio->endereco->sem_numero
: '',
'complemento' => isset($agendamento->paciente->cidadao->domicilio->endereco->complemento)
? $agendamento->paciente->cidadao->domicilio->endereco->complemento
: '',
'zona_id' => isset($agendamento->paciente->cidadao->domicilio->endereco->zona_id)
? $agendamento->paciente->cidadao->domicilio->endereco->zona_id
: '',
],
],
'model' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'agendados' => Agendamento::where('paciente_id', $id)
->whereHas('agendamentoExame', function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
})
->get()
->map(fn ($agendamento) => [
'agendamento_id' => $agendamento->id,
'agendamento_numero' => $agendamento->agendamento_numero,
'data' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
'incluido' => AgendamentoExame::where('agendamento_id', $agendamento->id)
->get()
->map(function ($query) {
return [
'id' => $query->id,
'exame_id' => $query->exame_id,
'nome' => $query->exame->nome,
'codigo' => $query->exame->codigo ?? null,
'valor' => $query->valor,
'status' => $query->status->nome ?? 'AGENDADO',
'status_id' => $query->status_id,
'prazo_entrega' => $query->exame->prazo_entrega ?? null,
'observacao' => $query->exame->observacao ?? null
];
})
->values(),
'grupo_exame_id' => $agendamento->exame_id,
'grupo_exame_nome' => $agendamento->grupo->nome,
'profissional_id' => $agendamento->profissional_id,
'profissional_nome' => $agendamento->jornada->usuario->nome,
'paciente_id' => $agendamento->paciente_id,
'unidade_nome' => $agendamento->unidade->nome_fantasia,
'local_atendimento' => $agendamento->infraestrutura->nome,
'medico_id' => $agendamento->medico_id,
'medico_nome' => $agendamento->medico->nome,
])
->sortBy('data')
->values(),
'realizados' => Agendamento::where('paciente_id', $id)
->whereHas('agendamentoExame', function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::REALIZADO);
})
->whereNotExists(function($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento_exame')
->whereColumn('exame_imagem_agendamento_exame.agendamento_id', 'exame_imagem_agendamento.id')
->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO);
})
->get()
->map(fn ($agendamento) => [
'agendamento_id' => $agendamento->id,
'agendamento_numero' => $agendamento->agendamento_numero,
'data' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
'incluido' => AgendamentoExame::where('agendamento_id', $agendamento->id)
->get()
->map(function ($query) {
return [
'id' => $query->id,
'exame_id' => $query->exame_id,
'nome' => $query->exame->nome,
'codigo' => $query->exame->codigo ?? null,
'valor' => $query->valor,
'status_id' => $query->status_id,
'status' => self::getStatus($query),
'prazo_entrega' => $query->exame->prazo_entrega ?? null,
'observacao' => $query->exame->observacao ?? null
];
})
->values(),
'medico_id' => $agendamento->medico_id,
'medico_nome' => $agendamento->medico->nome,
'paciente_id' => $agendamento->paciente_id,
'unidade_nome' => $agendamento->unidade->nome_fantasia,
'local_atendimento' => $agendamento->infraestrutura->nome,
'grupo_exame_id' => $agendamento->exame_id,
'grupo_exame_nome' => $agendamento->grupo->nome,
'profissional_id' => $agendamento->profissional_id,
'profissional_nome' => $agendamento->jornada->usuario->nome,
])
->sortBy('data')
->values(),
],
];
}
public static function getStatus($query)
{
if ($query->status_id == Status::REALIZADO) {
return 'REALIZADO';
} else if ($query->status_id == Status::FALTOU) {
return 'FALTOU';
} else if ($query->status_id == Status::RESULTADO) {
return 'RESULTADO';
} else if ($query->status_id == Status::AGENDADO) {
return 'AGENDADO';
}
return $query->status->nome;
}
}

View File

@@ -0,0 +1,367 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\Regulacao\StatusTipo as RegulacaoStatusTipoEnum;
use App\Exceptions\ExameImagem\ProtocoloFechamentoException;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Fechamento\Faturamento;
use App\Models\ExameImagem\Fechamento\StatusFechamento;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Regulacao\SolicitacaoService as RegulacaoSolicitacaoService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class FechamentoService extends Service
{
public static function list()
{
$now = Carbon::now();
$currentLotacao = self::getCurrentLotacao();
$isSupervisor = DB::table('exame_imagem_parametrizacao_supervisor')
->where('usuario_id', $currentLotacao->usuario_id)
->exists();
return [
'form' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'infraestrutura' => $currentLotacao->infraestrutura->nome,
'status' => DB::table('exame_imagem_fechamento_status')
->select(
'exame_imagem_fechamento_status.id as id',
'exame_imagem_fechamento_status.nome as nome'
)
->leftjoin('exame_imagem_agendamento_exame', 'exame_imagem_agendamento_exame.status_id', '=', 'exame_imagem_fechamento_status.id')
->leftjoin('exame_imagem_agendamento', 'exame_imagem_agendamento.id', '=', 'exame_imagem_agendamento_exame.agendamento_id')
->leftjoin('regulacao_solicitacao', 'regulacao_solicitacao.id', '=', 'exame_imagem_agendamento.regulacao_solicitacao_id')
->whereNotIn('exame_imagem_fechamento_status.id', [Status::RESULTADO,Status::CANCELADO, Status::REAGENDADO, Status::FALTA_MEDICA])
->orderBy('exame_imagem_fechamento_status.nome')
->distinct()
->get()
->map(fn($status) => [
'id' => $status->id,
'nome' => $status->nome,
]),
],
'model' => [
'periodo' => [
'start' => Carbon::now()->format('d/m/Y'),
'end' => Carbon::now()->format('d/m/Y'),
],
'agendamentos' => self::getAgendamentos(),
'agendamentosNotSave' => null,
'unidade_id' => null,
'profissional_id' => null,
'medico_id' => null,
'grupo_exame_id' => null,
'exame_id' => null,
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y'),
'is_supervisor' => $isSupervisor,
],
];
}
private static function getAgendamentos()
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.id AS agendamento_exame_id',
'cadastro_grupo.id AS grupo_exame_id',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'cadastro_grupo.nome as grupo_nome',
'exame_imagem_fechamento_status.id AS status_id',
'exame_imagem_fechamento_status.nome AS status_nome',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.urgente',
'exame_imagem_agendamento.nome_responsavel',
'exame_imagem_agendamento.regulacao_solicitacao_id AS regulacao_solicitacao_id',
'cadastro_unidade.nome_fantasia as unidade_nome',
'medico_cidadao.nome AS medico',
'profissional.nome AS profissional_nome',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cidadao.cns AS paciente_cns',
'cidadao.cpf as paciente_cpf',
'cidadao.nome_social AS nome_social',
'sexo.descricao AS paciente_sexo',
'unidade_referencia_paciente.nome_fantasia AS paciente_unidade_referencia',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw('IF(cidadao.data_nascimento IS NULL, "Não informada",
TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, CURDATE())) as idade'),
DB::raw('
(CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END) as nome_mae'
),
DB::raw("
(
SELECT numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.cidadao_id = cidadao.id
AND cadastro_cidadao_telefone.principal = TRUE
LIMIT 1
) AS paciente_telefone
"),
'regulacao_solicitacao.numero',
'regulacao_parametrizacao_prestador_interno.controla_protocolo_fechamento',
)
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
})
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.id', 'exame_imagem_agendamento_exame.agendamento_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'exame_imagem_agendamento.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_solicitante', 'cadastro_infraestrutura_solicitante.id', 'exame_imagem_agendamento.infraestrutura_solicitante_id')
->join('cadastro_unidade AS cadastro_unidade_solicitante', 'cadastro_unidade_solicitante.id', 'cadastro_infraestrutura_solicitante.unidade_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_agendamento.medico_id')
->join('cadastro_cidadao AS medico_cidadao', 'medico_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('cadastro_usuario AS profissional_cidadao', 'profissional_cidadao.id', 'exame_imagem_agendamento.profissional_id')
->join('cadastro_cidadao AS profissional', 'profissional.id', 'profissional_cidadao.cidadao_id')
->leftJoin('exame_imagem_fechamento_status', 'exame_imagem_fechamento_status.id', 'exame_imagem_agendamento_exame.status_id')
->join('parametrizacao_exame', 'parametrizacao_exame.id', 'exame_imagem_agendamento_exame.exame_id')
->leftJoin('cadastro_paciente', 'cadastro_paciente.id', 'exame_imagem_agendamento_exame.paciente_id')
->leftJoin('cadastro_cidadao AS cidadao', 'cidadao.id', 'cadastro_paciente.cidadao_id')
->leftJoin('cadastro_usuario_registro_tipo', 'cadastro_usuario_registro_tipo.id', 'profissional_cidadao.registro_tipo_id')
->leftJoin('cadastro_grupo', 'cadastro_grupo.id', 'parametrizacao_exame.grupo_tipo_id')
->leftJoin('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id')
->leftJoin('cadastro_unidade AS unidade_referencia_paciente', 'unidade_referencia_paciente.id', 'cadastro_paciente.unidade_id')
->leftJoin('regulacao_solicitacao', 'regulacao_solicitacao.id', 'exame_imagem_agendamento.regulacao_solicitacao_id')
->leftJoin('regulacao_parametrizacao_prestador_interno', 'regulacao_parametrizacao_prestador_interno.id', 'regulacao_solicitacao.prestador_interno_id')
->get()
->map(function ($item) {
return [
'id_paciente' => $item->id_paciente,
'agendamento_numero' => $item->agendamento_numero,
'agendamento_exame_id' => $item->agendamento_exame_id,
'grupo_exame_id' => $item->grupo_exame_id,
'grupo_nome' => $item->grupo_nome,
'status_id' => $item->status_id,
'status_nome' => $item->status_nome,
'agendamento_id' => $item->agendamento_id,
'medico_id' => $item->medico_id,
'unidade_id' => $item->unidade_id,
'profissional_id' => $item->profissional_id,
'urgente' => $item->urgente,
'unidade_nome' => $item->unidade_nome,
'medico' => $item->medico,
'profissional_nome' => $item->profissional_nome,
'unidade_solicitante_nome' => $item->unidade_solicitante_nome,
'paciente_id' => $item->paciente_id,
'paciente_nome' => $item->paciente_nome,
'paciente_cns' => $item->paciente_cns,
'paciente_cpf' => $item->paciente_cpf,
'paciente_telefone' => $item->paciente_telefone,
'paciente_idade' => $item->idade,
'paciente_sexo' => $item->paciente_sexo,
'nome_responsavel' => $item->nome_responsavel ?? null,
'paciente_unidade_referencia' => $item->paciente_unidade_referencia ?? null,
'nome_social' => $item->nome_social,
'exame_id' => $item->exame_id,
'exame_nome' => $item->exame_nome,
'data' => $item->data,
'data_pedido' => $item->data_pedido,
'prontuario' => $item->prontuario,
'data_nascimento' => $item->data_nascimento,
'nome_mae' => $item->nome_mae,
'regulacao_solicitacao_id' => $item->regulacao_solicitacao_id ?? null,
'faturamento' => DB::table('exame_imagem_agendamento_exame')
->select('id', 'exame_id')
->where('agendamento_id', $item->agendamento_id)
->get()
->map(function ($faturamento) use ($item) {
$exame = DB::table('parametrizacao_exame')
->select('nome', 'codigo', 'exige_procedimento', 'valor', 'valor_sigtap')
->where('id', $faturamento->exame_id)
->first();
$procedimento = DB::table('sigtap.procedimento')
->where('codigo',
$exame->codigo
)
->where('competencia_id', function ($query) {
$query->select('id')
->from('sigtap.competencia')
->orderByDesc('valor')
->limit(1);
})
->first();
return [
'id' => $faturamento->id,
'agendamento_id' => $item->agendamento_id,
'agendamento_exame_id' => $item->agendamento_exame_id,
'exame_id' => $item->exame_id,
'data' => $item->data,
'grupo_id' => $item->grupo_exame_id,
'paciente_id' => $item->paciente_id,
'unidade_id' => $item->unidade_id,
'valor_normal' => $exame->valor ?? null,
'exige_procedimento' => $exame->exige_procedimento,
'profissional_id' => $item->profissional_id,
'profissional_nome' => $item->profissional_nome ?? null,
'procedimento_id' => $procedimento->id ?? null,
'procedimento_codigo' => $procedimento->codigo ?? null,
'procedimento_nome' => $procedimento->nome ?? null,
'valor' => $procedimento->valor_servico_ambilatorial ?? null,
'lotacao' => DB::table('cadastro_lotacao')
->select('id', 'ocupacao_id', 'usuario_id')
->whereNull('deleted_at')
->where('usuario_id', $item->profissional_id)
->get()
->map(function ($lotacaoProfissional) use ($item) {
return [
'ocupacao_id' => $lotacaoProfissional->ocupacao_id,
'usuario_id' => $lotacaoProfissional->usuario_id,
'lotacao_id' => $lotacaoProfissional->id,
];
})
->toArray(),
];
}),
'numero' => $item->numero,
'controla_protocolo_fechamento' => $item->controla_protocolo_fechamento,
'protocolo_fechamento' => null,
];
});
return $agendamentos->isNotEmpty() ? $agendamentos->toArray() : [];
}
public static function store(Request $request)
{
return self::saveStatusExame($request);
}
private static function saveStatusExame($request)
{
$ids = [];
foreach ($request->agendamentos as $params) {
if ($params['status_id'] == Status::REALIZADO && $params['controla_protocolo_fechamento']
&& $params['numero'] && $params['numero'] !== $params['protocolo_fechamento']) {
throw new ProtocoloFechamentoException();
}
$tipo = AgendamentoExame::where('agendamento_id', $params['agendamento_id'])
->where('id', $params['agendamento_exame_id'])
->where('exame_id', $params['exame_id'])
->first();
$tipo->status_id = $params['status_id'];
if($params['status_id'] != null){
$tipo->save();
}
$regulacaoSolicitacaoId = $params['regulacao_solicitacao_id'] ?? null;
if ($regulacaoSolicitacaoId) {
$statusTipoId = null;
if ($params['status_id'] === Status::REALIZADO) {
$statusTipoId = RegulacaoStatusTipoEnum::REALIZADO;
} else if ($params['status_id'] === Status::FALTOU) {
$statusTipoId = RegulacaoStatusTipoEnum::FALTA;
}
if (!is_null($statusTipoId)) {
RegulacaoSolicitacaoService::updateStatus($regulacaoSolicitacaoId, $statusTipoId);
}
}
$ids[] = $tipo->id;
if ($params['status_id'] == Status::REALIZADO) {
foreach ($params['faturamento'] as $param_faturamento) {
if($param_faturamento['exige_procedimento']){
$faturamento = Faturamento::where('exame_id', $param_faturamento['exame_id'])
->where('agendamento_exame_id', $param_faturamento['agendamento_exame_id'])
->where('grupo_id', $param_faturamento['grupo_id'])
->first() ?? new Faturamento();
foreach ($param_faturamento['lotacao'] as $lotacao_faturar) {
$lotacoes = Lotacao::join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->select([
'cadastro_lotacao.id',
'cadastro_lotacao.ocupacao_id',
'cadastro_lotacao.usuario_id',
])
->where('cadastro_lotacao.id', $lotacao_faturar['lotacao_id'])
->where('cadastro_lotacao.usuario_id', $lotacao_faturar['usuario_id'])
->where('cadastro_infraestrutura.unidade_id', $param_faturamento['unidade_id'])
->where('cadastro_lotacao.ativo', true)
->whereNull('cadastro_lotacao.deleted_at')
->first();
if (!empty($lotacoes)) {
$faturamento->lotacao_id = $lotacoes->id;
$faturamento->ocupacao_id = $lotacoes->ocupacao_id;
$faturamento->usuario_id = $lotacoes->usuario_id;
break;
} else {
$faturamento->lotacao_id = $lotacao_faturar['lotacao_id'];
$faturamento->ocupacao_id = $lotacao_faturar['ocupacao_id'];
$faturamento->usuario_id = $lotacao_faturar['usuario_id'];
}
}
$faturamento->agendamento_exame_id = $param_faturamento['agendamento_exame_id'];
$faturamento->grupo_id = $param_faturamento['grupo_id'];
$faturamento->unidade_id = $param_faturamento['unidade_id'];
$faturamento->valor = $param_faturamento['valor'];
$faturamento->valor_normal = $param_faturamento['valor_normal'];
$faturamento->data = Carbon::createFromFormat('d/m/Y', $param_faturamento['data']);
$faturamento->procedimento_id = $param_faturamento['procedimento_id'];
$faturamento->quantidade = 1;
$faturamento->fill($params);
$faturamento->save();
$idsFaturamento[] = $faturamento->id;
}
}
}
}
}
}

View File

@@ -0,0 +1,377 @@
<?php
namespace App\Services\ExameImagem;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Parametrizacao\MensagemProtocolo;
use App\Models\Intranet\Cliente;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ImpressaoService extends Service
{
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'infraestrutura' => $currentLotacao->infraestrutura->nome,
],
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'atendimento' => null,
'prontuario' => null,
'data_nascimento' => null,
'paciente' => null,
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento')
->select(
'exame_imagem_agendamento.id AS atendimento_id',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.exame_id AS grupo_id',
'exame_imagem_agendamento.urgente',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.nome_responsavel',
'exame_imagem_agendamento.urgente',
'exame_imagem_agendamento.observacao',
'exame_imagem_agendamento.hora_exame',
'cadastro_unidade.nome_fantasia',
'cadastro_infraestrutura.telefone AS telefone',
'cadastro_endereco.id AS endereco_id',
DB::raw("COALESCE(cadastro_endereco.numero, 'S/N') AS endereco_numero"),
'cadastro_logradouro.id AS logradouro_id',
'cadastro_logradouro.nome AS logradouro_nome',
'cadastro_bairro.id AS bairro_id',
'cadastro_bairro.nome AS bairro_nome',
'medico_cidadao.nome AS medico_solicitante',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cadastro_grupo.nome AS grupo',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'profissional.nome AS profissional_nome',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_endereco',
'cadastro_endereco.id',
'cadastro_infraestrutura.endereco_id'
)
->join(
'cadastro_logradouro',
'cadastro_logradouro.id',
'cadastro_endereco.logradouro_id'
)
->join(
'cadastro_bairro',
'cadastro_bairro.id',
'cadastro_logradouro.bairro_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->when($request->periodo, function ($query, $value) {
$query->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $value['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $value['end'])->setTime(23, 59, 59)
]);
})
->when($request->data_nascimento, function ($query, $value) {
$query->whereDate('cidadao.data_nascimento', Carbon::createFromFormat('d/m/Y', $value));
})
->when($request->paciente, function ($query, $value) {
$query->where('cidadao.nome', 'like', "{$value}%");
})
->when($request->atendimento, function ($query, $value) {
$query->where('exame_imagem_agendamento.agendamento_numero', $value);
})
->when($request->prontuario, function ($query, $value) {
$query->where('cadastro_paciente.prontuario', $value);
})
->when($request->id, function ($query, $value) {
$query->where('exame_imagem_agendamento.id', $value);
})
->get()
->map(function ($atendimento) {
$atendimento->impressoes = self::getImpressoes(
$atendimento->atendimento_id,
[
'agendamento' => [
'protocolo' => [
'bairro_unidade_executante' => $atendimento->bairro_nome,
'exames_incluidos' => AgendamentoExame::where('agendamento_id', $atendimento->atendimento_id)
->get()
->map(function ($query) {
return [
'id' => $query->id,
'exame_id' => $query->exame_id,
'nome' => $query->exame->nome,
'codigo' => $query->exame->codigo ?? null,
'observacao' => $query->exame->observacao,
'status_id' => $query->status_id ?? null,
'valor' => $query->exame->procedimento->valor_servico_ambilatorial ?? null,
];
})
->values(),
'data_exame' => $atendimento->data,
'data_nascimento' => $atendimento->data_nascimento,
'grupo' => $atendimento->grupo,
'hora_exame' => (new Carbon($atendimento->hora_exame))->format('H:i') ?? null,
'logradouro_unidade_executante' => $atendimento->logradouro_nome,
'medico_solicitante' => $atendimento->medico_solicitante,
'mensagem_protocolo' => self::getMensagem(),
'numero_agendamento' => $atendimento->agendamento_numero,
'nome_responsavel' => $atendimento->nome_responsavel,
'numero_unidade_executante' => $atendimento->endereco_numero,
'observacao' => $atendimento->observacao,
'paciente' => $atendimento->paciente_nome,
'prontuario' => $atendimento->prontuario,
'profissional' => $atendimento->profissional_nome,
'sistema' => self::getSistema(),
'telefone_unidade_executante' => MaskUtil::getPhoneMasked($atendimento->telefone),
'unidade_executante' => $atendimento->nome_fantasia,
'unidade_solicitante' => $atendimento->unidade_solicitante_nome,
'urgente' => $atendimento->urgente,
],
'etiqueta' => [
'exames_incluidos' => AgendamentoExame::where('agendamento_id', $atendimento->atendimento_id)
->get()
->map(function ($query) {
return [
'id' => $query->id,
'exame_id' => $query->exame_id,
'nome' => $query->exame->nome,
'codigo' => $query->exame->codigo ?? null,
'observacao' => $query->exame->observacao,
'status_id' => $query->status_id ?? null,
'valor' => $query->exame->procedimento->valor_servico_ambilatorial ?? null,
];
})
->values(),
'data_exame' => $atendimento->data,
'data_nascimento' => $atendimento->data_nascimento,
'medico_solicitante' => $atendimento->medico_solicitante,
'numero_agendamento' => $atendimento->agendamento_numero,
'paciente' => $atendimento->paciente_nome,
'unidade_executante' => $atendimento->nome_fantasia,
]
]
]
);
return $atendimento;
});
return $agendamentos;
}
private static function getSistema()
{
$cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail();
return [
'ramo_atividade' => $cliente->sistema->ramoAtividade->nome ?? null,
'nome_sistema' => $cliente->sistema->nome ?? null,
'versao' => $cliente->sistema->versao ?? null,
];
}
private static function getMensagem()
{
$mensagemProtocolo = MensagemProtocolo::select('mensagem')->first();
return [
'mensagem' => $mensagemProtocolo->mensagem,
];
}
public static function getImpressoes($atendimentoId, $data = [], $excluded = [])
{
$impressoes = [
'agendamento' => self::getimpressoesAgendamentoExames($atendimentoId, $data['agendamento'] ?? []),
];
foreach ($excluded as $key => $value) {
if (is_array($value)) {
foreach ($value as $col => $vl) {
$indice = array_search($vl, array_column($impressoes[$key], $col));
if ($indice >= 0) {
unset($impressoes[$key][$indice]);
}
}
} else {
if (array_key_exists($value, $impressoes)) {
unset($impressoes[$value]);
}
}
}
return $impressoes;
}
public static function getimpressoesAgendamentoExames($atendimentoId, $data = [])
{
$impressoesAgendamentoExames = [];
if (isset($data['protocolo'])) {
$impressoesAgendamentoExames[] = [
'value' => 'protocolo',
'text' => 'Comprovante de agendamento',
'disabled' => false,
'data' => $data['protocolo']
];
}
if (isset($data['etiqueta'])) {
$impressoesAgendamentoExames[] = [
'value' => 'etiqueta',
'text' => 'Etiqueta',
'disabled' => false,
'data' => $data['etiqueta']
];
}
return $impressoesAgendamentoExames;
}
public static function getOnlyDigits(&$value)
{
return preg_replace('/[^\d]/', '', (string) $value);
}
public static function getPhoneMasked($number)
{
$number = self::getOnlyDigits($number);
switch (strlen($number)) {
case 10: {
return preg_replace(
'/(\d{2})(\d{4})(\d{4})/',
'($1) $2-$3',
$number
);
}
case 11: {
return preg_replace(
'/(\d{2})(\d{5})(\d{4})/',
'($1) $2-$3',
$number
);
}
default: {
return $number;
}
}
}
}

View File

@@ -0,0 +1,338 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Feriado\Feriado;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\CotaPrestador;
use App\Models\ExameImagem\Jornada\Jornada;
use App\Models\ExameImagem\Jornada\SemanaJornada;
use App\Models\ExameImagem\Jornada\StatusJornada;
use App\Models\ExameImagem\Jornada\TipoJornada;
use App\Models\ExameImagem\Parametrizacao;
use App\Models\ExameImagem\Parametrizacao\ControleJornada;
use App\Models\ExameImagem\Parametrizacao\IntegracaoAplicativo;
use App\Models\ExameImagem\Parametrizacao\Supervisor;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class JornadaService extends Service
{
public static function datatable()
{
$gerenciamentoJornadas = DB::table('cadastro_usuario')
->select(
'cadastro_usuario.id',
'cadastro_usuario.cidadao_id',
'cadastro_cidadao.nome',
'cadastro_cidadao.cpf',
'cadastro_usuario.bloqueado',
'cadastro_lotacao.usuario_id',
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'ocupacao.nome AS ocupacao_nome',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") as data_nascimento')
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'exame_imagem_parametrizacao_ocupacao',
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'cadastro_lotacao.ocupacao_id'
)
->where('cadastro_usuario.bloqueado', '=', '0')
->whereNull('cadastro_lotacao.deleted_at')
->whereNull('exame_imagem_parametrizacao_ocupacao.deleted_at')
->groupBy('cadastro_usuario.id');
return $gerenciamentoJornadas;
}
public static function show($id)
{
$usuario = Usuario::findOrFail($id);
$controleJornada = ControleJornada::select('tipo_controle')->first();
$integracaoAplicativo = IntegracaoAplicativo::first();
return [
'form' => [
'habilita_agendamento_app' => $integracaoAplicativo->habilita_agendamento_conectasus_cidadao ?? false,
'unidadesParametrizadas' => Parametrizacao::where('executante', true)
->orderBy('unidade_id')
->get()
->unique('unidade_id')
->map(fn($query) => [
'id' => $query->id,
'unidade_id' => $query->unidade_id,
'nome_fantasia' => $query->unidade->nome_fantasia,
'infraestruturas' => $query->unidade->infraestruturas
->sortBy('nome')
->map(fn($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])
->values()
])
->values(),
'feriados' => Feriado::orderBy('id')
->get()
->map(fn ($feriado) => [
'id' => $feriado->id,
'data' => (new Carbon($feriado->data))->format('d/m/Y') ?? null,
'tipo_id' => $feriado->tipo_id,
'tipo_nome' => $feriado->tipo->descricao,
'observacao' => $feriado->observacao,
'modulos' => $feriado->modulos->pluck('id'),
]),
'exames' => Exame::whereNotNull('grupo_tipo_id')
->where('tipo_id', Tipo::IMAGEM)
->groupBy('grupo_tipo_id')
->get()
->map(function ($query) {
return [
'id' => $query->grupo->id,
'nome' => $query->grupo->nome,
];
})
->values(),
'dias_semana' => SemanaJornada::orderBy('id')
->get()
->map(fn ($semanaJornadas) => [
'id' => $semanaJornadas->id,
'nome' => $semanaJornadas->nome,
'disabled' => true,
]),
'status' => StatusJornada::orderBy('id')
->get()
->map(fn ($statusJornadas) => [
'id' => $statusJornadas->id,
'nome' => $statusJornadas->nome
]),
'prestadores' => Unidade::whereHas('parametrizacaoExameImagem', function ($query) {
$query->where('prestador', true);
})
->orderBy('nome_fantasia')
->get()
->map(fn ($unidade) => [
'unidade_id' => $unidade->id,
'nome_fantasia' => $unidade->nome_fantasia,
'prestador' => $unidade->parametrizacaoExameImagem->prestador,
'prestador_id' => $unidade->parametrizacaoExameImagem->id,
])
->unique('unidade_id')
->values(),
'tipos' => TipoJornada::orderBy('id')
->get()
->map(fn ($tipo) => [
'id' => $tipo->id,
'nome' => $tipo->nome
]),
'controleJornada' => $controleJornada->tipo_controle,
'min_date' => Carbon::now()->subDays(90)->format('d/m/Y'),
'max_date' => Carbon::now()->addYear()->format('d/m/Y'),
'profissional' => [
'id' => $usuario->id,
'nome' => $usuario->cidadao->nome,
'data_nascimento' => is_null($usuario->cidadao->data_nascimento)
? null : (new Carbon($usuario->cidadao->data_nascimento))->format('d/m/Y'),
'cns' => MaskUtil::getCnsMasked($usuario->cidadao->cns),
'cpf' => MaskUtil::getCpfMasked($usuario->cidadao->cpf),
],
],
'model' => [
'data_atual' => Carbon::now()->format('Y-m-d'),
'jornadas' => DB::table('exame_imagem_jornada as jornadas')
->leftJoin('cadastro_unidade as unidades', 'jornadas.unidade_id', '=', 'unidades.id')
->leftJoin('exame_imagem_jornada_tipo as tipos', 'jornadas.tipo_id', '=', 'tipos.id')
->leftJoin('exame_imagem_jornada_status as status', 'jornadas.status_id', '=', 'status.id')
->leftJoin('cadastro_infraestrutura as infraestruturas', 'jornadas.infraestrutura_id', '=', 'infraestruturas.id')
->leftJoin('exame_imagem_parametrizacao_unidade as prestador', 'jornadas.prestador_id', '=', 'prestador.id')
->leftJoin('cadastro_unidade as prestador_unidade', 'prestador.unidade_id', '=', 'prestador_unidade.id')
->leftJoin('cadastro_grupo', 'jornadas.exame_id', '=', 'cadastro_grupo.id')
->where('jornadas.usuario_id', $id)
->select([
'*',
'jornadas.id as jornada_id',
'jornadas.unidade_id',
'unidades.nome_fantasia as unidade_nome',
'prestador_unidade.nome_fantasia as prestador_nome',
'jornadas.infraestrutura_id',
'infraestruturas.nome as infraestrutura_nome',
'infraestruturas.principal as infraestrutura_principal',
'jornadas.usuario_id',
'jornadas.exame_id',
'jornadas.semana_id',
'jornadas.status_id',
'jornadas.prestador_id',
'status.nome as status_nome',
'cadastro_grupo.nome as exame_nome',
'jornadas.tipo_id',
'tipos.nome as tipo_nome'
])
->get()
->map(function ($jornada) {
$agendamentos = DB::table('exame_imagem_agendamento as agendamento')
->leftJoin('exame_imagem_agendamento_exame as agendamento_exame', 'agendamento_exame.agendamento_id', '=', 'agendamento.id')
->where('agendamento.jornada_id', $jornada->jornada_id)
->where(function ($query) {
$query->whereNotIn('agendamento_exame.status_id', [Status::CANCELADO, Status::REAGENDADO])
->orWhereNull('agendamento_exame.status_id');
})
->count();
$vinculos = DB::table('exame_imagem_agendamento as agendamento')
->join('exame_imagem_agendamento_exame as agendamento_exame', 'agendamento_exame.agendamento_id', '=', 'agendamento.id')
->where('agendamento.jornada_id', $jornada->jornada_id)
->exists();
$primeiroHorario = DB::table('exame_imagem_agendamento')->where('jornada_id', $jornada->jornada_id)
->orderBy('hora_exame', 'asc')
->value('hora_exame');
$ultimoHorario = DB::table('exame_imagem_agendamento')->where('jornada_id', $jornada->jornada_id)
->orderBy('hora_exame', 'desc')
->value('hora_exame');
return [
'jornada_id' => $jornada->jornada_id,
'unidade_id' => $jornada->unidade_id,
'unidade_nome' => $jornada->unidade_nome,
'infraestrutura_id' => $jornada->infraestrutura_id,
'infraestrutura_nome' => $jornada->infraestrutura_principal ? $jornada->unidade_nome : $jornada->infraestrutura_nome,
'usuario_id' => $jornada->usuario_id,
'usuario_nome' => $jornada->usuario->nome ?? null,
'exame_id' => $jornada->exame_id,
'exame_nome' => $jornada->exame_nome ?? null,
'semana_id' => $jornada->semana_id,
'dias_semana' => [$jornada->semana_id],
'status_id' => $jornada->status_id,
'status_nome' => $jornada->status_nome ?? null,
'tipo_id' => $jornada->tipo_id,
'tipo_nome' => $jornada->tipo_nome ?? null,
'data' => (new Carbon($jornada->data))->format('Y-m-d') ?? null,
'periodo' => [
'start' => (new Carbon($jornada->data))->format('d/m/Y') ?? null,
'end' => (new Carbon($jornada->data))->format('d/m/Y') ?? null,
],
'prestador_id' => $jornada->prestador_id ?? null,
'prestador_nome' => $jornada->prestador_id ? $jornada->prestador_nome : null,
'hora_inicial' => (new Carbon($jornada->hora_inicial))->format('H:i') ?? null,
'hora_fim' => (new Carbon($jornada->hora_fim))->format('H:i') ?? null,
'vagas' => $jornada->vagas ?? null,
'vagas_app' => $jornada->vagas_app ?? null,
'tempo_atendimento' => $jornada->tempo_atendimento ?? null,
'selecionado' => false,
'seleciona_agendamento' => false,
'controle_jornada_id' => $jornada->controle_jornada_id,
'agendamentos' => $agendamentos,
'primeiro_horario' => $primeiroHorario,
'ultimo_horario' => $ultimoHorario,
'vagas_disponiveis' => (($jornada->vagas + ($jornada->vagas_app ?? 0)) - $agendamentos) >= 0
? (($jornada->vagas + ($jornada->vagas_app ?? 0)) - $agendamentos) : 0,
'vinculos' => $vinculos,
];
}),
'jornadasNotSave' => [],
'periodo' => [
'start' => Carbon::now()->format('d/m/Y'),
'end' => Carbon::now()->format('d/m/Y'),
],
'usuario_id' => $usuario->id
],
];
}
public static function store(Request $request)
{
DB::transaction(function () use ($request) {
self::validate($request);
self::saveJornada($request);
});
}
private static function saveJornada($request)
{
$ids = [];
foreach ($request->jornadas as $params) {
$tipo = Jornada::find($params['jornada_id']) ?? new Jornada();
$tipo->fill($params);
$tipo->save();
$ids[] = $tipo->id;
}
if(!empty($request->jornadas_delete)){
Jornada::whereIn('id', $request->jornadas_delete)->delete();
}
}
public static function getSupervisores($request)
{
return [
'supervisores' => Supervisor::where('usuario_id', $request->supervisor_id)
->get()
->map(fn ($supervisor) => [
'id' => $supervisor->id,
'usuario_id' => $supervisor->usuario_id,
'nome' => $supervisor->usuario->cidadao->nome,
'cpf' => $supervisor->usuario->cidadao->cpf,
]),
];
}
private static function validate($request)
{
$validations = [
'jornadas.*.vagas' => [
'min:1',
],
'jornadas.*.hora_inicial' => [
'required',
],
'jornadas.*.hora_fim' => [
'required',
]
];
$messages = [
'jornadas.*.vagas.min' => 'Há jornadas sem quantidade necessário de vagas.',
'jornadas.*.hora_inicial.required' => 'Há jornadas sem horário inicial preenchido.',
'jornadas.*.hora_fim.required' => 'Há jornadas sem horário final preenchido.',
];
return $request->validate($validations, $messages);
}
}

View File

@@ -0,0 +1,441 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Agendamento\AgendamentoHistorico;
use App\Models\ExameImagem\Lancamento\Lancamento;
use App\Services\Service;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rule;
class LancamentoService extends Service
{
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'infraestrutura' => $currentLotacao->infraestrutura->nome,
],
'model' => [
'periodo' => [
'start' => Carbon::now()->format('d/m/Y'),
'end' => Carbon::now()->format('d/m/Y'),
],
'lancamentos' => self::getLancamentos(),
],
'additionals' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento_exame.status_troca AS troca',
'exame_imagem_fechamento_status.id AS status_id',
'exame_imagem_fechamento_status.nome AS status_nome',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.urgente',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS nome_social',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->orWhere(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->where('exame_imagem_agendamento_exame.status_troca', false);
})
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
])
->when($request->data_nascimento, function ($query, $value) {
$query->whereDate('cidadao.data_nascimento', Carbon::createFromFormat('d/m/Y', $value));
});
if ($request->prontuario) {
$agendamentos->where('cadastro_paciente.prontuario', $request->prontuario);
}
if ($request->paciente_id) {
$agendamentos->where('exame_imagem_agendamento.paciente_id', $request->paciente_id);
}
if ($request->exame_id) {
$agendamentos->where('exame_imagem_agendamento_exame.exame_id', $request->exame_id);
}
if ($request->medico_id) {
$agendamentos->where('exame_imagem_agendamento.medico_id', $request->medico_id);
}
if ($request->unidade_id) {
$agendamentos->where('exame_imagem_agendamento.unidade_id', $request->unidade_id);
}
$agendamentos = $agendamentos->get();
return $agendamentos;
}
public static function edit($id)
{
$lancamento = AgendamentoExame::findOrFail($id);
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'paciente' => Paciente::where('id', $lancamento->paciente_id)
->with('unidade')
->first(),
'usuario_sistema' => $currentLotacao->usuario->cidadao->nome,
'usuario_id' => $currentLotacao->usuario->id,
'agendamento' => Agendamento::where('id', $lancamento->agendamento_id)
->get()
->map(function ($query) {
return [
'agendamento_numero' => $query->agendamento_numero,
'data' => (new Carbon($query->data))->format('Y-m-d') ?? null,
'id' => $query->id,
'grupo_exame' => $query->grupo->nome,
'grupo_exame_id' => $query->exame_id,
'medico_id' => $query->medico_id,
'medico_nome' => $query->medico->nome,
'nome_responsavel' => $query->nome_responsavel,
'profissional_id' => $query->profissional_id,
'profissional_nome' => $query->jornada->usuario->nome,
'unidade_id' => $query->unidade_id,
'unidade_nome' => $query->unidade->nome_fantasia,
'unidade_solicitante_id' => $query->unidade_solicitante_id,
'unidade_solicitante_nome' => $query->unidadeSolicitante->nome_fantasia,
'urgente' => $query->urgente ?? false,
];
})
->sortBy('data')
->values()
->first(),
],
'model' => [
'exame_id' => $lancamento->exame_id,
'exame_nome' => $lancamento->exame->nome,
'data_atual' => Carbon::now()->format('Y-m-d'),
'id_paciente' => $lancamento->id,
'laudos' => AgendamentoExame::whereNotNull('arquivo')
->where('id', $lancamento->id)
->get()
->map(function ($agendamento) {
return [
'arquivo' => $agendamento->arquivo,
'id' => $agendamento->id,
'laudo_nome' => $agendamento->laudo_nome ?? null,
'laudo_data' => (new Carbon($agendamento->laudo_data))->format('d/m/Y') ?? null,
'salvo' => true,
];
})
->values(),
'resultado' => $lancamento->resultado,
'resultado_parametrizacao' => $lancamento->exame->resultado,
'status_id' => $lancamento->status_id ?? null,
'status_troca' => $lancamento->status_troca,
]
];
}
public static function store($request)
{
self::validate($request);
try {
$lancamento = AgendamentoExame::findOrFail($request['id']);
DB::transaction(function () use ($request, $lancamento) {
$lancamento->status_troca = true;
$lancamento->principal = true;
if ($lancamento['status_id'] == Status::RESULTADO) {
$lancamento->status_troca = true;
}
$lancamento->update($request->all());
if($request->files->get('laudos') != ''){
foreach ($request->files->get('laudos') as $laudo) {
$arquivo = strtoupper($laudo->getClientOriginalName());
$pasta = storage_path('app' . DIRECTORY_SEPARATOR . 'exame-imagem' . DIRECTORY_SEPARATOR . 'laudos' . DIRECTORY_SEPARATOR . app('config')->get('database.default'));
$laudo->move($pasta, $arquivo);
}
}
$historico = new AgendamentoHistorico();
$historico->agendamento_exame_id = $lancamento['id'];
$historico->agendamento_id = $lancamento['agendamento_id'];
$historico->paciente_id = $lancamento['paciente_id'];
$historico->resultado = $lancamento['resultado'];
$historico->usuario_id = $lancamento['usuario_id'];
if ($request->files->get('laudos') != '') {
$historico->arquivo = $lancamento['arquivo'];
$historico->laudo_nome = $lancamento['laudo_nome'];
}
$historico->save();
$idsHistorico[] = $historico->id;
});
} catch (Exception $error) {
return response()->json(['error' => $error->getMessage()], Response::HTTP_BAD_REQUEST);
}
return $lancamento;
}
public static function download($id)
{
$laudo = AgendamentoExame::findOrFail($id);
return [
'nome' => $laudo->arquivo,
'arquivo' => Storage::path('exame-imagem' . DIRECTORY_SEPARATOR . 'laudos' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . $laudo->arquivo),
];
}
private static function getLancamentos()
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_fechamento_status.id AS status_id',
'exame_imagem_fechamento_status.nome AS status_nome',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.urgente',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'cadastro_usuario_registro_tipo.id AS registro_id',
'cadastro_usuario_registro_tipo.descricao AS registro_nome',
'cadastro_usuario_registro_tipo.sigla AS registro_sigla',
'profissional_cidadao.registro_numero AS registro_numero',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS nome_social',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'
(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->orWhere(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->where('exame_imagem_agendamento_exame.status_troca', false);
})
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
);
$agendamentos = $agendamentos->get();
return $agendamentos;
}
private static function validate($request)
{
$validations = [
'resultado' => [
'nullable',
'string',
'max:3500',
],
];
$messages = [
'resultado.max' => 'A quantidade máxima de caracteres foi excedida.'
];
return $request->validate($validations, $messages);
}
}

View File

@@ -0,0 +1,726 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\ExameImagem\Jornada\Status as JornadaStatus;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Service;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ListagemExamesAgendadosService extends Service
{
public static function index()
{
$params = request()->all();
$agendamentosBuilder = self::getAgendamentosBuilder();
if (!$agendamentosBuilder) {
return [];
}
$agendamentosBuilder = $agendamentosBuilder
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.agendador_id',
'agendador.nome',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'exame_imagem_agendamento.jornada_id AS jornada_agendamento',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cidadao.nome AS paciente',
'cidadao.nome_social AS nome_social',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw('CONCAT(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, exame_imagem_agendamento.data), " ano(s)") AS idade'),
DB::raw("
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
LIMIT 1
) AS telefone
")
);
return $agendamentosBuilder
->get()
->map(function ($plantao) {
return [
'data' => $plantao->data,
'paciente' => $plantao->paciente,
'nome_social' => $plantao->nome_social ?? null,
'grupo' => $plantao->grupo,
'exame' => $plantao->exame,
'profissional' => $plantao->profissional,
'telefone' => MaskUtil::getPhoneMasked($plantao->telefone),
'prontuario' => $plantao->prontuario,
'hora_exame' => $plantao->hora_exame,
'data_nascimento' => $plantao->data_nascimento,
'idade' => $plantao->idade,
'unidade_solicitante_nome' => $plantao->unidade_solicitante_nome,
'medico_solicitante' => $plantao->medico_solicitante,
'nome_fantasia' => $plantao->nome_fantasia,
'agendamento_numero' => $plantao->agendamento_numero,
'nome' => $plantao->nome ?? null,
];
});
}
private static function setOrderBy($builder)
{
if (is_null(request()->sortBy)) {
$builder->orderBy('exame_imagem_agendamento.created_at');
return;
}
$columns = [
'data' => 'exame_imagem_agendamento.created_at',
'paciente' => 'cidadao.nome',
'prontuario' => 'cadastro_paciente.prontuario',
'idade' => 'TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, exame_imagem_agendamento.data)',
'grupo' => 'cadastro_grupo.nome',
'exame' => 'parametrizacao_exame.nome',
'nome' => 'agendador.nome',
'profissional' => 'profissional.nome',
'unidade_solicitante_nome' => 'cadastro_unidade_solicitante.nome_fantasia',
'medico_solicitante' => 'medico_cidadao.nome',
'hora_exame' => 'DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i")',
'telefone' => '(SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
LIMIT 1
)',
];
$column = $columns[request()->sortBy];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
$builder->orderByRaw("{$column} {$direction}, exame_imagem_agendamento.id");
}
private static function getAgendamentosBuilder()
{
if (!request()->get('periodo')) {
return null;
}
$params = request()->all();
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'cadastro_cidadao AS cadastro_cidadao_usuario',
'cadastro_cidadao_usuario.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'cadastro_usuario AS idAgendador',
'idAgendador.id',
'exame_imagem_agendamento.agendador_id'
)
->leftJoin(
'cadastro_cidadao AS agendador',
'agendador.id',
'idAgendador.cidadao_id'
)
->where(function ($query) {
$query->where('exame_imagem_jornada.status_id', JornadaStatus::ATIVO)
->orWhere('exame_imagem_jornada.status_id', JornadaStatus::RESERVADO);
})
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
})
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->setTime(23, 59, 59)
])
->where(function ($query) use ($params) {
$query->where('exame_imagem_agendamento.unidade_id', $params['unidade_id']);
})
->where(function ($query) use ($params) {
if (!is_null($params['medico_id'])) {
$query->where('exame_imagem_agendamento.medico_id', $params['medico_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['grupo_exame_id'])) {
$query->where('exame_imagem_agendamento.exame_id', $params['grupo_exame_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['exame_id'])) {
$query->where('exame_imagem_agendamento_exame.exame_id', $params['exame_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['profissional_id'])) {
$query->where('exame_imagem_agendamento.profissional_id', $params['profissional_id']);
}
});
self::setOrderBy($agendamentos);
return $agendamentos;
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.agendador_id',
'exame_imagem_agendamento.jornada_id AS jornada_agendamento',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional',
'agendador.nome',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cidadao.nome AS paciente',
'cidadao.nome_social AS nome_social',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame',
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%Y/%m/%d') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw('CONCAT(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, exame_imagem_agendamento.data), " ano(s)") AS idade'),
DB::raw("
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
LIMIT 1
) AS telefone
"),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'cadastro_cidadao AS cadastro_cidadao_usuario',
'cadastro_cidadao_usuario.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'cadastro_usuario AS idAgendador',
'idAgendador.id',
'exame_imagem_agendamento.agendador_id'
)
->leftJoin(
'cadastro_cidadao AS agendador',
'agendador.id',
'idAgendador.cidadao_id'
)
->orderBy('cidadao.nome')
->where(function ($query) {
$query->where('exame_imagem_jornada.status_id', JornadaStatus::ATIVO)
->orWhere('exame_imagem_jornada.status_id', JornadaStatus::RESERVADO);
})
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
})
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
])
->when($request->exame_id, function ($query, $value) {
$query->where('exame_imagem_agendamento_exame.exame_id', $value);
})
->when($request->unidade_id, function ($query, $value) {
$query->where('exame_imagem_agendamento.unidade_id', $value);
})
->when($request->profissional_id, function ($query, $value) {
$query->where('exame_imagem_agendamento.profissional_id', $value);
})
->when($request->grupo_exame_id, function ($query, $value) {
$query->where('exame_imagem_agendamento.exame_id', $value);
})
->when($request->medico_id, function ($query, $value) {
$query->where('exame_imagem_agendamento.medico_id', $value);
})
->get();
if ($request->unidade_id) {
$agendamentos->where('exame_imagem_agendamento.unidade_id', $request->unidade_id);
}
return $agendamentos;
}
private static function getLancamentos()
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.agendador_id',
'agendador.nome',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'exame_imagem_agendamento.jornada_id AS jornada_agendamento',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cidadao.nome AS paciente_nome',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw('CONCAT(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, exame_imagem_agendamento.data), " ano(s)") AS idade'),
DB::raw("
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
LIMIT 1
) AS telefone
"),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'cadastro_cidadao AS cadastro_cidadao_usuario',
'cadastro_cidadao_usuario.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'cadastro_usuario AS idAgendador',
'idAgendador.id',
'exame_imagem_agendamento.agendador_id'
)
->leftJoin(
'cadastro_cidadao AS agendador',
'agendador.id',
'idAgendador.cidadao_id'
)
->where(function ($query) {
$query->where('exame_imagem_jornada.status_id', JornadaStatus::ATIVO)
->orWhere('exame_imagem_jornada.status_id', JornadaStatus::RESERVADO);
})
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
});
$agendamentos = $agendamentos->get();
return $agendamentos;
}
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => self::getForm(),
'model' => [
'periodo' => [
'start' => Carbon::now()->format('d/m/Y'),
'end' => Carbon::now()->format('d/m/Y'),
],
'lancamentos' => self::getLancamentos(),
'atendimento' => null,
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
private static function getForm()
{
return [
'unidades' => self::getUnidades(),
'grupos' => self::getGrupos(),
'exames' => self::getExames(),
'profissionais' => self::getProfissionais(),
];
}
private static function getUnidades()
{
return Unidade::orderBy('nome_fantasia')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome_fantasia' => $query->nome_fantasia,
'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
];
});
}
private static function getGrupos()
{
return Exame::whereNotNull('grupo_tipo_id')
->groupBy('grupo_tipo_id')
->get()
->map(function ($query) {
return [
'id' => optional($query->grupo)->id,
'nome' => optional($query->grupo)->nome,
];
})
->values();
}
private static function getExames()
{
return Exame::where('tipo_id', Tipo::IMAGEM)
->orderBy('nome')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome' => $query->nome,
];
})
->values();
}
private static function getProfissionais()
{
return Usuario::orderBy('cidadao_id')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome' => $query->cidadao->nome,
];
})
->values();
}
}

View File

@@ -0,0 +1,670 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\Cadastro\Grupo\GrupoTipo;
use App\Enums\ExameImagem\Parametrizacao\Agendamento\AgendamentoStatus;
use App\Enums\ExameImagem\Tipo;
use App\Enums\Parametrizacao\Exame\Tipo as ExameTipo;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Grupo\Grupo;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\CotaPrestador;
use App\Models\ExameImagem\Parametrizacao;
use App\Models\ExameImagem\Parametrizacao\ControleJornada;
use App\Models\ExameImagem\Parametrizacao\ExameAmbulatorioAtendimento;
use App\Models\ExameImagem\Parametrizacao\AppConectasusCidadaoPrestador;
use App\Models\ExameImagem\Parametrizacao\IntegracaoAplicativo;
use App\Models\ExameImagem\Parametrizacao\MensagemProtocolo;
use App\Models\ExameImagem\Parametrizacao\MesCotaPrestador;
use App\Models\ExameImagem\Parametrizacao\Ocupacao;
use App\Models\ExameImagem\Parametrizacao\Supervisor;
use App\Models\ExameImagem\Parametrizacao\TipoCotaPrestador;
use App\Models\Parametrizacao\KitExame\KitExame;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ParametrizacaoService extends Service
{
public static function create()
{
$mensagemProtocolo = MensagemProtocolo::select('mensagem')->first();
$controleJornada = ControleJornada::select('tipo_controle')->first();
$exameAmbulatorioAtendimento = ExameAmbulatorioAtendimento::select('exibir')->first();
$integracaoAplicativo = IntegracaoAplicativo::first();
return [
'form' => [
'unidades' => [],
'tipos' => TipoCotaPrestador::orderBy('id')->get()->map(fn ($tipo) => [
'id' => $tipo->id,
'descricao' => $tipo->descricao
]),
'prestadores' => Unidade::whereHas('parametrizacaoExameImagem', function ($query) {
$query->where('prestador', true);
})
->orderBy('nome_fantasia')
->get()
->map(fn ($unidade) => [
'unidade_id' => $unidade->id,
'nome_fantasia' => $unidade->nome_fantasia,
'prestador' => $unidade->parametrizacaoExameImagem->prestador,
'infraestruturas' => Infraestrutura::whereHas('parametrizacaoExameImagem', function ($query) {
$query->where('prestador', true);
})
->where('unidade_id', $unidade->id)
->orderBy('nome')
->get()
->map(fn ($p) => [
'infraestrutura_id' => $p->id,
'infraestrutura_nome' => $p->nome,
'unidade_id' => $p->parametrizacaoExameImagem->unidade_id,
'nome_fantasia' => $p->parametrizacaoExameImagem->unidade->nome_fantasia,
'prestador' => $p->parametrizacaoExameImagem->prestador,
]),
])
->unique('unidade_id')
->values(),
'meses' => MesCotaPrestador::orderBy('id')->get()->map(fn ($mes) => [
'id' => $mes->id,
'descricao' => $mes->descricao
]),
'anos' => self::getAno(),
'grupos' => DB::table('cadastro_grupo')
->select(
'cadastro_grupo.id',
DB::raw('UPPER(cadastro_grupo.nome) as nome'),
)
->where('grupo_tipo_id', GrupoTipo::EXAME)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('parametrizacao_exame')
->where('parametrizacao_exame.tipo_id', ExameTipo::IMAGEM)
->whereColumn(
'cadastro_grupo.id',
'parametrizacao_exame.grupo_tipo_id'
)
)
->orderBy('nome')
->get()
->map(fn ($kit) => [
'id' => $kit->id,
'nome' => $kit->nome,
'checked' => false,
'exames' => DB::table('parametrizacao_exame')
->select(
'parametrizacao_exame.id',
DB::raw('UPPER(parametrizacao_exame.nome) as nome'),
'parametrizacao_exame.codigo',
)
->where('parametrizacao_exame.grupo_tipo_id', $kit->id)
->orderBy('parametrizacao_exame.nome')
->get()
->values(),
])
->values(),
],
'model' => [
'unidades' => Infraestrutura::whereHas('parametrizacaoExameImagem')
->orderBy('nome')
->get()
->map(fn ($infra) => [
'id' => $infra->parametrizacaoExameImagem->id,
'checked' => false,
'infraestrutura_id' => $infra->id,
'infraestrutura_nome' => $infra->nome,
'infraestrutura_principal' => $infra->principal,
'unidade_id' => $infra->parametrizacaoExameImagem->unidade_id,
'nome_fantasia' => $infra->parametrizacaoExameImagem->unidade->nome_fantasia,
'executante' => $infra->parametrizacaoExameImagem->executante,
'prestador' => $infra->parametrizacaoExameImagem->prestador,
'envia_sms' => $infra->parametrizacaoExameImagem->envia_sms,
'sms' => [
'dia_antecedencia' => $infra->parametrizacaoExameImagem->sms->dia_antecedencia ?? null,
'periodo_envio' => [
'start' => is_null($infra->parametrizacaoExameImagem->sms->envio_de ?? null)
? null : (new Carbon($infra->parametrizacaoExameImagem->sms->envio_de))->format('d/m/Y'),
'end' => is_null($infra->parametrizacaoExameImagem->sms->envio_ate ?? null)
? null : (new Carbon($infra->parametrizacaoExameImagem->sms->envio_ate))->format('d/m/Y'),
],
'exames' => ($infra->parametrizacaoExameImagem->sms->exames ?? collect())
->map(fn ($exame) => [
'id' => $exame->id,
'nome' => $exame->nome,
'codigo' => $exame->codigo,
]),
],
]),
'cotas' => DB::table('exame_imagem_parametrizacao_cota_prestador')
->join('cadastro_infraestrutura', 'exame_imagem_parametrizacao_cota_prestador.infraestrutura_id', 'cadastro_infraestrutura.id')
->join('cadastro_unidade', 'cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->whereNull('exame_imagem_parametrizacao_cota_prestador.deleted_at')
->whereYear('exame_imagem_parametrizacao_cota_prestador.inicio', Carbon::now()->year)
->groupBy('cadastro_infraestrutura.id')
->select([
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia AS nome_fantasia',
'cadastro_infraestrutura.id as infraestrutura_id',
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'),
DB::raw('YEAR(inicio) AS ano'),
])
->get()
->map(function ($query) {
return [
'unidade_id' => $query->unidade_id ?? null,
'nome_fantasia' => $query->nome_fantasia ?? null,
'infraestrutura_id' => $query->infraestrutura_id ?? null,
'infraestrutura_nome' => $query->infraestrutura_nome ?? null,
'cota_solicitante' => CotaPrestador::where('unidade_id', $query->unidade_id)
->where('infraestrutura_id', $query->infraestrutura_id)
->orderBy('inicio')
->get()
->map(fn ($cotas) => [
'id' => $cotas->id ?? null,
'cota_tipo_id' => $cotas->cota_tipo_id ?? null,
'cota_tipo_nome' => $cotas->cota_tipo_id == Tipo::VALOR
? 'Valor' : 'Quantidade',
"periodo" => [
'start' => (new Carbon($cotas->inicio))->format('d/m/Y') ?? null,
'end' => (new Carbon($cotas->fim))->format('d/m/Y') ?? null,
],
'cota' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'saldo' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'utilizada' => "0",
'cota_unidade' => $cotas->cota_unidade ?? null,
'cota_valor' => number_format($cotas->cota_valor, 2, ',', '.') ?? null,
'observacao' => $cotas->observacao ?? null,
'prestador' => "true",
'agendamentos' => DB::table('exame_imagem_agendamento')
->where('unidade_id', $query->unidade_id)
->whereBetween('data', [$cotas->inicio, $cotas->fim])
->exists(),
])->values(),
'valor_utilizado' => self::handleTotalValorUtilizado($query),
'jornadas' => DB::table('exame_imagem_jornada')
->where('unidade_id', $query->unidade_id)
->select([
'exame_imagem_jornada.controle_jornada_id as controle_jornada_id',
'exame_imagem_jornada.id AS id',
'exame_imagem_jornada.unidade_id AS unidade_id',
'exame_imagem_jornada.prestador_id AS prestador_id',
])
->groupBy('unidade_id')
->get()
->map(fn ($jornada) => [
'controle_jornada_id' => $jornada->controle_jornada_id,
'jornada_id' => $jornada->id,
'agendamentos' => Agendamento::where('jornada_id', $jornada->id)
->first() ? true : false,
'agendamento' => DB::table('exame_imagem_agendamento')
->join('exame_imagem_jornada', 'exame_imagem_jornada.id', 'exame_imagem_agendamento.jornada_id')
->where('exame_imagem_agendamento.unidade_id', $jornada->unidade_id)
->select([
'exame_imagem_agendamento.id as id',
'exame_imagem_jornada.prestador_id AS prestador_id',
'exame_imagem_agendamento.data AS data',
])
->get()
->map(fn ($agendamento) => [
'agendamento_id' => $agendamento->id,
'prestador' => $agendamento->prestador_id,
'data' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
])
]),
];
}),
'mensagem_protocolo' => $mensagemProtocolo->mensagem,
'ocupacoes' => Ocupacao::all()
->map(fn ($ocupacao) => [
'id' => $ocupacao->id,
'ocupacao_id' => $ocupacao->ocupacao_id,
'nome' => $ocupacao->ocupacao->nome,
]),
'supervisores' => Supervisor::all()
->map(fn ($supervisor) => [
'id' => $supervisor->id,
'usuario_id' => $supervisor->usuario_id,
'nome' => $supervisor->usuario->cidadao->nome,
'cpf' => $supervisor->usuario->cidadao->cpf,
]),
'controle_jornada' => $controleJornada->tipo_controle ?? null,
'exibir_exame_ambulatorio_atendimento' => $exameAmbulatorioAtendimento ? $exameAmbulatorioAtendimento->exibir : false,
'integracao_aplicativo' => [
'habilita_agendamento_conectasus_cidadao' => $integracaoAplicativo->habilita_agendamento_conectasus_cidadao ?? false,
'habilita_consulta_imagem_conectasus_cidadao' => $integracaoAplicativo->habilita_consulta_imagem_conectasus_cidadao ?? false,
],
'app_conectasus_cidadao_prestadores' => AppConectasusCidadaoPrestador::with('infraestrutura.unidade')
->get()
->map(fn ($item) => [
'id' => $item->id,
'infraestrutura_id' => $item->infraestrutura_id,
'infraestrutura_nome' => $item->infraestrutura->nome,
'unidade_id' => $item->infraestrutura->unidade_id,
'nome_fantasia' => $item->infraestrutura->unidade->nome_fantasia,
'percentual_financeiro' => $item->percentual_financeiro !== null ? (float) $item->percentual_financeiro : null,
'percentual_quantitativo' => $item->percentual_quantitativo !== null ? (float) $item->percentual_quantitativo : null,
])
->values(),
],
];
}
public static function getCotaPrestador($request)
{
return DB::table('exame_imagem_parametrizacao_cota_prestador')
->join('cadastro_infraestrutura', 'exame_imagem_parametrizacao_cota_prestador.infraestrutura_id', 'cadastro_infraestrutura.id')
->join('cadastro_unidade', 'cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->whereNull('exame_imagem_parametrizacao_cota_prestador.deleted_at')
->when($request->mes, function ($agendada) use ($request) {
$agendada->whereMonth('exame_imagem_parametrizacao_cota_prestador.inicio', $request->mes);
})
->whereYear('exame_imagem_parametrizacao_cota_prestador.inicio', $request->ano)
->groupBy('cadastro_infraestrutura.id')
->select([
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia AS nome_fantasia',
'cadastro_infraestrutura.id as infraestrutura_id',
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'),
DB::raw('YEAR(inicio) AS ano'),
])
->get()
->map(function ($query) {
return [
'unidade_id' => $query->unidade_id ?? null,
'nome_fantasia' => $query->nome_fantasia ?? null,
'infraestrutura_id' => $query->infraestrutura_id ?? null,
'infraestrutura_nome' => $query->infraestrutura_nome ?? null,
'cota_solicitante' => CotaPrestador::where('unidade_id', $query->unidade_id)
->where('infraestrutura_id', $query->infraestrutura_id)
->orderBy('inicio')
->get()
->map(fn ($cotas) => [
'id' => $cotas->id ?? null,
'cota_tipo_id' => $cotas->cota_tipo_id ?? null,
'cota_tipo_nome' => $cotas->cota_tipo_id == Tipo::VALOR
? 'Valor' : 'Quantidade',
"periodo" => [
'start' => (new Carbon($cotas->inicio))->format('d/m/Y') ?? null,
'end' => (new Carbon($cotas->fim))->format('d/m/Y') ?? null,
],
'cota' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'saldo' => $cotas->cota_tipo_id == Tipo::VALOR
? number_format($cotas->cota_valor, 2, ',', '.')
: $cotas->cota_unidade,
'utilizada' => "0",
'cota_unidade' => $cotas->cota_unidade ?? null,
'cota_valor' => number_format($cotas->cota_valor, 2, ',', '.') ?? null,
'observacao' => $cotas->observacao ?? null,
'prestador' => "true",
])->values(),
'valor_utilizado' => self::handleTotalValorUtilizado($query),
'jornadas' => DB::table('exame_imagem_jornada')
->where('unidade_id', $query->unidade_id)
->select([
'exame_imagem_jornada.controle_jornada_id as controle_jornada_id',
'exame_imagem_jornada.id AS id',
'exame_imagem_jornada.unidade_id AS unidade_id',
'exame_imagem_jornada.prestador_id AS prestador_id',
])
->groupBy('unidade_id')
->get()
->map(fn ($jornada) => [
'controle_jornada_id' => $jornada->controle_jornada_id,
'jornada_id' => $jornada->id,
'agendamentos' => Agendamento::where('jornada_id', $jornada->id)
->first() ? true : false,
'agendamento' => Agendamento::where('unidade_id', $jornada->unidade_id)
->get()
->map(fn ($agendamento) => [
'agendamento_id' => $agendamento->id,
'prestador' => $agendamento->jornada->prestador_id,
'data' => (new Carbon($agendamento->data))->format('d/m/Y') ?? null,
])
]),
];
});
}
private static function handleTotalValorUtilizado($query)
{
$exameImagem = DB::table('exame_imagem_agendamento_exame')
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.id', '=', 'exame_imagem_agendamento_exame.agendamento_id')
->join('parametrizacao_exame', 'parametrizacao_exame.id', '=', 'exame_imagem_agendamento_exame.exame_id')
->whereYear('exame_imagem_agendamento.data', $query->ano)
->when(request()->mes, function ($agendada) {
$agendada->whereMonth('exame_imagem_agendamento.data', request()->mes);
})
->when($query->infraestrutura_id, function ($agendada) use ($query) {
$agendada->where('exame_imagem_agendamento.infraestrutura_id', $query->infraestrutura_id);
})
->whereIn('exame_imagem_agendamento_exame.status_id', [AgendamentoStatus::REALIZADO, AgendamentoStatus::AGENDADO])
->selectRaw('SUM(parametrizacao_exame.valor) AS valor')
->value('valor');
$total = floatval($exameImagem ?? 0);
return number_format($total, 2, ',', '.');
}
public static function store(Request $request)
{
DB::transaction(function () use ($request) {
self::validate($request);
self::saveUnidade($request);
self::saveCotaPrestador($request);
self::saveMensagemProtocolo($request);
self::saveOcupacao($request);
self::saveSupervisores($request);
self::saveControleJornadas($request);
self::saveExameAmbulatorioAtendimento($request);
self::saveIntegracaoAplicativo($request);
self::saveAppConectasusCidadaoPrestador($request);
});
}
public static function getUnidades()
{
return Unidade::orderBy('nome_fantasia')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome_fantasia' => $query->nome_fantasia,
'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
];
});
}
private static function saveUnidade($request)
{
$ids = [];
foreach ($request->unidades as $params) {
$tipo = Parametrizacao::where('unidade_id', $params['unidade_id'])
->where('infraestrutura_id', $params['infraestrutura_id'])
->first() ?? new Parametrizacao();
$tipo->fill($params);
$tipo->save();
$ids[] = $tipo->id;
self::saveUnidadeSms($tipo, $params);
}
Parametrizacao::destroy(Parametrizacao::whereNotIn('id', $ids)->pluck('id'));
}
private static function saveUnidadeSms($parametrizacao, $parametrizacaoData)
{
if (is_null($parametrizacaoData['sms']['dia_antecedencia'])) {
if (!is_null($parametrizacao->sms)) {
$parametrizacao->sms->delete();
}
}
else {
$smsData = [
'dia_antecedencia' => $parametrizacaoData['sms']['dia_antecedencia'],
'envio_de' => is_null($parametrizacaoData['sms']['envio_de'])
? null
: Carbon::createFromFormat('d/m/Y', $parametrizacaoData['sms']['envio_de'])
->format('Y-m-d'),
'envio_ate' => is_null($parametrizacaoData['sms']['envio_ate'])
? null
: Carbon::createFromFormat('d/m/Y', $parametrizacaoData['sms']['envio_ate'])
->format('Y-m-d'),
];
$sms = $parametrizacao->sms;
if (is_null($sms)) {
$sms = $parametrizacao->sms()->create($smsData);
}
else {
$sms->update($smsData);
}
$sms->exames()->sync($parametrizacaoData['sms']['exames']);
}
}
private static function saveCotaPrestador($request)
{
$ids = collect([]);
foreach ($request->cota_solicitante as $params) {
$cotas = collect($params['cota_solicitante']);
$novosIds = $cotas->filter(fn ($item) => isset($item['id']) && $item['id'] !== null)->pluck('id');
$ids = $ids->merge($novosIds)->unique();
foreach ($params['cota_solicitante'] as $param_unidade) {
$id = $param_unidade['id'];
$inicio = $param_unidade['periodo']['start'];
$fim = $param_unidade['periodo']['end'];
$tipo = $id && is_numeric($id) ? CotaPrestador::where('id', $id)->first() : new CotaPrestador();
$tipo->fill($param_unidade);
$tipo->inicio = Carbon::createFromFormat('d/m/Y', $inicio);
$tipo->fim = Carbon::createFromFormat('d/m/Y', $fim);
$tipo->cota_valor = $param_unidade['cota_valor'];
if (!is_null($param_unidade['cota_valor'])) {
$tipo->cota_valor = str_replace('.', '', $tipo->cota_valor);
$tipo->cota_valor = str_replace(',', '.', $tipo->cota_valor);
}
$tipo->save();
$ids->add($tipo->id);
}
}
CotaPrestador::destroy(CotaPrestador::whereNotIn('id', $ids)->pluck('id'));
}
private static function saveMensagemProtocolo($request)
{
$msg = MensagemProtocolo::first() ?? new MensagemProtocolo();
$msg->mensagem = $request->mensagem_protocolo;
$msg->save();
}
private static function saveOcupacao($request)
{
$ids = [];
foreach ($request->ocupacoes as $params) {
$ocupacao = Ocupacao::where('ocupacao_id', $params['ocupacao_id'])
->first() ?? new Ocupacao();
$ocupacao->fill($params);
$ocupacao->save();
$ids[] = $ocupacao->id;
}
Ocupacao::destroy(Ocupacao::whereNotIn('id', $ids)->pluck('id'));
}
private static function saveSupervisores($request)
{
$ids = [];
foreach($request->supervisores as $params) {
$supervisor = Supervisor::where('usuario_id', $params['usuario_id'])
-> first() ?? new Supervisor();
$supervisor->fill($params);
$supervisor->save();
$ids[] = $supervisor->id;
}
Supervisor::destroy(Supervisor::whereNotIn('id', $ids)->pluck('id'));
}
private static function saveControleJornadas($request)
{
$controle = ControleJornada::first() ?? new ControleJornada();
$controle->tipo_controle = $request->controle_jornada;
$controle->save();
}
private static function saveExameAmbulatorioAtendimento($request)
{
$impressao = ExameAmbulatorioAtendimento::first() ?? new ExameAmbulatorioAtendimento();
$impressao->exibir = $request->exibir_exame_ambulatorio_atendimento ?? false;
$impressao->save();
}
private static function saveIntegracaoAplicativo($request)
{
$integracao = IntegracaoAplicativo::first() ?? new IntegracaoAplicativo();
$integracao->habilita_agendamento_conectasus_cidadao = $request->input('integracao_aplicativo.habilita_agendamento_conectasus_cidadao') ?? false;
$integracao->habilita_consulta_imagem_conectasus_cidadao = $request->input('integracao_aplicativo.habilita_consulta_imagem_conectasus_cidadao') ?? false;
$integracao->save();
}
private static function saveAppConectasusCidadaoPrestador($request)
{
$ids = [];
foreach ($request->input('app_conectasus_cidadao_prestadores', []) as $params) {
$item = AppConectasusCidadaoPrestador::where('infraestrutura_id', $params['infraestrutura_id'])->first()
?? new AppConectasusCidadaoPrestador();
$item->infraestrutura_id = $params['infraestrutura_id'];
$item->percentual_financeiro = $params['percentual_financeiro'] ?? null;
$item->percentual_quantitativo = $params['percentual_quantitativo'] ?? null;
$item->save();
$ids[] = $item->id;
}
AppConectasusCidadaoPrestador::whereNotIn('id', $ids)->delete();
}
private static function getAno()
{
$data = Carbon::now();
$anos = [];
for ($i = -5; $i <= 5; $i++) {
$anos[] = $data->copy()->addYears($i)->format('Y');
}
return $anos;
}
private static function validate($request)
{
$validations = [
'unidade_id' => [
'integer',
'exists:cadastro_unidade,id',
],
'cotas.*.unidade_id' => [
'integer',
'exists:cadastro_unidade,id',
],
'cota_tipo' => [
'integer',
],
'cotas.*.cota_valor' => [
'nullable',
],
'cota_unidade' => [
'nullable',
],
'observacao' => [
'max:500',
],
'mensagem_protocolo' => [
'required',
'string',
'max:500',
'between:3,500',
],
'controle_jornada' => [
'required',
],
'integracao_aplicativo.habilita_agendamento_conectasus_cidadao' => [
'nullable',
'boolean',
],
'integracao_aplicativo.habilita_consulta_imagem_conectasus_cidadao' => [
'nullable',
'boolean',
],
'app_conectasus_cidadao_prestadores.*.infraestrutura_id' => [
'required',
'integer',
'exists:cadastro_infraestrutura,id',
],
'app_conectasus_cidadao_prestadores.*.percentual_financeiro' => [
'nullable',
'numeric',
'min:0',
'max:100',
],
'app_conectasus_cidadao_prestadores.*.percentual_quantitativo' => [
'nullable',
'numeric',
'min:0',
'max:100',
],
];
$messages = [
'unidade_id.unique' => 'Unidade já parametrizada.',
'cotas.*.unidade_id.unique' => 'Unidade, mês, ano e/ou tipo já parametrizado.',
'mensagem_protocolo' => 'Mensagem é obrigatória.',
'controle_jornada' => 'Controle de jornada é obrigatória.',
];
return $request->validate($validations, $messages);
}
}

View File

@@ -0,0 +1,861 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\Administracao\Modulo;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\ExameImagem\Jornada\Tipo as JornadaTipo;
use App\Enums\ExameImagem\Parametrizacao\ControleJornada\Tipo as ControleJornadaTipo;
use App\Enums\ExameImagem\Tipo as ExameImagemTipo;
use App\Exceptions\ExameImagem\ExceededCotaAgendamentoException;
use App\Exceptions\ExameImagem\ExceededJornadaException;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Feriado\Feriado;
use App\Models\Cadastro\Grupo\Grupo;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\CotaPrestador;
use App\Models\ExameImagem\Jornada\Jornada;
use App\Models\ExameImagem\Jornada\SemanaJornada;
use App\Models\ExameImagem\Parametrizacao;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class ReagendamentoCancelamentoExameService extends Service
{
public static function datatable()
{
$gerenciamentoJornadas = DB::table('cadastro_usuario')
->select(
'cadastro_usuario.id',
'cadastro_usuario.cidadao_id',
'cadastro_cidadao.nome',
'cadastro_cidadao.cpf',
'cadastro_usuario.bloqueado',
'cadastro_lotacao.usuario_id',
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'ocupacao.nome AS ocupacao_nome',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") as data_nascimento'),
'cadastro_unidade.nome_fantasia'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'exame_imagem_parametrizacao_ocupacao',
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->where('cadastro_usuario.bloqueado', '=', '0')
->whereNull('cadastro_lotacao.deleted_at')
->whereNull('exame_imagem_parametrizacao_ocupacao.deleted_at')
->groupBy('cadastro_usuario.id');
return $gerenciamentoJornadas;
}
public static function edit($usuarioId)
{
$usuario = Usuario::findOrFail($usuarioId);
return [
'form' => self::getFormData($usuario),
'model' => self::getModelData(),
];
}
private static function getFormData($usuario)
{
return [
'data_atual' => Carbon::now()->format('Y-m-d'),
'usuario' => self::getUsuarioData($usuario),
'origem' => [
'feriados' => self::getFeriados(),
'unidades' => [],
'infraestruturas' => [],
'prestadores' => [],
'agendamentos' => [],
'grupos' => [],
],
'destino' => [
'unidades' => [],
'infraestruturas' => [],
'prestadores' => [],
'grupos' => [],
'usuarios' => [],
'jornadas' => [],
],
'unidadesParametrizadas' => Parametrizacao::where('executante', true)
->orderBy('unidade_id')
->whereExists(function ($query) use ($usuario) {
$query->select(DB::raw(1))
->from('exame_imagem_jornada')
->where('usuario_id', $usuario->id)
->whereColumn('exame_imagem_jornada.unidade_id', 'exame_imagem_parametrizacao_unidade.unidade_id')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
});
})
->get()
->map(fn ($query) => [
'id' => $query->id,
'unidade_id' => $query->unidade_id,
'nome_fantasia' => $query->unidade->nome_fantasia,
'infraestruturas' => $query->unidade->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
]),
'exames' => [],
'dias_semana' => SemanaJornada::orderBy('id')
->get()
->map(fn ($semanaJornadas) => [
'id' => $semanaJornadas->id,
'nome' => $semanaJornadas->nome,
'disabled' => true,
]),
'prestadores' => [],
];
}
public static function getGrupos($request) {
return Grupo::whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('exame_imagem_jornada')
->where('usuario_id', $request->profissional_id)
->where('infraestrutura_id', $request->infraestrutura_id)
->where('prestador_id', $request->prestador_id)
->whereColumn('exame_imagem_jornada.exame_id', 'cadastro_grupo.id')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
});
})
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome' => $query->nome,
];
})
->values();
}
public static function getPrestadores($request) {
return Unidade::whereHas('parametrizacaoExameImagem', function ($query) use ($request) {
$query->where('prestador', true)
->whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('exame_imagem_jornada')
->where('usuario_id', $request->profissional_id)
->where('infraestrutura_id', $request->infraestrutura_id)
->whereColumn('exame_imagem_jornada.prestador_id', 'exame_imagem_parametrizacao_unidade.id')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
});
});
})
->orderBy('nome_fantasia')
->get()
->map(fn ($unidade) => [
'unidade_id' => $unidade->id,
'nome_fantasia' => $unidade->nome_fantasia,
'prestador' => $unidade->parametrizacaoExameImagem->prestador,
'prestador_id' => $unidade->parametrizacaoExameImagem->id,
])
->unique('unidade_id')
->values();
}
private static function getFeriados()
{
return Feriado::whereHas('modulos', fn ($q) => $q
->where('identificador', Modulo::EXAME_IMAGEM)
)
->orderBy('data')
->get()
->map(fn ($feriado) => (object) [
'data' => (new Carbon($feriado->data))->format('d/m/Y'),
'tipo_descricao' => $feriado->tipo->descricao,
'observacao' => $feriado->observacao,
]);
}
private static function getUsuarioData($usuario)
{
$cidadao = $usuario->cidadao()->setEagerLoads([])->first(['nome', 'data_nascimento', 'cns', 'cpf']);
$ocupacao = DB::table('cadastro_usuario')
->select(
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'ocupacao.nome AS ocupacao_nome',
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'exame_imagem_parametrizacao_ocupacao',
'exame_imagem_parametrizacao_ocupacao.ocupacao_id',
'cadastro_lotacao.ocupacao_id'
)
->where('cadastro_usuario.id', $usuario->id)
->whereNull('cadastro_lotacao.deleted_at')
->whereNull('exame_imagem_parametrizacao_ocupacao.deleted_at')
->first();
return [
'id' => $usuario->id,
'nome' => $cidadao->nome,
'data_nascimento' => is_null($cidadao->data_nascimento)
? null : (new Carbon($cidadao->data_nascimento))->format('d/m/Y'),
'cns' => MaskUtil::getCnsMasked($cidadao->cns),
'cpf' => MaskUtil::getCpfMasked($cidadao->cpf),
'ocupacao' => $ocupacao->ocupacao_nome,
];
}
public static function getJornadas($request)
{
$dataAtual = Carbon::today();
$proximoMes = $dataAtual->copy()->addMonths(1);
$ultimoDiaProximoMes = $proximoMes->copy()->endOfMonth();
$agendamentos = Agendamento::with([
'jornada',
'paciente.cidadao.telefones',
'createdLotacao.usuario.cidadao',
'agendamentoExame.exame.procedimento'
])
->where('profissional_id', $request->profissional_id)
->whereHas('agendamentoExame', function($query) {
$query->where('status_id', Status::AGENDADO)
->orWhereNull('status_id');
})
->whereNull('regulacao_solicitacao_id')
->where('unidade_id', $request->unidade_id)
->where('exame_id', $request->exame_id)
->when($request->filled('data'), function ($query) use ($request) {
$query->where('data', $request->data);
}, function ($query) use ($dataAtual) {
$query->where('data', '>=', $dataAtual->format('Y-m-d'));
})
->get()
->map(function ($agendamento) {
return [
'alterar' => false,
'id' => $agendamento->id,
'agendamento_numero' => $agendamento->agendamento_numero,
'controle_jornada_id' => optional($agendamento->jornada)->controle_jornada_id,
'data' => optional($agendamento->data)->format('d/m/Y'),
'data_menstruacao' => optional($agendamento->data_menstruacao)->format('Y-m-d'),
'hora_exame' => optional($agendamento->hora_exame)->format('H:i'),
'paciente_telefones' => $agendamento->paciente->cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
'usuario' => optional($agendamento->createdLotacao->usuario->cidadao)->nome,
'paciente' => [
'nome' => optional($agendamento->paciente->cidadao)->nome,
'nome_social' => optional($agendamento->paciente->cidadao)->nome_social,
'data_nascimento' => optional($agendamento->paciente->cidadao->data_nascimento)->format('d/m/Y'),
'prontuario' => $agendamento->paciente->prontuario,
],
'incluido' => $agendamento->agendamentoExame->map(function ($exame) use ($agendamento) {
return [
'id' => $exame->id,
'exame_id' => $exame->exame_id,
'nome' => $exame->exame->nome,
'codigo' => $exame->exame->codigo,
'hora_exame' => optional($agendamento->hora_exame)->format('H:i'),
'observacao' => $exame->exame->observacao,
'valor' => $exame->exame->valor_sigtap
? optional($exame->exame->procedimento)->valor_servico_ambilatorial
: $exame->exame->valor,
];
})->values(),
];
})->sortBy('data')->values();
$jornadas = Jornada::where('unidade_id', $request->unidade_id)
->where('usuario_id', $request->profissional_id)
->where('exame_id', $request->exame_id)
->where('prestador_id', $request->prestador_id)
->where(function ($query) use ($dataAtual, $ultimoDiaProximoMes) {
$query->where('data', '>=', $dataAtual)
->orWhereBetween('data', [$dataAtual, $ultimoDiaProximoMes]);
})
->get()
->map(fn ($jornada) => [
'jornada_id' => $jornada->id,
'unidade_id' => $jornada->unidade_id,
'controle_jornada_id' => $jornada->controle_jornada_id,
'jornada_id' => $jornada->id,
'exame_id' => $jornada->exame_id,
'exame_nome' => $jornada->grupo->nome,
'profissional_id' => $jornada->usuario_id,
'profissional_nome' => $jornada->usuario->nome,
'prestador_id' => $jornada->prestador_id,
'prestador_nome' => $jornada->unidade->nome_fantasia,
'unidade_id' => $jornada->unidade_id,
'unidade_nome' => $jornada->unidade->nome_fantasia,
'infraestrutura_id' => $jornada->infraestrutura_id,
'infraestrutura_nome' => $jornada->infraestrutura->nome,
'semana_id' => $jornada->semana_id,
'data' => (new Carbon($jornada->data))->format('d/m/Y') ?? null,
'vagas' => $jornada->vagas ?? null,
'tipo_id' => $jornada->tipo_id,
'tempo_atendimento' => $jornada->tempo_atendimento,
'selecionado' => false,
'hora_inicial' => (new Carbon($jornada->hora_inicial))->format('H:i') ?? null,
'hora_fim' => (new Carbon($jornada->hora_fim))->format('H:i') ?? null,
'status_id' => $jornada->status_id,
'status_nome' => $jornada->status->nome,
])
->sortBy('data')
->sortBy('hora_inicial')
->values();
return [
'agendamentos' => $agendamentos,
'jornadas' => $jornadas,
];
}
public static function getJornadasDestino($request)
{
$dataAtual = Carbon::today();
$proximoMes = $dataAtual->copy()->addMonths(1);
$ultimoDiaProximoMes = $proximoMes->copy()->endOfMonth();
if ($request->field === 'unidade') {
$resultado = Jornada::where(function ($query) use ($dataAtual, $ultimoDiaProximoMes) {
$query->where('data', '>=', $dataAtual)
->orWhereBetween('data', [$dataAtual, $ultimoDiaProximoMes]);
})
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
})
->groupBy('unidade_id')
->get()
->map(fn ($jornada) => [
'id' => $jornada->unidade_id,
'nome_fantasia' => $jornada->unidade->nome_fantasia,
]);
}
if ($request->field === 'infraestrutura') {
$resultado = Jornada::when($request->filled('unidade_id'), function ($query) use ($request) {
$query->where('unidade_id', $request->unidade_id);
})
->where(function ($query) use ($dataAtual, $ultimoDiaProximoMes) {
$query->where('data', '>=', $dataAtual)
->orWhereBetween('data', [$dataAtual, $ultimoDiaProximoMes]);
})
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
})
->groupBy('infraestrutura_id')
->get()
->map(fn ($jornada) => [
'id' => $jornada->infraestrutura_id,
'nome' => $jornada->infraestrutura->nome,
]);
}
if ($request->field === 'prestador') {
$resultado = Jornada::when($request->filled('unidade_id'), function ($query) use ($request) {
$query->where('unidade_id', $request->unidade_id);
})
->when($request->filled('infraestrutura_id'), function ($query) use ($request) {
$query->where('infraestrutura_id', $request->infraestrutura_id);
})
->where(function ($query) use ($dataAtual, $ultimoDiaProximoMes) {
$query->where('data', '>=', $dataAtual)
->orWhereBetween('data', [$dataAtual, $ultimoDiaProximoMes]);
})
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
})
->groupBy('prestador_id')
->get()
->map(fn ($jornada) => [
'id' => $jornada->prestador_id,
'nome' => $jornada->prestador->unidade->nome_fantasia,
]);
}
if ($request->field === 'grupo') {
$resultado = Jornada::when($request->filled('unidade_id'), function ($query) use ($request) {
$query->where('unidade_id', $request->unidade_id);
})
->when($request->filled('infraestrutura_id'), function ($query) use ($request) {
$query->where('infraestrutura_id', $request->infraestrutura_id);
})
->when($request->filled('prestador_id'), function ($query) use ($request) {
$query->where('prestador_id', $request->prestador_id);
})
->where(function ($query) use ($dataAtual, $ultimoDiaProximoMes) {
$query->where('data', '>=', $dataAtual)
->orWhereBetween('data', [$dataAtual, $ultimoDiaProximoMes]);
})
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
})
->groupBy('exame_id')
->get()
->map(fn ($jornada) => [
'id' => $jornada->exame_id,
'nome' => $jornada->grupo->nome,
]);
}
if ($request->field === 'usuario') {
$resultado = Jornada::when($request->filled('unidade_id'), function ($query) use ($request) {
$query->where('unidade_id', $request->unidade_id);
})
->when($request->filled('infraestrutura_id'), function ($query) use ($request) {
$query->where('infraestrutura_id', $request->infraestrutura_id);
})
->when($request->filled('prestador_id'), function ($query) use ($request) {
$query->where('prestador_id', $request->prestador_id);
})
->where(function ($query) use ($dataAtual, $ultimoDiaProximoMes) {
$query->where('data', '>=', $dataAtual)
->orWhereBetween('data', [$dataAtual, $ultimoDiaProximoMes]);
})
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('exame_imagem_agendamento')
->whereColumn('exame_imagem_agendamento.jornada_id', 'exame_imagem_jornada.id');
})
->groupBy('usuario_id')
->get()
->map(fn ($jornada) => [
'id' => $jornada->usuario_id,
'nome' => $jornada->usuario->nome,
]);
}
return $resultado;
}
public static function reschedule()
{
self::validateReschedule();
DB::transaction(function () {
collect(request()->agendamentos)->each(function ($agendamento) {
$id = $agendamento['id'];
$agendamentoAnterior = Agendamento::findOrFail($id);
$jornada = Jornada::findOrFail(request()->jornada_id);
if (!request()->supervisor_id) {
if ($jornada->tipo_id === ExameImagemTipo::QUANTIDADE) {
self::getSaldoUnidadeQuantidade($jornada, $agendamentoAnterior);
} else {
self::getSaldoUnidadeValor($jornada, $agendamentoAnterior);
}
self::handleJornada($jornada, $agendamentoAnterior);
}
$agendamentoAnterior->agendamentoExame()->update(['status_id' => Status::REAGENDADO]);
$nextHorario = self::getNextHorario($jornada);
$reagendamento = new Agendamento();
$reagendamento->agendamento_numero = now()->timestamp * 1000;;
$reagendamento->paciente_id = $agendamentoAnterior['paciente_id'];
$reagendamento->jornada_id = $jornada->id;
$reagendamento->medico_id = $agendamentoAnterior['medico_id'];
$reagendamento->profissional_id = $jornada->usuario_id;
$reagendamento->data = $jornada->data;
$reagendamento->exame_id = $jornada->exame_id;
$reagendamento->hora_exame = $nextHorario->horario;
$reagendamento->unidade_id = $jornada->unidade_id;
$reagendamento->unidade_solicitante_id = $agendamentoAnterior['unidade_solicitante_id'];
$reagendamento->infraestrutura_solicitante_id = $agendamentoAnterior['infraestrutura_solicitante_id'];
$reagendamento->infraestrutura_id = $jornada->infraestrutura_id;
$reagendamento->nome_responsavel = $agendamentoAnterior['nome_responsavel'];
$reagendamento->observacao = $agendamentoAnterior['observacao'];
$reagendamento->gestante = $agendamentoAnterior['gestante'];
$reagendamento->urgente = $agendamentoAnterior['urgente'];
$reagendamento->supervisor_id = request()->supervisor_id;
$reagendamento->retroativo = $agendamentoAnterior['retroativo'];
$reagendamento->agendador_id = $agendamentoAnterior['agendador_id'];
$reagendamento->save();
$paciente_id = $reagendamento->paciente_id;
$agendamento_id = $reagendamento->id;
foreach ($agendamentoAnterior->agendamentoExame as $param_exame) {
$exame = new AgendamentoExame();
$exame->agendamento_id = $agendamento_id;
$exame->exame_id = $param_exame['exame_id'];
$exame->paciente_id = $paciente_id;
$exame->status_id = Status::AGENDADO;
$exame->save();
}
});
});
return (object) ['agendamentos_nao_reagendados' => []];
}
private static function getSaldoUnidadeQuantidade($jornada, $agendamentoAnterior)
{
$cotaUnidade = CotaPrestador::where('infraestrutura_id', $jornada->prestador->infraestrutura->id)
->where('cota_tipo_id', ExameImagemTipo::QUANTIDADE)
->where('inicio', '<=', $jornada->data)
->where('fim', '>=', $jornada->data)
->first();
if ($cotaUnidade) {
$totalUnidade = $cotaUnidade->cota_unidade;
if ($jornada->controle_jornada_id == ControleJornadaTipo::EXAME) {
$cotaUtilizada = AgendamentoExame::whereHas('agendamento', function($query) use ($jornada, $cotaUnidade) {
$query->whereHas('jornada', function($query) use ($jornada) {
$query->where('prestador_id', $jornada->prestador_id);
})
->where('data', '>=', $cotaUnidade->inicio)
->where('data', '<=', $cotaUnidade->fim);
})
->count('id') ?? 0;
$cotaUtilizada = $cotaUtilizada + $agendamentoAnterior->agendamentoExame->count();
} else {
$cotaUtilizada = Agendamento::whereHas('jornada', function($query) use ($jornada) {
$query->where('prestador_id', $jornada->prestador_id);
})
->where('data', '>=', $cotaUnidade->inicio)
->where('data', '<=', $cotaUnidade->fim)
->count('id') ?? 0;
}
if (($totalUnidade - $cotaUtilizada) - 1 < 0) {
throw new ExceededCotaAgendamentoException;
}
}
}
private static function getSaldoUnidadeValor($jornada, $agendamentoAnterior)
{
$cotaUnidade = CotaPrestador::where('infraestrutura_id', $jornada->prestador->infraestrutura->id)
->where('cota_tipo_id', ExameImagemTipo::VALOR)
->where('inicio', '<=', $jornada->data)
->where('fim', '>=', $jornada->data)
->first();
if ($cotaUnidade) {
$totalUnidade = $cotaUnidade->cota_valor;
$cotaUtilizada = AgendamentoExame::whereHas('agendamento', function ($query) use ($jornada, $cotaUnidade) {
$query->whereHas('jornada', function ($query) use ($jornada) {
$query->where('prestador_id', $jornada->prestador_id);
})
->whereBetween('data', [$cotaUnidade->inicio, $cotaUnidade->fim]);
})
->whereHas('exame')
->with('exame')
->get()
->sum(fn($agendamentoExame) => $agendamentoExame->exame->valor);
$agendamentoCotaExames = 0;
foreach ($agendamentoAnterior->agendamentoExame as $agendamentoExame) {
$agendamentoCotaExames = $agendamentoCotaExames + $agendamentoExame->exame->valor;
}
if (($totalUnidade - $cotaUtilizada) - $agendamentoCotaExames < 0) {
throw new ExceededCotaAgendamentoException;
}
}
}
private static function handleJornada($jornada, $agendamentoAnterior)
{
if($jornada->controle_jornada_id == ControleJornadaTipo::EXAME){
$agendamentoCadastrado = AgendamentoExame::whereHas('agendamento', function($query) use ($jornada) {
$query->whereHas('jornada', function($query) use ($jornada) {
$query->where('id', $jornada->id);
});
})
->count('id') ?? 0;
$agendamentoCadastrado = $agendamentoCadastrado + $agendamentoAnterior->agendamentoExame->count();
} else {
$agendamentoCadastrado = Agendamento::whereHas('jornada', function($query) use ($jornada) {
$query->where('id', $jornada->id);
})
->count('id') ?? 0;
$agendamentoCadastrado = $agendamentoCadastrado + 1;
}
if ($agendamentoCadastrado > $jornada->vagas) {
throw new ExceededJornadaException;
}
}
private static function getNextHorario($jornada)
{
$nextHorario = (object) [
'horario' => null,
'is_excedente' => false,
];
if ($jornada->tipo_id === JornadaTipo::FIXA) {
$nextHorario->horario = Carbon::parse($jornada->hora_inicial)->format('H:i');
}
else if ($jornada->tipo_id === JornadaTipo::DINAMICA) {
$horarios = collect();
$agendamentos = self::getAgendamentos($jornada->id);
$agendamentos->each(fn ($a) => $a->hora_exame = $jornada->data->copy()->setTimeFromTimeString($a->hora_exame));
$agendamentos
->each(fn ($agendamento) => $horarios->push((object) [
'horario' => $agendamento->hora_exame->format('H:i'),
'quantidade_agendada' => $agendamento->quantidade_agendada,
'quantidade_total' => 1,
]));
$quantidade = $agendamentos->count();
if ($quantidade < $jornada->vagas) {
$data = $jornada->data->copy();
self::setHorarioJornadaDinamica(
$horarios,
$agendamentos,
$jornada,
$quantidade,
$data
);
}
$horarios = $horarios->sortBy('horario')->values();
$horario = $horarios->where('quantidade_agendada', 0)->first();
if (is_null($horario)) {
$horario = $horarios->last();
}
$nextHorario->horario = $horario->horario;
}
return $nextHorario;
}
private static function getStatusLiberamHorario()
{
return [
Status::REAGENDADO,
Status::CANCELADO,
];
}
private static function setHorarioJornadaDinamica($horarios, $agendamentos, $jornada, $quantidade, $data)
{
$agendamento = $agendamentos->where('horario', $data)->first();
if (is_null($agendamento)) {
$final = $data->copy()->addMinutes($jornada->tempo_atendimento);
$agendamento = $agendamentos
->where('horario', '>', $data)
->where('horario', '<', $final)
->first();
if ($agendamento) {
self::setHorarioJornadaDinamica(
$horarios,
$agendamentos,
$jornada,
$quantidade,
$agendamento->horario
);
}
else {
$horarios->push((object) [
'horario' => $data->format('H:i'),
'quantidade_agendada' => 0,
'quantidade_total' => 1,
]);
if (++$quantidade < $jornada->vagas) {
$data->addMinutes($jornada->tempo_atendimento);
self::setHorarioJornadaDinamica($horarios, $agendamentos, $jornada, $quantidade, $data);
}
}
}
else {
$data->addMinutes($jornada->tempo_atendimento);
self::setHorarioJornadaDinamica($horarios, $agendamentos, $jornada, $quantidade, $data);
}
}
public static function cancel()
{
DB::transaction(function () {
collect(request()->agendamentos)->each(function ($id) {
$agendamento = Agendamento::findOrFail($id);
$agendamento->agendamentoExame()->update(['status_id' => Status::CANCELADO]);
});
});
}
private static function validateReschedule()
{
request()->validate([
'agendamentos' => [
'required',
'array',
],
'agendamentos.*.id' => [
'required',
'integer',
Rule::exists(Agendamento::class, 'id'),
],
'jornada_id' => [
'required',
'integer',
Rule::exists(Jornada::class, 'id'),
],
'motivo_agendamento_excedente' => [
'nullable',
'string',
'max:500',
]
]);
}
private static function getAgendamentos($jornadaId)
{
return Agendamento::where('jornada_id', $jornadaId)
->whereHas('agendamentoExame', function ($query) {
$query->whereNotIn('status_id', self::getStatusLiberamHorario());
})
->groupBy('hora_exame')
->orderBy('hora_exame')
->select('hora_exame', DB::raw('COUNT(id) as quantidade_agendada'))
->get();
}
private static function getModelData()
{
return [
'origem' => [
'unidade_id' => null,
'infraestrutura_id' => null,
'ocupacao_id' => null,
'especialidade_id' => null,
'data' => null,
'grupo_id' => null,
'prestador_id' => null,
],
'destino' => [
'unidade_id' => null,
'infraestrutura_id' => null,
'prestador_id' => null,
'grupo_id' => null,
'usuario_id' => null,
'agendamentos' => [],
'jornada_id' => null,
'motivo_agendamento_excedente' => null,
],
'cancelamento' => [
'agendamentos' => [],
'motivo' => null,
]
];
}
}

View File

@@ -0,0 +1,257 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Parametrizacao\MensagemProtocolo;
use App\Models\Intranet\Cliente;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ReimpressaoResultadoService extends Service
{
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'infraestrutura' => $currentLotacao->infraestrutura->nome,
],
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'atendimento' => null,
'prontuario' => null,
'data_nascimento' => null,
'lancamentos' => self::getLancamentos(),
'paciente' => null,
'exame' => null,
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS atendimento_id',
'exame_imagem_agendamento_exame.arquivo AS arquivo',
'exame_imagem_agendamento_exame.resultado AS resultado',
'cadastro_paciente.id AS paciente_id',
'exame_imagem_agendamento_exame.id AS id_paciente',
'cidadao.nome AS paciente_nome',
'medico_cidadao.nome AS medico_solicitante',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->orWhere(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->where('exame_imagem_agendamento_exame.status_troca', true);
})
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->join(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
])
->when($request->data_nascimento, function ($query, $value) {
$query->whereDate('cidadao.data_nascimento', Carbon::createFromFormat('d/m/Y', $value));
})
->when($request->exame, function ($query, $value) {
$query->where('parametrizacao_exame.id', $value);
})
->when($request->prontuario, function ($query, $value) {
$query->where('cadastro_paciente.prontuario', $value);
});
if ($request->paciente_id) {
$agendamentos->where('exame_imagem_agendamento.paciente_id', $request->paciente_id);
}
if ($request->exame_id) {
$agendamentos->where('exame_imagem_agendamento_exame.exame_id', $request->exame_id);
}
$agendamentos = $agendamentos->get();
return $agendamentos;
}
private static function getLancamentos()
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento_exame.arquivo AS arquivo',
'exame_imagem_agendamento_exame.resultado AS resultado',
'exame_imagem_fechamento_status.id AS status_id',
'exame_imagem_fechamento_status.nome AS status_nome',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.urgente',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'cadastro_usuario_registro_tipo.id AS registro_id',
'cadastro_usuario_registro_tipo.descricao AS registro_nome',
'cadastro_usuario_registro_tipo.sigla AS registro_sigla',
'profissional_cidadao.registro_numero AS registro_numero',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
);
$agendamentos = $agendamentos->get();
return $agendamentos;
}
}

View File

@@ -0,0 +1,438 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Fechamento\StatusFechamento;
use App\Models\ExameImagem\Jornada\StatusJornada;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RelatorioCotaProfissionalService extends Service
{
public static function index()
{
$params = request()->all();
$agendamentosBuilder = self::getAgendamentosBuilder();
if (!$agendamentosBuilder) {
return [];
}
$agendamentosBuilder = $agendamentosBuilder
->select(
'exame_imagem_jornada.id',
'exame_imagem_jornada.vagas',
'exame_imagem_jornada.status_id AS status_jornada',
'exame_imagem_jornada.unidade_id',
'exame_imagem_jornada_status.nome AS status_nome',
'exame_imagem_jornada_semana.nome AS nome_semana',
'exame_imagem_jornada.semana_id AS semana_id',
'exame_imagem_jornada.controle_jornada_id AS tipo_jornada',
'exame_imagem_jornada.usuario_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'profissional.nome AS profissional_nome',
'ocupacao.nome AS ocupacao_nome',
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'),
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'),
DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"),
);
return $agendamentosBuilder
->orderBy('exame_imagem_jornada.data')
->get()
->map(function ($jornada) {
return [
'data' => $jornada->data,
'profissional_nome' => $jornada->profissional_nome,
'grupo' => $jornada->grupo,
'nome_semana' => $jornada->nome_semana,
'hora_inicial' => $jornada->hora_inicial,
'hora_fim' => $jornada->hora_fim,
'status_nome' => $jornada->status_nome,
'jornada_id' => $jornada->id,
'vagas' => $jornada->vagas,
'tipo_jornada' => $jornada->tipo_jornada,
'agendamentos' => Agendamento::where('jornada_id', $jornada->id)
->get()
->map(function ($query) use ($jornada) {
return [
'jornada_id' => $query->jornada_id,
'profissional_id' => $query->profissional_id,
'profissional' => $jornada->profissional_nome,
];
}),
'soma' => Agendamento::where('jornada_id', $jornada->id)
->get()
->map(function ($query) use ($jornada) {
return [
'jornada_id' => $query->jornada_id,
'profissional_id' => $query->profissional_id,
'profissional' => $jornada->profissional_nome,
];
})
->count(),
];
});
}
private static function getAgendamentosBuilder()
{
if (!request()->get('periodo')) {
return null;
}
$params = request()->all();
$agendamentos = DB::table('exame_imagem_jornada')
->join(
'exame_imagem_jornada_status',
'exame_imagem_jornada_status.id',
'exame_imagem_jornada.status_id'
)
->join(
'exame_imagem_jornada_semana',
'exame_imagem_jornada_semana.id',
'exame_imagem_jornada.semana_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_jornada.exame_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_jornada.usuario_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->orderBy('exame_imagem_jornada.data')
->whereBetween('exame_imagem_jornada.data', [
Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->setTime(23, 59, 59)
])
->where(function ($query) use ($params) {
if (!is_null($params['unidade_id'])) {
$query->where('exame_imagem_jornada.unidade_id', $params['unidade_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['grupo_exame_id'])) {
$query->where('exame_imagem_jornada.exame_id', $params['grupo_exame_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['profissional_id'])) {
$query->where('exame_imagem_jornada.usuario_id', $params['profissional_id']);
}
});
return $agendamentos;
}
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => self::getForm(),
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'atendimento' => null,
'prontuario' => null,
'lancamentos' => [],
'paciente' => null,
'exame' => null,
'relatorioCotaProfissional' => self::getCotaProfissional(),
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_jornada')
->select(
'exame_imagem_jornada.id',
'exame_imagem_jornada.status_id AS status_jornada',
'exame_imagem_jornada.unidade_id',
'exame_imagem_jornada.vagas',
'exame_imagem_jornada_status.nome AS status_nome',
'exame_imagem_jornada_semana.nome AS nome_semana',
'exame_imagem_jornada.semana_id AS semana_id',
'exame_imagem_jornada.controle_jornada_id AS tipo_jornada',
'exame_imagem_jornada.usuario_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_id',
'profissional.nome AS profissional_nome',
'ocupacao.nome AS ocupacao_nome',
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'),
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'),
DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"),
)
->join(
'exame_imagem_jornada_status',
'exame_imagem_jornada_status.id',
'exame_imagem_jornada.status_id'
)
->join(
'exame_imagem_jornada_semana',
'exame_imagem_jornada_semana.id',
'exame_imagem_jornada.semana_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_jornada.exame_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_jornada.usuario_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->whereBetween('exame_imagem_jornada.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
])
->when($request->unidade_id, function ($query, $value) {
$query->where('exame_imagem_jornada.unidade_id', $value);
})
->when($request->grupo_exame_id, function ($query, $value) {
$query->where('exame_imagem_jornada.exame_id', $value);
})
->when($request->profissional_id, function ($query, $value) {
$query->where('exame_imagem_jornada.usuario_id', $value);
})
->when($request->status_id, function ($query, $value) {
$query->where('exame_imagem_jornada.status_id', $value);
});
$agendamentos = $agendamentos->get();
return $agendamentos
->map(function ($jornada) {
return [
'data' => $jornada->data,
'grupo' => $jornada->grupo,
'status_nome' => $jornada->status_nome,
'nome_semana' => $jornada->nome_semana,
'profissional_nome' => $jornada->profissional_nome,
'hora_inicial' => $jornada->hora_inicial,
'hora_fim' => $jornada->hora_fim,
'jornada' => $jornada->id,
'vagas' => $jornada->vagas,
'tipo_jornada' => $jornada->tipo_jornada,
'agendamentos' => Agendamento::where('jornada_id', $jornada->id)
->get()
->map(function ($query) use ($jornada){
return [
'jornada_id' => $query->jornada_id,
'profissional_id' => $query->profissional_id,
'profissional' => $jornada->profissional_nome,
];
}),
'soma' => Agendamento::where('jornada_id', $jornada->id)
->get()
->count(),
];
});
}
private static function getCotaProfissional()
{
$agendamentos = DB::table('exame_imagem_jornada')
->select(
'exame_imagem_jornada.id',
'exame_imagem_jornada.status_id AS status_jornada',
'exame_imagem_jornada.unidade_id',
'exame_imagem_jornada_status.id AS status_id',
'exame_imagem_jornada_status.nome AS status_nome',
'exame_imagem_jornada_semana.nome AS nome_semana',
'exame_imagem_jornada.semana_id AS semana_id',
'exame_imagem_jornada.controle_jornada_id AS tipo_jornada',
'exame_imagem_jornada.usuario_id AS profissional_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'profissional.nome AS profissional_nome',
'ocupacao.nome AS ocupacao_nome',
'cadastro_unidade.nome_fantasia',
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'),
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'),
DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"),
)
->join(
'exame_imagem_jornada_status',
'exame_imagem_jornada_status.id',
'exame_imagem_jornada.status_id'
)
->join(
'exame_imagem_jornada_semana',
'exame_imagem_jornada_semana.id',
'exame_imagem_jornada.semana_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_jornada.exame_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_jornada.usuario_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'exame_imagem_jornada.unidade_id'
);
$agendamentos = $agendamentos->get();
return $agendamentos;
}
private static function getForm()
{
return [
'unidades' => self::getUnidadesExecutantes(),
'grupos' => self::getGrupos(),
'status' => self::getStatus(),
'profissionais' => self::getProfissionais(),
];
}
private static function getUnidadesExecutantes()
{
return Unidade::orderBy('nome_fantasia')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome_fantasia' => $query->nome_fantasia,
'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
];
});
}
private static function getGrupos()
{
return Exame::whereNotNull('grupo_tipo_id')
->groupBy('grupo_tipo_id')
->get()
->map(function ($query) {
return [
'id' => $query->grupo->id,
'nome' => $query->grupo->nome,
];
})
->values();
}
private static function getStatus()
{
return StatusJornada::orderBy('id')
->get()
->map(fn ($statusJornadas) => [
'id' => $statusJornadas->id,
'nome' => $statusJornadas->nome
])
->values();
}
private static function getProfissionais()
{
return Usuario::orderBy('cidadao_id')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome' => $query->cidadao->nome,
];
})
->values();
}
}

View File

@@ -0,0 +1,761 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Fechamento\StatusFechamento;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Service;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RelatorioExameStatusService extends Service
{
public static function index()
{
$params = request()->all();
$agendamentosBuilder = self::getAgendamentosBuilder();
if (!$agendamentosBuilder) {
return [];
}
$agendamentosBuilder = $agendamentosBuilder
->select(
'exame_imagem_agendamento_exame.id AS atendimento_id',
'cadastro_paciente.id AS paciente_id',
'exame_imagem_agendamento_exame.id AS id_paciente',
'cidadao.nome AS paciente_nome',
'cidadao.cpf as paciente_cpf',
'cidadao.cns as paciente_cns',
'cadastro_raca_cor.descricao AS paciente_raca_cor',
'sexo.descricao as paciente_sexo',
'medico_cidadao.nome AS medico_solicitante',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
'parametrizacao_exame.codigo AS exame_codigo',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cadastro_unidade.nome_fantasia',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'sigtap.procedimento.nome AS nome_procedimento',
'exame_imagem_agendamento.agendador_id as agendador_id',
'agendador_cidadao.nome as nome_agendador',
'profissional.nome AS profissional_executante',
'parametrizacao_exame.valor_sigtap',
'sigtap.procedimento.valor_servico_ambilatorial',
DB::raw("
CASE
WHEN parametrizacao_exame.valor_sigtap = true
THEN FORMAT(sigtap.procedimento.valor_servico_ambilatorial, 2, 'pt_BR')
ELSE
FORMAT(parametrizacao_exame.valor, 2, 'pt_BR')
END AS exame_valor
"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y %H:%i') AS data_hora_solicitacao"),
DB::raw('sigtap.procedimento.nome AS nome_procedimento'),
DB::raw('parametrizacao_exame.codigo AS codigo_procedimento'),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as paciente_data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN
"AGENDADO"
ELSE
exame_imagem_fechamento_status.nome
END AS status_nome'),
);
self::setOrderBy($agendamentosBuilder);
return $agendamentosBuilder
->get()
->map(function ($exameStatus) {
return [
'data' => $exameStatus->data,
'prontuario' => $exameStatus->prontuario ?? '-',
'paciente_nome' => $exameStatus->paciente_nome,
'paciente_id' => $exameStatus->paciente_id,
'grupo' => $exameStatus->grupo,
'exame_nome' => $exameStatus->exame_nome,
'unidade_solicitante_nome' => $exameStatus->unidade_solicitante_nome,
'nome_fantasia' => $exameStatus->nome_fantasia,
'status_nome' => $exameStatus->status_nome,
'nome_procedimento' => $exameStatus->nome_procedimento,
'nome_agendador' => $exameStatus->nome_agendador,
'data_hora_solicitacao' => $exameStatus->data_hora_solicitacao,
'profissional_executante' => $exameStatus->profissional_executante,
'paciente_cpf' => $exameStatus->paciente_cpf ? MaskUtil::getCpfMasked($exameStatus->paciente_cpf) : '-',
'paciente_cns' => $exameStatus->paciente_cns ? MaskUtil::getCnsMasked( $exameStatus->paciente_cns) : '-',
'paciente_raca_cor' => $exameStatus->paciente_raca_cor,
'paciente_sexo' => $exameStatus->paciente_sexo,
'codigo_procedimento' => $exameStatus->codigo_procedimento,
'exame_valor' => $exameStatus->exame_valor,
'paciente_data_nascimento' => $exameStatus->paciente_data_nascimento,
];
});
}
private static function setOrderBy($builder)
{
$columns = [
'atendimento_id' => 'exame_imagem_agendamento_exame.id',
'paciente_id' => 'cadastro_paciente.id',
'id_paciente' => 'exame_imagem_agendamento_exame.id',
'paciente_nome' => 'cidadao.nome',
'paciente_cpf' => 'cidadao.cpf',
'paciente_cns' => 'cidadao.cns',
'paciente_raca_cor' => 'cadastro_raca_cor.descricao',
'paciente_sexo' => 'sexo.descricao',
'medico_solicitante' => 'medico_cidadao.nome',
'exame_id' => 'parametrizacao_exame.id',
'exame_nome' => 'parametrizacao_exame.nome',
'exame_codigo' => 'parametrizacao_exame.codigo',
'grupo' => 'cadastro_grupo.nome',
'grupo_exame_id' => 'cadastro_grupo.id',
'nome_fantasia' => 'cadastro_unidade.nome_fantasia',
'unidade_solicitante_nome' => 'cadastro_unidade_solicitante.nome_fantasia',
'nome_procedimento' => 'sigtap.procedimento.nome',
'agendador_id' => 'exame_imagem_agendamento.agendador_id',
'nome_agendador' => 'agendador_cidadao.nome',
'profissional_executante' => 'profissional.nome',
'exame_valor' => DB::raw('FORMAT(parametrizacao_exame.valor, 2, "pt_BR")'),
'data_hora_solicitacao' => DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y %H:%i')"),
'codigo_procedimento' => DB::raw('parametrizacao_exame.codigo'),
'prontuario' => DB::raw('LPAD(cadastro_paciente.prontuario,7,0)'),
'data' => DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y')"),
'data_pedido' => DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y')"),
'paciente_data_nascimento' => DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y"))'),
'nome_mae' => DB::raw('CASE WHEN cidadao.nome_mae IS NULL THEN "Não informado" ELSE cidadao.nome_mae END'),
'status_nome' => DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN "AGENDADO" ELSE exame_imagem_fechamento_status.nome END'),
];
if (is_null(request()->sortBy)) {
$builder->orderByRaw(join(', ', $columns));
return;
}
$column = $columns[request()->sortBy];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
unset($columns[request()->sortBy]);
$builder->orderByRaw(
"{$column} {$direction}, " . join(', ', $columns)
);
}
private static function getAgendamentosBuilder()
{
if (!request()->get('periodo')) {
return null;
}
$params = request()->all();
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->join(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->leftJoin(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'parametrizacao_exame.grupo_tipo_id',
'cadastro_grupo.id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->leftJoin('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->leftJoin(
'parametrizacao_procedimento',
'parametrizacao_procedimento.procedimento_codigo',
'parametrizacao_exame.codigo'
)
->leftJoin(
'cadastro_usuario as dados_agendador',
'dados_agendador.id',
'exame_imagem_agendamento.agendador_id'
)
->leftJoin(
'cadastro_cidadao AS agendador_cidadao',
'agendador_cidadao.id',
'dados_agendador.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->leftJoin(
'cadastro_raca_cor',
'cadastro_raca_cor.id',
'cidadao.raca_cor_id'
)
->leftJoin(
'cadastro_sexo as sexo',
'sexo.id',
'cidadao.sexo_id'
)
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->setTime(23, 59, 59)
])
->where(function ($query) use ($params) {
if (!is_null($params['unidade_id'])) {
$query->where('exame_imagem_agendamento.unidade_id', $params['unidade_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['unidade_solicitante_id'])) {
$query->where('cadastro_unidade_solicitante.id', $params['unidade_solicitante_id']);
}
})
->when(request()->paciente_id, function ($query) {
$query->where('exame_imagem_agendamento.paciente_id', request()->paciente_id);
})
->where(function ($query) use ($params) {
if (!is_null($params['exame_id'])) {
$query->where('exame_imagem_agendamento_exame.exame_id', $params['exame_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['prontuario'])) {
$query->where('cadastro_paciente.prontuario', $params['prontuario']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['procedimento'])) {
$query->where('parametrizacao_exame.codigo', $params['procedimento']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['status_id'])) {
$query->where('exame_imagem_agendamento_exame.status_id', $params['status_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['grupo_id'])) {
$query->where('parametrizacao_exame.grupo_tipo_id', $params['grupo_id']);
}
})
->when($params['profissional_id'], function($query, $value) {
$query->where('exame_imagem_agendamento.profissional_id', $value);
});
return $agendamentos;
}
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => [],
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'atendimento' => null,
'prontuario' => null,
'lancamentos' => [],
'paciente' => null,
'exame' => null,
'relatorioExameStatus' => self::getExameStatus(),
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento_exame.id AS atendimento_id',
'cadastro_paciente.id AS paciente_id',
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento.unidade_id',
'cidadao.nome AS paciente_nome',
'cidadao.cpf as paciente_cpf',
'cidadao.cns as paciente_cns',
'cadastro_raca_cor.descricao AS paciente_raca_cor',
'sexo.descricao as paciente_sexo',
'medico_cidadao.nome AS medico_solicitante',
'exame_imagem_agendamento.profissional_id',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
'parametrizacao_exame.codigo AS exame_codigo',
'parametrizacao_exame.valor_sigtap',
'sigtap.procedimento.valor_servico_ambilatorial',
DB::raw("
CASE
WHEN parametrizacao_exame.valor_sigtap = true
THEN FORMAT(sigtap.procedimento.valor_servico_ambilatorial, 2, 'pt_BR')
ELSE
FORMAT(parametrizacao_exame.valor, 2, 'pt_BR')
END AS exame_valor
"),
'sigtap.procedimento.nome AS nome_procedimento',
'profissional.nome AS profissional_executante',
'cadastro_unidade.nome_fantasia',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_unidade_solicitante.id AS unidade_solicitante_id',
'exame_imagem_agendamento.agendador_id as agendador_id',
'agendador_cidadao.nome as nome_agendador',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y %H:%i') AS data_hora_solicitacao"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as paciente_data_nascimento'),
DB::raw('sigtap.procedimento.nome AS nome_procedimento'),
DB::raw('parametrizacao_exame.codigo AS codigo_procedimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN
"AGENDADO"
ELSE
exame_imagem_fechamento_status.nome
END AS status_nome'),
'cadastro_grupo.nome AS grupo'
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->join(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->leftJoin(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_grupo',
'parametrizacao_exame.grupo_tipo_id',
'cadastro_grupo.id'
)
->leftJoin('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->leftJoin(
'parametrizacao_procedimento',
'parametrizacao_procedimento.procedimento_codigo',
'parametrizacao_exame.codigo'
)
->leftJoin(
'cadastro_usuario as dados_agendador',
'dados_agendador.id',
'exame_imagem_agendamento.agendador_id'
)
->leftJoin(
'cadastro_cidadao AS agendador_cidadao',
'agendador_cidadao.id',
'dados_agendador.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->leftJoin(
'cadastro_raca_cor',
'cadastro_raca_cor.id',
'cidadao.raca_cor_id'
)
->leftJoin(
'cadastro_sexo as sexo',
'sexo.id',
'cidadao.sexo_id'
)
->orderBy('cidadao.nome')
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::FALTOU)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::FALTA_MEDICA)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::CANCELADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
})
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
]);
if ($request->unidade_solicitante_id) {
$agendamentos->where('exame_imagem_agendamento.unidade_solicitante_id', $request->unidade_solicitante_id);
}
if ($request->unidade_id) {
$agendamentos->where('exame_imagem_agendamento.unidade_id', $request->unidade_id);
}
if ($request->profissional_id) {
$agendamentos->where('exame_imagem_agendamento.profissional_id', $request->profissional_id);
}
if ($request->grupo_id) {
$agendamentos->where('parametrizacao_exame.grupo_tipo_id', $request->grupo_id);
}
if ($request->exame_id) {
$agendamentos->where('exame_imagem_agendamento_exame.exame_id', $request->exame_id);
}
if ($request->status_id) {
$agendamentos->where('exame_imagem_agendamento_exame.status_id', $request->status_id);
}
if ($request->prontuario) {
$agendamentos->where('cadastro_paciente.prontuario', $request->prontuario);
}
if ($request->procedimento) {
$agendamentos->where('parametrizacao_exame.codigo', $request->procedimento);
}
if ($request->paciente_id) {
$agendamentos->where('exame_imagem_agendamento.paciente_id', $request->paciente_id);
}
$agendamentos = $agendamentos->get();
return $agendamentos;
}
private static function getExameStatus()
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento_exame.status_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'exame_imagem_agendamento.jornada_id AS jornada_agendamento',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_unidade_solicitante.id AS unidade_solicitante_id',
'cadastro_paciente.id AS paciente_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cidadao.nome AS paciente_nome',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw("
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
LIMIT 1
) AS paciente_telefone
"),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN
"AGENDADO"
ELSE
exame_imagem_fechamento_status.nome
END AS status_nome'),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'cadastro_cidadao AS cadastro_cidadao_usuario',
'cadastro_cidadao_usuario.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::FALTOU)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::FALTA_MEDICA)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::CANCELADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
});
$agendamentos = $agendamentos->get();
return $agendamentos;
}
}

View File

@@ -0,0 +1,588 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
use App\Models\ExameImagem\Fechamento\StatusFechamento;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RelatorioFinanceiroExameService extends Service
{
public static function index()
{
$params = request()->all();
$agendamentosBuilder = self::getAgendamentosBuilder();
if (!$agendamentosBuilder) {
return [];
}
$agendamentosBuilder = $agendamentosBuilder
->select(
'exame_imagem_agendamento_exame.id AS atendimento_id',
'cadastro_paciente.id AS paciente_id',
'exame_imagem_agendamento_exame.id AS id_paciente',
'cidadao.nome AS paciente_nome',
'medico_cidadao.nome AS medico_solicitante',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
'parametrizacao_exame.codigo AS procedimento',
'parametrizacao_exame.valor AS valor',
'parametrizacao_exame.valor_sigtap AS valor_sigtap',
'sigtap.procedimento.valor_servico_ambilatorial AS valor_servico_ambilatorial',
'sigtap.procedimento.nome AS nome_procedimento',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cadastro_unidade.nome_fantasia',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN
"AGENDADO"
ELSE
exame_imagem_fechamento_status.nome
END AS status_nome'),
DB::raw('COUNT(exame_imagem_agendamento_exame.exame_id) AS quantidade'),
);
return $agendamentosBuilder
->orderBy('exame_imagem_agendamento_exame.created_at')
->get()
->map(function ($relatorio) {
return [
'exame_nome' => $relatorio->exame_nome,
'procedimento' => $relatorio->procedimento,
'nome_procedimento' => $relatorio->nome_procedimento,
'status_nome' => $relatorio->status_nome,
'quantidade' => $relatorio->quantidade,
'valor_unitario' => $relatorio->valor_sigtap ? $relatorio->valor_servico_ambilatorial : $relatorio->valor,
'valor' => $relatorio->valor,
'valor_servico_ambilatorial' => $relatorio->valor_servico_ambilatorial,
'unidade_solicitante_nome' => $relatorio->unidade_solicitante_nome,
'nome_fantasia' => $relatorio->nome_fantasia,
];
});
}
private static function getAgendamentosBuilder()
{
if (!request()->get('periodo')) {
return null;
}
$params = request()->all();
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->join(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->leftJoin(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->leftJoin('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->leftJoin(
'parametrizacao_procedimento',
'parametrizacao_procedimento.procedimento_codigo',
'parametrizacao_exame.codigo'
)
->groupBy('exame_id')
->orderBy('cidadao.nome')
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->setTime(23, 59, 59)
])
->where(function ($query) use ($params) {
if (!is_null($params['unidade_id'])) {
$query->where('exame_imagem_agendamento.unidade_id', $params['unidade_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['unidade_solicitante_id'])) {
$query->where('exame_imagem_agendamento.unidade_solicitante_id', $params['unidade_solicitante_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['procedimento'])) {
$query->where('parametrizacao_exame.codigo', $params['procedimento']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['exame_id'])) {
$query->where('exame_imagem_agendamento_exame.exame_id', $params['exame_id']);
}
});
return $agendamentos;
}
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => self::getForm(),
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'atendimento' => null,
'prontuario' => null,
'lancamentos' => [],
'paciente' => null,
'exame' => null,
'relatorioFinanceiroExame' => self::getFinanceiroExame(),
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS atendimento_id',
'cadastro_paciente.id AS paciente_id',
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento.unidade_id',
'cidadao.nome AS paciente_nome',
'medico_cidadao.nome AS medico_solicitante',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
'parametrizacao_exame.codigo AS procedimento',
'parametrizacao_exame.valor AS valor',
'parametrizacao_exame.valor_sigtap AS valor_sigtap',
'sigtap.procedimento.valor_servico_ambilatorial AS valor_servico_ambilatorial',
'sigtap.procedimento.nome AS nome_procedimento',
'cadastro_unidade.nome_fantasia',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_unidade_solicitante.id AS unidade_solicitante_id',
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN
"AGENDADO"
ELSE
exame_imagem_fechamento_status.nome
END AS status_nome'),
DB::raw('COUNT(exame_imagem_agendamento_exame.exame_id) AS quantidade'),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->join(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->leftJoin(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftJoin('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->leftJoin(
'parametrizacao_procedimento',
'parametrizacao_procedimento.procedimento_codigo',
'parametrizacao_exame.codigo'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->groupBy('exame_id')
->orderBy('cidadao.nome')
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
})
->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
])
->when($request->unidade_id, function ($query, $value) {
$query->where('exame_imagem_agendamento.unidade_id', $value);
})
->when($request->unidade_solicitante_id, function ($query, $value) {
$query->where('exame_imagem_agendamento.unidade_solicitante_id', $value);
})
->when($request->exame_id, function ($query, $value) {
$query->where('exame_imagem_agendamento_exame.exame_id', $value);
})
->when($request->procedimento, function ($query, $value) {
$query->where('parametrizacao_exame.codigo', $value);
});
$agendamentos = $agendamentos->get();
return $agendamentos
->map(function ($relatorio) {
return [
'exame_nome' => $relatorio->exame_nome,
'status_nome' => $relatorio->status_nome,
'procedimento' => $relatorio->procedimento,
'nome_procedimento' => $relatorio->nome_procedimento,
'valorUnitario' => $relatorio->valor_sigtap ? $relatorio->valor_servico_ambilatorial : $relatorio->valor,
'valor' => $relatorio->valor,
'valor_servico_ambilatorial' => $relatorio->valor_servico_ambilatorial,
'quantidade' => $relatorio->quantidade,
'unidade_solicitante_nome' => $relatorio->unidade_solicitante_nome,
'nome_fantasia' => $relatorio->nome_fantasia,
];
});
}
private static function getFinanceiroExame()
{
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'exame_imagem_agendamento.jornada_id AS jornada_agendamento',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_unidade_solicitante.id AS unidade_solicitante_id',
'cadastro_paciente.id AS paciente_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cidadao.nome AS paciente_nome',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw("
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
LIMIT 1
) AS paciente_telefone
"),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'cadastro_cidadao AS cadastro_cidadao_usuario',
'cadastro_cidadao_usuario.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::AGENDADO)
->orWhere('exame_imagem_agendamento_exame.status_id', Status::REALIZADO)
->orWhere('exame_imagem_agendamento_exame.status_id', NULL);
});
$agendamentos = $agendamentos->get();
return $agendamentos;
}
private static function getForm()
{
return [
'unidadesSolicitantes' => self::getUnidadesSolicitantes(),
'unidadesExecutantes' => self::getUnidadesExecutantes(),
'exames' => self::getExames(),
];
}
private static function getUnidadesSolicitantes()
{
return Unidade::orderBy('nome_fantasia')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome_fantasia' => $query->nome_fantasia,
'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
];
});
}
private static function getUnidadesExecutantes()
{
return Unidade::orderBy('nome_fantasia')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome_fantasia' => $query->nome_fantasia,
'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
];
});
}
private static function getExames()
{
return Exame::where('tipo_id', Tipo::IMAGEM)
->orderBy('nome')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome' => $query->nome,
];
})
->values();
}
}

View File

@@ -0,0 +1,110 @@
<?php
namespace App\Services\ExameImagem;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioLancamentoService extends Service
{
public static function getLancamento($idPaciente)
{
$lancamento = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.resultado AS resultado',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'cadastro_paciente.id AS paciente_id',
'cidadao.nome AS paciente_nome',
'cidadao.nome_social AS paciente_nome_social',
'cidadao.preferencia_nome_id AS paciente_preferencia_nome_id',
'exame_imagem_agendamento.nome_responsavel AS nome_responsavel',
'exame_imagem_agendamento.urgente AS urgente',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
'cadastro_usuario_registro_tipo.descricao AS registro_nome',
'cadastro_usuario_registro_tipo.id AS registro_id',
'cadastro_usuario_registro_tipo.sigla AS registro_sigla',
'profissional_cidadao.registro_numero AS registro_numero',
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw("DATE_FORMAT(cidadao.data_nascimento, '%d/%m/%Y') data_nascimento"),
DB::raw('CONCAT(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, exame_imagem_agendamento.data), " anos") AS paciente_idade'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->join(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->leftjoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->where('exame_imagem_agendamento_exame.id', $idPaciente)
->first();
return $lancamento;
}
}

View File

@@ -0,0 +1,838 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\ExameImagem\Fechamento\StatusFechamento;
use App\Models\Parametrizacao\Exame\Exame;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Services\Service;
use App\Utils\DataUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioProducaoService extends Service
{
public static function index()
{
$consulta = self::getAgendamentosBuilder();
if (!$consulta) {
return [];
}
$consulta = $consulta
->select(
'exame_imagem_agendamento_exame.id AS atendimento_id',
'parametrizacao_exame.id AS exame_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.unidade_solicitante_id',
'parametrizacao_exame.nome AS exame_nome',
'parametrizacao_exame.codigo AS procedimento',
'sigtap.procedimento.nome AS nome_procedimento',
'sigtap.procedimento.id AS procedimento_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cadastro_unidade.nome_fantasia',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
'exame_imagem_jornada.prestador_id',
'exame_imagem_parametrizacao_unidade.id AS parametrizacao',
'exame_imagem_parametrizacao_unidade.unidade_id AS parametrizacao_unidade_id',
'cadastro_unidade_parametrizacao.nome_fantasia AS nome_prestador',
'ocupacao.nome AS ocupacao_nome',
'ocupacao.codigo AS ocupacao_codigo',
'cadastro_cidadao.nome as profissional',
DB::raw('count(exame_imagem_agendamento_exame.id) AS quantidade'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("
CASE WHEN cadastro_infraestrutura_solicitante.nome IS NOT NULL THEN
cadastro_infraestrutura_solicitante.nome
ELSE
cadastro_unidade_solicitante.nome_fantasia
END AS infraestrutura_solicitante_nome
"),
DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL THEN
cadastro_infraestrutura.nome
ELSE
cadastro_unidade.nome_fantasia
END AS infraestrutura_nome
"),
DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN
"AGENDADO"
ELSE
exame_imagem_fechamento_status.nome
END AS status_nome'),
);
self::setOrderBy($consulta);
return $consulta
->groupBy([
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.unidade_solicitante_id',
'exame_imagem_agendamento_exame.exame_id',
])
->get()
->map(function ($relatorio) {
return [
'data' => $relatorio->data,
'exame_nome' => $relatorio->exame_nome,
'exame_id' => $relatorio->exame_id,
'procedimento' => $relatorio->procedimento,
'nome_procedimento' => $relatorio->nome_procedimento,
'status_nome' => $relatorio->status_nome,
'unidade_solicitante_nome' => $relatorio->unidade_solicitante_nome,
'nome_fantasia' => $relatorio->nome_fantasia,
'infraestrutura_nome' => $relatorio->infraestrutura_nome,
'unidade_id' => $relatorio->unidade_id,
'unidade_solicitante_id' => $relatorio->unidade_solicitante_id,
'infraestrutura_solicitante_nome' => $relatorio->infraestrutura_solicitante_nome,
'quantidade' => $relatorio->quantidade,
'nome_prestador' => $relatorio->nome_prestador,
'ocupacao_nome' => $relatorio->ocupacao_nome,
'ocupacao_codigo' => $relatorio->ocupacao_codigo,
'profissional' => $relatorio->profissional,
];
});
}
private static function getAgendamentosBuilder()
{
$inicio = request()->periodo['start'];
$fim = request()->periodo['end'];
$periodo = [$inicio, $fim];
$agendamentos = DB::table('exame_imagem_agendamento_exame')
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->leftJoin(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'exame_imagem_parametrizacao_unidade',
'exame_imagem_parametrizacao_unidade.id',
'exame_imagem_jornada.prestador_id'
)
->leftJoin(
'cadastro_unidade AS cadastro_unidade_parametrizacao',
'cadastro_unidade_parametrizacao.id',
'exame_imagem_parametrizacao_unidade.unidade_id'
)
->leftJoin('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->leftJoin(
'parametrizacao_procedimento',
'parametrizacao_procedimento.procedimento_codigo',
'parametrizacao_exame.codigo'
)
->join('cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_agendamento.profissional_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('exame_imagem_parametrizacao_ocupacao', 'exame_imagem_parametrizacao_ocupacao.ocupacao_id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'exame_imagem_agendamento.paciente_id')
->join('cadastro_cidadao as cidadao_paciente', 'cidadao_paciente.id', 'cadastro_paciente.cidadao_id')
->whereBetween('exame_imagem_agendamento.data', $periodo)
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->status_id, fn ($q, $id) => $q->where('exame_imagem_agendamento_exame.status_id', $id))
->when(request()->procedimento_codigo, fn ($q, $id) => $q->where('parametrizacao_exame.codigo', $id))
->when(request()->exame_id, fn ($q, $id) => $q->where('parametrizacao_exame.id', $id))
->when(request()->ocupacao_id, fn ($q, $id) => $q->where('ocupacao.id', $id))
->when(request()->profissional_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.profissional_id', $id))
->when(request()->prestador_id, fn ($q, $id) => $q->where('cadastro_unidade_parametrizacao.id', $id));
return $agendamentos;
}
public static function getPrintExportData()
{
$unidadeSolicitante = Unidade::find(request()->unidade_solicitante_id);
$infraestruturaSolicitante = Infraestrutura::find(request()->infraestrutura_solicitante_id);
$unidadeExecutante = Unidade::find(request()->unidade_id);
$infraestruturaExecutante = Infraestrutura::find(request()->infraestrutura_id);
$exame = Exame::find(request()->exame_id);
$status = StatusFechamento::find(request()->status_id);
$ocupacao = Ocupacao::find(request()->ocupacao_id);
$profissional = Usuario::find(request()->profissional_id);
$prestador = Unidade::find(request()->prestador_id);
$procedimento = Procedimento::where('codigo', request()->procedimento_codigo)->first();
return [
'inicio' => Carbon::createFromFormat('Y-m-d', request()->periodo['start'])->format('d/m/Y'),
'fim' => Carbon::createFromFormat('Y-m-d', request()->periodo['end'])->format('d/m/Y'),
'unidadeSolicitante' => $unidadeSolicitante ? $unidadeSolicitante->nome_fantasia : 'Todas',
'unidadeExecutante' => $unidadeExecutante ? $unidadeExecutante->nome_fantasia : 'Todas',
'infraestrutura_executante' => $infraestruturaExecutante ? $infraestruturaExecutante->nome : 'Todos',
'infraestrutura_solicitante' => $infraestruturaSolicitante ? $infraestruturaSolicitante->nome : 'Todos',
'profissional' => $profissional ? $profissional->cidadao->nome : 'Todos',
'prestador' => $prestador ? $prestador->nome_fantasia : 'Todos',
'exame' => $exame ? $exame->nome : 'Todos',
'status' => $status ? $status->nome : 'Todos',
'ocupacao' => $ocupacao ? $ocupacao->nome : 'Todas',
'procedimento' => $procedimento ? $procedimento->codigo : 'Todos',
'procedimento_nome' => $procedimento ? $procedimento->nome : 'Todos',
'colunas' => collect(request()->selectedCols),
'totalExames' => collect(request()->totalExames),
];
}
public static function datatable()
{
$exames = self::getExamesBuilder()
->when(request()->query('periodo'), fn ($q, $periodo) => $q->whereBetween('exame_imagem_agendamento.data', [
Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->setTime(23, 59, 59)
]))
->when(request()->unidade_executante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->prestador_id, fn ($q, $id) => $q->where('exame_imagem_parametrizacao_unidade.prestador', $id))
->when(request()->exame_id, fn ($q, $id) => $q->where('parametrizacao_exame.id', $id))
->when(request()->procedimento, fn ($q, $codigo) => $q->where('parametrizacao_exame.codigo', $codigo));
return $exames;
}
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
return [
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
],
'form' => self::getForms(),
'model' => [
'periodo' => [
'start' => request()->periodo['start'] ?? $currentDate,
'end' => request()->periodo['end'] ?? $currentDate,
],
'exame_id' => null,
'procedimento' => null,
'prestador_id' => null,
'profissional_id' => null,
'unidade_solicitante_id' => null,
'infraestrutura_solicitante_id' => null,
'unidade_id' => null,
'infraestrutura_id' => null,
'status_id' => null,
'ocupacao_id' => null,
],
];
}
private static function setOrderBy($builder)
{
$columns = [
'exame_nome' => 'parametrizacao_exame.nome',
'exame_id' => 'parametrizacao_exame.id',
'procedimento' => 'parametrizacao_exame.codigo',
'nome_procedimento' => 'sigtap.procedimento.nome',
'status_nome' => DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN "AGENDADO" ELSE exame_imagem_fechamento_status.nome END'),
'unidade_solicitante_nome' => 'cadastro_unidade_solicitante.nome_fantasia',
'nome_fantasia' => 'cadastro_unidade.nome_fantasia',
'infraestrutura_nome' => DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL THEN
cadastro_infraestrutura.nome
ELSE
cadastro_unidade.nome_fantasia
END
"),
'unidade_id' => 'exame_imagem_agendamento.unidade_id',
'unidade_solicitante_id' => 'exame_imagem_agendamento.unidade_solicitante_id',
'infraestrutura_solicitante_nome' => DB::raw("
CASE WHEN cadastro_infraestrutura_solicitante.nome IS NOT NULL THEN
cadastro_infraestrutura_solicitante.nome
ELSE
cadastro_unidade_solicitante.nome_fantasia
END
"),
'quantidade' => DB::raw('count(exame_imagem_agendamento_exame.id)'),
'nome_prestador' => 'cadastro_unidade_parametrizacao.nome_fantasia',
'ocupacao_nome' => 'ocupacao.nome',
'ocupacao_codigo' => 'ocupacao.codigo',
'profissional' => 'cadastro_cidadao.nome',
];
if (is_null(request()->sortBy)) {
$builder->orderByRaw(join(', ', $columns));
return;
}
$column = $columns[request()->sortBy];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
unset($columns[request()->sortBy]);
$builder->orderByRaw(
"{$column} {$direction}, " . join(', ', $columns)
);
}
public static function getForms()
{
$now = Carbon::now();
$inicio = request()->periodo['start'] ?? $now->format('Y-m-d');
$fim = request()->periodo['end'] ?? $now->format('Y-m-d');
$periodo = [$inicio, $fim];
return [
'unidadesSolicitantes' => self::getUnidadesSolicitantes($periodo),
'unidadesExecutantes' => self::getUnidadesExecutantes($periodo),
'exames' => self::getExames($periodo),
'status' => self::getStatus($periodo),
'ocupacoes' => self::getOcupacao($periodo),
'profissionais' => self::getProfissional($periodo),
'prestadores' => self::getPrestador($periodo),
];
}
private static function getUnidadesSolicitantes($periodo)
{
$unidade = DB::table('cadastro_infraestrutura')
->select([
'cadastro_unidade.id AS unidade_id',
'cadastro_infraestrutura.id AS infraestrutura_id',
'cadastro_unidade.nome_fantasia as nome_fantasia',
DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL THEN
cadastro_infraestrutura.nome
ELSE
cadastro_unidade.nome_fantasia
END AS nome_infraestrutura
"),
'cadastro_infraestrutura.principal as principal'
])
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.infraestrutura_solicitante_id', 'cadastro_infraestrutura.id')
->whereNull('cadastro_infraestrutura.deleted_at')
->whereBetween('exame_imagem_agendamento.data', $periodo)
->distinct('infraestrutura_id')
->orderBy('nome_fantasia')
->get();
$resultadoAgrupado = [];
foreach ($unidade as $item) {
$unidadeId = $item->unidade_id;
$infraestruturaId = $item->infraestrutura_id;
$nomeInfraestrutura = $item->nome_infraestrutura;
if (!isset($resultadoAgrupado[$unidadeId])) {
$resultadoAgrupado[$unidadeId] = [
'id' => $unidadeId,
'nome_fantasia' => $item->nome_fantasia,
'infraestruturas' => []
];
}
$resultadoAgrupado[$unidadeId]['infraestruturas'][] = [
'id' => $infraestruturaId,
'nome' => $nomeInfraestrutura,
'principal' => $item->principal
];
}
usort($resultadoAgrupado, function ($a, $b) {
return strcmp($a['nome_fantasia'], $b['nome_fantasia']);
});
return $resultadoAgrupado;
}
private static function getUnidadesExecutantes($periodo)
{
$unidade = DB::table('cadastro_infraestrutura')
->select([
'cadastro_unidade.id AS unidade_id',
'cadastro_infraestrutura.id AS infraestrutura_id',
'cadastro_unidade.nome_fantasia as nome_fantasia',
DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL THEN
cadastro_infraestrutura.nome
ELSE
cadastro_unidade.nome_fantasia
END AS nome_infraestrutura
"),
'cadastro_infraestrutura.principal as principal'
])
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.infraestrutura_id', 'cadastro_infraestrutura.id')
->whereNull('cadastro_infraestrutura.deleted_at')
->whereBetween('exame_imagem_agendamento.data', $periodo)
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->distinct('infraestrutura_id')
->orderBy('nome_fantasia')
->get();
$resultadoAgrupado = [];
foreach ($unidade as $item) {
$unidadeId = $item->unidade_id;
$infraestruturaId = $item->infraestrutura_id;
$nomeInfraestrutura = $item->nome_infraestrutura;
if (!isset($resultadoAgrupado[$unidadeId])) {
$resultadoAgrupado[$unidadeId] = [
'id' => $unidadeId,
'nome_fantasia' => $item->nome_fantasia,
'infraestruturas' => []
];
}
$resultadoAgrupado[$unidadeId]['infraestruturas'][] = [
'id' => $infraestruturaId,
'nome' => $nomeInfraestrutura,
'principal' => $item->principal
];
}
usort($resultadoAgrupado, function ($a, $b) {
return strcmp($a['nome_fantasia'], $b['nome_fantasia']);
});
return $resultadoAgrupado;
}
private static function getStatus($periodo)
{
return DB::table('exame_imagem_fechamento_status')
->select(
'exame_imagem_fechamento_status.id',
'exame_imagem_fechamento_status.nome',
)
->join('exame_imagem_agendamento_exame', 'exame_imagem_agendamento_exame.status_id', 'exame_imagem_fechamento_status.id')
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.id', 'exame_imagem_agendamento_exame.agendamento_id')
->whereBetween('exame_imagem_agendamento.data', $periodo)
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->distinct('nome')
->orderBy('nome')
->get();
}
public static function autocompleteProcedimento()
{
$now = Carbon::now();
$inicio = request()->periodo['start'] ?? $now->format('Y-m-d');
$fim = request()->periodo['end'] ?? $now->format('Y-m-d');
$periodo = [$inicio, $fim];
return DB::table('parametrizacao_exame')
->select(
'sigtap.procedimento.codigo as codigo',
'sigtap.procedimento.nome as nome',
)
->join('exame_imagem_agendamento_exame', 'exame_imagem_agendamento_exame.exame_id', 'parametrizacao_exame.id')
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.id', 'exame_imagem_agendamento_exame.agendamento_id')
->where('parametrizacao_exame.tipo_id', Tipo::IMAGEM)
->whereBetween('exame_imagem_agendamento.data', $periodo)
->join('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->status_id, fn ($q, $id) => $q->where('exame_imagem_agendamento_exame.status_id', $id))
->distinct('codigo','nome')
->orderBy('nome');
}
private static function getExames($periodo)
{
return DB::table('parametrizacao_exame')
->select(
'parametrizacao_exame.id',
'parametrizacao_exame.nome',
)
->join('exame_imagem_agendamento_exame', 'exame_imagem_agendamento_exame.exame_id', 'parametrizacao_exame.id')
->join('exame_imagem_agendamento', 'exame_imagem_agendamento.id', 'exame_imagem_agendamento_exame.agendamento_id')
->where('parametrizacao_exame.tipo_id', Tipo::IMAGEM)
->whereBetween('exame_imagem_agendamento.data', $periodo)
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->status_id, fn ($q, $id) => $q->where('exame_imagem_agendamento_exame.status_id', $id))
->when(request()->procedimento_codigo, fn ($q, $id) => $q->where('parametrizacao_exame.codigo', $id))
->distinct('id','nome')
->orderBy('nome')
->get();
}
private static function getOcupacao($periodo)
{
return DB::table('exame_imagem_agendamento')
->select(
'ocupacao.id',
'ocupacao.nome',
)
->join('cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_agendamento.profissional_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('exame_imagem_agendamento_exame', 'exame_imagem_agendamento_exame.agendamento_id', 'exame_imagem_agendamento.id')
->join('parametrizacao_exame', 'parametrizacao_exame.id', 'exame_imagem_agendamento_exame.exame_id')
->join('cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('exame_imagem_parametrizacao_ocupacao', 'exame_imagem_parametrizacao_ocupacao.ocupacao_id', 'cadastro_lotacao.ocupacao_id')
->whereBetween('exame_imagem_agendamento.data', $periodo)
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->status_id, fn ($q, $id) => $q->where('exame_imagem_agendamento_exame.status_id', $id))
->when(request()->procedimento_codigo, fn ($q, $id) => $q->where('parametrizacao_exame.codigo', $id))
->when(request()->exame_id, fn ($q, $id) => $q->where('parametrizacao_exame.id', $id))
->distinct('nome')
->orderBy('nome')
->get();
}
private static function getProfissional($periodo)
{
return DB::table('exame_imagem_agendamento')
->select(
'cadastro_usuario.id',
'cadastro_cidadao.nome',
)
->join('cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_agendamento.profissional_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('exame_imagem_agendamento_exame', 'exame_imagem_agendamento_exame.agendamento_id', 'exame_imagem_agendamento.id')
->join('parametrizacao_exame', 'parametrizacao_exame.id', 'exame_imagem_agendamento_exame.exame_id')
->join('cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('exame_imagem_parametrizacao_ocupacao', 'exame_imagem_parametrizacao_ocupacao.ocupacao_id', 'cadastro_lotacao.ocupacao_id')
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->status_id, fn ($q, $id) => $q->where('exame_imagem_agendamento_exame.status_id', $id))
->when(request()->procedimento_codigo, fn ($q, $id) => $q->where('parametrizacao_exame.codigo', $id))
->when(request()->exame_id, fn ($q, $id) => $q->where('parametrizacao_exame.id', $id))
->when(request()->ocupacao_id, fn ($q, $id) => $q->where('ocupacao.id', $id))
->whereBetween('exame_imagem_agendamento.data', $periodo)
->distinct('nome')
->orderBy('nome')
->get();
}
private static function getPrestador($periodo)
{
return DB::table('exame_imagem_agendamento')
->select(
'cadastro_unidade_parametrizacao.id',
'cadastro_unidade_parametrizacao.nome_fantasia AS nome',
)
->join('cadastro_usuario', 'cadastro_usuario.id', 'exame_imagem_agendamento.profissional_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('exame_imagem_agendamento_exame', 'exame_imagem_agendamento_exame.agendamento_id', 'exame_imagem_agendamento.id')
->join('parametrizacao_exame', 'parametrizacao_exame.id', 'exame_imagem_agendamento_exame.exame_id')
->join('cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
->join('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('exame_imagem_parametrizacao_ocupacao', 'exame_imagem_parametrizacao_ocupacao.ocupacao_id', 'cadastro_lotacao.ocupacao_id')
->join('exame_imagem_jornada', 'exame_imagem_jornada.id', 'exame_imagem_agendamento.jornada_id')
->join('exame_imagem_parametrizacao_unidade', 'exame_imagem_parametrizacao_unidade.id', 'exame_imagem_jornada.prestador_id')
->join('cadastro_unidade AS cadastro_unidade_parametrizacao', 'cadastro_unidade_parametrizacao.id', 'exame_imagem_parametrizacao_unidade.unidade_id')
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->unidade_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_solicitante_id', $id))
->when(request()->infraestrutura_solicitante_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_solicitante_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.unidade_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.infraestrutura_id', $id))
->when(request()->status_id, fn ($q, $id) => $q->where('exame_imagem_agendamento_exame.status_id', $id))
->when(request()->procedimento_codigo, fn ($q, $id) => $q->where('parametrizacao_exame.codigo', $id))
->when(request()->exame_id, fn ($q, $id) => $q->where('parametrizacao_exame.id', $id))
->when(request()->ocupacao_id, fn ($q, $id) => $q->where('ocupacao.id', $id))
->when(request()->profissional_id, fn ($q, $id) => $q->where('exame_imagem_agendamento.profissional_id', $id))
->whereBetween('exame_imagem_agendamento.data', $periodo)
->distinct('nome')
->orderBy('nome')
->get();
}
private static function getExamesBuilder()
{
$result = DB::table('exame_imagem_agendamento_exame')
->select(
'exame_imagem_agendamento_exame.id AS id_paciente',
'exame_imagem_agendamento_exame.agendamento_id AS agendamento_id',
'exame_imagem_agendamento_exame.status_id',
'exame_imagem_agendamento.medico_id',
'exame_imagem_agendamento.unidade_id',
'exame_imagem_agendamento.profissional_id',
'exame_imagem_agendamento.agendamento_numero AS agendamento_numero',
'exame_imagem_agendamento.jornada_id AS jornada_agendamento',
'cadastro_unidade.nome_fantasia',
'medico_cidadao.nome AS medico_solicitante',
'profissional.nome AS profissional_nome',
'cadastro_unidade_solicitante.nome_fantasia AS unidade_solicitante_nome',
'cadastro_unidade_solicitante.id AS unidade_solicitante_id',
'cadastro_paciente.id AS paciente_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'cidadao.nome AS paciente_nome',
'exame_imagem_jornada.id AS jornada_id',
'exame_imagem_jornada.status_id AS jornada_status_id',
'exame_imagem_jornada.prestador_id',
'exame_imagem_parametrizacao_unidade.id AS parametrizacao',
'exame_imagem_parametrizacao_unidade.unidade_id AS parametrizacao_unidade_id',
'cadastro_unidade_parametrizacao.nome_fantasia AS parametrizacao_nome_prestador',
'parametrizacao_exame.id AS exame_id',
'parametrizacao_exame.nome AS exame_nome',
'parametrizacao_exame.codigo AS exame_codigo',
'sigtap.procedimento.nome AS nome_procedimento',
'sigtap.procedimento.id AS procedimento_id',
DB::raw('DATE_FORMAT(exame_imagem_agendamento.hora_exame, "%H:%i") AS hora_exame'),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_agendamento.created_at, '%d/%m/%Y') AS data_pedido"),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cidadao.data_nascimento, "%d/%m/%Y")) as data_nascimento'),
DB::raw("
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.cidadao_id = cadastro_paciente.cidadao_id
AND cadastro_cidadao_telefone.deleted_at IS NULL
LIMIT 1
) AS paciente_telefone
"),
DB::raw(
'(
CASE WHEN cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cidadao.nome_mae
END
) as nome_mae'
),
DB::raw('CASE WHEN exame_imagem_agendamento_exame.status_id IS NULL THEN
"AGENDADO"
ELSE
exame_imagem_fechamento_status.nome
END AS status_nome'),
)
->join(
'exame_imagem_agendamento',
'exame_imagem_agendamento.id',
'exame_imagem_agendamento_exame.agendamento_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'exame_imagem_agendamento.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'cadastro_infraestrutura AS cadastro_infraestrutura_solicitante',
'cadastro_infraestrutura_solicitante.id',
'exame_imagem_agendamento.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade AS cadastro_unidade_solicitante',
'cadastro_unidade_solicitante.id',
'cadastro_infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_agendamento.medico_id'
)
->join(
'cadastro_cidadao AS medico_cidadao',
'medico_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_usuario AS profissional_cidadao',
'profissional_cidadao.id',
'exame_imagem_agendamento.profissional_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'profissional_cidadao.cidadao_id'
)
->join(
'cadastro_cidadao AS cadastro_cidadao_usuario',
'cadastro_cidadao_usuario.id',
'cadastro_usuario.cidadao_id'
)
->join(
'parametrizacao_exame',
'parametrizacao_exame.id',
'exame_imagem_agendamento_exame.exame_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_agendamento.exame_id'
)
->join(
'exame_imagem_jornada',
'exame_imagem_jornada.id',
'exame_imagem_agendamento.jornada_id'
)
->leftJoin(
'cadastro_usuario_registro_tipo',
'cadastro_usuario_registro_tipo.id',
'profissional_cidadao.registro_tipo_id'
)
->leftJoin(
'cadastro_paciente',
'cadastro_paciente.id',
'exame_imagem_agendamento_exame.paciente_id'
)
->leftJoin(
'cadastro_cidadao AS cidadao',
'cidadao.id',
'cadastro_paciente.cidadao_id'
)
->leftJoin(
'exame_imagem_fechamento_status',
'exame_imagem_fechamento_status.id',
'exame_imagem_agendamento_exame.status_id'
)
->leftJoin(
'exame_imagem_parametrizacao_unidade',
'exame_imagem_parametrizacao_unidade.id',
'exame_imagem_jornada.prestador_id'
)
->leftJoin(
'cadastro_unidade AS cadastro_unidade_parametrizacao',
'cadastro_unidade_parametrizacao.id',
'exame_imagem_parametrizacao_unidade.unidade_id'
)
->leftJoin('sigtap.procedimento', function ($join) {
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
});
})
->leftJoin(
'parametrizacao_procedimento',
'parametrizacao_procedimento.procedimento_codigo',
'parametrizacao_exame.codigo'
)
->where(function ($query) {
$query->where('exame_imagem_agendamento_exame.status_id', Status::REALIZADO);
});
$result = $result->get();
return $result;
}
}

View File

@@ -0,0 +1,166 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Parametrizacao;
use App\Services\Service;
use App\Services\Sms\SmsService as BaseSmsService;
use Carbon\Carbon;
use RuntimeException;
class SmsService extends Service
{
private $baseSmsService;
private $agendamento;
private $parametrizacao;
public function __construct($agendamentoId)
{
$this->baseSmsService = new BaseSmsService();
$this->agendamento = Agendamento::findOrFail($agendamentoId);
$this->parametrizacao = Parametrizacao::where(
'infraestrutura_id',
$this->agendamento->jornada->infraestrutura_id
)->first();
}
public function send()
{
if ($this->agendamento->jornada->data->isToday()) {
return;
}
$cellPhone = $this->getCellPhone();
if (is_null($cellPhone)) {
return;
}
if (!$this->parametrizacao->envia_sms || ($this->parametrizacao->envia_sms && is_null($this->parametrizacao->sms))) {
return;
}
$schedule = $this->getSchedule();
if (!$this->isAllowedToSend($schedule)) {
return;
}
try {
$smsEnvio = $this->baseSmsService->send($cellPhone, $this->getMessage(), $schedule);
$this->agendamento->sms_envio_id = $smsEnvio->id;
$this->agendamento->save();
}
catch (RuntimeException $e) {}
}
private function isAllowedToSend($schedule)
{
if (is_null($schedule)) {
$schedule = Carbon::now();
}
$envioDe = $this->parametrizacao->sms->envio_de->startOfDay();
$envioAte = $this->parametrizacao->sms->envio_ate->endOfDay();
if ($schedule >= $envioDe && $schedule <= $envioAte) {
return $this->agendamento->agendamentoExame
->pluck('exame_id')
->intersect($this->parametrizacao->sms->exames->pluck('id'))
->isNotEmpty();
}
return false;
}
private function getCellPhone()
{
return $this->agendamento->paciente->cidadao->telefones()
->where('autoriza_sms', true)
->first()->numero ?? null;
}
private function getMessage()
{
$nomeRegistroPaciente = $this->agendamento->paciente->cidadao->nome;
$nomeSocialPaciente = $this->agendamento->paciente->cidadao->nome_social;
$preferenciaNome = $this->agendamento->paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL;
$nomePaciente = $preferenciaNome && $nomeSocialPaciente ? $nomeSocialPaciente : $nomeRegistroPaciente;
$data = $this->agendamento->jornada->data->format('d/m');
$horario = (new Carbon($this->agendamento->hora_exame))->format('H:i');
$unidade = $this->agendamento->jornada->infraestrutura->unidade->nome_fantasia;
$infraestrutura = $this->agendamento->jornada->infraestrutura->nome;
$unidade .= $infraestrutura === $unidade ? '' : " ({$infraestrutura})";
$unidade = self::limitLocal($unidade);
$unidade = trim($unidade);
$nomePaciente = self::limitName($nomePaciente, 30);
$mensagem = "Olá {$nomePaciente}, seu pedido de {$this->agendamento->grupo->nome}"
. " agendado em" . " {$data} às {$horario}"
. " a ser realizado na {$unidade}. Confirme e Leve o Comprovante.";
return self::limitMsg($mensagem);
}
function limitName($nome)
{
$partes = explode(' ', $nome);
$primeiroNome = array_shift($partes);
$nomeFinal = $primeiroNome;
return $nomeFinal;
}
function limitLocal($local, $limite = 30)
{
return mb_strlen($local) > $limite
? mb_substr($local, 0, $limite)
: $local;
}
function limitMsg($msg, $limite = 160)
{
return mb_strlen($msg) > $limite
? mb_substr($msg, 0, $limite - 3) . '...'
: $msg;
}
private function getSchedule()
{
$schedule = $this->agendamento->jornada->data->copy()->subDays($this->parametrizacao->sms->dia_antecedencia);
if ($schedule <= Carbon::today()) {
return null;
}
return $schedule;
}
public function cancel()
{
if (is_null($this->agendamento->sms_envio_id)) {
return;
}
try {
$this->baseSmsService->cancel($this->agendamento->sms_envio_id);
}
catch (RuntimeException $e) {}
}
}