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


Viewing file:     CampaignController.php (40.98 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php

namespace App\Http\Controllers\Customer;

use 
App\Export\DuplicateInvalidExport;
use 
App\Http\Controllers\Controller;
use 
App\Imports\CampaignContactsImport;
use 
App\Imports\DuplicateChecks;
use 
App\Jobs\CampaignCreateJob;
use 
App\Models\AssignStaffContact;
use 
App\Models\Campaign;
use 
App\Models\CampaignStaff;
use 
App\Models\Coverage;
use 
App\Models\Customer;
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\ShortLink;
use 
App\Models\ShortLinkOverView;
use 
App\Models\SmsQueue;
use 
App\Models\SmsTemplate;
use 
Illuminate\Http\Request;
use 
Illuminate\Support\Carbon;
use 
Illuminate\Support\Facades\DB;
use 
Illuminate\Support\Facades\Log;
use 
Illuminate\Support\Facades\Storage;
use 
Illuminate\Support\Str;
use 
Maatwebsite\Excel\Concerns\ToCollection;
use 
Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
use 
Maatwebsite\Excel\Facades\Excel;

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->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()
    {
        
$campaings auth('customer')->user()->campaings()->where('is_dynamic''no')->where('is_dlt''no')->withCount(['sms_queue''total_processed'])->orderByDesc('id');
        return 
datatables()->of($campaings)
            ->
addColumn('title', function ($q) {
                
$title $q->title;
                if (
$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" style="cursor:default" class="btn btn-sm btn-success">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 data-id='" $q->id "' class='importing'> <i class=\"fas fa-spinner fa-pulse\"></i> importing</span>";
                } else if (
$q->status == 'completed') {
                    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 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) {
                
$report '<a href="' route('customer.campaign.overview', [$q->id]) . '" class="btn light btn-sm btn-success mr-2" title="Statistic"><i class="fa fa-eye"></i></a>';
                return 
$report '<a href="' route('customer.campaign.statistic', [$q->id]) . '" target="_blank" class="btn light btn-sm btn-info mr-2" title="Statistic"><i class="fa fa-file"></i></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" title="Delete"><i class="fa fa-trash"></i></button>'
;
            })->
rawColumns(['title''action''status'])->toJson();
    }


    public function 
overview($id)
    {
        
$campaign Campaign::where('id'$id)->firstOrFail();
        
$short_link_ids ShortLink::where('customer_id'auth('customer')->user()->id)->where('campaign_id'$campaign->id)->pluck('id');
        
$short_links ShortLink::where('customer_id'auth('customer')->user()->id)->where('campaign_id'$campaign->id)->get();

        
$data['total_contact'] = SmsQueue::where('campaign_id'$campaign->id)->count();
        
$data['overviews'] = ShortLinkOverView::whereIn('short_link_id'$short_link_ids)->orderByDesc('created_at')->with('contact')->get();
        
$data['short_links'] = $short_links;
        
$data['campaign_id'] = $id;

        return 
view('customer.campaign.overview'$data);
    }

    public function 
getUrlResult(Request $request)
    {
        if (!
$request->id || !$request->campaign_id) {
            return 
response()->json(['status' => 'failed']);
        }

        
$short_link ShortLink::where('customer_id'auth('customer')->user()->id)->where('campaign_id'$request->campaign_id)->where('id'$request->id)->first();
        if (!
$short_link) {
            return 
response()->json(['status' => 'failed']);
        }
        
$clicked ShortLinkOverView::where('short_link_id'$short_link->id)->count();

        return 
response()->json(['status' => 'success''clicked' => $clicked]);
    }

    public function 
allSenders(Request $request)
    {
        
$customer auth('customer')->user();

        
$fromGroups $customer->from_groups()->where('type'$request->type)->get();
        
$numbers $customer->numbers()->where('expire_date','>'now());
        if (
$request->from_selected_type == 'sms') {
            
$numbers->where('sms_capability''yes');
        } else if (
$request->from_selected_type == 'mms') {
            
$numbers->where('mms_capability''yes');
        } else if (
$request->from_selected_type == 'whatsapp') {
            
$numbers->where('whatsapp_capability''yes');
        } else if (
$request->from_selected_type == 'voicecall') {
            
$numbers->where('voice_capability''yes');
        }

        
$numbers $numbers->get();
        
$usersFormGroups = [];
        
$usersFormNumbers = [];
        if (
$request->from_selected_type != 'mms') {
            foreach (
$fromGroups as $group) {
                
$usersFormGroups[] = ['value' => $group->name'id' => $group->id'type' => 'group'];
            }
        }
        if (
$request->type != 'sender_id') {
            foreach (
$numbers as $key => $number) {
                
$usersFormNumbers[] = ['number' => $number->number'type' => 'from'];
            }
        }

        if (
$request->type == 'sender_id') {
            
$senderIds $customer->sender_ids->where('is_dlt','no')->where('expire_date','>'now());
            foreach (
$senderIds as $senderId) {
                
$usersFormNumbers[] = ['number' => $senderId->sender_id'id' => $senderId->id'type' => 'from'];
            }
        }


        return 
response()->json(['number' => $usersFormNumbers'groups' => $usersFormGroups'status' => 'success']);
    }

    public function 
create()
    {
        
$customer auth('customer')->user();
        
$current_plan $customer->plan;
        if (!
$current_plan)
            return 
back()->withErrors(['failed' => trans('customer.messages.empty_plan')]);

        
$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;

        
$usersFormGroups = [];
        
$usersFormNumbers = [];
        
$from_groups $customer->from_groups()->where('type''number')->get();
        foreach (
$from_groups as $group) {
            
$usersFormGroups[] = ['number' => $group->name'id' => $group->id'type' => 'group'];
        }
        
$all_numbers $customer->numbers()->where('sms_capability''yes')->get();
        foreach (
$all_numbers as $key => $number) {
            
$usersFormNumbers[] = ['number' => $number->number'type' => 'from'];
        }

        
$usersFormSenderIdGroups = [];
        
$usersFormSenders = [];
        
$from_groups $customer->from_groups()->where('type''sender_id')->get();
        foreach (
$from_groups as $group) {
            
$usersFormSenderIdGroups[] = ['number' => $group->name'id' => $group->id'type' => 'group'];
        }
        
$all_senders $customer->numbers()->where('sms_capability''yes')->get();
        foreach (
$all_senders as $key => $number) {
            
$usersFormSenders[] = ['number' => $number->sender_id'id' => $number->id'type' => 'from'];
        }

        
$data['users_from_groups'] = $usersFormGroups;
        
$data['users_from_number'] = $usersFormNumbers;

        
$data['senderid_from_groups'] = $usersFormSenderIdGroups;
        
$data['from_sender_ids'] = $usersFormSenders;
        
$data['plain_sms'] = $current_plan->plain_sms intval($current_plan->plain_sms'0') : 1;
        
$data['staffs'] = Customer::where('admin_id'auth('customer')->user()->id)->where('type''staff')->get();
        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 
get_from_numbers(Request $request)
    {
        
$customer auth('customer')->user();
        if (
$request->type == 'sms') {
            
$type 'number';
        } else if (
$request->type == 'mms') {
            
$type 'mms';
        } else if (
$request->type == 'whatsapp') {
            
$type 'whatsapp';
        } else if (
$request->type == 'voicecall') {
            
$type 'voicecall';
        }

        if (!
$type) {
            return 
response()->json(['status' => 'failed''message' => 'Invalid type']);
        }
        
$groups $customer->from_groups()->where('type'$type)->get();
        
$numbers $customer->numbers();

        if (
$request->type == 'sms') {
            
$numbers $numbers->where('sms_capability''yes');
        }
        if (
$request->type == 'mms') {
            
$numbers $numbers->where('mms_capability''yes');
        }
        if (
$request->type == 'whatsapp') {
            
$numbers $numbers->where('whatsapp_capability''yes');
        }
        if (
$request->type == 'voicecall') {
            
$numbers $numbers->where('voice_capability''yes');
        }

        
$numbers $numbers->get();

        
$usersFormGroups = [];
        
$usersFormNumbers = [];
        foreach (
$groups 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(['numbers' => $usersFormNumbers'groups' => $usersFormGroups'status' => 'success']);
    }

    public function 
store(Request $request)
    {
        
DB::beginTransaction();
        try {

            if (
env("APP_DEMO")) {
                return 
redirect()->back()->withErrors(['msg' => trans('admin.app_demo_message')]);
            }

            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;
            }
            
            if (
$request->start_time $request->end_time) {
                return 
back()->withErrors(['failed' => trans('The start time must be earlier than the end time.')]);
            }
            if (
$request->start_date $request->end_date) {
                return 
back()->withErrors(['failed' => trans('The start date must be earlier than the end date.')]);
            }
            
            if (!isset(
$request->regenerate)) {
                
$request->validate([
                    
'title' => 'required',
                    
'start_date' => 'required',
                    
'template_body' => 'required',
                    
'end_date' => 'required',
                    
'start_time' => 'required',
                    
'end_time' => 'required',
                ]);
            }
            if (
$request->customer_id) {
                
$customer Customer::findOrFail($request->customer_id);
            } else {
                
$customer auth('customer')->user();
            }


            
$current_plan $customer->plan;
            if (!
$current_plan)
                return 
back()->withErrors(['failed' => trans('customer.messages.empty_plan')]);

            if (
$current_plan->unlimited_sms_send == 'no') {
                
$sendlimit_expire $current_plan->created_at->addMonths(1);
                
$total_sms_queue auth('customer')->user()->sms_queues()->whereBetween('created_at', [$current_plan->created_at$sendlimit_expire])->count();

                if (
$sendlimit_expire now()) {
                    return 
redirect()->route('customer.billing.index')->withErrors(['failed' => trans('customer.messages.sms_limit_expired')]);
                }
                if (
$current_plan->sms_sending_limit <= $total_sms_queue) {
                    return 
redirect()->route('customer.billing.index')->withErrors(['failed' => trans('admin.messages.sms_limit_ended')]);
                }
            }

            
$coverages Coverage::whereIn('id'json_decode($current_plan->coverage_ids))->get();


            
$coverage_rate = [];
            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;
                    }
                }
            }


            if (!
$request->regenerate) {
                
$to = [];
            }

            
$totalTo = [];
            
$totalSmsAmount 0;

            if (
$request->recipient_type == 'group') {
                
$totalGroups Group::whereIn('id'$request->groups)->get();
                
$totalTo = [];
                
$totalSmsAmount 0;
                
$findStaffContactNumber = [];

                foreach (
$totalGroups as $gContacts) {
                    foreach (
$gContacts->contacts as $contact) {
                        if (isset(
$coverage_rate[str_replace('+'''$contact->contact->contact_dial_code)])) {
                            
$totalTo[] = $contact->contact->contact_dial_code $contact->contact->number;
                            
$totalSmsAmount $totalSmsAmount $coverage_rate[str_replace('+'''$contact->contact->contact_dial_code)];
                            
$findStaffContactNumber[$contact->contact->number] = $contact->contact->id;
                        }
                    }
                }

            } else if (
$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) {
                    
$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' => auth('customer')->user()->id,
                            
'contact_dial_code' => $number_code,
                            
'number' => $number_without_code
                        
];
                    }
                }

                if (!
$insertContact || count($insertContact) <= 0) {
                    return 
redirect()->back()->withErrors(['failed' => trans('customer.messages.coverage_not_match')]);
                }

                if (
$insertContact) {
                    
$customer->contacts()->createMany($insertContact);
                }
            }

            if (
$request->recipient_type != 'import_xls') {
                
$totalTo array_unique($totalTo);

                if (
count($totalTo) <= 0) {
                    return 
redirect()->back()->withErrors(['failed' => trans('customer.messages.select_one_group')]);
                }
                
$onException Exception::where('customer_id'auth('customer')->id())->whereIn('number'$totalTo)->pluck('number')->toArray();
                
$to array_values(array_diff($totalTo$onException));

            } else if (!isset(
$request->regenerate)) {

            }

            if (isset(
$request->regenerate)) {
                
$onException Exception::where('customer_id'auth('customer')->id())->whereIn('number'$totalTo)->pluck('number')->toArray();
                
$to array_values(array_diff($totalTo$onException));
                if (
count($to) <= 0) {
                    return 
redirect()->back()->withErrors(['failed' => trans('customer.messages.unavailable_to_numbers')]);
                }
            }
            
