-- 001__deals.sql -- Таблицы для PostgreSQL-реализации Repository в M2 (когда pgx будет -- доступен через прокси). В M1 m2m-core работает с MemoryRepository. CREATE SCHEMA IF NOT EXISTS m2m_core; COMMENT ON SCHEMA m2m_core IS 'Состояние сделок M2M, события и аудит.'; CREATE TABLE IF NOT EXISTS m2m_core.deals ( id uuid PRIMARY KEY, guid uuid NOT NULL UNIQUE, state varchar(32) NOT NULL, investor_id uuid, signed_claim bytea, request_xml bytea, response_xml bytea, decision_xml bytea, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now() ); COMMENT ON TABLE m2m_core.deals IS 'Корневая запись о M2M-сделке. Уникальность по guid обеспечивает идемпотентность.'; COMMENT ON COLUMN m2m_core.deals.guid IS 'GUID, который ушёл в M2MTransferRequest.Header.GUID.'; COMMENT ON COLUMN m2m_core.deals.state IS 'Текущее состояние FSM: draft/validated/submitted_to_nsd/awaiting_decision/confirmed/awaiting_sub16/done/rejected/timed_out/manual_approval.'; CREATE INDEX IF NOT EXISTS idx_deals_state ON m2m_core.deals(state); CREATE INDEX IF NOT EXISTS idx_deals_investor ON m2m_core.deals(investor_id) WHERE investor_id IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_deals_created ON m2m_core.deals(created_at DESC); CREATE TABLE IF NOT EXISTS m2m_core.deal_events ( id bigserial PRIMARY KEY, deal_id uuid NOT NULL REFERENCES m2m_core.deals(id) ON DELETE CASCADE, type varchar(64) NOT NULL, payload jsonb, actor text, created_at timestamptz NOT NULL DEFAULT now() ); COMMENT ON TABLE m2m_core.deal_events IS 'Журнал событий сделки (event-sourcing для аудита).'; COMMENT ON COLUMN m2m_core.deal_events.actor IS 'Кто инициировал событие: system, nsd, operator-, lk-callback и т.д.'; CREATE INDEX IF NOT EXISTS idx_deal_events_deal ON m2m_core.deal_events(deal_id, created_at); CREATE INDEX IF NOT EXISTS idx_deal_events_type ON m2m_core.deal_events(type);