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