83 lines
4.3 KiB
MySQL
83 lines
4.3 KiB
MySQL
|
|
-- Миграция для создания таблицы счетов на оплату
|
|||
|
|
CREATE TABLE IF NOT EXISTS payment_invoices (
|
|||
|
|
id BIGSERIAL PRIMARY KEY,
|
|||
|
|
invoice_number TEXT UNIQUE NOT NULL,
|
|||
|
|
created_by TEXT NOT NULL,
|
|||
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|||
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|||
|
|
|
|||
|
|
-- Назначение счета
|
|||
|
|
purpose_type VARCHAR(50) NOT NULL CHECK (purpose_type IN ('building', 'district', 'legal', 'office', 'hr', 'other')),
|
|||
|
|
purpose_building_ids JSONB DEFAULT '[]', -- массив ID домов
|
|||
|
|
purpose_district_ids JSONB DEFAULT '[]', -- массив ID участков
|
|||
|
|
purpose_description TEXT, -- описание для 'other'
|
|||
|
|
|
|||
|
|
-- Формат оплаты
|
|||
|
|
payment_format VARCHAR(20) NOT NULL CHECK (payment_format IN ('prepayment', 'postpayment', 'advance')),
|
|||
|
|
|
|||
|
|
-- Тип предмета счета (услуга или ТМЦ)
|
|||
|
|
item_type VARCHAR(20) NOT NULL DEFAULT 'service' CHECK (item_type IN ('service', 'materials')),
|
|||
|
|
|
|||
|
|
-- Информация о подрядчике
|
|||
|
|
contractor_name TEXT NOT NULL,
|
|||
|
|
contractor_inn TEXT,
|
|||
|
|
|
|||
|
|
-- Описание услуги или ТМЦ (для обратной совместимости)
|
|||
|
|
service_description TEXT,
|
|||
|
|
-- Список услуг (если item_type = 'service')
|
|||
|
|
service_items JSONB DEFAULT '[]',
|
|||
|
|
-- Список ТМЦ (если item_type = 'materials')
|
|||
|
|
material_items JSONB DEFAULT '[]',
|
|||
|
|
total_amount NUMERIC(15, 2) NOT NULL,
|
|||
|
|
|
|||
|
|
-- Распределение суммы
|
|||
|
|
distribution_method VARCHAR(20) CHECK (distribution_method IN ('equal', 'by_area', 'manual')),
|
|||
|
|
distribution_data JSONB DEFAULT '{}', -- детали распределения по домам/участкам
|
|||
|
|
|
|||
|
|
-- Workflow статусы
|
|||
|
|
status VARCHAR(30) NOT NULL DEFAULT 'draft' CHECK (status IN (
|
|||
|
|
'draft',
|
|||
|
|
'pending_manager_approval',
|
|||
|
|
'pending_finance_manager_approval',
|
|||
|
|
'approved',
|
|||
|
|
'scheduled',
|
|||
|
|
'paid',
|
|||
|
|
'postponed',
|
|||
|
|
'cancelled',
|
|||
|
|
'rejected',
|
|||
|
|
'completed'
|
|||
|
|
)),
|
|||
|
|
current_approver_role VARCHAR(50), -- текущий этап согласования
|
|||
|
|
approval_history JSONB DEFAULT '[]', -- история согласований
|
|||
|
|
|
|||
|
|
-- Отклонение
|
|||
|
|
rejection_reason TEXT,
|
|||
|
|
|
|||
|
|
-- Даты
|
|||
|
|
scheduled_date DATE, -- дата в графике платежей
|
|||
|
|
payment_date DATE, -- фактическая дата оплаты
|
|||
|
|
|
|||
|
|
-- Статусы выполнения
|
|||
|
|
is_completed BOOLEAN DEFAULT FALSE, -- для постоплаты - выполнено ли
|
|||
|
|
closing_docs_received BOOLEAN DEFAULT FALSE, -- закрывающие документы получены
|
|||
|
|
|
|||
|
|
-- Дополнительно
|
|||
|
|
notes TEXT,
|
|||
|
|
file_urls JSONB DEFAULT '[]' -- массив путей к файлам счета
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- Индексы для быстрого поиска
|
|||
|
|
CREATE INDEX IF NOT EXISTS idx_payment_invoices_status ON payment_invoices(status);
|
|||
|
|
CREATE INDEX IF NOT EXISTS idx_payment_invoices_created_by ON payment_invoices(created_by);
|
|||
|
|
CREATE INDEX IF NOT EXISTS idx_payment_invoices_purpose_type ON payment_invoices(purpose_type);
|
|||
|
|
CREATE INDEX IF NOT EXISTS idx_payment_invoices_payment_format ON payment_invoices(payment_format);
|
|||
|
|
CREATE INDEX IF NOT EXISTS idx_payment_invoices_scheduled_date ON payment_invoices(scheduled_date);
|
|||
|
|
CREATE INDEX IF NOT EXISTS idx_payment_invoices_invoice_number ON payment_invoices(invoice_number);
|
|||
|
|
|
|||
|
|
-- Комментарии к таблице и колонкам
|
|||
|
|
COMMENT ON TABLE payment_invoices IS 'Счета на оплату с workflow согласования';
|
|||
|
|
COMMENT ON COLUMN payment_invoices.purpose_type IS 'Назначение: building, district, legal, office, hr, other';
|
|||
|
|
COMMENT ON COLUMN payment_invoices.payment_format IS 'Формат оплаты: prepayment, postpayment, advance';
|
|||
|
|
COMMENT ON COLUMN payment_invoices.distribution_method IS 'Метод распределения: equal, by_area, manual';
|
|||
|
|
COMMENT ON COLUMN payment_invoices.approval_history IS 'История согласований: [{role, userId, action, date, comment}]';
|