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