From 83d797c55ff745b04a5b0fe654fadd0a790d9b77 Mon Sep 17 00:00:00 2001 From: HotelSync Date: Mon, 6 Apr 2026 15:51:34 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20minibar=20deposit=20=E2=80=94=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B0=D0=BA=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D1=83?= =?UTF-8?q?=D1=8E=20=D1=86=D0=B5=D0=BD=D1=83=20=D0=B8=D0=B7=20=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=D0=B0,=20?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D1=83=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ранее в форме удержания депозита показывалась цена на момент уборки (price_per_unit). Теперь используется текущая цена позиции (mi.price) — чтобы изменения цен сразу отражались в счёте. Если цена менялась — показываем индикатор ↑ с tooltip. Co-Authored-By: Claude Sonnet 4.6 --- backend/src/routes/deposit.ts | 7 +++- .../bookings/BookingDetailPanel.tsx | 42 ++++++++++++------- src/lib/api.ts | 2 +- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/backend/src/routes/deposit.ts b/backend/src/routes/deposit.ts index c698c47..d0b1b1f 100644 --- a/backend/src/routes/deposit.ts +++ b/backend/src/routes/deposit.ts @@ -497,10 +497,13 @@ ${refund > 0 && (!items || items.length === 0) ? `

Ос if (!bRows[0]?.room_id) return { items: [], total: 0 } // Get all minibar consumptions from housekeeping tasks for this room + // Use current item price (mi.price) — so price changes in settings are reflected const { rows } = await db.query( - `SELECT mc.quantity, mc.price_per_unit, + `SELECT mc.quantity, + mc.price_per_unit AS recorded_price, + mi.price AS current_price, mi.name AS item_name, - (mc.quantity * mc.price_per_unit) AS line_total + (mc.quantity * mi.price) AS line_total FROM minibar_consumptions mc JOIN minibar_items mi ON mi.id = mc.item_id JOIN housekeeping_tasks ht ON ht.id = mc.task_id diff --git a/src/components/bookings/BookingDetailPanel.tsx b/src/components/bookings/BookingDetailPanel.tsx index ad86f74..e81fcd1 100644 --- a/src/components/bookings/BookingDetailPanel.tsx +++ b/src/components/bookings/BookingDetailPanel.tsx @@ -72,7 +72,7 @@ function DepositWidget({ slug, bookingId }: { slug: string; bookingId: string }) const [yookassaMsg, setYookassaMsg] = useState(null) const [releaseError, setReleaseError] = useState(null) const [presets, setPresets] = useState([]) - const [minibarItems, setMinibarItems] = useState>([]) + const [minibarItems, setMinibarItems] = useState>([]) const [minibarTotal, setMinibarTotal] = useState(0) useEffect(() => { @@ -330,20 +330,32 @@ function DepositWidget({ slug, bookingId }: { slug: string; bookingId: string })

- {minibarItems.map((it, i) => ( -
- - {it.itemName} × {it.quantity} ({formatCurrency(it.pricePerUnit)} / шт.) - - {formatCurrency(it.lineTotal)} - -
- ))} + {minibarItems.map((it, i) => { + const priceChanged = Math.abs(it.currentPrice - it.recordedPrice) > 0.001 + return ( +
+ + {it.itemName} × {it.quantity} + {' '} + + ({formatCurrency(it.currentPrice)} / шт.) + + {priceChanged && ( + + ↑ + + )} + + {formatCurrency(it.lineTotal)} + +
+ ) + })}
)} diff --git a/src/lib/api.ts b/src/lib/api.ts index e5bafc2..610c40a 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -806,7 +806,7 @@ export const api = { req('DELETE', `/api/hotels/${slug}/bookings/${bookingId}/deposit`), getMinibarForBooking: (slug: string, bookingId: string) => - req<{ items: Array<{ itemName: string; quantity: number; pricePerUnit: number; lineTotal: number }>; total: number }>( + req<{ items: Array<{ itemName: string; quantity: number; recordedPrice: number; currentPrice: number; lineTotal: number }>; total: number }>( 'GET', `/api/hotels/${slug}/bookings/${bookingId}/deposit/minibar`, ),