init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,152 @@
<?php
namespace App\Services\ProntoAtendimento;
use App\Enums\Sigtap\Procedimento as ProcedimentoEnum;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Models\ProntoAtendimento\Atendimento\Observacao\PacienteObservacao;
use App\Models\ProntoAtendimento\Atendimento\Procedimento;
use App\Models\Sigtap\Procedimento as SigtapProcedimento;
use App\Services\Sigtap\ProcedimentoValidationService;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class ProcedimentoObservacaoService
{
private $lotacao;
private $atendimentoMedico;
public function __construct(Lotacao $lotacao, AtendimentoMedico $atendimentoMedico)
{
$this->lotacao = clone $lotacao;
$this->atendimentoMedico = clone $atendimentoMedico;
}
public function save() : void
{
$primeiroAtendimentoObservacao = $this->getPrimeiroAtendimentoObservacao();
if (is_null($primeiroAtendimentoObservacao)) {
return;
}
$procedimentosLancados = $this->getProcedimentosLancados();
$tempoAtendimento = $this->getTempoAtendimentoEmHoras($primeiroAtendimentoObservacao);
$procedimentos = $this->getProcedimentos($primeiroAtendimentoObservacao->created_at, $tempoAtendimento);
for ($i = 0; $i < $procedimentos->count(); $i++) {
$procedimento = $procedimentos->slice($i, 1)->first();
$procedimentoLancado = $procedimentosLancados->slice($i, 1)->first();
if (!is_null($procedimentoLancado)) {
if ($procedimento->procedimento->codigo == $procedimentoLancado->codigo) {
continue;
}
else {
Procedimento::destroy($procedimentoLancado->id);
}
}
$validation = new ProcedimentoValidationService($procedimento->procedimento);
if ($validation->isOcupacaoValid($this->lotacao->ocupacao)) {
$this->atendimentoMedico->procedimentos()->save($procedimento);
}
}
}
private function getPrimeiroAtendimentoObservacao() : ?PacienteObservacao
{
return $this->atendimentoMedico->atendimento->pacienteObservacoes()
->orderBy('created_at')
->first();
}
private function getProcedimentosLancados() : Collection
{
return DB::table('pronto_atendimento_atendimento_procedimento AS procedimento')
->join(
'sigtap.procedimento AS sigtap_procedimento',
'sigtap_procedimento.id',
'procedimento.procedimento_id'
)
->whereNull('procedimento.deleted_at')
->where('procedimento.atendimento_id', $this->atendimentoMedico->atendimento->id)
->whereIn('sigtap_procedimento.codigo', [
ProcedimentoEnum::ATEND_URG_ATENCAO_PRIMARIA_OBS_ATE_8_HORAS,
ProcedimentoEnum::ATEND_URG_OBS_ATE_24_HORAS_ATENCAO_ESPECIALIZADA
])
->select(
'procedimento.id',
'sigtap_procedimento.codigo',
)
->get();
}
private function getTempoAtendimentoEmHoras(PacienteObservacao $primeiroAtendimentoObservacao) : float
{
return Carbon::now()->floatDiffInHours($primeiroAtendimentoObservacao->created_at);
}
private function getProcedimentos(
Carbon $dataAtendimento,
float $tempoAtendimento,
Collection $procedimentos = null
) : Collection {
if (is_null($procedimentos)) {
$procedimentos = new Collection();
}
if ($tempoAtendimento > 24) {
$procedimentos->push($this->getProcedimento(
$this->getProcedimentoSigtapDeVinteQuatroHoras(),
$dataAtendimento
));
$tempoAtendimento -= 24;
$dataAtendimento = $dataAtendimento->copy()->addHours(24);
return $this->getProcedimentos($dataAtendimento, $tempoAtendimento, $procedimentos);
}
return $procedimentos;
}
private function getProcedimento(SigtapProcedimento $procedimento, Carbon $dataAtendimento) : Procedimento
{
return new Procedimento([
'atendimento_id' => $this->atendimentoMedico->atendimento->id,
'lotacao_id' => $this->lotacao->id,
'procedimento_id' => $procedimento->id,
'realizado_em' => $dataAtendimento,
'quantidade' => 1,
]);
}
private function getProcedimentoSigtapDeOitoHoras() : SigtapProcedimento
{
return SigtapProcedimento::where(
'codigo',
ProcedimentoEnum::ATEND_URG_ATENCAO_PRIMARIA_OBS_ATE_8_HORAS
)->orderByDesc('competencia_id')->firstOrFail();
}
private function getProcedimentoSigtapDeVinteQuatroHoras() : SigtapProcedimento
{
return SigtapProcedimento::where(
'codigo',
ProcedimentoEnum::ATEND_URG_OBS_ATE_24_HORAS_ATENCAO_ESPECIALIZADA
)->orderByDesc('competencia_id')->firstOrFail();
}
}