2026-05-25 06:23:59 +03:00
|
|
|
<script setup lang="ts">
|
|
|
|
|
/**
|
2026-07-02 12:04:16 +03:00
|
|
|
* Диалог «Проект не запущен» (Billing v2 Spec C §6.2, Task 12).
|
2026-05-25 06:23:59 +03:00
|
|
|
*
|
|
|
|
|
* Открывается, когда POST/PATCH /api/projects вернул 409 `balance_insufficient`.
|
2026-07-02 12:04:16 +03:00
|
|
|
* Сообщает: «Проект создан, но НЕ запущен — не хватает баланса».
|
|
|
|
|
* Предлагает три исхода:
|
|
|
|
|
* - «Пополнить баланс» (data-test="topup") → закрыть + перейти в /billing;
|
|
|
|
|
* - «Уменьшить объём» (data-test="reduce") → set-zero (родитель ставит daily_limit_target=0);
|
|
|
|
|
* - «Понятно» (data-test="close") → закрыть без действий.
|
|
|
|
|
*
|
|
|
|
|
* Backward compat: события save-blocked и set-zero сохранены.
|
2026-05-25 06:23:59 +03:00
|
|
|
*/
|
|
|
|
|
export interface OverloadPayload {
|
|
|
|
|
current_balance_rub: string;
|
|
|
|
|
current_capacity_leads: number;
|
|
|
|
|
would_be_required_leads: number;
|
|
|
|
|
deficit_leads: number;
|
2026-07-02 12:04:16 +03:00
|
|
|
/** Task 12: сумма пополнения в рублях, рассчитанная бэкендом */
|
|
|
|
|
topup_rub?: string;
|
2026-05-25 06:23:59 +03:00
|
|
|
}
|
|
|
|
|
|
2026-06-24 16:20:59 +03:00
|
|
|
import { useRouter } from 'vue-router';
|
|
|
|
|
|
2026-05-25 06:23:59 +03:00
|
|
|
defineProps<{
|
|
|
|
|
modelValue: boolean;
|
|
|
|
|
payload: OverloadPayload | null;
|
|
|
|
|
}>();
|
|
|
|
|
|
2026-06-24 16:20:59 +03:00
|
|
|
const emit = defineEmits<{
|
2026-05-25 06:23:59 +03:00
|
|
|
'update:modelValue': [value: boolean];
|
|
|
|
|
'save-blocked': [];
|
|
|
|
|
'set-zero': [];
|
|
|
|
|
}>();
|
2026-06-24 16:20:59 +03:00
|
|
|
|
2026-07-02 12:04:16 +03:00
|
|
|
// Косяк 06: «Пополнить» прямо из окна — закрываем и ведём в биллинг.
|
2026-06-24 16:20:59 +03:00
|
|
|
const router = useRouter();
|
|
|
|
|
function goTopup(): void {
|
|
|
|
|
emit('update:modelValue', false);
|
|
|
|
|
router?.push('/billing');
|
|
|
|
|
}
|
2026-05-25 06:23:59 +03:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
2026-06-17 05:17:12 +03:00
|
|
|
<v-dialog :model-value="modelValue" max-width="520" @update:model-value="$emit('update:modelValue', $event)">
|
2026-05-25 06:23:59 +03:00
|
|
|
<v-card v-if="payload" data-testid="overload-dialog">
|
2026-07-02 12:04:16 +03:00
|
|
|
<v-card-title>Проект не запущен</v-card-title>
|
2026-05-25 06:23:59 +03:00
|
|
|
<v-card-text>
|
|
|
|
|
<p>
|
2026-07-02 12:04:16 +03:00
|
|
|
Проект создан, но <strong>не запущен</strong> — на балансе недостаточно средств для запуска.
|
2026-05-25 06:23:59 +03:00
|
|
|
</p>
|
|
|
|
|
<p class="text-medium-emphasis mt-2">
|
2026-07-02 12:04:16 +03:00
|
|
|
Чтобы запустить — пополните примерно на
|
|
|
|
|
<strong>{{ payload.topup_rub ?? payload.deficit_leads }} ₽</strong>
|
|
|
|
|
или уменьшите объём.
|
|
|
|
|
</p>
|
|
|
|
|
<p class="text-caption text-medium-emphasis mt-1">
|
|
|
|
|
Текущий баланс: {{ payload.current_balance_rub }} ₽
|
|
|
|
|
({{ payload.current_capacity_leads }} лидов), нужно {{ payload.would_be_required_leads }} лидов.
|
2026-05-25 06:23:59 +03:00
|
|
|
</p>
|
|
|
|
|
</v-card-text>
|
2026-06-21 12:16:45 +03:00
|
|
|
<v-card-actions class="flex-wrap justify-end ga-2">
|
2026-07-02 12:04:16 +03:00
|
|
|
<v-btn variant="text" data-test="close" data-testid="overload-cancel" @click="$emit('update:modelValue', false)">
|
|
|
|
|
Понятно
|
2026-05-25 06:23:59 +03:00
|
|
|
</v-btn>
|
2026-07-02 12:04:16 +03:00
|
|
|
<v-btn variant="text" data-test="reduce" data-testid="overload-set-zero" @click="$emit('set-zero')">
|
|
|
|
|
Уменьшить объём
|
2026-05-25 06:23:59 +03:00
|
|
|
</v-btn>
|
2026-07-02 12:04:16 +03:00
|
|
|
<v-btn color="primary" variant="flat" data-test="topup" data-testid="overload-topup" @click="goTopup">
|
|
|
|
|
Пополнить баланс
|
2026-05-25 06:23:59 +03:00
|
|
|
</v-btn>
|
|
|
|
|
</v-card-actions>
|
|
|
|
|
</v-card>
|
|
|
|
|
</v-dialog>
|
|
|
|
|
</template>
|