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:
64
backend/migrations/063_minibar_stock.sql
Normal file
64
backend/migrations/063_minibar_stock.sql
Normal 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);
|
||||
Reference in New Issue
Block a user