feat: minibar — category dropdown, учёт остатков (приходы/списания/инвентаризация/отчёт)

- MinibarSettingsPage: поле категории → выпадающий список с существующими + «Новая...»
- Кнопка «Учёт и остатки» ведёт на /settings/minibar/stock
- MinibarStockPage: 5 вкладок — Остатки, Приходы, Списания, Инвентаризация, Отчёт
- api.ts: добавлены методы и типы для stock/receipts/writeoffs/inventory/report

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-06 15:36:40 +03:00
parent 5b46175c91
commit 1f4def0a34
7 changed files with 1340 additions and 26 deletions

View File

@@ -0,0 +1,64 @@
CREATE TABLE minibar_stock (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotel_id UUID NOT NULL REFERENCES hotels(id) ON DELETE CASCADE,
item_id UUID NOT NULL REFERENCES minibar_items(id) ON DELETE CASCADE,
quantity NUMERIC(10,3) NOT NULL DEFAULT 0,
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(hotel_id, item_id)
);
CREATE TABLE minibar_receipts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotel_id UUID NOT NULL REFERENCES hotels(id) ON DELETE CASCADE,
supplier TEXT,
notes TEXT,
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE minibar_receipt_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
receipt_id UUID NOT NULL REFERENCES minibar_receipts(id) ON DELETE CASCADE,
item_id UUID NOT NULL REFERENCES minibar_items(id),
quantity NUMERIC(10,3) NOT NULL,
cost_price NUMERIC(10,2)
);
CREATE TABLE minibar_writeoffs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotel_id UUID NOT NULL REFERENCES hotels(id) ON DELETE CASCADE,
reason TEXT NOT NULL,
notes TEXT,
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE minibar_writeoff_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
writeoff_id UUID NOT NULL REFERENCES minibar_writeoffs(id) ON DELETE CASCADE,
item_id UUID NOT NULL REFERENCES minibar_items(id),
quantity NUMERIC(10,3) NOT NULL
);
CREATE TABLE minibar_inventory_checks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotel_id UUID NOT NULL REFERENCES hotels(id) ON DELETE CASCADE,
checked_at DATE NOT NULL DEFAULT CURRENT_DATE,
notes TEXT,
is_complete BOOLEAN NOT NULL DEFAULT false,
created_by UUID REFERENCES users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE minibar_inventory_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
check_id UUID NOT NULL REFERENCES minibar_inventory_checks(id) ON DELETE CASCADE,
item_id UUID NOT NULL REFERENCES minibar_items(id),
expected_qty NUMERIC(10,3) NOT NULL DEFAULT 0,
actual_qty NUMERIC(10,3) NOT NULL DEFAULT 0
);
CREATE INDEX ON minibar_stock(hotel_id);
CREATE INDEX ON minibar_receipts(hotel_id);
CREATE INDEX ON minibar_writeoffs(hotel_id);
CREATE INDEX ON minibar_inventory_checks(hotel_id);