From 4597ef3b1be34073c5857fc01e111c909720ca4b Mon Sep 17 00:00:00 2001 From: diepdp Date: Tue, 17 Sep 2024 17:16:31 +0700 Subject: [PATCH] feat(settings): add currency setting --- config/app.php | 78 +++++++++++++++++++ .../Webkul/Admin/src/Config/core_config.php | 15 ++++ .../src/DataGrids/Product/ProductDataGrid.php | 2 +- .../Admin/src/Resources/lang/en/app.php | 4 + .../views/configuration/index.blade.php | 17 ++-- .../Resources/views/products/edit.blade.php | 2 +- .../views/products/view/attributes.blade.php | 4 +- .../Attribute/src/Traits/CustomAttribute.php | 17 +++- packages/Webkul/Category/package.json | 26 +++++++ .../Category/publishable/assets/css/admin.css | 1 + .../assets/images/Icon-Temp-Active.svg | 12 +++ .../publishable/assets/images/Icon-Temp.svg | 12 +++ .../Category/publishable/assets/js/app.js | 1 + packages/Webkul/Category/src/Config/acl.php | 10 +++ packages/Webkul/Category/src/Config/menu.php | 11 +++ .../Http/Controllers/CategoryController.php | 76 ++++++++++++++++++ packages/Webkul/Category/src/Http/routes.php | 10 +++ .../src/Providers/CategoryServiceProvider.php | 59 ++++++++++++++ .../src/Providers/ModuleServiceProvider.php | 11 +++ .../assets/images/Icon-Temp-Active.svg | 12 +++ .../src/Resources/assets/images/Icon-Temp.svg | 12 +++ .../Category/src/Resources/assets/js/app.js | 0 .../src/Resources/assets/sass/admin.scss | 17 ++++ .../src/Resources/views/index.blade.php | 23 ++++++ .../Resources/views/layouts/style.blade.php | 1 + packages/Webkul/Category/webpack.mix.js | 39 ++++++++++ packages/Webkul/Core/src/Core.php | 35 ++++++--- tests/Feature/ConfigurationTest.php | 31 ++++++++ 28 files changed, 516 insertions(+), 22 deletions(-) create mode 100644 packages/Webkul/Category/package.json create mode 100644 packages/Webkul/Category/publishable/assets/css/admin.css create mode 100644 packages/Webkul/Category/publishable/assets/images/Icon-Temp-Active.svg create mode 100644 packages/Webkul/Category/publishable/assets/images/Icon-Temp.svg create mode 100644 packages/Webkul/Category/publishable/assets/js/app.js create mode 100644 packages/Webkul/Category/src/Config/acl.php create mode 100644 packages/Webkul/Category/src/Config/menu.php create mode 100644 packages/Webkul/Category/src/Http/Controllers/CategoryController.php create mode 100644 packages/Webkul/Category/src/Http/routes.php create mode 100644 packages/Webkul/Category/src/Providers/CategoryServiceProvider.php create mode 100644 packages/Webkul/Category/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Category/src/Resources/assets/images/Icon-Temp-Active.svg create mode 100644 packages/Webkul/Category/src/Resources/assets/images/Icon-Temp.svg create mode 100644 packages/Webkul/Category/src/Resources/assets/js/app.js create mode 100644 packages/Webkul/Category/src/Resources/assets/sass/admin.scss create mode 100644 packages/Webkul/Category/src/Resources/views/index.blade.php create mode 100644 packages/Webkul/Category/src/Resources/views/layouts/style.blade.php create mode 100644 packages/Webkul/Category/webpack.mix.js create mode 100644 tests/Feature/ConfigurationTest.php diff --git a/config/app.php b/config/app.php index 526fe3b91..b353264e0 100644 --- a/config/app.php +++ b/config/app.php @@ -115,6 +115,84 @@ 'tr' => 'Türkçe', ], + /* + |-------------------------------------------------------------------------- + | Available Currencies Configuration + |-------------------------------------------------------------------------- + | + | The application available currencies determines the supported currencies + | by application and their respective flags. The key of the array is the + | currency code and the value is the currency flag. + | + */ + + 'available_currencies' => [ + 'AED' => 'united-arab-emirates-dirham', + 'ARS' => 'argentine-peso', + 'AUD' => 'australian-dollar', + 'BDT' => 'bangladeshi-taka', + 'BRL' => 'brazilian-real', + 'CAD' => 'canadian-dollar', + 'CHF' => 'swiss-franc', + 'CLP' => 'chilean-peso', + 'CNY' => 'chinese-yuan', + 'COP' => 'colombian-peso', + 'CZK' => 'czech-koruna', + 'DKK' => 'danish-krone', + 'DZD' => 'algerian-dinar', + 'EGP' => 'egyptian-pound', + 'EUR' => 'euro', + 'FJD' => 'fijian-dollar', + 'GBP' => 'british-pound-sterling', + 'HKD' => 'hong-kong-dollar', + 'HUF' => 'hungarian-forint', + 'IDR' => 'indonesian-rupiah', + 'ILS' => 'israeli-new-shekel', + 'INR' => 'indian-rupee', + 'JOD' => 'jordanian-dinar', + 'JPY' => 'japanese-yen', + 'KRW' => 'south-korean-won', + 'KWD' => 'kuwaiti-dinar', + 'KZT' => 'kazakhstani-tenge', + 'LBP' => 'lebanese-pound', + 'LKR' => 'sri-lankan-rupee', + 'LYD' => 'libyan-dinar', + 'MAD' => 'moroccan-dirham', + 'MUR' => 'mauritian-rupee', + 'MXN' => 'mexican-peso', + 'MYR' => 'malaysian-ringgit', + 'NGN' => 'nigerian-naira', + 'NOK' => 'norwegian-krone', + 'NPR' => 'nepalese-rupee', + 'NZD' => 'new-zealand-dollar', + 'OMR' => 'omani-rial', + 'PAB' => 'panamanian-balboa', + 'PEN' => 'peruvian-nuevo-sol', + 'PHP' => 'philippine-peso', + 'PKR' => 'pakistani-rupee', + 'PLN' => 'polish-zloty', + 'PYG' => 'paraguayan-guarani', + 'QAR' => 'qatari-rial', + 'RON' => 'romanian-leu', + 'RUB' => 'russian-ruble', + 'SAR' => 'saudi-riyal', + 'SEK' => 'swedish-krona', + 'SGD' => 'singapore-dollar', + 'THB' => 'thai-baht', + 'TND' => 'tunisian-dinar', + 'TRY' => 'turkish-lira', + 'TWD' => 'new-taiwan-dollar', + 'UAH' => 'ukrainian-hryvnia', + 'USD' => 'united-states-dollar', + 'UZS' => 'uzbekistani-som', + 'VEF' => 'venezuelan-bolívar', + 'VND' => 'vietnamese-dong', + 'XAF' => 'cfa-franc-beac', + 'XOF' => 'cfa-franc-bceao', + 'ZAR' => 'south-african-rand', + 'ZMW' => 'zambian-kwacha', + ], + /* |-------------------------------------------------------------------------- | Application Fallback Locale diff --git a/packages/Webkul/Admin/src/Config/core_config.php b/packages/Webkul/Admin/src/Config/core_config.php index 7bd575d63..29cfcd232 100644 --- a/packages/Webkul/Admin/src/Config/core_config.php +++ b/packages/Webkul/Admin/src/Config/core_config.php @@ -27,4 +27,19 @@ ], ], ], + [ + 'key' => 'general.general.currency-settings', + 'name' => 'admin::app.configuration.index.general.general.currency-settings.title', + 'info' => 'admin::app.configuration.index.general.general.currency-settings.title-info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'currency', + 'title' => 'admin::app.configuration.index.general.general.currency-settings.title', + 'type' => 'select', + 'default' => 'USD', + 'options' => 'Webkul\Core\Core@retrieveCurrencies', + ], + ], + ], ]; diff --git a/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php index d758c9e49..6c444d295 100644 --- a/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php +++ b/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php @@ -68,7 +68,7 @@ public function prepareColumns(): void 'sortable' => true, 'searchable' => true, 'filterable' => true, - 'closure' => fn ($row) => round($row->price, 2), + 'closure' => fn ($row) => core()->formatBasePrice(round($row->price, 2)), ]); $this->addColumn([ diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index 7fa7b4f9c..b5fb38330 100644 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -1841,6 +1841,10 @@ 'title' => 'Locale Settings', 'title-info' => 'Defines the language used in the user interface, such as English (en), French (fr), or Japanese (ja).', ], + 'currency-settings' => [ + 'title' => 'Currency Settings', + 'title-info' => 'Defines the currency used in the user interface, such as US Dollar ($), Euro (€), or Japanese Yen (¥).', + ], ], ], ], diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php index d25d3c1b0..19fbe7821 100644 --- a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php @@ -19,10 +19,10 @@
-
@@ -37,6 +37,7 @@ class="block w-full rounded-lg border bg-white px-10 py-1.5 leading-6 text-gray-
@foreach (system_config()->getItems() as $item) +
@@ -53,7 +54,7 @@ class="block w-full rounded-lg border bg-white px-10 py-1.5 leading-6 text-gray-
@foreach ($item->getChildren() as $key => $child) - @@ -67,7 +68,7 @@ class="flex max-w-[360px] items-center gap-2 rounded-lg p-2 transition-all hover

{{ $child->getName() }}

- +

{{ $child->getInfo() }}

@@ -86,7 +87,7 @@ class="flex max-w-[360px] items-center gap-2 rounded-lg p-2 transition-all hover
- app.component('v-configuration-search', { template: '#v-configuration-search-template', - + data() { return { isDropdownOpen: false, @@ -169,7 +170,7 @@ class="p-4 text-sm font-semibold text-gray-600 dark:text-gray-300" this.isDropdownOpen = true; this.isLoading = true; - + this.$axios.get("{{ route('admin.configuration.search') }}", { params: {query: this.searchTerm} }) diff --git a/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php index b0e00c931..a77bc8b31 100644 --- a/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php @@ -30,7 +30,7 @@
{!! view_render_event('admin.products.edit.create_button.before', ['product' => $product]) !!} - +
-{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!} \ No newline at end of file +{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!} diff --git a/packages/Webkul/Attribute/src/Traits/CustomAttribute.php b/packages/Webkul/Attribute/src/Traits/CustomAttribute.php index acb3830dd..7d862ec9e 100644 --- a/packages/Webkul/Attribute/src/Traits/CustomAttribute.php +++ b/packages/Webkul/Attribute/src/Traits/CustomAttribute.php @@ -56,6 +56,13 @@ public function getAttribute($key) } } + // check key === 'price' and return the price attribute value + if (isset($this->id) && $key === 'price') { + $attribute = app(AttributeRepository::class)->getAttributeByCode($key); + + return $this->getCustomAttributeValue($attribute); + } + return parent::getAttribute($key); } @@ -112,7 +119,15 @@ public function getCustomAttributeValue($attribute) $attributeValue = $this->attribute_values->where('attribute_id', $attribute->id)->first(); - return $attributeValue[self::$attributeTypeFields[$attribute->type]] ?? null; + $value = $attributeValue[self::$attributeTypeFields[$attribute->type]] ?? null; + + // Custom handling for price attribute + if ($attribute->code === 'price') { + // Format price, e.g., add currency symbol and format decimal places + $value = round($value, 2); + } + + return $value; } /** diff --git a/packages/Webkul/Category/package.json b/packages/Webkul/Category/package.json new file mode 100644 index 000000000..5f0b6e27f --- /dev/null +++ b/packages/Webkul/Category/package.json @@ -0,0 +1,26 @@ +{ + "private": true, + "scripts": { + "dev": "npm run development", + "development": "mix", + "watch": "mix watch", + "watch-poll": "mix watch -- --watch-options-poll=1000", + "hot": "mix watch --hot", + "prod": "npm run production", + "production": "mix --production" + }, + "devDependencies": { + "cross-env": "^7.0.3", + "laravel-mix": "^6.0.6", + "laravel-mix-merge-manifest": "^2.0.0", + "lodash": "^4.17.19", + "postcss": "^8.1.14", + "sass": "^1.32.8", + "sass-loader": "^11.0.1", + "vue": "^2.6.12", + "vue-loader": "^15.9.6", + "vue-template-compiler": "^2.6.12" + }, + "dependencies": { + } +} \ No newline at end of file diff --git a/packages/Webkul/Category/publishable/assets/css/admin.css b/packages/Webkul/Category/publishable/assets/css/admin.css new file mode 100644 index 000000000..1a17a0493 --- /dev/null +++ b/packages/Webkul/Category/publishable/assets/css/admin.css @@ -0,0 +1 @@ +.temp-icon{width:48px;height:48px;display:inline-block;background-size:cover;background-image:url(../images/Icon-Temp.svg)}.active.temp-icon,.active .temp-icon{background-image:url(../images/Icon-Temp-Active.svg)} \ No newline at end of file diff --git a/packages/Webkul/Category/publishable/assets/images/Icon-Temp-Active.svg b/packages/Webkul/Category/publishable/assets/images/Icon-Temp-Active.svg new file mode 100644 index 000000000..d4c61687b --- /dev/null +++ b/packages/Webkul/Category/publishable/assets/images/Icon-Temp-Active.svg @@ -0,0 +1,12 @@ + + + + Icon-Catalog-Active + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Category/publishable/assets/images/Icon-Temp.svg b/packages/Webkul/Category/publishable/assets/images/Icon-Temp.svg new file mode 100644 index 000000000..7dba04b31 --- /dev/null +++ b/packages/Webkul/Category/publishable/assets/images/Icon-Temp.svg @@ -0,0 +1,12 @@ + + + + Icon-Catalog + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Category/publishable/assets/js/app.js b/packages/Webkul/Category/publishable/assets/js/app.js new file mode 100644 index 000000000..9fa3a9151 --- /dev/null +++ b/packages/Webkul/Category/publishable/assets/js/app.js @@ -0,0 +1 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=0)}({0:function(e,t,n){n("uPOf"),n("y62a"),n("jTz4"),e.exports=n("WyvX")},WyvX:function(e,t){},jTz4:function(e,t){},uPOf:function(e,t){},y62a:function(e,t){}}); \ No newline at end of file diff --git a/packages/Webkul/Category/src/Config/acl.php b/packages/Webkul/Category/src/Config/acl.php new file mode 100644 index 000000000..a21977e04 --- /dev/null +++ b/packages/Webkul/Category/src/Config/acl.php @@ -0,0 +1,10 @@ + 'category', + 'name' => 'Category', + 'route' => 'admin.category.index', + 'sort' => 2 + ] +]; \ No newline at end of file diff --git a/packages/Webkul/Category/src/Config/menu.php b/packages/Webkul/Category/src/Config/menu.php new file mode 100644 index 000000000..5ae7aed77 --- /dev/null +++ b/packages/Webkul/Category/src/Config/menu.php @@ -0,0 +1,11 @@ + 'category', + 'name' => 'Category', + 'route' => 'admin.category.index', + 'sort' => 2, + 'icon-class' => 'temp-icon', + ] +]; \ No newline at end of file diff --git a/packages/Webkul/Category/src/Http/Controllers/CategoryController.php b/packages/Webkul/Category/src/Http/Controllers/CategoryController.php new file mode 100644 index 000000000..f45e0cad4 --- /dev/null +++ b/packages/Webkul/Category/src/Http/Controllers/CategoryController.php @@ -0,0 +1,76 @@ + 'admin/category', + 'middleware' => ['web', 'user'] + ], function () { + + Route::get('', 'Webkul\Category\Http\Controllers\CategoryController@index')->name('admin.category.index'); + +}); \ No newline at end of file diff --git a/packages/Webkul/Category/src/Providers/CategoryServiceProvider.php b/packages/Webkul/Category/src/Providers/CategoryServiceProvider.php new file mode 100644 index 000000000..e7b6a3a3c --- /dev/null +++ b/packages/Webkul/Category/src/Providers/CategoryServiceProvider.php @@ -0,0 +1,59 @@ +loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); + + $this->loadRoutesFrom(__DIR__ . '/../Http/routes.php'); + + $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'category'); + + $this->publishes([ + __DIR__ . '/../../publishable/assets' => public_path('category/assets'), + ], 'public'); + + $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'category'); + + Event::listen('admin.layout.head', function($viewRenderEventManager) { + $viewRenderEventManager->addTemplate('category::layouts.style'); + }); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerConfig(); + } + + /** + * Register package config. + * + * @return void + */ + protected function registerConfig() + { + $this->mergeConfigFrom( + dirname(__DIR__) . '/Config/menu.php', 'menu.admin' + ); + + $this->mergeConfigFrom( + dirname(__DIR__) . '/Config/acl.php', 'acl' + ); + } +} \ No newline at end of file diff --git a/packages/Webkul/Category/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Category/src/Providers/ModuleServiceProvider.php new file mode 100644 index 000000000..c5008463d --- /dev/null +++ b/packages/Webkul/Category/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,11 @@ + + + + Icon-Catalog-Active + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Category/src/Resources/assets/images/Icon-Temp.svg b/packages/Webkul/Category/src/Resources/assets/images/Icon-Temp.svg new file mode 100644 index 000000000..7dba04b31 --- /dev/null +++ b/packages/Webkul/Category/src/Resources/assets/images/Icon-Temp.svg @@ -0,0 +1,12 @@ + + + + Icon-Catalog + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Category/src/Resources/assets/js/app.js b/packages/Webkul/Category/src/Resources/assets/js/app.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/Webkul/Category/src/Resources/assets/sass/admin.scss b/packages/Webkul/Category/src/Resources/assets/sass/admin.scss new file mode 100644 index 000000000..f9cde7eaf --- /dev/null +++ b/packages/Webkul/Category/src/Resources/assets/sass/admin.scss @@ -0,0 +1,17 @@ +.temp-icon { + width: 48px; + height: 48px; + display: inline-block; + background-size: cover; + background-image: url("../images/Icon-Temp.svg"); +} + +.active { + .temp-icon { + background-image: url("../images/Icon-Temp-Active.svg"); + } + + &.temp-icon { + background-image: url("../images/Icon-Temp-Active.svg"); + } +} diff --git a/packages/Webkul/Category/src/Resources/views/index.blade.php b/packages/Webkul/Category/src/Resources/views/index.blade.php new file mode 100644 index 000000000..fb491843a --- /dev/null +++ b/packages/Webkul/Category/src/Resources/views/index.blade.php @@ -0,0 +1,23 @@ +@extends('admin::layouts.master') + +@section('page_title') + Package Category +@stop + +@section('content-wrapper') + +
+ + +
+
+
+ +@stop \ No newline at end of file diff --git a/packages/Webkul/Category/src/Resources/views/layouts/style.blade.php b/packages/Webkul/Category/src/Resources/views/layouts/style.blade.php new file mode 100644 index 000000000..c1a24aa83 --- /dev/null +++ b/packages/Webkul/Category/src/Resources/views/layouts/style.blade.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/Webkul/Category/webpack.mix.js b/packages/Webkul/Category/webpack.mix.js new file mode 100644 index 000000000..db90f4262 --- /dev/null +++ b/packages/Webkul/Category/webpack.mix.js @@ -0,0 +1,39 @@ +const mix = require("laravel-mix"); + +if (mix == 'undefined') { + const { mix } = require("laravel-mix"); +} + +require("laravel-mix-merge-manifest"); + +if (mix.inProduction()) { + var publicPath = 'publishable/assets'; +} else { + var publicPath = "../../../public/vendor/category/assets"; +} + +mix.setPublicPath(publicPath).mergeManifest(); +mix.disableNotifications(); + +mix.js(__dirname + "/src/Resources/assets/js/app.js", "js/admin.js") + .copy(__dirname + "/src/Resources/assets/images", publicPath + "/images") + .sass(__dirname + "/src/Resources/assets/sass/app.scss", "css/admin.css") + .options({ + processCssUrls: false + }).vue(); + +mix.webpackConfig({ + resolve: { + alias: { + 'vue$': 'vue/dist/vue.runtime.js' + } + } +}); + +if (! mix.inProduction()) { + mix.sourceMaps(); +} + +if (mix.inProduction()) { + mix.version(); +} \ No newline at end of file diff --git a/packages/Webkul/Core/src/Core.php b/packages/Webkul/Core/src/Core.php index e66d5e0b8..b0761c15b 100644 --- a/packages/Webkul/Core/src/Core.php +++ b/packages/Webkul/Core/src/Core.php @@ -68,6 +68,25 @@ public function locales(): array return $options; } + /** + * Retrieve all currencies. + */ + public function retrieveCurrencies(): array + { + $options = []; + + foreach (config('app.available_currencies') as $key => $title) { + $formattedTitle = ucwords(str_replace('-', ' ', $title)); + + $options[] = [ + 'title' => $formattedTitle, + 'value' => $key, + ]; + } + + return $options; + } + /** * Retrieve all countries. * @@ -197,10 +216,10 @@ public function xWeekRange($date, $day) /** * Return currency symbol from currency code. * - * @param float $price + * @param $code * @return string */ - public function currencySymbol($code) + public function currencySymbol($code): string { $formatter = new \NumberFormatter(app()->getLocale().'@currency='.$code, \NumberFormatter::CURRENCY); @@ -211,18 +230,16 @@ public function currencySymbol($code) * Format price with base currency symbol. This method also give ability to encode * the base currency symbol and its optional. * - * @param float $price + * @param float $price * @return string */ - public function formatBasePrice($price) + public function formatBasePrice(float $price) { - if (is_null($price)) { - $price = 0; - } - $formatter = new \NumberFormatter(app()->getLocale(), \NumberFormatter::CURRENCY); - return $formatter->formatCurrency($price, config('app.currency')); + return $formatter->formatCurrency($price, + system_config()->getConfigData('general.general.currency-settings.currency') + ?? config('app.currency')); } /** diff --git a/tests/Feature/ConfigurationTest.php b/tests/Feature/ConfigurationTest.php new file mode 100644 index 000000000..fbf901bd0 --- /dev/null +++ b/tests/Feature/ConfigurationTest.php @@ -0,0 +1,31 @@ +actingAs($admin) + ->get(route('admin.configuration.index')) + ->assertOK(); +}); + +it('Test display price configuration page', function () { + $admin = getDefaultAdmin(); + + test()->actingAs($admin) + ->get(route('admin.configuration.index', ['slug' => 'price'])) + ->assertOK(); +}); + +it('Test format currency', function () { + // example of price value + $price = 1000.00; + + // output: ₫1,000 + test()->assertEquals('₫1,000', core()->formatBasePrice($price)); + + // same currency, but different value + // Example: 1000000.00 + // Thai Baht: ฿1,000,000 + // Vietnamese Dong: ₫1,000,000 + // US Dollar: $1,000,000 +});