-- Миграция для создания таблицы счетов на оплату 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}]';