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)); } }