baseSmsService = new BaseSmsService(); $this->agendamento = Agendamento::findOrFail($agendamentoId); $this->parametrizacao = ParametrizacaoInfraestrutura::where( 'infraestrutura_id', $this->agendamento->jornada->lotacao->infraestrutura_id )->first(); } public function send() { if ($this->agendamento->jornada->data->isToday()) { return; } $cellPhone = $this->getCellPhone(); if (is_null($cellPhone)) { return; } if (!$this->parametrizacao->envia_sms || ($this->parametrizacao->envia_sms && is_null($this->parametrizacao->sms))) { return; } $schedule = $this->getSchedule(); if (!$this->isAllowedToSend($schedule)) { return; } try { $smsEnvio = $this->baseSmsService->send($cellPhone, $this->getMessage(), $schedule); $this->agendamento->sms_envio_id = $smsEnvio->id; $this->agendamento->save(); } catch (RuntimeException $e) {} } private function isAllowedToSend($schedule) { if (is_null($schedule)) { $schedule = Carbon::now(); } $envioDe = $this->parametrizacao->sms->envio_de->startOfDay(); $envioAte = $this->parametrizacao->sms->envio_ate->endOfDay(); if ($schedule >= $envioDe && $schedule <= $envioAte) { return $this->parametrizacao->sms->especialidades->pluck('id') ->contains($this->agendamento->jornada->especialidade_id); } return false; } private function getCellPhone() { return $this->agendamento->paciente->cidadao->telefones() ->where('autoriza_sms', true) ->first()->numero ?? null; } private function getMessage() { $nomePaciente = $this->agendamento->paciente->cidadao->nome; $agendamentoTipo = Str::lower($this->agendamento->tipo->nome); $especialidade = $this->agendamento->jornada->especialidade->nome; $data = $this->agendamento->jornada->data->format('d/m/Y'); $diaSemana = DiaSemana::findOrFail($this->agendamento->jornada->dia_semana)->descricao; $horario = $this->agendamento->horario->format('H:i'); $unidade = $this->agendamento->jornada->lotacao->infraestrutura->unidade->nome_fantasia; $infraestrutura = $this->agendamento->jornada->lotacao->infraestrutura->nome; $usuario = $this->agendamento->jornada->lotacao->usuario->cidadao->nome; $telefone = MaskUtil::getPhoneMasked( $this->agendamento->jornada->lotacao->infraestrutura->telefone ); $pronomeAgendamentoTipo = $this->agendamento->tipo_id === AgendamentoTipo::CONSULTA ? 'sua' : 'seu'; $unidade .= $infraestrutura === $unidade ? '' : " ({$infraestrutura})"; return "Sr(a) {$nomePaciente}, {$pronomeAgendamentoTipo} {$agendamentoTipo} para a especialidade" . " {$especialidade} está agendada para {$data} ({$diaSemana}) às {$horario} na unidade {$unidade} com" . " o profissional {$usuario}. Caso não possa comparecer, entrar em contato no telefone {$telefone}"; } private function getSchedule() { $schedule = $this->agendamento->jornada->data->copy()->subDays($this->parametrizacao->sms->dia_antecedencia); if ($schedule <= Carbon::today()) { return null; } return $schedule; } public function cancel() { if (is_null($this->agendamento->sms_envio_id)) { return; } try { $this->baseSmsService->cancel($this->agendamento->sms_envio_id); } catch (RuntimeException $e) {} } }