ManagementSystem/BACKEND/Modules/Admin/app/Http/Controllers/OrderController.php

157 lines
4.8 KiB
PHP
Executable File

<?php
namespace Modules\Admin\app\Http\Controllers;
use App\Events\PaymentCanceled;
use App\Events\PaymentCompleted;
use App\Http\Controllers\Controller;
use App\Models\Client;
use App\Models\Order;
use App\Models\Package;
use App\Traits\HasFilterRequest;
use App\Traits\HasOrderByRequest;
use Illuminate\Http\Request;
use JsonException;
use Modules\Admin\app\Http\Requests\OrderRequest;
use Modules\Admin\app\Models\Discount;
use Modules\Paypal\app\Models\HistoryPayment;
class OrderController extends Controller
{
use HasOrderByRequest;
use HasFilterRequest;
const ORDER_STATUS_COMPLETE = 'COMPLETED';
const ORDER_STATUS_PENDING = 'PENDING';
const ORDER_STATUS_CANCEL = 'CANCELED';
public function __construct()
{
// module check model exist and table
if (!class_exists(Order::class)) {
throw new JsonException("Order table not exist" );
}
;
}
public function get(Request $request)
{
$order = Order::getOrdersWithDiscountAndPackage();
// Order by
$this->orderByRequest($order, $request);
// Filter
$this->filterRequest(
builder: $order,
request: $request,
filterKeys: [
'payment_id' => self::F_TEXT,
'discount' => self::F_TEXT,
'email' => [
'type' => self::F_TEXT,
'column' => 'users.email'
],
'status' => [
'type' => self::F_NOT_CONTAIN,
'column' => 'orders.status'
],
'from_date' => [
'type' => self::F_THAN_EQ_DATETIME,
'column' => 'orders.created_at'
],
'to_date' => [
'type' => self::F_LESS_EQ_DATETIME,
'column' => 'orders.created_at'
],
]
);
$responseData = array_merge(
$order->paginate($request->get('per_page'))->toArray(),
['status' => true]
);
return response()->json($responseData);
}
public function update(OrderRequest $request)
{
$id = $request->input('id');
$order = Order::find($id);
$client = Client::find($order['user_id']);
$package = Package::find($order['package_id']);
$order['status'] = $request->input('status');
if ($request->input('status') == self::ORDER_STATUS_COMPLETE) {
if ($order['discount']) {
// Update discount
$discount = Discount::where('code', $order['discount'])->first();
if ($discount != null) {
$discount['user_id'] = $client->id;
$discount['email'] = $client->email;
$discount['date_used'] = now();
$discount->save();
}
}
// Update point for client
$client->point += (int) $order['point'];
}
$status = -1;
if ($request->input('status') == self::ORDER_STATUS_COMPLETE) {
$status = 1;
event(
new PaymentCompleted(
payment_id: $order['payment_id'],
email: $client->email,
name: $client->name,
type: "PAYPAL",
product_name: $package->title,
point: $order->point,
discount_value: view_price((float) $package->price - (float) $order['total_price']),
total_price: $package->price
)
);
} elseif ($request->input('status') == self::ORDER_STATUS_CANCEL) {
$status = 0;
if ($order['discount']) {
$discount = Discount::where('code', $order['discount'])->first();
$discount['status'] = 1;
$discount->save();
}
event(
new PaymentCanceled(
payment_id: $order['payment_id'],
email: $client->email,
name: $client->name
)
);
} else {
$status = 2;
}
// Create history
HistoryPayment::create([
'payment_id' => $order['payment_id'],
'status' => $status,
'payload' => $request->all(),
'response' =>
[
'order' => $order,
'client' => $client,
'discount' => $discount ?? [],
'message' => "Change by Admin"
]
]);
$order->save();
$client->save();
return response()->json([
'data' => $order,
'status' => true
]);
}
}