all(); if($this->Config('goldir_price') == 'true'){ $goldir_closed = Cnt::where('key', 'goldir_closed')->first()['value'] == "true"; $goldir_buy = Cnt::where('key', 'goldir_open_buy')->first()['value'] == "false" && $data['direction'] == 1; $goldir_sell = Cnt::where('key', 'goldir_open_sell')->first()['value'] == "false" && $data['direction'] == 2; if($goldir_closed || $goldir_buy || $goldir_sell){ throw new UnprocessableEntityHttpException('عدم ارائه سرویس.'); } } if($this->Config('close_price') == 'true'){ if(Cnt::where('key', 'app_closed')->first()['value'] == "true"){ throw new UnprocessableEntityHttpException('عدم ارائه سرویس.'); } } // throw new UnprocessableEntityHttpException('به دلیل نوسانات سفارشات بسته میباشد.'); $transactionType = $data['direction'] == 1 ? "خرید" : "فروش"; if (auth('customer')->id()) { $data['customer_id'] = auth('customer')->id(); $latestPrice = Price::latest()->first(); if($latestPrice->price == 0){ throw new UnprocessableEntityHttpException('عدم ارائه سرویس.'); } $data['all_price'] = $latestPrice; $data['price'] = $latestPrice->price; $data['price_id'] = $latestPrice->id; // $data['difference'] = config('fee.cash'); $data['difference'] = Setting::where('key', 'fee_cash')->first()->value; // $data['service_charge_percentage'] = config('fee.service_charge_percentage'); $data['service_charge_percentage'] = Setting::where('key', 'fee_service_charge_percentage')->first()->value; $fee_free = Setting::where('key', 'fee_free')->where('is_active', true)->value('value'); if ($fee_free && $this->feeFree($data['customer_id'], $fee_free)) { $data['service_charge_percentage'] = 0; // $data['difference'] = 0; $data['fee_free'] = true; } $data['pay_at'] = (new \DateTime())->format('Y-m-d H:i:s'); } else if (auth('user')->id()) {//admin $data['service_charge_percentage'] = 0; } if($data['price'] === 0){ throw new UnprocessableEntityHttpException(' سفارشات بسته میباشد.'); } $data['sts'] = 2; $data['type'] = 2; $data['payment_sts'] = 4; $data['price_original'] = $data['price']; $data['payment_remind'] = 0; $data['fee'] = $data['difference']; $wallet_interface = new WalletInterface($data['customer_id'], 2); $wallet = Wallet::where('owner', $data['customer_id'])->whereNull('fund_id')->first(); $response = []; // Check if the user wants to transact with a product or non-product (gold) if (isset($data['product_id']) and $data['product'] = Product::find($data['product_id'])) { // Check if the user wants to buy if ($data['direction'] == 1) { $data['service_charge_percentage'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : ($data['product']['percent_fee_buy']) * $data['number']; $data['difference'] = $data['fee'] = $data['product']['cash_fee_buy']; $data['total_fee'] = $data['number'] * $data['fee']; $data['price_original'] = $data['product']['price'] + $data['product']['price_profit']; $data['total_price_original'] = $data['product']['amount'] * ($data['price_original'] ?? 0); // Check if the method is cash if ($data['method'] == "cash") { $response['buy'] = $this->processBuyTransactionProduct($data, $wallet, $wallet_interface); } // Check if the method is gold else if ($data['method'] == "gold") { $response['buy'] = $this->processBuyTransactionProductByGold($data, $wallet, $wallet_interface); } } // Check if the user wants to sell else if ($data['direction'] == 2) { $data['service_charge_percentage'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : ($data['product']['percent_fee_sell']) * $data['number']; $data['difference'] = $data['fee'] = $data['product']['cash_fee_sell']; $data['total_fee'] = $data['number'] * $data['fee']; $data['price_original'] = $data['product']['price'] + $data['product']['price_profit']; $data['total_price_original'] = $data['product']['amount'] * ($data['price_original'] ?? 0); // Check if the method is cash if ($data['method'] == "cash") { $response['sell'] = $this->processSellTransactionProduct($data, $wallet, $wallet_interface); } // Check if the method is gold else if ($data['method'] == "gold") { $response['sell'] = $this->processSellTransactionProductByGold($data, $wallet, $wallet_interface); } } } else { // Calculate total price and fee for non-product (gold) transaction $data['total_price_original'] = $data['amount'] * ($data['price_original'] ?? 0); $data['total_fee'] = $data['amount'] * $data['difference']; $data['product'] = Product::find(13); // Check if the user wants to buy if ($data['direction'] == 1) { if (!$data['product']['open_buy']) { throw new UnprocessableEntityHttpException('خرید این محصول در این لحظه مقدور نمیباشد'); } $response['buy'] = $this->processBuyTransaction($data, $wallet, $wallet_interface); } // Check if the user wants to sell else if ($data['direction'] == 2) { if (!$data['product']['open_sell']) { throw new UnprocessableEntityHttpException('خرید این محصول در این لحظه مقدور نمیباشد'); } $response['sell'] = $this->processSellTransaction($data, $wallet, $wallet_interface); } } if (Setting::where('key', 'send_to_tahesab')->first()->value == "true") { try { $tahesab = new TahesabController(); $data['tahesab'] = $tahesab->storeTrade($data); } catch (\Exception $e) { return response($e->getMessage(), 500); } } // $response['reward'] = $this->give_order_reward($data, $wallet, $wallet_interface); $response['Notifications'] = $this->sendTransactionNotifications($data, $transactionType); return response()->json([$response, $data]); } private function processBuyTransaction(&$data, $wallet, $wallet_interface) { $response = []; $data['price'] += $data['difference']; $data['total_price'] = $data['amount'] * $data['price']; $data['payment_amount'] = $data['total_price']; $data['service_charge'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : $data['service_charge_percentage'] * $data['amount']; $data['service_charge_price'] = $data['service_charge'] * $data['price_original']; $data['amount'] -= $data['service_charge']; if ($wallet->cash < $data['payment_amount']) { throw new UnprocessableEntityHttpException('موجودی شما کمتر از میزان سفارش است'); } $data['order'] = $order = Order::create($data); new TransactionInterface($wallet_interface, [ "cash" => $data['payment_amount'], "gold" => $data['amount'], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'start_at' => now(), ], 1, true, false); $response['1'] = 2; //send to Goldir $this->sendGoldir($data); return $response; } private function processBuyTransactionProduct(&$data, $wallet, $wallet_interface) { $data['price'] = $data['product']['price'] + $data['product']['price_profit']; $data['price'] += $data['difference']; $data['amount'] = $data['number'] * $data['product']['amount']; $data['total_amount'] = $data['amount'] + ($data['product']['percent_fee_buy'] * $data['amount']); $data['total_price'] = $data['total_amount'] * $data['price']; $data['payment_amount'] = $data['total_price']; $data['service_charge'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : ($data['product']['percent_fee_buy'] * $data['amount']); $data['service_charge_price'] = $data['service_charge'] * $data['price_original']; $data['wallet'] = $wallet; if ($wallet->cash < $data['payment_amount']) { throw new UnprocessableEntityHttpException('موجودی شما کمتر از میزان سفارش است'); } if (!$data['product']['open_buy']) { throw new UnprocessableEntityHttpException('خرید این محصول در این لحظه مقدور نمیباشد'); } $data['order'] = $order = Order::create($data); $data['transaction'][] = new TransactionInterface($wallet_interface, $_inp = [ "number" => $data['number'], "cash" => $data['total_price'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'title' => "برداشت وجه نقد" ], 12, false, false); $wallet_interface_product = new WalletInterface(auth('customer')->id(), auth('customer')->user()->type, null, $data["product_id"]); $wallet_interface_product->wallet->gold = intval($wallet_interface_product->wallet->gold); $wallet_interface_product->wallet->save(); new TransactionInterface($wallet_interface_product, [ "gold" => $data['number'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'start_at' => now(), ], 1, true, false); } private function processBuyTransactionProductByGold(&$data, $wallet, $wallet_interface) { $data['price'] += $data['difference']; $data['amount'] = $data['number'] * $data['product']['amount']; $data['total_amount'] = $data['amount'] + ($data['product']['percent_fee_buy'] * $data['amount']); $data['total_price'] = $data['total_amount'] * $data['price']; $data['payment_amount'] = $data['total_price']; $data['service_charge'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : ($data['product']['percent_fee_buy'] * $data['amount']); $data['total_fee'] = 0; $data['service_charge_price'] = $data['service_charge'] * $data['price_original']; $data['wallet'] = $wallet; if ($wallet->gold < $data['total_amount']) { throw new UnprocessableEntityHttpException('موجودی طلایی شما کمتر از میزان سفارش است'); } if (!$data['product']['open_buy']) { throw new UnprocessableEntityHttpException('خرید این محصول در این لحظه مقدور نمیباشد'); } $data['order'] = $order = Order::create($data); $data['transaction'][] = new TransactionInterface($wallet_interface, $_inp = [ "number" => $data['number'], "gold" => $data['total_amount'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'title' => "برداشت طلای ابشده" ], 12, false, true); $wallet_interface_product = new WalletInterface(auth('customer')->id(), auth('customer')->user()->type, null, $data["product_id"]); $wallet_interface_product->wallet->gold = intval($wallet_interface_product->wallet->gold); $wallet_interface_product->wallet->save(); new TransactionInterface($wallet_interface_product, [ "gold" => $data['number'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'start_at' => now(), ], 1, true, false); } private function processSellTransaction(&$data, $wallet, $wallet_interface) { $response = []; $data['price'] -= $data['difference']; $data['service_charge'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : $data['service_charge_percentage'] * $data['amount']; $data['service_charge_price'] = $data['service_charge'] * $data['price_original']; $data['total_price'] = $data['amount'] * $data['price'] - $data['service_charge_price']; $data['payment_amount'] = $data['total_price']; $data['payment_amount'] -= $data['service_charge_price']; if ($wallet->gold < $data['amount']) { throw new UnprocessableEntityHttpException('موجودی شما کمتر از میزان سفارش است'); } $data['order'] = $order = Order::create($data); new TransactionInterface($wallet_interface, [ "gold" => $data['amount'], "cash" => $data['total_price'], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id ], 2, false, true); //send to Goldir $this->sendGoldir($data); } private function processSellTransactionProduct(&$data, $wallet, $wallet_interface) { $data['price'] = $data['product']['price'] + $data['product']['price_profit']; $data['price'] -= $data['difference']; $data['amount'] = $data['number'] * $data['product']['amount']; $data['total_amount'] = $data['amount'] - ($data['product']['percent_fee_sell'] * $data['amount']); $data['total_price'] = $data['total_amount'] * $data['price']; $data['payment_amount'] = $data['total_price']; $data['service_charge'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : ($data['product']['percent_fee_sell'] * $data['amount']); $data['service_charge_price'] = $data['service_charge'] * $data['price_original']; $wallet_interface_product = new WalletInterface(auth('customer')->id(), auth('customer')->user()->type, null, $data["product_id"]); if ($wallet_interface_product->wallet->gold < $data['number']) { throw new UnprocessableEntityHttpException('موجودی شما کمتر از میزان سفارش است'); } if (!$data['product']['open_sell']) { throw new UnprocessableEntityHttpException('فروش این محصول در این لحظه مقدور نمیباشد'); } $data['order'] = $order = Order::create($data); $wallet_interface_product->wallet->gold = intval($wallet_interface_product->wallet->gold); $wallet_interface_product->wallet->save(); new TransactionInterface($wallet_interface_product, [ "gold" => $data['number'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'start_at' => now(), ], 1, false, false); $data['transaction'][] = new TransactionInterface($wallet_interface, $_inp = [ "number" => $data['number'], "cash" => $data['total_price'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'title' => "واریز وجه نقد" ], 12, false, true); } private function processSellTransactionProductByGold(&$data, $wallet, $wallet_interface) { $data['price'] -= $data['difference']; $data['amount'] = $data['number'] * $data['product']['amount']; $data['total_amount'] = $data['amount'] - ($data['product']['percent_fee_sell'] * $data['amount']); $data['total_price'] = $data['total_amount'] * $data['price']; $data['payment_amount'] = $data['total_price']; $data['service_charge'] = isset($data['fee_free']) && $data['fee_free'] === true ? 0 : ($data['product']['percent_fee_sell'] * $data['amount']); $data['total_fee'] = 0; $data['service_charge_price'] = $data['service_charge'] * $data['price_original']; $wallet_interface_product = new WalletInterface(auth('customer')->id(), auth('customer')->user()->type, null, $data["product_id"]); if ($wallet_interface_product->wallet->gold < $data['number']) { throw new UnprocessableEntityHttpException('موجودی شما کمتر از میزان سفارش است'); } if (!$data['product']['open_sell']) { throw new UnprocessableEntityHttpException('فروش این محصول در این لحظه مقدور نمیباشد'); } $data['order'] = $order = Order::create($data); $data['transaction'][] = new TransactionInterface($wallet_interface, $_inp = [ "number" => $data['number'], "gold" => $data['total_amount'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'title' => "واریز طلای ابشده" ], 12, true, false); $wallet_interface_product->wallet->gold = intval($wallet_interface_product->wallet->gold); $wallet_interface_product->wallet->save(); new TransactionInterface($wallet_interface_product, [ "gold" => $data['number'], "product_id" => $data["product_id"], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'start_at' => now(), ], 1, false, false); } private function give_order_reward(&$data, $wallet, $wallet_interface) { $data['aCustomers'] = []; $i = 0; $data['aCustomers'][$i] = Customer::findOrFail($data['customer_id']); while ($data['aCustomers'][$i + 1] = Customer::where('referral_id', $data['aCustomers'][$i]->referral_to_id)->first()) { if ($data['aCustomers'][$i + 1]->profit_amount_by_lvl) { $levels = json_decode(str_replace(['{', '}'], ['[', ']'], $data['aCustomers'][$i + 1]->profit_amount_by_lvl), true); foreach ($levels as $level) { if ($level[0] == $i + 1) { // [$level[1],$data['aCustomers'][$i+1]]; if ($this->Config('has_page_earn_money') == true) { $gift_for_invite = ($data['order']['service_charge'] * $level[1]) / 100; $profit_receiver = $data['aCustomers'][$i + 1]->id; $profit_sender = $data['aCustomers'][0]->id; $Withdraw = Withdraw::create([ 'user_id' => $profit_sender, 'customer_id' => $profit_receiver, "cash" => 0, "gold" => $gift_for_invite, 'sts' => 9, ]); $wallet_interface = new WalletInterface($profit_receiver, 2); new TransactionInterface($wallet_interface, $_inp = [ "cash" => 0, "gold" => $gift_for_invite, 'expire_at' => now(), 'active' => true, 'withdraw_id' => $Withdraw->id, 'start_at' => now(), ], 9, true, false); $transaction = Transaction::where('customer_id', $profit_receiver)->latest()->first(); TransactionsAdmin::create([ 'customer_id' => $profit_sender, 'customer_to_id' => $profit_receiver, 'user_id' => $profit_sender, 'order_id' => $data['order']['id'], 'wallet' => null, // یا مقدار مناسب دیگری 'transaction_id' => $transaction->id, 'cash' => 0, 'note' => ' سود بابت سفارش', 'type' => 1, // یا مقدار مناسب دیگری 'gold' => $gift_for_invite, 'balance_cash' => 0, // یا مقدار مناسب دیگری 'balance_gold' => $gift_for_invite, // مقدار صحیح برای `balance_gold` 'withdraw_id' => $Withdraw->id, ]); } } } } if ($i == 100) break; $i++; // برای جلوگیری از حلقه بی‌نهایت } return $data; } private function sendTransactionNotifications(array $data, string $transactionType) { $customer = Customer::findOrFail($data['customer_id']); $companyName = $this->Config('name_fa'); $message = "کاربر {$customer->name} با شماره موبایل {$customer->mobile} اقدام به $transactionType {$data['product']['title']} به مقدار " . "{$data['amount']} گرم به مبلغ " . number_format($data['total_price']) . " ریال کرد. با تشکر، $companyName"; User::where('send_sms', 1)->get()->each(function ($admin) use ($message, $data, $transactionType, $companyName) { $this->send($admin->mobile, $message); }); $wallet = Wallet::where('owner', $data['customer_id'])->whereNull('fund_id')->first(); // $pricePerGram = $data['total_price'] / $data['amount']; $customerMessage = "$companyName\n$transactionType آبشده\nگرم: {$data['amount']}\n" . "مبلغ کل: " . number_format($data['total_price']) . "\n\n" . "موجودی طلایی: {$wallet->gold}\n" . "مانده ریالی: " . number_format($wallet->cash) . "\n" . $this->Config('app_url'); // ارسال SMS به مشتری $this->send($customer->mobile, $customerMessage); } private function sendGoldir($data) { if ($this->Config('send_to_goldir') == "true") { $goldir_base_url=$this->Config('goldir_base_url')??'https://gold.ir'; // $liman_diff = Cnt::where('key', 'goldir_diff')->value('value'); // $liman_price = Cnt::where('key', 'goldir_price')->value('value'); $mazaneh = ($data['direction'] == 1) ? Cnt::where('key', 'goldir_truly_buy_mazaneh')->value('value') : Cnt::where('key', 'goldir_truly_sell_mazaneh')->value('value'); $cash = Cnt::where('key', 'goldir_price')->value('value') * $data['amount']; $response = Http::withToken(Cnt::where('key', 'goldir')->first()['value'])->post($goldir_base_url."/server/customer/order", [ "mazaneh" => ((int)$mazaneh), 'amount' => $data['amount'], 'description' => $this->Config('name_fa') . " - " . auth('customer')->user()->name, 'direction' => $data['direction'], 'product_id' => $this->Config('hamkar_product_id'), 'cash' => $cash, 'input_mode'=> 'gold' ])/*->json()*/ ; if (isset($response['message']) && $response['message'] == 'no authorised') { $cnt = new Cnt(); $response = Http::withToken($cnt->goldir_login())//$this->Config('liman_token')) ->post($goldir_base_url."/server/customer/order", [ "mazaneh" => ((int)$mazaneh), 'amount' => $data['amount'], 'description' => $this->Config('name_fa') . " - " . auth('customer')->user()->name, 'direction' => $data['direction'], 'product_id' => $this->Config('hamkar_product_id'), 'cash' => $cash, 'input_mode'=> 'gold' ])/*->json()*/ ; } Cnt::where('key', 'goldir_order_response')->update(['value' => $response /*json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)*/]); Cnt::where('key', 'last_order_log')->update(['value' => $response]); if (!isset($response[1]) && !isset($response[1]['id'])) { throw new UnprocessableEntityHttpException('سفارشات توسط ارائه دهنده بسته شده است.'); } $data['provider_id'] = $response[1]['id']; return $response; } // $data['total_price_goldir'] = ($data['direction'] == 1) ? ($liman_price+$liman_diff) : ($liman_price-$liman_diff) ; } public function storeBackUp(Request $request) { $data = $request->all(); if (auth('customer')->id()) {// متد در پنل کاربر $data['customer_id'] = auth('customer')->id(); $data['price'] = Price::orderBy('id', 'desc')->first()->price; } elseif (auth('user')->user()) {// متد در پنل ادمین $data['customer_id'] = $request->customer_id; $data['price'] = $request->price; } $data['sts'] = 2; $data['type'] = 2; $data['payment_sts'] = 4; $data['price_original'] = $data['price']; $add_sell_price = config('add_sell_price.single'); $wallet_interface = new WalletInterface($data['customer_id'], 2); $wallet = Wallet::where('owner', $data['customer_id'])->whereNull('fund_id')->first(); $data['total_price_original'] = $data['amount'] * $data['price_original']; $data['payment_remind'] = 0; $data['fee'] = $add_sell_price; $data['total_fee'] = $data['amount'] * $data['fee']; if ($data['direction'] == 1) { $data['price'] += $add_sell_price; $data['total_price'] = $data['amount'] * $data['price']; $data['payment_amount'] = $data['total_price']; if ($wallet->cash < $data['total_price']) { throw new UnprocessableEntityHttpException('موجودی شما کمتر از میزان سفارش است'); } $order = Order::create($data);//buy new TransactionInterface($wallet_interface, $_inp = [ "cash" => $data['total_price'], "gold" => $data['amount'], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id, 'start_at' => now(), ], 1, true, false); } else {//sell $data['price'] -= $add_sell_price; $data['total_price'] = $data['amount'] * $data['price']; $data['payment_amount'] = $data['total_price']; if ($wallet->gold < $data['amount']) { throw new UnprocessableEntityHttpException('موجودی شما کمتر از میزان سفارش است'); } $order = Order::create($data); new TransactionInterface($wallet_interface, $_inp = [ "gold" => $data['amount'], "cash" => $data['total_price'], 'expire_at' => now(), 'active' => true, 'order_id' => $order->id ], 2, false, true); } //----------------------------------------------------------------------------sms // Determine transaction type $transactionType = ($data['direction'] == 1) ? "خرید" : "فروش"; // User information $customer = Customer::where("id", $data['customer_id'])->firstOrFail(); $userMobile = $customer->mobile; // User's mobile number $userName = $customer->name; // User's name $chargedAmount = $data['total_price']; // Total price in Rial $chargedAmountGold = $data['amount']; // Amount of gold // Company name $companyName = $this->Config('name_fa'); // Company name from configuration // Constructing the SMS message $message = "کاربر $userName با شماره موبایل $userMobile اقدام به $transactionType طلا به مقدار " . $chargedAmountGold . " گرم به مبلغ " . number_format($chargedAmount) . " ریال کرد. با تشکر، $companyName"; // Getting admin mobile numbers and sending the SMS User::where('active', 1)->get()->each(function ($admin) use ($message) { $this->Send($admin->mobile, $message); }); $Walet = Wallet::where('owner', $data['customer_id'])->whereNull('fund_id')->first(); $companyName = $this->Config('name_fa'); $companyurl = $this->Config('app_url'); $weight = $data['amount']; $totalAmount = $data['total_price']; $pricePerGram = $totalAmount / $weight; $goldBalance = $Walet->gold; $remainingBalance = $Walet->cash; $message = "$companyName\n"; $message .= "خرید آبشده\n"; $message .= "گرم: $weight\n"; $message .= "قیمت گرم: " . number_format($pricePerGram) . "\n"; $message .= "مبلغ کل: " . number_format($totalAmount) . "\n\n"; $message .= "موجودی طلایی: $goldBalance\n"; $message .= "مانده ریالی: " . number_format($remainingBalance) . "\n"; $message .= "$companyurl" . "\n"; $this->Send($customer->mobile, $message); return response()->json($order); } public function table(Request $request) { $records = Order::where('customer_id', auth('customer')->id()) ->where('type', 2); TableEngine::create($records, $request->all()) ->initSearch([]) ->select([ '*', Order::$SELECT_STS_STR ])->export($records); return response()->json($records); } private function feeFree($customer_id, $count) { return Order::where('customer_id', $customer_id) ->where('type', 2) ->where('sts', 2) ->where('payment_sts', 4) ->count() < (int)$count; } }