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
+
+
+
+
+
+
+
+
+
+
+
+
+ | {{ __('admin::app.sales.transactions.transaction-id') }} |
+ {{ __('admin::app.sales.invoices.order-id') }} |
+ {{ __('admin::app.sales.transactions.payment-method') }} |
+ {{ __('admin::app.sales.transactions.action') }} |
+
+
+
+
+
+ @foreach ($order->transactions as $transaction)
+
+ | #{{ $transaction->transaction_id }} |
+ {{ $transaction->order_id }} |
+
+ {{ core()->getConfigData('sales.paymentmethods.' . $transaction->payment_method . '.title') }}
+ |
+
+
+
+
+ |
+
+ @endforeach
+
+ @if (! $order->transactions->count())
+
+ | {{ __('admin::app.common.no-result-found') }} |
+
+ @endif
+
+
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.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/Http/Controllers/SmartButtonController.php b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php
index b8007334b..b7335df9b 100755
--- a/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php
+++ b/packages/Webkul/Paypal/src/Http/Controllers/SmartButtonController.php
@@ -255,7 +255,7 @@ class SmartButtonController extends Controller
'success' => true,
]);
} catch (\Exception $e) {
- session()->flash('error', trans('shop::app.common.error'));
+ session()->flash('error', trans($e->getMessage()));
throw $e;
}
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