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

397 lines
20 KiB
PHP

<?php
namespace App\Http\Controllers\Impressao\Ambulatorio;
use App\Enums\Ambulatorio\AtendimentoImpressaoTipo;
use App\Enums\Cadastro\Medicamento\TipoReceita;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
use App\Enums\Cadastro\SujeitoAtencao\TipoRegistroUsuario;
use App\Enums\Geral\MedidaTempo;
use App\Http\Controllers\Controller;
use App\Models\Ambulatorio\Atendimento;
use App\Models\Ambulatorio\AtendimentoSoapPrescricaoMedicamentoItem;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Services\Ambulatorio\AtendimentoService;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class LaudoMedicamentosController extends Controller
{
private const TITLE = 'Laudo de Medicamentos (LME)';
private const TEMPLATE = 'ambulatorio.laudo-medicamentos';
public static function getTemplate($atendimentoId, $dados = [])
{
$receitas = collect();
if (request()->has('em_atendimento') && request()->em_atendimento == true) {
$receitas[] = self::getReceitasNaoSalvas($atendimentoId);
$data = [
'exibirAssinatura' => true,
'receitas' => $receitas
];
AtendimentoService::saveLogImpressao(request()->atendimento_id, AtendimentoImpressaoTipo::RECEITA_ESPECIAL);
} else {
self::getAtendimento($atendimentoId, $receitas, $dados);
$paraAssinaturaEletronica = request()->para_assinatura_eletronica === true
|| (DataUtil::isStringBoolean(request()->para_assinatura_eletronica)
&& DataUtil::isStringTrue(request()->para_assinatura_eletronica));
$data = [
'exibirAssinatura' => !$paraAssinaturaEletronica,
'receitas' => $receitas->filter(fn ($r) => $r['medicamentos']->count() > 0)->values()->all()
];
}
return Template::make(self::TITLE, self::TEMPLATE, true)->withData($data)->getHtml();
}
public static function getReceitasNaoSalvas($pacienteId) {
if (request()->has('is_duplicated') && request()->is_duplicated == true) {
$medicamentos = request()->medicamentos;
$item = AtendimentoSoapPrescricaoMedicamentoItem::whereHas('prescricaoMedicamento', function ($query) {
$query
->whereHas('soap', function ($query) {
$query->where('atendimento_id', request()->atendimento_id);
});
})
->where('ambulatorio_atendimento_soap_prescricao_medicamento_item.id', $medicamentos[0]['id'])
->first();
$currentLotacao = Lotacao::findOrFail($item->lotacao->id);
$createdAt = $item->created_at;
} else {
$currentLotacao = self::getCurrentLotacao();
}
$paciente = Paciente::where('id', $pacienteId)->first();
$medicamentos = [];
if (request()->has('multiple') && request()->multiple == true) {
foreach (request()->medicamentos as $solicitacao) {
$medicamentos[] = [
'id' => uniqid(),
'nome' => $solicitacao['material']['descricao'],
'usoContinuo' => $solicitacao['is_uso_continuo'] == 'true' ? true : false,
'imprimirSeparado' => isset($solicitacao['is_imprimir_separado']) && $solicitacao['is_imprimir_separado'] == 'true' ? true : false,
'removerImpressao' => isset($solicitacao['is_remover_impressao']) && $solicitacao['is_remover_impressao'] == 'true' ? true : false,
'doseUnica' => $solicitacao['is_dose_unica'] == 'true' ? true : false,
'livre' => isset($solicitacao['descricao']) && !is_null($solicitacao['descricao']),
'viaAdministracao' => $solicitacao['material']['via_administracao'] ?? '-',
'posologia' => isset($solicitacao['descricao']) && !is_null($solicitacao['descricao']) ? $solicitacao['descricao'] : (isset($solicitacao['posologia']) ? $solicitacao['posologia'] : null),
'duracao' => !is_null($solicitacao['duracao']) ? $solicitacao['duracao'] : '',
'duracaoMedida' => !is_null($solicitacao['duracao_medida_tempo_id'])
? ($solicitacao['duracao_medida_tempo_id'] == 3 ? 'Dia(s)' : ($solicitacao['duracao_medida_tempo_id'] == 4 ? 'Semana(s)' : ($solicitacao['duracao_medida_tempo_id'] == 5 ? 'Mês(es)' : ''))) : '',
'recomendacoes' => $solicitacao['recomendacoes'] ?? '',
'descricao' => isset($solicitacao['descricao']) && $solicitacao['descricao'] ? $solicitacao['descricao'] : '',
'quantidade' => self::calcularUso($solicitacao)
];
}
} else {
$medicamentos[] = [
'id' => uniqid(),
'nome' => request()->material['descricao'],
'usoContinuo' => request()->is_uso_continuo == 'true' ? true : false,
'imprimirSeparado' => isset(request()->is_imprimir_separado) && request()->is_imprimir_separado == 'true' ? true : false,
'removerImpressao' => isset(request()->is_remover_impressao) && request()->is_remover_impressao == 'true' ? true : false,
'doseUnica' => request()->is_dose_unica == 'true' ? true : false,
'livre' => isset(request()->descricao) && !is_null(request()->descricao),
'viaAdministracao' => request()->material['via_administracao'] ?? '-',
'posologia' => isset(request()->descricao) && !is_null(request()->descricao) ? request()->descricao : (isset(request()->posologia) ? request()->posologia : null),
'duracao' => !is_null(request()->duracao) ? request()->duracao : '',
'duracaoMedida' => !is_null(request()->duracao_medida_tempo_id)
? (request()->duracao_medida_tempo_id == 3 ? 'Dia(s)' : (request()->duracao_medida_tempo_id == 4 ? 'Semana(s)' : (request()->duracao_medida_tempo_id == 5 ? 'Mês(es)' : ''))) : '',
'recomendacoes' => request()->recomendacoes ?? '',
'descricao' => isset($solicitacao['descricao']) && $solicitacao['descricao'] ? $solicitacao['descricao'] : ''
];
}
$medicamentos = collect($medicamentos)->sortBy('usoContinuo')->values();
$celular = $paciente->cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
return [
'isEspecial' => true,
'cid' => request()->cid ?? null,
'diagnostico' => request()->diagnostico ? trim(preg_replace('/\s+/', ' ', strip_tags(request()->diagnostico))) : null,
'anamnese' => request()->anamnese ? trim(preg_replace('/\s+/', ' ', strip_tags(request()->anamnese))) : null,
'tratamento_previo' => [
'status' => request()->tratamento_previo['status'],
'relatar' => request()->tratamento_previo['relatar']
],
'profissional' => [
'nome' => $currentLotacao->usuario->cidadao->nome,
'cbo' => $currentLotacao->ocupacao->nome,
'documento' => $currentLotacao->usuario->registro_tipo_id
? ($currentLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $currentLotacao->usuario->registro_tipo_outro
: $currentLotacao->usuario->registroTipo->sigla
) . ": {$currentLotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
'cns' => $currentLotacao->usuario->cidadao->cns,
],
'unidade' => [
'cnes' => $currentLotacao->infraestrutura->unidade->cnes,
'nome' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'endereco' => $currentLotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($currentLotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $paciente->cidadao->domicilio->endereco->completo ?? '-',
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
'celular' => $celular ? MaskUtil::getPhoneMasked($celular) : null,
'cns' => $paciente->cidadao->cns ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : null,
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null,
'email' => $paciente->email ?? null,
'nome_mae' => $paciente->cidadao->nome_mae ? $paciente->cidadao->nome_mae : null,
'is_raca_cor_branca' =>$paciente->cidadao->raca_cor_id === RacaCor::BRANCA,
'is_raca_cor_preta' =>$paciente->cidadao->raca_cor_id === RacaCor::NEGRA,
'is_raca_cor_parda' =>$paciente->cidadao->raca_cor_id === RacaCor::PARDA,
'is_raca_cor_amarela' =>$paciente->cidadao->raca_cor_id === RacaCor::AMARELA,
'is_raca_cor_indigena' =>$paciente->cidadao->raca_cor_id === RacaCor::INDIGENA,
'etnia_indigena' => Str::substr($paciente->cidadao->etniaIndigena->descricao ?? '', 0, 20),
'peso' => str_replace('.', ',' ,request()->peso),
'altura' => request()->altura,
],
'dataCadastro' => [
'porExtenso' => request()->has('is_duplicated') && request()->is_duplicated == true
? Carbon::parse($createdAt)->translatedFormat('d \de F \de Y')
: Carbon::now()->translatedFormat('d \de F \de Y'),
'data' => request()->has('is_duplicated') && request()->is_duplicated == true
? Carbon::parse($createdAt)->translatedFormat('d/m/Y')
: Carbon::now()->translatedFormat('d/m/Y'),
],
'medicamentos' => $medicamentos,
];
}
private static function calcularUso($medicamento)
{
$duracaoMedidaTempoId = $medicamento['duracao_medida_tempo_id'] ?? null;
$intervaloMedidaTempoId = $medicamento['intervalo_medida_tempo_id'] ?? null;
$duracao = isset($medicamento['duracao']) ? (float) $medicamento['duracao'] : 0;
$intervalo = isset($medicamento['intervalo']) ? (float) $medicamento['intervalo'] : 1;
$frequenciaVezes = isset($medicamento['frequencia_vezes']) ? (int) $medicamento['frequencia_vezes'] : 1;
$dose = isset($medicamento['dose']) ? (float) $medicamento['dose'] : 1;
$materialQuantidade = isset($medicamento['material']['quantidade']) ? (float) $medicamento['material']['quantidade'] : 1;
if ($duracaoMedidaTempoId == MedidaTempo::SEMANAS) {
$duracaoDias = $duracao * 7;
} elseif ($duracaoMedidaTempoId == MedidaTempo::MESES) {
$duracaoDias = $duracao * 30;
} elseif ($duracaoMedidaTempoId == MedidaTempo::ANOS) {
$duracaoDias = $duracao * 365;
} else {
$duracaoDias = $duracao; // padrão: dias
}
if ($intervaloMedidaTempoId == MedidaTempo::SEMANAS) {
$intervaloDias = $intervalo * 7;
} elseif ($intervaloMedidaTempoId == MedidaTempo::MESES) {
$intervaloDias = $intervalo * 30;
} elseif ($intervaloMedidaTempoId == MedidaTempo::ANOS) {
$intervaloDias = $intervalo * 365;
} else {
$intervaloDias = $intervalo;
}
if ($intervaloDias <= 0) {
$intervaloDias = 1;
}
$totalDoses = ceil($duracaoDias / $intervaloDias) * $frequenciaVezes * $dose;
$duracaoMeses = round($duracaoDias / 30, 2);
$mesesCompletos = floor($duracaoDias / 30);
$diasRestantes = $duracaoDias - ($mesesCompletos * 30);
$usoPorMes = [];
for ($i = 1; $i <= $mesesCompletos; $i++) {
$usoPorMes["mes_{$i}"] = ceil(30 / $intervaloDias) * $frequenciaVezes * $dose;
}
if ($diasRestantes > 0) {
$usoPorMes["mes_" . ($mesesCompletos + 1)] = ceil($diasRestantes / $intervaloDias) * $frequenciaVezes * $dose / $materialQuantidade;
}
return [
'total_doses' => $totalDoses,
'duracao_meses' => $duracaoMeses,
'uso_por_mes' => $usoPorMes,
];
}
private static function getAtendimentoProblemasCondicoes($soap)
{
$problemasCondicoes = $soap->problemasCondicoes()
->with([
'cid:id,codigo,nome',
])
->first([
'cid_id',
]);
return $problemasCondicoes['cid']['codigo'];
}
public static function getAtendimento($atendimentoId, $receitas, $dados = []) {
$atendimento = Atendimento::findOrFail($atendimentoId);
$paciente = $atendimento->paciente;
$celular = $paciente->cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
$atendimento->soaps()->where('is_rascunho', false)->get()
->filter(fn ($soap) => self::requiredFieldAtendimento($soap))
->each(fn ($soap) => $soap->prescricoesMedicamentos->each(fn ($prescricaoMedicamento) => $receitas
->push([
'isEspecial' => true,
'diagnostico' => $soap->prescricoesMedicamentos->first()->diagnostico,
'anamnese' => $soap->prescricoesMedicamentos->first()->anamnese,
'tratamento_previo' => [
'status' => $soap->prescricoesMedicamentos->first()->tratamento_previo_status,
'relatar' => $soap->prescricoesMedicamentos->first()->tratamento_previo_relatar,
],
'cid' => self::getAtendimentoProblemasCondicoes($soap),
'profissional' => [
'nome' => $prescricaoMedicamento->createdLotacao->usuario->cidadao->nome,
'cbo' => $prescricaoMedicamento->createdLotacao->ocupacao->nome,
'documento' => $prescricaoMedicamento->createdLotacao->usuario->registro_tipo_id
? ($prescricaoMedicamento->createdLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $prescricaoMedicamento->createdLotacao->usuario->registro_tipo_outro
: $prescricaoMedicamento->createdLotacao->usuario->registroTipo->sigla
) . ": {$prescricaoMedicamento->createdLotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
'cns' => $prescricaoMedicamento->createdLotacao->usuario->cidadao->cns,
],
'unidade' => [
'endereco' => $prescricaoMedicamento->createdLotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($prescricaoMedicamento->createdLotacao->infraestrutura->telefone),
'cnes' => $prescricaoMedicamento->createdLotacao->infraestrutura->unidade->cnes,
'nome' => $prescricaoMedicamento->createdLotacao->infraestrutura->unidade->nome_fantasia,
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $paciente->cidadao->domicilio->endereco->completo ?? '-',
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
'celular' => $celular ? MaskUtil::getPhoneMasked($celular) : null,
'cns' => $paciente->cidadao->cns ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : null,
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null,
'email' => $paciente->email ?? null,
'nome_mae' => $paciente->cidadao->nome_mae ? $paciente->cidadao->nome_mae : null,
'is_raca_cor_branca' =>$paciente->cidadao->raca_cor_id === RacaCor::BRANCA,
'is_raca_cor_preta' =>$paciente->cidadao->raca_cor_id === RacaCor::NEGRA,
'is_raca_cor_parda' =>$paciente->cidadao->raca_cor_id === RacaCor::PARDA,
'is_raca_cor_amarela' =>$paciente->cidadao->raca_cor_id === RacaCor::AMARELA,
'is_raca_cor_indigena' =>$paciente->cidadao->raca_cor_id === RacaCor::INDIGENA,
'etnia_indigena' => Str::substr($paciente->cidadao->etniaIndigena->descricao ?? '', 0, 20),
'peso' => str_replace('.', ',' , DB::table('ambulatorio_atendimento_antropometria')
->where('soap_id', $soap->id)
->value('peso')
),
'altura' => DB::table('ambulatorio_atendimento_antropometria')
->where('soap_id', $soap->id)
->value('altura'),
],
'dataCadastro' => [
'porExtenso' => $prescricaoMedicamento->created_at->translatedFormat('d \de F \de Y'),
'data' => Carbon::parse($prescricaoMedicamento->created_at)->translatedFormat('d/m/Y')
],
'medicamentos' => $prescricaoMedicamento->itens
->whereNotIn('material.receita_tipo_id', [
TipoReceita::COMUM
])
->when(isset($dados['medicamentos']), fn ($q) => $q->filter(fn ($m) => collect($dados['medicamentos'])->contains($m->id)))
->map(fn ($item) => [
'id' => $item->id,
'nome' => $item->material->descricao
?? ($item->descricao ?? ''),
'usoContinuo' => $item->is_uso_continuo,
'imprimirSeparado' => $item->is_imprimir_separado,
'removerImpressao' => $item->is_remover_impressao,
'doseUnica' => $item->is_dose_unica,
'livre' => !is_null($item->descricao),
'viaAdministracao' => $item->material->viaAdministracao->nome ?? '-',
'posologia' => !is_null($item->descricao) ? $item->descricao : $item->posologia,
'duracao' => !is_null($item->duracao) ? $item->duracao : '',
'duracaoMedida' => !is_null($item->duracao_medida_tempo_id) ? ($item->duracao_medida_tempo_id == 3 ? 'Dia(s)' : ($item->duracao_medida_tempo_id == 4 ? 'Semana(s)' : ($item->duracao_medida_tempo_id == 5 ? 'Mês(es)' : ''))) : '',
'recomendacoes' => $item->recomendacoes ?? '',
'descricao' => $item->descricao ?? '',
'quantidade' => self::calcularUso($item)
])
->sortBy('usoContinuo')
->values(),
])
));
}
private static function requiredFieldAtendimento($soap)
{
$peso = DB::table('ambulatorio_atendimento_antropometria')
->where('soap_id', $soap->id)
->value('peso');
$altura = DB::table('ambulatorio_atendimento_antropometria')
->where('soap_id', $soap->id)
->value('altura');
$diagnostico = $soap->avaliacao_descricao
? trim(preg_replace('/\s+/', ' ', strip_tags($soap->avaliacao_descricao)))
: null;
$cid = collect(self::getAtendimentoProblemasCondicoes($soap))->first();
if ($peso && $altura && $diagnostico && $cid) {
return true;
}
return false;
}
public function __invoke($atendimentoId, $output = null, $dados = [])
{
$pdf = new Pdf();
return $output
? $pdf->output(self::getTemplate($atendimentoId, $dados))
: $pdf->stream(self::getTemplate($atendimentoId, $dados));
}
}