2026-01-24 14:03:11 +00:00
<? php
namespace App\Http\Controllers\Admin ;
use App\DB\Te\TableEngine ;
use App\Http\Controllers\Controller ;
use App\Models\Customer ;
use App\Models\Order ;
use App\Models\Price ;
use App\Models\Product ;
use Illuminate\Support\Facades\DB ;
use App\Models\Withdraw ;
use Illuminate\Http\Request ;
use Illuminate\Support\Facades\Log ;
use Rooyesh\Wallet\interfaces\TransactionInterface ;
use Rooyesh\Wallet\interfaces\WalletInterface ;
use Rooyesh\Wallet\models\Transaction ;
use Rooyesh\Wallet\models\Wallet ;
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException ;
use App\Http\Controllers\Admin\TahesabController ;
class WalletController extends Controller
{
public function charge2 ( Request $request )
{
$data = $request -> all ();
$customer = Customer :: findOrFail ( $data [ 'customer_id' ]);
$deposit = false ;
if ( $data [ 'value' ] > 0 ) {
$deposit = true ;
}
$wallet = Wallet :: where ( 'owner' , $data [ 'customer_id' ]) -> whereNull ( 'fund_id' ) -> first ();
if ( is_null ( $wallet ) && ! $deposit ) {
throw new UnprocessableEntityHttpException ( 'مقدار موجودی کمتر از درخواست شماست' );
}
if ( ! is_null ( $wallet ) && $wallet -> cash < abs ( $data [ 'value' ]) && ! $deposit ) {
throw new UnprocessableEntityHttpException ( 'مقدار موجودی کمتر از درخواست شماست' );
}
$wallet_interface = new WalletInterface ( $data [ 'customer_id' ], $customer -> type );
$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 = 'کیف پول شما به مبلغ ' . $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 = Wallet :: where ( 'owner' , $data [ 'customer_id' ]) -> whereNull ( 'fund_id' ) -> first ();
if ( is_null ( $wallet ) && ! $deposit ) {
throw new UnprocessableEntityHttpException ( 'مقدار موجودی کمتر از درخواست شماست' );
}
if ( ! is_null ( $wallet ) && $wallet -> cash < abs ( $data [ 'value' ]) && ! $deposit ) {
throw new UnprocessableEntityHttpException ( 'مقدار موجودی کمتر از درخواست شماست' );
}
$wallet_interface = new WalletInterface ( $data [ 'customer_id' ], $customer -> type );
$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 ,
]);
new TransactionInterface ( $wallet_interface , $_inp = [
'gold' => 0 ,
'cash' => $data [ 'value' ],
'expire_at' => now (),
"note" => $data [ 'note' ],
'withdraw_id' => $Withdraw -> id ,
'active' => true
], 7 , true , $deposit , $gold_block );
$data [ 'direction' ] = 0 ;
// $tahesab = new TahesabController();
// $tahesab->wallet($data);
2026-01-25 09:58:32 +00:00
$status = $data [ 'value' ] > 0 ? " شارژ شد " : " کسر شد " ;
$message = 'کیف پول شما به اندازه ' . number_format ( abs ( $data [ 'value' ])) . " ریال در تاریخ " . verta () -> format ( 'Y/n/j H:i:s' ) . $status . "بابت" . " \n "
2026-01-24 14:03:11 +00:00
. $data [ 'note' ]
2026-01-25 09:58:32 +00:00
. " \n "
2026-01-24 14:03:11 +00:00
. $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 = Wallet :: where ( 'owner' , $data [ 'customer_id' ]) -> whereNull ( 'fund_id' ) -> first ();
// if (is_null($wallet) && !$deposit) {
// throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست');
// }
// if (!is_null($wallet) && $wallet->cash < abs($data['value']) && !$deposit) {
// throw new UnprocessableEntityHttpException('مقدار موجودی کمتر از درخواست شماست');
// }
$wallet_interface = new WalletInterface ( $data [ 'customer_id' ], $customer -> type );
$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 ,
]);
new TransactionInterface ( $wallet_interface , $_inp = [
'cash' => 0 ,
'gold' => $data [ 'value' ],
'expire_at' => now (),
"note" => $data [ 'note' ],
'withdraw_id' => $Withdraw -> id ,
'active' => true
], 7 , $deposit , false , $gold_block );
$message = 'کیف پول شما به اندازه ' . $data [ 'value' ] . " گرم در تاریخ " . verta () -> format ( 'Y/n/j H:i:s' ) . " شارژ شد بابت" . " \n "
. $data [ 'note' ]
. $this -> Config ( 'name_fa' );
$this -> Send ( $customer -> mobile , $message );
return response () -> json ( true );
}
public function index ( Request $request )
{
$records = Transaction :: with ([ 'customer' ]) -> 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 );
// foreach ($records['rows'] as &$record) {
// if (empty($record->title) or $record->title == "تعریف نشده"){
// $record->title = $record->type_str ;
// $record->unit = "گرم";
// if (isset($record->wallet)) {
// $wallet = Wallet::with('product')->where('id',$record->wallet)->first();
// if (isset($wallet->product)) {
// if ($record->gold > 0){
// $record->title = " خرید " ;
//
// }else{
// $record->title = " فروش " ;
//
// }
// $record->title .= $wallet->product->title ;
// $record->unit = "عدد";
//
// }
// }
// $record->save();
// }
//
// }
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 )
{
// محاسبهی مجموع gold و cash به ازای هر owner
$records = Wallet :: with ( 'customer' );
// ایجاد جدول با استفاده از TableEngine
TableEngine :: create ( $records , $request -> all ())
-> initSearch ([ 'customer.name' ])
-> select ([ '*' ])
-> export ( $records );
// محاسبهی قیمت آخرین قیمت و مجموع کلی مقادیر gold و cash
$lastPrice = Price :: latest () -> first () -> price ;
$walletQuery = Wallet :: where ( 'owner' , '!=' , 4 ) -> where ( 'product_id' , null );
$sums = [
"gold" => round ( $walletQuery -> sum ( 'gold' ), 2 ),
"goldToCash" => round ( $walletQuery -> sum ( 'gold' ) * $lastPrice , 2 ),
"cash" => round ( $walletQuery -> sum ( 'cash' ), 2 ),
"cashToGold" => round ( $walletQuery -> sum ( 'cash' ) / $lastPrice , 2 ),
];
// $sums = [
// "gold" => round(Wallet::whereNot('owner', 4)->sum('gold'), 2),
// "goldToCash" => round(Wallet::sum('gold') * $lastPrice, 2),
// "cash" => round(Wallet::sum('cash'), 2),
// "cashToGold" => round(Wallet::sum('cash') / $lastPrice, 2),
// "on" => $lastPrice,
// ];
// افزودن sums به records
$records [ 'sums' ] = $sums ;
return response () -> json ( $records );
}
public function indexWithdraw ( Request $request )
{
$records = Withdraw :: with ([ 'customer' , 'bank_account' , 'Address' , "Transaction" ]);
TableEngine :: create ( $records , $request -> all ())
-> initSearch ([ 'customer.name' ])
-> select ([
'*' , Withdraw :: $SELECT_STS_STR , Withdraw :: $SELECT_DAJ
]) -> export ( $records );
return response () -> json ( $records );
}
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 با استفاده از شناسه
return $withdraw = Withdraw :: with ([ 'customer' , 'bank_account' , 'Address' , "Transaction" ]) -> 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 completeWithdraw ( Request $request )
{
$data = $request -> all ();
$data [ 'user_id' ] = auth ( 'user' ) -> id ();
$data [ 'sts' ] = 2 ;
$data [ 'date_at' ] = now ();
Withdraw :: findOrFail ( $data [ 'id' ]) -> update ( $data );
$withdraw = Withdraw :: findOrFail ( $data [ '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 );
}
}