From 6ade3799448754c6ea17ae7d48d2828e7abfc944 Mon Sep 17 00:00:00 2001 From: adonis Date: Mon, 25 May 2026 19:42:48 +0330 Subject: [PATCH] merge product controller with kashkool --- .../Controllers/Admin/ProductController.php | 284 +++++++++++++----- app/Services/ConfigService.php | 19 +- ...01_add_provider_fields_to_orders_table.php | 44 +++ 3 files changed, 268 insertions(+), 79 deletions(-) create mode 100644 database/migrations/2026_05_25_163201_add_provider_fields_to_orders_table.php diff --git a/app/Http/Controllers/Admin/ProductController.php b/app/Http/Controllers/Admin/ProductController.php index 4cb103d..fe2165a 100644 --- a/app/Http/Controllers/Admin/ProductController.php +++ b/app/Http/Controllers/Admin/ProductController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\SuperController; -use App\Models\Cnt; use App\Models\Product; use App\DB\Te\TableEngine; use Illuminate\Support\Facades\DB; @@ -12,30 +11,46 @@ use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; use Illuminate\Support\Facades\Http; use \App\Http\Controllers\Customer\FundController; -use App\Http\Controllers\Site\ReportController ; - +use App\Http\Controllers\Site\ReportController; +use App\Services\ConfigService; class ProductController extends SuperController { + + private $configService; + public function __construct() { + $this->configService = app(ConfigService::class); + $this->with = ['file'/*, 'price', 'default', 'sub'*/]; -// $this->with = []; + parent::__construct(Product::class, $this->with, ['*'], null, null, ['title']); } + + private function shouldUpdatePriceOnList(): bool + { + return $this->configService->ConfigBool('product_update_price_on_list', true); + } + + private function shouldAutoCloseOpenOnList(): bool + { + return $this->configService->ConfigBool('product_auto_close_open_on_list', true); + } + public function tableProduct(Request $request) { $data = $request->all(); - if (isset($data["select"]) && is_null($data["select"])){ + if (isset($data["select"]) && is_null($data["select"])) { $data["select"] = []; } - if (is_null($this->query)){ + if (is_null($this->query)) { $query_table = $this->model::with($this->with); //*******کداضافه شده // ->where('active', '<=', now()) // فیلتر محصولات فعال // ->get(); //********* - }else{ + } else { $query_table = $this->query; // $query_table = $query_table->where('active', '<=', now()); } @@ -45,7 +60,8 @@ class ProductController extends SuperController ->export($query_table); $query_table['auto_open_at'] = Product::selectRaw( 'SEC_TO_TIME(AVG(TIME_TO_SEC(TIME(auto_open_at)))) as avg_time' - )->value('avg_time'); $query_table['auto_close_at'] = Product::selectRaw( + )->value('avg_time'); + $query_table['auto_close_at'] = Product::selectRaw( 'SEC_TO_TIME(AVG(TIME_TO_SEC(TIME(auto_close_at)))) as avg_time' )->value('avg_time'); @@ -81,16 +97,15 @@ class ProductController extends SuperController { // return 1; - $data = $request->all(); - if (isset($data["price"])){ - $data["reading_method"] = null; - } - if (isset($data["auto_close_at"]) and isset($data["auto_close_at"])){ - if ($data["auto_close_at"] == $data["auto_open_at"]){ - unset($data["auto_open_at"]); - unset($data["auto_close_at"]); - } - } + $data = $request->all(); + if (isset($data["price"])) { + $data["reading_method"] = null; + } + if (isset($data["auto_close_at"], $data["auto_open_at"])) { + if ($data["auto_close_at"] == $data["auto_open_at"]) { + unset($data["auto_open_at"], $data["auto_close_at"]); + } + } // return $data['price']; @@ -102,7 +117,7 @@ class ProductController extends SuperController // $data['auto_open_at'] = Carbon::parse($data['auto_open_at'])->format('Y-m-d H:i:s'); // $data['auto_close_at'] = Carbon::parse($data['auto_close_at'])->format('Y-m-d H:i:s'); // Product::find($id)->update($data); - Product::find($id)->update($data); + Product::findOrFail($id)->update($data); return response()->json(true); } @@ -117,81 +132,196 @@ class ProductController extends SuperController public function listProduct() { -// $this->getPrice(); -// $this->auto_close_open(); + if ($this->shouldUpdatePriceOnList()) { + $this->syncProductPrices(); + } + + if ($this->shouldAutoCloseOpenOnList()) { + $this->syncAutoCloseOpen(); + } + $product = Product::with(['file'])->where('active', 1)->get(); + return response()->json($product); } public function getPrice() { -// $RPrices = Http::get('https://pricing.liman.gold/pricingApi', [])->json(); -// $RPrices = Http::get('https://pricing.liman.gold/pricingApi', [])->json(); -// $RPrices =Http::timeout(40)->get('http://212.23.201.173:8381/price_list', [])->json(); - $RPrices = Http::timeout(40)->get('http://109.122.246.48:4949/api/free', [])->json(); - -// try{ -// $cooper =Http::timeout(40)->get('https://www.livedata.ir/main/static/p.json', [])->json(); -// if(isset($cooper['s_301006']) && isset($cooper['s_200103'])){ -// $CP = (($cooper['s_301006']/1000000)*$cooper['s_200103'])*10; -//// Cnt::where('key', 'cu_price') -// } -// }catch (\Exception $e){} - - $products = Product::with([])->whereNotNull('reading_method')->get(); - foreach ($products as $product) { - $collection = collect($RPrices); - $RPrice = $collection->firstWhere('key', $product->reading_method); - if (!empty($RPrice)) { -// foreach ($RPrices as $RPrice) { -// if ($product->reading_method == $RPrice['name']) { - if ($RPrice['name'] == 'TGJU فلز مس') { - $copper = $RPrice['price'] + $RPrice['profit']; - } - if ($RPrice['name'] == 'TGJU دلار') { - $dollar = $RPrice['price'] + $RPrice['profit']; - } - if ($RPrice['name'] == 'گلد دات ای از آبشده - رسمی - نقد فردا') { - $RPrice['price'] = $RPrice['price'] / 4.3318; - } - $p = Product::where('id', $product->id)->update([ - 'price' => $RPrice['price'], - 'price_profit' => $RPrice['profit'], - ]); - - if ($product->bubble == 1) { - $ReportController = new ReportController(); - $liquidGold = $ReportController->lastPrice(); - $p = Product::find($product->id); - $p->amount = $RPrice['price'] / $liquidGold['price']; - $p->save(); - - } - } - } - if (isset($copper) && isset($dollar)) { - $cp = ($copper / 1000000) * $dollar; - $p = Product::where('metal_id', 3)->update([ - 'price' => $cp, - 'price_profit' => 0, - 'updated_at' => \Carbon\Carbon::now()->format('Y-m-d H:i:s'), - ]); - } + $this->syncProductPrices(); return response()->json(true); } + private function syncProductPrices(): void + { + $RPrices = $this->fetchPriceList(); + + if (empty($RPrices) || !is_array($RPrices)) { + return; + } + + $collection = collect($RPrices); + + $products = Product::with([])->whereNotNull('reading_method')->get(); + + $copper = null; + $dollar = null; + + foreach ($products as $product) { + $RPrice = $collection->firstWhere('key', $product->reading_method) + ?: $collection->firstWhere('name', $product->reading_method); + + if (empty($RPrice)) { + continue; + } + if (!isset($RPrice['price'])) { + continue; + } + + if (($RPrice['name'] ?? null) === 'TGJU فلز مس') { + $copper = ((float)$RPrice['price']) + ((float)($RPrice['profit'] ?? 0)); + } + + if (($RPrice['name'] ?? null) === 'TGJU دلار') { + $dollar = ((float)$RPrice['price']) + ((float)($RPrice['profit'] ?? 0)); + } + + if (($RPrice['name'] ?? null) === 'گلد دات ای از آبشده - رسمی - نقد فردا') { + $RPrice['price'] = ((float)$RPrice['price']) / 4.3318; + } + + + Product::where('id', $product->id)->update([ + 'price' => $RPrice['price'], + 'price_profit' => $RPrice['profit'] ?? 0, + ]); + + if ((int)$product->bubble === 1) { + $ReportController = new ReportController(); + $liquidGold = $ReportController->lastPrice(); + + if (!empty($liquidGold['price'])) { + $p = Product::find($product->id); + $p->amount = ((float)$RPrice['price']) / ((float)$liquidGold['price']); + $p->save(); + } + } + } + + if ($copper !== null && $dollar !== null) { + $cp = ($copper / 1000000) * $dollar; + + Product::where('metal_id', 3)->update([ + 'price' => $cp, + 'price_profit' => 0, + 'updated_at' => now(), + ]); + } + } + + private function fetchPriceList(): array + { + $urls = []; + + /* + * اگر خواستی برای هر پروژه از دیتابیس URL بدی: + * product_price_api_url = http://... + */ + $customUrl = $this->configService->Config('product_price_api_url', null); + + if (!empty($customUrl)) { + $urls[] = $customUrl; + } + + /* + * اگر پروژه از مدل جدید قیمت استفاده می‌کنه + */ + if ( + $this->configService->ConfigBool('tabanGohar_price', false) || + $this->configService->ConfigBool('goldir_price', false) + ) { + $urls[] = 'http://109.122.246.48:4949/api/free'; + } + + /* + * fallback قدیمی + */ + $urls[] = 'http://212.23.201.173:8381/price_list'; + + foreach (array_unique($urls) as $url) { + try { + $response = Http::timeout(40)->get($url); + + if (!$response->successful()) { + continue; + } + + $json = $response->json(); + + if (isset($json['data']) && is_array($json['data'])) { + return $json['data']; + } + + if (is_array($json) && !empty($json)) { + return $json; + } + } catch (\Throwable $e) { + report($e); + } + } + + return []; + } + public function auto_close_open() + { + $this->syncAutoCloseOpen(); + + return response()->json(true); + } + + private function syncAutoCloseOpen(): void { $products = Product::with([])->get(); $current_time = now()->format('H:i:s'); + foreach ($products as $product) { + if (empty($product->auto_open_at) || empty($product->auto_close_at)) { + continue; + } + $show = ($current_time >= $product->auto_open_at && $current_time <= $product->auto_close_at); + Product::where('id', $product->id)->update([ 'show' => $show, ]); } - return response()->json(true); + } + + public function ProductById($id) + { + if ($this->shouldUpdatePriceOnList()) { + $this->syncProductPrices(); + } + + if ($this->shouldAutoCloseOpenOnList()) { + $this->syncAutoCloseOpen(); + } + + $product = Product::with(['file']) + ->where('id', $id) + ->first(); + + if (!$product) { + return response()->json(false); + } + + $product->similar = Product::with(['file']) + ->where('group_type', $product->group_type) + ->where('id', '!=', $id) + ->get(); + + return response()->json($product); } @@ -267,8 +397,10 @@ class ProductController extends SuperController return response()->json(true); } - public function updatePrice(Request $request){ - + public function updatePrice(Request $request) + { + $this->syncProductPrices(); + return response()->json(true); } } diff --git a/app/Services/ConfigService.php b/app/Services/ConfigService.php index b5d6fd6..27e2a74 100644 --- a/app/Services/ConfigService.php +++ b/app/Services/ConfigService.php @@ -6,14 +6,27 @@ use App\Models\Setting; class ConfigService { - public function Config($name) + public function Config($name, $default = false) { - return Setting::where('key', $name)->value('value') ?? false; + $value = Setting::where('key', $name)->value('value'); + + return $value !== null ? $value : $default; + } + + public function ConfigBool(string $name, bool $default = false): bool + { + $value = $this->Config($name, null); + + if ($value === null) { + return $default; + } + + return in_array(strtolower(trim((string) $value)), ['1', 'true', 'yes', 'on'], true); } public function UpdateConfig($name, $value) { - return \App\Models\Setting::updateOrCreate( + return Setting::updateOrCreate( ['key' => $name], ['value' => $value] ); diff --git a/database/migrations/2026_05_25_163201_add_provider_fields_to_orders_table.php b/database/migrations/2026_05_25_163201_add_provider_fields_to_orders_table.php new file mode 100644 index 0000000..b557113 --- /dev/null +++ b/database/migrations/2026_05_25_163201_add_provider_fields_to_orders_table.php @@ -0,0 +1,44 @@ +unsignedBigInteger('provider_id') + ->nullable() + ->after('id') + ->index(); + }); + } + + if (!Schema::hasColumn('orders', 'total_price_montzar')) { + Schema::table('orders', function (Blueprint $table) { + $table->decimal('total_price_montzar', 20, 4) + ->nullable() + ->after('total_price'); + }); + } + } + + public function down() + { + if (Schema::hasColumn('orders', 'total_price_montzar')) { + Schema::table('orders', function (Blueprint $table) { + $table->dropColumn('total_price_montzar'); + }); + } + + if (Schema::hasColumn('orders', 'provider_id')) { + Schema::table('orders', function (Blueprint $table) { + $table->dropIndex(['provider_id']); + $table->dropColumn('provider_id'); + }); + } + } +} \ No newline at end of file