feat: deposit release — детальный список позиций + HTML-чек на email гостю
- Форма удержания: позиции мини-бара расписаны по отдельности (товар × кол-во, цена/шт.) с кнопками «+ Добавить» для каждой и «+ Добавить всё» - Email гостю: HTML-шаблон с таблицей-чеком (позиция / сумма), итоговые строки, остаток возврата, брендинг отеля; текстовый fallback сохранён Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -317,19 +317,42 @@ function DepositWidget({ slug, bookingId }: { slug: string; bookingId: string })
|
||||
<div className="mt-2 rounded-xl border border-slate-200 dark:border-slate-600 p-3 space-y-3 bg-slate-50 dark:bg-slate-800/40">
|
||||
<p className="text-xs font-semibold text-slate-700 dark:text-slate-300">Возврат / Удержание депозита</p>
|
||||
|
||||
{/* Minibar items breakdown */}
|
||||
{minibarItems.length > 0 && (
|
||||
<div className="rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/10 overflow-hidden">
|
||||
<div className="flex items-center justify-between px-3 py-2 border-b border-amber-200 dark:border-amber-800">
|
||||
<span className="text-xs font-semibold text-amber-800 dark:text-amber-300">Минибар — {formatCurrency(minibarTotal)}</span>
|
||||
<button
|
||||
onClick={() => minibarItems.forEach(it => addReleaseItem(`${it.itemName} × ${it.quantity}`, it.lineTotal))}
|
||||
className="text-xs text-amber-700 dark:text-amber-400 hover:underline font-medium"
|
||||
>
|
||||
+ Добавить всё
|
||||
</button>
|
||||
</div>
|
||||
<div className="divide-y divide-amber-100 dark:divide-amber-900/40">
|
||||
{minibarItems.map((it, i) => (
|
||||
<div key={i} className="flex items-center justify-between px-3 py-1.5">
|
||||
<span className="text-xs text-amber-800 dark:text-amber-300 flex-1">
|
||||
{it.itemName} × {it.quantity} <span className="text-amber-500 dark:text-amber-500">({formatCurrency(it.pricePerUnit)} / шт.)</span>
|
||||
</span>
|
||||
<span className="text-xs font-medium text-amber-800 dark:text-amber-300 mr-2">{formatCurrency(it.lineTotal)}</span>
|
||||
<button
|
||||
onClick={() => addReleaseItem(`${it.itemName} × ${it.quantity}`, it.lineTotal)}
|
||||
className="text-xs text-amber-600 dark:text-amber-400 hover:underline font-medium shrink-0"
|
||||
>
|
||||
+ Добавить
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Quick presets from settings */}
|
||||
{(presets.length > 0 || minibarTotal > 0) && (
|
||||
{(presets.length > 0 || minibarTotal === 0) && (
|
||||
<div>
|
||||
<p className="text-xs text-slate-500 dark:text-slate-400 mb-1.5">Добавить позицию:</p>
|
||||
<div className="flex gap-1.5 flex-wrap">
|
||||
{minibarTotal > 0 && (
|
||||
<button
|
||||
onClick={() => addReleaseItem(`Минибар (${minibarItems.length} поз.)`, minibarTotal)}
|
||||
className="px-2.5 py-1 rounded-lg text-xs font-medium border border-amber-300 text-amber-700 bg-amber-50 dark:bg-amber-900/20 dark:text-amber-400 dark:border-amber-700 hover:bg-amber-100 dark:hover:bg-amber-900/40 transition-colors"
|
||||
>
|
||||
+ Минибар {formatCurrency(minibarTotal)}
|
||||
</button>
|
||||
)}
|
||||
{presets.map(p => (
|
||||
<button
|
||||
key={p.id}
|
||||
@@ -348,6 +371,14 @@ function DepositWidget({ slug, bookingId }: { slug: string; bookingId: string })
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{presets.length === 0 && minibarTotal > 0 && (
|
||||
<button
|
||||
onClick={() => addReleaseItem('Прочее', 0)}
|
||||
className="text-xs text-brand-600 hover:underline"
|
||||
>
|
||||
+ Добавить позицию вручную
|
||||
</button>
|
||||
)}
|
||||
|
||||
{/* Added items */}
|
||||
{releaseItems.length > 0 && (
|
||||
@@ -383,15 +414,6 @@ function DepositWidget({ slug, bookingId }: { slug: string; bookingId: string })
|
||||
<p className="text-xs text-emerald-600 dark:text-emerald-400 font-medium">✓ Полный возврат депозита</p>
|
||||
)}
|
||||
|
||||
{/* Quick add if no presets */}
|
||||
{presets.length === 0 && minibarTotal === 0 && (
|
||||
<button
|
||||
onClick={() => addReleaseItem('Прочее', 0)}
|
||||
className="text-xs text-brand-600 hover:text-brand-700 font-medium"
|
||||
>
|
||||
+ Добавить позицию удержания
|
||||
</button>
|
||||
)}
|
||||
|
||||
<div>
|
||||
<label className="block text-xs text-slate-500 dark:text-slate-400 mb-0.5">Комментарий (отправим гостю на email)</label>
|
||||
|
||||
Reference in New Issue
Block a user