//subtracting one sms TODO:: will need to count text and sub that
            
$wallet auth('customer')->user()->wallet()->first();


            
// Count Template Body Characters
            
$totalCount 1;
//            $requestCharacters=implode('',$request->template_body);
            
$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 = ($totalSmsAmount $totalCount);

            if (
$current_plan) {
                if (
$wallet->credit $totalToNumbers) {
                    return 
redirect()->back()->withErrors(['failed'=> trans('customer.messages.not_enough_sms')])->withInput();
                }
            }


            
$allGroupIds = [];
            
$allFromNumber = [];


            if (!isset(
$request->regenerate)) {
                if (
$request->type == 'number') {
                    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;
                        }
                    }
                    
$allNumbers Number::whereIn('number'$allFromNumber)->get();

                    
$find_gateway_id = [];
                    foreach (
$allNumbers as $from_gateway) {
                        
$find_gateway_id[$from_gateway->number] = $from_gateway->dynamic_gateway_id;
                    }

                } else if (
$request->type == 'sender_id') {
                    
$allFromSenderIds = [];
                    foreach (
$request->from_number as $item) {
                        
$number = (array)json_decode($item);
                        if (isset(
$number['type'])) {
                            if (
$number['type'] == 'from') {
                                
$allFromSenderIds[] = $number['id'];
                            } elseif (
$number['type'] == 'group') {
                                
$allGroupIds[] = $number['id'];
                            }
                        }
                    }

                    
$senderIds SenderId::whereIn('id'$allFromSenderIds)->get();
                    foreach (
$senderIds as $senderid) {
                        
$allFromNumber[] = $senderid->sender_id;
                    }
                    
$allNumbers $allFromNumber;

                    
$find_gateway_id = [];
                    foreach (
$senderIds as $from_gateway) {
                        
$find_gateway_id[$from_gateway->sender_id] = $from_gateway->dynamic_gateway_id;
                    }
                } else {
                    
$allFromNumber = [$request->whatsapp_from_number];
                }
            } else {
                
$allFromNumber $request->pre_generated_from;
                
$find_gateway_id $request->find_gateway_id;
            }

            
