Viewing file: ScheduleController.php (9.65 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers;
use App\Events\SendMail; use App\Models\Contact; use App\Models\DynamicGateway; use App\Models\Message; use App\Models\MessageReport; use App\Models\Number; use App\Models\SenderId; use App\Models\SentFail; use App\Models\SmsQueue; use App\Models\WhatsAppNumber; use App\SmsProvider\SendSMS; use App\SmsProvider\SmppBuilder; use App\WhatsAppProvider\SendMessageProcess; use GuzzleHttp\Client; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Log; use Illuminate\Support\Carbon;
class ScheduleController extends Controller { public function process() {
//TODO:: check exception table for sending sms $totalNewQueueCount = 40; $today = now()->format('l'); $time = now()->toTimeString();
$sendingServersNotNull = DynamicGateway::whereStatus('active')->where('offdays', 'not like', "%$today%") ->whereNotNull('start_time') ->whereNotNull('end_time') ->whereTime('start_time', '<=', $time) ->whereTime('end_time', '>=', $time) ->get();
$sendingServersNull = DynamicGateway::whereStatus('active')->where('offdays', 'not like', "%$today%") ->whereNull('start_time') ->whereNull('end_time') ->get();
$sendingServers=$sendingServersNotNull->merge($sendingServersNull);
if ($sendingServers->isEmpty()) { $this->debugExit("No available servers"); }
#region Minute Limit Check $minuteEmailQueue = SmsQueue::selectRaw("count(*) as total,dynamic_gateway_id") ->where('schedule_completed', 'yes') ->whereBetween('schedule_datetime', [now()->subMinute(), now()]) ->whereIn('dynamic_gateway_id', $sendingServers->pluck('id')->toArray()) ->groupBy('dynamic_gateway_id') ->pluck('total', 'dynamic_gateway_id') ->all();
$availableMinutelySendingServerIds = []; foreach ($sendingServers as $sendingServer) { if (isset($minuteEmailQueue[$sendingServer->id])) { $totalUsed = $minuteEmailQueue[$sendingServer->id] + $totalNewQueueCount; // count new queue ; if ($sendingServer->send_limit > 0 && ($sendingServer->minute_limit / $sendingServer->send_limit) > $totalUsed) { $availableMinutelySendingServerIds[] = $sendingServer->id; } } else { $availableMinutelySendingServerIds[] = $sendingServer->id; } } if (empty($availableMinutelySendingServerIds)) { $this->debugExit("No available sending servers (minute limit)"); } #endregion
#region Daily Limit Check $dailyEmailQueue = SmsQueue::selectRaw("count(*) as total,dynamic_gateway_id") ->where('schedule_completed', 'yes') ->whereIn('dynamic_gateway_id', $availableMinutelySendingServerIds) ->whereBetween('schedule_datetime', [now()->subDay(), now()]) ->groupBy('dynamic_gateway_id') ->pluck('total', 'dynamic_gateway_id') ->all();
$availableDailySendingServerIds = []; foreach ($sendingServers as $sendingServer) { if (isset($dailyEmailQueue[$sendingServer->id])) { $totalUsed = $dailyEmailQueue[$sendingServer->id] + $totalNewQueueCount; // count new queue ; if ($sendingServer->daily_limit > $totalUsed) { $availableDailySendingServerIds[] = $sendingServer->id; } } else { $availableDailySendingServerIds[] = $sendingServer->id; } } if (empty($availableDailySendingServerIds)) { $this->debugExit("No available sending servers (daily limit)"); } #endregion
#region Monthly Limit Check $monthlyEmailQueue = SmsQueue::selectRaw("count(*) as total,dynamic_gateway_id") ->where('schedule_completed', 'yes') ->whereIn('dynamic_gateway_id', $availableDailySendingServerIds) ->whereBetween('schedule_datetime', [now()->subMonth(), now()]) ->groupBy('dynamic_gateway_id') ->pluck('total', 'dynamic_gateway_id') ->all();
$availableSendingServerIds = []; foreach ($sendingServers as $sendingServer) { if (isset($monthlyEmailQueue[$sendingServer->id])) { $totalUsed = $monthlyEmailQueue[$sendingServer->id] + $totalNewQueueCount; // count new queue ; if ($sendingServer->monthly_limit > $totalUsed) { $availableSendingServerIds[] = $sendingServer->id; } } else { $availableSendingServerIds[] = $sendingServer->id; } } if (empty($availableSendingServerIds)) { $this->debugExit("No available sending servers (monthly limit"); } #endregion
$sendFailed = []; $allNumbers = []; $messages = SmsQueue::whereIn('dynamic_gateway_id', $availableSendingServerIds) ->where(['schedule_completed' => 'no']) ->whereNotNull('schedule_datetime') ->whereNull('delivered_at') ->where('schedule_datetime', '<', now()) ->where('status','running') ->orderBy('schedule_datetime') ->limit($totalNewQueueCount) ->get();
$queueIds = []; foreach ($messages as $message) { $queueIds[]=$message->id; } SmsQueue::whereIn('id', $queueIds)->update(['schedule_completed'=>'yes']); $messageBody = [];
foreach ($messages as $message) { $allNumbers[]=$message->to; $messageBody[$message->to][] = $message->body;
//Manage Wallet $wallet = $message->user->wallet()->first();
$current_plan=$message->user->plan;
$to_number = explode(':', $message->to);
if (isset($to_number[0]) && $to_number[0]=='whatsapp' && isset($to_number[1])){ $to = $to_number[1]; }else { $to = $message->to; }
$dynamic_gateway = DynamicGateway::where('id', $message->dynamic_gateway_id)->first(); if ($dynamic_gateway) { if($dynamic_gateway->name=='Smpp'){ $flowRoute = new SmppBuilder($dynamic_gateway); $flowRoute->setMessage($message) ->setType('sent') ->sendMessage(); $this->failed_sms = $flowRoute->getSendFail(); }else{ $sendSMS = new SendSMS(); $sendSMS->setMessage($message) ->setType('sent') ->process(); $sendFailed = $sendSMS->get_failed_sms(); }
$message_report=new MessageReport(); $message_report->customer_id=$message->customer_id; $message_report->type=$message->from_type; $message_report->sent_type='sent'; $message_report->from=$message->from; $message_report->to=$message->to; $message_report->ref_id=$message->message_id; $message_report->save();
}
if($sendFailed){ $totalCount=0; $requestCharacters=$message->body; $characters=mb_strlen($requestCharacters, "UTF-8"); if (strlen($requestCharacters) != strlen(utf8_decode($requestCharacters))) { if($characters && $characters > 70){ $grandTotal=ceil($characters / 70); if($grandTotal > 1) $totalCount= $grandTotal - 1; } }else { if($characters && $characters > 160){ $grandTotal=ceil($characters / 160); if($grandTotal > 1) $totalCount= $grandTotal; } }
$plain_sms=$current_plan->plain_sms; $totalFaileReverse=$totalCount * $plain_sms; if ($current_plan) { $wallet->credit = $wallet->credit + $totalFaileReverse; $wallet->save(); } } if (count($sendFailed) < 1){ $message->update(['delivered_at' => now()]); }
} $failedNumber = collect($sendFailed)->pluck('to'); // Send Mail try { $contacts = Contact::whereIn('number', $allNumbers)->whereNotIn('number', $failedNumber)->get(); foreach ($contacts as $contact) { foreach ($messageBody[$contact->number] as $msg) { if ($contact->email && $contact->email_notification=='true') { SendMail::dispatch($contact->email, 'New Message', $msg); } } }
} catch (\Exception $ex) { Log::error($ex->getMessage()); }
if ($sendFailed) { SentFail::insert($sendFailed); } } public function processEmail(){ Artisan::call("queue:work",['--stop-when-empty'=>true]); } public function processDbBackup(){ Artisan::call("db:backup"); }
protected function debugExit($message) { if (config('app.debug')) { Log::info($message); } exit; }}
|