Files
mkd/backend/migrations/create_payment_invoices.sql
2026-02-04 00:17:04 +05:00

83 lines
4.3 KiB
SQL
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- Миграция для создания таблицы счетов на оплату
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}]';