Viewing file: ComposeController.php (14.96 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\CustomerPlan;
use App\Models\Device;
use App\Models\Number;
use App\SmsProvider\SendSMS;
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('customer')->user();
if ($user->type == 'staff') {
$user = $user->staff;
}
$data['draft'] = $user->drafts()->where('id', $request->draft)->first();
$data['devices'] = $user->devices()->where('status', 'active')->where('device_type','device')->get();
$data['wadevices'] = $user->devices()->where('status', 'active')->where('device_type','whatsapp')->get();
$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->number . ' (' . $contact->first_name . ' ' . $contact->last_name . ')' : $contact->number, 'id' => $contact->id, 'type' => 'contact'];
}
$data['users_to_contacts'] = $usersToContacts;
$data['users_to_groups'] = $usersToGroups;
return view('customer.smsbox.compose', $data);
}
public function sentCompose(Request $request)
{
if ($request->device_type == 'whatsapp') {
$request->validate([
'device_id' => 'required',
'to_numbers' => 'required|array',
'body' => 'required',
]);
} else {
$request->validate([
'device_id' => 'required',
'to_numbers' => 'required|array',
'body' => 'required',
'subscriber_id' => 'required',
]);
}
$customer = auth('customer')->user();
if ($customer->type == 'staff') {
$customer = $customer->staff;
}
$currentPlan = $customer->currentPlan();
if (isset($currentPlan->renew_date) && $currentPlan->renew_date < Carbon::now()){
return back()->with('fail', 'Your Plan has expired');
}
$user = $customer;
$device = $user->activeDevices($request->device_id)->first();
if (!$device) {
return back()->with('fail', 'Device has been removed or inactive');
}
$sent = $customer->message_logs()->where('type','sent')->whereDate('created_at', Carbon::today())->count();
$plan = $user->currentPlan();
if (($sent + count($request->to_numbers)) > $plan->daily_send_limit) {
return back()->withErrors(['message' => 'Your have extended your daily send limit']);
}
$messageFiles = [];
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 (isset($request->isSchedule)) {
$sd = Carbon::createFromTimeString($request->schedule);
$request['schedule_datetime'] = $sd;
} else {
$request['schedule_datetime'] = now();
}
$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);
}
$allToNumbers = array_unique($allToNumbers);
$request['to_numbers'] = $allToNumbers;
$request['numbers'] = json_encode(['from' => $device->id, 'to' => $allToNumbers,'subscriber_id'=>$request->subscriber_id]);
$request['type'] = 'sent';
$current_plan = $customer->currentPlan();
if (!$current_plan)
return back()->with('fail', 'Customer doesn\'t have any plan right now');
//subtracting one sms TODO:: will need to count text and sub that also calculate today send
$pre_available_sms = $current_plan->daily_send_limit;
$new_available_sms = $pre_available_sms - count($allToNumbers);
//if not enough sms then return
if ($new_available_sms < 0)
return redirect()->back()->with('fail', 'Doesn\'t have enough sms');
$selectedSimData=null;
if ($request->device_type == 'device') {
if ($device->sim_info) {
$simInfo = json_decode($device->sim_info);
foreach ($simInfo as $item) {
$simData = explode(':', $item);
if (isset($simData[1]) && $simData[1] == $request->subscriber_id) {
$selectedSimData = $item;
break;
}
}
}
if (!$selectedSimData) return redirect()->back()->with('fail', 'Invalid SIM info. Please logout from mobile App and scan the QR Code again');
}else{
$selectedSimData=$device->id;
}
DB::beginTransaction();
try {
if ($request->device_type == 'whatsapp') {
$request['subscriber_id']=0;
}
$newMessage = $customer->messages()->create($request->all());
$sms_queue = [];
foreach ($request->to_numbers as $to) {
$to=str_replace('"','',$to);
$newMessageFiles = null;
if ($messageFiles) {
$newMessageFiles = $messageFiles;
array_walk($newMessageFiles, function (&$value, $index) {
$value = asset('uploads/' . $value);
});
}
$sms_queue[] = [
'message_id' => $newMessage->id,
'subscriber_id' => $request->subscriber_id,
'sim_info' => $selectedSimData,
'from' => $device->id,
'device_unique_id' => $device->device_unique_id,
'to' => $to,
'schedule_datetime' => $request->schedule_datetime,
'body' => $request->body,
'created_at' => now(),
'updated_at' => now(),
'type' => 'sent',
'send_type' => $request->device_type == 'whatsapp'?'whatsapp':'device',
];
}
$customer->sms_queues()->createMany($sms_queue);
$customer->message_logs()->createMany($sms_queue);
DB::commit();
if (!$request->ajax()) {
return back()->with('success', 'Message queued successfully');
} else {
return response()->json(['status' => 'success', 'message' => 'Message queued successfully']);
}
} catch (\Exception $ex) {
Log::error($ex);
DB::rollBack();
return back()->with('fail', $ex->getMessage());
}
}
public function queueList(Request $request)
{
$customer = auth('customer')->user();
if ($customer->type == 'staff') {
$customer = $customer->staff;
}
$data['queuesList'] =$customer->sms_queues()->whereNotNull('schedule_datetime')->whereNull('delivered_at')->orderBy('created_at', 'desc')->paginate(10);
return view('customer.smsbox.queue', $data);
}
public function overview()
{
$user= auth('customer')->user();
if($user->type=='staff'){
$user=$user->staff;
}
$data['devices'] =$user->devices()->select('id','name','sim_info')->get();
return view('customer.smsbox.overview',$data);
}
public function overview_get_data(Request $request)
{
$user = auth('customer')->user();
if ($user->type == 'staff') {
$user = $user->staff;
}
$overview = $user->message_logs()->orderByDesc('updated_at');
if ($request->status && $request->type == 'sent'){
$overview = $overview->where('status', $request->status);
}
if ($request->type && $request->type == 'trash') {
$overview = $overview->onlyTrashed();
} else if ($request->type) {
$overview = $overview->where('type', $request->type);
}
if($request->type && $request->type=='draft'){
$overview = $overview->where('type', $request->type);
}
if ($request->from_date && $request->to_date) {
$from_date = new Carbon($request->from_date);
$to_date = new Carbon($request->to_date);
$overview = $overview->whereBetween('created_at', [$from_date, $to_date]);
}
if($request->select_device && $request->sim_name && $request->type == 'sent'){
$overview = $overview->where('from',$request->select_device)->where('sim_info',$request->sim_name);
}
if ($request->type == 'draft'){
return datatables()->of($overview)
->addColumn('updated_at', function ($q) {
return "<a href='" . route('customer.smsbox.compose', ['draft'=>$q->id]) . "'>".formatDate($q->updated_at)."</a>";
})
->addColumn('to', function ($q) {
$draftNumbers = json_decode($q->numbers)->to;
if ($draftNumbers){
$draftNumbers = json_decode($q->numbers)->to;
$count=count($draftNumbers);
$text=$count>=100?' and more '.($q->contacts()->count()-$count):'';
$draftTONumbers = "<div class='show-more' style='max-width: 500px;white-space: pre-wrap'>" . implode(", ", $draftNumbers).$text. " </div>";
}else{
$draftTONumbers = '';
}
return $draftTONumbers;
})
->addColumn('from', function ($q) {
$draftFromNumbers = json_decode($q->numbers)->from;
return $draftFromNumbers;
})
->addColumn('type', function ($q) {
$draftType = null;
return $draftType;
})
->addColumn('status', function ($q) {
$draftStatus = null;
return $draftStatus;
})
->addColumn('action', function ($q) {
return '<button class="btn btn-sm btn-danger" data-message="Are you sure you want to delete this draft?"
data-action=' . route('customer.smsbox.draft.delete', ['id'=>$q]) . '
data-input={"_method":"post"}
data-toggle="modal" data-target="#modal-confirm">Delete</button>';
})
->rawColumns(['action','updated_at','to'])
->toJson();
}else{
return datatables()->of($overview)
->addColumn('updated_at', function ($q) {
return formatDate($q->updated_at);
})
->addColumn('from', function ($q) {
if($q->type=='sent'){
return $q->send_device->full_name;
}
$name='';
$contact=Contact::where('number',$q->to)->orWhere('number', $q->from)->first();
if($contact){
$name=' ('.$contact->full_name.')';
}
return $q->from.$name;
})
->addColumn('to', function ($q) {
if($q->type=='inbox'){
return $q->received_device->full_name;
}
$name='';
$contact=Contact::where('number',$q->to)->orWhere('number', $q->to)->first();
if($contact){
$name=' ('.$contact->full_name.')';
}
return $q->to.$name;
})
->addColumn('body', function ($q) {
return "<div class='show-more' style='max-width: 500px;white-space: pre-wrap'>" .$q->body . " </div>";
})
->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','body'])
->toJson();
}
}
public function overview_data_delete(Request $request)
{
$request->validate([
'id'=>'required'
]);
$ids=explode(',', $request->id);
$user = auth('customer')->user();
if ($user->type == 'staff') {
$user = $user->staff;
}
$messageLogs=$user->message_logs()->whereIn('id',$ids)->get();
foreach($messageLogs as $log){
if($log->type=='sent'){
$user->sms_queues()->where(['message_id'=>$log->message_id,'from'=>$log->from,'to'=>$log->to,'device_unique_id'=>$log->device_unique_id])->delete();
}
}
$user->message_logs()->whereIn('id',$ids)->delete();
return back()->with('success', 'Message successfully moved to trash');
}
}
|