[598-50][@ant] fix: кошельки пайщика — подпись/порядок карточек + мини-кошелёк только паевой

- членский стола заказов: убрана подпись «возврату не подлежит»;
- главный паевой (w.wal.share) опущен вниз — рядом с программными ЦПП-кошельками,
  минимальный неснижаемый остаток остаётся верхней карточкой;
- мини-кошелёк в rail (левый низ): label «Паевой кошелёк» вместо «Доступно»,
  сумма берётся из сырого w.wal.share — членская часть ЦК больше не примешивается.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
ant
2026-06-16 12:51:30 +00:00
parent cfcb435c94
commit 2e99350761
3 changed files with 16 additions and 7 deletions
@@ -850,7 +850,7 @@ export const walletCards: DesktopWalletCard[] = [
{
wallet_name: 'w.mkt.member',
label: 'Членский кошелёк',
description: 'Стол заказов · возврату не подлежит',
description: 'Стол заказов',
accent: 'wallet',
icon: 'card_membership',
},
@@ -11,7 +11,9 @@ import { walletCards as marketWalletCards } from '../../../extensions/market/ins
* `collectWalletCards` берёт только установленные у кооператива расширения,
* объединяет их декларации с core и дедупит по `wallet_name` (первое
* вхождение выигрывает — так пересечение нескольких расширений на один
* кошелёк схлопывается в одну карточку).
* кошелёк схлопывается в одну карточку). Главный паевой кошелёк ЦК
* (`w.wal.share`) идёт ПОСЛЕ кошельков расширений — это такая же ЦПП, как
* «Стол заказов», и стоит рядом с программными кошельками, а не первым.
*
* Что НЕ устанавливается на стол пайщика: главный членский (`w.wal.member`,
* программа ЦК) и Генератор (`w.cap.gen`, кооперативный кошелёк без L3).
@@ -38,13 +40,16 @@ const WALLET_CARDS_BY_EXTENSION: Record<string, DesktopWalletCard[]> = {
* установленных расширений (их `extension_name`). Дедуп по `wallet_name`.
*/
export function collectWalletCards(installedExtensionNames: Iterable<string>): DesktopWalletCard[] {
const collected: DesktopWalletCard[] = [...CORE_WALLET_CARDS];
const collected: DesktopWalletCard[] = [];
for (const ext of installedExtensionNames) {
const cards = WALLET_CARDS_BY_EXTENSION[ext];
if (cards) collected.push(...cards);
}
// Главный паевой кошелёк ЦК — после кошельков расширений (вниз списка).
collected.push(...CORE_WALLET_CARDS);
const seen = new Set<string>();
return collected.filter((card) => {
if (seen.has(card.wallet_name)) return false;
@@ -25,6 +25,7 @@
:balance='walletBalance',
:symbol='walletSymbol',
:locked-balance='walletLocked',
balance-label='Паевой кошелёк',
:balance-route='{ name: "wallet", params: { coopname: info.coopname } }',
primary-action-label='Пополнить',
show-signout,
@@ -195,8 +196,11 @@ const coopMeta = computed<string | undefined>(() =>
// --- Footer: RailUserCard (canon .rail__usercard) --------------------------
const mainWallet = computed(() =>
walletStore.program_wallets.find((w) => w.program_type === Zeus.ProgramType.MAIN),
// Мини-кошелёк показывает ТОЛЬКО паевой (`w.wal.share`) — сырой кошелёк без
// сворачивания с членской частью ЦК. Членские средства сюда не примешиваются
// (для них — карточка «Членский кошелёк» на странице кошелька).
const shareWallet = computed(() =>
walletStore.user_wallets.find((w) => w.wallet_name === 'w.wal.share'),
);
const walletReady = computed<boolean>(() => walletStore.program_wallets.length > 0);
@@ -207,13 +211,13 @@ function splitAsset(asset?: string | null): { amount: string; symbol: string } {
return { amount: parts[0] || '0,00', symbol: parts[1] || '' };
}
const walletAvail = computed(() => splitAsset(mainWallet.value?.available));
const walletAvail = computed(() => splitAsset(shareWallet.value?.available));
const walletBalance = computed<string>(() => walletAvail.value.amount);
const walletSymbol = computed<string>(
() => walletAvail.value.symbol || info.symbols?.root_govern_symbol || 'RUB',
);
const walletLocked = computed<string | undefined>(() => {
const split = splitAsset(mainWallet.value?.blocked);
const split = splitAsset(shareWallet.value?.blocked);
if (split.amount === '0,00' || split.amount === '0.00') return undefined;
return split.amount;
});