getTable(), 'agent_id')) { $with[] = 'agent'; } $query = Customer::query(); if ($with !== []) { $query->with($with); } $user = $query->select($select)->findOrFail(auth('customer')->id()); $wallet = Wallet::where('owner', $user->id) ->where('owner_type', $user->type) ->whereNull('fund_id') ->first() ?? new Wallet(); // کیف‌های قدیمیِ محصولات متصل به کیف اصلی (main_wallet_products) در محاسبات نمی‌آیند؛ موجودی‌شان همان gold کیف اصلی است $mainWalletProductIds = app(\App\Services\ConfigService::class)->mainWalletProductIds(); $treasureGrams = 0; $wallet->wp = Wallet::with('product') ->where('owner', $user->id) ->where('owner_type', $user->type) ->get(); foreach ($wallet->wp as $row) { if ($row->product_id != null && !in_array((int) $row->product_id, $mainWalletProductIds, true)) { $treasureGrams += self::productLineWeightToGrams($row->product, $row->gold); } } $goldAbGrams = self::weightToGrams((float) Wallet::where('owner', $user->id) ->where('owner_type', $user->type) ->where('product_id', null) ->sum('gold')); $userGoldGrams = self::weightToGrams((float) $user->gold); $wallet->treasure = round(self::gramsToTradeUnit($treasureGrams), 3); // وقتی main_wallet_products فعال است، customers.gold (legacy) همان طلای کیف اصلی است // و نباید دوباره به treasure_sum اضافه شود — وگرنه gold_sum بعد از رفرش ~۱ گرم بیشتر نشان می‌دهد. if ($mainWalletProductIds !== []) { $wallet->treasure_sum = round(self::gramsToTradeUnit($treasureGrams), 3); } else { $wallet->treasure_sum = round(self::gramsToTradeUnit($userGoldGrams + $treasureGrams), 3); } $wallet->gold_ab = round(self::gramsToTradeUnit($goldAbGrams), 2); $user->wallets = Wallet::with(['product']) ->where('owner', $user->id) ->where('owner_type', $user->type) ->get() ?? new Wallet(); $count_gold = 0; $count_silver = 0; $count_copper = 0; $count_cash_from_gold = 0; $count_cash_from_silver = 0; $count_cash_from_copper = 0; $count_cash_pure = 0; $count_product = 0; foreach ($user->wallets as $walletSingle) { if ($walletSingle->product_id) { if (in_array((int) $walletSingle->product_id, $mainWalletProductIds, true)) { continue; } if ($walletSingle->product->metal_id == 1) { if (!($walletSingle->product->group_type == "سکه")) { $count_gold += self::productLineWeightToGrams($walletSingle->product, $walletSingle->gold); } $count_cash_from_gold += $walletSingle->product->price * $walletSingle->gold; $count_product += $walletSingle->gold; } elseif ($walletSingle->product->metal_id == 2) { if (!($walletSingle->product->group_type == "سکه")) { $count_silver += self::productLineWeightToGrams($walletSingle->product, $walletSingle->gold); } $count_cash_from_silver += ($walletSingle->product->price * self::productPriceMultiplier($walletSingle->product)) * $walletSingle->gold; $count_product += $walletSingle->gold; } elseif ($walletSingle->product->metal_id == 3) { if (!($walletSingle->product->group_type == "سکه")) { $count_copper += self::productLineWeightToGrams($walletSingle->product, $walletSingle->gold); } $count_cash_from_copper += ($walletSingle->product->price * self::productPriceMultiplier($walletSingle->product)) * $walletSingle->gold; $count_product += $walletSingle->gold; } } elseif ($walletSingle->fund_id === null) { $count_gold += self::weightToGrams((float) $walletSingle->gold); $count_cash_pure += $walletSingle->cash; $wallet->count_cash_wallet = $walletSingle->cash; $wallet->count_gold_wallet = round(self::gramsToTradeUnit(self::weightToGrams((float) $walletSingle->gold)), 3); } } $mainWalletGoldWeight = (float) ($wallet->count_gold_wallet ?? 0); if ($mainWalletGoldWeight > 0) { $liveGold = (int) app(\App\Services\ProductDisplayPriceService::class)->resolveAppBasePrice(); if ($liveGold <= 0) { $liveGold = (int) (\App\Models\Price::latest('id')->value('price') ?? 0); } if ($liveGold > 0) { $count_cash_from_gold += $mainWalletGoldWeight * $liveGold; } } $count_cash_total = $count_cash_from_gold + $count_cash_from_silver + $count_cash_from_copper + $count_cash_pure; $mainWalletCash = app(WalletBalanceService::class)->mainWalletCash($user->wallets); $wallet->count_cash_wallet = $mainWalletCash; $wallet->count_cash_wallets = $count_cash_total - $mainWalletCash; $wallet->count_gold = round(self::gramsToTradeUnit($count_gold), 3); $wallet->count_gold_wallets = round($wallet->count_gold - $wallet->count_gold_wallet, 3); $wallet->count_silver = round(self::gramsToTradeUnit($count_silver), 3); $wallet->count_copper = round(self::gramsToTradeUnit($count_copper), 3); $wallet->count_product = $count_product; $wallet->cash_from_gold = $count_cash_from_gold; $wallet->cash_from_silver = $count_cash_from_silver; $wallet->cash_from_copper = $count_cash_from_copper; $wallet->count_cash_total = $count_cash_total; // cash در پاسخ = موجودی ریالی کیف اصلی (نه کیف legacy محصولات main_wallet_products) $wallet->cash = $mainWalletCash; $wallet->count_cash = $mainWalletCash; // جمع واقعی طلا از کیف‌ها — هم‌تراز wallet/me و کارت محصول (بدون دوباره‌شماری customers.gold) $wallet->gold_sum = round((float) $wallet->count_gold, 2); $user->wallet = $wallet; $user->pwallet = Wallet::with("product")->where('owner', $user->id) ->where('owner_type', $user->type) // Ensures the wallet's owner type matches the user's type ->whereNotNull('product_id') // Filters wallets that have a non-null product_id ->when($mainWalletProductIds !== [], function ($q) use ($mainWalletProductIds) { // کیف قدیمی محصولات متصل به کیف اصلی نمایش داده نمی‌شود $q->whereNotIn('product_id', $mainWalletProductIds); }) ->get() ?? new Wallet(); // If no wallet is found, assigns a new Wallet instance to the attribute $forbiddenWords = ['tahesab', 'token']; // کلمات ممنوعه $query = Setting::query(); // حذف رکوردهایی که key شامل کلمات ممنوعه است foreach ($forbiddenWords as $word) { $query->where('key', 'not like', "%{$word}%"); }$settings = $query->get(); $user->settings= $settings; return response()->json($user); } public function updateMe(Request $request) { try { $customer = Customer::findOrFail(auth('customer')->id()); $wasLegal = (int) $customer->is_legal; $updateData = $request->except(['referral_id', 'referral_to_id', 'is_legal']); if (!empty($updateData['birth_date'])) { try { $updateData['birth_date'] = Carbon::parse($updateData['birth_date'])->format('Y-m-d'); } catch (\Exception $e) { return response()->json(['message' => 'تاریخ تولد نامعتبر است.'], 422); } } if (isset($request->fname) && isset($request->lname)) { $updateData['name'] = "$request->fname $request->lname"; } if ($request->has('credential_id')) { $updateData['credential_id'] = $request->credential_id; } $customer->update($updateData); // $tah = new TahesabController(); // $tah->store(["customer_id" => $customer->id]); $cfg = app(ConfigService::class); if (!$wasLegal && !empty($customer->n_code)) { $nCodeError = JibitIdentityService::nationalCodeError($customer->n_code); if ($nCodeError !== null) { return response()->json([ 'message' => $nCodeError, 'code' => 'invalid_national_code', ], 422); } try { $response = $this->jibitNcode($customer->n_code, $customer->mobile); } catch (\Throwable $e) { Log::error('customer updateMe jibit unreachable', [ 'customer_id' => $customer->id, 'message' => $e->getMessage(), ]); return response()->json([ 'message' => 'ارتباط با سرویس احراز هویت جیبیت برقرار نشد. لطفاً دقایقی دیگر مجدداً تلاش فرمایید.', 'code' => 'jibit_unreachable', ], 422); } $jibit = JibitIdentityService::interpretNationalMobileMatch($response); if ($jibit['ok']) { $customer->is_legal = 1; $customer->save(); // واریز پاداش معرف مستقل از has_page_earn_money (آن فقط منوی اپ است) $referrer = $customer->referrer(); $gift_permision = app(ReferralGiftService::class)->resolveReferrerGiftPermission($referrer); app(ReferralGiftService::class)->tryGiveOnRegistration( $customer, $referrer, $gift_permision, true ); } else { Log::warning('customer updateMe jibit not verified', [ 'customer_id' => $customer->id, 'code' => $jibit['code'], 'jibit_code' => is_array($response) ? ($response['code'] ?? null) : null, 'http_status' => is_array($response) ? ($response['http_status'] ?? null) : null, ]); return response()->json([ 'message' => $jibit['message'], 'code' => $jibit['code'], ], 422); } } return response()->json(true); } catch (QueryException $e) { Log::error('customer updateMe failed', [ 'customer_id' => auth('customer')->id(), 'message' => $e->getMessage(), ]); $driverCode = (int) ($e->errorInfo[1] ?? 0); $sqlMessage = (string) ($e->errorInfo[2] ?? $e->getMessage()); if ($driverCode === 1062) { if (str_contains($sqlMessage, 'n_code')) { return response()->json([ 'message' => 'این کد ملی قبلاً برای حساب دیگری ثبت شده است.', 'code' => 'duplicate_national_code', ], 422); } if (str_contains($sqlMessage, 'mobile')) { return response()->json([ 'message' => 'این شماره موبایل قبلاً برای حساب دیگری ثبت شده است.', 'code' => 'duplicate_mobile', ], 422); } return response()->json([ 'message' => 'این مقدار قبلاً در سیستم ثبت شده و تکراری است.', 'code' => 'duplicate_value', ], 422); } return response()->json([ 'message' => 'ذخیره اطلاعات در دیتابیس انجام نشد. جزئیات در لاگ سرور ثبت شد.', 'code' => 'db_error', ], 422); } catch (\Exception $e) { Log::error('customer updateMe failed', [ 'customer_id' => auth('customer')->id(), 'message' => $e->getMessage(), ]); return response()->json([ 'message' => 'خطا در ذخیره اطلاعات. لطفاً دوباره تلاش کنید.', 'code' => 'update_failed', ], 422); } } public function active_finger() { $customer = Customer::findOrFail(auth('customer')->id()); if ($customer->finger_print) { $customer->finger_print = false; // Set to false if currently true } else { $customer->finger_print = true; // Set to true if currently false } $customer->save(); return response()->json($customer); } public function imFrom($code) { $referrer = Customer::where('referral_id', $code)->first(); if ($referrer) { // Define the reward amount $rewardAmount = 200000; // Adjusted reward amount as per the new requirement // Update the referred customer with the referral code $newCustomer = auth('customer')->user(); // Assuming the new customer is authenticated $newCustomer->referral_id = $code; $newCustomer->save(); // Construct the SMS message $message = sprintf( "%s با کد معرف شما ثبت نام کرد.\nکیف پول شما %d ریال به عنوان پاداش شارژ شد.\n%s", $newCustomer->name, $rewardAmount, $this->Config('name_fa') ); // Send SMS to the referrer $this->Send($referrer->mobile, $message); return response()->json(['message' => 'Referral reward processed and SMS sent to referrer.'], 200); } else { return response()->json(['error' => 'کد نامعتبر میباشد'], 422); } } public function i_have(Request $request) { $user = auth('customer')->user(); $customer_referral_id = Customer::where("id", $user['id'])->first()->referral_id; $return['users'] = Customer::where("referral_to_id", $customer_referral_id)->get(); $return['gifts'] = TransactionsAdmin::with(['withdraw', 'order', "user", 'customerTo', 'customer'])->where("customer_to_id", $user->id)->get(); $return['usersSum'] = $return['users']->count(); $return['giftsSum'] = number_format($return['gifts']->sum('gold'), 3); return response()->json($return); } }