$voice_obj = [];
            if (
$request->language && $request->voice_type) {
                
$voice_obj = [
                    
'language' => $request->language,
                    
'voice_type' => $request->voice_type
                
];
            }


            
$allFromNumber array_values(array_unique($allFromNumber));
            
$from $allFromNumber;

            if (!isset(
$request->campaign_id)) {
                
$s_date=Carbon::parse($request->start_date);
                
$e_date=Carbon::parse($request->end_date);

                
$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 $s_date->format('Y/m/d');
                
$campaign->end_date $e_date->format('Y/m/d');
                
$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();


                
//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($originalLinkroute('shorten.url', [$code'c' => 'contact__id']), $request->template_body);
                    }
                }


                if (
$request->staff_ids) {
                    
$campaign_staffs = [];
                    foreach (
$request->staff_ids as $staff_id) {
                        
$campaign_staffs[] = [
                            
'campaign_id' => $campaign->id,
                            
'customer_id' => $customer->id,
                            
'staff_id' => $staff_id,
                            
'created_at' => now(),
                            
'updated_at' => now()
                        ];
                    }
                    
CampaignStaff::insert($campaign_staffs);

                    
$genStaffContacts = [];
                    for (
$i 0$i count($to); $i += count($request->staff_ids)) {
                        for (
$j 0$j count($request->staff_ids); $j++) {
                            if (isset(
$to[$i $j])) {
                                
$genStaffContacts[$request->staff_ids[$j]][] = trim($to[$i $j]);
                            }
                        }
                    }
                    if (
$genStaffContacts) {
                        foreach (
$genStaffContacts as $key => $genStaff) {
                            foreach (
$genStaff as $contact) {
                                if (isset(
$findStaffContactNumber[getPhoneNumberWithoutDialCode($contact)])) {
                                    
$new_staff_contact = new AssignStaffContact();
                                    
$new_staff_contact->customer_id auth('customer')->user()->id;
                                    
$new_staff_contact->staff_id $key;
                                    
$new_staff_contact->contact_id $findStaffContactNumber[getPhoneNumberWithoutDialCode($contact)];
                                    
$new_staff_contact->campaign_id $campaign->id;
                                    
$new_staff_contact->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;
            }


            
$totalSmsCredit $totalToNumbers;
            if (
$request->recipient_type != 'import_xls' && !isset($request->regenerate)) {
                if (
$current_plan) {
                    
$wallet->credit $wallet->credit $totalSmsCredit;
                    
$wallet->save();
                }
            } else if (isset(
$request->regenerate)) {
                if (
$current_plan) {
                    
$wallet->credit $wallet->credit $totalSmsCredit;
                    
$wallet->save();
                }
            }

            
$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++;
                    }
                }
            }

            
$messageFiles = [];
            if (
$request->message_files) {
                foreach (
$request->message_files as $key => $file) {
                    
$messageFiles[] = $fileName time() . $key '.' $file->extension();
                    
$file->move(public_path('uploads/'), $fileName);
                }
            }

            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$find_gateway_id$request->template_body$request->start_date$request->end_date$request->start_time$request->end_time), $file_url);
                    } catch (
\Exception $ex) {
                        
DB::rollBack();
                        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) {
                    
$dynamic_gateway_id = isset($find_gateway_id[$key]) ? $find_gateway_id[$key] : '';
                    if (
$dynamic_gateway_id) {
                        
/*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->message_files json_encode($messageFiles);
                        
$newMessage->sender_type $request->from_selected_type;
                        
$newMessage->type 'sent';
                        
$newMessage->read 'no';
                        
$newMessage->voice_obj json_encode($voice_obj);
                        
$newMessage->save();

                        
$others=[
                            
'dynamic_gateway_id'=>$dynamic_gateway_id
                        
];
                        
CampaignCreateJob::dispatch($key$toNumbers$campaign$newMessage$totalToNumbersCount$totalFromNumbersCount$difference_date$startDate$startTime$send_speed$customer$lastKey$others);
                    }
                }
            }

            
DB::commit();
            return 
redirect()->route('customer.campaign.index')->with('success'trans('customer.messages.campaign_created'));
        } catch (
\Exception $ex) {
            
DB::rollBack();
            return 
redirect()->back()->withErrors(['failed' => $ex->getMessage()]);
        }

    }


    function 
generateShortCode($url)
    {
        
$rand_length = ['5''6''7''8''10''11''12''13''14''15''17''19''20''22''25'];
        
$rand_length_key array_rand($rand_length);
        
$rand_length $rand_length[$rand_length_key];

        
$hash md5($url);
        
// Extract a portion of the hash as the short code
        
$shortCode substr($hash0$rand_length);
        return 
$shortCode;
    }

    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'trans('customer.messages.campaign_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();

        
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'trans('customer.messages.campiagn_status_changed'));

    }

    public function 
statistic($id)
    {
        
$customer auth('customer')->user();
        
$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['totalSms'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->count();
        
$data['totalDeliveredSms'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->where('status''!=''failed')->where('schedule_completed''yes')->whereColumn('created_at''<''updated_at')->count();
        
$data['totalFailedSms'] = $customer->sms_queues()->where('campaign_id'$campaign->id)->where('schedule_completed''yes')->where('status''failed')->count();


        return 
view('customer.campaign.statistic'$data);
    }

    public function 
checkImportStatus(Request $request)
    {
        
$request_ids json_decode($request->ids);
        if (!
$request_ids || count($request_ids) <= 0) {
            return 
response()->json(['status' => 'failed']);
        }
        
$hasChanged auth('customer')->user()->campaings()->whereIn('id'$request_ids)->where('status''running')->count();

        return 
response()->json(['status' => 'success''data' => $hasChanged]);
    }

    public function 
checkDuplicates(Request $request)
    {
        
$result = [];
        if (
$request->isMethod('post') && $request->hasFile('import_xls')) {
            
$randomId Str::random(16);
            
$import = new DuplicateChecks();
            
$data Excel::toCollection($import$request->file('import_xls'))[0];


            
$data $data->map(function ($item) {
                return 
array_slice($item->toArray(), 011);
            });


            
$duplicates $data->duplicates('number');
            
$invalidNumbers $data->filter(function ($entry) {
                if(isset(
$entry['number'])) {
                    
$number strlen($entry['number']);
                    return 
$number 10 || $number 12;
                }
            });
            
$invalidNumbers=$invalidNumbers->pluck('number');

            
$duplicatesArray $duplicates->merge($invalidNumbers);

            
$result['count'] = $duplicatesArray->count();
            
$result['file'] = $randomId;

            
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' => trans('customer.messages.file_not_exist_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.0073 ]--