wallet handling

This commit is contained in:
2026-06-15 12:05:36 +03:30
parent dee041dfc6
commit b1ae6e159e
2 changed files with 83 additions and 11 deletions
@@ -119,6 +119,17 @@ class CustomerController extends Controller
}
}
$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;
$wallet->count_cash_wallets = $count_cash_total - $wallet->count_cash_wallet;
+72 -11
View File
@@ -3,6 +3,7 @@
namespace App\Services;
use App\Http\Controllers\Controller;
use App\Models\Price;
use App\Models\Product;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Schema;
@@ -52,7 +53,12 @@ class AssetSummaryService
);
$metalTotals = $this->buildMetalTotals($userWallets, $mainWallet, $metalIds, $weightUnit, $catalogById, $metalsWithProductWallet, $mainWalletProductIds);
$cashWallet = (float) ($mainWallet->cash ?? 0);
$assetsRialValue = $this->sumAssetsRialValue($userWallets, $catalogById);
$assetsRialValue = $this->sumAssetsRialValue(
$metalTotals,
$userWallets,
$catalogById,
$mainWalletProductIds
);
$totalRialValue = $cashWallet + $assetsRialValue;
return [
@@ -427,29 +433,84 @@ class AssetSummaryService
return (int) $metalId === 1 ? $mainWalletGrams : 0.0;
}
private function sumAssetsRialValue(Collection $userWallets, Collection $catalogById): float
{
/**
* ارزش ریالی دارایی‌های فلزی:
* • وزن کل هر فلز × قیمت زنده
* • سکه‌ها (خارج از جمع وزن) × قیمت محصول
*/
private function sumAssetsRialValue(
array $metalTotals,
Collection $userWallets,
Collection $catalogById,
array $mainWalletProductIds = []
): float {
$total = 0.0;
foreach ($metalTotals as $metal) {
$weight = (float) ($metal['total_weight'] ?? 0);
if ($weight <= 0) {
continue;
}
$livePrice = $this->resolveLivePricePerUnit((int) ($metal['metal_id'] ?? 0));
if ($livePrice > 0) {
$total += $weight * $livePrice;
}
}
foreach ($userWallets as $walletLine) {
if ($walletLine->product_id === null || !$walletLine->product) {
if ($walletLine->product_id === null || !$walletLine->product || (float) $walletLine->gold <= 0) {
continue;
}
if (in_array((int) $walletLine->product_id, $mainWalletProductIds, true)) {
continue;
}
$catalogProduct = $this->catalogProduct($walletLine->product, $catalogById);
$qty = (float) $walletLine->gold;
$metalId = (int) ($catalogProduct->metal_id ?? 0);
if ($metalId === 1) {
$total += (float) ($catalogProduct->price ?? 0) * $qty;
} elseif ($metalId === 2 || $metalId === 3) {
$total += ((float) ($catalogProduct->price ?? 0) * (float) ($catalogProduct->amount ?? 1)) * $qty;
if ((string) ($catalogProduct->group_type ?? '') !== 'سکه') {
continue;
}
$total += $this->productDisplayUnitPrice($catalogProduct) * (float) $walletLine->gold;
}
return $total;
}
private function resolveLivePricePerUnit(int $metalId): float
{
if ($metalId === 1) {
$live = (int) app(ProductDisplayPriceService::class)->resolveAppBasePrice();
if ($live > 0) {
return (float) $live;
}
return (float) (Price::latest('id')->value('price') ?? 0);
}
$product = Product::query()
->where('active', 1)
->where('metal_id', $metalId)
->where('price', '>', 0)
->orderBy('id')
->first();
if (!$product) {
return 0.0;
}
$unitPrice = $this->productDisplayUnitPrice($product);
$amount = (float) ($product->amount ?? 1);
return $amount > 0 ? $unitPrice * $amount : $unitPrice;
}
private function productDisplayUnitPrice(Product $product): float
{
return (float) ($product->price ?? 0) + (float) ($product->price_profit ?? 0);
}
private function shouldShowInAssets(Product $product): bool
{
if (!Product::hasShowInAssetsColumn()) {