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

228 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\Medicamento\TipoReceita;
use App\Enums\Cadastro\Medicamento\ViaAdministracao;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\SujeitoAtencao\TipoRegistroUsuario;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\ProntoAtendimento\Atendimento\Medico\Receita;
use App\Models\ProntoAtendimento\Atendimento\Medico\ReceitaMedicamento;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class ReceitaController extends Controller
{
private const TITLE = 'Receita médica';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.receita-medica';
public static function getTemplate($atendimentoId = null, $params = [])
{
$receitasIds = $params['receitas_ids'] ?? [];
$params['para_assinatura_eletronica'] = $params['para_assinatura_eletronica'] ?? false;
$paraAssinaturaEletronica = $params['para_assinatura_eletronica'] === true
|| (DataUtil::isStringBoolean($params['para_assinatura_eletronica'])
&& DataUtil::isStringTrue($params['para_assinatura_eletronica']));
$receitas = $atendimentoId
? Receita::orderByDesc('created_at')
->whereHas('medicamentos')
->whereHas('atendimentoMedico', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->when(!empty($receitasIds), fn ($q) => $q->whereIn('id', $receitasIds))
->get()
: request()->receitas;
$data['receitas'] = [];
$data['exibirAssinatura'] = !$paraAssinaturaEletronica;
foreach ($receitas as $key => $receita) {
if ((is_array($receita) && is_numeric($receita['id'] ?? null))
|| $receita instanceof Receita
) {
if (!($receita instanceof Receita)) {
$receita = Receita::findOrFail($receita['id']);
}
$paciente = $receita->atendimentoMedico->atendimento->faa->paciente;
$enderecoPaciente = $paciente->cidadao->domicilio
? "{$paciente->cidadao->domicilio->endereco->completo} - "
. MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep)
: '';
$data['receitas'][$key] = [
'isEspecial' => false,
'profissional' => [
'nome' => $receita->updatedLotacao->usuario->cidadao->nome,
'cbo' => $receita->updatedLotacao->ocupacao->nome,
'documento' => $receita->updatedLotacao->usuario->registro_tipo_id
? ($receita->updatedLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $receita->updatedLotacao->usuario->registro_tipo_outro
: $receita->updatedLotacao->usuario->registroTipo->sigla
) . ": {$receita->updatedLotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'unidade' => [
'endereco' => $receita->updatedLotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($receita->updatedLotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $enderecoPaciente,
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
],
'dataCadastro' => [
'porExtenso' => $receita->created_at->translatedFormat('d \de F \de Y'),
],
'medicamentos' => [],
];
$medicamentos = $receita->medicamentos->where('medicamento.receita_tipo_id', TipoReceita::COMUM);
foreach ($medicamentos as $medicamento) {
$data['receitas'][$key]['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => $medicamento->medicamento->via_administracao_id === ViaAdministracao::OUTRAS
? $medicamento->via_administracao_outras
: $medicamento->medicamento->viaAdministracao->nome,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? ''
];
}
$medicamentosManuais = $receita->medicamentos->whereNotNull('medicamento_manual');
foreach ($medicamentosManuais as $medicamentoManual) {
$data['receitas'][$key]['medicamentos'][] = [
'medicamento_manual' => $medicamentoManual->medicamento_manual,
'usoContinuo' => $medicamentoManual->uso_continuo,
'doseUnica' => $medicamentoManual->dose_unica,
'livre' => $medicamentoManual->livre,
'viaAdministracao' => null,
'posologia' => $medicamentoManual->livre ? $medicamentoManual->descricao : $medicamentoManual->posologia,
'recomendacoes' => $medicamentoManual->recomendacoes ?? '',
'descricao' => $medicamentoManual->descricao ?? ''
];
}
$prescricoesManuais = $receita->medicamentos->whereNotNull('prescricao_manual');
foreach ($prescricoesManuais as $prescricaoManual) {
$data['receitas'][$key]['medicamentos'][] = [
'prescricao_manual' => $prescricaoManual->prescricao_manual,
];
}
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$enderecoPaciente = $paciente->cidadao->domicilio
? "{$paciente->cidadao->domicilio->endereco->completo} - "
. MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep)
: '';
$data['receitas'][$key] = [
'isEspecial' => false,
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
'documento' => $lotacao->usuario->registro_tipo_id
? ($lotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $lotacao->usuario->registro_tipo_outro
: $lotacao->usuario->registroTipo->sigla
) . ": {$lotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'unidade' => [
'endereco' => $lotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($lotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $enderecoPaciente,
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
],
'dataCadastro' => [
'porExtenso' => Carbon::now()->translatedFormat('d \de F \de Y'),
],
'medicamentos' => [],
];
foreach ($receita['medicamentos'] as $medicamento) {
$medicamento = new ReceitaMedicamento($medicamento);
if ($medicamento->medicamento && $medicamento->medicamento->receita_tipo_id === TipoReceita::COMUM) {
$data['receitas'][$key]['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => $medicamento->medicamento->via_administracao_id === ViaAdministracao::OUTRAS
? $medicamento->via_administracao_outras
: $medicamento->medicamento->viaAdministracao->nome,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? ''
];
}
if ($medicamento->medicamento_manual) {
$data['receitas'][$key]['medicamentos'][] = [
'medicamento_manual' => $medicamento->medicamento_manual,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => null,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? '',
];
}
if ($medicamento->prescricao_manual) {
$data['receitas'][$key]['medicamentos'][] = [
'prescricao_manual' => $medicamento->prescricao_manual,
];
}
}
}
}
return Template::make(self::TITLE, self::TEMPLATE, true)->withData($data)->getHtml();
}
public function __invoke($atendimentoId = null)
{
$pdf = new Pdf();
$pdf->setPaper('A4', 'landscape');
return $pdf->stream(self::getTemplate($atendimentoId, request()->all()), 'receita-medica');
}
}