196 lines
9.4 KiB
PHP
196 lines
9.4 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 ReceitaEspecialController extends Controller
|
|
{
|
|
private const TITLE = 'Receituário controle especial';
|
|
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;
|
|
|
|
$tiposEpeciais = collect([
|
|
TipoReceita::ESPECIAL,
|
|
TipoReceita::ESPECIAL_AMARELA,
|
|
TipoReceita::ESPECIAL_AZUL
|
|
]);
|
|
|
|
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' => true,
|
|
'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,
|
|
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? null,
|
|
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
|
|
],
|
|
'dataCadastro' => [
|
|
'porExtenso' => $receita->created_at->translatedFormat('d \de F \de Y'),
|
|
],
|
|
'medicamentos' => [],
|
|
];
|
|
|
|
$medicamentos = $receita->medicamentos
|
|
->whereIn('medicamento.receita_tipo_id', $tiposEpeciais->toArray());
|
|
|
|
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 ?? ''
|
|
];
|
|
}
|
|
}
|
|
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' => true,
|
|
'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,
|
|
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? null,
|
|
'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 || !$tiposEpeciais->contains($medicamento->medicamento->receita_tipo_id)) {
|
|
|
|
continue;
|
|
}
|
|
|
|
$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 ?? ''
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
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-especial');
|
|
}
|
|
}
|