fix(desktop): «платёжка» → «чек об оплате» в UI реестра платежей
Typecheck / desktop (pull_request) Failing after 6m42s
Typecheck / controller (pull_request) Has been cancelled

Подсказки/лейблы переименованы под каноничную терминологию (чек об оплате —
подтверждающий документ, не «платёжка»):
- тултипы «Чек об оплате приложен / не приложен» (desktop + mobile)
- fileKindLabel PAYMENT_PROOF → «Чек об оплате»
- расчётный ПЛАТЁЖ возврата/доплаты (вместо «платёжка») в подсказках/алертах
  ReportExpenseAdvance + согласование рода
- комментарии приведены к новой терминологии (чек / расчётный платёж)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
coopops
2026-06-16 12:16:31 +00:00
parent 7fdfd8385a
commit da450ec605
5 changed files with 25 additions and 25 deletions
@@ -25,9 +25,9 @@ async function loadExpenseFilesByItem(
return result;
}
// Механика строки расхода (ADVANCE/DIRECT) нужна, чтобы решить, какие документы
// прикладывает кассир: по авансу — только платёжка, по оплате организации —
// ещё и закрывающие документы (акт/счёт-фактура/накладная).
// Механика строки расхода (ADVANCE/DIRECT) нужна, чтобы решить, показывать ли
// закрывающие документы: чек об оплате теперь общий (в ядре), а по оплате
// организации (DIRECT) — ещё и закрывающие документы (акт/счёт-фактура/накладная).
async function loadItemMechanics(
proposal_hash: string,
item_hash: string,
@@ -55,11 +55,11 @@ const props = defineProps<{
// Хэши исходной СЗ и строки-аванса (item_hash == хэш платежа выдачи аванса).
proposalHash: string;
itemHash: string;
// Сумма этой расчётной платёжки и её направление — чтобы показать кассиру
// Сумма этого расчётного платежа и его направление — чтобы показать кассиру
// «выдано → заявлено → разница» без поиска исходной строки в реестре.
settlementAmount: string;
isReturn: boolean;
// Описание расхода из самой платёжки (fallback — из позиции СЗ).
// Описание расхода из самого платежа (fallback — из позиции СЗ).
description?: string;
}>();
@@ -98,8 +98,8 @@ const props = withDefaults(
);
const emit = defineEmits<{
// settlementHash — хэш заведённой платёжки расчёта (возврат/доплата), чтобы
// реестр сразу раскрыл её с реквизитами; пусто при простом закрытии (факт==аванс).
// settlementHash — хэш заведённого расчётного платежа (возврат/доплата), чтобы
// реестр сразу раскрыл его с реквизитами; пусто при простом закрытии (факт==аванс).
(e: 'reported', settlementHash?: string): void;
}>();
@@ -133,8 +133,8 @@ const deltaHint = computed(() => {
`${diff.toFixed(advance.value.precision)} ${advance.value.symbol}`,
);
return diffMinor < 0
? `Недорасход ${diffLabel}: будет создана платёжка возврата — её нужно оплатить кооперативу.`
: `Перерасход ${diffLabel}: будет создана платёжка доплаты — кооператив выплатит разницу.`;
? `Недорасход ${diffLabel}: будет создан платёж возврата — его нужно оплатить кооперативу.`
: `Перерасход ${diffLabel}: будет создан платёж доплаты — кооператив выплатит разницу.`;
});
// Панель — только для аванса под отчёт: по счёту (DIRECT) отчётный документ
@@ -284,11 +284,11 @@ async function submitReport(): Promise<void> {
: '';
if (result?.outcome === Zeus.ExpenseReportOutcome.RETURN_PENDING) {
SuccessAlert(
`Заведена платёжка возврата на ${settlementLabel}. Оплатите её кооперативу — после подтверждения кассой отчёт закроется.`,
`Заведён платёж возврата на ${settlementLabel}. Оплатите его кооперативу — после подтверждения кассой отчёт закроется.`,
);
} else if (result?.outcome === Zeus.ExpenseReportOutcome.OVERSPEND_PENDING) {
SuccessAlert(
`Заведена платёжка доплаты на ${settlementLabel}. Кооператив выплатит разницу — после подтверждения кассой отчёт закроется.`,
`Заведён платёж доплаты на ${settlementLabel}. Кооператив выплатит разницу — после подтверждения кассой отчёт закроется.`,
);
} else {
SuccessAlert('Отчёт по авансу принят');
@@ -96,7 +96,7 @@ export function itemStatusVariant(
export function fileKindLabel(kind: Zeus.ExpenseFileKind): string {
switch (kind) {
case Zeus.ExpenseFileKind.PAYMENT_PROOF:
return 'Платёжка';
return 'Чек об оплате';
case Zeus.ExpenseFileKind.REPORT_FILE:
return 'Чек';
case Zeus.ExpenseFileKind.RETURN_PROOF:
@@ -51,12 +51,12 @@
//- Статус отчёта по авансу (личный стол пайщика) — отдельная ось
//- рядом со статусом платежа: требуется / подан / принят.
BaseBadge(v-if='reportBadge(row)', :variant='reportBadge(row)?.variant') {{ reportBadge(row)?.label }}
//- Кассирская отметка «платёжка приложена» — только на столе совета
//- Кассирская отметка «чек об оплате приложен» — только на столе совета
//- (пайщику чужая бухгалтерия не показывается).
q-icon.proof-icon.proof-icon--ok(v-if='!hideActions && proofState(row) === "attached"', name='receipt_long', size='16px')
q-tooltip Платёжка приложена
q-tooltip Чек об оплате приложен
q-icon.proof-icon.proof-icon--missing(v-else-if='!hideActions && proofState(row) === "missing"', name='receipt_long', size='16px')
q-tooltip Платёжка не приложена
q-tooltip Чек об оплате не приложен
td.col-action(v-if='!hideActions', @click.stop)
.cell-actions(v-if='["EXPIRED", "PENDING", "FAILED"].includes(row.status)')
SetOrderPaidStatusButton(:id='row.id')
@@ -100,7 +100,7 @@
:reported-amount='advanceReportedAmount(row)',
@reported='onReported'
)
//- Расчётная платёжка (возврат/доплата): кассиру/пайщику видно
//- Расчётный платёж (возврат/доплата): кассиру/пайщику видно
//- основание — исходный аванс, заявленный факт и документы.
ExpenseSettlementBasisPanel.q-mt-sm(
v-if='settlementRef(row)',
@@ -132,9 +132,9 @@
BaseBadge(:variant='getStatusVariant(row.status)') {{ row.status_label }}
BaseBadge(v-if='reportBadge(row)', :variant='reportBadge(row)?.variant') {{ reportBadge(row)?.label }}
q-icon.proof-icon.proof-icon--ok(v-if='!hideActions && proofState(row) === "attached"', name='receipt_long', size='16px')
q-tooltip Платёжка приложена
q-tooltip Чек об оплате приложен
q-icon.proof-icon.proof-icon--missing(v-else-if='!hideActions && proofState(row) === "missing"', name='receipt_long', size='16px')
q-tooltip Платёжка не приложена
q-tooltip Чек об оплате не приложен
.pay-card__row
span.pay-card__amount
q-icon.q-mr-xs(
@@ -318,7 +318,7 @@ const getDirectionIcon = (direction?: string | null) => {
};
// Ссылка на позицию СЗ для блока «Подтверждение оплаты»: только у платежей
// расхода и только после подтверждения кассиром (платёжка появляется по факту).
// расхода и только после подтверждения кассиром (чек появляется по факту).
const expenseProofRef = (
row: IPaymentRow,
): { proposal_hash: string; item_hash: string } | null => {
@@ -357,7 +357,7 @@ const advanceReportState = (row: IPaymentRow): string =>
const advanceReportedAmount = (row: IPaymentRow): string =>
(row.blockchain_data as { reported_amount?: string } | null)?.reported_amount ?? '';
// Расчётная платёжка (возврат недорасхода / доплата перерасхода) — ссылка на
// Расчётный платёж (возврат недорасхода / доплата перерасхода) — ссылка на
// исходную позицию-аванс, чтобы кассир видел основание (аванс/факт/документы),
// не выискивая исходный платёж среди сотен строк реестра.
const settlementRef = (
@@ -380,7 +380,7 @@ const settlementRef = (
// Статус отчёта по авансу — только на личном столе пайщика и только у платежа
// выдачи аванса (EXPENSE). Источник — зеркало blockchain_data.report_state;
// дефолт «Требуется отчёт», пока пайщик не отчитался. Расчётные платёжки
// дефолт «Требуется отчёт», пока пайщик не отчитался. Расчётные платежи
// (EXPENSE_RETURN/EXPENSE_OVERSPEND) свой отчёт-бейдж не показывают.
const reportBadge = (
row: IPaymentRow,
@@ -404,7 +404,7 @@ const proofState = (row: IPaymentRow): 'attached' | 'missing' | 'none' => {
return count > 0 ? 'attached' : 'missing';
};
// Локально отражаем загруженную платёжку, не перезагружая реестр.
// Локально отражаем загруженный чек, не перезагружая реестр.
const onProofUploaded = (row: IPaymentRow): void => {
const data = (row.blockchain_data ?? {}) as { proof_count?: number };
row.blockchain_data = { ...data, proof_count: (data.proof_count ?? 0) + 1 };
@@ -493,7 +493,7 @@ const toggleExpand = (id: string | number): void => {
expanded.set(id, !expanded.get(id));
};
// После отчёта по авансу с недо-/перерасходом заводится отдельная платёжка
// После отчёта по авансу с недо-/перерасходом заводится отдельный платёж
// расчёта — перезагружаем реестр и сразу раскрываем её (по хэшу), чтобы пайщик
// увидел реквизиты для оплаты, не догадываясь нажать «развернуть».
const onReported = async (settlementHash?: string): Promise<void> => {
@@ -505,8 +505,8 @@ const onReported = async (settlementHash?: string): Promise<void> => {
if (row) expanded.set(row.id, true);
};
// Кассир жмёт «Основание» в расчётной платёжке (возврат/доплата) → раскрываем
// платёж выдачи аванса (его hash == item_hash расчётной платёжки) и прокручиваем
// Кассир жмёт «Основание» в расчётном платеже (возврат/доплата) → раскрываем
// платёж выдачи аванса (его hash == item_hash расчётного платежа) и прокручиваем
// к нему. Так видно, сколько выдавалось и что в чеке, без поиска строки вручную.
const openSourcePayment = async (itemHash: string): Promise<void> => {
const target = items.value.find(