Files
rkm-conectasus-ci-sandbox/api/app/Http/Controllers/Impressao/ProntoAtendimento/AtendimentoMedico/AtestadoAcompanhanteController.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

150 lines
6.7 KiB
PHP

<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\ProntoAtendimento\Atendimento\Medico\AtestadoModelo;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Geral\DocumentoTipo;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Models\ProntoAtendimento\Atendimento\Recepcao;
use App\Models\Sigtap\Cid;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use App\Utils\NumericUtil;
use DateTime;
class AtestadoAcompanhanteController extends Controller
{
private const TITLE = 'Atestado Acompanhante';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.atestado-acompanhante';
public static function getTemplate($atendimentoId = null)
{
if ($atendimentoId) {
$atendimentoMedico = AtendimentoMedico::orderByDesc('created_at')
->where('atendimento_id', $atendimentoId)
->has('atestado')
->firstOrFail();
$recepcao = Recepcao::orderByDesc('atendido_em')
->where('atendimento_id', $atendimentoId)
->firstOrFail();
$atestado = $atendimentoMedico->atestado;
$paciente = $atendimentoMedico->atendimento->faa->paciente;
$atendido_em = new DateTime($recepcao->atendido_em);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'cpf' => MaskUtil::getDocumentMasked(1, $paciente->cidadao->cpf),
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
],
'nomeAcompanhante' => $atestado->nome_acompanhante,
'documento' => [
'tipo' => $atestado->documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($atestado->documento_tipo_id, $atestado->documento_numero),
],
'unidade' => [
'nome' => $atestado->updatedLotacao->infraestrutura->unidade->nome_fantasia,
],
'data' => $atendido_em->format('d/m/Y'),
'hora' => $atendido_em->format('H:i:s'),
'cid' => $atestado->imprime_cid ? $atendimentoMedico->cid->cid->codigo : '',
'afastamento_texto' => self::getAfastamentoTexto(
$atestado->modelo_id ?? AtestadoModelo::PADRAO,
$atestado->dias,
$atestado->quantidade_horas,
$atestado->horario_inicial,
),
'profissional' => [
'nome' => $atestado->updatedLotacao->usuario->cidadao->nome,
'cbo' => $atestado->updatedLotacao->ocupacao->nome,
]
];
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$documentoTipo = DocumentoTipo::findOrFail(request()->documento_tipo_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$atendido_em = new DateTime(request()->atendido_em);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'cpf' => MaskUtil::getDocumentMasked(1, $paciente->cidadao->cpf),
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
],
'nomeAcompanhante' => request()->nome,
'documento' => [
'tipo' => $documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($documentoTipo->id, request()->documento_numero),
],
'unidade' => [
'nome' => $lotacao->infraestrutura->unidade->nome_fantasia,
],
'data' => $atendido_em->format('d/m/Y'),
'hora' => $atendido_em->format('H:i:s'),
'cid' => DataUtil::isStringTrue(request()->imprime_cid) && request()->cid_id
? Cid::findOrFail(request()->cid_id)->codigo : '',
'afastamento_texto' => self::getAfastamentoTexto(
request()->modelo_id ?? AtestadoModelo::PADRAO,
request()->dias,
request()->quantidade_horas,
request()->horario_inicial,
),
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
]
];
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function getAfastamentoTexto($modeloId, $dias, $quantidadeHoras, $horarioInicial)
{
switch ((int) $modeloId) {
case AtestadoModelo::PERIODO_MANHA:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da manha.';
case AtestadoModelo::PERIODO_TARDE:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da tarde.';
case AtestadoModelo::PERIODO_NOITE:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da noite.';
case AtestadoModelo::QUANTIDADE_HORAS:
if (is_null($quantidadeHoras) || is_null($horarioInicial)) {
return '';
}
$horario = (new DateTime($horarioInicial))->format('H:i');
$horasPorExtenso = NumericUtil::getPorExtenso($quantidadeHoras);
return "Em decorrencia, devera permanecer em afastamento de suas atividades laborativas por um periodo de {$quantidadeHoras} ({$horasPorExtenso}) hora(s), a partir das {$horario} hora(s).";
default:
if (is_null($dias)) {
return '';
}
$diasPorExtenso = NumericUtil::getPorExtenso($dias);
$sufixoDia = (int) $dias > 1 ? 's' : '';
return "Em decorrencia, devera permanecer em afastamento de suas atividades laborativas por um periodo de {$dias} ({$diasPorExtenso}) dia{$sufixoDia} a partir desta data.";
}
}
public function __invoke($atendimentoId = null)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'atestado');
}
}