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

239 lines
12 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\TipoRegistroUsuario;
use App\Http\Controllers\Controller;
use App\Models\Ambulatorio\Atendimento;
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;
class ReceitaMedicaNaoPadronizadaEspecialController extends Controller
{
private const TITLE = 'RECEITUÁRIO ESPECIAL';
private const TEMPLATE = 'ambulatorio.receita-medica-nao-padronizada-especial';
public static function getTemplate($atendimentoId, $dados = [])
{
$receitas = collect();
if (request()->has('em_atendimento') && request()->em_atendimento == true) {
self::setReceitasNaoSalvas($atendimentoId, $receitas);
$data = [
'exibirAssinatura' => true,
'receitas' => $receitas
];
AtendimentoService::saveLogImpressao(request()->atendimento_id, AtendimentoImpressaoTipo::RECEITA_NAO_PADRONIZADA_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 setReceitasNaoSalvas($pacienteId, $receitas)
{
$currentLotacao = self::getCurrentLotacao();
$paciente = Paciente::where('id', $pacienteId)->first();
$medicamentos = [];
if (request()->has('multiple') && request()->multiple == true) {
foreach (request()->medicamentos as $solicitacao) {
$medicamentos[] = [
'is_imprimir_separado' => isset($solicitacao['is_imprimir_separado']) && $solicitacao['is_imprimir_separado'] === 'true' ? true : false,
'recomendacoes' => $solicitacao['recomendacoes'] ?? '',
'descricao' => $solicitacao['descricao'] ?? '',
];
}
} else {
$medicamentos[] = [
'is_imprimir_separado' => isset($solicitacao['is_imprimir_separado']) && $solicitacao['is_imprimir_separado'] === 'true' ? true : false,
'recomendacoes' => request()->recomendacoes ?? '',
'descricao' => request()->descricao ?? ''
];
}
$dadosPrincipais = [
'isEspecial' => true,
'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',
],
'unidade' => [
'nome_fantasia' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'cnpj' => $currentLotacao->infraestrutura->unidade->cnpj
? MaskUtil::getCnpjMasked($currentLotacao->infraestrutura->unidade->cnpj)
: null,
'endereco' => $currentLotacao->infraestrutura->endereco->completo
. (isset($currentLotacao->infraestrutura->endereco->logradouro->cep)
? (' - ' . MaskUtil::getCepMasked($currentLotacao->infraestrutura->endereco->logradouro->cep))
: ''),
'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' => isset($paciente->cidadao->domicilio->endereco->completo)
? $paciente->cidadao->domicilio->endereco->completo
. (isset($paciente->cidadao->domicilio->endereco->logradouro->cep)
? (' - ' . MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep))
: '')
: '-',
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
'cns' => $paciente->cidadao->cns,
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null,
'prontuario' => $paciente->prontuario,
],
'dataCadastro' => [
'porExtenso' => Carbon::now()->translatedFormat('d \de F \de Y'),
],
];
$medicamentosAgrupados = collect($medicamentos)->where('is_imprimir_separado', false);
if ($medicamentosAgrupados->isNotEmpty()) {
$receitas->push(array_merge($dadosPrincipais, [
'medicamentos' => $medicamentosAgrupados->all()
]));
}
$medicamentosSeparados = collect($medicamentos)->where('is_imprimir_separado', true);
if ($medicamentosSeparados->isNotEmpty()) {
$medicamentosSeparados->each(function ($medicamento) use ($receitas, $dadosPrincipais) {
$receitas->push(array_merge($dadosPrincipais, [
'medicamentos' => [$medicamento]
]));
});
}
}
public static function getAtendimento($atendimentoId, $receitas, $dados = [])
{
$atendimento = Atendimento::findOrFail($atendimentoId);
$paciente = $atendimento->paciente;
$atendimento->soaps()->where('is_rascunho', false)->get()->each(fn ($soap) => $soap->prescricoesMedicamentos
->each(function ($prescricaoMedicamento) use ($receitas, $paciente, $dados) {
$dadosPrincipais = [
'isEspecial' => true,
'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',
],
'unidade' => [
'nome_fantasia' => $prescricaoMedicamento->createdLotacao->infraestrutura->unidade->nome_fantasia,
'cnpj' => $prescricaoMedicamento->createdLotacao->infraestrutura->unidade->cnpj
? MaskUtil::getCnpjMasked($prescricaoMedicamento->createdLotacao->infraestrutura->unidade->cnpj)
: null,
'endereco' => $prescricaoMedicamento->createdLotacao->infraestrutura->endereco->completo
. (isset($prescricaoMedicamento->createdLotacao->infraestrutura->endereco->logradouro->cep)
? (' - ' . MaskUtil::getCepMasked($prescricaoMedicamento->createdLotacao->infraestrutura->endereco->logradouro->cep))
: ''),
'telefone' => MaskUtil::getPhoneMasked($prescricaoMedicamento->createdLotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => isset($paciente->cidadao->domicilio->endereco->completo)
? $paciente->cidadao->domicilio->endereco->completo
. (isset($paciente->cidadao->domicilio->endereco->logradouro->cep)
? (' - ' . MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep))
: '')
: '-',
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null,
'prontuario' => $paciente->prontuario,
],
'dataCadastro' => [
'porExtenso' => $prescricaoMedicamento->created_at->translatedFormat('d \de F \de Y'),
],
];
$itens = $prescricaoMedicamento->itens
->whereNull('material_id')
->where('receita_tipo_id', TipoReceita::ESPECIAL)
->when(isset($dados['medicamentos']), fn ($q) => $q->filter(fn ($m) => collect($dados['medicamentos'])->contains($m->id)));
$itensAgrupados = $itens->where('is_imprimir_separado', false);
if ($itensAgrupados->isNotEmpty()) {
$receitas->push(array_merge($dadosPrincipais, [
'medicamentos' => $itensAgrupados->map(fn ($item) => [
'recomendacoes' => $item->recomendacoes ?? '',
'descricao' => $item->descricao ?? ''
])
]));
}
$itensSeparados = $itens->where('is_imprimir_separado', true);
if ($itensSeparados->isNotEmpty()) {
$itensSeparados->each(function ($item) use ($receitas, $dadosPrincipais) {
$receitas->push(array_merge($dadosPrincipais, [
'medicamentos' => collect([
[
'recomendacoes' => $item->recomendacoes ?? '',
'descricao' => $item->descricao ?? ''
]
])
]));
});
}
})
);
}
public function __invoke($atendimentoId, $output = null, $dados = [])
{
$pdf = new Pdf();
$pdf->setPaper('A4', 'landscape');
return $output
? $pdf->output(self::getTemplate($atendimentoId, $dados))
: $pdf->stream(self::getTemplate($atendimentoId, $dados));
}
}