replace offline to oflinepayment payment gateways

This commit is contained in:
cuneytsenturk
2017-09-18 19:57:48 +03:00
parent cb179c27eb
commit 6911c0bb42
37 changed files with 272 additions and 167 deletions

View File

View File

View File

@ -0,0 +1,7 @@
<?php
return [
'name' => 'OfflinePayment',
];

View File

View File

@ -0,0 +1,45 @@
<?php
namespace Modules\OfflinePayment\Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Setting;
class OfflinePaymentDatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
$this->create();
Model::reguard();
}
private function create()
{
$methods = array();
$methods[] = array(
'code' => 'offlinepayment.cash.1',
'name' => 'Cash',
'order' => '1',
'description' => null,
);
$methods[] = array(
'code' => 'offlinepayment.bank_transfer.2',
'name' => 'Bank Transfer',
'order' => '2',
'description' => null,
);
Setting::set('offlinepayment.methods', json_encode($methods));
}
}

View File

View File

View File

@ -0,0 +1,22 @@
<?php
namespace Modules\OfflinePayment\Events\Handlers;
use App\Events\AdminMenuCreated;
class OfflinePaymentAdminMenu
{
/**
* Handle the event.
*
* @param AdminMenuCreated $event
* @return void
*/
public function handle(AdminMenuCreated $event)
{
// Add child to existing item
$item = $event->menu->whereTitle(trans_choice('general.settings', 2));
$item->url('modules/offlinepayment/settings', trans('offlinepayment::offlinepayment.offlinepayment'), 4, ['icon' => 'fa fa-angle-double-right']);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace Modules\OfflinePayment\Events\Handlers;
use App\Events\PaymentGatewayListing;
class OfflinePaymentGateway
{
/**
* Handle the event.
*
* @param PaymentGatewayListing $event
* @return void
*/
public function handle(PaymentGatewayListing $event)
{
return json_decode(setting('offlinepayment.methods'), true);
}
}

View File

@ -0,0 +1,121 @@
<?php
namespace Modules\OfflinePayment\Http\Controllers;
use Artisan;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\OfflinePayment\Http\Requests\Setting as Request;
use Modules\OfflinePayment\Http\Requests\SettingGet as GRequest;
use Modules\OfflinePayment\Http\Requests\SettingDelete as DRequest;
class Settings extends Controller
{
/**
* Show the form for editing the specified resource.
* @return Response
*/
public function edit()
{
$items = json_decode(setting('offlinepayment.methods'));
return view('offlinepayment::edit', compact('items'));
}
/**
* Update the specified resource in storage.
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$offlinepayment = json_decode(setting('offlinepayment.methods'), true);
if (isset($request['method'])) {
foreach ($offlinepayment as $key => $method) {
if ($method['code'] == $request['method']) {
$offlinepayment[$key]['code'] = 'offlinepayment.' . $request['code'] . '.' . (count($offlinepayment) + 1);
$offlinepayment[$key]['name'] = $request['name'];
$offlinepayment[$key]['order'] = $request['order'];
$offlinepayment[$key]['description'] = $request['description'];
}
}
} else {
$offlinepayment[] = array(
'code' => 'offlinepayment.' . $request['code'] . '.' . (count($offlinepayment) + 1),
'name' => $request['name'],
'order' => $request['order'],
'description' => $request['description']
);
}
// Set Api Token
setting()->set('offlinepayment.methods', json_encode($offlinepayment));
setting()->save();
Artisan::call('cache:clear');
return redirect('modules/offlinepayment/settings');
}
/**
* Remove the specified resource from storage.
* @return Response
*/
public function get(GRequest $request)
{
$code = $request['code'];
$offlinepayment = json_decode(setting('offlinepayment.methods'), true);
foreach ($offlinepayment as $key => $method) {
if ($method['code'] == $code) {
$method['title'] = trans('offlinepayment::offlinepayment.edit', ['method' => $method['name']]);
$code = explode('.', $method['code']);
$method['code'] = $code[1];
$data = $method;
}
}
return response()->json([
'errors' => false,
'success' => true,
'data' => $data
]);
}
/**
* Remove the specified resource from storage.
* @return Response
*/
public function delete(DRequest $request)
{
$code = $request['code'];
$offlinepayment = json_decode(setting('offlinepayment.methods'), true);
foreach ($offlinepayment as $key => $method) {
if ($method['code'] == $code) {
unset($offlinepayment[$key]);
}
}
// Set Api Token
setting()->set('offlinepayment.methods', json_encode($offlinepayment));
setting()->save();
Artisan::call('cache:clear');
return response()->json([
'errors' => false,
'success' => true,
]);
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Modules\OfflinePayment\Http\Requests;
use App\Http\Requests\Request;
class Setting extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|string',
'code' => 'required|string',
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Modules\OfflinePayment\Http\Requests;
use App\Http\Requests\Request;
class SettingDelete extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'code' => 'required|string',
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Modules\OfflinePayment\Http\Requests;
use App\Http\Requests\Request;
class SettingGet extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'code' => 'required|string',
];
}
}

View File

@ -0,0 +1,8 @@
<?php
Route::group(['middleware' => ['web', 'auth', 'language', 'adminmenu', 'permission:read-admin-panel'], 'prefix' => 'modules/offlinepayment', 'namespace' => 'Modules\OfflinePayment\Http\Controllers'], function () {
Route::get('settings', 'settings@edit');
Route::post('settings', 'settings@update');
Route::post('settings/get', 'settings@get');
Route::post('settings/delete', 'settings@delete');
});

View File

View File

View File

@ -0,0 +1,120 @@
<?php
namespace Modules\OfflinePayment\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Database\Eloquent\Factory;
use App\Events\AdminMenuCreated;
use Modules\OfflinePayment\Events\Handlers\OfflinePaymentAdminMenu;
use App\Events\PaymentGatewayListing;
use Modules\OfflinePayment\Events\Handlers\OfflinePaymentGateway;
class OfflinePaymentServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;
/**
* Boot the application events.
*
* @return void
*/
public function boot()
{
$this->registerTranslations();
$this->registerConfig();
$this->registerViews();
$this->registerFactories();
$this->app['events']->listen(AdminMenuCreated::class, OfflinePaymentAdminMenu::class);
$this->app['events']->listen(PaymentGatewayListing::class, OfflinePaymentGateway::class);
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
/**
* Register config.
*
* @return void
*/
protected function registerConfig()
{
$this->publishes([
__DIR__.'/../Config/config.php' => config_path('offlinepayment.php'),
], 'config');
$this->mergeConfigFrom(
__DIR__.'/../Config/config.php', 'offlinepayment'
);
}
/**
* Register views.
*
* @return void
*/
public function registerViews()
{
$viewPath = resource_path('views/modules/offlinepayment');
$sourcePath = __DIR__.'/../Resources/views';
$this->publishes([
$sourcePath => $viewPath
]);
$this->loadViewsFrom(array_merge(array_map(function ($path) {
return $path . '/modules/offlinepayment';
}, \Config::get('view.paths')), [$sourcePath]), 'offlinepayment');
}
/**
* Register translations.
*
* @return void
*/
public function registerTranslations()
{
$langPath = resource_path('lang/modules/offlinepayment');
if (is_dir($langPath)) {
$this->loadTranslationsFrom($langPath, 'offlinepayment');
} else {
$this->loadTranslationsFrom(__DIR__ .'/../Resources/lang', 'offlinepayment');
}
}
/**
* Register an additional directory of factories.
* @source https://github.com/sebastiaanluca/laravel-resource-flow/blob/develop/src/Modules/ModuleServiceProvider.php#L66
*/
public function registerFactories()
{
if (! app()->environment('production')) {
app(Factory::class)->load(__DIR__ . '/Database/factories');
}
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return [];
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace Modules\OfflinePayment\Providers;
use Artisan;
use Module;
use Illuminate\Support\ServiceProvider;
class OfflineServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;
/**
* Boot the application events.
*
* @return void
*/
public function boot()
{
$module = Module::get('OfflinePayment');
if (!empty($module) && version_compare($module->get('version'), '1.0.0') == 0) {
$offline_payments = json_decode(setting('offline.payment.methods'), true);
if (!empty($offline_payments)) {
$offlinepayment = array();
foreach ($offline_payments as $offline_payment) {
$code = explode('.', $offline_payment['code']);
$offline_payment['code'] = $code[1];
$offlinepayment[] = array(
'code' => 'offlinepayment.' . $code[1] . '.' . $code[2],
'name' => $offline_payment['name'],
'order' => $offline_payment['order'],
'description' => $offline_payment['description']
);
}
setting()->set('offlinepayment.methods', json_encode($offlinepayment));
setting()->forget('offline.payment.methods');
setting()->save();
}
$module->delete();
Artisan::call('cache:clear');
}
}
}

View File

@ -0,0 +1,12 @@
<?php
return [
'offlinepayment' => 'Offline Payments',
'add_new' => 'Add New',
'edit' => 'Edit: :method',
'code' => 'Code',
'order' => 'Order',
'payment_gateways' => 'Offline Payment Methods',
];

View File

@ -0,0 +1,170 @@
@extends('layouts.admin')
@section('title', trans('offlinepayment::offlinepayment.offlinepayment'))
@section('content')
<div class="col-md-4 no-padding-left">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">{{ trans('offlinepayment::offlinepayment.add_new') }}</h3>
<!-- /.box-tools -->
</div>
<!-- /.box-header -->
{!! Form::open(['url' => 'modules/offlinepayment/settings', 'files' => true, 'role' => 'form']) !!}
<div class="box-body">
<div id="install-loading"></div>
{{ Form::textGroup('name', trans('general.name'), 'id-card-o', ['required' => 'required'], null, 'col-md-12') }}
{{ Form::textGroup('code', trans('offlinepayment::offlinepayment.code'), 'key', ['required' => 'required'], null, 'col-md-12') }}
{{ Form::textGroup('order', trans('offlinepayment::offlinepayment.order'), 'sort', [], 0, 'col-md-12') }}
{{ Form::textareaGroup('description', trans('general.description')) }}
</div>
<!-- /.box-body -->
<div class="box-footer">
{{ Form::saveButtons('modules/offlinepayment/settings') }}
</div>
<!-- /.box-footer -->
{!! Form::close() !!}
</div>
<!-- /.box -->
</div>
<div class="col-md-8 no-padding-left">
<!-- Default box -->
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">{{ trans('offlinepayment::offlinepayment.payment_gateways') }}</h3>
<!-- /.box-tools -->
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="table table-responsive">
<table class="table table-bordered table-striped table-hover" id="tbl-items">
<thead>
<tr>
<th class="col-md-3">{{ trans('general.name') }}</th>
<th class="col-md-3">{{ trans('offlinepayment::offlinepayment.code') }}</th>
<th class="col-md-3">{{ trans('offlinepayment::offlinepayment.order') }}</th>
<th class="col-md-3">{{ trans('general.actions') }}</th>
</tr>
</thead>
<tbody>
@if($items)
@foreach($items as $item)
<tr id="method-{{ $item->code }}">
<td>{{ $item->name }}</td>
<td>{{ $item->code }}</td>
<td>{{ $item->order }}</td>
<td>
<button type="button" class="btn btn-primary btn-xs method-edit" id="edit-{{ $item->code }}" title="{{ trans('general.edit') }}"><i class="fa fa-pencil-square-o" aria-hidden="true"></i> {{ trans('general.edit') }}</button>
<button type="button" class="btn btn-danger btn-xs method-delete" id="delete-{{ $item->code }}" title="{{ trans('general.delete') }}"><i class="fa fa-trash-o" aria-hidden="true"></i> {{ trans('general.delete') }}</button>
</td>
</tr>
@endforeach
@else
@endif
</tbody>
</table>
</div>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
@endsection
@section('stylesheet')
<style type="text/css">
.install-loading-bar {
font-size: 35px;
position: absolute;
z-index: 500;
top: 0px;
left: 0px;
width: 100%;
background: rgb(136, 136, 136);
opacity: 0.2;
-moz-border-radius-bottomleft: 1px;
-moz-border-radius-bottomright: 1px;
border-bottom-left-radius: 1px;
border-bottom-right-radius: 1px;
}
.install-loading-spin {
font-size: 100px;
position: absolute;
margin: auto;
color: #fff;
padding: 28% 40%;
}
</style>
@endsection
@section('scripts')
<script type="text/javascript">
$(document).ready(function() {
$('.method-edit').on('click', function() {
var code = $(this).attr('id').replace('edit-', '');
$.ajax({
url: '{{ url("modules/offlinepayment/settings/get") }}',
type: 'post',
dataType: 'json',
data: {code: code},
headers: { 'X-CSRF-TOKEN': '{{ csrf_token() }}' },
beforeSend: function() {
$('#install-loading').html('<span class="install-loading-bar"><span class="install-loading-spin"><i class="fa fa-spinner fa-spin"></i></span></span>');
$('.install-loading-bar').css({"height": $('.col-md-4.no-padding-left').height() - 23});
},
complete: function() {
$('#install-loading .install-loading-bar').remove();
},
success: function(json) {
if (json['error']) {
}
if (json['success']) {
$('.col-md-4.no-padding-left .box-header.with-border .box-title').html(json['data']['title']);
$('input[name="name"]').val(json['data']['name']);
$('input[name="code"]').val(json['data']['code']);
$('input[name="sort"]').val(json['data']['sort']);
$('input[name="description"]').val(json['data']['description']);
$('input[name="method"]').remove();
$('.col-md-4 .box-body').append('<input type="hidden" name="method" value="' + json['data']['code'] + '">');
}
}
});
});
$('.method-delete').on('click', function() {
var code = $(this).attr('id').replace('delete-', '');
$.ajax({
url: '{{ url("modules/offlinepayment/settings/delete") }}',
type: 'post',
dataType: 'json',
data: {code: code},
headers: { 'X-CSRF-TOKEN': '{{ csrf_token() }}' },
success: function(json) {
if (json['error']) {
}
if (json['success']) {
$('#method-' + code).remove();
}
}
});
});
});
</script>
@endsection

View File

View File

@ -0,0 +1,15 @@
{
"name": "akaunting/offlinepayment",
"description": "",
"authors": [
{
"name": "Akaunting",
"email": "info@akaunting.com"
}
],
"autoload": {
"psr-4": {
"Modules\\OfflinePayment\\": ""
}
}
}

View File

@ -0,0 +1,20 @@
{
"name": "OfflinePayment",
"alias": "offlinepayment",
"description": "",
"version": "1.0.0",
"category": "payment-gateways",
"keywords": [],
"active": 1,
"order": 0,
"providers": [
"Modules\\OfflinePayment\\Providers\\OfflineServiceProvider",
"Modules\\OfflinePayment\\Providers\\OfflinePaymentServiceProvider"
],
"aliases": {},
"files": [
"start.php"
],
"requires": [],
"settings": []
}

View File

@ -0,0 +1,17 @@
<?php
/*
|--------------------------------------------------------------------------
| Register Namespaces And Routes
|--------------------------------------------------------------------------
|
| When a module starting, this file will executed automatically. This helps
| to register some namespaces like translator or view. Also this file
| will load the routes file for each module. You may also modify
| this file as you want.
|
*/
if (!app()->routesAreCached()) {
require __DIR__ . '/Http/routes.php';
}