Files
portal/app/resources/js/components/projects/ProjectLimitOverloadDialog.vue
T
Дмитрий 664427ce7a fix/projects: косяк 06 — окно перегрузки на «вы» + кнопка «Пополнить баланс»
Единственное место с обращением на «ты» переведено на «вы» (У вас…,
пополните/поставьте/уменьшите). В окно добавлена кнопка «Пополнить баланс»,
которая закрывает окно и ведёт в /billing (онлайн-оплата ждёт Б-1, но вход
в пополнение теперь под рукой). Логику/цифры не трогал.
vitest: текст-на-вы + переход в /billing, 7 passed. Проверено глазами на 8000.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:20:59 +03:00

70 lines
3.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>