Viewing file: ComposeController.php (12.24 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 Illuminate\Support\Facades\Validator;
use App\Models\CreditHistory;
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)->firstOrFail();
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(), [
'from_number' => '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)->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();
$preMaskingCredit = $wallet->masking_credit;
$preNonMaskingCredit = $wallet->non_masking_credit;
// 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 ($request->from_type == 'phone_number' && $wallet->non_masking_credit < $totalToNumbers) {
return response()->json(['response'=> '1011']);
}else if($request->from_type=='sender_id' && $wallet->masking_credit < $totalToNumbers){
return response()->json(['response'=> '1012']);
}
//send sms here using API
if ($request->from_type == 'phone_number') {
$number = Number::where('number', $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)->first();
}
if (!$number)
return response()->json(['response' => '1013'], 1018);
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->from;
$gatewaySetting = get_settings($gateway);
if (!$gatewaySetting) {
return response()->json(['response' => '1014']);
}
$newMessage = $customer->messages()->create($request->all());
$creditHistory= new CreditHistory();
$creditHistory->credit='-'.$totalToNumbers;
$creditHistory->user_id= $customer->id;
$creditHistory->ref_id=$newMessage->id;
$creditHistory->ref='Credit Minus for sending message';
$creditHistory->save();
if ($request->from_type == 'phone_number') {
$wallet->non_masking_credit = $preNonMaskingCredit - $totalToNumbers;
$wallet->save();
} else if ($request->from_type == 'sender_id') {
$wallet->masking_credit = $preMaskingCredit - $totalToNumbers;
$wallet->save();
}
// dd($totalToNumbers, $preNonMaskingCredit, $wallet);
if (!isset($request->isSchedule)) {
if ($request->from_type == 'phone_number' || $request->from_type == 'sender_id') {
$sendSMS = new SendSMS();
$sendSMS->setProvider($gateway)
->setMessage($newMessage)
->setTo($request->to_numbers)
->setFrom($numb)
->setBody($request->body)
->process();
$sendFailed = $sendSMS->get_failed_sms();
} else if ($request->from_type == 'whatsapp_number') {
$gateway = 'whatsapp_' . $gateway;
$whatsAppMessage = new SendMessageProcess();
$whatsAppMessage->setProvider($gateway)
->setTo($request->to_numbers)
->setFrom($numb)
->setMessage($newMessage)
->process();
}
} else {
$sms_queue = [];
foreach ($request->to_numbers 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,
'schedule_datetime' => $request->schedule_datetime,
'body' => $request->body,
'from_type' => $fromType,
'created_at' => now(),
'updated_at' => now(),
'type' => 'sent',
];
}
$customer->messages()->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();
}
$creditHistory= new CreditHistory();
$creditHistory->credit='+'.$totalToNumbers;
$creditHistory->user_id=$customer->id;
$creditHistory->ref_id=$newMessage->id;
$creditHistory->ref='Credit Plus for sent failed message';
$creditHistory->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()]);
}
}
}
|