aurora-1544 добавление таблицы гудвил #220

Merged
aep merged 18 commits from feat/goodWill into main 2026-11-06 18:08:01 +03:00
Owner

добавлена таблица гудвил с возможностью скрытия колонок, открытия на весь экран, фильтрация по положительному и отрицательному гудвилу и редактирования доли в компании и комментария
p.s запросы не работают из за отсутствия бэкенда, требуется протестировать после получения ручек, в компоненте есть тестовые данные по которым можно проверить работоспособность

добавлена таблица гудвил с возможностью скрытия колонок, открытия на весь экран, фильтрация по положительному и отрицательному гудвилу и редактирования доли в компании и комментария p.s запросы не работают из за отсутствия бэкенда, требуется протестировать после получения ручек, в компоненте есть тестовые данные по которым можно проверить работоспособность
grog added 4 commits 2026-11-05 14:04:28 +03:00
grog requested review from aep 2026-11-05 14:04:32 +03:00
grog requested review from maxim 2026-11-05 14:04:34 +03:00
grog added 1 commit 2026-11-05 15:57:32 +03:00
Veronika approved these changes 2026-11-05 17:23:23 +03:00
@ -0,0 +155,4 @@
const { visibleKeys, setVisibleKeys } = useVisibleColumns(groupsConfig);
const toggleFullscreen = async (ref: React.RefObject<HTMLDivElement>, setFullscreen: (val: boolean) => void) => {
Owner

может стоит вынести в отдельный хук? логика повторяется в трех таблицах: Шахматка, таблица корректировок, Гудвилл.

Пример реализации:

export function useFullscreen<T extends HTMLElement = HTMLDivElement>() {
	const ref = useRef<T>(null);
	const [isFullscreen, setIsFullscreen] = useState(false);
	const notification = useNotificationApi();

	useEffect(() => {
		const onChange = () => setIsFullscreen(document.fullscreenElement === ref.current);
		document.addEventListener('fullscreenchange', onChange);
		return () => document.removeEventListener('fullscreenchange', onChange);
	}, []);

	const toggle = useCallback(async () => {
		if (!ref.current) return;
		try {
			if (document.fullscreenElement) {
				await document.exitFullscreen();
			} else {
				await ref.current.requestFullscreen();
			}
		} catch (e) {
			notification.error({ description: e instanceof Error ? e.message : 'Не удалось переключить полноэкранный режим' });
		}
	}, [notification]);

	return { ref, isFullscreen, toggle };
}
может стоит вынести в отдельный хук? логика повторяется в трех таблицах: Шахматка, таблица корректировок, Гудвилл. Пример реализации: ``` export function useFullscreen<T extends HTMLElement = HTMLDivElement>() { const ref = useRef<T>(null); const [isFullscreen, setIsFullscreen] = useState(false); const notification = useNotificationApi(); useEffect(() => { const onChange = () => setIsFullscreen(document.fullscreenElement === ref.current); document.addEventListener('fullscreenchange', onChange); return () => document.removeEventListener('fullscreenchange', onChange); }, []); const toggle = useCallback(async () => { if (!ref.current) return; try { if (document.fullscreenElement) { await document.exitFullscreen(); } else { await ref.current.requestFullscreen(); } } catch (e) { notification.error({ description: e instanceof Error ? e.message : 'Не удалось переключить полноэкранный режим' }); } }, [notification]); return { ref, isFullscreen, toggle }; } ```
@ -0,0 +193,4 @@
});
setEditedRows(initialEdited);
} catch (e) {
if (e instanceof ApiError) {
Owner

Сейчас ошибка будет отображаться, только в случае e instanceof ApiError. Во всех остальных случаях пользователь не увидит никакого уведомления.

Предлагаю заменить на:
notification.error({ description: e instanceof ApiError ? e.message : 'Не удалось загрузить данные Гудвилла' });

Аналогично стоит обрабатывать остальные вызовы notification.error в handleSave и download

Сейчас ошибка будет отображаться, только в случае `e instanceof ApiError`. Во всех остальных случаях пользователь не увидит никакого уведомления. Предлагаю заменить на: `notification.error({ description: e instanceof ApiError ? e.message : 'Не удалось загрузить данные Гудвилла' });` Аналогично стоит обрабатывать остальные вызовы `notification.error` в `handleSave` и `download`
@ -0,0 +84,4 @@
let totalGoodwill = 0;
parent.children.forEach((child) => {
totalFinInv += Number(child.financial_investment_amount || 0);
Owner

Подсчёт строки «Всего» в группах лучше перевести на sumAmounts из utils/money. В функции уже учитывается, что суммы приходят строчками и позволяет избежать ошибок округления. также не нужно будет использовать +=.

код сведется к:

// вместо четырёх let и forEach:
const children = parent.children;

const groupTotalRow: GoodwillTreeRow = {
	...
	financial_investment_amount: sumAmounts(children.map((c) => c.financial_investment_amount)) ?? '0.00',
	participation_amount: sumAmounts(children.map((c) => c.participation_amount)) ?? '0.00',
	charter_capital_amount: sumAmounts(children.map((c) => c.charter_capital_amount)) ?? '0.00',
	goodwill_amount: sumAmounts(children.map((c) => c.goodwill_amount)) ?? '0.00',

Подсчёт строки «Всего» в группах лучше перевести на `sumAmounts` из `utils/money`. В функции уже учитывается, что суммы приходят строчками и позволяет избежать ошибок округления. также не нужно будет использовать `+=`. код сведется к: ``` // вместо четырёх let и forEach: const children = parent.children; const groupTotalRow: GoodwillTreeRow = { ... financial_investment_amount: sumAmounts(children.map((c) => c.financial_investment_amount)) ?? '0.00', participation_amount: sumAmounts(children.map((c) => c.participation_amount)) ?? '0.00', charter_capital_amount: sumAmounts(children.map((c) => c.charter_capital_amount)) ?? '0.00', goodwill_amount: sumAmounts(children.map((c) => c.goodwill_amount)) ?? '0.00', ```
Veronika requested review from Veronika 2026-11-05 17:25:37 +03:00
grog added 1 commit 2026-11-05 17:35:17 +03:00
grog added 1 commit 2026-11-06 08:38:15 +03:00
grog added 1 commit 2026-11-06 08:51:34 +03:00
grog added 1 commit 2026-11-06 08:52:52 +03:00
grog added 1 commit 2026-11-06 09:09:07 +03:00
grog added 1 commit 2026-11-06 09:09:38 +03:00
grog added 1 commit 2026-11-06 09:24:24 +03:00
aep added 5 commits 2026-11-06 18:06:21 +03:00
Откатены к main правки справочников, шахматки, корректировок и types/api.ts
(обработка ошибок, Alert, удалённые комментарии) — не относятся к AURORA-1544 и
конфликтовали с #219/#221; шахматка переведена на общий фильтр единиц
components/ConsolidationFormatTableFilter; удалены тестовые MOCK_DATA; формат.
План доводки — docs/superpowers/plans/2026-11-06-goodwill-review-front.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Типы по schemas/goodwill.py (has_investments, warnings, nullable суммы, groups,
УК в итогах), пакетный saveGoodwillRows, экспорт с sign; utils/goodwill.ts —
parseShare (два знака, без обрезки), previewAmounts в копейках (HALF_UP, как бэк),
matchesSign (null — только «все»), changedRows (только изменённые строки).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Суммы null — прочерк, ноль — 0,00; «Нет вложений» серым без чекбокса; предупреждения
иконкой с подсказкой; итоги «Всего» и «Итого по листу» из groups/totals ответа; в режиме
редактирования — предпросмотр P/G, проверка доли (два знака, без обрезки) и комментария,
групповой чекбокс по действующим строкам блока с indeterminate; сохранение одним пакетом
изменённых строк, ошибка 422 подсвечивает поле своей строки; переключатель «Учитывать
гудвилл в КФО»; фильтр «Нулевые»; экспорт с текущим фильтром.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenSpec change goodwill-ui (таблица, редактирование, переключатель/фильтр/экспорт;
вкладка «Гудвилл» в intercompany-matrix-ui больше не заглушка; R-1…R-3). По стенду:
стрелка раскрытия блока — у названия, «Выделить все» в одну строку, текст пустой таблицы.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Финальное ревью I-1: у неотмеченной строки поле доли скрыто — effectiveRow отправляет
сохранённую долю вместо неверного ввода; подсказка у «Сохранить» называет строки с ошибкой
и предупреждает о скрытых фильтром. design.md goodwill-ui: R-4…R-6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep added 1 commit 2026-11-06 18:07:53 +03:00
aep merged commit 60cc190066 into main 2026-11-06 18:08:01 +03:00
Sign in to join this conversation.
No Reviewers
No Label
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#220
No description provided.