Viewing file: ProcessCampaign.php (10.83 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Jobs;
use App\Models\Campaign; use App\Models\Coverage; use App\Models\CreditHistory; use App\Models\Exception; use App\Models\Group; use App\Models\Message; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB;
class ProcessCampaign implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $request;
private $messageFiles;
private $from; /** * @var mixed */ private $allFromNumber; /** * @var mixed */ private $voice_obj; /** * @var mixed */ private $customer; /** * @var mixed */ private $dynamic_template_data; /** * @var mixed */ private $find_gateway_id;
public function __construct($customer,$dynamic_template_data,$request,$messageFiles,$allFromNumber,$from,$voice_obj,$find_gateway_id) { $this->customer=$customer; $this->dynamic_template_data=$dynamic_template_data; $this->request=$request; $this->messageFiles=$messageFiles; $this->allFromNumber=$allFromNumber; $this->from=$from; $this->voice_obj=$voice_obj; $this->find_gateway_id=$find_gateway_id; }
public function handle() { try{ $dynamic_template_data=$this->dynamic_template_data; $request=$this->request; $allFromNumber=$this->allFromNumber; $from=$this->from; $voice_obj=$this->voice_obj; $customer=$this->customer; $find_gateway_id=$this->find_gateway_id;
//Check Customer Wallet Credit $current_plan = $customer->plan; if (!$current_plan) return back()->withErrors(['failed'=>'Customer doesn\'t have any plan right now']);
if($current_plan->unlimited_sms_send=='no'){ $sendlimit_expire=$current_plan->created_at->addMonths(1); $total_sms_queue=auth('customer')->user()->sms_queues()->whereBetween('created_at', [$current_plan->created_at, $sendlimit_expire])->count();
if($sendlimit_expire < now()){ throw new \Exception('Your SMS sending limit has expired'); } if($current_plan->sms_sending_limit <= $total_sms_queue){ throw new \Exception('Your SMS sending limit has ended!'); } }
$coverages=Coverage::whereIn('id', json_decode($current_plan->coverage_ids))->get(); $coverage_rate=[]; foreach ($coverages as $coverage){ if ($request['from_selected_type'] == 'mms') { $coverage_rate[$coverage->country_code]=$coverage->send_mms; } else if ($request['from_selected_type'] == 'whatsapp') { $coverage_rate[$coverage->country_code]=$coverage->send_voice_sms; } else if ($request['from_selected_type'] == 'voicecall') { $coverage_rate[$coverage->country_code]=$coverage->send_whatsapp_sms; }else{ $coverage_rate[$coverage->country_code]=$coverage->plain_sms; } }
//subtracting one sms TODO:: will need to count text and sub that $wallet = $customer->wallet()->first();
$headers=$dynamic_template_data[0][0];
$find_headers=[]; foreach ($headers as $key=>$header){ $find_headers[$header]= $key; }
unset($dynamic_template_data[0][0]); $template_data=$dynamic_template_data; $data_with_headers=[]; $total_to_numbers=[]; foreach (array_slice($template_data[0], 0, 99999999) as $items) { if(isset($items[$find_headers[$request['to_number_key']]])) { $header_primary_key = $items[$find_headers[$request['to_number_key']]]; foreach ($items as $key => $item) { $data_with_headers[$header_primary_key][] = [ $headers[$key] => $item ]; } $total_to_numbers[]=$header_primary_key; } }
//TODO::Added Each Number Coverage Rate $totalSmsAmount=0; $count_to_numbers=[]; $totalToNmbr=[]; foreach ($total_to_numbers as $total_to_number){ $to_numb=$total_to_number; $total_to_number=explode('-', $total_to_number); if(isset($total_to_number[0]) && $total_to_number[0] && isset($coverage_rate[str_replace('+','',$total_to_number[0])]) && $coverage_rate[str_replace('+','',$total_to_number[0])]){ $totalSmsAmount=$totalSmsAmount + $coverage_rate[str_replace('+','',$total_to_number[0])];
if(isset($total_to_number[1]) && $total_to_number[1]){ $count_to_numbers[]=str_replace('-','',$to_numb); $totalToNmbr[]=$total_to_number[1]; } } }
$to=$total_to_numbers;
//Check Template Character $requestCharacters=isset($request['template_body'])?$request['template_body']:'';
$totalCount=1; $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; } }else { if($characters && $characters > 160){ $grandTotal=ceil($characters / 160); if($grandTotal > 1) $totalCount= $grandTotal; } } //TODO::check to number which available on coverage list if($count_to_numbers && count($count_to_numbers) <= 0){ throw new \Exception('Please enter number according to your coverage'); }
$totalToNumbers= ($totalSmsAmount * $totalCount);
if ($current_plan && $wallet->credit < $totalToNumbers) { throw new \Exception('Doesn\'t have enough sms'); }
$pre_contacts=$customer->contacts()->count(); $total_pre_contacts=count($to) + $pre_contacts; if ($current_plan->unlimited_contact=='no' && $current_plan->max_contact <= $total_pre_contacts){ throw new \Exception('Your contact limit has been extend'); }
//TODO::Generate ToNumber according to multiple From Number $totalToNumbersCount = 0; $totalFromNumbersCount = count($allFromNumber); $generatedToNumbers = []; $lastKey=end($from); for ($i = 0; $i < count($to); $i += count($from)) { for ($j = 0; $j < count($this->from); $j++) { if (isset($to[$i + $j])) { $generatedToNumbers[$from[$j]][] = trim($to[$i + $j]); $totalToNumbersCount++; } } }
//TODO:: Create Campaign
$campaign = new Campaign(); $campaign->title = isset($request['title'])?$request['title']:''; $campaign->customer_id = $customer->id; $campaign->from_number = json_encode($allFromNumber); $campaign->to_number = json_encode($to); $campaign->start_date = isset($request['start_date'])?$request['start_date']:''; $campaign->end_date = isset($request['end_date'])?$request['end_date']:''; $campaign->start_time = isset($request['start_time'])?$request['start_time']:''; $campaign->end_time = isset($request['end_time'])?$request['end_time']:''; $campaign->template_id = isset($request['template_id'])?$request['template_id']:''; $campaign->message_body = json_encode($request['template_body']); $campaign->message_send_rate = isset($request['send_speed'])?$request['send_speed']:''; $campaign->status = 'importing'; $campaign->is_dynamic = 'yes'; $campaign->save(); $from = $allFromNumber;
$totalSmsCredit=$totalToNumbers; if ($current_plan) { $wallet->credit = $wallet->credit - $totalSmsCredit; $wallet->save(); cache()->forget('wallet_'.$wallet->customer_id); }
$selected_form_type=isset($request['from_selected_type']) && $request['from_selected_type']?$request['from_selected_type']:'sms';
foreach ($generatedToNumbers as $key => $toNumbers) {
$dynamic_gateway_id = isset($find_gateway_id[$key]) ? $find_gateway_id[$key] : ''; if ($dynamic_gateway_id) { /*Start*/ $startDate = (new Carbon($request['start_date']))->subDay(); $endDate = new Carbon($request['end_date']); $startTime = new Carbon($request['start_time']); $endTime = new Carbon($request['end_time']); $difference_time = $startTime->diffInSeconds($endTime); $difference_date = $startDate->diffInDays($endDate); $total_minute = $difference_time * $difference_date; $send_speed = floor($total_minute / $totalToNumbersCount); /*End*/
//create new message $newMessage = new Message(); $newMessage->customer_id = $customer->id; $newMessage->body = json_encode($request['template_body']); $newMessage->numbers = json_encode(['from' => $key, 'to' => $toNumbers]); $newMessage->campaign_id = $campaign->id; $newMessage->message_files = json_encode($this->messageFiles); $newMessage->sender_type = $selected_form_type; $newMessage->type = 'sent'; $newMessage->read = 'no'; $newMessage->voice_obj = json_encode($voice_obj); $newMessage->save();
$others=[ 'dynamic_gateway_id'=>$dynamic_gateway_id ]; CampaignCreateJob::dispatch($key, $toNumbers, $campaign, $newMessage, $totalToNumbersCount, $totalFromNumbersCount, $difference_date, $startDate, $startTime, $send_speed, auth('customer')->user(), $lastKey,$others,'dynamic',$data_with_headers); } } }catch(\Exception $ex){ throw new \Exception($ex->getMessage()); } } }
|