import { Box, IconButton, Tooltip } from '@mui/material'; import { Back, EditPenSvg, TrashSvg } from '../../components/common/icons/icons'; import StatusBadge from './components/StatusBadge/StatusBadge'; import { DEVELOMENT_BLOCK, FUNDING_BY_DECISION } from './constants'; export const createFirstColumns = (handlers) => { const { onDelete, onEdit, onNavigate, orgUnitNames = {} } = handlers; return [ { id: 'project', accessorFn: (row) => { const projectName = row.name ?? row.project ?? ''; const orgUnitName = orgUnitNames[row.org_unit_id] ?? row.org_unit_id; return orgUnitName ? `${projectName} / ${orgUnitName}` : projectName; }, header: 'Проект', size: 200, filterFn: 'contains', filterVariant: 'text', }, { accessorKey: 'status', header: 'Статус', size: 100, Cell: ({ cell }) => { const status = cell.getValue(); return ; }, }, { accessorKey: 'technical_number', header: 'Технический номер проекта', size: 150, }, { accessorKey: 'object_address', header: 'Адрес объекта', size: 180, }, { accessorKey: 'vsp_format', header: 'Формат ВСП', size: 150, Cell: ({ cell }) => cell.getValue() ?? '', }, { accessorKey: 'krf_decision_date', header: 'Дата решения КРФ', size: 160, }, { accessorKey: 'fk_decision_date', header: 'Дата решения ФК', size: 120, }, { accessorKey: 'board_decision_date', header: 'Дата решения Правления', size: 130, }, { accessorKey: 'open_relocate_close_date', header: 'Дата открытия / переезда / закрытия', size: 160, }, { accessorKey: 'project_type', header: 'Тип проекта', size: 130, }, { accessorKey: 'funding_by_ko_decision', header: 'Финансирование по решению КО', size: 150, Cell: ({ cell }) => FUNDING_BY_DECISION.find((v) => v[0] === cell.getValue())?.[1] || '-', }, { accessorKey: 'year', header: 'Год сметы', size: 130, }, { accessorKey: 'is_in_plan', header: 'В базовой смете', size: 140, Cell: ({ cell }) => formatBooleanIsPlan(cell.getValue()), }, { accessorKey: 'is_in_plan_q2', header: 'В скоррект смете 2 кв.', size: 140, Cell: ({ cell }) => formatBooleanIsPlan(cell.getValue()), }, { accessorKey: 'is_in_plan_q3', header: 'В скоррект смете 3 кв.', size: 140, Cell: ({ cell }) => formatBooleanIsPlan(cell.getValue()), }, { accessorKey: 'is_in_plan_q4', header: 'В скоррект смете 4 кв.', size: 140, Cell: ({ cell }) => formatBooleanIsPlan(cell.getValue()), }, { accessorKey: 'development_block', header: 'Блок развития', size: 120, Cell: ({ cell }) => DEVELOMENT_BLOCK.find((v) => v[0] === cell.getValue())?.[1] || '-', }, { accessorKey: 'reserve_to_prrs_ahr', header: 'Из резерва Банка в смету ПРРС АХР', size: 160, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'reserve_to_prrs_kv', header: 'Из резерва Банка в смету ПРРС кв.', size: 160, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'actions', header: '', size: 120, enableSorting: false, Cell: ({ row }) => ( { e.stopPropagation(); onEdit(row); }}> {row.depth == 0 && ( <> { e.stopPropagation(); onNavigate(row); }}> { e.stopPropagation(); onDelete(row.original); }}> )} ), }, ]; }; // Колонки для второй таблицы с многоуровневыми заголовками export const secondColumns = [ { accessorKey: 'data.header.name', header: 'Проект', size: 120, sticky: 'left', Cell: ({ cell, row }) => row.original.data?.header?.year ? `Смета_${row.original.data.header.year}` : cell.getValue(), }, // Объем финансирования по контрольному листу { header: 'Объем финансирования по контрольному листу', columns: [ { accessorKey: 'data.financing.ahr', header: 'АХР', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.financing.ahr_limit', header: 'АХР лимит', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.financing.ahr_current', header: 'АХР текущие', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.financing.kv', header: 'кв.', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, // Базовый период { header: 'Базовый период 01.01 - 31.03', columns: [ { accessorKey: 'data.base_q1.ahr', header: 'АХР', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.base_q1.ahr_limit', header: 'АХР лимит', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.base_q1.ahr_current', header: 'АХР текущие', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.base_q1.kv', header: 'кв.', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, // Скорректированный период Q2 { header: 'Скорректированный период 01.04 - 30.06', columns: [ { accessorKey: 'data.corrected_q2.ahr', header: 'АХР', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q2.ahr_limit', header: 'АХР лимит', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q2.ahr_current', header: 'АХР текущие', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q2.kv', header: 'кв.', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, // Скорректированный период Q3 { header: 'Скорректированный период 01.07 - 30.09', columns: [ { accessorKey: 'data.corrected_q3.ahr', header: 'АХР', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q3.ahr_limit', header: 'АХР лимит', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q3.ahr_current', header: 'АХР текущие', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q3.kv', header: 'кв.', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, // Скорректированный период Q4 { header: 'Скорректированный период 01.10 - 31.12', columns: [ { accessorKey: 'data.corrected_q4.ahr', header: 'АХР', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q4.ahr_limit', header: 'АХР лимит', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q4.ahr_current', header: 'АХР текущие', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.corrected_q4.kv', header: 'кв.', size: 100, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, // Фактические расходы (АХР) { header: 'Фактические расходы (АХР)', columns: [ { header: '1 кв.артал', columns: [ { accessorKey: 'data.actual_ahr.q1.ahr', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q1.ahr_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q1.ahr_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, { header: '2 кв.артал', columns: [ { accessorKey: 'data.actual_ahr.q2.ahr', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q2.ahr_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q2.ahr_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, { header: '3 кв.артал', columns: [ { accessorKey: 'data.actual_ahr.q3.ahr', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q3.ahr_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q3.ahr_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, { header: '4 кв.артал', columns: [ { accessorKey: 'data.actual_ahr.q4.ahr', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q4.ahr_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_ahr.q4.ahr_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, ], }, // Фактические расходы (кв.) { header: 'Фактические расходы (кв.)', columns: [ { header: '1 кв.артал', columns: [ { accessorKey: 'data.actual_kv.q1.kv', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q1.kv_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q1.kv_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, { header: '2 кв.артал', columns: [ { accessorKey: 'data.actual_kv.q2.kv', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q2.kv_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q2.kv_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, { header: '3 кв.артал', columns: [ { accessorKey: 'data.actual_kv.q3.kv', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q3.kv_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q3.kv_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, { header: '4 кв.артал', columns: [ { accessorKey: 'data.actual_kv.q4.kv', header: 'Фактические расходы', size: 120, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q4.kv_limit', header: 'Лимит', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, { accessorKey: 'data.actual_kv.q4.kv_current', header: 'Текущие', size: 80, Cell: ({ cell }) => formatNumber(cell.getValue()), }, ], }, ], }, ]; const formatBoolean = (value) => { if (value === null || value === undefined) return ''; return value ? 'Да' : 'Нет'; }; const formatBooleanIsPlan = (value) => { if (value === null || value === undefined) return ''; return value ? 'В плане' : ''; }; const formatNumber = (value) => { if (value === null || value === undefined || value === '') return ''; const number = Number(value); return Number.isNaN(number) ? value : number.toLocaleString('ru-RU'); };