This commit is contained in:
Mekan1206
2026-06-04 20:10:29 +05:00
parent 21feb3baa6
commit 3f646ea951
6 changed files with 78 additions and 202 deletions

View File

@@ -2,15 +2,8 @@
namespace App\Services;
use App\Enums\SmsSendStatus;
use App\Jobs\SendSmsToCouponJob;
use App\Models\Coupon;
use App\Models\SmsCampaign;
use App\Models\SmsSendLog;
use App\Models\User;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\DB;
class SmsBroadcastService
{
@@ -36,62 +29,4 @@ class SmsBroadcastService
return $query->orderBy('id')->get();
}
public function startCampaign(
User $admin,
string $message,
bool $sendToAll,
array $selectedIds = [],
array $excludedIds = [],
): SmsCampaign {
$recipients = $this->resolveRecipients($sendToAll, $selectedIds, $excludedIds);
$mode = $sendToAll ? 'all' : 'selected';
return DB::transaction(function () use ($admin, $message, $mode, $recipients): SmsCampaign {
$campaign = SmsCampaign::query()->create([
'message' => $message,
'mode' => $mode,
'recipient_count' => $recipients->count(),
'created_by' => $admin->id,
]);
$jobs = [];
foreach ($recipients as $coupon) {
if (! is_valid_coupon_phone($coupon->phone)) {
$this->createLog($campaign, $coupon, SmsSendStatus::SkippedInvalid);
$campaign->increment('skipped_count');
continue;
}
$this->createLog($campaign, $coupon, SmsSendStatus::Pending);
$jobs[] = new SendSmsToCouponJob($campaign, $coupon);
}
if ($jobs === []) {
$campaign->update(['completed_at' => now()]);
return $campaign->fresh();
}
Bus::chain($jobs)
->onQueue('sms')
->dispatch();
return $campaign->fresh();
});
}
protected function createLog(SmsCampaign $campaign, Coupon $coupon, SmsSendStatus $status): SmsSendLog
{
return SmsSendLog::query()->create([
'sms_campaign_id' => $campaign->id,
'coupon_id' => $coupon->id,
'phone' => $coupon->phone,
'message' => $campaign->message,
'status' => $status,
'attempted_at' => $status === SmsSendStatus::Pending ? null : now(),
]);
}
}