fixed kilo in metals 9

This commit is contained in:
2026-06-23 22:30:10 +03:30
parent 93b1bfe0e8
commit 8b8dc12023
+83 -7
View File
@@ -46,10 +46,10 @@ class AssetSummaryService
// محصولات متصل به کیف اصلی (main_wallet_products) — موجودی‌شان = gold کیف اصلی
$mainWalletProductIds = $this->configService->mainWalletProductIds();
$metalsWithProductWallet = $this->metalIdsWithProductWallet($userWallets, $catalogById, $mainWalletProductIds);
$metalsWithProductWallet = $this->metalIdsWithProductWallet($userWallets, $catalogById, $mainWalletProductIds, $mainWallet);
$inventoryCards = array_merge(
$this->buildMeltedInventoryCards($catalog, $catalogById, $mainWallet, $metalIds, $metalsWithProductWallet, $mainWalletProductIds),
$this->buildInventoryCards($userWallets, $catalogById, $mainWalletProductIds)
$this->buildInventoryCards($userWallets, $catalogById, $mainWalletProductIds, $mainWallet),
);
$metalTotals = $this->buildMetalTotals($userWallets, $mainWallet, $metalIds, $weightUnit, $catalogById, $metalsWithProductWallet, $mainWalletProductIds);
$cashWallet = (float) ($mainWallet?->cash ?? 0);
@@ -193,6 +193,59 @@ class AssetSummaryService
);
}
/**
* کیف legacy محصول آبشده/کاتد — وقتی همان فلز روی کیف اصلی موجودی دارد نباید دوباره شمرده شود.
*/
private function shouldIgnoreLegacyProductWalletLine(
Product $catalogProduct,
?Wallet $mainWallet,
Collection $catalogById,
array $mainWalletProductIds
): bool {
if (in_array((int) $catalogProduct->id, $mainWalletProductIds, true)) {
return true;
}
if ((float) ($mainWallet?->gold ?? 0) <= 0) {
return false;
}
if (!$this->isMeltedTradeProduct($catalogProduct)) {
return false;
}
$mainMetalId = $this->resolveMainWalletMetalId($mainWallet, $catalogById, $mainWalletProductIds);
return $mainMetalId > 0 && (int) ($catalogProduct->metal_id ?? 0) === $mainMetalId;
}
private function resolveMainWalletMetalId(
?Wallet $mainWallet,
Collection $catalogById,
array $mainWalletProductIds
): int {
if ($mainWalletProductIds !== []) {
$representative = $this->resolveMainWalletRepresentative($catalogById, $mainWalletProductIds);
if ($representative) {
return max(1, (int) ($representative->metal_id ?? 1));
}
}
if ((float) ($mainWallet?->gold ?? 0) <= 0) {
return 0;
}
$mainProductId = $this->configService->mainProductId();
if ($mainProductId) {
$mainProduct = $catalogById->get((int) $mainProductId);
if ($mainProduct) {
return max(1, (int) ($mainProduct->metal_id ?? 1));
}
}
return 1;
}
private function catalogProduct(Product $product, Collection $catalogById): Product
{
return $catalogById->get((int) $product->id) ?? $product;
@@ -253,9 +306,14 @@ class AssetSummaryService
}
/** فلزهایی که کاربر روی کیف محصول موجودی دارد — برای جلوگیری از کارت آبشدهٔ تکراری. */
private function metalIdsWithProductWallet(Collection $userWallets, Collection $catalogById, array $mainWalletProductIds = []): array
{
private function metalIdsWithProductWallet(
Collection $userWallets,
Collection $catalogById,
array $mainWalletProductIds = [],
?Wallet $mainWallet = null
): array {
$metalIds = [];
$mainWallet ??= $this->resolveMainWallet($userWallets);
foreach ($userWallets as $walletLine) {
if ($walletLine->product_id === null || (float) $walletLine->gold <= 0) {
@@ -272,7 +330,12 @@ class AssetSummaryService
continue;
}
$metalId = (int) ($this->catalogProduct($product, $catalogById)->metal_id ?? 0);
$catalogProduct = $this->catalogProduct($product, $catalogById);
if ($this->shouldIgnoreLegacyProductWalletLine($catalogProduct, $mainWallet, $catalogById, $mainWalletProductIds)) {
continue;
}
$metalId = (int) ($catalogProduct->metal_id ?? 0);
if ($metalId > 0) {
$metalIds[] = $metalId;
}
@@ -303,9 +366,14 @@ class AssetSummaryService
return $catalog->first(fn (Product $product) => (int) ($product->metal_id ?? 0) === $metalId);
}
private function buildInventoryCards(Collection $userWallets, Collection $catalogById, array $mainWalletProductIds = []): array
{
private function buildInventoryCards(
Collection $userWallets,
Collection $catalogById,
array $mainWalletProductIds = [],
?Wallet $mainWallet = null
): array {
$cards = [];
$mainWallet ??= $this->resolveMainWallet($userWallets);
foreach ($userWallets as $walletLine) {
if ($walletLine->fund_id !== null) {
@@ -327,6 +395,10 @@ class AssetSummaryService
}
$catalogProduct = $this->catalogProduct($product, $catalogById);
if ($this->shouldIgnoreLegacyProductWalletLine($catalogProduct, $mainWallet, $catalogById, $mainWalletProductIds)) {
continue;
}
$productPayload = $this->productPayload($catalogProduct);
$isCountBased = $this->isCountBasedProduct($catalogProduct);
@@ -384,6 +456,10 @@ class AssetSummaryService
}
$catalogProduct = $this->catalogProduct($walletLine->product, $catalogById);
if ($this->shouldIgnoreLegacyProductWalletLine($catalogProduct, $mainWallet, $catalogById, $mainWalletProductIds)) {
continue;
}
if ((int) ($catalogProduct->metal_id ?? 0) !== (int) $metalId) {
continue;
}