From 08c1818a9da663c88797e1723c6003e09fe724b7 Mon Sep 17 00:00:00 2001 From: Fahim Date: Sat, 31 Jul 2021 03:20:19 +0600 Subject: [PATCH] Added: Currency Module --- Modules/Currency/Config/.gitkeep | 0 Modules/Currency/Config/config.php | 5 + Modules/Currency/Console/.gitkeep | 0 Modules/Currency/Database/Migrations/.gitkeep | 0 ...1_07_31_015923_create_currencies_table.php | 37 ++++++ Modules/Currency/Database/Seeders/.gitkeep | 0 .../Seeders/CurrencyDatabaseSeeder.php | 21 ++++ Modules/Currency/Database/factories/.gitkeep | 0 Modules/Currency/Entities/.gitkeep | 0 Modules/Currency/Entities/Currency.php | 14 +++ Modules/Currency/Http/Controllers/.gitkeep | 0 .../Http/Controllers/CurrencyController.php | 100 ++++++++++++++++ Modules/Currency/Http/Middleware/.gitkeep | 0 Modules/Currency/Http/Requests/.gitkeep | 0 Modules/Currency/Providers/.gitkeep | 0 .../Providers/CurrencyServiceProvider.php | 112 ++++++++++++++++++ .../Providers/RouteServiceProvider.php | 69 +++++++++++ Modules/Currency/Resources/assets/.gitkeep | 0 Modules/Currency/Resources/assets/js/app.js | 0 .../Currency/Resources/assets/sass/app.scss | 0 Modules/Currency/Resources/lang/.gitkeep | 0 Modules/Currency/Resources/views/.gitkeep | 0 .../Currency/Resources/views/create.blade.php | 69 +++++++++++ .../Currency/Resources/views/edit.blade.php | 70 +++++++++++ .../Currency/Resources/views/index.blade.php | 40 +++++++ .../views/partials/actions.blade.php | 19 +++ Modules/Currency/Routes/.gitkeep | 0 Modules/Currency/Routes/api.php | 18 +++ Modules/Currency/Routes/web.php | 18 +++ Modules/Currency/Tests/Feature/.gitkeep | 0 Modules/Currency/Tests/Unit/.gitkeep | 0 Modules/Currency/composer.json | 23 ++++ Modules/Currency/module.json | 13 ++ Modules/Currency/package.json | 17 +++ Modules/Currency/webpack.mix.js | 14 +++ Modules/Expense/Entities/Expense.php | 8 ++ .../Http/Controllers/ExpenseController.php | 4 +- .../Resources/views/expenses/create.blade.php | 27 ++++- .../Resources/views/expenses/edit.blade.php | 32 ++++- .../Database/Seeders/PeopleDatabaseSeeder.php | 7 +- .../Database/factories/CustomerFactory.php | 32 +++++ .../Database/factories/SupplierFactory.php | 32 +++++ Modules/People/Entities/Customer.php | 4 + Modules/People/Entities/Supplier.php | 3 + .../Http/Controllers/CustomersController.php | 4 +- .../Http/Controllers/SuppliersController.php | 4 +- Modules/Product/Entities/Product.php | 16 +++ .../Http/Requests/ProductCreateRequest.php | 4 +- .../Http/Requests/ProductUpdateRequest.php | 4 +- .../Resources/views/products/create.blade.php | 30 ++++- .../Resources/views/products/edit.blade.php | 31 ++++- .../Seeders/PermissionsTableSeeder.php | 7 ++ app/DataTables/CurrencyDataTable.php | 75 ++++++++++++ app/Helpers/helpers.php | 1 + composer.json | 11 +- modules_statuses.json | 3 +- public/js/jquery-mask-money.js | 10 ++ resources/views/layouts/menu.blade.php | 15 +++ 58 files changed, 991 insertions(+), 32 deletions(-) create mode 100644 Modules/Currency/Config/.gitkeep create mode 100644 Modules/Currency/Config/config.php create mode 100644 Modules/Currency/Console/.gitkeep create mode 100644 Modules/Currency/Database/Migrations/.gitkeep create mode 100644 Modules/Currency/Database/Migrations/2021_07_31_015923_create_currencies_table.php create mode 100644 Modules/Currency/Database/Seeders/.gitkeep create mode 100644 Modules/Currency/Database/Seeders/CurrencyDatabaseSeeder.php create mode 100644 Modules/Currency/Database/factories/.gitkeep create mode 100644 Modules/Currency/Entities/.gitkeep create mode 100644 Modules/Currency/Entities/Currency.php create mode 100644 Modules/Currency/Http/Controllers/.gitkeep create mode 100644 Modules/Currency/Http/Controllers/CurrencyController.php create mode 100644 Modules/Currency/Http/Middleware/.gitkeep create mode 100644 Modules/Currency/Http/Requests/.gitkeep create mode 100644 Modules/Currency/Providers/.gitkeep create mode 100644 Modules/Currency/Providers/CurrencyServiceProvider.php create mode 100644 Modules/Currency/Providers/RouteServiceProvider.php create mode 100644 Modules/Currency/Resources/assets/.gitkeep create mode 100644 Modules/Currency/Resources/assets/js/app.js create mode 100644 Modules/Currency/Resources/assets/sass/app.scss create mode 100644 Modules/Currency/Resources/lang/.gitkeep create mode 100644 Modules/Currency/Resources/views/.gitkeep create mode 100644 Modules/Currency/Resources/views/create.blade.php create mode 100644 Modules/Currency/Resources/views/edit.blade.php create mode 100644 Modules/Currency/Resources/views/index.blade.php create mode 100644 Modules/Currency/Resources/views/partials/actions.blade.php create mode 100644 Modules/Currency/Routes/.gitkeep create mode 100644 Modules/Currency/Routes/api.php create mode 100644 Modules/Currency/Routes/web.php create mode 100644 Modules/Currency/Tests/Feature/.gitkeep create mode 100644 Modules/Currency/Tests/Unit/.gitkeep create mode 100644 Modules/Currency/composer.json create mode 100644 Modules/Currency/module.json create mode 100644 Modules/Currency/package.json create mode 100644 Modules/Currency/webpack.mix.js create mode 100644 Modules/People/Database/factories/CustomerFactory.php create mode 100644 Modules/People/Database/factories/SupplierFactory.php create mode 100644 app/DataTables/CurrencyDataTable.php create mode 100644 app/Helpers/helpers.php create mode 100644 public/js/jquery-mask-money.js diff --git a/Modules/Currency/Config/.gitkeep b/Modules/Currency/Config/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Config/config.php b/Modules/Currency/Config/config.php new file mode 100644 index 00000000..dcf1c905 --- /dev/null +++ b/Modules/Currency/Config/config.php @@ -0,0 +1,5 @@ + 'Currency' +]; diff --git a/Modules/Currency/Console/.gitkeep b/Modules/Currency/Console/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Database/Migrations/.gitkeep b/Modules/Currency/Database/Migrations/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Database/Migrations/2021_07_31_015923_create_currencies_table.php b/Modules/Currency/Database/Migrations/2021_07_31_015923_create_currencies_table.php new file mode 100644 index 00000000..878b7641 --- /dev/null +++ b/Modules/Currency/Database/Migrations/2021_07_31_015923_create_currencies_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('currency_name'); + $table->string('code'); + $table->string('symbol'); + $table->string('thousand_separator'); + $table->string('decimal_separator'); + $table->integer('exchange_rate')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('currencies'); + } +} diff --git a/Modules/Currency/Database/Seeders/.gitkeep b/Modules/Currency/Database/Seeders/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Database/Seeders/CurrencyDatabaseSeeder.php b/Modules/Currency/Database/Seeders/CurrencyDatabaseSeeder.php new file mode 100644 index 00000000..93d02813 --- /dev/null +++ b/Modules/Currency/Database/Seeders/CurrencyDatabaseSeeder.php @@ -0,0 +1,21 @@ +call("OthersTableSeeder"); + } +} diff --git a/Modules/Currency/Database/factories/.gitkeep b/Modules/Currency/Database/factories/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Entities/.gitkeep b/Modules/Currency/Entities/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Entities/Currency.php b/Modules/Currency/Entities/Currency.php new file mode 100644 index 00000000..393ae255 --- /dev/null +++ b/Modules/Currency/Entities/Currency.php @@ -0,0 +1,14 @@ +render('currency::index'); + } + + + public function create() { + abort_if(Gate::denies('create_currencies'), 403); + + return view('currency::create'); + } + + + public function store(Request $request) { + abort_if(Gate::denies('create_currencies'), 403); + + $request->validate([ + 'currency_name' => 'required|string|max:255', + 'code' => 'required|string|max:255', + 'symbol' => 'required|string|max:255', + 'thousand_separator' => 'required|string|max:255', + 'decimal_separator' => 'required|string|max:255', + 'exchange_rate' => 'nullable|numeric|max:2147483647' + ]); + + Currency::create([ + 'currency_name' => $request->currency_name, + 'code' => Str::upper($request->code), + 'symbol' => $request->symbol, + 'thousand_separator' => $request->thousand_separator, + 'decimal_separator' => $request->decimal_separator, + 'exchange_rate' => $request->exchange_rate + ]); + + toast('Currency Created!', 'success'); + + return redirect()->route('currencies.index'); + } + + + public function edit(Currency $currency) { + abort_if(Gate::denies('edit_currencies'), 403); + + return view('currency::edit', compact('currency')); + } + + + public function update(Request $request, Currency $currency) { + abort_if(Gate::denies('edit_currencies'), 403); + + $request->validate([ + 'currency_name' => 'required|string|max:255', + 'code' => 'required|string|max:255', + 'symbol' => 'required|string|max:255', + 'thousand_separator' => 'required|string|max:255', + 'decimal_separator' => 'required|string|max:255', + 'exchange_rate' => 'nullable|numeric|max:2147483647' + ]); + + $currency->update([ + 'currency_name' => $request->currency_name, + 'code' => Str::upper($request->code), + 'symbol' => $request->symbol, + 'thousand_separator' => $request->thousand_separator, + 'decimal_separator' => $request->decimal_separator, + 'exchange_rate' => $request->exchange_rate + ]); + + toast('Currency Updated!', 'info'); + + return redirect()->route('currencies.index'); + } + + + public function destroy(Currency $currency) { + abort_if(Gate::denies('delete_currencies'), 403); + + $currency->delete(); + + toast('Currency Deleted!', 'warning'); + + return redirect()->route('currencies.index'); + } +} diff --git a/Modules/Currency/Http/Middleware/.gitkeep b/Modules/Currency/Http/Middleware/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Http/Requests/.gitkeep b/Modules/Currency/Http/Requests/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Providers/.gitkeep b/Modules/Currency/Providers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Providers/CurrencyServiceProvider.php b/Modules/Currency/Providers/CurrencyServiceProvider.php new file mode 100644 index 00000000..6cb9dcfa --- /dev/null +++ b/Modules/Currency/Providers/CurrencyServiceProvider.php @@ -0,0 +1,112 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations')); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->register(RouteServiceProvider::class); + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'), + ], 'config'); + $this->mergeConfigFrom( + module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower + ); + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/' . $this->moduleNameLower); + + $sourcePath = module_path($this->moduleName, 'Resources/views'); + + $this->publishes([ + $sourcePath => $viewPath + ], ['views', $this->moduleNameLower . '-module-views']); + + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/' . $this->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + } else { + $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } + + private function getPublishableViewPaths(): array + { + $paths = []; + foreach (\Config::get('view.paths') as $path) { + if (is_dir($path . '/modules/' . $this->moduleNameLower)) { + $paths[] = $path . '/modules/' . $this->moduleNameLower; + } + } + return $paths; + } +} diff --git a/Modules/Currency/Providers/RouteServiceProvider.php b/Modules/Currency/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..39446964 --- /dev/null +++ b/Modules/Currency/Providers/RouteServiceProvider.php @@ -0,0 +1,69 @@ +mapApiRoutes(); + + $this->mapWebRoutes(); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->moduleNamespace) + ->group(module_path('Currency', '/Routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->moduleNamespace) + ->group(module_path('Currency', '/Routes/api.php')); + } +} diff --git a/Modules/Currency/Resources/assets/.gitkeep b/Modules/Currency/Resources/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Resources/assets/js/app.js b/Modules/Currency/Resources/assets/js/app.js new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Resources/assets/sass/app.scss b/Modules/Currency/Resources/assets/sass/app.scss new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Resources/lang/.gitkeep b/Modules/Currency/Resources/lang/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Resources/views/.gitkeep b/Modules/Currency/Resources/views/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Resources/views/create.blade.php b/Modules/Currency/Resources/views/create.blade.php new file mode 100644 index 00000000..60b3e2c9 --- /dev/null +++ b/Modules/Currency/Resources/views/create.blade.php @@ -0,0 +1,69 @@ +@extends('layouts.app') + +@section('title', 'Create Currency') + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+ @csrf +
+
+ @include('utils.alerts') +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+@endsection + diff --git a/Modules/Currency/Resources/views/edit.blade.php b/Modules/Currency/Resources/views/edit.blade.php new file mode 100644 index 00000000..99a8bdf4 --- /dev/null +++ b/Modules/Currency/Resources/views/edit.blade.php @@ -0,0 +1,70 @@ +@extends('layouts.app') + +@section('title', 'Create Customer') + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+ @csrf + @method('patch') +
+
+ @include('utils.alerts') +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+@endsection + diff --git a/Modules/Currency/Resources/views/index.blade.php b/Modules/Currency/Resources/views/index.blade.php new file mode 100644 index 00000000..26bc7b52 --- /dev/null +++ b/Modules/Currency/Resources/views/index.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.app') + +@section('title', 'Currencies') + +@section('third_party_stylesheets') + +@endsection + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+
+
+
+ + Add Currency + + +
+ +
+ {!! $dataTable->table() !!} +
+
+
+
+
+
+@endsection + +@push('page_scripts') + {!! $dataTable->scripts() !!} +@endpush diff --git a/Modules/Currency/Resources/views/partials/actions.blade.php b/Modules/Currency/Resources/views/partials/actions.blade.php new file mode 100644 index 00000000..f107cf98 --- /dev/null +++ b/Modules/Currency/Resources/views/partials/actions.blade.php @@ -0,0 +1,19 @@ +@can('edit_currencies') + + + +@endcan +@can('delete_currencies') + +@endcan diff --git a/Modules/Currency/Routes/.gitkeep b/Modules/Currency/Routes/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Routes/api.php b/Modules/Currency/Routes/api.php new file mode 100644 index 00000000..a146996e --- /dev/null +++ b/Modules/Currency/Routes/api.php @@ -0,0 +1,18 @@ +get('/currency', function (Request $request) { + return $request->user(); +}); \ No newline at end of file diff --git a/Modules/Currency/Routes/web.php b/Modules/Currency/Routes/web.php new file mode 100644 index 00000000..4587c961 --- /dev/null +++ b/Modules/Currency/Routes/web.php @@ -0,0 +1,18 @@ + 'auth'], function () { + + Route::resource('currencies', 'CurrencyController')->except('show'); + +}); diff --git a/Modules/Currency/Tests/Feature/.gitkeep b/Modules/Currency/Tests/Feature/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/Tests/Unit/.gitkeep b/Modules/Currency/Tests/Unit/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Currency/composer.json b/Modules/Currency/composer.json new file mode 100644 index 00000000..6b499179 --- /dev/null +++ b/Modules/Currency/composer.json @@ -0,0 +1,23 @@ +{ + "name": "nwidart/currency", + "description": "", + "authors": [ + { + "name": "Nicolas Widart", + "email": "n.widart@gmail.com" + } + ], + "extra": { + "laravel": { + "providers": [], + "aliases": { + + } + } + }, + "autoload": { + "psr-4": { + "Modules\\Currency\\": "" + } + } +} diff --git a/Modules/Currency/module.json b/Modules/Currency/module.json new file mode 100644 index 00000000..3c3f412c --- /dev/null +++ b/Modules/Currency/module.json @@ -0,0 +1,13 @@ +{ + "name": "Currency", + "alias": "currency", + "description": "", + "keywords": [], + "priority": 0, + "providers": [ + "Modules\\Currency\\Providers\\CurrencyServiceProvider" + ], + "aliases": {}, + "files": [], + "requires": [] +} diff --git a/Modules/Currency/package.json b/Modules/Currency/package.json new file mode 100644 index 00000000..4599509f --- /dev/null +++ b/Modules/Currency/package.json @@ -0,0 +1,17 @@ +{ + "private": true, + "scripts": { + "dev": "npm run development", + "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch-poll": "npm run watch -- --watch-poll", + "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", + "prod": "npm run production", + "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" + }, + "devDependencies": { + "cross-env": "^7.0", + "laravel-mix": "^5.0.1", + "laravel-mix-merge-manifest": "^0.1.2" + } +} diff --git a/Modules/Currency/webpack.mix.js b/Modules/Currency/webpack.mix.js new file mode 100644 index 00000000..09f4ab9a --- /dev/null +++ b/Modules/Currency/webpack.mix.js @@ -0,0 +1,14 @@ +const dotenvExpand = require('dotenv-expand'); +dotenvExpand(require('dotenv').config({ path: '../../.env'/*, debug: true*/})); + +const mix = require('laravel-mix'); +require('laravel-mix-merge-manifest'); + +mix.setPublicPath('../../public').mergeManifest(); + +mix.js(__dirname + '/Resources/assets/js/app.js', 'js/currency.js') + .sass( __dirname + '/Resources/assets/sass/app.scss', 'css/currency.css'); + +if (mix.inProduction()) { + mix.version(); +} diff --git a/Modules/Expense/Entities/Expense.php b/Modules/Expense/Entities/Expense.php index f05bb16f..442b68b3 100644 --- a/Modules/Expense/Entities/Expense.php +++ b/Modules/Expense/Entities/Expense.php @@ -19,4 +19,12 @@ class Expense extends Model public function getDateAttribute($value) { return Carbon::parse($value)->format('d M, Y'); } + + public function setAmountAttribute($value) { + $this->attributes['amount'] = ($value * 100); + } + + public function getAmountAttribute($value) { + return ($value / 100); + } } diff --git a/Modules/Expense/Http/Controllers/ExpenseController.php b/Modules/Expense/Http/Controllers/ExpenseController.php index abe57dd5..375ca35b 100644 --- a/Modules/Expense/Http/Controllers/ExpenseController.php +++ b/Modules/Expense/Http/Controllers/ExpenseController.php @@ -34,7 +34,7 @@ class ExpenseController extends Controller 'date' => 'required|date', 'reference' => 'required|string|max:255|unique:expenses,reference', 'category_id' => 'required', - 'amount' => 'required|integer', + 'amount' => 'required|numeric|max:2147483647', 'details' => 'nullable|string|max:1000' ]); @@ -66,7 +66,7 @@ class ExpenseController extends Controller 'date' => 'required|date', 'reference' => 'required|string|max:255|unique:expenses,reference,' . $expense->id, 'category_id' => 'required', - 'amount' => 'required|integer', + 'amount' => 'required|numeric|max:2147483647', 'details' => 'nullable|string|max:1000' ]); diff --git a/Modules/Expense/Resources/views/expenses/create.blade.php b/Modules/Expense/Resources/views/expenses/create.blade.php index aabe04ea..994d2204 100644 --- a/Modules/Expense/Resources/views/expenses/create.blade.php +++ b/Modules/Expense/Resources/views/expenses/create.blade.php @@ -12,7 +12,7 @@ @section('content')
-
+ @csrf
@@ -54,7 +54,7 @@
- +
@@ -71,3 +71,26 @@
@endsection +@push('page_scripts') + + +@endpush + diff --git a/Modules/Expense/Resources/views/expenses/edit.blade.php b/Modules/Expense/Resources/views/expenses/edit.blade.php index 6483b87b..21df5e45 100644 --- a/Modules/Expense/Resources/views/expenses/edit.blade.php +++ b/Modules/Expense/Resources/views/expenses/edit.blade.php @@ -12,7 +12,7 @@ @section('content')
- + @csrf @method('patch')
@@ -54,16 +54,14 @@
- +
- +
@@ -73,3 +71,27 @@ @endsection +@push('page_scripts') + + +@endpush diff --git a/Modules/People/Database/Seeders/PeopleDatabaseSeeder.php b/Modules/People/Database/Seeders/PeopleDatabaseSeeder.php index ccdd043a..97bc777f 100644 --- a/Modules/People/Database/Seeders/PeopleDatabaseSeeder.php +++ b/Modules/People/Database/Seeders/PeopleDatabaseSeeder.php @@ -4,6 +4,8 @@ namespace Modules\People\Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; +use Modules\People\Entities\Customer; +use Modules\People\Entities\Supplier; class PeopleDatabaseSeeder extends Seeder { @@ -14,8 +16,7 @@ class PeopleDatabaseSeeder extends Seeder */ public function run() { - Model::unguard(); - - // $this->call("OthersTableSeeder"); + Customer::factory()->count(15)->create(); + Supplier::factory()->count(6)->create(); } } diff --git a/Modules/People/Database/factories/CustomerFactory.php b/Modules/People/Database/factories/CustomerFactory.php new file mode 100644 index 00000000..11fe6cc2 --- /dev/null +++ b/Modules/People/Database/factories/CustomerFactory.php @@ -0,0 +1,32 @@ + $this->faker->name(), + 'customer_email' => $this->faker->safeEmail(), + 'customer_phone' => $this->faker->phoneNumber(), + 'city' => $this->faker->city(), + 'country' => $this->faker->country(), + 'address' => $this->faker->streetAddress() + ]; + } +} + diff --git a/Modules/People/Database/factories/SupplierFactory.php b/Modules/People/Database/factories/SupplierFactory.php new file mode 100644 index 00000000..919b140e --- /dev/null +++ b/Modules/People/Database/factories/SupplierFactory.php @@ -0,0 +1,32 @@ + $this->faker->name(), + 'supplier_email' => $this->faker->safeEmail(), + 'supplier_phone' => $this->faker->phoneNumber(), + 'city' => $this->faker->city(), + 'country' => $this->faker->country(), + 'address' => $this->faker->streetAddress() + ]; + } +} + diff --git a/Modules/People/Entities/Customer.php b/Modules/People/Entities/Customer.php index 1866e916..ebabceba 100644 --- a/Modules/People/Entities/Customer.php +++ b/Modules/People/Entities/Customer.php @@ -12,4 +12,8 @@ class Customer extends Model protected $guarded = []; + protected static function newFactory() { + return \Modules\People\Database\factories\CustomerFactory::new(); + } + } diff --git a/Modules/People/Entities/Supplier.php b/Modules/People/Entities/Supplier.php index 04cdbec6..9ec771c8 100644 --- a/Modules/People/Entities/Supplier.php +++ b/Modules/People/Entities/Supplier.php @@ -11,4 +11,7 @@ class Supplier extends Model protected $guarded = []; + protected static function newFactory() { + return \Modules\People\Database\factories\SupplierFactory::new(); + } } diff --git a/Modules/People/Http/Controllers/CustomersController.php b/Modules/People/Http/Controllers/CustomersController.php index 691b2931..e3b2a1f8 100644 --- a/Modules/People/Http/Controllers/CustomersController.php +++ b/Modules/People/Http/Controllers/CustomersController.php @@ -31,7 +31,7 @@ class CustomersController extends Controller $request->validate([ 'customer_name' => 'required|string|max:255', - 'customer_phone' => 'required|numeric', + 'customer_phone' => 'required|max:255', 'customer_email' => 'required|email|max:255', 'city' => 'required|string|max:255', 'country' => 'required|string|max:255', @@ -72,7 +72,7 @@ class CustomersController extends Controller $request->validate([ 'customer_name' => 'required|string|max:255', - 'customer_phone' => 'required|numeric', + 'customer_phone' => 'required|max:255', 'customer_email' => 'required|email|max:255', 'city' => 'required|string|max:255', 'country' => 'required|string|max:255', diff --git a/Modules/People/Http/Controllers/SuppliersController.php b/Modules/People/Http/Controllers/SuppliersController.php index 182342d3..28cf424d 100644 --- a/Modules/People/Http/Controllers/SuppliersController.php +++ b/Modules/People/Http/Controllers/SuppliersController.php @@ -31,7 +31,7 @@ class SuppliersController extends Controller $request->validate([ 'supplier_name' => 'required|string|max:255', - 'supplier_phone' => 'required|numeric', + 'supplier_phone' => 'required|max:255', 'supplier_email' => 'required|email|max:255', 'city' => 'required|string|max:255', 'country' => 'required|string|max:255', @@ -72,7 +72,7 @@ class SuppliersController extends Controller $request->validate([ 'supplier_name' => 'required|string|max:255', - 'supplier_phone' => 'required|numeric', + 'supplier_phone' => 'required|max:255', 'supplier_email' => 'required|email|max:255', 'city' => 'required|string|max:255', 'country' => 'required|string|max:255', diff --git a/Modules/Product/Entities/Product.php b/Modules/Product/Entities/Product.php index 56dfa03d..c2583846 100644 --- a/Modules/Product/Entities/Product.php +++ b/Modules/Product/Entities/Product.php @@ -24,4 +24,20 @@ class Product extends Model implements HasMedia $this->addMediaCollection('default') ->useFallbackUrl('/images/fallback_product_image.png'); } + + public function setProductCostAttribute($value) { + $this->attributes['product_cost'] = ($value * 100); + } + + public function getProductCostAttribute($value) { + return ($value / 100); + } + + public function setProductPriceAttribute($value) { + $this->attributes['product_price'] = ($value * 100); + } + + public function getProductPriceAttribute($value) { + return ($value / 100); + } } diff --git a/Modules/Product/Http/Requests/ProductCreateRequest.php b/Modules/Product/Http/Requests/ProductCreateRequest.php index 5b8d8f4e..c65e3f12 100644 --- a/Modules/Product/Http/Requests/ProductCreateRequest.php +++ b/Modules/Product/Http/Requests/ProductCreateRequest.php @@ -19,8 +19,8 @@ class ProductCreateRequest extends FormRequest 'product_code' => ['required', 'string', 'max:255', 'unique:products,product_code'], 'product_barcode_symbology' => ['required', 'string', 'max:255'], 'product_quantity' => ['required', 'integer', 'min:1'], - 'product_cost' => ['required', 'integer'], - 'product_price' => ['required', 'integer'], + 'product_cost' => ['required', 'numeric', 'max:2147483647'], + 'product_price' => ['required', 'numeric', 'max:2147483647'], 'product_stock_alert' => ['required', 'integer', 'min:0'], 'product_order_tax' => ['nullable', 'integer', 'min:1'], 'product_tax_type' => ['nullable', 'integer'], diff --git a/Modules/Product/Http/Requests/ProductUpdateRequest.php b/Modules/Product/Http/Requests/ProductUpdateRequest.php index b220a6ae..65287dd0 100644 --- a/Modules/Product/Http/Requests/ProductUpdateRequest.php +++ b/Modules/Product/Http/Requests/ProductUpdateRequest.php @@ -20,8 +20,8 @@ class ProductUpdateRequest extends FormRequest 'product_code' => ['required', 'string', 'max:255', 'unique:products,product_code,' . $this->product->id], 'product_barcode_symbology' => ['required', 'string', 'max:255'], 'product_quantity' => ['required', 'integer', 'min:1'], - 'product_cost' => ['required', 'integer'], - 'product_price' => ['required', 'integer'], + 'product_cost' => ['required', 'numeric', 'max:2147483647'], + 'product_price' => ['required', 'numeric', 'max:2147483647'], 'product_stock_alert' => ['required', 'integer', 'min:0'], 'product_order_tax' => ['nullable', 'integer', 'min:1'], 'product_tax_type' => ['nullable', 'integer'], diff --git a/Modules/Product/Resources/views/products/create.blade.php b/Modules/Product/Resources/views/products/create.blade.php index cbf43367..c86a6f6b 100644 --- a/Modules/Product/Resources/views/products/create.blade.php +++ b/Modules/Product/Resources/views/products/create.blade.php @@ -16,7 +16,7 @@ @section('content')
- + @csrf
@@ -74,13 +74,13 @@
- +
- +
@@ -95,7 +95,7 @@
- +
@@ -139,5 +139,27 @@ @push('page_scripts') @include('includes.filepond-js') + + @endpush diff --git a/Modules/Product/Resources/views/products/edit.blade.php b/Modules/Product/Resources/views/products/edit.blade.php index f2f9a251..88e38e3c 100644 --- a/Modules/Product/Resources/views/products/edit.blade.php +++ b/Modules/Product/Resources/views/products/edit.blade.php @@ -16,7 +16,7 @@ @section('content')
- + @csrf @method('patch')
@@ -74,13 +74,13 @@
- +
- +
@@ -140,5 +140,30 @@ @push('page_scripts') @include('includes.filepond-js') + + @endpush diff --git a/Modules/User/Database/Seeders/PermissionsTableSeeder.php b/Modules/User/Database/Seeders/PermissionsTableSeeder.php index 0477bb20..42407b9e 100644 --- a/Modules/User/Database/Seeders/PermissionsTableSeeder.php +++ b/Modules/User/Database/Seeders/PermissionsTableSeeder.php @@ -38,6 +38,8 @@ class PermissionsTableSeeder extends Seeder 'create_expenses', 'edit_expenses', 'delete_expenses', + //Expense Categories + 'access_expense_categories', //Customers 'access_customers', 'create_customers', @@ -50,6 +52,11 @@ class PermissionsTableSeeder extends Seeder 'show_suppliers', 'edit_suppliers', 'delete_suppliers', + //Currencies + 'access_currencies', + 'create_currencies', + 'edit_currencies', + 'delete_currencies', ]; foreach ($permissions as $permission) { diff --git a/app/DataTables/CurrencyDataTable.php b/app/DataTables/CurrencyDataTable.php new file mode 100644 index 00000000..8d6af85e --- /dev/null +++ b/app/DataTables/CurrencyDataTable.php @@ -0,0 +1,75 @@ +eloquent($query) + ->addColumn('action', function ($data) { + return view('currency::partials.actions', compact('data')); + }); + } + + public function query(Currency $model) { + return $model->newQuery(); + } + + public function html() { + return $this->builder() + ->setTableId('currency-table') + ->columns($this->getColumns()) + ->minifiedAjax() + ->dom("<'row'<'col-md-3'l><'col-md-5 mb-2'B><'col-md-4'f>> . + 'tr' . + <'row'<'col-md-5'i><'col-md-7 mt-2'p>>") + ->orderBy(0) + ->buttons( + Button::make('excel') + ->text(' Excel'), + Button::make('print') + ->text(' Print'), + Button::make('reset') + ->text(' Reset'), + Button::make('reload') + ->text(' Reload') + ); + } + + protected function getColumns() { + return [ + Column::make('currency_name') + ->className('text-center align-middle'), + + Column::make('code') + ->className('text-center align-middle'), + + Column::make('symbol') + ->className('text-center align-middle'), + + Column::make('thousand_separator') + ->className('text-center align-middle'), + + Column::make('decimal_separator') + ->className('text-center align-middle'), + + Column::computed('action') + ->exportable(false) + ->printable(false) + ->className('text-center align-middle') + ]; + } + + protected function filename() { + return 'Currency_' . date('YmdHis'); + } +} diff --git a/app/Helpers/helpers.php b/app/Helpers/helpers.php new file mode 100644 index 00000000..b3d9bbc7 --- /dev/null +++ b/app/Helpers/helpers.php @@ -0,0 +1 @@ +-1&&(e=e.replace("-",""),n="-"),e.indexOf(t.prefix)>-1&&(e=e.replace(t.prefix,"")),e.indexOf(t.suffix)>-1&&(e=e.replace(t.suffix,"")),n+t.prefix+e+t.suffix}function t(e,t){return t.allowEmpty&&""===e?"":t.reverse?a(e,t):n(e,t)}function n(t,n){var a,i,o,l=t.indexOf("-")>-1&&n.allowNegative?"-":"",s=t.replace(/[^0-9]/g,"");return a=r(s.slice(0,s.length-n.precision),l,n),n.precision>0&&(i=s.slice(s.length-n.precision),o=new Array(n.precision+1-i.length).join(0),a+=n.decimal+o+i),e(a,n)}function a(t,n){var a,i=t.indexOf("-")>-1&&n.allowNegative?"-":"",o=t.replace(n.prefix,"").replace(n.suffix,""),l=o.split(n.decimal)[0],s="";if(""===l&&(l="0"),a=r(l,i,n),n.precision>0){var c=o.split(n.decimal);c.length>1&&(s=c[1]),a+=n.decimal+s;var u=Number.parseFloat(l+"."+s).toFixed(n.precision).toString().split(n.decimal)[1];a=a.split(n.decimal)[0]+"."+u}return e(a,n)}function r(e,t,n){return e=e.replace(/^0*/g,""),""===(e=e.replace(/\B(?=(\d{3})+(?!\d))/g,n.thousands))&&(e="0"),t+e}$.browser||($.browser={},$.browser.mozilla=/mozilla/.test(navigator.userAgent.toLowerCase())&&!/webkit/.test(navigator.userAgent.toLowerCase()),$.browser.webkit=/webkit/.test(navigator.userAgent.toLowerCase()),$.browser.opera=/opera/.test(navigator.userAgent.toLowerCase()),$.browser.msie=/msie/.test(navigator.userAgent.toLowerCase()),$.browser.device=/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));var i={prefix:"",suffix:"",affixesStay:!0,thousands:",",decimal:".",precision:2,allowZero:!1,allowNegative:!1,doubleClickSelection:!0,allowEmpty:!1,bringCaretAtEndOnFocus:!0},o={destroy:function(){return $(this).unbind(".maskMoney"),$.browser.msie&&(this.onpaste=null),this},applyMask:function(e){return t(e,$(this).data("settings"))},mask:function(e){return this.each(function(){var t=$(this);return"number"==typeof e&&t.val(e),t.trigger("mask")})},unmasked:function(){return this.map(function(){var e,t=$(this).val()||"0",n=-1!==t.indexOf("-");return $(t.split(/\D/).reverse()).each(function(t,n){if(n)return e=n,!1}),t=t.replace(/\D/g,""),t=t.replace(new RegExp(e+"$"),"."+e),n&&(t="-"+t),parseFloat(t)})},unmaskedWithOptions:function(){return this.map(function(){var e=$(this).val()||"0",t=$(this).data("settings")||i,n=new RegExp(t.thousandsForUnmasked||t.thousands,"g");return e=e.replace(n,""),parseFloat(e)})},init:function(n){return n=$.extend($.extend({},i),n),this.each(function(){function a(){var e,t,n,a,r,i=x.get(0),o=0,l=0;return"number"==typeof i.selectionStart&&"number"==typeof i.selectionEnd?(o=i.selectionStart,l=i.selectionEnd):(t=document.selection.createRange())&&t.parentElement()===i&&(a=i.value.length,e=i.value.replace(/\r\n/g,"\n"),(n=i.createTextRange()).moveToBookmark(t.getBookmark()),(r=i.createTextRange()).collapse(!1),n.compareEndPoints("StartToEnd",r)>-1?o=l=a:(o=-n.moveStart("character",-a),o+=e.slice(0,o).split("\n").length-1,n.compareEndPoints("EndToEnd",r)>-1?l=a:(l=-n.moveEnd("character",-a),l+=e.slice(0,l).split("\n").length-1))),{start:o,end:l}}function r(){var e=!(x.val().length>=x.attr("maxlength")&&x.attr("maxlength")>=0),t=a(),n=t.start,r=t.end,i=!(t.start===t.end||!x.val().substring(n,r).match(/\d/)),o="0"===x.val().substring(0,1);return e||i||o}function i(e){w.formatOnBlur||x.each(function(t,n){if(n.setSelectionRange)n.focus(),n.setSelectionRange(e,e);else if(n.createTextRange){var a=n.createTextRange();a.collapse(!0),a.moveEnd("character",e),a.moveStart("character",e),a.select()}})}function o(e){var n,a=x.val().length;x.val(t(x.val(),w)),n=x.val().length,w.reverse||(e-=a-n),i(e)}function l(){var e=x.val();if(!w.allowEmpty||""!==e){var n=e.indexOf(w.decimal);if(w.precision>0)if(n<0)e+=w.decimal+new Array(w.precision+1).join(0);else{var a=e.slice(0,n),r=e.slice(n+1);e=a+w.decimal+r+new Array(w.precision+1-r.length).join(0)}else n>0&&(e=e.slice(0,n));x.val(t(e,w))}}function s(){var e=x.val();return w.allowNegative?""!==e&&"-"===e.charAt(0)?e.replace("-",""):"-"+e:e}function c(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function u(e){var t=(e=e||window.event).which||e.charCode||e.keyCode,n=w.decimal.charCodeAt(0);return void 0!==t&&(!(t<48||t>57)||t===n&&w.reverse?!!r()&&((t!==n||!d())&&(!!w.formatOnBlur||(c(e),p(e),!1))):g(t,e))}function d(){return!v()&&f()}function v(){var e=x.val().length,t=a();return 0===t.start&&t.end===e}function f(){return x.val().indexOf(w.decimal)>-1}function p(e){var t,n,r,i,l=(e=e||window.event).which||e.charCode||e.keyCode,s="";l>=48&&l<=57&&(s=String.fromCharCode(l)),n=(t=a()).start,r=t.end,i=x.val(),x.val(i.substring(0,n)+s+i.substring(r,i.length)),o(n+1)}function g(e,t){return 45===e?(x.val(s()),!1):43===e?(x.val(x.val().replace("-","")),!1):13===e||9===e||(!(!$.browser.mozilla||37!==e&&39!==e||0!==t.charCode)||(c(t),!0))}function m(){setTimeout(function(){l()},0)}function h(){return(parseFloat("0")/Math.pow(10,w.precision)).toFixed(w.precision).replace(new RegExp("\\.","g"),w.decimal)}var w,b,x=$(this);w=$.extend({},n),w=$.extend(w,x.data()),x.data("settings",w),$.browser.device&&x.attr("type","tel"),x.unbind(".maskMoney"),x.bind("keypress.maskMoney",u),x.bind("keydown.maskMoney",function(e){var t,n,r,i,l,s=(e=e||window.event).which||e.charCode||e.keyCode;return void 0!==s&&(t=a(),n=t.start,r=t.end,8!==s&&46!==s&&63272!==s||(c(e),i=x.val(),n===r&&(8===s?""===w.suffix?n-=1:(l=i.split("").reverse().join("").search(/\d/),r=1+(n=i.length-l-1)):r+=1),x.val(i.substring(0,n)+i.substring(r,i.length)),o(n),!1))}),x.bind("blur.maskMoney",function(t){if($.browser.msie&&u(t),w.formatOnBlur&&x.val()!==b&&p(t),""===x.val()&&w.allowEmpty)x.val("");else if(""===x.val()||x.val()===e(h(),w))w.allowZero?w.affixesStay?x.val(e(h(),w)):x.val(h()):x.val("");else if(!w.affixesStay){var n=x.val().replace(w.prefix,"").replace(w.suffix,"");x.val(n)}x.val()!==b&&x.change()}),x.bind("focus.maskMoney",function(){b=x.val(),l();var e,t=x.get(0);w.selectAllOnFocus?t.select():t.createTextRange&&w.bringCaretAtEndOnFocus&&((e=t.createTextRange()).collapse(!1),e.select())}),x.bind("click.maskMoney",function(){var e,t=x.get(0);w.selectAllOnFocus||(t.setSelectionRange&&w.bringCaretAtEndOnFocus?(e=x.val().length,t.setSelectionRange(e,e)):x.val(x.val()))}),x.bind("dblclick.maskMoney",function(){var e,t,n=x.get(0);n.setSelectionRange&&w.bringCaretAtEndOnFocus?(t=x.val().length,e=w.doubleClickSelection?0:t,n.setSelectionRange(e,t)):x.val(x.val())}),x.bind("cut.maskMoney",m),x.bind("paste.maskMoney",m),x.bind("mask.maskMoney",l)})}};$.fn.maskMoney=function(e){return o[e]?o[e].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof e&&e?void $.error("Method "+e+" does not exist on jQuery.maskMoney"):o.init.apply(this,arguments)}}(window.jQuery||window.Zepto); diff --git a/resources/views/layouts/menu.blade.php b/resources/views/layouts/menu.blade.php index d4753ff6..91aefb47 100644 --- a/resources/views/layouts/menu.blade.php +++ b/resources/views/layouts/menu.blade.php @@ -139,3 +139,18 @@ @endcan + +@can('access_currencies') +
  • + + Settings + + +
  • +@endcan