This commit is contained in:
169
api/app/Services/Sms/SmsService.php
Normal file
169
api/app/Services/Sms/SmsService.php
Normal file
@@ -0,0 +1,169 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Sms;
|
||||
|
||||
use App\Models\Intranet\Cliente;
|
||||
use App\Models\Sms\SmsEnvio;
|
||||
use App\Services\Service;
|
||||
use App\Utils\StringUtil;
|
||||
use DateTime;
|
||||
use Illuminate\Support\Str;
|
||||
use RuntimeException;
|
||||
use Sms;
|
||||
use SmsFacade;
|
||||
use SmsResponse;
|
||||
use App\Enums\Intranet\Sistema;
|
||||
|
||||
class SmsService extends Service
|
||||
{
|
||||
private const URL = 'https://api-rest.zenvia.com';
|
||||
private const COUNTRY_PREFIX = '55';
|
||||
|
||||
private $cliente;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
require_once base_path() . '/app/Utils/Sms/autoload.php';
|
||||
|
||||
$query = Cliente::where('link', app('config')->get('database.default'))
|
||||
->where('sistema_id', SISTEMA::CONECTASUS);
|
||||
|
||||
$this->cliente = $query->firstOrFail();
|
||||
|
||||
}
|
||||
|
||||
public function send(string $to, string $message, DateTime $schedule = null, int $aggregateId = null)
|
||||
{
|
||||
$this->checkIfProduction();
|
||||
|
||||
$sms = $this->getNewSmsInstance($to, $message, $schedule);
|
||||
$response = $this->getFacade()->send($sms, $aggregateId);
|
||||
|
||||
return $this->saveEnvio($sms, $response, $aggregateId);
|
||||
}
|
||||
|
||||
public function sendMultiple(array $smsList, int $aggregateId = null)
|
||||
{
|
||||
$this->checkIfProduction();
|
||||
|
||||
$smsInstances = [];
|
||||
|
||||
foreach ($smsList as $sms)
|
||||
{
|
||||
$smsInstances[] = $this->getNewSmsInstance($sms->to, $sms->message, $sms->schedule ?? null);
|
||||
}
|
||||
|
||||
$response = $this->getFacade()->sendMultiple($smsInstances, $aggregateId);
|
||||
$envios = collect();
|
||||
|
||||
foreach ($response as $i => $responseItem) {
|
||||
|
||||
$envios->push($this->saveEnvio($smsInstances[$i], $responseItem, $aggregateId));
|
||||
}
|
||||
|
||||
return $envios;
|
||||
}
|
||||
|
||||
private function getNewSmsInstance(string $to, string $message, DateTime $schedule = null)
|
||||
{
|
||||
$sms = new Sms();
|
||||
|
||||
$sms->setId(uniqid());
|
||||
$sms->setTo(self::COUNTRY_PREFIX . $to);
|
||||
$sms->setMsg(StringUtil::getWithoutAccents($message));
|
||||
$sms->setCallbackOption(Sms::CALLBACK_NONE);
|
||||
|
||||
if (!is_null($schedule)) {
|
||||
|
||||
$sms->setSchedule($schedule->format('Y-m-d\TH:i:s'));
|
||||
}
|
||||
|
||||
return $sms;
|
||||
}
|
||||
|
||||
private function saveEnvio(Sms $sms, SmsResponse $response, int $aggregateId = null)
|
||||
{
|
||||
return SmsEnvio::create([
|
||||
'to' => $sms->getTo(),
|
||||
'message' => $sms->getMsg(),
|
||||
'sms_id' => $sms->getId(),
|
||||
'number_of_parts' => $this->getNumberOfParts($sms->getMsg()),
|
||||
'schedule' => $sms->getSchedule(),
|
||||
'aggregated_id' => $aggregateId,
|
||||
'status_code' => $response->getStatusCode(),
|
||||
'status_description' => $response->getStatusDescription(),
|
||||
'detail_code' => $response->getDetailCode(),
|
||||
'detail_description' => $response->getDetailDescription(),
|
||||
]);
|
||||
}
|
||||
|
||||
private function getNumberOfParts(string $message)
|
||||
{
|
||||
$length = Str::length($message);
|
||||
|
||||
if ($length <= 160) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if ($length > 160 && $length <= 304) {
|
||||
|
||||
return 2;
|
||||
}
|
||||
else if ($length > 304 && $length <= 456) {
|
||||
|
||||
return 3;
|
||||
}
|
||||
else if ($length > 456 && $length <= 608) {
|
||||
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
public function cancel(int $smsEnvioId)
|
||||
{
|
||||
$this->checkIfProduction();
|
||||
|
||||
$smsEnvio = SmsEnvio::findOrFail($smsEnvioId);
|
||||
|
||||
if ($smsEnvio->number_of_parts === 1) {
|
||||
|
||||
$response = $this->getFacade()->cancel($smsEnvio->sms_id);
|
||||
|
||||
$this->saveCancelamento($smsEnvio, 1, $response);
|
||||
}
|
||||
|
||||
for ($part = 1; $part <= $smsEnvio->number_of_parts; $part++) {
|
||||
|
||||
$smsPartId = $smsEnvio->sms_id . '_' . Str::padLeft($part, 3, '0');
|
||||
$response = $this->getFacade()->cancel($smsPartId);
|
||||
|
||||
$this->saveCancelamento($smsEnvio, $part, $response);
|
||||
}
|
||||
|
||||
return $smsEnvio->cancelamentos()->get();
|
||||
}
|
||||
|
||||
private function saveCancelamento(SmsEnvio $smsEnvio, int $part, SmsResponse $response)
|
||||
{
|
||||
return $smsEnvio->cancelamentos()->create([
|
||||
'part' => $part,
|
||||
'status_code' => $response->getStatusCode(),
|
||||
'status_description' => $response->getStatusDescription(),
|
||||
'detail_code' => $response->getDetailCode(),
|
||||
'detail_description' => $response->getDetailDescription(),
|
||||
]);
|
||||
}
|
||||
|
||||
private function checkIfProduction()
|
||||
{
|
||||
if (!app()->environment('production')) {
|
||||
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
private function getFacade()
|
||||
{
|
||||
return new SmsFacade($this->cliente->sms_usuario, $this->cliente->sms_senha, self::URL);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user