Viewing file: CampaignController.php (17.04 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers\Customer;
use App\Http\Controllers\Controller; use App\Jobs\CampaignCreateJob; use App\Models\Campaign; use App\Models\CustomerNumber; use App\Models\Exception; use App\Models\FromGroup; use App\Models\Group; use App\Models\Message; use App\Models\Number; use App\Models\SenderId; use App\Models\Settings; use App\Models\SmsTemplate; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log;
class CampaignController extends Controller { public function index() { return view('customer.campaign.index'); }
public function smsTemplate() { $customer = auth('customer')->user(); $data['sms_templates'] = SmsTemplate::where('customer_id', $customer->id)->get(); return view('customer.template.sms_template', $data); }
public function report(Request $request) { $customer = auth('customer')->user(); if ($request->campaign_id) $campaign = $customer->campaings()->where('id', $request->campaign_id)->firstOrFail(); $messageLogs = $customer->messages()->select(['from', 'to','status','failed_reason', 'body', 'updated_at','delivered_at','failed_reason','schedule_datetime','schedule_completed']);
if ($request->campaign_id) { $messageLogs = $messageLogs->where('campaign_id', $campaign->id); }
if ($request->campaign_id) { $data['reports'] = $messageLogs->simplePaginate(20); } else { $data['reports'] = ''; } $data['campaigns'] = $customer->campaings; $data['requestData'] = $request->only('campaign_id'); return view('customer.campaign.report', $data); }
public function getAll() { $campaings = auth('customer')->user()->campaings()->withCount(['sms_queue','total_processed'])->orderByDesc('id'); return datatables()->of($campaings) ->addColumn('title', function ($q) { $title = $q->title; if ($q->status == 'running' && $q->sms_queue_count) { $title .= '(' . $q->total_processed_count . '/' . $q->sms_queue_count . ')'; } return $title; }) ->addColumn('start_date', function ($q) { return $q->start_date->format('Y-m-d'); }) ->addColumn('end_date', function ($q) { return $q->end_date->format('Y-m-d'); }) ->addColumn('status', function ($q) { if ($q->import_fail_message) { return ' <button type="button" class="btn light btn-sm btn-danger">Import Failed</button> <br>' . $q->import_fail_message; } if ($q->status == 'running') { if ($q->total_processed_count >= $q->sms_queue_count) { return ' <button type="button" disabled class="btn light btn-sm btn-primary">Completed</button>'; } return ' <button type="button" class="btn light btn-sm btn-success dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Running </button> <div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, 38px, 0px);"> <button data-message="Are you sure, you want to change this campaign status?" data-action=' . route('customer.campaign.status', ['id' => $q->id, 'status' => 'paused']) . ' data-input={"_method":"post"} data-toggle="modal" data-target="#modal-confirm" class="dropdown-item"> Pause </button> </div>'; } elseif ($q->status == 'failed') { return ' <button type="button" class="btn light btn-sm btn-danger">Failed</button> <br>' . $q->import_fail_message; } elseif ($q->status == 'importing') { return "<span> <i class=\"fas fa-spinner fa-pulse\"></i> importing</span>"; } else { return '<button type="button" class="btn light btn-sm btn-warning dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pause </button> <div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, 38px, 0px);"> <button data-message="Are you sure, you want to change this campaign status?" data-action=' . route('customer.campaign.status', ['id' => $q->id, 'status' => 'running']) . ' data-input={"_method":"post"} data-toggle="modal" data-target="#modal-confirm" class="dropdown-item"> Running </button> </div>'; } })->addColumn('action', function ($q) {
if($q->status != 'importing'){ return '<a href="' . route('customer.campaign.statistic', [$q->id]) . '" target="_blank" class="btn light btn-sm btn-info mr-2">Statistic </a>'.'<button class="btn btn-sm btn-danger" data-message="Are you sure, you want to delete this campaign? <br> <br> <small>N.B: This will delete all messages including sent and queue related to this campaign.</small>" data-action=' . route('customer.campaign.destroy', [$q]) . ' data-input={"_method":"delete"} data-toggle="modal" data-target="#modal-confirm">Delete</button>'; } })->rawColumns(['title', 'action', 'status'])->toJson(); }
public function allSenders(Request $request){ $customer=auth('customer')->user();
$fromGroups=$customer->from_groups()->where('type', $request->type)->get(); $numbers=$customer->numbers()->where('type', $request->type)->get(); $usersFormGroups = []; $usersFormNumbers = []; foreach ($fromGroups as $group) { $usersFormGroups[] = ['value' => $group->name, 'id' => $group->id, 'type' => 'group']; } foreach ($numbers as $key => $number) { $usersFormNumbers[] = ['value' => $number->number, 'number' => $number->number, 'type' => 'from']; }
return response()->json(['number'=>$usersFormNumbers,'groups'=>$usersFormGroups, 'status'=>'success']); }
public function create() { $customer = auth('customer')->user();
$data['templates'] = SmsTemplate::where('customer_id', $customer->id)->where('status', 'active')->get(); $data['groups'] = $customer->groups()->withCount('contacts')->get(); $data['from_groups'] = $customer->from_groups; $fromGroups=$customer->from_groups()->where('type', 'number')->get(); $numbers=$customer->numbers()->where('type', 'number')->get();
$usersFormGroups = []; $usersFormNumbers = []; foreach ($fromGroups as $group) { $usersFormGroups[] = ['value' => $group->name, 'id' => $group->id, 'type' => 'group']; } foreach ($numbers as $key => $number) { $usersFormNumbers[] = ['value' => $number->number, 'number' => $number->number, 'type' => 'from']; }
$data['users_from_groups'] = $usersFormGroups; $data['users_from_number'] = $usersFormNumbers; return view('customer.campaign.create', $data); }
public function getTemplate(Request $request) {
$customer = auth('customer')->user(); $template = SmsTemplate::where('id', $request->template_id)->where('customer_id', $customer->id)->first();
return response()->json(['status' => 'success', 'data' => $template->body]); }
public function store(Request $request) { DB::beginTransaction(); try { if (env("APP_DEMO")) { return redirect()->back()->withErrors(['msg' => trans('admin.app_demo_message')]); } $request->validate([ 'title' => 'required', 'template_body' => 'required', ]);
if ($request->check_schedule && $request->check_schedule == 'on') { $sTime = strtotime($request->start_time); $eTime = strtotime($request->end_time);
$endDate = new Carbon($request->end_date); $startDate = new Carbon($request->start_date);
if (Carbon::parse($startDate)->gt(Carbon::now()) || Carbon::parse($endDate)->gt(Carbon::now())) { return redirect()->back()->withErrors(['error' => 'You can\'t select previous date']); } if ($request->end_date < $request->start_date) { return redirect()->back()->withErrors(['error' => 'Invalid schedule date']); } if ($sTime > $eTime) { return redirect()->back()->withErrors(['error' => 'Invalid schedule time']); } }
$totalGroups = Group::whereIn('id', $request->groups)->get(); $totalTo = []; foreach ($totalGroups as $gContacts) { foreach ($gContacts->contacts as $contact) { $totalTo[] = $contact->contact->contact_dial_code . $contact->contact->number; } }
$totalTo = array_unique($totalTo); if (count($totalTo) <= 0) { return redirect()->back()->withErrors(['failed' => 'Select at last one group with more than 1 contacts']); }
$onException = Exception::where('customer_id', auth('customer')->id())->whereIn('number', $totalTo)->pluck('number')->toArray(); $to = array_diff($totalTo, $onException);
$allGroupIds = []; $allFromNumber = []; foreach ($request->from_number as $item) { $number = (array)json_decode($item); if (isset($number['type'])) { if ($number['type'] == 'from') { $allFromNumber[] = $number['number']; } elseif ($number['type'] == 'group') { $allGroupIds[] = $number['id']; } } }
$fromGroups = FromGroup::where('status', 'active')->whereIn('id', $allGroupIds)->get(); foreach ($fromGroups as $from_group) { foreach ($from_group->from_group_numbers as $from_number) { $allFromNumber[] = $from_number->number; } }
$from_type = $request->type;
$customerNumbers = auth('customer')->user()->numbers()->whereIn('number', $allFromNumber)->get();
$findNumbServer = []; foreach ($customerNumbers as $numb) { $findNumbServer[$numb->number] = [ 'dynamic_gateway_id' => $numb->dynamic_gateway_id, ]; } if ($request->check_schedule && $request->check_schedule == 'on') { /*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); /*End*/ } else { /*Start*/ $start_date = now()->subDay()->format('Y-m-d'); $end_date = now()->format('Y-m-d'); $startDate = (new Carbon($start_date)); $endDate = new Carbon($end_date); $startTime = now()->format('H:i:s'); $endTime = now()->addMinute()->format('H:i:s'); $startTime = new Carbon($startTime); $endTime = new Carbon($endTime); /*End*/ }
$allFromNumber = array_values(array_unique($allFromNumber)); if(empty($allFromNumber)){ DB::rollBack(); }
$customer = auth('customer')->user(); $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 = $startDate; $campaign->end_date = $endDate; $campaign->start_time = $startTime; $campaign->end_time = $endTime; $campaign->message_body = json_encode($request->template_body); $campaign->group_ids = json_encode($request->groups); $campaign->status = 'importing'; $campaign->save(); $from = $allFromNumber;
$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) {
$serverId = isset($findNumbServer[$key]) ? $findNumbServer[$key]['dynamic_gateway_id'] : 0;
//Get Time Different $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 $msgBody = $request->template_body;
CampaignCreateJob::dispatch($campaign->id, $key, $msgBody, $toNumbers, $campaign, $totalToNumbersCount, $totalFromNumbersCount, $difference_date, $startDate, $startTime, $send_speed, auth('customer')->user(), $lastKey, $from_type, $serverId); }
DB::commit(); return redirect()->route('customer.campaign.index')->with('success', trans('Campaign created successfully')); } catch (\Exception $ex) { DB::rollBack(); return redirect()->back()->withErrors(['error' => $ex->getMessage()]); } }
public function destroy(Campaign $campaign) { if ($campaign->sms_queue) { $campaign->sms_queue()->delete(); } $campaign->delete();
return redirect()->route('customer.campaign.index')->with('success', 'Congratulations ! Campaign successfully deleted'); }
public function status(Request $request) { $request->validate([ 'status' => 'required|in:running,paused', ]);
$customer = auth('customer')->user(); $campaign = Campaign::where('customer_id', $customer->id)->where('id', $request->id)->firstOrFail(); $campaign->status = $request->status; $campaign->save();
Message::where('campaign_id', $campaign->id)->where('schedule_completed', 'no')->where('status', $request->status == 'paused' ? 'running' : 'paused')->update(['status' => $request->status]);
return redirect()->route('customer.campaign.index')->with('success', 'Congratulations ! Campaign status updated');
}
public function statistic($id) { $campaign = auth('customer')->user()->campaings()->where('id', $id)->firstOrFail();
if($campaign->status=='importing'){ return redirect()->back()->withErrors(['error'=>'You can\'t see statistics while importing']); } $data['messageRunningLogs'] = auth('customer')->user()->messages()->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('schedule_completed', 'no')->where('status', 'running')->paginate(20, ['*'], 'running'); $data['messagePausedLogs'] = auth('customer')->user()->messages()->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('status', 'paused')->paginate(20, ['*'], 'paused'); $data['messageFailedLogs'] = auth('customer')->user()->messages()->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('schedule_completed', 'yes')->where('status', 'failed')->paginate(20, ['*'], 'failed'); $data['messageDeliveredLogs'] = auth('customer')->user()->messages()->where('campaign_id', $campaign->id)->orderBy('schedule_datetime')->where('status', '!=', 'failed')->where('schedule_completed', 'yes')->whereColumn('created_at', '<', 'updated_at')->paginate(20, ['*'], 'delivered');
return view('customer.campaign.statistic', $data); } }
|