Viewing file: CampaignController.php (14.58 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 App\Models\CustomerNumber; use App\Models\SenderId; use App\Models\Coverage; use App\Models\WhatsAppNumber; use App\Models\ShortLink; 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 { if(!$request->start_date){ $start_date=now()->format('Y-m-d'); $request['start_date']=$start_date; }
if(!$request->end_date){ $end_date=now()->format('Y-m-d'); $request['end_date']=$end_date; }
if(!$request->start_time){ $start_time=now()->format('H:i'); $request['start_time']=$start_time; }
if(!$request->end_time){ $end_time=(now()->addSeconds(10))->format('H:i'); $request['end_time']=$end_time; }
$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();
$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']);
$coverages=Coverage::whereIn('id', json_decode($current_plan->coverage_ids))->get(); $coverage_rate = []; $request['from_selected_type']='sms'; if ($coverages) { foreach ($coverages as $coverage) { if ($request->from_selected_type == 'sms') { $coverage_rate[$coverage->country_code] = $coverage->plain_sms; } else 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; } } }
//Insert All Contacts $insertContact = []; $recipient_numbers = array_unique($to); foreach ($recipient_numbers as $recipient_number) { $number_code = getCountryDialCode($recipient_number); $number_without_code = getPhoneNumberWithoutDialCode($recipient_number); if (isset($coverage_rate[str_replace('+', '', $number_code)])) { $totalTo[] = $number_without_code; // $totalSmsAmount = $totalSmsAmount + $coverage_rate[str_replace('+', '', $number_code)];
$insertContact[] = [ 'customer_id' => $customer->id, 'contact_dial_code' => $number_code, 'number' => $number_without_code ]; } }
if(!$insertContact || count($insertContact) <=0){ return response()->json(['message'=>'Enter Valid To Numbers According Your Coverage']); }
if ($insertContact) { $customer->contacts()->createMany($insertContact); }
//subtracting one sms TODO:: will need to count text and sub that $wallet = $customer->wallet()->first();
$totalText = ''; // Count Template Body Characters $totalCount = 1; $requestCharacters = $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;
$allGroupIds = []; $allFromNumber = []; $number_form = ''; if ($request->from_type == 'phone_number') { $customerNumber = CustomerNumber::where('customer_id', $customer->id)->where('number', $request->from_number)->orWhere('number', "+" . str_replace('+', '', $request->from_number))->first(); if (!$customerNumber) { return response()->json(['response' => '1005']); } $number_form = $request->from_number; $allFromNumber[] = $request->from_number; } else if ($request->from_type == 'sender_id') { $sender_id = SenderId::where('sender_id', $request->sender_id)->where('status', 'approved')->first(); if (!$sender_id) { return response()->json(['response' => '1002']); } $number_form = $sender_id->sender_id; $allFromNumber[] = $sender_id->sender_id; } else { $whatsAppNumber = $customer->whatsapp_numbers()->where('expire_date', '>', now())->where('number', $request->whatsapp_from_number)->first(); if (!$whatsAppNumber) { return response()->json(['response' => '1010']); } $number_form = $whatsAppNumber->number; $allFromNumber[] = $whatsAppNumber->number; }
if ($request->from_type == 'phone_number') { $number = Number::where('number', $number_form)->orWhere('number', "+" . str_replace('+', '', $number_form))->first(); } else if ($request->from_type == 'sender_id') { $number = SenderId::where('sender_id', $number_form)->first(); } else if ($request->from_type == 'whatsapp_number') { $number = WhatsAppNumber::where('number', $number_form)->orWhere('number', "+" . str_replace('+', '', $number_form))->first(); }
if (!$number) return response()->json(['response' => '1013'], 1018);
$dynamic_gateway_id = $number->dynamic_gateway_id; if (!$dynamic_gateway_id) { return response()->json(['response' => '1014']); }
if ($request->from_type == 'whatsapp_number' && $request->whatsapp_from_number) { $from_type = 'whatsapp'; } else { $from_type = 'phone_number'; }
$allFromNumber = array_values(array_unique($allFromNumber));
//TODO::Replace Message Link $pattern = '#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#'; $string = preg_replace('/\s+/', ' ', trim($request->template_body)); preg_match_all($pattern, $string, $matches);
if (isset($matches[0]) && count($matches[0]) > 0) { foreach ($matches[0] as $index => $originalLink) { $code = $this->generateShortCode($originalLink); $shortLink = new ShortLink(); $shortLink->customer_id = auth('customer')->user()->id; $shortLink->url = $originalLink; $shortLink->short_code = $code; $shortLink->campaign_id = $campaign->id; $shortLink->save(); $request['template_body'] = str_replace($originalLink, route('shorten.url', [$code, 'c' => 'contact__id']), $request->template_body); } }
if ($current_plan) { if ($wallet->credit < $totalToNumbers) { return response()->json(['message'=>'Doesn\'t have enough sms']); } }
//Minus Credit For Campaign Message $wallet->credit = $wallet->credit - $totalToNumbers; $wallet->save();
$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 = 999999; $campaign->from_group_id = json_encode($allGroupIds); $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) { /*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, $dynamic_gateway_id);
// 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]); } }
|