all(); $customer = Customer::findOrFail($data['customer_id']); $deposit = false; if ($data['value'] > 0) { $deposit = true; } $wallet_interface = new WalletInterface($data['customer_id'], (int) $customer->type); $wallet = $wallet_interface->wallet; if (is_null($wallet) && !$deposit) { throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست'); } if (!is_null($wallet) && $wallet->cash < abs($data['value']) && !$deposit) { throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست'); } $orders = Order::where('customer_id', $data['customer_id'])->where('sts', 1)->get(); $gold_block = 0; if (count($orders) > 0) { $value = $data['value']; foreach ($orders as $order) { if ($value < $order->payment_remind) { $order->payment_amount += $value; $order->payment_remind -= $value; $order->save(); break; } else { $value -= $order->payment_remind; $order->payment_amount = $order->total_price; $order->payment_remind = 0; $order->sts = 2; $gold_block -= $order->amount; $order->save(); } } } $user = auth()->user(); $customer = Customer::findOrFail($data["customer_id"]); $Withdraw = Withdraw::create([ 'user_id' => $user->id, 'customer_id' => $customer->id, "cash" => $data['value'], 'sts' => 4, ]); new TransactionInterface($wallet_interface, $_inp = [ 'cash' => $data['value'], 'expire_at' => now(), 'withdraw_id' => $Withdraw->id, 'active' => true ], 3, false, true, $gold_block); $message = 'کیف پول شما به مبلغ ' . self::formatSmsRialAmount($data['value']) . " ریال در تاریخ " . verta()->format('Y/n/j H:i:s') . " شارژ شد " . "\n" . $this->Config('name_fa'); $this->Send($customer->mobile, $message); return response()->json(true); } public function charge(Request $request) { $data = $request->all(); $customer = Customer::findOrFail($data['customer_id']); $deposit = false; if ($data['value'] > 0) { $deposit = true; } $wallet_interface = new WalletInterface($data['customer_id'], (int) $customer->type); $wallet = $wallet_interface->wallet; if (is_null($wallet) && !$deposit) { throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست'); } if (!is_null($wallet) && $wallet->cash < abs($data['value']) && !$deposit) { throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست'); } $orders = Order::where('customer_id', $data['customer_id'])->where('sts', 1)->get(); $gold_block = 0; $user = auth()->user(); $customer = Customer::findOrFail($data["customer_id"]); $Withdraw = Withdraw::create([ 'user_id' => $user->id, 'customer_id' => $customer->id, "cash" => $data['value'], "note" => $data['note'], 'sts' => 4, ]); $type = $deposit ? 3 : 4; new TransactionInterface($wallet_interface, $_inp = [ 'gold' => 0, 'cash' => $data['value'], 'expire_at' => now(), "note" => $data['note'], 'withdraw_id' => $Withdraw->id, 'active' => true ], $type, true, $deposit, $gold_block); if($this->Config('send_to_tahesab') == "true"){ try { $data['direction'] = $deposit ? 0 : 1; $tahesab = new TahesabController(); $tahesab->wallet($data); }catch (\Exception $e){ return response($e->getMessage(), 500); } } //send sms to users and customer $status = $data['value'] > 0 ?" شارژ شد ": " کسر شد "; if($this->Config('charge_notif') == "true"){ $message = 'کیف پول کاربر ' . $customer->name . ' به مقدار ' . self::formatSmsRialAmount($data['value']) . " ریال در تاریخ " . verta()->format('Y/n/j H:i:s') .$status . "بابت" . "\n" . $data['note'] . "\n" . $this->Config('name_fa'); User::where('send_sms', 1)->get()->each(function ($admin) use ($message, $data) { $this->send($admin->mobile, $message); }); } $message = 'کیف پول شما به اندازه ' . self::formatSmsRialAmount($data['value']) . " ریال در تاریخ " . verta()->format('Y/n/j H:i:s') .$status . "بابت" . "\n" . $data['note'] . "\n" . $this->Config('name_fa'); $this->Send($customer->mobile, $message); return response()->json(true); } public function charge_gold(Request $request) { $data = $request->all(); $customer = Customer::findOrFail($data['customer_id']); $deposit = false; if ($data['value'] > 0) { $deposit = true; } $wallet_interface = new WalletInterface($data['customer_id'], (int) $customer->type); $wallet = $wallet_interface->wallet; // if (is_null($wallet) && !$deposit) { // throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست'); // } // if (!is_null($wallet) && $wallet->cash < abs($data['value']) && !$deposit) { // throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست'); // } $gold_block = 0; $user = auth()->user(); $customer = Customer::findOrFail($data["customer_id"]); $Withdraw = Withdraw::create([ 'user_id' => $user->id, 'customer_id' => $customer->id, "gold" => $data['value'], "note" => $data['note'], 'sts' => 4, ]); $representative = app(ConfigService::class)->mainWalletRepresentativeProduct(); new TransactionInterface($wallet_interface, $_inp = [ 'cash' => 0, 'gold' => $data['value'], 'expire_at' => now(), "note" => $data['note'], 'withdraw_id' => $Withdraw->id, 'product_id' => $representative?->id, 'active' => true ], 7, $deposit, false, $gold_block); //send to tahesab if($this->Config('send_to_tahesab') == "true"){ try { $data['direction'] = $deposit ? 1 : 0; $tahesab = new TahesabController(); $tahesab->walletGold($data); }catch (\Exception $e){ return response($e->getMessage(), 500); } } //send sms to users and customer $status = $data['value'] > 0 ?" شارژ شد ": " کسر شد "; $weightUnit = self::tradeWeightUnit(); if($this->Config('charge_notif') == "true"){ $message = 'کیف پول کاربر ' . $customer->name . ' به مقدار ' . self::formatSmsGoldWeight($data['value']) . " {$weightUnit} در تاریخ " . verta()->format('Y/n/j H:i:s') .$status . "بابت" . "\n" . $data['note'] . "\n" . $this->Config('name_fa'); User::where('send_sms', 1)->get()->each(function ($admin) use ($message, $data) { $this->send($admin->mobile, $message); }); } $message = 'کیف پول شما به اندازه ' . self::formatSmsGoldWeight($data['value']) . " {$weightUnit} در تاریخ " . verta()->format('Y/n/j H:i:s') . $status . " بابت" . "\n" . $data['note'] . $this->Config('name_fa'); $this->Send($customer->mobile, $message); return response()->json(true); } public function index(Request $request, TransactionMetalService $transactionMetalService) { $records = Transaction::with(['customer', 'wallet.product:id,metal_id', 'product:id,metal_id']) ->whereNull('fund_id'); TableEngine::create($records, $request->all()) ->initSearch(['order_id', 'customer.name']) ->select([ '*', Transaction::$SELECT_CAJ, Transaction::$SELECT_TYPE_STR, Transaction::$SELECT_SAJ, Transaction::$SELECT_EAJ ])->export($records); if (isset($records['rows'])) { $records['rows'] = $transactionMetalService->enrichTransactionRows($records['rows']); } $records['catalogMetals'] = $transactionMetalService->catalogMetals(); return response()->json($records); } public function updateTransaction(Request $request) { $message = 'تراکنش تغیری نکرده.'; $transaction = Transaction::find($request->id); $product = Product::find($transaction->product_id); if (!$transaction) return response()->json(['error' => 'تراکنش یافت نشد.'], 404); $difference = $request->input('number') - $transaction->number; if (abs($difference) < 0.0001) { return response()->json(['message' => $message], 422); } $transaction->number = $request->input('number'); $wallet_interface = new WalletInterface($transaction->customer_id, 2); if ($wallet_interface->wallet->gold < $difference ) { if (!(isset($request->force) && $request->force === true)){ return response()->json(['message' => "کاربر مورد نظر موجودی ندارد. موجودی فعلی: " . $wallet_interface->wallet->gold . " مقدار مورد نیاز: " . $difference,'type'=>406],422); } } $isDiposit = $difference > 0 ? 0 : 1; new TransactionInterface($wallet_interface, [ "title" => "اصلاح سند " . $transaction->withdraw_id, "note" => $product->title, "product_id" => $product->id, "number" => 0, "gold" => $difference, 'expire_at' => now(), 'active' => true, 'withdraw_id' => $transaction->withdraw_id, 'start_at' => now(), ], 51, $isDiposit, false); $transaction->save(); $message = 'تراکنش با موفقیت به‌روزرسانی شد.'; return response()->json([ 'message' => $message, 'transaction' => $transaction, // 'previous_amount' => $previousAmount, // 'new_amount' => $newAmount, 'difference' => $difference, 'wallet' => $wallet_interface->wallet, ]); } public function indexWallet(Request $request) { $lastPrice = (float) (Price::latest()->first()?->price ?? 0); // همان فیلتر/جستجوی جدول — بدون صفحه‌بندی — برای مجموع ردیف‌های قابل مشاهده $sumQuery = Wallet::query(); TableEngine::create($sumQuery, $request->all()) ->initSearch(['customer.name']); $totalGold = (float) (clone $sumQuery)->sum('gold'); $totalCash = (float) (clone $sumQuery)->sum('cash'); $sums = [ 'gold' => round($totalGold, 2), 'goldToCash' => round($totalGold * $lastPrice, 2), 'cash' => round($totalCash, 2), 'cashToGold' => $lastPrice > 0 ? round($totalCash / $lastPrice, 2) : 0, ]; $records = Wallet::with('customer'); TableEngine::create($records, $request->all()) ->initSearch(['customer.name']) ->select(['*']) ->export($records); $records['sums'] = $sums; return response()->json($records); } public function indexWithdraw(Request $request) { $records = Withdraw::with(['customer', 'bank_account', 'Address', "Transaction"]); Withdraw::applyFlowFilter($records, $request->input('flow_type', 'all')); TableEngine::create($records, $request->all()) ->initSearch(['customer.name']) ->select([ '*', Withdraw::$SELECT_STS_STR, Withdraw::$SELECT_DAJ ])->export($records); return response()->json($records); } public function exportWithdrawReport(Request $request) { $flowType = $request->input('flow_type', 'all'); $query = Withdraw::with(['customer', 'bank_account']); Withdraw::applyFlowFilter($query, $flowType); TableEngine::create($query, $request->all()) ->initSearch(['customer.name']); $rows = $query->orderBy('id', 'desc')->get(); $titles = [ 'all' => 'گزارش برداشت و واریز', 'withdraw' => 'گزارش برداشت', 'deposit' => 'گزارش واریز', ]; return response()->view('admin.withdrawReport', [ 'rows' => $rows, 'title' => $titles[$flowType] ?? $titles['all'], 'flowType' => $flowType, 'generatedAt' => Verta::now()->format('Y/n/j H:i:s'), ])->header('Content-Type', 'text/html; charset=UTF-8'); } public function updateWithdraw(Request $request, $id) { // پیدا کردن رکورد Withdraw با استفاده از شناسه $withdraw = Withdraw::find($id); // بررسی وجود رکورد if (!$withdraw) { return response()->json(['error' => 'Withdraw not found'], 404); } $withdraw->sts = $request->sts; $withdraw->save(); return response()->json(['message' => 'Withdraw updated successfully', 'withdraw' => $withdraw]); } public function getWithdraw(Request $request, $id) { $withdraw = Withdraw::with(['customer', 'bank_account', 'Address', "Transaction"])->find($id); if (!$withdraw) { return response()->json(['error' => 'Withdraw not found'], 404); } return response()->json($withdraw); } public function completeWithdraw(Request $request) { $request->validate([ 'id' => 'required|integer|exists:withdraws,id', 'tracked_number' => 'required|string|max:50', 'date_at' => 'nullable|date', ]); $data = $request->only(['tracked_number', 'date_at']); $data['user_id'] = auth('user')->id(); $data['sts'] = 2; $data['tracked_number'] = (string) $data['tracked_number']; if (empty($data['date_at'])) { $data['date_at'] = now(); } $withdraw = Withdraw::findOrFail($request->id); $withdraw->update($data); // $tahesab = new TahesabController(); // $tahesab->wallet([ // 'customer_id' => $withdraw->customer_id, // 'value' => $withdraw->cash, // 'direction' => 1, // 'note' => 'برداشت از کیف پول شماره ' . $withdraw->id, // ]); return response()->json(true); } }