664427ce7a
Единственное место с обращением на «ты» переведено на «вы» (У вас…, пополните/поставьте/уменьшите). В окно добавлена кнопка «Пополнить баланс», которая закрывает окно и ведёт в /billing (онлайн-оплата ждёт Б-1, но вход в пополнение теперь под рукой). Логику/цифры не трогал. vitest: текст-на-вы + переход в /billing, 7 passed. Проверено глазами на 8000. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
70 lines
3.2 KiB
Vue
70 lines
3.2 KiB
Vue
<script setup lang="ts">
|
||
/**
|
||
* Диалог перегрузки лимита (Billing v2 Spec C §6.2, Task 1.10).
|
||
*
|
||
* Открывается, когда POST/PATCH /api/projects вернул 409 `balance_insufficient`.
|
||
* Показывает дефицит и предлагает три исхода:
|
||
* - «Сохранить и приостановить» → save-blocked (родитель пере-сабмитит с
|
||
* force_save_blocked=true → проект создаётся с preflight_blocked_at);
|
||
* - «Поставить лимит 0» → set-zero (родитель ставит daily_limit_target=0);
|
||
* - «Отмена» → закрытие без сохранения.
|
||
*/
|
||
export interface OverloadPayload {
|
||
current_balance_rub: string;
|
||
current_capacity_leads: number;
|
||
would_be_required_leads: number;
|
||
deficit_leads: number;
|
||
}
|
||
|
||
import { useRouter } from 'vue-router';
|
||
|
||
defineProps<{
|
||
modelValue: boolean;
|
||
payload: OverloadPayload | null;
|
||
}>();
|
||
|
||
const emit = defineEmits<{
|
||
'update:modelValue': [value: boolean];
|
||
'save-blocked': [];
|
||
'set-zero': [];
|
||
}>();
|
||
|
||
// Косяк 06: «Пополнить» прямо из окна перегрузки — закрываем окно и ведём в биллинг.
|
||
const router = useRouter();
|
||
function goTopup(): void {
|
||
emit('update:modelValue', false);
|
||
router?.push('/billing');
|
||
}
|
||
</script>
|
||
|
||
<template>
|
||
<v-dialog :model-value="modelValue" max-width="520" @update:model-value="$emit('update:modelValue', $event)">
|
||
<v-card v-if="payload" data-testid="overload-dialog">
|
||
<v-card-title>Лимит превышает баланс</v-card-title>
|
||
<v-card-text>
|
||
<p>
|
||
У вас {{ payload.current_balance_rub }}₽ = {{ payload.current_capacity_leads }} лидов по текущему
|
||
тарифу.
|
||
</p>
|
||
<p>После сохранения нужно {{ payload.would_be_required_leads }} лидов.</p>
|
||
<p class="font-weight-medium">Не хватает: {{ payload.deficit_leads }} лидов.</p>
|
||
<p class="text-medium-emphasis mt-2">
|
||
Чтобы проект заработал — пополните счёт, поставьте его лимит 0 или уменьшите лимиты других проектов.
|
||
</p>
|
||
</v-card-text>
|
||
<v-card-actions class="flex-wrap justify-end ga-2">
|
||
<v-btn variant="text" data-testid="overload-cancel" @click="$emit('update:modelValue', false)">
|
||
Отмена
|
||
</v-btn>
|
||
<v-btn variant="text" data-testid="overload-set-zero" @click="$emit('set-zero')">
|
||
Поставить лимит 0
|
||
</v-btn>
|
||
<v-btn variant="text" data-testid="overload-save-blocked" @click="$emit('save-blocked')">
|
||
Сохранить и приостановить
|
||
</v-btn>
|
||
<v-btn color="primary" variant="flat" data-testid="overload-topup" @click="goTopup"> Пополнить баланс </v-btn>
|
||
</v-card-actions>
|
||
</v-card>
|
||
</v-dialog>
|
||
</template>
|