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