Files
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

240 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers\Impressao\Ambulatorio;
use App\Enums\Cadastro\SujeitoAtencao\Escolaridade as EscolaridadeEnum;
use App\Enums\Cadastro\SujeitoAtencao\LocalNascimento;
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Http\Controllers\Controller;
use App\Models\Ambulatorio\Atendimento;
use App\Models\Ambulatorio\CasoSuspeito;
use App\Models\Ambulatorio\CasoSuspeitoFicha;
use App\Models\Cadastro\SujeitoAtencao\Obito;
use App\Models\Intranet\Cliente;
use App\Models\Intranet\Estado;
use App\Models\Intranet\Municipio;
use App\Models\Intranet\Pais;
use App\Models\Sigtap\Cid;
use App\Services\Ambulatorio\AtendimentoService;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
class FichaNotificacaoController extends Controller
{
private const TEMPLATE = 'impressoes.template.ambulatorio.ficha-notificacao';
public function __invoke($atendimentoId)
{
$request = request()->all();
$atendimentoId = $request['atendimento_id'] ?? $atendimentoId;
$atendimento = Atendimento::findOrFail($atendimentoId);
$paciente = $atendimento->paciente;
$cliente = Cliente::where('link', config('database.default'))->firstOrFail();
if (!isset($request['caso_suspeito_id'])) {
$soapIds = $atendimento->soaps()
->where('is_rascunho', false)
->whereHas('casosSuspeitos')
->pluck('id');
$casoSuspeitoIds = DB::table('ambulatorio_atendimento_soap_caso_suspeito')
->whereIn('soap_id', $soapIds)
->pluck('caso_suspeito_id')
->filter()
->unique()
->values()
->toArray();
} else {
$casoSuspeitoIds = [$request['caso_suspeito_id']];
}
$impressoes = [];
foreach ($casoSuspeitoIds as $casoSuspeitoId) {
$numeroFicha = 1;
$fichaExistente = CasoSuspeitoFicha::where('atendimento_id', $atendimento->id)
->where('caso_suspeito_id', $casoSuspeitoId)
->first();
if ($fichaExistente) {
$numeroFicha = $fichaExistente->numero;
} else {
$ultimaFicha = CasoSuspeitoFicha::orderByDesc('created_at')->orderByDesc('id')->first();
if ($ultimaFicha) {
$numeroFicha = intval($ultimaFicha->numero) + 1;
}
CasoSuspeitoFicha::create([
'atendimento_id' => $atendimento->id,
'caso_suspeito_id' => $casoSuspeitoId,
'numero' => $numeroFicha,
]);
}
$params = $this->montarParametros(
$atendimento,
$paciente,
$cliente,
$casoSuspeitoId,
$numeroFicha,
$request['cid_id'] ?? null
);
$impressoes[] = $params;
}
return view(self::TEMPLATE, compact('impressoes'));
}
private function montarParametros($atendimento, $paciente, $cliente, $casoSuspeitoId, $numeroFicha, $cidId)
{
$municipio = Municipio::find($cliente->municipio_id);
$estado = Estado::find($municipio->estado_id);
$dataAtendimento = Carbon::parse($atendimento->created_at);
$dataAtendimentoArray = str_split($dataAtendimento->format('dmY'));
$dataNascimentoPaciente = $paciente->cidadao->data_nascimento->format('dmY');
$dataNascimentoPacienteArray = str_split($dataNascimentoPaciente);
$sexoPaciente = $paciente->cidadao->sexo->descricao;
$gestantePaciente = null;
if ($paciente->cidadao->sexo_id === Sexo::MASCULINO) {
$gestantePaciente = '6';
} else {
$soap = $atendimento->soaps()->first();
$isGestante = $soap ? AtendimentoService::isPacienteGestante($soap) : false;
if ($isGestante) {
$idadeGestacional = AtendimentoService::getIdadeGestacional($paciente);
if ($idadeGestacional !== null) {
$semanas = $idadeGestacional['semanas'];
if ($semanas <= 13) {
$gestantePaciente = '1';
} elseif ($semanas <= 27) {
$gestantePaciente = '2';
} else {
$gestantePaciente = '3';
}
} else {
$gestantePaciente = '4';
}
} else {
$gestantePaciente = null;
}
}
$racaCorPaciente = null;
switch ($paciente->cidadao->raca_cor_id) {
case RacaCor::BRANCA: $racaCorPaciente = '1'; break;
case RacaCor::NEGRA: $racaCorPaciente = '2'; break;
case RacaCor::AMARELA: $racaCorPaciente = '3'; break;
case RacaCor::PARDA: $racaCorPaciente = '4'; break;
case RacaCor::INDIGENA: $racaCorPaciente = '5'; break;
case RacaCor::SEM_INFORMACAO: $racaCorPaciente = '6'; break;
default: $racaCorPaciente = null; break;
}
$escolaridadePaciente = null;
if (!is_null($paciente->cidadao->escolaridade_id)) {
switch ($paciente->cidadao->escolaridade_id) {
case EscolaridadeEnum::FUNDAMENTAL_INCOMPLETO: $escolaridadePaciente = '1'; break;
case EscolaridadeEnum::FUNDAMENTAL_COMPLETO: $escolaridadePaciente = '4'; break;
case EscolaridadeEnum::MEDIO_INCOMPLETO: $escolaridadePaciente = '5'; break;
case EscolaridadeEnum::MEDIO_COMPLETO: $escolaridadePaciente = '6'; break;
case EscolaridadeEnum::SUPERIOR_GRADUAcao_INCOMPLETO: $escolaridadePaciente = '7'; break;
case EscolaridadeEnum::SUPERIOR_GRADUACAO_COMPLETO: $escolaridadePaciente = '8'; break;
case EscolaridadeEnum::POS_GRADUACAO_LATO_SENSO_INCOMPLETO:
case EscolaridadeEnum::POS_GRADUACAO_STRICTO_SENSU_NIVEL_MESTRADO_INCOMPLETO:
case EscolaridadeEnum::POS_GRADUACAO_STRICTO_SENSU_NIVEL_DOUTORADO_INCOMPLETO:
$escolaridadePaciente = '7'; break;
case EscolaridadeEnum::POS_GRADUACAO_LATO_SENSO_COMPLETO:
case EscolaridadeEnum::POS_GRADUACAO_STRICTO_SENSU_NIVEL_MESTRADO_COMPLETO:
case EscolaridadeEnum::POS_GRADUACAO_STRICTO_SENSU_NIVEL_DOUTORADO_COMPLETO:
$escolaridadePaciente = '8'; break;
default: $escolaridadePaciente = '9'; break;
}
}
$domicilioPaciente = DB::table('cadastro_domicilio')->where('id', $paciente->cidadao->domicilio_id)->first();
$enderecoPaciente = DB::table('cadastro_endereco')->where('id', $domicilioPaciente->endereco_id)->first();
$logradouroPaciente = DB::table('cadastro_logradouro')->where('id', $enderecoPaciente->logradouro_id)->first();
$logradouroPacienteTipo = DB::table('cadastro_logradouro_tipo')->where('id', $logradouroPaciente->tipo_id)->first();
$municipioPaciente = Municipio::find($logradouroPaciente->municipio_id);
$estadoPaciente = Estado::find($municipioPaciente->estado_id);
$bairroPaciente = DB::table('cadastro_bairro')->where('id', $logradouroPaciente->bairro_id)->first();
$telefonePrincipalPaciente = $paciente->cidadao->telefones->where('principal', true)->first() ?? $paciente->cidadao->telefones->first();
$localNascimentoPaciente = $paciente->cidadao->local_nascimento_id;
$paisPaciente = null;
if ($localNascimentoPaciente === LocalNascimento::EM_OUTRO_PAIS) {
$paisPaciente = Pais::where('id', $estadoPaciente->pais_id)->pluck('nome')->first();
}
$usuarioLogado = self::getCurrentLotacao()->usuario;
$pacienteObito = Obito::where('cidadao_id', $paciente->cidadao_id)->exists();
if (!$cidId) {
$cidId = DB::table('ambulatorio_caso_suspeito_cid')
->where('caso_suspeito_id', $casoSuspeitoId)
->value('cid_id');
}
$cidNome = Cid::where('id', $cidId)->pluck('nome')->first();
$nomeCasoSuspeito = CasoSuspeito::where('id', $casoSuspeitoId)->pluck('nome')->first();
return [
'numero_notificacao' => $numeroFicha,
'nome_caso_suspeito' => $nomeCasoSuspeito,
'data_notificacao' => $dataAtendimentoArray,
'cliente' => [
'estado' => str_split($estado->uf),
'municipio' => $municipio->nome,
'codigo_ibge' => str_split($municipio->ibge),
'nome_unidade' => $atendimento->createdCentroCusto->infraestrutura->unidade->nome_fantasia,
'codigo_sinan_unidade' => null,
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nome_social' => $paciente->cidadao->nome_social,
'data_nascimento' => $dataNascimentoPacienteArray,
'idade' => null,
'sexo' => substr($sexoPaciente, 0, 1),
'gestante' => $gestantePaciente,
'raca_cor' => $racaCorPaciente,
'escolaridade' => $escolaridadePaciente ?? '9',
'cartao_sus' => str_split($paciente->cidadao->cns),
'nome_mae' => $paciente->cidadao->nome_mae ?? 'DESCONHECE',
'endereco' => [
'estado' => str_split($estadoPaciente->uf),
'municipio' => $municipioPaciente->nome,
'codigo_ibge' => str_split($municipio->ibge),
'distrito' => null,
'bairro' => $bairroPaciente->nome,
'logradouro' => $logradouroPacienteTipo->descricao . " " . $logradouroPaciente->nome,
'numero' => $enderecoPaciente->numero ?? null,
'complemento' => $enderecoPaciente->complemento ?? null,
'referencia' => $enderecoPaciente->referencia ?? null,
'cep' => $logradouroPaciente->cep ? str_split($logradouroPaciente->cep) : null,
'telefone_ddd' => $telefonePrincipalPaciente ? substr($telefonePrincipalPaciente->numero, 0, 2) : null,
'telefone_numero' => $telefonePrincipalPaciente ? str_split(substr($telefonePrincipalPaciente->numero, 2)) : null,
'pais' => $paisPaciente,
],
],
'notificante' => [
'municipio_unidade' => $municipio->nome . "/" . $atendimento->createdCentroCusto->infraestrutura->unidade->nome_fantasia,
'nome' => $usuarioLogado->cidadao->nome,
'funcao' => self::getCurrentLotacao()->ocupacao->nome,
],
'dados_complementares' => [
'obito' => $pacienteObito ? '1' : '2',
'cid_10' => $cidNome ?? null,
]
];
}
}