diff --git a/packages/Webkul/Admin/src/Config/menu.php b/packages/Webkul/Admin/src/Config/menu.php index dab25131c..41d97c10f 100755 --- a/packages/Webkul/Admin/src/Config/menu.php +++ b/packages/Webkul/Admin/src/Config/menu.php @@ -37,6 +37,12 @@ return [ 'route' => 'admin.sales.refunds.index', 'sort' => 4, 'icon-class' => '', + ], [ + 'key' => 'sales.transactions', + 'name' => 'admin::app.layouts.transactions', + 'route' => 'admin.sales.transactions.index', + 'sort' => 5, + 'icon-class' => '', ], [ 'key' => 'catalog', 'name' => 'admin::app.layouts.catalog', diff --git a/packages/Webkul/Admin/src/DataGrids/OrderTransactionsDataGrid.php b/packages/Webkul/Admin/src/DataGrids/OrderTransactionsDataGrid.php new file mode 100644 index 000000000..29b587dfb --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/OrderTransactionsDataGrid.php @@ -0,0 +1,76 @@ +leftJoin('orders as ors', 'order_transactions.order_id', '=', 'ors.id') + ->select('order_transactions.id as id', 'order_transactions.transaction_id as transaction_id', 'ors.increment_id as order_id', 'order_transactions.created_at as created_at'); + + $this->addFilter('id', 'order_transactions.id'); + $this->addFilter('transaction_id', 'order_transactions.transaction_id'); + $this->addFilter('order_id', 'ors.increment_id'); + $this->addFilter('created_at', 'order_transactions.created_at'); + + $this->setQueryBuilder($queryBuilder); + } + + public function addColumns() + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.datagrid.id'), + 'type' => 'number', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'transaction_id', + 'label' => trans('admin::app.datagrid.transaction-id'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'order_id', + 'label' => trans('admin::app.datagrid.order-id'), + 'type' => 'number', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.datagrid.transaction-date'), + 'type' => 'datetime', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + } + + public function prepareActions() + { + $this->addAction([ + 'title' => trans('admin::app.datagrid.view'), + 'method' => 'GET', + 'route' => 'admin.sales.transactions.view', + 'icon' => 'icon eye-icon', + ]); + } +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Http/Controllers/Sales/TransactionController.php b/packages/Webkul/Admin/src/Http/Controllers/Sales/TransactionController.php new file mode 100644 index 000000000..d4b875e99 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Sales/TransactionController.php @@ -0,0 +1,92 @@ +middleware('admin'); + + $this->_config = request('_config'); + + $this->orderTransactionRepository = $orderTransactionRepository; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\View\View + */ + public function index() + { + return view($this->_config['view']); + } + + /** + * Show the view for the specified resource. + * + * @param int $id + * @return \Illuminate\View\View + */ + public function view($id) + { + $transaction = $this->orderTransactionRepository->findOrFail($id); + + $transData = json_decode(json_encode(json_decode($transaction['data'])), true); + + $transactionDeatilsData = $this->convertIntoSingleDimArray($transData); + + return view($this->_config['view'], compact('transaction', 'transactionDeatilsData')); + } + + /** + * Convert Transaction Details Data into single Dim Array. + * + * @param array $data + * @return array + */ + public function convertIntoSingleDimArray($transData) { + static $detailsData = []; + + foreach ($transData as $key => $data) { + if (is_array($data)) { + $this->convertIntoSingleDimArray($data); + } else { + $skipAttributes = ['sku', 'name', 'category', 'quantity']; + + if (gettype($key) == 'integer' || in_array($key, $skipAttributes)) { + continue; + } + + $detailsData[$key] = $data; + } + } + + return $detailsData; + } +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Http/routes.php b/packages/Webkul/Admin/src/Http/routes.php index c9e92f3e6..20a9033fe 100755 --- a/packages/Webkul/Admin/src/Http/routes.php +++ b/packages/Webkul/Admin/src/Http/routes.php @@ -250,6 +250,15 @@ Route::group(['middleware' => ['web']], function () { Route::get('/refunds/view/{id}', 'Webkul\Admin\Http\Controllers\Sales\RefundController@view')->defaults('_config', [ 'view' => 'admin::sales.refunds.view', ])->name('admin.sales.refunds.view'); + + // Sales Transactions Routes + Route::get('/transactions', 'Webkul\Admin\Http\Controllers\Sales\TransactionController@index')->defaults('_config', [ + 'view' => 'admin::sales.transactions.index', + ])->name('admin.sales.transactions.index'); + + Route::get('/transactions/view/{id}', 'Webkul\Admin\Http\Controllers\Sales\TransactionController@view')->defaults('_config', [ + 'view' => 'admin::sales.transactions.view', + ])->name('admin.sales.transactions.view'); }); // Catalog Routes diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index 1ae5dcec3..18ec99a3e 100755 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -82,7 +82,8 @@ return [ 'email-templates' => 'Email Templates', 'events' => 'Events', 'discount' => 'Discount', - 'cms' => 'CMS' + 'cms' => 'CMS', + 'transactions' => 'Transactions' ], 'acl' => [ @@ -249,7 +250,9 @@ return [ 'ltr' => 'LTR', 'update-status' => 'Update Status', 'subject' => 'Subject', - 'date' => 'Date' + 'date' => 'Date', + 'transaction-id' => 'Transaction Id', + 'transaction-date' => 'Transaction Date', ], 'account' => [ @@ -401,7 +404,8 @@ return [ 'submit-comment' => 'Submit Comment', 'notify-customer' => 'Notify Customer', 'customer-notified' => ':date | Customer Notified', - 'customer-not-notified' => ':date | Customer Not Notified' + 'customer-not-notified' => ':date | Customer Not Notified', + 'transactions' => 'Transactions' ], 'invoices' => [ @@ -478,6 +482,20 @@ return [ 'view-title' => 'Refund #:refund_id', 'invalid-refund-amount-error' => 'Refund amount should be non zero.' + ], + + 'transactions' => [ + 'title' => 'Transactions', + 'id' => 'Id', + 'transaction-id' => 'Transaction Id', + 'payment-method' => 'Payment method', + 'action' => 'Action', + 'view-title' => 'Transaction #:transaction_id', + 'transaction-data' => 'Transaction Data', + 'order-id' => 'Order Id', + 'status' => 'Status', + 'created-at' => 'Created At', + 'transaction-details' => 'Transaction Details' ] ], diff --git a/packages/Webkul/Admin/src/Resources/views/sales/orders/view.blade.php b/packages/Webkul/Admin/src/Resources/views/sales/orders/view.blade.php index 6ac4b515e..a200fbbc6 100755 --- a/packages/Webkul/Admin/src/Resources/views/sales/orders/view.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/sales/orders/view.blade.php @@ -509,6 +509,7 @@ {{ __('admin::app.common.no-result-found') }} @endif + @@ -551,6 +552,7 @@ {{ __('admin::app.common.no-result-found') }} @endif + @@ -595,6 +597,49 @@ {{ __('admin::app.common.no-result-found') }} @endif + + + + + + + + +
+ + + + + + + + + + + + + @foreach ($order->transactions as $transaction) + + + + + + + @endforeach + + @if (! $order->transactions->count()) + + + + @endif + +
{{ __('admin::app.sales.transactions.transaction-id') }}{{ __('admin::app.sales.invoices.order-id') }}{{ __('admin::app.sales.transactions.payment-method') }}{{ __('admin::app.sales.transactions.action') }}
#{{ $transaction->transaction_id }}{{ $transaction->order_id }} + {{ core()->getConfigData('sales.paymentmethods.' . $transaction->payment_method . '.title') }} + + + + +
{{ __('admin::app.common.no-result-found') }}
diff --git a/packages/Webkul/Admin/src/Resources/views/sales/transactions/index.blade.php b/packages/Webkul/Admin/src/Resources/views/sales/transactions/index.blade.php new file mode 100644 index 000000000..214885c00 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sales/transactions/index.blade.php @@ -0,0 +1,40 @@ +@extends('admin::layouts.content') + +@section('page_title') + {{ __('admin::app.sales.transactions.title') }} +@stop + +@section('content') +
+ + +
+ @inject('orderTransactionsDataGrid', 'Webkul\Admin\DataGrids\OrderTransactionsDataGrid') + {!! $orderTransactionsDataGrid->render() !!} +
+
+ + +

{{ __('admin::app.export.download') }}

+
+ +
+
+@stop + +@push('scripts') + @include('admin::export.export', ['gridName' => $orderTransactionsDataGrid]) +@endpush \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/sales/transactions/view.blade.php b/packages/Webkul/Admin/src/Resources/views/sales/transactions/view.blade.php new file mode 100644 index 000000000..5b12f43c2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sales/transactions/view.blade.php @@ -0,0 +1,123 @@ +@extends('admin::layouts.master') + +@section('page_title') + {{ __('admin::app.sales.transactions.view-title', ['transaction_id' => $transaction->id]) }} +@stop + +@section('content-wrapper') +
+ + +
+
+ + +
+ +
+
+ {{ __('admin::app.sales.transactions.transaction-data') }} +
+ +
+
+ + {{ __('admin::app.sales.transactions.transaction-id') }} + + + + {{ $transaction->transaction_id }} + +
+ +
+ + {{ __('admin::app.sales.transactions.order-id') }} + + + + + {{ $transaction->order_id }} + + +
+ +
+ + {{ __('admin::app.sales.transactions.payment-method') }} + + + + {{ core()->getConfigData('sales.paymentmethods.' . $transaction->payment_method . '.title') }} + +
+ + {{--
+ + {{ __('admin::app.sales.transactions.status') }} + + + + {{ $transaction->status }} + +
--}} + +
+ + {{ __('admin::app.sales.transactions.created-at') }} + + + + {{ $transaction->created_at }} + +
+ +
+
+
+
+ + +
+ @php + $transData = json_decode(json_encode(json_decode($transaction['data'])), true); + @endphp + +
+
+ {{ __('admin::app.sales.transactions.transaction-details') }} +
+ +
+ @foreach ($transactionDeatilsData as $key => $data) +
+ + {{ $key }} + + + + {{ $data }} + +
+ @endforeach +
+ +
+
+
+ +
+
+
+@stop \ No newline at end of file diff --git a/packages/Webkul/Paypal/src/Listeners/Transaction.php b/packages/Webkul/Paypal/src/Listeners/Transaction.php new file mode 100644 index 000000000..b006cbab7 --- /dev/null +++ b/packages/Webkul/Paypal/src/Listeners/Transaction.php @@ -0,0 +1,73 @@ +smartButton = $smartButton; + + $this->orderTransactionRepository = $orderTransactionRepository; + } + + /** + * Save the transaction data for online payment. + * @param \Webkul\Sales\Models\Invoice $invoice + * + * @return void + */ + public function saveTransaction($invoice) { + $data = request()->all(); + + if ($invoice->order->payment->method == 'paypal_smart_button') { + if (isset($data['orderData']) && isset($data['orderData']['orderID'])) { + $smartButtonOrderId = $data['orderData']['orderID']; + $transactionDetails = $this->smartButton->getOrder($smartButtonOrderId); + $transactionDetails = json_decode(json_encode($transactionDetails), true); + + if ($transactionDetails['statusCode'] == 200) { + $transactionData['transaction_id'] = $transactionDetails['result']['id']; + $transactionData['status'] = $transactionDetails['result']['status']; + $transactionData['type'] = $transactionDetails['result']['intent']; + $transactionData['payment_method'] = $invoice->order->payment->method; + $transactionData['order_id'] = $invoice->order->id; + $transactionData['invoice_id'] = $invoice->id; + $transactionData['data'] = json_encode ( + array_merge($transactionDetails['result']['purchase_units'], + $transactionDetails['result']['payer']) + ); + + $this->orderTransactionRepository->create($transactionData); + } + } + } + } +} \ No newline at end of file diff --git a/packages/Webkul/Paypal/src/Providers/EventServiceProvider.php b/packages/Webkul/Paypal/src/Providers/EventServiceProvider.php index 708b519f0..106b0d713 100644 --- a/packages/Webkul/Paypal/src/Providers/EventServiceProvider.php +++ b/packages/Webkul/Paypal/src/Providers/EventServiceProvider.php @@ -15,9 +15,11 @@ class EventServiceProvider extends ServiceProvider * @return void */ public function boot() - { + { Event::listen('bagisto.shop.layout.body.after', static function(ViewRenderEventManager $viewRenderEventManager) { $viewRenderEventManager->addTemplate('paypal::checkout.onepage.paypal-smart-button'); }); + + Event::listen('sales.invoice.save.after', 'Webkul\Paypal\Listeners\Transaction@saveTransaction'); } } \ No newline at end of file diff --git a/packages/Webkul/Sales/src/Contracts/OrderTransaction.php b/packages/Webkul/Sales/src/Contracts/OrderTransaction.php new file mode 100644 index 000000000..125791a5f --- /dev/null +++ b/packages/Webkul/Sales/src/Contracts/OrderTransaction.php @@ -0,0 +1,7 @@ +increments('id'); + $table->string('transaction_id'); + $table->string('status')->nullable(); + $table->string('type')->nullable(); + $table->string('payment_method')->nullable(); + $table->json('data')->nullable(); + $table->integer('invoice_id')->unsigned(); + $table->integer('order_id')->unsigned(); + $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order_transactions'); + } +} diff --git a/packages/Webkul/Sales/src/Models/Order.php b/packages/Webkul/Sales/src/Models/Order.php index 1502e6a51..440cc7eaa 100755 --- a/packages/Webkul/Sales/src/Models/Order.php +++ b/packages/Webkul/Sales/src/Models/Order.php @@ -126,6 +126,14 @@ class Order extends Model implements OrderContract return $this->hasMany(RefundProxy::modelClass()); } + /** + * Get the order transactions record associated with the order. + */ + public function transactions() + { + return $this->hasMany(OrderTransactionProxy::modelClass()); + } + /** * Get the customer record associated with the order. */ diff --git a/packages/Webkul/Sales/src/Models/OrderTransaction.php b/packages/Webkul/Sales/src/Models/OrderTransaction.php new file mode 100644 index 000000000..d67b16147 --- /dev/null +++ b/packages/Webkul/Sales/src/Models/OrderTransaction.php @@ -0,0 +1,17 @@ + + * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com) + */ +class OrderTransactionRepository extends Repository +{ + /** + * Specify Model class name + * + * @return string + */ + + function model() + { + return OrderTransaction::class; + } +} \ No newline at end of file