157 lines
4.8 KiB
PHP
157 lines
4.8 KiB
PHP
<?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
|
|
]);
|
|
}
|
|
}
|