This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user