lastPrice(request()); if (is_array($response)) { return $response; } if (is_object($response) && method_exists($response, 'getData')) { return (array) $response->getData(true); } return (array) $response; } public function table(Request $request) { $query = Tahesab::with('customer')->orderByDesc('id'); \App\DB\Te\TableEngine::create($query, $request) ->initSearch(['desc', 'type']) ->select(['*']) ->export($query); return response()->json($query); } public function show($id) { $tahesab = Tahesab::with('customer')->findOrFail($id); return response()->json($tahesab); } public function retrySanad($id) { $tahesab = Tahesab::with('customer')->findOrFail($id); $result = $this->sync()->retry($tahesab); return response()->json($result, ($result['ok'] ?? false) ? 200 : 422); } public function registerCustomer($customerId) { $customer = Customer::findOrFail($customerId); $result = $this->sync()->registerCustomer($customer); return response()->json($result, ($result['ok'] ?? false) ? 200 : 422); } private function tahesabApiUrl(): string { $host = trim((string) $this->Config('tahesab_host')); $port = trim((string) $this->Config('tahesab_port')); if ($host !== '' && $port !== '') { $host = rtrim(preg_replace('#^https?://#i', '', $host), '/'); return 'httpS://' . $host . ':' . $port . '/'; } $legacy = trim((string) env('TAHESAB', '')); return $legacy !== '' ? $legacy : ''; } public function storeTrade($data, ?Tahesab $existing = null) { // if ($input instanceof \Illuminate\Http\Request) { // $data = $input->all(); // } elseif (is_array($input)) { // $data = $input; // } else { // $data = request()->all(); // } // return ($data); if (!isset($data['customer_id']) || !isset($data['amount'])) { return request()->expectsJson() ? response()->json(['error' => 'Data missing: customer_id or amount'], 422) : false; } // $customer = auth()->user(); // if (!$customer) { // throw new UnprocessableEntityHttpException("Auth needed"); // } $customer = Customer::where('id', $data['customer_id'])->first(); if ($customer && ($customer->moshtari_code === null)) { $this->createCustomerInTahesab($customer->id); $customer = Customer::where('id', $data['customer_id'])->first(); } $date = Verta::instance(Carbon::parse($data['pay_at']))->format('Y-m-d'); [$year, $month, $day] = explode('-', $date); $amount = $data['amount']; $isBuy = (int) ($data['direction'] ?? 0) === 1; $mablaghKol = $isBuy ? (int) round((float) $amount * (float) $data['price']) : (int) ($data['total_price'] ?? round((float) $amount * (float) $data['price'])); $data['handler'] = 'storeTrade'; $tahesab = $existing ?? Tahesab::create([ "customer_id" => $customer->id, "desc" => $data['direction'] == 1 ? "خرید آبشده" : "فروش آبشده", "amount" => $amount, "order_id" => $data['order']['id'] ?? null, "date" => $data['pay_at'], "type" => $data['product']['metal_id'] == 1 ? "طلا" : "نقره", "created_at" => Carbon::now(), "data" => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), ]); try { $response = Http::withoutVerifying()->timeout(10)->withHeaders([ 'DBName' => $this->Config('tahesab_db'), 'Content-Type' => 'application/json', 'Authorization' => "Bearer " . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ "DoNewSanadBuySaleGOLD" => [ 1,//Sabte_Kol_Or_Movaghat_1_0 (int)$customer->moshtari_code, //Moshtari_Code -1, //Factor_Number 1, //Radif_Number (int)$year, //Shamsi_Year (int)$month, //Shamsi_Month (int)$day, //Shamsi_Day (float)$amount, //Vazn $data['product']['metal_id'] == 1 ? 750 : "", //Ayar 0, "", $data['direction'] == 1 ? 1 : 0, //BuyOrSale_0_1 (int)$data['price'], //Mazaneh 1, //MazanehIsMesghalOrGeram_0_1 1, //IsMotefaregheOrAbshode_0_1 $mablaghKol, //MablaghKol — خرید: وزن خالص × قیمت (بعد از کارمزد) $data['direction'] == 1 ? "خرید آبشده" : "فروش آبشده", //sharh -1, //Factor_Code — خودکار -1, //HavalehBe_Mcode -1, //MultiRadif $data['product']['metal_id'] == 1 ? 0 : 2, //Jens_Felez (string)Verta::instance($data['pay_at']), ] ])->json(); } catch (\Exception $e) { $this->sync()->markFailed($tahesab, $e->getMessage()); return $e->getMessage(); } if ($this->sync()->responseOk($response)) { $this->sync()->markSuccess($tahesab, $response, $data); return $data; } $this->sync()->markFailed($tahesab, $response, 'ثبت سند معامله در ته‌حساب ناموفق بود'); return false; } // directon: 0 = daryaft az moshtari // directon: 1 = pardakht be moshtari public function wallet($data, ?Tahesab $existing = null) { // if ($input instanceof \Illuminate\Http\Request) { // $data = $input->all(); // } elseif (is_array($input)) { // $data = $input; // } else { // $data = request()->all(); // } if (!isset($data['customer_id']) || !isset($data['value'])) { return request()->expectsJson() ? response()->json(['error' => 'Data missing: customer_id or value'], 422) : false; } // $customer = auth()->user(); // if (!$customer) { // throw new UnprocessableEntityHttpException("Auth needed"); // } $customer = Customer::where('id', $data['customer_id'])->first(); if ($customer && ($customer->moshtari_code === null)) { $this->createCustomerInTahesab($customer->id); $customer = Customer::where('id', $data['customer_id'])->first(); } $data['handler'] = 'wallet'; $tahesab = $existing ?? Tahesab::create([ "customer_id" => $customer->id, "desc" => $data['direction'] == 0 ? "شارژ حساب" : "برداشت از حساب", "amount" => $data['value'], "type" => "ريال", "date" => Carbon::now(), "created_at" => Carbon::now(), "withdraw_id" => $data['withdraw_id'] ?? null, "data" => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), ]); $date = Verta::instance(Carbon::now())->format('Y-m-d'); [$year, $month, $day] = explode('-', $date); try { $response = Http::withoutVerifying()->timeout(10)->withHeaders([ 'DBName' => $this->Config('tahesab_db'), 'Content-Type' => 'application/json', 'Authorization' => "Bearer " . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ "DoNewSanadVKHBank" => [ 1,//Sabte_Kol_Or_Movaghat_1_0 $customer->moshtari_code,//Moshtari_Code -1,//Factor_Number 1,//Radif_Number (int)$year,//Shamsi_Year (int)$month,//Shamsi_Month (int)$day,//Shamsi_Day (int)$data['direction'],//IsDayaftAzMoshtariOrPardakhtBeMoshtari_0_1 (int)$data['value'],//Mablagh $data['direction'] == 0 ? "شارژ حساب" : "برداشت از حساب",//Sharh (string)$this->Config('tahesab_bank_account'), //Name_Bank "$tahesab->id",//Code_Rahgiri -1,//Factor_Code -1, //MultiRadif ] ])->json(); \Log::info('Tahesab wallet response', [ 'data' => $data, 'response' => $response ?? null, ]); } catch (\Exception $e) { $this->sync()->markFailed($tahesab, $e->getMessage()); return $e->getMessage(); } if ($this->sync()->responseOk($response)) { $this->sync()->markSuccess($tahesab, $response, $data); return $data; } $this->sync()->markFailed($tahesab, $response, 'ثبت سند ریالی در ته‌حساب ناموفق بود'); return false; // if($data['bank'] == true) { // try { // $response = Http::withoutVerifying()->timeout(10)->withHeaders([ // 'DBName' => $this->ConfigService('tahesab_db'), // 'Content-Type' => 'application/json', // 'Authorization' => "Bearer " . $this->ConfigService('tahesab_token'), // ])->post($this->tahesabApiUrl(), [ // "DoNewSanadVKHBank" => [ // 1,//Sabte_Kol_Or_Movaghat_1_0 // $customer->moshtari_code,//Moshtari_Code // -1,//Factor_Number // 1,//Radif_Number // (int)$year,//Shamsi_Year // (int)$month,//Shamsi_Month // (int)$day,//Shamsi_Day // (int)$data['direction'],//IsDayaftAzMoshtariOrPardakhtBeMoshtari_0_1 // (int)$data['value'],//Mablagh // $data['direction'] == 0 ? "شارژ حساب" : "برداشت از حساب",//Sharh // (string)$this->ConfigService('tahesab_bank_account'), //Name_Bank // "$tahesab->id",//Code_Rahgiri // -1,//Factor_Code // -1, // //MultiRadif // ] // ])->json(); // } catch (\Exception $e) { // return $e->getMessage(); // } // if ($response['OK']) { // Tahesab::where('id', $tahesab->id)->update([ // "sh_factor" => $response['Sh_factor'], // "tahesab_id" => $response['OK'], // "tah_id" => $response['ID'], // "factor_number" => $response['Factor_Number'], // "data" => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), // "res" => json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), // ]); // // return $data; // } // }else{ // try { // $response = Http::withoutVerifying()->timeout(10)->withHeaders([ // 'DBName' => $this->ConfigService('tahesab_db'), // 'Content-Type' => 'application/json', // 'Authorization' => "Bearer " . $this->ConfigService('tahesab_token'), // ])->post($this->tahesabApiUrl(), [ // "DoNewSanadTalabBedehi" => [ // 1,//Sabte_Kol_Or_Movaghat_1_0, // $customer->moshtari_code,//Moshtari_Code // -1,//Factor_Number // 1,//Radif_Number // (int)$year,//Shamsi_Year // (int)$month,//Shamsi_Month // (int)$day,//Shamsi_Day // $data['value'] < 0 ? 0 : 1,//IsBedehiOrTalab_0_1, // (int)abs($data['value']),//Mablagh // $data['value'] < 0 ? "بدهکار" : "بستانکار",//Sharh // $data['note'],//"Baabat", // 0,//Vazn, // -1,//Factor_Code // -1,//HavalehBe_Mcode, // null,//MultiRadif // 0,//Jens_Felez, // "ArzName" // ] // ])->json(); // } catch (\Exception $e) { // return $e->getMessage(); // } // if ($response['OK']) { // Tahesab::where('id', $tahesab->id)->update([ // "sh_factor" => $response['Sh_factor'], // "tahesab_id" => $response['OK'], // "data" => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), // "res" => json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), // ]); // // return $data; // } // } } /** * پاداش معرفی — همیشه روی حساب معرف (نه کاربر تازه‌ثبت‌نام‌شده). */ public function referrerGoldReward(Customer $invitedCustomer, float $gold, string $desc = 'پاداش بابت معرفی') { $referrer = $invitedCustomer->referrer(); if (!$referrer) { return false; } return $this->goldReward([ 'customer_id' => $referrer->id, 'value' => $gold, 'desc' => $desc, ]); } /** * پاداش/هدیه طلایی — سند بدهی وزنی (مثل ثبت دستی «بدهی / بابت معرفی» در ته‌حساب). */ public function goldReward($data, ?Tahesab $existing = null) { if (!isset($data['customer_id'], $data['value'])) { return request()->expectsJson() ? response()->json(['error' => 'Data missing: customer_id or value'], 422) : false; } $customer = Customer::where('id', $data['customer_id'])->first(); if (!$customer) { return false; } if ($customer->moshtari_code === null) { $this->createCustomerInTahesab($customer->id); $customer = Customer::where('id', $data['customer_id'])->first(); } $amount = abs((float) $data['value']); $desc = !empty($data['desc']) ? (string) $data['desc'] : 'پاداش'; $date = Verta::instance(Carbon::now())->format('Y-m-d'); [$year, $month, $day] = explode('-', $date); $data['handler'] = 'goldReward'; $tahesab = $existing ?? Tahesab::create([ 'customer_id' => $customer->id, 'desc' => $desc, 'amount' => $amount, 'date' => Carbon::now(), 'type' => 'طلا', 'created_at' => Carbon::now(), 'data' => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), ]); try { $response = Http::withoutVerifying()->timeout(10)->withHeaders([ 'DBName' => $this->Config('tahesab_db'), 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ 'DoNewSanadTalabBedehi' => [ 1, // Sabte_Kol (int) $customer->moshtari_code, -1, // Factor_Number 1, // Radif_Number (int) $year, (int) $month, (int) $day, 0, // IsBedehiOrTalab — بدهی (فروشگاه به مشتری طلا بدهکار است) 0, // MablaghKol — بدون مبلغ ریالی $desc, $desc, // Baabat (float) $amount, -1, // Factor_Code -1, // HavalehBe_Mcode -1, // MultiRadif 0, // Jens_Felez — طلا 'IRR', ], ])->json(); } catch (\Exception $e) { $this->sync()->markFailed($tahesab, $e->getMessage()); return $e->getMessage(); } if ($this->sync()->responseOk($response)) { $this->sync()->markSuccess($tahesab, $response, $data); return $data; } $this->sync()->markFailed($tahesab, $response, 'ثبت پاداش طلایی در ته‌حساب ناموفق بود'); return false; } // direction: 1 = واریز طلا (خرید)، 0 = برداشت طلا (فروش) public function walletGold($data, ?Tahesab $existing = null) { // if ($input instanceof \Illuminate\Http\Request) { // $data = $input->all(); // } elseif (is_array($input)) { // $data = $input; // } else { // $data = request()->all(); // } // return ($data); if (!isset($data['customer_id'])) { return request()->expectsJson() ? response()->json(['error' => 'Data missing: customer_id or value'], 422) : false; } // $customer = auth()->user(); // if (!$customer) { // throw new UnprocessableEntityHttpException("Auth needed"); // } $customer = Customer::where('id', $data['customer_id'])->first(); if ($customer && ($customer->moshtari_code === null)) { $this->createCustomerInTahesab($customer->id); $customer = Customer::where('id', $data['customer_id'])->first(); } $date = Verta::instance(Carbon::now())->format('Y-m-d'); [$year, $month, $day] = explode('-', $date); $amount = abs($data['value']); $buyOrSale = (int) ($data['direction'] ?? 1) === 1 ? 1 : 0; $isDeposit = $buyOrSale === 1; $data['handler'] = 'walletGold'; $tahesab = $existing ?? Tahesab::create([ "customer_id" => $customer->id, "desc" => $isDeposit ? "شارژ کیف پول آبشده" : "برداشت از کیف پول آبشده", "amount" => $amount, "date" => Carbon::now(), "type" => "طلا", "created_at" => Carbon::now(), "withdraw_id" => $data['withdraw_id'] ?? null, "data" => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), ]); $prices = $this->lastPriceData(); $mazaneh = $isDeposit ? (int) ($prices['buy'] ?? 0) : (int) ($prices['sell'] ?? 0); $mablaghKol = (int) round($mazaneh * $amount); $sharh = !empty($data['note']) ? $data['note'] : (!empty($data['desc']) ? $data['desc'] : ($isDeposit ? 'خرید آبشده' : 'فروش آبشده')); $data['note'] = $sharh; try { $response = Http::withoutVerifying()->timeout(10)->withHeaders([ 'DBName' => $this->Config('tahesab_db'), 'Content-Type' => 'application/json', 'Authorization' => "Bearer " . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ "DoNewSanadBuySaleGOLD" => [ 1,//Sabte_Kol_Or_Movaghat_1_0 (int)$customer->moshtari_code, //Moshtari_Code -1, //Factor_Number 1, //Radif_Number (int)$year, //Shamsi_Year (int)$month, //Shamsi_Month (int)$day, //Shamsi_Day (float)$amount, //Vazn 750, //Ayar 0, "", $buyOrSale, //BuyOrSale_0_1 — 1=خرید، 0=فروش $mazaneh, //Mazaneh 1, //MazanehIsMesghalOrGeram_0_1 1, //IsMotefaregheOrAbshode_0_1 $mablaghKol, //MablaghKol $sharh,//Sharh -1, //Factor_Code — خودکار -1, //HavalehBe_Mcode -1, //MultiRadif 0, //Jens_Felez (string)$date, ] ])->json(); } catch (\Exception $e) { $this->sync()->markFailed($tahesab, $e->getMessage()); return $e->getMessage(); } if ($this->sync()->responseOk($response)) { $this->sync()->markSuccess($tahesab, $response, $data); return $data; } $this->sync()->markFailed($tahesab, $response, 'ثبت سند طلایی کیف پول در ته‌حساب ناموفق بود'); return false; } public function createCustomerInTahesab($customer_id) { $customer = Customer::findOrFail($customer_id); $response = null; if ($customer->moshtari_code == null) { $lock = Cache::lock('tahesab:register-customer:'.$customer->id, 30); if (! $lock->get()) { $customer->refresh(); if ($customer->moshtari_code != null) { return $customer->moshtari_code; } return 'ثبت مشتری در ته‌حساب در حال انجام است'; } try { $customer->refresh(); if ($customer->moshtari_code != null) { return $customer->moshtari_code; } try { $response = Http::withoutVerifying()->timeout(10)->withHeaders([ 'DBName' => $this->Config('tahesab_db'), 'Content-Type' => 'application/json', 'Authorization' => "Bearer " . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ "DoNewMoshtari" => [ (string)$customer->name, $this->Config('name_fa'), (string)$customer->mobile, "", "", "", "", "", -1, 0 ] ])->json(); if ($this->sync()->responseOk($response)) { $customer->moshtari_code = $response['OK']; $customer->save(); return $response['OK']; } } catch (\Exception $e) { return $e->getMessage(); } return 'tahesab api error!!!'; } finally { $lock->release(); } } $birth_date = ''; if ($customer->birth_date !== null) { $birth_date = Verta::instance(Carbon::parse($customer->birth_date))->format('Y-m-d'); } try { $response = Http::withoutVerifying()->timeout(10)->withHeaders([ 'DBName' => $this->Config('tahesab_db'), 'Content-Type' => 'application/json', 'Authorization' => "Bearer " . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ "DoEditMoshtari" => [ $customer->name, $this->Config('name_fa'), $customer->mobile, "", $customer->n_code ?? "", $birth_date, "", "", (int)$customer->moshtari_code, 0 ] ])->json(); } catch (\Exception $e) { return $e->getMessage(); } if (! $this->sync()->responseOk($response)) { return 'tahesab api error!!!'; } return true; } public function healthCheck() { $tahesab = Http::withoutVerifying()->withHeaders([ 'Content-Type' => 'application/json', 'DBName' => $this->Config('tahesab_db'), 'Authorization' => "Bearer " . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ "CheckHealth" => [] ])->json(); return $tahesab; // if($tahesab['Api_Status'] === "OK" && $tahesab['DB_Status'] === "OK"){ // return true; // }else{ // return false; // } } public function sanadList() { $tahesab = Http::withoutVerifying()->withHeaders([ 'Content-Type' => 'application/json', 'DBName' => $this->Config('tahesab_db'), 'Authorization' => "Bearer " . $this->Config('tahesab_token'), ])->post($this->tahesabApiUrl(), [ "DoListAsnad" => [ 10, /*Count_Last,*/ "", /*Moshtari_Code,*/ "", /*"AzTarikhShamsi"*/ (string)Verta::instance(Carbon::now()->format('Y-m-d')), /*"TaTarikhShamsi"*/ "", /*"FilterNoSanad"*/ 0, /*Jens_Felez*/ ] ])->json(); return $tahesab; } }