153 lines
5.1 KiB
PHP
153 lines
5.1 KiB
PHP
<?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();
|
|
}
|
|
}
|