Viewing file: CampaignController.php (9.42 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller; use App\Jobs\CampaignCreateJob; use App\Models\AuthorizationToken; use App\Models\Campaign; use App\Models\Customer; use App\Models\Exception; use App\Models\FromGroup; use App\Models\Message; use App\Models\Number; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Validator;
class CampaignController extends Controller { public function index(Request $request) { $customer = Customer::where('id', auth()->user()->id)->first();
$campaigns = Campaign::select(['id', 'title', 'start_date', 'end_date', 'start_time', 'end_time', 'status', 'import_fail_message']) ->where('customer_id', $customer->id)->get();
return response()->json(['status' => 'success', 'data' => $campaigns]); }
public function store(Request $request) { try { $validator = Validator::make($request->all(), [ 'title' => 'required', 'to_number' => 'required', 'start_date' => 'required', 'template_body' => 'required', 'end_date' => 'required', 'start_time' => 'required', 'end_time' => 'required', ]); if ($validator->fails()) { return response()->json(['message' => $validator->errors()->messages()], 404); } $authorizationToken= AuthorizationToken::where('access_token', $request->api_key)->first(); if(!$authorizationToken){ return response()->json(['response'=>'1003'], 404); } $customer=Customer::where('id', $authorizationToken->customer_id)->firstOrFail();
$templateBody[]=$request->template_body; $request['template_body']=$templateBody;
$totalTo = array_map('trim', array_unique(preg_split('/,/', $request->to_number, -1, PREG_SPLIT_NO_EMPTY))); $onException = Exception::where('customer_id', $customer->id)->whereIn('number', $totalTo)->pluck('number')->toArray(); $to = array_diff($totalTo, $onException); $current_plan = $customer->plan; if (!$current_plan) return response()->json(['response'=>'1017']);
//subtracting one sms TODO:: will need to count text and sub that $wallet = $customer->wallet()->first(); $preMaskingCredit = $wallet->masking_credit; $preNonMaskingCredit = $wallet->non_masking_credit;
$totalText=''; // Count Template Body Characters $totalCount=1; $requestCharacters=implode('',$request->template_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; } }else { if($characters && $characters > 160){ $grandTotal=ceil($characters / 160); if($grandTotal > 1) $totalCount= $grandTotal; } } $totalToNumbers= count($to) * $totalCount;
if ($request->from_type == 'phone_number' && $preNonMaskingCredit < $totalToNumbers) { return rsponse()->json(['response'=> '1011']); }else if($request->from_type=='sender_id' && $preMaskingCredit < $totalToNumbers){ return rsponse()->json(['response'=> '1012']); }
$allGroupIds = []; $allFromNumber = [];
if ($request->from_type == 'phone_number') { $allFromNumber[] = $request->from_number; } else { $allFromNumber = [$request->whatsapp_from_number]; } if ($request->from_type == 'whatsapp_number' && $request->whatsapp_from_number) { $from_type = 'whatsapp'; } else { $from_type = 'phone_number'; } $allNumbers = Number::whereIn('number', $allFromNumber)->pluck('from');
foreach ($allNumbers as $from_gateway) { $gateWay = get_settings($from_gateway); if (!$gateWay) { return redirect()->back()->withErrors(['response' => '1014'])->withInput($request->all()); } }
$allFromNumber = array_values(array_unique($allFromNumber));
$campaign = new Campaign(); $campaign->title = $request->title; $campaign->customer_id = $customer->id; $campaign->from_number = json_encode($allFromNumber); $campaign->to_number = json_encode($to); $campaign->start_date = $request->start_date; $campaign->end_date = $request->end_date; $campaign->start_time = $request->start_time; $campaign->end_time = $request->end_time; $campaign->template_id = $request->template_id; $campaign->message_body = json_encode($request->template_body); $campaign->message_send_rate = $request->send_speed; $campaign->from_group_id = json_encode($allGroupIds); $campaign->status = 'importing'; $campaign->save(); $from = $allFromNumber;
//Minus Credit For Campaign Message if ($request->from_type == 'phone_number') { $wallet->non_masking_credit = $preNonMaskingCredit - $totalToNumbers; $wallet->save(); } else if ($request->from_type == 'sender_id') { $wallet->masking_credit = $preMaskingCredit - $totalToNumbers; $wallet->save(); }
$totalToNumbersCount = 0; $totalFromNumbersCount = count($allFromNumber); $generatedToNumbers = []; $lastKey = end($from); for ($i = 0; $i < count($to); $i += count($from)) { for ($j = 0; $j < count($from); $j++) { if (isset($to[$i + $j])) { $generatedToNumbers[$from[$j]][] = trim($to[$i + $j]); $totalToNumbersCount++; } } }
foreach ($generatedToNumbers as $key => $toNumbers) { /*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->type = 'sent'; $newMessage->read = 'no'; $newMessage->save();
CampaignCreateJob::dispatch($key, $toNumbers, $campaign, $newMessage, $totalToNumbersCount, $totalFromNumbersCount, $difference_date, $startDate, $startTime, $send_speed, $customer, $lastKey, $from_type); }
return response()->json(['response' => '1022'], 200); }catch(\Exception $ex){ return response()->json(['message' => $ex->getMessage()], 401); }
}
public function statistic($id){ $customer= auth()->user(); $campaign = $customer->campaings()->where('id', $id)->firstOrFail(); $runningMessageLogs = $customer->sms_queues()->select('body', 'from', 'to', 'delivered_at', 'schedule_completed', 'status')->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('schedule_completed','no')->where('status','running')->get(); $pausedMessageLogs = $customer->sms_queues()->select('body', 'from', 'to', 'delivered_at', 'schedule_completed', 'status')->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('status','paused')->get(); $failedMessageLogs = $customer->sms_queues()->select('body', 'from', 'to', 'delivered_at', 'schedule_completed', 'status')->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('schedule_completed','yes')->where('status','failed')->get(); $deliveredMessageLogs = $customer->sms_queues()->select('body', 'from', 'to', 'delivered_at', 'schedule_completed', 'status')->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('status','!=','failed')->where('schedule_completed','yes')->whereColumn('created_at', '<', 'updated_at')->whereNull('response_code')->get();
$data=[ 'running_message_logs'=>$runningMessageLogs, 'paused_message_logs'=>$pausedMessageLogs, 'failed_message_logs'=>$failedMessageLogs, 'delivered_message_logs'=>$deliveredMessageLogs, ];
return response()->json(['status'=>'success', 'data'=>$data]); }
}
|