import { useState } from 'react' import { Plus, Edit2, Trash2, ToggleLeft, ToggleRight, Tag, Percent, Calendar, Users, Info, Check, } from 'lucide-react' import { Modal } from '../components/ui/Modal' import { cn } from '../lib/utils' // ─── Types ──────────────────────────────────────────────────────────────────── type DiscountTarget = 'all' | 'loyalty' | 'corporate' | 'promo' type DiscountValueType = 'percent' | 'fixed' export interface Discount { id: string name: string code: string valueType: DiscountValueType value: number // % or ₽ off the room price target: DiscountTarget minNights?: number validFrom?: string validTo?: string isActive: boolean note: string } // ─── Mock ───────────────────────────────────────────────────────────────────── export const MOCK_DISCOUNTS: Discount[] = [ { id: 'd-1', name: 'Скидка постоянному гостю', code: 'LOYAL', valueType: 'percent', value: 10, target: 'loyalty', isActive: true, note: 'Применяется для гостей уровня Серебро и выше', }, { id: 'd-2', name: 'Корпоративная скидка', code: 'CORP15', valueType: 'percent', value: 15, target: 'corporate', isActive: true, note: 'Для корпоративных договоров. Требует подтверждения менеджера.', }, { id: 'd-3', name: 'Бесплатное проживание', code: 'FREE', valueType: 'percent', value: 100, target: 'all', isActive: true, note: 'Полная отмена стоимости проживания. Только с одобрения директора.', }, { id: 'd-4', name: 'Длительное проживание (7+ ночей)', code: 'LONG7', valueType: 'percent', value: 20, target: 'all', minNights: 7, isActive: true, note: 'Автоматически предлагается при бронировании от 7 ночей', }, { id: 'd-5', name: 'Весенняя акция', code: 'SPRING26', valueType: 'percent', value: 25, target: 'promo', validFrom: '2026-03-01', validTo: '2026-04-30', isActive: false, note: 'Сезонная акция. Не суммируется с другими скидками.', }, { id: 'd-6', name: 'Фиксированная скидка 1000 ₽', code: 'FLAT1000', valueType: 'fixed', value: 1000, target: 'all', isActive: true, note: 'Разовая скидка для новых гостей', }, ] // ─── Helpers ────────────────────────────────────────────────────────────────── const TARGET_META: Record = { all: { label: 'Все гости', cls: 'bg-slate-100 text-slate-700 dark:bg-slate-700 dark:text-slate-300' }, loyalty: { label: 'Программа лояльности', cls: 'bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-400' }, corporate: { label: 'Корпоративный', cls: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400' }, promo: { label: 'Промо-акция', cls: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400' }, } // ─── Discount Modal ─────────────────────────────────────────────────────────── const EMPTY: Omit = { name: '', code: '', valueType: 'percent', value: 10, target: 'all', isActive: true, note: '', } function DiscountModal({ discount, onSave, onClose, }: { discount?: Discount onSave: (d: Omit) => void onClose: () => void }) { const [form, setForm] = useState>(discount ? { ...discount } : { ...EMPTY }) const set = (k: K, v: typeof form[K]) => setForm(prev => ({ ...prev, [k]: v })) return ( } >
set('name', e.target.value)} />
set('code', e.target.value.toUpperCase())} />
{/* Value type + value */}
set('value', Math.max(0, parseInt(e.target.value) || 0))} /> {form.valueType === 'percent' ? '%' : '₽'}
{form.valueType === 'percent' && form.value === 100 && (

Скидка 100% означает бесплатное проживание

)}
{/* Target */}
{(Object.entries(TARGET_META) as [DiscountTarget, typeof TARGET_META[DiscountTarget]][]).map(([k, v]) => ( ))}
{/* Optional: minNights + validity */}
set('minNights', parseInt(e.target.value) || undefined)} />
set('validFrom', e.target.value || undefined)} />
set('validTo', e.target.value || undefined)} />
{/* Note */}