Files
rkm-conectasus-ci-sandbox/api/app/Services/Mobile/ConectaCidadao/HistoricoAtendimento/HistoricoAtendimentoService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

389 lines
22 KiB
PHP

<?php
namespace App\Services\Mobile\ConectaCidadao\HistoricoAtendimento;
use App\Services\Service;
use App\Services\Ambulatorio\AtendimentoHistoricoService as AmbulatorioHistoricoService;
use App\Services\ProntoAtendimento\HistoricoService as ProntoAtendimentoHistoricoService;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Mobile\ConectaCidadao\ConectaCidadaoAvaliacaoAtendimento;
use App\Models\Ambulatorio\AtendimentoPreAtendimento;
use App\Models\Ambulatorio\AtendimentoSoap;
use App\Models\Ambulatorio\AtendimentoPosConsulta;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Exception;
class HistoricoAtendimentoService extends Service
{
public function getHistorico(Paciente $paciente, $limit = 15)
{
$preAtendimentos = self::getPreAtendimentoQuery($paciente->id);
$atendimentosSoap = self::getAtendimentoSoapQuery($paciente->id);
$posConsulta = self::getPosConsultaQuery($paciente->id);
$prontoAtendimento = self::getProntoAtendimentosQuery($paciente->id);
$query = $preAtendimentos
->unionAll($atendimentosSoap)
->unionAll($posConsulta)
->unionAll($prontoAtendimento)
->orderBy('data_atendimento', 'desc');
$paginator = $query->paginate((int) $limit);
return [
'current_page' => $paginator->currentPage(),
'data' => array_map(function ($item) {
return self::formatItem($item);
}, $paginator->items()),
'first_page_url' => $paginator->url(1),
'from' => $paginator->firstItem(),
'last_page' => $paginator->lastPage(),
'last_page_url' => $paginator->url($paginator->lastPage()),
'next_page_url' => $paginator->nextPageUrl(),
'path' => $paginator->path(),
'per_page' => $paginator->perPage(),
'prev_page_url' => $paginator->previousPageUrl(),
'to' => $paginator->lastItem(),
'total' => $paginator->total(),
];
}
public function getDetalhes($id, $sourceType)
{
switch ($sourceType) {
case 'pre-atendimento':
return AmbulatorioHistoricoService::getPreAtendimento($id);
case 'soap':
return AmbulatorioHistoricoService::getAtendimentoSoap($id);
case 'pos-consulta':
return AmbulatorioHistoricoService::getPosConsulta($id);
case 'pronto-atendimento':
return ProntoAtendimentoHistoricoService::getAtendimento($id);
default:
throw new Exception('Tipo de atendimento inválido.');
}
}
public function avaliar(string $sourceType, int $id, array $params): void
{
$avaliacao = new ConectaCidadaoAvaliacaoAtendimento();
switch ($sourceType) {
case 'pre-atendimento':
AtendimentoPreAtendimento::findOrFail($id);
$avaliacao->ambulatorio_atendimento_pre_atendimento_id = $id;
break;
case 'soap':
AtendimentoSoap::findOrFail($id);
$avaliacao->ambulatorio_atendimento_soap_id = $id;
break;
case 'pos-consulta':
AtendimentoPosConsulta::findOrFail($id);
$avaliacao->ambulatorio_atendimento_pos_consulta_id = $id;
break;
case 'pronto-atendimento':
Atendimento::findOrFail($id);
$avaliacao->pronto_atendimento_atendimento_id = $id;
break;
default:
throw new \InvalidArgumentException('Tipo de origem inválido.');
}
$avaliacao->nota = $params['nota'] ?? null;
$avaliacao->comentario = $params['comentario'] ?? null;
$avaliacao->save();
}
private static function formatItem($item)
{
$item->created_at = Carbon::create($item->data_atendimento);
$dadosHistorico = [
'tipo' => $item->source_type,
'data_hora' => $item->created_at->format('d/m/Y \à\s H:i'),
'lotacao' => [
'ocupacao' => [
'codigo' => $item->ocupacao_codigo,
'nome' => $item->ocupacao_nome,
],
'profissional' => [
'nome' => $item->cidadao_nome,
],
],
'centro_custo' => [
'setor' => [
'nome' => $item->setor_nome,
],
'unidade' => [
'nome_fantasia' => $item->unidade_nome_fantasia,
],
],
'tipo_atendimento' => $item->tipo_atendimento,
'id' => $item->id,
'atendimento_id' => $item->atendimento_id,
'is_atendimento_enfermagem' => (bool) $item->is_atendimento_enfermagem,
'is_atendimento_soap_assinado' => (bool) $item->is_atendimento_soap_assinado,
];
return (object) $dadosHistorico;
}
private static function getProntoAtendimentosQuery($pacienteId)
{
return DB::table('pronto_atendimento_atendimento')
->select([
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento.id as atendimento_id',
'pronto_atendimento_atendimento_recepcao.atendido_em as data_atendimento',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Pronto Atendimento' AS tipo_atendimento"),
DB::raw("false as is_atendimento_enfermagem"),
DB::raw("false as is_atendimento_soap_assinado"),
DB::raw("'pronto-atendimento' as source_type")
])
->join('pronto_atendimento_faa', 'pronto_atendimento_faa.id', 'pronto_atendimento_atendimento.faa_id')
->join('pronto_atendimento_atendimento_recepcao', 'pronto_atendimento_atendimento_recepcao.atendimento_id', 'pronto_atendimento_atendimento.id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_faa.lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'pronto_atendimento_faa.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('pronto_atendimento_faa.paciente_id', $pacienteId)
->whereNull('pronto_atendimento_atendimento.deleted_at');
}
private static function getPreAtendimentoQuery($pacienteId)
{
return DB::table('ambulatorio_atendimento_pre_atendimento')
->select([
'ambulatorio_atendimento_pre_atendimento.id',
'ambulatorio_atendimento_pre_atendimento.atendimento_id',
'ambulatorio_atendimento_pre_atendimento.created_at as data_atendimento',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Pré-atendimento' AS tipo_atendimento"),
DB::raw("false as is_atendimento_enfermagem"),
DB::raw("false as is_atendimento_soap_assinado"),
DB::raw("'pre-atendimento' as source_type")
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pre_atendimento.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pre_atendimento.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_agendamento.paciente_id', $pacienteId)
->unionAll(
DB::table('ambulatorio_atendimento_pre_atendimento')
->select([
'ambulatorio_atendimento_pre_atendimento.id',
'ambulatorio_atendimento_pre_atendimento.atendimento_id',
'ambulatorio_atendimento_pre_atendimento.created_at as data_atendimento',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Pré-atendimento' AS tipo_atendimento"),
DB::raw("false as is_atendimento_enfermagem"),
DB::raw("false as is_atendimento_soap_assinado"),
DB::raw("'pre-atendimento' as source_type")
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pre_atendimento.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pre_atendimento.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId)
);
}
private static function getAtendimentoSoapQuery($pacienteId)
{
return DB::table('ambulatorio_atendimento_soap')
->select([
'ambulatorio_atendimento_soap.id',
'ambulatorio_atendimento_soap.atendimento_id',
'jornada.data as data_atendimento',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Atendimento' AS tipo_atendimento"),
'ambulatorio_atendimento_soap.is_atendimento_enfermagem',
'ambulatorio_atendimento_soap.is_atendimento_soap_assinado',
DB::raw("'soap' as source_type")
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('ambulatorio_jornada as jornada', 'jornada.id', 'ambulatorio_agendamento.jornada_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'jornada.lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_soap.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->where('ambulatorio_agendamento.paciente_id', $pacienteId)
->unionAll(
DB::table('ambulatorio_atendimento_soap')
->select([
'ambulatorio_atendimento_soap.id',
'ambulatorio_atendimento_soap.atendimento_id',
'ambulatorio_demanda_espontanea.data as data_atendimento',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Atendimento' AS tipo_atendimento"),
'ambulatorio_atendimento_soap.is_atendimento_enfermagem',
'ambulatorio_atendimento_soap.is_atendimento_soap_assinado',
DB::raw("'soap' as source_type")
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_soap.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_soap.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId)
);
}
private static function getPosConsultaQuery($pacienteId)
{
return DB::table('ambulatorio_atendimento_pos_consulta')
->select([
'ambulatorio_atendimento_pos_consulta.id',
'ambulatorio_atendimento_pos_consulta.atendimento_id',
'ambulatorio_atendimento_pos_consulta.created_at as data_atendimento',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Pós-consulta' AS tipo_atendimento"),
DB::raw("false as is_atendimento_enfermagem"),
DB::raw("false as is_atendimento_soap_assinado"),
DB::raw("'pos-consulta' as source_type")
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pos_consulta.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pos_consulta.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_agendamento.paciente_id', $pacienteId)
->unionAll(
DB::table('ambulatorio_atendimento_pos_consulta')
->select([
'ambulatorio_atendimento_pos_consulta.id',
'ambulatorio_atendimento_pos_consulta.atendimento_id',
'ambulatorio_atendimento_pos_consulta.created_at as data_atendimento',
'ocupacao.id AS ocupacao_id',
'ocupacao.codigo AS ocupacao_codigo',
'ocupacao.nome AS ocupacao_nome',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_setor.nome AS setor_nome',
'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("'Pós-consulta' AS tipo_atendimento"),
DB::raw("false as is_atendimento_enfermagem"),
DB::raw("false as is_atendimento_soap_assinado"),
DB::raw("'pos-consulta' as source_type")
])
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pos_consulta.created_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pos_consulta.created_centro_custo_id')
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId)
);
}
public function avaliacao(string $sourceType, int $id, array $params)
{
$campoMap = [
'pre-atendimento' => 'ambulatorio_atendimento_pre_atendimento_id',
'soap' => 'ambulatorio_atendimento_soap_id',
'pos-consulta' => 'ambulatorio_atendimento_pos_consulta_id',
'pronto-atendimento' => 'pronto_atendimento_atendimento_id',
];
if (!isset($campoMap[$sourceType])) {
throw new \InvalidArgumentException("Tipo de atendimento inválido: {$sourceType}");
}
$campo = $campoMap[$sourceType];
$avaliacao = DB::table('conecta_cidadao_avaliacao_atendimento')
->where($campo, $id)
->first();
if (!$avaliacao) {
throw new ModelNotFoundException('Avaliação não encontrada.');
}
return $avaliacao;
}
}