You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

162 lines
6.9 KiB

<?php
namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use App\Models\Order;
use App\Models\Subscription;
use App\Models\SubscriptionLog;
use App\Models\SubscriptionPause;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use App\CentralLogics\Helpers;
class OrderSubscriptionController extends Controller
{
public function index(Request $request)
{
$limit = $request->query('limit', 10);
$offset = $request->query('off$offset', 1);
$paginator = Order::with(['restaurant','subscription'])->withCount('details')->whereHas('subscription')->where('user_id', $request->user()->id)->latest()->paginate($limit, ['*'], 'page', $offset);
$data = [
'total_size' => $paginator->total(),
'limit' => $limit,
'offset' => $offset,
'orders' => array_map(function ($data) {
$data['delivery_address'] = $data['delivery_address'] ? json_decode($data['delivery_address']) : $data['delivery_address'];
$data['restaurant'] = $data['restaurant'] ? Helpers::restaurant_data_formatting($data['restaurant']) : $data['restaurant'];
return $data;
}, $paginator->items())
];
return response()->json($data);
}
public function show(Request $request, $id, $tab = null)
{
$limit = $request->query('limit', 10);
$offset = $request->query('off$offset', 1);
switch($tab){
case 'delivery-log':
$paginator = SubscriptionLog::where('subscription_id', $id)->paginate($limit, ['*'], 'page', $offset);
$data = [
'total_size' => $paginator->total(),
'limit' => $limit,
'offset' => $offset,
'data' => $paginator->items()
];
break;
case 'pause-log':
$paginator = SubscriptionPause::where('subscription_id', $id)->paginate($limit, ['*'], 'page', $offset);
$data = [
'total_size' => $paginator->total(),
'limit' => $limit,
'offset' => $offset,
'data' => $paginator->items()
];
break;
default:
$subscription = Subscription::with(['restaurant','order','schedules'])->findOrFail($id);
$data = $subscription->toArray();
$data['restaurant'] = $subscription->restaurant ? Helpers::restaurant_data_formatting($subscription->restaurant) : null;
$data['order'] = $subscription->order ? Helpers::order_data_formatting($subscription->order) : null;
}
return response()->json($data);
}
public function edit(Subscription $subscription)
{
return response()->json($subscription);
}
public function update(Request $request, Subscription $subscription)
{
$validator = Validator::make($request->all(), [
'status' => 'required|in:paused,canceled',
'start_date' => 'required_if:status,paused|nullable|date|after_or_equal:today',
'end_date' => 'required_if:status,paused|nullable|date|after_or_equal:start_date',
'cancellation_reason'=>'required_if:status,canceled'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
DB::beginTransaction();
try{
if($request->status == 'paused'){
$pc = Subscription::checkDate($request->start_date, $request->end_date)->whereDoesntHave('pause', function($query)use($request){
$query->checkDate($request->start_date, $request->end_date);
})->whereId( $subscription->id)->count();
if(!$pc)
{
return response()->json(['errors' => [['code'=>'overlaped', 'message'=>translate('messages.subscription_pause_log_overlap_warning')]]], 403);
}
$subscription->pause()->updateOrInsert(['from'=>$request->start_date, 'subscription_id'=>$subscription->id],['to'=>$request->end_date]);
}
elseif ($request->status == 'canceled' && isset($subscription->order)) {
$subscription->order()->update([
'order_status' => $request->status,
'canceled' => now(),
'cancellation_note' => $request->note ?? null,
'cancellation_reason' => $request->cancellation_reason ?? null,
'canceled_by' => 'customer',
]);
if($subscription->log){
$subscription->log()->update([
'order_status' => $request->status,
'canceled' => now(),
]);
}
$subscription->status = $request->status;
}
elseif ($request->status == 'active' && isset($subscription->order)) {
$subscription->order()->update([
'order_status' => 'pending',
'canceled' => null,
'pending' => now(),
]);
$subscription->status = $request->status;
}
else {
$subscription->status = $request->status;
}
$subscription->save();
DB::commit();
return response()->json(translate('messages.subscription_updated_successfully'), 200);
}catch(Exception $ex){
DB::rollBack();
info($ex);
return response()->json(['errors' => [['code'=>$ex->getCode(), 'message'=>$ex->getMessage()]]], 403);
}
return response()->json(['errors' => [['code'=>'unknown-error', 'message'=>translate('messages.failed_updated_subscription')]]], 500);
}
public function update_schedule(Request $request, Subscription $subscription)
{
$validator = Validator::make($request->all(), [
'day' => 'nullable|integer',
'time' => 'required'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
try{
$subscription->schedules()->updateOrInsert(['day'=>$request->day, 'subscription_id'=>$subscription->id],['time'=>$request->time]);
return response()->json(translate('messages.subscription_schedule_updated_successfully'), 200);
}catch(Exception $ex){
info($ex);
return response()->json(['errors' => [['code'=>$ex->getCode(), 'message'=>$ex->getMessage()]]], 403);
}
return response()->json(['errors' => [['code'=>'unknown-error', 'message'=>translate('messages.failed_updated_subscription_schedule')]]], 500);
}
}