diff --git a/app/Console/Commands/GoldPriceUpdate.php b/app/Console/Commands/GoldPriceUpdate.php new file mode 100644 index 0000000..51de199 --- /dev/null +++ b/app/Console/Commands/GoldPriceUpdate.php @@ -0,0 +1,49 @@ +request('GET', $this->api); + $data = json_decode($response->getBody()->getContents()); +// print_r($data); + if (isset($data->gold)) { + $s = Setting::where('key', 'gold')->first(); + $s->value = floor($data->gold / 10); + $s->save(); + $this->info('Price updated successfully'); + }else{ + $this->error('Price update failed'); + } +// Log::info('updated gold price'); + + } +} diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 930185c..8867dcb 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -1461,6 +1461,7 @@ function findArea($name,$model = null) return \App\Models\Area::where('name', $name)->first(); } + /** * cache number * @return false|mixed|string|null @@ -1497,3 +1498,21 @@ function getSubGroupSetting($key, $limit = 10, $order = 'id', $dir = "DESC") return Group::where('id', getSetting($key) ?? 1)->first() ->children()->orderBy($order, $dir)->limit($limit)->get(); } + + +/** + * calculate gold pice + * @param $gr + * @param $fee + * @return float|int + */ +function CalcPrice($gold,$gr, $fee) +{ + $p = $gold; +// $n = ($p * $gr); + $n1 = $p + ($p * ($fee / 100)); + $n2 = ($n1 + ($n1 * 0.07) - $p) ; + $n3 = ($n2 * config('app.xshop.vat')) + $n2; + $complete = (( $n3 + $p ) * $gr) ; + return floor($complete / 1000) * 1000; +} diff --git a/app/Http/Controllers/Admin/ProductController.php b/app/Http/Controllers/Admin/ProductController.php index 58f559e..612577d 100644 --- a/app/Http/Controllers/Admin/ProductController.php +++ b/app/Http/Controllers/Admin/ProductController.php @@ -59,6 +59,8 @@ class ProductController extends XController $product->table = $request->input('table'); $product->description = $request->input('desc'); $product->excerpt = $request->input('excerpt'); + $product->addon = $request->input('addon'); + $product->wage = $request->input('wage'); $product->keyword = $request->input('keyword'); $product->stock_status = $request->input('stock_status'); $product->price = $request->input('price', 0); diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index b85c03c..b12b3f4 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -32,8 +32,12 @@ class ClientController extends Controller public function __construct() { + $this->middleware(function ($request, $next) { + if (!auth()->check()){ + abort(403); + } if ($request->attributes->get('set_lang') != true) { app()->setLocale(config('app.locale')); \Session::remove('locate'); diff --git a/app/Models/Product.php b/app/Models/Product.php index d6ffcf3..a7b0a22 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -228,6 +228,9 @@ class Product extends Model implements HasMedia $result = []; $i = 0; foreach ($metas as $key => $value) { + if ($result[$key]['data']['type']??null == null){ + continue; + } $result[$key] = [ 'value' => $value, 'data' => Prop::where('name', $key)->first(), diff --git a/app/Observers/SettingObsever.php b/app/Observers/SettingObsever.php index 593e76c..95c40d5 100644 --- a/app/Observers/SettingObsever.php +++ b/app/Observers/SettingObsever.php @@ -2,6 +2,7 @@ namespace App\Observers; +use App\Models\Product; use App\Models\Setting; class SettingObsever @@ -21,7 +22,35 @@ class SettingObsever */ public function updated(Setting $setting): void { - // + if ($setting->key == 'gold' && $setting->wasChanged('value')) { +// $p = (float)str_replace(',', '', $setting->value); +// if ($setting->value != $p) { +// $setting->value = $p; +// $setting->save(); +// return; +// } + $pros = Product::where('status', 1)->get(); + foreach ($pros as $pro) { + $low = []; + if ($pro->quantities()->count() > 0) { + foreach ($pro->quantities as $q) { + $data = json_decode($q->data); + $q->price = CalcPrice($setting->value,$data->weight, $pro->wage) + $pro->addon; + $low[] = $q->price; + $q->save(); + } + $pro->price = min($low); + }else{ + $pro->price = 0; + } + if ( ( ($pro->price * (int) getSetting('min') ) / 100) < $pro->buy_price) { + $pro->stock_status = 'OUT_STOCK'; + } else{ + $pro->stock_status = 'IN_STOCK'; + } + $pro->save(); + } + } } /** @@ -47,4 +76,4 @@ class SettingObsever { // } -} +} \ No newline at end of file diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index f9aa019..339827e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; use App\Console\Commands\AssetsBuild; +use App\Console\Commands\GoldPriceUpdate; use App\Helpers\TDate; use App\Http\Middleware\Acl; use App\Models\Area; @@ -26,6 +27,7 @@ class AppServiceProvider extends ServiceProvider $this->commands([ TranslatorCommand::class, AssetsBuild::class, + GoldPriceUpdate::class, ]); foreach (config('xshop.payment.gateways') as $gateway){ /** @var \App\Contracts\Payment $gateway */ diff --git a/config/app.php b/config/app.php index ecf77d6..b38a25a 100644 --- a/config/app.php +++ b/config/app.php @@ -192,7 +192,8 @@ return [ 'payment' => [ 'gateway' => env('PAY_GATEWAY',''), 'merchant_id' => env('MERCHANT_ID',''), - ] + ], + 'vat' => 0.09 ], diff --git a/database/migrations/2024_10_29_082531_gold_items.php b/database/migrations/2024_10_29_082531_gold_items.php new file mode 100644 index 0000000..7d3d12a --- /dev/null +++ b/database/migrations/2024_10_29_082531_gold_items.php @@ -0,0 +1,28 @@ +unsignedBigInteger('addon')->default(0); + $table->unsignedBigInteger('wage')->default(15); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/database/seeders/SettingSeeder.php b/database/seeders/SettingSeeder.php index 236bb08..b57e640 100644 --- a/database/seeders/SettingSeeder.php +++ b/database/seeders/SettingSeeder.php @@ -16,6 +16,22 @@ class SettingSeeder extends Seeder // $sections = [ 'General' => [ + [ + 'title' => __("Gold price"), + 'key' => 'gold', + 'type' => 'TEXT', + 'ltr' => true, + 'value' => '100000', + 'size' => '12', + ], + [ + 'title' => __("Minimum percent"), + 'key' => 'min', + 'type' => 'TEXT', + 'ltr' => true, + 'value' => '105', + 'size' => '12', + ], [ 'title' => __("Email"), 'key' => 'email', diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index ff29209..7c26cf4 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -57,7 +57,5 @@ class UserSeeder extends Seeder $user->assignRole('user'); $user->save(); -// User::factory(50)->create(); - } } diff --git a/resources/lang/fa.json b/resources/lang/fa.json index c96cc49..28a75fe 100644 --- a/resources/lang/fa.json +++ b/resources/lang/fa.json @@ -61,6 +61,7 @@ "Added by:": "اضافه شده توسط", "Added items view depends on theme part": "موارد اضافه شده بسته به نوع نمای انتخاب شده متفاوت خواهد بود", "Additional data": "اطلاعات تکمیلی", + "Addon price": "قیمت اقلام اضافه", "Address": "نشانی", "Address added successfully": "نشانی اضافه شد", "Address added to :CUSTOMER": "نشانی به :CUSTOMER اضافه شد", @@ -260,6 +261,7 @@ "Gallery": "گالری", "General": "عمومی", "Gfxes": "طراحی‌ها", + "Gold price": "قیمت طلا", "Good": "خوب", "Graphic": "گرافیک", "Group": "سرفصل", @@ -564,6 +566,7 @@ "View product": "نمایش محصول", "Visitors": "بازدیدکنندگان", "Visits": "بازدید‌ها", + "Wage": "درصد اجرت", "We recommending add title each images": "به شما پیشنهاد می‌کنیم که برای هر تصویر یک عنوان اضافه کنید", "Website attachments list": "فهرست پیوست‌های سایت", "Weight": "وزن", diff --git a/resources/views/admin/products/sub-pages/product-step1.blade.php b/resources/views/admin/products/sub-pages/product-step1.blade.php index 666d885..624df85 100644 --- a/resources/views/admin/products/sub-pages/product-step1.blade.php +++ b/resources/views/admin/products/sub-pages/product-step1.blade.php @@ -25,7 +25,7 @@ -
+
-
+
+
+ + + +
+
+
+
+ + + +
+
+