// MDM SORP — Capability matrix, Nomenclature, Documents, Sanctions, Search, Form-link, Schema.
const { useState, useEffect, useMemo, useRef, useCallback, createContext, useContext } = React;
/* ===================== CAPABILITY MATRIX ===================== */
function CapabilityScreen({ navigate }) {
const { lang, t } = useI18n();
const cats = ["Подш. качения", "Подш. конические", "Гидравлика 8481", "ЧПУ Siemens 840D", "Редукторы", "Литьё чугунное", "Метизы A4", "Прокатные валки"];
const suppliers = [
{ p: "p_2001", name: "SKF Middle East FZE", c: "ae", rel: "Производитель", russia: "neutral", loi: true, vals: [0.96, 0.92, 0, 0, 0, 0, 0, 0] },
{ p: "p_2002", name: "Schaeffler Middle East FZE", c: "ae", rel: "Производитель", russia: "neutral", loi: true, vals: [0.94, 0.88, 0, 0, 0.4, 0, 0, 0] },
{ p: "p_2004", name: "Wuxi WLR Bearings", c: "cn", rel: "Производитель", russia: "friendly", loi: false, vals: [0.91, 0.85, 0, 0, 0, 0.3, 0, 0] },
{ p: "p_2005", name: "Erkunt Sanayi A.Ş.", c: "tr", rel: "Производитель", russia: "neutral", loi: false, vals: [0, 0, 0, 0, 0.72, 0.88, 0, 0] },
{ p: "p_2006", name: "Siemens (Shanghai)", c: "cn", rel: "Дистрибутор", russia: "review", loi: false, vals: [0, 0, 0.7, 0.74, 0, 0, 0, 0] },
{ p: null, name: "Bosch Rexroth ME", c: "ae", rel: "Дистрибутор", russia: "neutral", loi: true, vals: [0, 0, 0.94, 0.5, 0.6, 0, 0, 0] },
{ p: null, name: "ZWZ Wafangdian Bearing", c: "cn", rel: "Производитель", russia: "friendly", loi: false, vals: [0.85, 0.78, 0, 0, 0, 0, 0, 0] },
{ p: null, name: "Vesuvius UAE Trading", c: "ae", rel: "Дистрибутор", russia: "neutral", loi: true, vals: [0, 0, 0, 0, 0, 0, 0, 0.92] },
{ p: null, name: "Severstal Forge LLC", c: "ae", rel: "Производитель", russia: "—", loi: true, vals: [0, 0, 0, 0, 0.5, 0.6, 0.96, 0.7] },
];
return (
{lang === "ru" ? "Матрица возможностей" : "Capability matrix"}
{suppliers.length} поставщиков × {cats.length} категорий
Страна: AE, CN, TR
Отношения с РФ: дружественные
LOI подписан
Все фильтры
Export
{cats.map((_, i) => )}
Поставщик
Страна
Тип
РФ
LOI
{cats.map((c, i) => {c} )}
{suppliers.map((s, i) => (
s.p && navigate("party", { id: s.p })}>
{s.name}
{s.rel}
{s.russia === "friendly" ? друж. : s.russia === "review" ? review : {s.russia} }
{s.loi ? ✓ : — }
{s.vals.map((v, j) => (
0 ? `rgba(214,61,74,${(v * 0.55).toFixed(2)})` : "transparent", color: v > 0.5 ? "#fff" : "var(--fg-1)", fontWeight: v > 0 ? 600 : 400 }}>
{v > 0 ? Math.round(v * 100) : · }
))}
))}
Значения — confidence-оценка от ИИ (0–100) с учётом каталога, открытых источников и истории сделок. Клик по ячейке откроет таблицу источников.
);
}
/* ===================== NOMENCLATURE ===================== */
function NomenclatureScreen({ navigate }) {
const { lang, t } = useI18n();
const rows = [
{ id: "n_4421", sku: "SKF 6313-2RS1/C3", name: "Подшипник радиальный однорядный 65×140×33 мм", hs: "8482.10", category: "bearings", an: 4, sup: 3 },
{ id: "n_4422", sku: "SKF 6315-2Z/C3", name: "Подшипник радиальный однорядный 75×160×37 мм", hs: "8482.10", category: "bearings", an: 4, sup: 3 },
{ id: "n_4438", sku: "SKF 32320/Q", name: "Подшипник конический 100×215×77.5 мм", hs: "8482.20", category: "bearings", an: 3, sup: 2 },
{ id: "n_4501", sku: "SKF 22220 E", name: "Подшипник самовыравнивающийся 100×180×46 мм", hs: "8482.30", category: "bearings", an: 5, sup: 4 },
{ id: "n_4502", sku: "NN3014K/P5", name: "Подшипник двухрядный цилиндрический", hs: "8482.10", category: "bearings", an: 2, sup: 1 },
{ id: "n_5102", sku: "BOSCH 4WE6E62/EW230N9K4", name: "Гидрораспределитель Bosch Rexroth 4/3", hs: "8481.20", category: "hydraulics", an: 1, sup: 2 },
{ id: "n_5103", sku: "FESTO ADVU-25-50-A-P-A", name: "Цилиндр пневматический ADVU 25×50", hs: "8412.31", category: "pneumatics", an: 1, sup: 1 },
{ id: "n_6004", sku: "Siemens 6FC5398-1AP10-0AA1", name: "Карта ЧПУ Siemens 840D", hs: "8537.10", category: "cnc", an: 0, sup: 1 },
];
const categoryOpts = [
{ value: "bearings", label: "Подшипники", color: "blue" },
{ value: "hydraulics", label: "Гидравлика", color: "teal" },
{ value: "pneumatics", label: "Пневматика", color: "purple" },
{ value: "cnc", label: "ЧПУ / электроника", color: "orange" },
];
const columns = [
{ id: "id", label: "ID", type: "text", width: 90, mono: true },
{ id: "sku", label: "Артикул", type: "primary", width: 280 },
{ id: "name", label: "Название", type: "text", width: 360 },
{ id: "hs", label: "HS-код", type: "text", width: 110, mono: true },
{ id: "category", label: "Категория", type: "select", width: 200, options: categoryOpts },
{ id: "an", label: "Аналогов", type: "number", width: 100 },
{ id: "sup", label: "Поставщиков", type: "number", width: 110 },
];
const views = [
{ name: "Все", kind: "grid", count: rows.length },
{ name: "Группа по категории", kind: "grid", groupBy: "category", sort: [{ field: "an", dir: "desc" }] },
{ name: "Без аналогов", kind: "grid", filter: [{ field: "an", op: "is", value: 0 }] },
{ name: "Карты", kind: "gallery" },
];
return (
);
}
/* ===================== DOCUMENTS ===================== */
function DocumentsScreen({ navigate }) {
const { lang, t } = useI18n();
const rows = [
{ id: "d_001", name: "КП-Schaeffler-SORP-3929-v3.pdf", type: "proposal", deal: [{ id: "SORP-3929", label: "ТМК подшипники" }], size: "486 KB", date: "2026-05-26", scan: false },
{ id: "d_002", name: "Spec-bearings-confirmed.xlsx", type: "spec", deal: [{ id: "SORP-3929", label: "ТМК подшипники" }], size: "112 KB", date: "2026-05-22", scan: false },
{ id: "d_003", name: "Заявка-Магнитка-Bosch.pdf", type: "inquiry", deal: [{ id: "SORP-3941", label: "Bosch Магнитка" }], size: "1.4 MB", date: "2026-04-25", scan: true },
{ id: "d_004", name: "Invoice INV-2026-04321.pdf", type: "invoice", deal: [{ id: "SORP-3929", label: "ТМК подшипники" }], size: "230 KB", date: "2026-05-20", scan: true },
{ id: "d_005", name: "Bill_of_Lading_MSC_38421.pdf", type: "customs", deal: [{ id: "SORP-3941", label: "Bosch Магнитка" }], size: "1.8 MB", date: "2026-05-18", scan: true },
{ id: "d_006", name: "Pmt-Caspian-USD-104k.pdf", type: "payment", deal: [{ id: "SORP-3941", label: "Bosch Магнитка" }], size: "210 KB", date: "2026-05-16", scan: false },
{ id: "d_007", name: "EAC-cert-SKF-bearings.pdf", type: "cert", deal: [{ id: "SORP-3929", label: "ТМК подшипники" }], size: "780 KB", date: "2026-04-30", scan: false },
{ id: "d_008", name: "Photo-pre-shipment-MMK.jpg", type: "photo", deal: [{ id: "SORP-3941", label: "Bosch Магнитка" }], size: "3.4 MB", date: "2026-05-24", scan: false },
];
const typeOpts = [
{ value: "inquiry", label: "Заявка", color: "gray" },
{ value: "proposal", label: "КП", color: "blue" },
{ value: "spec", label: "Спецификация", color: "teal" },
{ value: "invoice", label: "Инвойс", color: "purple" },
{ value: "customs", label: "Таможня", color: "yellow" },
{ value: "payment", label: "Платёж", color: "green" },
{ value: "photo", label: "Фото", color: "pink" },
{ value: "cert", label: "Сертификат", color: "orange" },
];
const columns = [
{ id: "name", label: "Файл", type: "primary", width: 360 },
{ id: "type", label: "Тип (ИИ)", type: "select", width: 160, options: typeOpts },
{ id: "deal", label: "Сделка", type: "linked", width: 220 },
{ id: "date", label: "Дата", type: "date", width: 140 },
{ id: "size", label: "Размер", type: "text", width: 90, mono: true },
{ id: "scan", label: "Скан", type: "select", width: 110, options: [{ value: true, label: "Скан + OCR", color: "yellow" }, { value: false, label: "Цифровой", color: "gray" }] },
];
const views = [
{ name: "Все документы", kind: "grid", count: rows.length, sort: [{ field: "date", dir: "desc" }] },
{ name: "По типу", kind: "kanban", stackBy: "type" },
{ name: "Сканы + OCR", kind: "grid", filter: [{ field: "scan", op: "is", value: true }] },
{ name: "Группа по сделке", kind: "grid", groupBy: "deal" },
];
return ;
}
/* ===================== SANCTIONS ===================== */
function SanctionsScreen({ navigate }) {
const { lang, t } = useI18n();
return (
<>
{t("sanctions")}
3 активных · 12 за всё время
Требует решения
Решено
False positive
Последний скрининг: 2026-05-27 03:21 · OpenSanctions
Запустить скрининг
{[
{ who: "Siemens (Shanghai) Industrial Trading", role: "supplier", list: "EAR99 advisory", det: "Связь с подсанкционной материнской · OFAC press 2026-05-24", deals: 2, val: 91000, severity: "review" },
{ who: "SORP-3955 поз. 04 — Подшипник 7224", role: "deal_item", list: "Dual-use HS 8482.10", det: "Возможное применение в военной технике (роликовые подшипники для прокатных станов)", deals: 1, val: 18400, severity: "flag" },
{ who: "Конечник = ТМК Волжский (≠ Северсталь-Метиз)", role: "end_user", list: "Внутренняя политика", det: "Конечный получатель отличается от заказчика. Требуется LOA от конечника для подтверждения end-use.", deals: 1, val: 1204000, severity: "review" },
].map((c, i) => (
{c.who}
{c.list}
{c.deals} сделок
${(c.val / 1000).toFixed(0)}k
{c.det}
Детали
Запросить документы
Принять решение
))}
>
);
}
/* ===================== GLOBAL SEARCH (Ask AI overlay) ===================== */
function SearchScreen({ navigate, query }) {
const { lang, t } = useI18n();
const [q, setQ] = useState(query || "подшипники в обход санкций");
const [tab, setTab] = useState("ai");
return (
{tab === "ai" &&
}
{tab !== "ai" && (
{window.DATA.searchResults.filter(r => tab === "all" || r.type === tab).map(r => (
navigate(r.type === "deal" ? "deal" : "party", { id: r.id })}>
{r.type}
{r.title}
{r.id}
{r.sub}
))}
)}
);
}
function AiAnswer({ q, navigate }) {
return (
ИИ-ответ
Claude · 2.4 секунды · 5 источников
Перегенерировать
По матрице возможностей и истории сделок 4 поставщика в нашей базе могут поставить промышленные подшипники без риска вторичных санкций для конечника:
SKF Middle East FZE (JAFZA, OAE) — прямой производитель, складская программа[1] . История 14 сделок, средний lead 32 дня.
Wuxi WLR Bearings (Китай) — независимый производитель, дружественная юрисдикция[2] . MOQ 100 шт.
ZWZ Wafangdian (Китай) — каталог под HS 8482.10, в номенклатуре есть аналог 7224C[3] .
Erkunt Sanayi (Турция) — комплектующие через производство, см. navigate("party", { id: "p_2005" })} style={{ color: "var(--sorp-red)", cursor: "pointer" }}>карточку поставщика .
Внимание: Siemens (Shanghai) сейчас под review из-за advisory OFAC[4] . На уровне позиций — подшипник 7224 имеет dual-use флаг (HS 8482.10) для прокатных станов[5] , требуется LOA от конечника.
Источники
{[
{ i: 1, name: "Capability matrix · SKF Middle East FZE", path: "/parties/p_2001" },
{ i: 2, name: "Capability matrix · Wuxi WLR", path: "/parties/p_2004" },
{ i: 3, name: "Nomenclature · аналоги для 7224", path: "/nomenclature/n_4501" },
{ i: 4, name: "OpenSanctions advisory · 2026-05-24", path: "external" },
{ i: 5, name: "Comment in Asana task 1207001984822", path: "asana://..." },
].map(s => (
[{s.i}]
{s.name}
{s.path}
))}
);
}
/* ===================== EXTERNAL FORM-LINK ===================== */
function FormLinkScreen() {
const [vals, setVals] = useState({
phone: "+7 916 ", inn: "", role: "contact", note: ""
});
const [saving, setSaving] = useState(false);
const [done, setDone] = useState(false);
const filled = (vals.phone.length > 8 ? 1 : 0) + (vals.inn ? 1 : 0);
const total = 2;
if (done) {
return (
Спасибо
Данные отправлены стюарду на проверку. Ссылка стала недействительной.
);
}
return (
Уточните данные по контрагенту
Сергей К. из SORP попросил дополнить запись. Заполните только то, что знаете — ссылка действует до 2026-05-29 .
Запись
p_9007
Сделка
SORP-3974
В нашей базе у этой записи в имени попал служебный ID. Подскажите настоящее.
setVals(v => ({ ...v, phone: e.target.value }))} style={ffInput}/>
У нас сейчас: +7-916-четыре-нольсем — текст вместо цифр
В записи: ivanov@… — обрезано
{[
{ id: "contact", l: "Контакт" }, { id: "buyer", l: "Покупатель" },
{ id: "tech", l: "Технический специалист" }, { id: "manager", l: "Руководитель" },
].map(o => (
setVals(v => ({ ...v, role: o.id }))}>{o.l}
))}
Прогресс
{filled}/{total} обязательных
{ setSaving(true); setTimeout(() => setDone(true), 600); }}>
{saving ? "Отправляем…" : "Отправить"}
Защищённая одноразовая ссылка · SSL · данные шифруются · вход в систему не требуется
);
}
const ffInput = {
width: "100%",
border: "1px solid var(--border-subtle)",
borderRadius: 8,
padding: "10px 12px",
fontSize: 14,
background: "var(--bg-surface)",
fontFamily: "var(--font-sans)",
};
function FormField({ label, hint, children }) {
return (
{label}{hint && · {hint} }
{children}
);
}
/* ===================== SCHEMA / CATALOG (lightweight) ===================== */
function SchemaScreen() {
const tables = [
{ name: "party", rows: 2184, cols: 27, desc: "Единая запись идентичности — человек или организация" },
{ name: "party_role", rows: 3120, cols: 7, desc: "Роль party в контексте — заказчик/поставщик/конечник/заход" },
{ name: "deal", rows: 312, cols: 18, desc: "Сделка с SORP-ключом, связь с Amo/Asana/Drive" },
{ name: "deal_item", rows: 1840, cols: 24, desc: "Позиция спецификации — requested vs accepted" },
{ name: "nomenclature", rows: 1248, cols: 14, desc: "Каталог + HS + аналоги" },
{ name: "supplier_capability", rows: 612, cols: 9, desc: "Матрица возможностей поставщика" },
{ name: "document", rows: 1248, cols: 12, desc: "Drive-индекс + OCR + тип-классификация" },
{ name: "system_link", rows: 4204, cols: 6, desc: "Внешние ID: amo/asana/drive/1c" },
{ name: "fx_rate", rows: 1820, cols: 4, desc: "Курсы валют по датам" },
{ name: "compliance_screen", rows: 8412, cols: 8, desc: "Скрининг по OpenSanctions" },
{ name: "audit_log", rows: 184_201, cols: 9, desc: "Кто/когда/что/было→стало" },
{ name: "party_merge", rows: 8, cols: 6, desc: "Tombstone слияний — для отката" },
];
return (
<>
Каталог таблиц
12 таблиц · схема mdm
ER-диаграмма
Миграции
Новая таблица
Таблица Строк Колонок Описание Связи
{tables.map(t => (
{t.name}
{t.rows.toLocaleString("ru-RU")}
{t.cols}
{t.desc}
{Array.from({ length: Math.min(4, t.cols > 10 ? 4 : 2) }).map((_, i) => FK )}
Открыть
))}
>
);
}
window.CapabilityScreen = CapabilityScreen;
window.NomenclatureScreen = NomenclatureScreen;
window.DocumentsScreen = DocumentsScreen;
window.SanctionsScreen = SanctionsScreen;
window.SearchScreen = SearchScreen;
window.FormLinkScreen = FormLinkScreen;
window.SchemaScreen = SchemaScreen;