Viewing file: ComposeController.php (10.1 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers\Api;
use App\Events\SendMail; use App\Http\Controllers\Controller; use App\Models\AuthorizationToken; use App\Models\Contact; use App\Models\CustomerNumber; use App\Models\Report; use Illuminate\Support\Facades\Validator;
use App\Models\Customer; use App\Models\Number; use App\Models\SenderId; use App\Models\SentFail; use App\Models\WhatsAppNumber; use App\SmsProvider\SendSMS; use App\WhatsAppProvider\SendMessageProcess; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log;
class ComposeController extends Controller { public function getSenderIds(Request $request){ $authorizationToken= AuthorizationToken::where('access_token', $request->api_key)->first(); if(!$authorizationToken){ return response()->json(['response'=>'1003']); } $user=Customer::where('id', $authorizationToken->customer_id)->first(); if(!$user){ return response()->json(['response'=>'1001']); }
$senderIds= SenderId::where('customer_id', $user->id)->get(); return response()->json(['status'=>'success', 'data'=>$senderIds]); } public function sentCompose(Request $request) { $authorizationToken= AuthorizationToken::where('access_token', $request->api_key)->first(); if(!$authorizationToken){ return response()->json(['response'=>'1003']); } $customer=Customer::where('id', $authorizationToken->customer_id)->first(); if(!$customer){ return response()->json(['message'=>'Invalid Customer']); }
if ($request->from_type == 'phone_number') { $validator = Validator::make($request->all(), [ 'from_number' => 'required', 'body' => 'required', ]); if ($validator->fails()) { return response()->json(['message' => $validator->errors()->messages()], 404); } } else if ($request->from_type == 'sender_id') { $validator = Validator::make($request->all(), [ 'sender_id' => 'required', 'body' => 'required', ]); if ($validator->fails()) { return response()->json(['message' => $validator->errors()->messages()], 404); } }
$messageFiles = []; $sendFailed = []; if ($request->mms_files) {
foreach ($request->mms_files as $key => $file) { $messageFiles[] = $fileName = time() . $key . '.' . $file->extension(); $file->move(public_path('uploads/'), $fileName); } $request['message_files'] = json_encode($messageFiles); }
if (isset($request->isSchedule)) { $sd = Carbon::createFromTimeString($request->schedule); $request['schedule_datetime'] = $sd; } $allToNumbers = []; $allGroupIds = []; $allContactIds = [];
$toNumbers = explode(',', $request->to_numbers); foreach($toNumbers as $to_number){ $allToNumbers[]=$to_number; } if ($request->from_type == 'phone_number') { $customerNumber= CustomerNumber::where('customer_id', $customer->id)->where('number', $request->from_number)->orWhere('number',"+".str_replace('+','',$request->from_number))->first(); if(!$customerNumber){ return response()->json(['response' => '1005']); } $number_form = $request->from_number; } else if ($request->from_type == 'sender_id') { $sender_id = SenderId::where('sender_id', $request->sender_id)->where('status', 'approved')->first(); if(!$sender_id){ return response()->json(['response' => '1002']); } $number_form = $sender_id->sender_id; } else { $whatsAppNumber = $customer->whatsapp_numbers()->where('expire_date', '>', now())->where('number', $request->whatsapp_from_number)->first(); if (!$whatsAppNumber) { return response()->json(['response' => '1010']); } $number_form = $whatsAppNumber->number; }
$allToNumbers = array_unique($allToNumbers);
$request['to_numbers'] = $allToNumbers; $request['numbers'] = json_encode(['from' => $number_form, 'to' => $allToNumbers]); $request['type'] = 'sent';
$current_plan = $customer->plan; if (!$current_plan) return response()->json(['response' => '1017']);
$wallet = $customer->wallet()->first();
// Count Message Body $totalCount=1; $requestCharacters=$request->body; $characters=mb_strlen($requestCharacters, "UTF-8"); if (strlen($requestCharacters) != strlen(utf8_decode($requestCharacters))) { if($characters && $characters > 70){ $grandTotal=ceil($characters / 70); if($grandTotal > 1) $totalCount= $grandTotal; } }else { if($characters && $characters > 160){ $grandTotal=ceil($characters / 160); if($grandTotal > 1) $totalCount= $grandTotal; } }
$totalToNumbers= count($allToNumbers) * $totalCount; if ($wallet->credit < $totalToNumbers) { return redirect()->back()->with('fail', 'Doesn\'t have enough sms'); }
//send sms here using API if ($request->from_type == 'phone_number') { $number = Number::where('number', $number_form)->orWhere('number',"+".str_replace('+','',$number_form))->first(); } else if ($request->from_type == 'sender_id') { $number = SenderId::where('sender_id', $number_form)->first(); } else if ($request->from_type == 'whatsapp_number') { $number = WhatsAppNumber::where('number', $number_form)->orWhere('number',"+".str_replace('+','',$number_form))->first(); }
if (!$number) return response()->json(['response' => '1013'], 1018);
$plain_sms=$current_plan->plain_sms;
if ($request->from_type == 'phone_number') { $numb = $number->number; $fromType='number'; } else if ($request->from_type == 'sender_id') { $numb = $number->sender_id; $fromType='sender_id'; } else if ($request->from_type == 'whatsapp_number') { $numb = $number->number; $fromType='whatsapp'; }
// DB::beginTransaction(); try { $gateway=$number->gateway; if (!$gateway) { return response()->json(['response' => '1014']); }
$newMessage = $customer->messages()->create($request->all()); $totalCredit=$totalToNumbers * $plain_sms;
//SMS Credit Managment $wallet->credit = $wallet->credit - $totalCredit; $wallet->save();
$sms_queue = []; foreach ($allToNumbers as $to) { $newMessageFiles = null; if ($messageFiles) { $newMessageFiles = $messageFiles;
array_walk($newMessageFiles, function (&$value, $index) { $value = asset('uploads/' . $value); }); } if($request->from_type=='whatsapp_number'){ $to = 'whatsapp:'.$to; } $sms_queue[] = [ 'message_id' => $newMessage->id, 'from' => $numb, 'to' => $to, 'from_type' => $fromType, 'schedule_datetime' => $request->schedule_datetime?$request->schedule_datetime:now(), 'body' => $request->body, 'dynamic_gateway_id' => $gateway->id, 'created_at' => now(), 'updated_at' => now(), 'type' => 'sent', 'staff_id' => $customer->id, ]; } $customer->sms_queues()->createMany($sms_queue); $customer->message_logs()->createMany($sms_queue);
if (!isset($request->isSchedule)) { $failedNumber = collect($sendFailed)->pluck('to_number'); // Send Mail try { $contacts = Contact::whereIn('number', $allToNumbers)->whereNotIn('number', $failedNumber)->get(); foreach ($contacts as $contact) { if ($contact->email && $contact->email_notification == 'true') { SendMail::dispatch($contact->email, 'New Message', $request->body); } }
} catch (\Exception $ex) { Log::error($ex->getMessage()); } }
if ($sendFailed) { SentFail::insert($sendFailed); $totalFailedMessages=count($sendFailed) * $totalCount;
if ($request->from_type == 'phone_number') { $wallet->non_masking_credit = $wallet->non_masking_credit + $totalFailedMessages; $wallet->save(); } else if ($request->from_type == 'sender_id') { $wallet->masking_credit = $wallet->masking_credit + $totalFailedMessages; $wallet->save(); }
}
// DB::commit(); if (!$request->ajax()) { if ($sendFailed) return response()->json(['response'=> '1015']); else return response()->json(['response'=> '1016']); } else { if ($sendFailed) return response()->json(['response' => '1015']); else return response()->json(['response' => '1016']); } } catch (\Exception $ex) { Log::error($ex); // DB::rollBack(); return response()->json(['status' => 'failed', 'message' => $ex->getMessage()]); } } }
|