Файловый менеджер - Редактировать - /home/clickysoft/public_html/jmapi5.clickysoft.net/app/Http/Controllers/Api/V1/User/OrderApiController.php
Назад
<?php namespace App\Http\Controllers\Api\V1\User; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\User\AddOrderPaymentRequest; use App\Http\Requests\User\StoreOrderRequest; use App\Http\Resources\User\OrderRepeatResource; use App\Http\Resources\User\OrderResource; use App\Http\Resources\User\OrderUserInfoResource; use App\Mail\InvoicePaidAdminMail; use App\Mail\OrderCancelAdminMail; use App\Models\Coupon; use App\Models\Order; use App\Models\SiteSetting; use App\Models\Status; use App\Notifications\InvoicePaidUserNotification; use App\Notifications\OrderCancelUserNotification; use App\Notifications\OrderPlacedNotification; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Symfony\Component\HttpFoundation\Response; class OrderApiController extends Controller { use MediaUploadingTrait; public function index(Request $request) { $orders = Order::when($order_number = $request->get('order_number'), function ($query) use ($order_number) { $query->where('order_number', 'LIKE', '%'.$order_number.'%'); })->when($status_id = $request->get('status_id'), function ($query) use ($status_id){ $query->where('current_status_id', $status_id); })->when($order_type = $request->get('order_type'), function ($query) use ($order_type){ $query->where('order_type', $order_type); })->when($request->filled('payment_status'), function ($query) use ($request){ $query->where('payment_status', $request->payment_status); })->when($request->filled('payment_type'), function ($query) use ($request){ $query->where('payment_type', $request->payment_type); })->when($request->filled('rush_order'), function ($query) use ($request){ $query->where('rush_order', $request->rush_order); }) ->where([ 'user_id' => auth()->id(), 'deleted_by_user' => 0, 'order_type' => 'Order', ])->orderBy('id', 'DESC')->get(); OrderResource::withoutWrapping(); return OrderResource::collection($orders); } public function cancelOrder(Request $request, Order $order) { $request->validate([ 'notes' => 'nullable|string|max:300', ]); if ($order->current_status?->name == 'In Production'){ return response() ->json([ 'message' => "Can not cancel order.", 'errors' => ["error" => ["Can not cancel order once in production."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } $status = Status::where('name', 'Order Cancelled')->first(); if ($order->current_status_id == $status->id) { return response() ->json([ 'message' => "Can not cancel order.", 'errors' => ["error" => ["This order has already been cancelled."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } $order->current_status_id = $status->id; $order->save(); $order->statuses()->attach($status->id, ['notes' => $request->get('notes'), 'user_id' => auth()->id()]); $order->deletePurchaseOrderItem(); // Delete order from pending purchase order list //Send Email to user and admin for order cancellation $data = [ 'customer_name' => auth()->user()->name, 'order_number' => $order->order_number, ]; try { $order->user->notify((new OrderCancelUserNotification($data))->delay(now()->addSeconds(5))); $admin_email = SiteSetting::where('key', 'Notification Email')->first(); Mail::to($admin_email->value)->later(now()->addSeconds(10),new OrderCancelAdminMail($data)); }catch (\Exception $e){ Log::info('Mail Error => Sending Order Status Mail Admin & User :'.$order->order_number); Log::info($e->getMessage()); } return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function orderRepeat(Order $order) { return new OrderRepeatResource($order->load(['items'])); } public function store(StoreOrderRequest $request) { $orderObj = new Order(); $order_totals = $orderObj->getOrderTotals($request); $charge_response = null; $charged_successfully = false; if ($request->get('payment_type') == 'Credit Card') { //Charge via vault_id if we are receiving vault_id if($request->get('vault_id')) { //Charge customer using vault it just created. $charge_response = chargeByVaultId( $request->get('billing_address_id'), $request->get('vault_id'), $order_totals['grand_total'], ); if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $charged_successfully = true; } else { //If customers allowed to save card if ($request->get('save_card', false)) { //Check if PayJunction customerId exists. Create if not present. if (!auth()->user()->pj_id) { $customerCreated = createPJCustomer( $request->get('billing_address_id'), auth()->user() ); if (!$customerCreated) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Customer creation failed."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } $card_data = [ "cardNumber" => $request->get('card_number'), "cardExpMonth" => $request->get('expiry_month'), "cardExpYear" => $request->get('expiry_year'), "cvv" => $request->get('ccv') ]; $vaultId = createPJCustomerVault( auth()->user(), $request->get('billing_address_id'), $card_data, ); if (!$vaultId['success']) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Customer vault creation failed. Make sure you enter valid card credentials."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } //Charge customer using vault it just created. $charge_response = chargeByVaultId( $request->get('billing_address_id'), $vaultId['vault_id'], $order_totals['grand_total'], ); } else { //Charge by card information $card_data = [ 'card_number' => $request->get('card_number'), 'expiry_month' => $request->get('expiry_month'), 'expiry_year' => $request->get('expiry_year'), 'ccv' => $request->get('ccv'), ]; $charge_response = chargeByCard( $request->get('billing_address_id'), $order_totals['grand_total'], $card_data, ); } if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $charged_successfully = true; } } $shipping_data = []; //Billing Info of Order $billing_address = $orderObj->getOrderAddress($request['billing_address_id'], 'billing'); if ($request['delivery_type'] == 'Shipping') { $customer_id = config('app.web_ship_customer_id'); $base_url = config('app.web_ship_base_url'); $endpoint = "{$base_url}/customers/{$customer_id}/quote"; $request_body = prepareDataForShippingQuote($request); $response = getShippingQuoteServices($request_body, $endpoint); if ($response['data']){ $shipping_data = [ 'carrier_code' => $response['data']['carrierCode'], 'service_code' => $response['data']['serviceCode'], 'package_type_code' => $response['data']['packageTypeCode'], 'shipping_charges' => $response['data']['totalAmount'], ]; } //Shipping Info of Order $shipping_address = $orderObj->getOrderAddress($request['shipping_address_id'], 'shipping'); } DB::beginTransaction(); try { $cancellation_charges = SiteSetting::where('key', 'Cancel Order Fee')->first(); $pending_status = Status::where('name', 'Pending')->first(); $order = Order::create( array_merge( $request->validated(), $billing_address ?? [], $shipping_address ?? [], [ 'admin_approved' => 0, 'user_id' => auth()->id(), 'payment_status' => $charged_successfully ? 'Paid' : 'Unpaid', 'payment_date' => $charged_successfully ? new \DateTime() : null, 'current_status_id' => $pending_status->id, 'created_by_user_id' => auth()->id(), 'cancellation_charges' => $cancellation_charges->value ?? 0, 'items_total' => $order_totals['items_total'], 'state_sales_tax' => $order_totals['sales_tax']['percentage'], 'sales_tax_amount' => $order_totals['sales_tax']['amount'], 'rush_order_fee' => $order_totals['rush_order']['percentage'], 'rush_order_amount' => $order_totals['rush_order']['amount'], ], $shipping_data )); if (isset($order_totals['discount']['order_discount'])) { $order->coupon_id = $order_totals['discount']['coupon_id']; $order->discount_type = $order_totals['discount']['discount_type']; $order->discount_value = $order_totals['discount']['discount_value']; $order->discount_total = $order_totals['discount']['order_discount']; $coupon = Coupon::find($order->coupon_id); $coupon->redemption_count = $coupon->redemption_count + 1; $coupon->save(); } //For Customer Purchase Orders if ($request->payment_type == 'Purchase Order'){ $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), auth()->id(), 'order'); $order->purchase_order_number = $request->purchase_order_number; $order->purchase_order_copy = $purchase_order_copy; } $response = $order->storeOrderProducts($request['products'], auth()->id()); $statuses = []; if (isset($response['artwork_check'])){ $artwork_status = Status::where('name', 'Artwork Received')->first(); $proof_received = Status::where('name', 'Proof sign off received')->first(); $statuses[] = $artwork_status->id; $statuses[] = $proof_received->id; } else { $artwork_no_proof_status = Status::where('name', 'No proof needed')->first(); $statuses[] = $artwork_no_proof_status->id; } $statuses[] = $pending_status->id; $order->order_number = $orderObj->str_random2(); $order->statuses()->attach($statuses); if ($charged_successfully) { $charge_response['response']->order_id = $order->id; $charge_response['response']->save(); $order->payment_id = $charge_response['response']->id; } $order->grand_total = $order_totals['grand_total']; $order->save(); DB::commit(); $data = [ 'order_number' => $order->id, 'orderDetails' => $order->items, 'order' => (new OrderResource($order))->toArray() ]; $order->user->notify((new OrderPlacedNotification($data))->delay(now()->addSeconds(5))); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); }catch (\Exception $e){ DB::rollBack(); Log::info('DB Error : User Order Create'); Log::info($e->getMessage(). ' on line '. $e->getLine()); return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Unable to create order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function addOrderPayment(AddOrderPaymentRequest $request, Order $order) { DB::beginTransaction(); if ($request->get('vault_id')) { //Charge customer using vault it just created. $charge_response = chargeByVaultId( $order->billing_address_id, $request->get('vault_id'), $order->grand_total, ); if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } else { //If customers allowed to save card if ($request->get('save_card', false)) { //Check if PayJunction customerId exists. Create if not present. if (!auth()->user()->pj_id) { $customerCreated = createPJCustomer( $order->billing_address_id, $order->user, ); if (!$customerCreated) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => ["Customer creation failed."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } $card_data = [ "cardNumber" => $request->get('card_number'), "cardExpMonth" => $request->get('expiry_month'), "cardExpYear" => $request->get('expiry_year'), "cvv" => $request->get('ccv') ]; $vaultId = createPJCustomerVault( $order->user, $order->billing_address_id, $card_data, ); if (!$vaultId['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => ["Customer vault creation failed. Make sure you enter valid card credentials."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } //Charge customer using vault it just created. $charge_response = chargeByVaultId( $order->billing_address_id, $vaultId['vault_id'], $order->grand_total, ); } else { //Charge by card information $card_data = [ 'card_number' => $request->get('card_number'), 'expiry_month' => $request->get('expiry_month'), 'expiry_year' => $request->get('expiry_year'), 'ccv' => $request->get('ccv'), ]; $charge_response = chargeByCard( $order->billing_address_id, $order->grand_total, $card_data, ); } if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $charge_response['response']->order_id = $order->id; $charge_response['response']->save(); $order->amount_paid = $charge_response['response']->amount_total; $order->payment_id = $charge_response['response']->id; } $order->payment_type = 'Credit Card'; $order->payment_status = 'Paid'; $order->payment_date = new \DateTime(); $order->save(); DB::commit(); $data = [ 'order_number' => $order->order_number, 'amount' => $charge_response['response']->amount_total, 'user_name' => $order->user->name, 'payment_method' => $order->payment_type, ]; //Send email to admin and user $order->user->notify((new InvoicePaidUserNotification($data))->delay(now()->addSeconds(5))); $admin_email = SiteSetting::where('key', 'Notification Email')->first(); Mail::to($admin_email->value)->later(now()->addSeconds(5),new InvoicePaidAdminMail($data)); return (new OrderResource($order)) ->response()->setStatusCode(Response::HTTP_OK); } public function approveOrderArtwork(Request $request, Order $order) { if ($order->user_id != auth()->id()) { return \response() ->json([ 'message' => "Can not approve artwork.", 'errors' => ["error" => ["Invalid order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } if ($order->current_status_id != 6) { return \response() ->json([ 'message' => "Can not approve artwork.", 'errors' => ["error" => ["Invalid order status."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $status = Status::where('name', 'Proof sign off received')->first(); $order->current_status_id = $status->id; $order->statuses()->attach($status->id); $order->save(); return response()->json([ 'message' => "Order artwork approved successfully.", ], Response::HTTP_OK); } public function show(Order $order) { try { // Perform authorization check using Gate Gate::authorize('update-record', $order); } catch (AuthorizationException $exception) { // Handle the authorization exception and send a custom message $errorMessage = 'Access denied: ' . $exception->getMessage(); // Return the custom message as a response or handle it accordingly return response()->json(['error' => $errorMessage], 403); } if(empty($order->deleted_by_user)){ return new OrderUserInfoResource($order->load( [ 'user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address', 'items', ]) ); } return response() ->json([ 'message' => "Record not found.", 'errors' => ["error" => ["Record not found."]] ], Response::HTTP_NOT_FOUND); } public function getPaymentTypes() { return \response() ->json(['data' => [ 'Credit Card' => 'Credit Card', 'Purchase Order' => 'Purchase Order', ] ], Response::HTTP_OK); } public function destroy(Order $order) { abort_if(Gate::denies('update-record', $order), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $order->deleted_by_user = 1; $order->save(); return response() ->json(['message' => 'Order deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ Log::channel('db_errors')->info('Record Deletion Error : Order -> '.$order->id); Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function getMyVaults() { $customer_id = auth()->user()->pj_customer_id; if (!$customer_id) { return \response()->json([ 'message' => 'Customer id not associated', 'errors' => ['error' => 'Customer id not associated with user.'], ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $vaults = getCustomerVaults($customer_id); return \response() ->json(['data' => $vaults]) ->setStatusCode(Response::HTTP_OK); } public function generateInvoice(Order $order) { $invoice = $order->createInvoice(); return response() ->json(['data' => $invoice->invoiceUrl ?? ''], Response::HTTP_OK); } }
| ver. 1.4 |
Github
|
.
| PHP 8.1.29 | Генерация страницы: 0 |
proxy
|
phpinfo
|
Настройка