Viewing file: ComposeController.php (12.35 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers\Customer;
use App\Events\SendMail; use App\Http\Controllers\Controller; use App\Models\Contact; use App\Models\ContactGroup; use App\Models\CreditHistory; use App\Models\CustomerNumber; use App\Models\Number; use App\Models\Report; use App\Models\SenderId; use App\Models\SentFail; use App\Models\WhatsAppNumber; use App\SmsProvider\SendSMS; use App\VoiceCallProvider\SendVoiceCallProcess; use App\WhatsAppProvider\SendMessageProcess; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log;
class ComposeController extends Controller { public function index(Request $request) { $user = auth()->guard('customer')->user();
$usersToGroups = []; $usersToContacts = []; foreach ($user->active_groups as $group) { $usersToGroups[] = ['value' => $group->name, 'id' => $group->id, 'type' => 'group']; } foreach ($user->contacts()->limit(10000)->get() as $contact) { $usersToContacts[] = ['value' => isset($contact->first_name) ? $contact->contact_dial_code . $contact->number . ' (' . $contact->first_name . ' ' . $contact->last_name . ')' : $contact->contact_dial_code . $contact->number, 'id' => $contact->id, 'type' => 'contact']; }
$data['users_to_contacts'] = $usersToContacts; $data['users_to_groups'] = $usersToGroups; $data['from_type'] = $request->type;
return view('customer.smsbox.compose', $data); }
public function getSenders(Request $request) {
$numbers = auth('customer')->user()->numbers()->where('type', $request->type)->where('status', 'active')->select(['id', 'number'])->get();
if (count($numbers) <= 0) { return response()->json(['status' => 'failed']); }
return response()->json(['data' => $numbers, 'status' => 'success']); }
public function sentCompose(Request $request) { if (env("APP_DEMO")) { return redirect()->back()->withErrors(['msg' => trans('admin.app_demo_message')]); } $request->validate([ 'from_number' => 'required', 'to_numbers' => 'required|array', 'body' => 'required', ]);
$messageFiles = []; $sendFailed = []; if ($request->mms_files) {
foreach ($request->mms_files as $key => $file) { $messageFiles[] = $fileName = time() . $key . '.' . $file->extension(); $file->move(public_path('uploads/'), $fileName); } $request['message_files'] = json_encode($messageFiles); } if ($request->file_mp3) { $fileName = time() . '.' . $request->file_mp3->extension(); $request->file_mp3->move(public_path('uploads/'), $fileName); $request['message_files'] = $fileName; }
if (isset($request->isSchedule)) { $sd = Carbon::createFromTimeString($request->schedule); $request['schedule_datetime'] = $sd; $schedule_completed = 'no'; } else { $request['schedule_datetime'] = now(); $schedule_completed = 'yes'; } $allToNumbers = []; $allGroupIds = []; $allContactIds = [];
foreach ($request->to_numbers as $item) { $number = (array)json_decode($item); if (isset($number['type']) && isset($number['id'])) { if ($number['type'] == 'contact') { $allContactIds[] = $number['id']; } elseif ($number['type'] == 'group') { $allGroupIds[] = $number['id']; } } else { $allToNumbers[] = $item; } }
$contactNumbers = Contact::select('id', 'number')->whereIn('id', $allContactIds)->get(); $groupNumbers = ContactGroup::with('contact')->whereIn('group_id', $allGroupIds)->get();
foreach ($contactNumbers as $cn) { $allToNumbers[] = trim($cn->number); } foreach ($groupNumbers as $gn) { $allToNumbers[] = trim($gn->contact->number); }
$numberForm = auth('customer')->user()->numbers()->where('id', $request->from_number)->where('status', 'active')->firstOrFail(); $gateway = auth('customer')->user()->gateways()->where('id', $numberForm->dynamic_gateway_id)->firstOrFail();
$number_form = $numberForm->number;
$allToNumbers = array_unique($allToNumbers);
$request['to_numbers'] = $allToNumbers; $request['numbers'] = json_encode(['from' => $number_form, 'to' => $allToNumbers]); $request['type'] = 'sent';
$totalCount = 1; $requestCharacters = $request->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; } }
//send sms here using API $number = $numberForm; if (!$number) return back()->with('fail', 'Number not found please contact with administrator');
$numb = $number->number;
DB::beginTransaction(); try { foreach ($request->to_numbers as $to) {
if ($request->from_type == 'whatsapp_number') { $to = 'whatsapp:' . $to; }
$smsQueue = auth('customer')->user()->messages()->create([ 'from' => $numb, 'to' => $to, 'schedule_datetime' => $request->schedule_datetime, 'schedule_completed' => $schedule_completed, 'body' => $request->body, 'created_at' => now(), 'updated_at' => now(), 'message_files' => $request->message_files, 'type' => 'sent', 'dynamic_gateway_id' => $gateway->id, ]);
$sendSMS = new SendSMS(); $sendSMS->setMessage($smsQueue) ->process();
}
DB::commit(); if (!$request->ajax()) { return back()->with('success', 'Message sent successfully'); } else { return response()->json(['status' => 'success', 'message' => 'Message sent successfully']); } } catch (\Exception $ex) { Log::error($ex); DB::rollBack(); if ($request->ajax()) { return response()->json(['status' => 'failed', 'message' => $ex->getMessage()]); } else { return back()->with('fail', $ex->getMessage()); } } }
public function queueList(Request $request) {
$data['queuesList'] = auth('customer')->user()->messages()->whereNotNull('schedule_datetime')->whereNull('delivered_at')->orderBy('created_at', 'desc')->paginate(10); return view('customer.smsbox.queue', $data); }
public function overview() { return view('customer.smsbox.overview'); }
public function overview_get_data(Request $request) { $overview = auth('customer')->user()->messages()->select(['id', 'body', 'status', 'updated_at','created_at', 'from', 'to', 'type', 'delivered_at', 'failed_reason', 'schedule_datetime', 'schedule_completed']);
if ($request->type && $request->type == 'trash') { $overview = $overview->onlyTrashed(); } else if ($request->type) { $overview = $overview->where('type', $request->type); } if ($request->status && $request->status == 'queue') { $overview = $overview->where('status', 'running')->where('schedule_completed', 'no')->whereNotNull('schedule_datetime')->whereNull('delivered_at'); } elseif ($request->status) { $overview = $overview->where('status', $request->status); }
if ($request->from_date && $request->to_date) { $overview = $overview->whereBetween('created_at', [$request->from_date, $request->to_date]); }
return datatables()->of($overview) ->addColumn('body', function ($q) { return "<div class='show-more' style='max-width: 500px;white-space: pre-wrap'>" . htmlentities($q->body) . '</div>'; }) ->addColumn('status', function ($q) { if ($q->status == 'succeed') { if ($q->delivered_at) { $status = 'Delivered At: ' . formatDate($q->delivered_at); } else { $status = 'Received At: ' . formatDate($q->created_at); } } elseif ($q->status == 'failed') { if ($q->failed_reason) { $status = "<div class='show-more' style='max-width: 500px;white-space: pre-wrap'>Failed Reason: " . $q->failed_reason . '</div>'; } else { $status = 'Failed Reason: n/a'; } } elseif ($q->status == 'running' && $q->schedule_completed == 'no' && $q->schedule_datetime) { $status = 'Queued At: ' . formatDate($q->schedule_datetime); } else { $status = ucfirst($q->status); } return $status; }) ->addColumn('action', function ($q) { return '<button class="btn btn-sm btn-danger" data-message="Are you sure you want to delete this message?" data-action=' . route('customer.smsbox.overview.data.delete', ['id' => $q]) . ' data-input={"_method":"delete"} data-toggle="modal" data-target="#modal-confirm">Delete</button>'; }) ->rawColumns(['action', 'status', 'body']) ->toJson(); }
public function overview_data_delete(Request $request) { $request->validate([ 'id' => 'required' ]); $ids = explode(',', $request->id); auth('customer')->user()->messages()->whereIn('id', $ids)->delete(); return back()->with('success', 'Message successfully moved to trash'); }
public function smsCalculate(Request $request) { $request->validate([ 'from_type' => 'required', 'to_numbers.*' => 'required', 'message' => 'required' ]);
$totalCount = 1; $requestCharacters = $request->message; $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; } } $currentPlan = auth('customer')->user()->plan; if ($request->from_type == 'phone_number') { $rate = $currentPlan->non_masking_rate; } elseif ($request->from_type == 'sender_id') { $rate = $currentPlan->masking_rate; } elseif ($request->from_type == 'whatsapp_number') { $rate = $currentPlan->whatsapp_rate; }
$number = count($request->to_numbers); $totalSms = $totalCount * $number; $totalRate = $rate * $totalSms; return response()->json(['status' => 'success', 'data' => ['totalSms' => $totalSms, 'totalNumber' => $number, 'totalRate' => $totalRate]]);
}
public function webhookLists() { $allGateways = []; foreach (getAllSmsGateway() as $gateway) { $allGateways[$gateway] = route('inbound.process', [$gateway]); } return view('customer.smsbox.inbound_webhook', compact('allGateways')); }
}
|