fixed buy and sell

This commit is contained in:
2026-07-09 15:43:59 +03:30
parent af6f9a2fee
commit c43855d844
+51 -9
View File
@@ -50,7 +50,7 @@ class AssetSummaryService
$metalsWithProductWallet = $this->metalIdsWithProductWallet($userWallets, $catalogById, $mainWalletProductIds, $mainWallet); $metalsWithProductWallet = $this->metalIdsWithProductWallet($userWallets, $catalogById, $mainWalletProductIds, $mainWallet);
$inventoryCards = array_merge( $inventoryCards = array_merge(
$this->buildMeltedInventoryCards($catalog, $catalogById, $mainWallet, $metalIds, $metalsWithProductWallet, $mainWalletProductIds), $this->buildMeltedInventoryCards($catalog, $catalogById, $mainWallet, $metalIds, $metalsWithProductWallet, $mainWalletProductIds, $userWallets),
$this->buildInventoryCards($userWallets, $catalogById, $mainWalletProductIds, $mainWallet), $this->buildInventoryCards($userWallets, $catalogById, $mainWalletProductIds, $mainWallet),
); );
$metalTotals = $this->buildMetalTotals($userWallets, $mainWallet, $metalIds, $weightUnit, $catalogById, $metalsWithProductWallet, $mainWalletProductIds); $metalTotals = $this->buildMetalTotals($userWallets, $mainWallet, $metalIds, $weightUnit, $catalogById, $metalsWithProductWallet, $mainWalletProductIds);
@@ -190,10 +190,13 @@ class AssetSummaryService
?Wallet $mainWallet, ?Wallet $mainWallet,
array $metalIds, array $metalIds,
array $metalsWithProductWallet = [], array $metalsWithProductWallet = [],
array $mainWalletProductIds = [] array $mainWalletProductIds = [],
Collection $userWallets
): array { ): array {
$cards = []; $cards = [];
$mainWalletGrams = Controller::weightToGrams((float) ($mainWallet?->gold ?? 0)); $mainWalletGrams = Controller::weightToGrams(
$this->effectiveMainWalletGold($userWallets, $mainWallet, $mainWalletProductIds)
);
$assignedMetalIds = []; $assignedMetalIds = [];
$mainProductId = $this->configService->mainProductId(); $mainProductId = $this->configService->mainProductId();
@@ -204,7 +207,7 @@ class AssetSummaryService
return []; return [];
} }
$mainWalletWeight = (float) ($mainWallet?->gold ?? 0); $mainWalletWeight = $this->effectiveMainWalletGold($userWallets, $mainWallet, $mainWalletProductIds);
if ($mainWalletWeight <= 0) { if ($mainWalletWeight <= 0) {
return []; return [];
} }
@@ -327,7 +330,8 @@ class AssetSummaryService
} }
/** /**
* کیف legacy محصول آبشده/کاتد — وقتی همان فلز روی کیف اصلی موجودی دارد نباید دوباره شمرده شود. * کیف legacy محصول آبشده/کاتد — فقط همان محصول نماینده یا main_product؛
* محصولات آبشدهٔ جدا (مثل آبشده سرمایه‌گذاری) نباید پنهان شوند.
*/ */
private function shouldIgnoreLegacyProductWalletLine( private function shouldIgnoreLegacyProductWalletLine(
Product $catalogProduct, Product $catalogProduct,
@@ -335,7 +339,9 @@ class AssetSummaryService
Collection $catalogById, Collection $catalogById,
array $mainWalletProductIds array $mainWalletProductIds
): bool { ): bool {
if (in_array((int) $catalogProduct->id, $mainWalletProductIds, true)) { $productId = (int) $catalogProduct->id;
if (in_array($productId, $mainWalletProductIds, true)) {
return true; return true;
} }
@@ -347,9 +353,17 @@ class AssetSummaryService
return false; return false;
} }
$mainMetalId = $this->resolveMainWalletMetalId($mainWallet, $catalogById, $mainWalletProductIds); $representative = $this->resolveMainWalletRepresentative($catalogById, $mainWalletProductIds);
if ($representative && $productId === (int) $representative->id) {
return true;
}
return $mainMetalId > 0 && (int) ($catalogProduct->metal_id ?? 0) === $mainMetalId; $mainProductId = $this->configService->mainProductId();
if ($mainProductId && $productId === (int) $mainProductId) {
return true;
}
return false;
} }
private function resolveMainWalletMetalId( private function resolveMainWalletMetalId(
@@ -565,7 +579,9 @@ class AssetSummaryService
return []; return [];
} }
$mainWalletGrams = Controller::weightToGrams((float) ($mainWallet?->gold ?? 0)); $mainWalletGrams = Controller::weightToGrams(
$this->effectiveMainWalletGold($userWallets, $mainWallet, $mainWalletProductIds)
);
$totals = []; $totals = [];
// فلز نمایندهٔ کیف اصلی در حالت main_wallet_products // فلز نمایندهٔ کیف اصلی در حالت main_wallet_products
@@ -740,6 +756,32 @@ class AssetSummaryService
return (bool) ($product->show_in_assets ?? false); return (bool) ($product->show_in_assets ?? false);
} }
/**
* طلای کیف اصلی + کیف legacy محصولات main_wallet_products (خریدهای قبل از اتصال).
*/
private function effectiveMainWalletGold(
Collection $userWallets,
?Wallet $mainWallet,
array $mainWalletProductIds
): float {
$total = (float) ($mainWallet?->gold ?? 0);
if ($mainWalletProductIds === []) {
return $total;
}
foreach ($userWallets as $walletLine) {
$productId = (int) ($walletLine->product_id ?? 0);
if ($productId <= 0 || !in_array($productId, $mainWalletProductIds, true)) {
continue;
}
$total += (float) ($walletLine->gold ?? 0);
}
return $total;
}
private function isCountBasedProduct(Product $product): bool private function isCountBasedProduct(Product $product): bool
{ {
return Controller::isCountBasedProduct($this->productPayload($product)); return Controller::isCountBasedProduct($this->productPayload($product));