From 39974f3e5d38d864701507054da508622226f6b2 Mon Sep 17 00:00:00 2001 From: k1nq Date: Fri, 25 Sep 2026 16:55:06 +0500 Subject: [PATCH] =?UTF-8?q?Update=20localization=20files=20and=20add=20doc?= =?UTF-8?q?umentation=20for=20=D0=B2=D1=8B=D0=BF=D0=B8=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Updated timestamps and AST hashes for English and Russian localization files. - Modified timestamps and AST hashes for ImportDetailPage and ImportsPage components. - Updated test file timestamps and AST hash for import-confirm.test.tsx. - Added new documentation file for выписки fixes with relevant metadata. --- design.pen | 2050 +++++++++++++- frontend/src/i18n/locales/en.json | 5 +- frontend/src/i18n/locales/ru.json | 5 +- frontend/src/pages/ImportDetailPage.tsx | 112 +- frontend/src/styles/global.css | 79 + frontend/src/test/import-confirm.test.tsx | 40 + graphify-out/.graphify_labels.json | 19 +- graphify-out/.graphify_labels.json.sig | 2 +- graphify-out/GRAPH_REPORT.md | 112 +- graphify-out/graph.html | 8 +- graphify-out/graph.json | 3096 +++++++++++---------- graphify-out/manifest.json | 30 +- 12 files changed, 3785 insertions(+), 1773 deletions(-) diff --git a/design.pen b/design.pen index 2a1f5dd..b50f94c 100644 --- a/design.pen +++ b/design.pen @@ -21367,6 +21367,66 @@ } ] }, + { + "type": "frame", + "id": "A4Ua9t", + "name": "MCC codes field", + "width": "fill_container", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "dXuY6", + "name": "MCC codes label", + "fill": "#AAA9A5", + "content": "КОДЫ MCC", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.6 + }, + { + "type": "text", + "id": "rz3dH", + "name": "MCC codes hint", + "fill": "#8D8D89", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Необязательно: 3–4-значные коды через запятую", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "ZGp6y", + "name": "MCC codes input", + "width": "fill_container", + "height": 40, + "fill": "#1D1D1D", + "stroke": "#3D3D3A", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "UOQoz", + "name": "MCC codes sample value", + "fill": "#AAA9A5", + "content": "5411, 5422", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "Pmikk", @@ -21408,7 +21468,7 @@ "type": "frame", "id": "n3MrM", "name": "Active Categories Tab", - "width": 145, + "width": "fill_container", "height": 39, "fill": "#FFFFFF", "stroke": "$blue", @@ -21434,7 +21494,7 @@ "type": "frame", "id": "RBEPu", "name": "Archived Categories Tab", - "width": 145, + "width": "fill_container", "height": 39, "fill": "#FFFFFF", "justifyContent": "center", @@ -21472,18 +21532,18 @@ "strokeWidth": { "bottom": 1 }, + "layout": "vertical", + "gap": 10, "padding": [ 13, 14 ], - "justifyContent": "space_between", - "alignItems": "center", "children": [ { "type": "frame", "id": "tWjCs", "name": "Category Definition Copy · Продукты", - "width": 150, + "width": "fill_container", "layout": "vertical", "gap": 4, "children": [ @@ -21511,18 +21571,44 @@ ] }, { - "type": "text", - "id": "PqwWX", - "name": "Category Definition Action · Продукты", - "fill": "$blue", - "textGrowth": "fixed-width", - "width": 166, - "content": "Переименовать · Архивировать", - "lineHeight": 1.35, - "textAlign": "right", - "fontFamily": "$font-ui", - "fontSize": 10.5, - "fontWeight": "normal" + "type": "frame", + "id": "QD0he", + "name": "Category actions · Продукты", + "width": "fill_container", + "gap": 18, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "R7Co2", + "name": "Rename category", + "fill": "#A9C4FF", + "content": "Переименовать", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "Z41PM", + "name": "Edit category MCC", + "fill": "#A9C4FF", + "content": "Изменить MCC", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "KSeiu", + "name": "Archive category", + "fill": "#A9C4FF", + "content": "В архив", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "500" + } + ] } ] }, @@ -21535,18 +21621,18 @@ "strokeWidth": { "bottom": 1 }, + "layout": "vertical", + "gap": 10, "padding": [ 13, 14 ], - "justifyContent": "space_between", - "alignItems": "center", "children": [ { "type": "frame", "id": "UcBaV", "name": "Category Definition Copy · Накопления", - "width": 150, + "width": "fill_container", "layout": "vertical", "gap": 4, "children": [ @@ -21574,20 +21660,6 @@ "letterSpacing": 0.3 } ] - }, - { - "type": "text", - "id": "Y7thn", - "name": "Category Definition Action · Накопления", - "fill": "#AAA9A5", - "textGrowth": "fixed-width", - "width": 166, - "content": "Защищена: связана со счётом", - "lineHeight": 1.35, - "textAlign": "right", - "fontFamily": "$font-ui", - "fontSize": 10.5, - "fontWeight": "normal" } ] }, @@ -21600,18 +21672,18 @@ "strokeWidth": { "bottom": 1 }, + "layout": "vertical", + "gap": 10, "padding": [ 13, 14 ], - "justifyContent": "space_between", - "alignItems": "center", "children": [ { "type": "frame", "id": "jyMq6", "name": "Category Definition Copy · Резерв · Alfa credit", - "width": 150, + "width": "fill_container", "layout": "vertical", "gap": 4, "children": [ @@ -21637,20 +21709,6 @@ "letterSpacing": 0.3 } ] - }, - { - "type": "text", - "id": "EoOJz", - "name": "Category Definition Action · Резерв · Alfa credit", - "fill": "#AAA9A5", - "textGrowth": "fixed-width", - "width": 166, - "content": "Защищена: связана с кредиткой", - "lineHeight": 1.35, - "textAlign": "right", - "fontFamily": "$font-ui", - "fontSize": 10.5, - "fontWeight": "normal" } ] } @@ -23507,7 +23565,7 @@ "clip": true, "width": 390, "height": 844, - "fill": "$paper", + "fill": "$ink", "layout": "vertical", "children": [ { @@ -23516,6 +23574,7 @@ "name": "Mobile Category Content", "width": 390, "height": 794, + "fill": "$ink", "layout": "vertical", "gap": 14, "padding": [ @@ -23542,7 +23601,7 @@ "type": "text", "id": "Jzdpt", "name": "Mobile Category Eyebrow", - "fill": "$muted", + "fill": "#AAA9A5", "content": "БЮДЖЕТ · СЕНТЯБРЬ", "fontFamily": "$font-data", "fontSize": 8.5, @@ -23553,7 +23612,7 @@ "type": "text", "id": "IVOOS", "name": "Mobile Category Title", - "fill": "$ink", + "fill": "$white", "content": "Категории", "fontFamily": "$font-ui", "fontSize": 22, @@ -23567,7 +23626,7 @@ "name": "Mobile Category Close", "width": 36, "height": 36, - "stroke": "$line", + "stroke": "#3D3D3A", "strokeWidth": 1, "justifyContent": "center", "alignItems": "center", @@ -23576,7 +23635,7 @@ "type": "text", "id": "uhsx9", "name": "Mobile Category Close Label", - "fill": "$ink", + "fill": "$white", "content": "×", "fontFamily": "$font-ui", "fontSize": 20, @@ -23591,8 +23650,8 @@ "id": "WFwIN", "name": "Mobile Create Category", "width": "fill_container", - "fill": "$white", - "stroke": "$line", + "fill": "$ink", + "stroke": "#3D3D3A", "strokeWidth": 1, "layout": "vertical", "gap": 8, @@ -23602,7 +23661,7 @@ "type": "text", "id": "zGEdK", "name": "Mobile Create Category Label", - "fill": "$muted", + "fill": "#AAA9A5", "content": "СОЗДАТЬ КАТЕГОРИЮ", "fontFamily": "$font-data", "fontSize": 8.5, @@ -23614,8 +23673,8 @@ "name": "Mobile Category Name Input", "width": "fill_container", "height": 42, - "fill": "$paper", - "stroke": "$line", + "fill": "#1D1D1D", + "stroke": "#3D3D3A", "strokeWidth": 1, "padding": [ 0, @@ -23627,7 +23686,7 @@ "type": "text", "id": "m24NE", "name": "Mobile Category Name Input Value", - "fill": "$muted", + "fill": "#AAA9A5", "content": "Название", "fontFamily": "$font-ui", "fontSize": 12, @@ -23641,8 +23700,8 @@ "name": "Mobile Category Kind Input", "width": "fill_container", "height": 42, - "fill": "$paper", - "stroke": "$line", + "fill": "#1D1D1D", + "stroke": "#3D3D3A", "strokeWidth": 1, "padding": [ 0, @@ -23654,7 +23713,7 @@ "type": "text", "id": "uY4Gm", "name": "Mobile Category Kind Input Value", - "fill": "$muted", + "fill": "#AAA9A5", "content": "Ежемесячная ⌄", "fontFamily": "$font-ui", "fontSize": 12, @@ -23662,6 +23721,53 @@ } ] }, + { + "type": "frame", + "id": "hGYJN", + "name": "Mobile MCC Codes Field", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "Sa82S", + "name": "Mobile MCC Codes Label", + "fill": "#AAA9A5", + "content": "КОДЫ MCC · необязательно", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "fYN4D", + "name": "Mobile MCC Codes Input", + "width": "fill_container", + "height": 40, + "fill": "#1D1D1D", + "stroke": "#3D3D3A", + "strokeWidth": 1, + "padding": [ + 0, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "MeQ1i", + "name": "Mobile MCC Codes Value", + "fill": "#AAA9A5", + "content": "5411, 5422", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "oDU1E", @@ -23692,7 +23798,7 @@ "name": "Mobile Category Tabs", "width": "fill_container", "height": 40, - "stroke": "$line", + "stroke": "#3D3D3A", "strokeWidth": 1, "children": [ { @@ -23701,9 +23807,11 @@ "name": "Mobile Category Tab · Активные · 5", "width": "fill_container", "height": 40, - "fill": "#E8F0FF", + "fill": "$white", "stroke": "$blue", - "strokeWidth": 1, + "strokeWidth": { + "bottom": 2 + }, "justifyContent": "center", "alignItems": "center", "children": [ @@ -23726,7 +23834,7 @@ "width": "fill_container", "height": 40, "fill": "$white", - "stroke": "$line", + "stroke": "#3D3D3A", "justifyContent": "center", "alignItems": "center", "children": [ @@ -23734,7 +23842,7 @@ "type": "text", "id": "CcyRt", "name": "Mobile Category Tab Label · Архив · 1", - "fill": "$muted", + "fill": "$ink", "content": "Архив · 1", "fontFamily": "$font-ui", "fontSize": 11, @@ -23749,8 +23857,8 @@ "id": "DRoY8", "name": "Mobile Category List", "width": "fill_container", - "fill": "$white", - "stroke": "$line", + "fill": "$ink", + "stroke": "#3D3D3A", "strokeWidth": 1, "layout": "vertical", "children": [ @@ -23759,7 +23867,7 @@ "id": "WvbJo", "name": "Mobile Category · Продукты", "width": "fill_container", - "stroke": "$line", + "stroke": "#3D3D3A", "strokeWidth": { "bottom": 1 }, @@ -23771,7 +23879,7 @@ "type": "text", "id": "RJDNf", "name": "Mobile Category Name · Продукты", - "fill": "$ink", + "fill": "$white", "content": "Продукты", "fontFamily": "$font-ui", "fontSize": 13, @@ -23781,21 +23889,50 @@ "type": "text", "id": "G7JPl", "name": "Mobile Category Meta · Продукты", - "fill": "$muted", + "fill": "#AAA9A5", "content": "Ежемесячная", "fontFamily": "$font-data", "fontSize": 9, "fontWeight": "normal" }, { - "type": "text", - "id": "rAQRI", - "name": "Mobile Category Action · Продукты", - "fill": "$blue", - "content": "Переименовать · Архивировать", - "fontFamily": "$font-ui", - "fontSize": 10.5, - "fontWeight": "700" + "type": "frame", + "id": "d63Sw", + "name": "Mobile Category Text Actions", + "width": "fill_container", + "gap": 14, + "children": [ + { + "type": "text", + "id": "Qk3O6", + "name": "Mobile Rename Category", + "fill": "#A9C4FF", + "content": "Переименовать", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "500" + }, + { + "type": "text", + "id": "OjEt1", + "name": "Mobile Edit MCC", + "fill": "#A9C4FF", + "content": "Изменить MCC", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "500" + }, + { + "type": "text", + "id": "ogbOx", + "name": "Mobile Archive Category", + "fill": "#A9C4FF", + "content": "В архив", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "500" + } + ] } ] }, @@ -23804,7 +23941,7 @@ "id": "BT9FS", "name": "Mobile Category · Накопления", "width": "fill_container", - "stroke": "$line", + "stroke": "#3D3D3A", "strokeWidth": { "bottom": 1 }, @@ -23816,7 +23953,7 @@ "type": "text", "id": "hQGu0", "name": "Mobile Category Name · Накопления", - "fill": "$ink", + "fill": "$white", "content": "Накопления", "fontFamily": "$font-ui", "fontSize": 13, @@ -23826,7 +23963,7 @@ "type": "text", "id": "R75etH", "name": "Mobile Category Meta · Накопления", - "fill": "$muted", + "fill": "#AAA9A5", "content": "Накопительная · Системная", "fontFamily": "$font-data", "fontSize": 9, @@ -23836,7 +23973,7 @@ "type": "text", "id": "ptslB", "name": "Mobile Category Action · Накопления", - "fill": "$muted", + "fill": "#AAA9A5", "content": "Защищена системным правилом", "fontFamily": "$font-ui", "fontSize": 10.5, @@ -23849,7 +23986,7 @@ "id": "HjJb7", "name": "Mobile Category · Резерв · Alfa credit", "width": "fill_container", - "stroke": "$line", + "stroke": "#3D3D3A", "strokeWidth": { "bottom": 1 }, @@ -23861,7 +23998,7 @@ "type": "text", "id": "JfF7v", "name": "Mobile Category Name · Резерв · Alfa credit", - "fill": "$ink", + "fill": "$white", "content": "Резерв · Alfa credit", "fontFamily": "$font-ui", "fontSize": 13, @@ -23871,7 +24008,7 @@ "type": "text", "id": "Xk1MY", "name": "Mobile Category Meta · Резерв · Alfa credit", - "fill": "$muted", + "fill": "#AAA9A5", "content": "Резерв · Системная", "fontFamily": "$font-data", "fontSize": 9, @@ -23881,7 +24018,7 @@ "type": "text", "id": "psbhT", "name": "Mobile Category Action · Резерв · Alfa credit", - "fill": "$muted", + "fill": "#AAA9A5", "content": "Защищена системным правилом", "fontFamily": "$font-ui", "fontSize": 10.5, @@ -23896,18 +24033,16 @@ "id": "mvKbp", "name": "Mobile Archived Category Hint", "width": "fill_container", - "fill": "$amber-soft", - "stroke": "$amber", - "strokeWidth": { - "left": 3 - }, + "fill": "#1D1D1D", + "stroke": "#3D3D3A", + "strokeWidth": 1, "padding": 11, "children": [ { "type": "text", "id": "gN7ow", "name": "Mobile Archived Category Hint Copy", - "fill": "$amber", + "fill": "#AAA9A5", "textGrowth": "fixed-width", "width": "fill_container", "content": "В архиве: Путешествия · история сохранена · Восстановить", @@ -28098,6 +28233,1727 @@ ] } ] + }, + { + "type": "frame", + "id": "PF8MO", + "x": 12180, + "y": 0, + "name": "05b · Statement Detail / Reconciliation", + "clip": true, + "width": 1440, + "height": 1050, + "fill": "$paper", + "children": [ + { + "type": "frame", + "id": "GzzIo", + "name": "Detail Sidebar", + "width": 238, + "height": 1050, + "fill": "$ink", + "layout": "vertical", + "padding": [ + 32, + 24 + ], + "justifyContent": "space_between", + "children": [ + { + "type": "frame", + "id": "b67Nv", + "name": "Overview Sidebar Top", + "width": "fill_container", + "layout": "vertical", + "gap": 34, + "children": [ + { + "type": "frame", + "id": "ELZIN", + "name": "Overview Brand", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "ozCtK", + "name": "Overview Brand Mark", + "width": 34, + "height": 34, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "ZwiTm", + "name": "Overview Brand Mark Text", + "fill": "$white", + "content": "FS", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "zEnaM", + "name": "Overview Brand Text", + "fill": "$white", + "content": "FINSPACE", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "700", + "letterSpacing": 1.3 + } + ] + }, + { + "type": "frame", + "id": "pjqvC", + "name": "Overview Space", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 5, + "padding": [ + 0, + 0, + 18, + 0 + ], + "children": [ + { + "type": "text", + "id": "K1Km5", + "name": "Overview Space Label", + "fill": "#777773", + "content": "FINANCIAL SPACE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 1 + }, + { + "type": "text", + "id": "y2C0f", + "name": "Overview Space Name", + "fill": "$white", + "content": "Morozov household", + "fontFamily": "$font-ui", + "fontSize": 15, + "fontWeight": "600" + }, + { + "type": "text", + "id": "y9iLk", + "name": "Overview Space Role", + "fill": "#8FAEFF", + "content": "OWNER · ACTIVE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600", + "letterSpacing": 0.7 + } + ] + }, + { + "type": "frame", + "id": "DF6CA", + "name": "Overview Navigation", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "frame", + "id": "b1AeuK", + "name": "Nav · This month", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "DDd02", + "name": "Nav Lead · This month", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "n54EG", + "name": "Nav Icon · This month", + "width": 17, + "height": 17, + "icon": "calendar-range", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "gddXo", + "name": "Nav Label · This month", + "fill": "#C0C0BC", + "content": "This month", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "t0oii", + "name": "Nav · Ledger", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "DXO3m", + "name": "Nav Lead · Ledger", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "qWq3W", + "name": "Nav Icon · Ledger", + "width": 17, + "height": 17, + "icon": "rows-3", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "q4VbSf", + "name": "Nav Label · Ledger", + "fill": "#C0C0BC", + "content": "Ledger", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "Dx3qy", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "YAvJh", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "BcNwl", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "KZIVR", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "IwZ0Y", + "name": "Nav · Statements", + "width": "fill_container", + "height": 42, + "fill": "$blue", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "YfH2w", + "name": "Nav Lead · Statements", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "B27h2z", + "name": "Nav Icon · Statements", + "width": 17, + "height": 17, + "icon": "inbox", + "library": "lucide", + "fill": "$white" + }, + { + "type": "text", + "id": "fdHq3", + "name": "Nav Label · Statements", + "fill": "$white", + "content": "Statements", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "ex7rR", + "name": "Nav Count · Statements", + "width": 22, + "height": 22, + "fill": "$amber-soft", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "h2CyGQ", + "name": "Nav Count Text · Statements", + "fill": "$amber", + "content": "3", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "b59cWi", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "B1hld", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "y0bYFn", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "lDldr", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "CnIEo", + "name": "Nav · Analytics", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "otvyv", + "name": "Nav Lead · Analytics", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "RviN9", + "name": "Nav Icon · Analytics", + "width": 17, + "height": 17, + "icon": "chart-no-axes-combined", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "fEyJb", + "name": "Nav Label · Analytics", + "fill": "#C0C0BC", + "content": "Analytics", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "y5ZWU", + "name": "Nav · Accounts", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "nnknR", + "name": "Nav Lead · Accounts", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "cFf4u", + "name": "Nav Icon · Accounts", + "width": 17, + "height": 17, + "icon": "wallet-cards", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "FTs92", + "name": "Nav Label · Accounts", + "fill": "#C0C0BC", + "content": "Accounts", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "QGLF4", + "name": "Nav · Space & data", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "d56Kp", + "name": "Nav Lead · Space & data", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "uVjjq", + "name": "Nav Icon · Space & data", + "width": 17, + "height": 17, + "icon": "settings-2", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "k7K45", + "name": "Nav Label · Space & data", + "fill": "#C0C0BC", + "content": "Space & data", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "LctbP", + "name": "Overview Sidebar Bottom", + "width": "fill_container", + "layout": "vertical", + "gap": 14, + "children": [ + { + "type": "frame", + "id": "w0Qll", + "name": "Overview Sync State", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "ellipse", + "id": "X0E2J7", + "name": "Overview Sync Dot", + "fill": "$green", + "width": 7, + "height": 7 + }, + { + "type": "text", + "id": "UOFfb", + "name": "Overview Sync Text", + "fill": "#8D8D89", + "content": "All data synced", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "G3gVq", + "name": "Overview Profile", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "top": 1 + }, + "gap": 10, + "padding": [ + 14, + 0, + 0, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Sutfs", + "name": "Overview Avatar", + "width": 34, + "height": 34, + "fill": "#30302E", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "BjRpB", + "name": "Overview Avatar Text", + "fill": "$white", + "content": "AM", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "BBIv9", + "name": "Overview Profile Copy", + "layout": "vertical", + "gap": 2, + "children": [ + { + "type": "text", + "id": "bUaby", + "name": "Overview Profile Name", + "fill": "$white", + "content": "Alexey Morozov", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "vXnnk", + "name": "Overview Profile Meta", + "fill": "#777773", + "content": "RU · Europe/Moscow", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "icon", + "id": "H3puop", + "name": "Logout Action", + "width": 15, + "height": 15, + "icon": "log-out", + "library": "lucide", + "fill": "#777773" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "ax3kW", + "name": "Statement Detail Main", + "width": 1202, + "height": 1050, + "layout": "vertical", + "gap": 24, + "padding": [ + 38, + 48 + ], + "children": [ + { + "type": "frame", + "id": "WdCpi", + "name": "Document Header", + "width": "fill_container", + "layout": "vertical", + "gap": 14, + "children": [ + { + "type": "frame", + "id": "B9qGe", + "name": "Detail Navigation", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "DWBvH", + "name": "Back to statements", + "fill": "$blue", + "content": "← Все выписки", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Vzvwi", + "name": "Document source", + "fill": "$muted", + "content": "ALFA · XLSX / СЕНТЯБРЬ 2026", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "H5D5vw", + "name": "Document Title and Actions", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "CD6TS", + "name": "Document Title Copy", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "aHfOS", + "name": "Document Title", + "fill": "$ink", + "content": "Разбор выписки", + "fontFamily": "$font-ui", + "fontSize": 34, + "fontWeight": "700" + }, + { + "type": "text", + "id": "c1JQM", + "name": "Document File and Account", + "fill": "$muted", + "content": "alfa-september-2026.xlsx · Альфа Карта · 01–30 сентября", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "NC8lt", + "name": "Document Actions", + "gap": 9, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "g2mlHT", + "name": "Reparse button", + "height": 40, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "wLo6g", + "name": "Reparse label", + "fill": "$ink", + "content": "Переразобрать", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "eiuQc", + "name": "Apply button", + "height": 40, + "fill": "$blue", + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "eYE9m", + "name": "Apply label", + "fill": "$white", + "content": "Применить импорт", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "XJtxY", + "name": "Reconciliation Summary", + "width": "fill_container", + "fill": "$ink", + "layout": "vertical", + "gap": 18, + "padding": [ + 22, + 26 + ], + "children": [ + { + "type": "frame", + "id": "m3bHVi", + "name": "Reconciliation Heading", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "xx9ow", + "name": "Reconciliation title", + "fill": "$white", + "content": "Сверка остатков", + "fontFamily": "$font-ui", + "fontSize": 20, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "yGLi3", + "name": "Mismatch status", + "fill": "$amber-soft", + "padding": [ + 7, + 12 + ], + "children": [ + { + "type": "text", + "id": "j6PJtj", + "name": "Mismatch label", + "fill": "$amber", + "content": "РАСХОЖДЕНИЕ", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "mMeYP", + "name": "Balance Comparison", + "width": "fill_container", + "gap": 18, + "children": [ + { + "type": "frame", + "id": "yxCt0", + "name": "Входящий остаток", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "text", + "id": "soRGG", + "name": "Входящий остаток label", + "fill": "#AAA9A4", + "content": "Входящий остаток", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "LaOPZ", + "name": "Входящий остаток value", + "fill": "$white", + "content": "₽ 128 450,00", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "k0HQKy", + "name": "Исходящий остаток", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "text", + "id": "E9og9K", + "name": "Исходящий остаток label", + "fill": "#AAA9A4", + "content": "Исходящий остаток", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "QRGZc", + "name": "Исходящий остаток value", + "fill": "$white", + "content": "₽ 191 610,00", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "K0ZSWc", + "name": "Расчётный остаток", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "text", + "id": "c8AKE", + "name": "Расчётный остаток label", + "fill": "#AAA9A4", + "content": "Расчётный остаток", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "xdp2c", + "name": "Расчётный остаток value", + "fill": "$white", + "content": "₽ 188 610,00", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "UtX7s", + "name": "Balance Difference", + "width": 184, + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "text", + "id": "ynFTo", + "name": "Balance Difference label", + "fill": "#AAA9A4", + "content": "Разница", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "y6mi5r", + "name": "Balance Difference value", + "fill": "#FFCC6D", + "content": "₽ 3 000,00", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "SrhtL", + "name": "Critical Issues", + "width": "fill_container", + "fill": "$red-soft", + "layout": "vertical", + "gap": 12, + "padding": [ + 18, + 22 + ], + "children": [ + { + "type": "frame", + "id": "KP5u2", + "name": "Critical Issues Heading", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "qjMOp", + "name": "Critical Issues Title", + "fill": "$red", + "content": "Критические проблемы", + "fontFamily": "$font-ui", + "fontSize": 17, + "fontWeight": "700" + }, + { + "type": "text", + "id": "MGEAA", + "name": "Critical Issues Count", + "fill": "$red", + "content": "2 строки требуют решения", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "IFcGw", + "name": "Issue link 18 сен · OZON", + "width": "fill_container", + "fill": "$white", + "padding": [ + 10, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Ajic8", + "name": "Issue copy 18 сен · OZON", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "Wf6Ij", + "name": "Issue merchant 18 сен · OZON", + "fill": "$ink", + "content": "18 сен · OZON", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "jBfn2", + "name": "Issue reason 18 сен · OZON", + "fill": "$muted", + "content": "Возможный дубликат или перевод. Выберите решение для строки.", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "text", + "id": "r1eg8", + "name": "Issue arrow 18 сен · OZON", + "fill": "$blue", + "content": "Перейти к строке ↗", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "DTI6N", + "name": "Issue link 19 сен · Перевод между счетами", + "width": "fill_container", + "fill": "$white", + "padding": [ + 10, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "OD2Eq", + "name": "Issue copy 19 сен · Перевод между счетами", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "i5Vzb", + "name": "Issue merchant 19 сен · Перевод между счетами", + "fill": "$ink", + "content": "19 сен · Перевод между счетами", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "xUjkF", + "name": "Issue reason 19 сен · Перевод между счетами", + "fill": "$muted", + "content": "Возможный дубликат или перевод. Выберите решение для строки.", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "text", + "id": "q5BG1", + "name": "Issue arrow 19 сен · Перевод между счетами", + "fill": "$blue", + "content": "Перейти к строке ↗", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "jlKo1", + "name": "Statement Rows Work Area", + "width": "fill_container", + "layout": "vertical", + "gap": 12, + "children": [ + { + "type": "frame", + "id": "CHwEX", + "name": "Statement Rows Heading", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "NTRXt", + "name": "Rows title", + "fill": "$ink", + "content": "Строки выписки", + "fontFamily": "$font-ui", + "fontSize": 21, + "fontWeight": "700" + }, + { + "type": "text", + "id": "gXDeP", + "name": "Rows progress", + "fill": "$muted", + "content": "82 обработано · 5 требуют внимания", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "VOxVS", + "name": "Statement Rows Table", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "Z5IU1", + "name": "Statement Rows Columns", + "width": "fill_container", + "height": 42, + "fill": "#EFEEE9", + "gap": 12, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "sChgT", + "name": "Column Date", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 92, + "content": "Дата", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "R0q8xm", + "name": "Column Description", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Операция", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "sTOLP", + "name": "Column Amount", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 130, + "content": "Сумма", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "C6rbT", + "name": "Column Notes", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 120, + "content": "Замечания", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "PT5wj", + "name": "Column Decision", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 254, + "content": "Решение", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "X3zNd", + "name": "Statement row Магнит · продукты", + "width": "fill_container", + "height": 78, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "gap": 12, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "SJMAJ", + "name": "Date Магнит · продукты", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 92, + "content": "21 сен", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "qnaDe", + "name": "Merchant Магнит · продукты", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Магнит · продукты", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "FQTyQ", + "name": "Amount Магнит · продукты", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "−₽ 3 840,00", + "fontFamily": "$font-data", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "pMcrW", + "name": "Note Магнит · продукты", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 120, + "content": "—", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "CDblV", + "name": "Decision select Магнит · продукты", + "width": 254, + "height": 43, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Q5usdl", + "name": "Decision label Магнит · продукты", + "fill": "$green", + "content": "Создать операцию", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "d4KAqI", + "name": "Decision chevron Магнит · продукты", + "fill": "$muted", + "content": "⌄", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "BnxWS", + "name": "Statement row Перевод между счетами", + "width": "fill_container", + "height": 78, + "fill": "#FFF8E7", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "gap": 12, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "WO9u1", + "name": "Date Перевод между счетами", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 92, + "content": "19 сен", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "pvE0t", + "name": "Merchant Перевод между счетами", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Перевод между счетами", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "ivkhk", + "name": "Amount Перевод между счетами", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "−₽ 18 000,00", + "fontFamily": "$font-data", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "tZeKY", + "name": "Note Перевод между счетами", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 120, + "content": "Возможный перевод", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "n083b", + "name": "Decision select Перевод между счетами", + "width": 254, + "height": 43, + "fill": "$white", + "stroke": "$amber", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "RtWXP", + "name": "Decision label Перевод между счетами", + "fill": "$ink", + "content": "Выбрать решение", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "T9wMkb", + "name": "Decision chevron Перевод между счетами", + "fill": "$muted", + "content": "⌄", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "zzdof", + "name": "Statement row OZON · заказ", + "width": "fill_container", + "height": 78, + "fill": "#FFF8E7", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "gap": 12, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Z4aiB", + "name": "Date OZON · заказ", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 92, + "content": "18 сен", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "bCWna", + "name": "Merchant OZON · заказ", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "OZON · заказ", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Gpciq", + "name": "Amount OZON · заказ", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "−₽ 2 490,00", + "fontFamily": "$font-data", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "wahCv", + "name": "Note OZON · заказ", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 120, + "content": "Возможный дубликат", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "So4Ee", + "name": "Decision select OZON · заказ", + "width": 254, + "height": 43, + "fill": "$white", + "stroke": "$amber", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Z5bNp", + "name": "Decision label OZON · заказ", + "fill": "$ink", + "content": "Выбрать решение", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Faarp", + "name": "Decision chevron OZON · заказ", + "fill": "$muted", + "content": "⌄", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "yNBlV", + "name": "Statement row Coffee Point · кофе", + "width": "fill_container", + "height": 78, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "gap": 12, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "aJkD8", + "name": "Date Coffee Point · кофе", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 92, + "content": "17 сен", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "RCJW4", + "name": "Merchant Coffee Point · кофе", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Coffee Point · кофе", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "qLxBI", + "name": "Amount Coffee Point · кофе", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "−₽ 450,00", + "fontFamily": "$font-data", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "kljqU", + "name": "Note Coffee Point · кофе", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 120, + "content": "—", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "NO8kg", + "name": "Decision select Coffee Point · кофе", + "width": 254, + "height": 43, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nLb4p", + "name": "Decision label Coffee Point · кофе", + "fill": "$green", + "content": "Пропустить", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "rhHQY", + "name": "Decision chevron Coffee Point · кофе", + "fill": "$muted", + "content": "⌄", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "HgtZR", + "name": "Statement Rows Footer", + "width": "fill_container", + "padding": [ + 14, + 16 + ], + "justifyContent": "space_between", + "children": [ + { + "type": "text", + "id": "JgL4o", + "name": "More rows", + "fill": "$muted", + "content": "Показаны 4 из 87 строк", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "F4WNa", + "name": "Review remaining", + "fill": "$blue", + "content": "Перейти к следующей проблеме →", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + } + ] + } + ] + } + ] + } + ] } ], "variables": { diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index ea21c6f..ef1d9f3 100644 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -362,8 +362,9 @@ "steps.review_required": "Review", "steps.ready": "Ready", "steps.confirmed": "Applied", - "detailTitle": "Import", + "detailTitle": "Statement review", "backToList": "Back to list", + "goToIssueRow": "Go to row", "failedReason": "Parsing failed: {{reason}}", "blockers": "Critical issues", "blockers.currency_mismatch": "Statement currency does not match the account.", @@ -374,6 +375,8 @@ "blockers.unresolved_duplicate": "There are unresolved duplicates.", "blockers.unresolved_transfer": "There are unresolved transfers.", "blockers.account_conflict": "Account fingerprint conflicts with an existing one.", + "blockers.IMPORT_DECISION_REQUIRED": "Possible duplicate or transfer. Choose a decision for this row.", + "blockers.IMPORT_FIELD_UNRESOLVED": "This row has unresolved required fields.", "unresolvedHolds": "On hold", "unresolvedHoldsBadge": "On-hold operations: {{count}}", "holdBadge": "Hold", diff --git a/frontend/src/i18n/locales/ru.json b/frontend/src/i18n/locales/ru.json index d24c9bc..869401f 100644 --- a/frontend/src/i18n/locales/ru.json +++ b/frontend/src/i18n/locales/ru.json @@ -362,8 +362,9 @@ "steps.review_required": "Разбор", "steps.ready": "Готов", "steps.confirmed": "Применён", - "detailTitle": "Импорт", + "detailTitle": "Разбор выписки", "backToList": "К списку", + "goToIssueRow": "Перейти к строке", "failedReason": "Разбор не удался: {{reason}}", "blockers": "Критические проблемы", "blockers.currency_mismatch": "Валюта выписки не совпадает со счётом.", @@ -374,6 +375,8 @@ "blockers.unresolved_duplicate": "Есть неразобранные дубликаты.", "blockers.unresolved_transfer": "Есть неразобранные переводы.", "blockers.account_conflict": "Отпечаток счёта конфликтует с существующим.", + "blockers.IMPORT_DECISION_REQUIRED": "Возможный дубликат или перевод. Выберите решение для строки.", + "blockers.IMPORT_FIELD_UNRESOLVED": "В строке есть неразобранные обязательные поля.", "unresolvedHolds": "Замороженные", "unresolvedHoldsBadge": "Замороженных операций: {{count}}", "holdBadge": "Заморожена", diff --git a/frontend/src/pages/ImportDetailPage.tsx b/frontend/src/pages/ImportDetailPage.tsx index f4004a8..7f4b57c 100644 --- a/frontend/src/pages/ImportDetailPage.tsx +++ b/frontend/src/pages/ImportDetailPage.tsx @@ -163,16 +163,19 @@ export function ImportDetailPage() { detail.data?.reconciliation.status === 'mismatched' || detail.data?.reconciliation.status === 'not_available' + const goToIssueRow = (rowId: string) => { + const row = document.getElementById(`statement-row-${rowId}`) + row?.scrollIntoView({ block: 'center', behavior: 'instant' }) + row?.querySelector('select, button')?.focus({ preventScroll: true }) + } + return ( - <> +
+ {t('imports.backToList')} - - {t('imports.backToList')} - {status && ['review_required', 'ready', 'failed'].includes(status) ? (
} /> - {status ? {t(`imports.status.${status}`)} : null} - {detail.data && detail.data.unresolvedHoldCount > 0 ? ( - {t('imports.unresolvedHoldsBadge', { count: detail.data.unresolvedHoldCount })} + {detail.data ? ( +

+ {detail.data.fileName} + · {detail.data.accountName ?? t('imports.unassigned')} · {detail.data.bankAdapter} +

) : null} +
+ {status ? {t(`imports.status.${status}`)} : null} + {detail.data && detail.data.unresolvedHoldCount > 0 ? ( + {t('imports.unresolvedHoldsBadge', { count: detail.data.unresolvedHoldCount })} + ) : null} +
{(data) => ( <> @@ -213,18 +224,6 @@ export function ImportDetailPage() { {t('imports.failedReason', { reason: data.failureReason })} ) : null} - {data.blockers.length > 0 ? ( -
- {t('imports.blockers')} -
    - {data.blockers.map((issue) => ( -
  • - {t(`imports.blockers.${issue.code}`, { defaultValue: issue.message ?? issue.code })} -
  • - ))} -
-
- ) : null} {data.warnings.length > 0 ? (
{t('imports.warnings', { count: data.warnings.length })} @@ -237,9 +236,12 @@ export function ImportDetailPage() {
) : null} -
+

{t('imports.reconciliationTitle')}

-
+ + {t(`imports.reconciliation.${data.reconciliation.status}`)} + +
{t('imports.openingBalance')}
@@ -264,38 +266,48 @@ export function ImportDetailPage() { : '—'}
-
-
{t('common.status')}
-
- - {t(`imports.reconciliation.${data.reconciliation.status}`)} - -
-
-

- {t('imports.totals', { - total: data.totals.total, - create: data.totals.create, - discard: data.totals.discard, - duplicate: data.totals.duplicate, - transfer: data.totals.transfer, - savings: data.totals.savingsTransfer, - pending: data.totals.pending, - })} -

-
+ {data.blockers.length > 0 ? ( +
+

{t('imports.blockers')}

+
    + {data.blockers.map((issue, index) => { + const row = data.rows.find((item) => item.id === issue.rowId) + return ( +
  • + + {t(`imports.blockers.${issue.code}`, { defaultValue: issue.message ?? issue.code })} + {row ? {formatDate(row.occurredOn, locale)} · {row.description ?? '—'} · {formatMoney(row.amountKopecks, locale)} : null} + + {row ? ( + + ) : null} +
  • + ) + })} +
+
+ ) : null} +

{t('imports.rowsTitle')}

+

{t('imports.totals', { + total: data.totals.total, + create: data.totals.create, + discard: data.totals.discard, + duplicate: data.totals.duplicate, + transfer: data.totals.transfer, + savings: data.totals.savingsTransfer, + pending: data.totals.pending, + })}

{data.rows.length === 0 ? (

{t('imports.noRows')}

) : ( + @@ -307,7 +319,7 @@ export function ImportDetailPage() { {data.rows.map((row) => ( - + issue.rowId === row.id) ? ' statement-row-issue' : ''}`}> @@ -387,7 +399,7 @@ export function ImportDetailPage() { ) : (
{t('imports.rowsTitle')}
{t('common.date')}
{formatDate(row.occurredOn, locale)}