From 9c725e9678242022b3b028d36a22d9a8a6fe6b6f Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Mon, 29 Jun 2026 11:37:23 +0300 Subject: [PATCH 01/20] =?UTF-8?q?fix-ssp-title:=20=D0=BD=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D1=8F=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BE=D1=80=D0=B3=20=D1=8E=D0=BD=D0=B8=D1=82=20=D1=81=20=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=8B=D0=BC=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/api/v1/org_unit.py | 4 ++-- api/src/domain/schemas.py | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/api/src/api/v1/org_unit.py b/api/src/api/v1/org_unit.py index 725bcd9..661a5bc 100644 --- a/api/src/api/v1/org_unit.py +++ b/api/src/api/v1/org_unit.py @@ -6,7 +6,7 @@ from src.core.errors import AccessDeniedException from src.api.v1.deps import get_current_active_user, require_admin from src.db.models.app_user import AppUser from src.db.session import get_db -from src.domain.schemas import BaseListResponse, BaseSingleResponse, OrgUnitBaseSchema, OrgUnitListSchema, OrgUnitSchema, OrgUnitUpdateSchema, ResponseBase +from src.domain.schemas import BaseListResponse, BaseSingleResponse, OrgUnitCreateSchema, OrgUnitListSchema, OrgUnitSchema, OrgUnitUpdateSchema, ResponseBase from src.services.org_unit_service import OrgUnitService @@ -66,7 +66,7 @@ async def org_unit_id( @router.post("/") async def create_ssp( - org_data: OrgUnitBaseSchema, + org_data: OrgUnitCreateSchema, db: AsyncSession = Depends(get_db), current_user: AppUser = Depends(require_admin), ) -> BaseSingleResponse[OrgUnitSchema]: diff --git a/api/src/domain/schemas.py b/api/src/domain/schemas.py index 261cba8..060597c 100644 --- a/api/src/domain/schemas.py +++ b/api/src/domain/schemas.py @@ -233,6 +233,10 @@ class OrgUnitBaseSchema(BaseModel): model_config = ConfigDict(from_attributes=True) +class OrgUnitCreateSchema(OrgUnitBaseSchema): + title: str = Field(..., min_length=1) + + class OrgUnitUpdateSchema(OrgUnitBaseSchema): title: Optional[str] = None is_ssp: Optional[bool] = None From e28f6a38871238fd4e8201753c9c6da15c8bbb54 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Mon, 29 Jun 2026 19:22:41 +0300 Subject: [PATCH 02/20] =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/api/projects.js | 39 ++ web/src/app/Routes.jsx | 2 + .../OrgUnitsAutocompletePaper.jsx | 2 +- .../renderOrgUnitValue.jsx | 0 web/src/components/common/PaginatedList.jsx | 247 +++++++++++++ .../ModalCreateProject.jsx | 0 web/src/pages/ProjectsPage/ProjectCard.jsx | 332 ++++++++++++++++++ web/src/pages/ProjectsPage/ProjectsPage.jsx | 293 ++++++++++++++++ web/src/pages/TaskPage/TaskPage.jsx | 1 - web/src/pages/TasksPage/TasksPage.jsx | 152 ++------ 10 files changed, 944 insertions(+), 124 deletions(-) create mode 100644 web/src/api/projects.js rename web/src/{pages/TasksPage => components/common/OrgUnitsAutocompletePaper}/OrgUnitsAutocompletePaper.jsx (94%) rename web/src/{pages/TasksPage => components/common/OrgUnitsAutocompletePaper}/renderOrgUnitValue.jsx (100%) create mode 100644 web/src/components/common/PaginatedList.jsx rename web/src/pages/{TaskPage => ProjectsPage}/ModalCreateProject.jsx (100%) create mode 100644 web/src/pages/ProjectsPage/ProjectCard.jsx create mode 100644 web/src/pages/ProjectsPage/ProjectsPage.jsx diff --git a/web/src/api/projects.js b/web/src/api/projects.js new file mode 100644 index 0000000..218ec55 --- /dev/null +++ b/web/src/api/projects.js @@ -0,0 +1,39 @@ +import api from "./client"; + +export const ProjectsApi = { + list: (params) => { + return api.get(`/projects`, { params }).then((r) => r.data); + }, + + get: (id) => { + return api.get(`/projects/${id}`).then((r) => r.data); + }, + + create: (data) => { + return api.post("/projects", data).then((r) => r.data); + }, + + update: (id, data) => { + return api.put(`/projects/${id}`, data).then((r) => r.data); + }, + + delete: (id) => { + return api.delete(`/projects/${id}`).then((r) => r.data); + }, + + getTasks: (projectId) => { + return api.get(`/projects/${projectId}/tasks`).then((r) => r.data); + }, + + addTask: (projectId, taskId) => { + return api + .post(`/projects/${projectId}/tasks/${taskId}`) + .then((r) => r.data); + }, + + removeTask: (projectId, taskId) => { + return api + .delete(`/projects/${projectId}/tasks/${taskId}`) + .then((r) => r.data); + }, +}; diff --git a/web/src/app/Routes.jsx b/web/src/app/Routes.jsx index 2069477..7b62aa3 100644 --- a/web/src/app/Routes.jsx +++ b/web/src/app/Routes.jsx @@ -17,6 +17,7 @@ import { CircularProgress } from '@mui/material'; import NewTablePage from '../pages/NewTablePage.jsx'; import TablesTest from '../pages/TablesTest.jsx'; import NewFormTablePage from '../pages/NewFormTablePage.jsx' +import ProjectsPage from '../pages/ProjectsPage/ProjectsPage.jsx'; export const PrivateRoute = () => { const { isAuthenticated, loading } = useAuth(); @@ -37,6 +38,7 @@ export const AppRoutes = () => { }> } /> } /> + }/> } /> } /> } /> diff --git a/web/src/pages/TasksPage/OrgUnitsAutocompletePaper.jsx b/web/src/components/common/OrgUnitsAutocompletePaper/OrgUnitsAutocompletePaper.jsx similarity index 94% rename from web/src/pages/TasksPage/OrgUnitsAutocompletePaper.jsx rename to web/src/components/common/OrgUnitsAutocompletePaper/OrgUnitsAutocompletePaper.jsx index 07d45cd..3b039b1 100644 --- a/web/src/pages/TasksPage/OrgUnitsAutocompletePaper.jsx +++ b/web/src/components/common/OrgUnitsAutocompletePaper/OrgUnitsAutocompletePaper.jsx @@ -1,6 +1,6 @@ import { forwardRef } from 'react'; import { Box, Paper, Typography } from '@mui/material'; -import { CustomCheckbox } from '../../components/common/StyledCheckbox'; +import { CustomCheckbox } from '../StyledCheckbox'; export const OrgUnitsAutocompletePaper = forwardRef( function OrgUnitsAutocompletePaper( diff --git a/web/src/pages/TasksPage/renderOrgUnitValue.jsx b/web/src/components/common/OrgUnitsAutocompletePaper/renderOrgUnitValue.jsx similarity index 100% rename from web/src/pages/TasksPage/renderOrgUnitValue.jsx rename to web/src/components/common/OrgUnitsAutocompletePaper/renderOrgUnitValue.jsx diff --git a/web/src/components/common/PaginatedList.jsx b/web/src/components/common/PaginatedList.jsx new file mode 100644 index 0000000..ce4ee52 --- /dev/null +++ b/web/src/components/common/PaginatedList.jsx @@ -0,0 +1,247 @@ +// src/components/common/PaginatedList/PaginatedList.jsx +import { useState, useEffect } from 'react'; +import { + Box, + Pagination, + PaginationItem, + Select, + MenuItem, + Typography, + Stack, +} from '@mui/material'; +import { CardsSkeleton } from './Skeleton'; +import { + ExportExitButton, + ExportWithTextButton, +} from './Buttons/ButtonsActions'; +import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; + +/** + * Универсальный компонент для отображения списка с пагинацией и экспортом + * + * @param {Object} props + * @param {Array} props.items - Массив элементов для отображения + * @param {boolean} props.loading - Состояние загрузки + * @param {number} props.totalCount - Общее количество элементов + * @param {number} props.page - Текущая страница + * @param {number} props.limit - Количество элементов на странице + * @param {Function} props.onPageChange - Обработчик изменения страницы + * @param {Function} props.onLimitChange - Обработчик изменения лимита + * @param {Function} props.renderItem - Функция рендеринга элемента + * @param {Function} props.getItemId - Функция получения ID элемента + * @param {Function} props.getItemTitle - Функция получения заголовка элемента + * @param {string} props.entityName - Название сущности (для текстов) + * @param {string} props.emptyMessage - Сообщение при пустом списке + * @param {number} props.skeletonCount - Количество скелетонов + * @param {Object} props.extraActions - Дополнительные действия справа + * @param {boolean} props.enableExport - Включить экспорт + * @param {Array} props.limitOptions - Опции для выбора лимита + * @param {number} props.maxHeight - Максимальная высота контейнера со скроллом + * @param {boolean} props.enableScroll - Включить скролл для списка + */ +export function PaginatedList({ + items = [], + loading = false, + totalCount = 0, + page = 1, + limit = 20, + onPageChange, + onLimitChange, + renderItem, + getItemId, + getItemTitle = (item) => `Элемент ${getItemId(item)}`, + entityName = 'элементов', + emptyMessage = 'Элементы не найдены', + skeletonCount = 20, + extraActions = null, + enableExport = true, + limitOptions = [10, 20, 50, 100, 200], + maxHeight = 'calc(110vh - 300px)', + enableScroll = true, +}) { + const [exportMode, setExportMode] = useState(false); + const [exportList, setExportList] = useState([]); + + // Сброс списка экспорта при переключении режима + useEffect(() => { + setExportList([]); + }, [exportMode]); + + const handleAddToExport = (itemId, checked) => { + if (checked) { + setExportList((prev) => [...prev, itemId]); + } else { + setExportList((prev) => prev.filter((id) => id !== itemId)); + } + }; + + const handleBulkExport = async () => { + await exportBulkForms(exportList); + setExportMode(false); + }; + + const handleSingleExport = (itemId) => { + const item = items.find((item) => getItemId(item) === itemId); + const title = item ? getItemTitle(item) : `Элемент ${itemId}`; + exportSingleForm(itemId, title); + }; + + // Если включен экспорт, передаем его пропсы в дочерние элементы + const renderItemWithExport = (item) => { + if (enableExport) { + return renderItem(item, { + exportMode, + onAddForExport: (checked) => { + handleAddToExport(getItemId(item), checked); + }, + onExportClick: () => { + handleSingleExport(getItemId(item)); + }, + isSelected: exportList.includes(getItemId(item)), + }); + } + return renderItem(item); + }; + + return ( + + {/* Верхняя панель с экспортом и дополнительными действиями */} + {enableExport && ( + + {exportMode && ( + + Выделено {entityName}: {exportList.length} + + )} + + + {!exportMode ? ( + <> + setExportMode(true)} + /> + {extraActions} + + ) : ( + <> + + setExportMode(false)} /> + + )} + + + )} + + {/* Контейнер со скроллом для списка */} + + {/* Список элементов */} + + {loading ? ( + + ) : items.length === 0 ? ( + + + {emptyMessage} + + + ) : ( + items.map((item) => renderItemWithExport(item)) + )} + + + + {/* Пагинация */} + {!loading && items.length > 0 && ( + + + + + Показать на странице: + + + + + Всего: {totalCount} + + + + ( + + )} + /> + + + + )} + + ); +} \ No newline at end of file diff --git a/web/src/pages/TaskPage/ModalCreateProject.jsx b/web/src/pages/ProjectsPage/ModalCreateProject.jsx similarity index 100% rename from web/src/pages/TaskPage/ModalCreateProject.jsx rename to web/src/pages/ProjectsPage/ModalCreateProject.jsx diff --git a/web/src/pages/ProjectsPage/ProjectCard.jsx b/web/src/pages/ProjectsPage/ProjectCard.jsx new file mode 100644 index 0000000..29f281c --- /dev/null +++ b/web/src/pages/ProjectsPage/ProjectCard.jsx @@ -0,0 +1,332 @@ +// src/components/common/ProjectCardComponent/ProjectCardComponent.jsx +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import styled from '@emotion/styled'; +import { + Button, + TextField, + FormControl, + FormLabel, + Box, + Stack, + Chip, +} from '@mui/material'; +import { ProjectsApi } from '../../api/projects'; +import { toast } from 'react-toastify'; +import { + CheckBoxCheckSvg, + CheckBoxUncheckSvg, + DateIcon, + Edit, + ExportSvg, + UserIcon, + BuildingIcon, + LocationIcon, +} from '../../components/common/icons/icons'; +import { IconWithContent } from '../../components/common/IconWithContent'; +import { ExportButton } from '../../components/common/Buttons/ButtonsActions'; + +const ProjectCard = styled.div` + width: 26.8rem; + height: 15rem; + display: flex; + padding: 1.25rem; + flex-direction: column; + justify-content: space-between; + align-items: flex-start; + box-sizing: border-box; + border: 0.06rem solid var(--Stroke, rgba(0, 0, 0, 0.1)); + border-radius: 1rem; + box-shadow: + 0rem 2rem 4rem -2rem rgba(0, 0, 0, 0.02), + 0rem 4rem 6rem -1rem rgba(0, 0, 0, 0.02); + background: var(--White, rgba(255, 255, 255, 1)); + overflow: hidden; + cursor: pointer; + position: relative; + + &:hover { + transform: translateY(-5px); + box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12); + } +`; + +const CardHeader = styled.div` + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; +`; + +const ProjectId = styled.div` + font-size: 0.75rem; + font-weight: 400; + line-height: 1rem; + letter-spacing: 0rem; + text-align: left; + color: rgba(0, 0, 0, 0.6); +`; + +const CardBody = styled.div` + width: 100%; + flex: 1; + display: flex; + flex-direction: column; + gap: 0.8125rem; + justify-content: flex-end; + height: 100%; +`; + +const ProjectTitle = styled.div` + font-size: 1rem; + font-weight: 500; + color: var(--Text-Primary, #333); + line-height: 1.63; + margin: 0; + padding: 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +`; + +const StatusChip = styled(Chip)` + font-size: 0.7rem; + height: 1.5rem; + background-color: ${({ status }) => { + switch (status) { + case 'active': return '#4caf50'; + case 'completed': return '#2196f3'; + case 'paused': return '#ff9800'; + case 'archived': return '#9e9e9e'; + default: return '#9e9e9e'; + } + }}; + color: white; +`; + +const LevelChip = styled(Chip)` + font-size: 0.6rem; + height: 1.25rem; + background-color: rgba(0, 0, 0, 0.08); + color: rgba(0, 0, 0, 0.7); +`; + +const ProjectInfoGrid = styled.div` + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-top: 0.25rem; +`; + +const InfoChip = styled(Chip)` + font-size: 0.6rem; + height: 1.25rem; + background-color: rgba(0, 0, 0, 0.05); + color: rgba(0, 0, 0, 0.7); +`; + +const getStatusLabel = (status) => { + const statusMap = { + active: 'Активный', + completed: 'Завершен', + paused: 'Приостановлен', + archived: 'Архивирован', + }; + return statusMap[status] || status || 'Не указан'; +}; + +const getLevelLabel = (level) => { + const levelMap = { + project: 'Проект', + subproject: 'Подпроект', + task: 'Задача', + }; + return levelMap[level] || level || 'Не указан'; +}; + +export const ProjectCardComponent = ({ + project, + exportMode = false, + isLoadingFile = false, + onAddForExport, + onExportClick, +}) => { + const navigate = useNavigate(); + const { + id, + name, + org_unit_name, + year, + status, + level, + project_type, + vsp_format, + placement_type, + object_address, + staff_count, + total_area, + report_count, + parent_id, + } = project; + + const [isEditModalOpen, setEditModalOpen] = useState(false); + const [editedName, setEditedName] = useState(''); + const [currentName, setCurrentName] = useState(name || ''); + const [isChecked, setIsChecked] = useState(false); + + useEffect(() => { + setIsChecked(false); + }, [exportMode]); + + const handleOpenEdit = (event) => { + event.stopPropagation(); + setEditedName(currentName); + setEditModalOpen(true); + }; + + const handleCloseEdit = () => { + setEditModalOpen(false); + }; + + const handleCheckboxClick = (event) => { + event.stopPropagation(); + if (!isLoadingFile) { + setIsChecked(!isChecked); + onAddForExport(!isChecked); + } else { + toast.warning('Файл формируется!'); + } + }; + + const handleExportProject = (event) => { + event.stopPropagation(); + onExportClick?.(id, name); + }; + + const handleNavigate = () => { + if (!exportMode) { + navigate(`/project/${id}`); + } + }; + + const updateProject = async (nextName) => { + try { + await ProjectsApi.update(id, { name: nextName }); + setCurrentName(nextName); + setEditModalOpen(false); + toast.success('Название проекта обновлено'); + } catch (error) { + toast.error( + error?.response?.data?.detail || 'Не удалось обновить название проекта', + ); + } + }; + + const handleSaveName = async () => { + const nextName = editedName.trim(); + if (!nextName) { + toast.error('Название не может быть пустым'); + return; + } + if (nextName === currentName) { + setEditModalOpen(false); + return; + } + await updateProject(nextName); + }; + + const getInitials = (name) => { + if (!name) return '?'; + const words = name.split(' '); + if (words.length >= 2) { + return `${words[0][0]}${words[1][0]}`.toUpperCase(); + } + return name.substring(0, 2).toUpperCase(); + }; + + return ( + <> + + + + ID: {id} + + {!exportMode && ( + <> + {status && ( + + )} + + + + )} + + + + {currentName} + + + {level && ( + + )} + {project_type && ( + + )} + {report_count !== undefined && report_count !== null && ( + + )} + {parent_id && ( + + )} + + + + + + }> + {year || 'Год не указан'} + + }> + {org_unit_name || 'Организация не указана'} + + {object_address && ( + + {object_address} + + )} + {(staff_count || total_area) && ( + + {staff_count && `👥 ${staff_count}`} + {staff_count && total_area && ' | '} + {total_area && `📐 ${total_area} м²`} + + )} + + + {exportMode && ( +
+ {isChecked ? ( + + ) : ( + + )} +
+ )} +
+
+ + ); +}; \ No newline at end of file diff --git a/web/src/pages/ProjectsPage/ProjectsPage.jsx b/web/src/pages/ProjectsPage/ProjectsPage.jsx new file mode 100644 index 0000000..d4f59a0 --- /dev/null +++ b/web/src/pages/ProjectsPage/ProjectsPage.jsx @@ -0,0 +1,293 @@ +// src/pages/ProjectsPage/ProjectsPage.jsx +import { useEffect, useMemo, useState } from 'react'; +import { ProjectsApi } from '../../api/projects'; +import { CardsSkeleton } from '../../components/common/Skeleton'; +import SearchComponent from '../../components/common/SearchComponent'; +import { ProjectCardComponent } from './ProjectCard'; +import { HeaderSwitch } from '../../components/HeaderMenu/HeaderSwitch'; +import { PageContainer, TasksContainer } from '../StyledForPage'; +import { + Box, + FormControl, + Button, + Stack, + Pagination, + PaginationItem, + Select, + MenuItem, + Typography, + IconButton, + Tooltip, +} from '@mui/material'; +import { toast } from 'react-toastify'; +import { ModalCreateProject } from './ModalCreateProject'; +import { + ROLES_NAME_ID, +} from '../../constants'; +import { useAuth } from '../../app/context/AuthProvider'; +import { PrimaryButton } from '../../components/common/Buttons/Buttons'; +import { + ExportExitButton, + ExportWithTextButton, +} from '../../components/common/Buttons/ButtonsActions'; +import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; +import { WhitePlus } from '../../components/common/icons/icons'; +import { useNavigate } from 'react-router-dom'; +import { PaginatedList } from '../../components/common/PaginatedList'; + + +// Конфигурация для создания проекта +const defaultProjectConfig = { + 'Тип проекта развития': { + type: 'multiselect', + options: [ + 'Открытие ВСП', + 'Закрытие ВСП', + 'Переезд ВСП', + 'Реновация РФ', + 'Открытие УРМ', + ], + placeholder: 'Выберите тип проекта', + defaultValue: null, + }, + 'Название проекта': { + type: 'text', + placeholder: 'Введите название проекта', + defaultValue: '', + }, + 'Формат ВСП': { + type: 'multiselect', + options: [ + 'Фланговый', + 'Типовой', + 'Розничный', + 'МСБ', + 'Лёгкий', + 'Мини', + 'Розничный-киоск', + 'МБО', + 'Офис самообслуживания', + 'Другое', + ], + placeholder: 'Выберите формат ВСП', + defaultValue: null, + }, + 'Адрес объекта': { + type: 'text', + placeholder: 'Введите адрес объекта', + defaultValue: '', + }, + 'Целевая численность, чел.': { + type: 'number', + placeholder: 'Введите число', + defaultValue: 0, + min: 0, + step: 1, + }, + 'Тип размещения': { + type: 'multiselect', + options: ['Собственность', 'Аренда', 'Субаренда'], + placeholder: 'Выберите тип размещения', + defaultValue: null, + }, + 'Площадь размещения, м2': { + type: 'number', + placeholder: 'Введите число', + defaultValue: 0, + min: 0, + step: 1, + }, +}; + +export default function ProjectsPage() { + const navigate = useNavigate(); + const [items, setItems] = useState([]); + const [loading, setLoading] = useState(false); + const [modalOpen, setModalOpen] = useState(false); + const [query, setQuery] = useState(''); + const [statusFilter, setStatusFilter] = useState(''); + const [levelFilter, setLevelFilter] = useState(''); + + // Pagination state + const [page, setPage] = useState(1); + const [limit, setLimit] = useState(20); + const [totalCount, setTotalCount] = useState(0); + + const { user } = useAuth(); + + const [exportMode, setExportMode] = useState(false); + const [exportList, setExportList] = useState([]); + + const openModal = () => { + setModalOpen(true); + }; + + // Маппинг полей из модалки в API + const mapFormDataToApi = (formData) => { + const apiData = { + name: formData['Название проекта'] || '', + project_type: formData['Тип проекта развития'] || null, + vsp_format: formData['Формат ВСП'] || null, + object_address: formData['Адрес объекта'] || '', + staff_count: formData['Целевая численность, чел.'] || 0, + placement_type: formData['Тип размещения'] || null, + total_area: formData['Площадь размещения, м2'] || 0, + // Добавляем значения по умолчанию для обязательных полей + year: new Date().getFullYear(), + org_unit_id: user?.org_unit_id || null, + form_type_code: 'project', // или другое значение по умолчанию + status: 'active', + level: 'project', + }; + return apiData; + }; + + const handleCreateProject = async (formData) => { + try { + const apiData = mapFormDataToApi(formData); + + await ProjectsApi.create(apiData); + + setPage(1); + loadProjects(1, limit); + + setModalOpen(false); + toast.success('Проект успешно создан'); + } catch (error) { + toast.error( + error.response?.data?.detail || + error.response?.data?.message || + 'Ошибка при создании проекта', + ); + } + }; + + const loadProjects = async (currentPage = page, currentLimit = limit) => { + setLoading(true); + try { + const skip = (currentPage - 1) * currentLimit; + const params = { + offset: skip, + limit: currentLimit, + }; + + const res = await ProjectsApi.list(params); + const data = res.result; + + setItems(data); + setTotalCount(res.count); + + } catch (error) { + toast.error('Ошибка загрузки проектов'); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + setPage(1); + loadProjects(1, limit); + }, [query, statusFilter, levelFilter]); + + const handlePageChange = (event, value) => { + setPage(value); + loadProjects(value, limit); + }; + + const handleLimitChange = (event) => { + const newLimit = event.target.value; + setLimit(newLimit); + setPage(1); + loadProjects(1, newLimit); + }; + + useEffect(() => { + loadProjects(page, limit); + }, []); + + useEffect(() => { + setExportList([]); + }, [exportMode]); + + const handleChangeToExportList = (projectId, checked) => { + if (checked) { + setExportList((prev) => [...prev, projectId]); + } else { + const newExportList = exportList.filter((t) => t != projectId); + setExportList(newExportList); + } + }; + + const handleBulkExport = async () => { + await exportBulkForms(exportList); + setExportMode(false); + }; + + const handleSingleExport = (projectId, projectTitle) => { + exportSingleForm(projectId, projectTitle); + }; + + const handleNavigateToTasks = () => { + navigate('/tasks'); + }; + + const handleRefresh = () => { + loadProjects(page, limit); + toast.info('Список проектов обновлен'); + }; + + if (!user) return null; + + return ( + <> + + + + {/* Навигация */} + + + + Управление проектами + + + + ( + + )} + getItemId={(project) => project.id} + getItemTitle={(project) => project.name || 'Проект'} + extraActions={ + user.role_id === ROLES_NAME_ID.admin && ( + }> + Создать проект + + ) + } + /> + + + setModalOpen(false)} + onCreate={handleCreateProject} + config={defaultProjectConfig} + /> + + ); +} \ No newline at end of file diff --git a/web/src/pages/TaskPage/TaskPage.jsx b/web/src/pages/TaskPage/TaskPage.jsx index ae3fcb7..62b22e0 100644 --- a/web/src/pages/TaskPage/TaskPage.jsx +++ b/web/src/pages/TaskPage/TaskPage.jsx @@ -18,7 +18,6 @@ import { toast } from 'react-toastify'; import { SettingModal as SettingStageModal } from '../../components/Stages/SettingModal'; import { PrimaryOutlinedButton } from '../../components/common/Buttons/Buttons'; import { FormsApi } from '../../api/forms'; -import { ModalCreateProject } from './ModalCreateProject'; import { ExportWithTextButton } from '../../components/common/Buttons/ButtonsActions'; import { exportSingleForm } from '../../utils/exportForm'; import TablesList from '../../components/common/TableList/TableList'; diff --git a/web/src/pages/TasksPage/TasksPage.jsx b/web/src/pages/TasksPage/TasksPage.jsx index 00f8933..aee48c2 100644 --- a/web/src/pages/TasksPage/TasksPage.jsx +++ b/web/src/pages/TasksPage/TasksPage.jsx @@ -37,8 +37,9 @@ import { } from '../../components/common/Buttons/ButtonsActions'; import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; import { WhitePlus } from '../../components/common/icons/icons'; -import { OrgUnitsAutocompletePaper } from './OrgUnitsAutocompletePaper'; -import { renderOrgUnitValue } from './renderOrgUnitValue'; +import { OrgUnitsAutocompletePaper } from '../../components/common/OrgUnitsAutocompletePaper/OrgUnitsAutocompletePaper'; +import { renderOrgUnitValue } from '../../components/common/OrgUnitsAutocompletePaper/renderOrgUnitValue'; +import { PaginatedList } from '../../components/common/PaginatedList'; const modalSelectMenuProps = { sx: { zIndex: 1301 }, @@ -255,128 +256,35 @@ export default function TasksPage() { <> - - {exportMode && Выделено задач: {exportList.length}} - - -
- {/* */} -
- - {!exportMode ? ( - <> - { - setExportMode(true); - }} - > - {user.role_id == ROLES_NAME_ID.admin && ( - }> - Создать задачу - - )} - - ) : ( - <> - - setExportMode(false)} /> - - )} - -
+ - {/* TODO: вернуть, когда будет реализовано на бэке */} - {/* */} - - {loading ? ( - - ) : ( - <> - {items.map((t) => ( - { - handleChangeToExportList(t.id, checked); - }} - onExportClick={handleSingleExport} - /> - ))} - - )} - - - {/* Pagination Footer */} - {!loading && items.length > 0 && ( - - - - - Показать на странице: - - - - - ( - - )} + ( + - {/* Spacer for symmetry */} - - )} + )} + getItemId={(task) => task.id} + getItemTitle={(task) => task.title || 'Задача'} + extraActions={ + user.role_id === ROLES_NAME_ID.admin && ( + }> + Создать задачу + + ) + } + />
Date: Tue, 30 Jun 2026 11:14:23 +0300 Subject: [PATCH 03/20] =?UTF-8?q?mig2-fix:=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/alembic/versions/sql/0002_functions.sql | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/api/alembic/versions/sql/0002_functions.sql b/api/alembic/versions/sql/0002_functions.sql index cdf70dc..2277d26 100644 --- a/api/alembic/versions/sql/0002_functions.sql +++ b/api/alembic/versions/sql/0002_functions.sql @@ -4075,7 +4075,7 @@ $function$ -- DROP FUNCTION v3.v_form1_smeta(int4, int4); -CREATE FUNCTION v3.v_form1_smeta(p_year INT, p_org_unit_id INT) +CREATE OR REPLACE FUNCTION v3.v_form1_smeta(p_year INT, p_org_unit_id INT) RETURNS TABLE ( row_type VARCHAR, depth INT, @@ -4093,8 +4093,7 @@ RETURNS TABLE ( supp_corr_q2 NUMERIC, supp_corr_q3 NUMERIC, supp_corr_q4 NUMERIC, dev_corr_q2 NUMERIC, dev_corr_q3 NUMERIC, dev_corr_q4 NUMERIC ) -AS $$ -#variable_conflict use_column +AS $function$ DECLARE v_ahr INT; v_cap INT; v_oper INT; v_sections TEXT[] := ARRAY['plan','approved','q1','q2','q3','q4']; @@ -4223,7 +4222,9 @@ BEGIN FROM merged m ORDER BY m.sc; END; -$$ LANGUAGE plpgsql STABLE SET search_path = v3, pg_catalog; +$function$ +LANGUAGE plpgsql STABLE SET search_path = v3, pg_catalog +; -- DROP FUNCTION v3.v_form2_sheet_sections(int4, varchar, _text); From 4f8393bedc88356c8f3776ac3ad9e14902aa513f Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Tue, 30 Jun 2026 12:37:07 +0300 Subject: [PATCH 04/20] rename vsp.number to vsp.staff_count --- web/src/components/RealtimeTable/RealtimeTable.jsx | 2 +- .../DictVspPage/components/Modals/ModalEditAddVsp.jsx | 10 +++++----- web/src/pages/DictVspPage/components/TableDictVsp.jsx | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web/src/components/RealtimeTable/RealtimeTable.jsx b/web/src/components/RealtimeTable/RealtimeTable.jsx index 67284d0..6041ca3 100644 --- a/web/src/components/RealtimeTable/RealtimeTable.jsx +++ b/web/src/components/RealtimeTable/RealtimeTable.jsx @@ -26,7 +26,7 @@ import { useRealtime } from './contexts/RealtimeContext'; import { toast } from 'react-toastify'; import { CircularProgress } from '@mui/material'; import { additionVspRowTable } from './constants/addingRowConfig'; -import { SelectVspModal } from './Modals/selectVspModal'; +import { SelectVspModal } from './Modals/SelectVspModal'; import { getRowId } from './utils/rowUtils'; const RealtimeTable = ({ formType, formId, sheetName, direction }) => { diff --git a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx index 60d32ed..c782c40 100644 --- a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx +++ b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx @@ -95,7 +95,7 @@ const ModalEditAddVsp = ({ : null, notes: initialData.notes || '', location_form: initialData.location_form || '', - numbers: initialData.numbers?.toString() || '', + numbers: initialData.staff_count?.toString() || '', area: initialData.area || null, rent_contract_num: initialData.rent_contract_num || '', rent_end_date: initialData.rent_end_date @@ -215,7 +215,7 @@ const ModalEditAddVsp = ({ const submitData = { ...formData, - numbers: formData.numbers ? parseInt(formData.numbers, 10) : null, + numbers: formData.staff_count ? parseInt(formData.staff_count, 10) : null, area: formData.area ? parseFloat(formData.area) : null, open_date: formData.open_date ? formData.open_date.toLocaleDateString('en-CA') @@ -495,11 +495,11 @@ const ModalEditAddVsp = ({ Штатная численность ВСП Date: Tue, 30 Jun 2026 15:04:15 +0300 Subject: [PATCH 05/20] =?UTF-8?q?smeta-fix:=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B4=D0=B4=D0=BB=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D0=B8=D0=B8=20=D1=81=D0=BC=D0=B5=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B9=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D1=8B,=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80=D1=8B=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/alembic/versions/sql/0002_functions.sql | 27 +++++---------------- api/tests/sqls/fixture.sql | 6 ++--- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/api/alembic/versions/sql/0002_functions.sql b/api/alembic/versions/sql/0002_functions.sql index 6c66595..63f0af2 100644 --- a/api/alembic/versions/sql/0002_functions.sql +++ b/api/alembic/versions/sql/0002_functions.sql @@ -4086,26 +4086,13 @@ $function$ -- DROP FUNCTION v3.v_form1_smeta(int4, int4); - -CREATE OR REPLACE FUNCTION v3.v_form1_smeta(p_year INT, p_org_unit_id INT) -RETURNS TABLE ( - row_type VARCHAR, - depth INT, - section_code VARCHAR, - name VARCHAR, - supp_plan_q1 NUMERIC, supp_plan_q2 NUMERIC, supp_plan_q3 NUMERIC, supp_plan_q4 NUMERIC, supp_plan_year NUMERIC, - dev_plan_q1 NUMERIC, dev_plan_q2 NUMERIC, dev_plan_q3 NUMERIC, dev_plan_q4 NUMERIC, dev_plan_year NUMERIC, - total_plan_year NUMERIC, - supp_appr_q1 NUMERIC, supp_appr_q2 NUMERIC, supp_appr_q3 NUMERIC, supp_appr_q4 NUMERIC, supp_appr_year NUMERIC, - dev_appr_q1 NUMERIC, dev_appr_q2 NUMERIC, dev_appr_q3 NUMERIC, dev_appr_q4 NUMERIC, dev_appr_year NUMERIC, - total_appr_year NUMERIC, - supp_act_q1 NUMERIC, supp_act_q2 NUMERIC, supp_act_q3 NUMERIC, supp_act_q4 NUMERIC, supp_act_year NUMERIC, - dev_act_q1 NUMERIC, dev_act_q2 NUMERIC, dev_act_q3 NUMERIC, dev_act_q4 NUMERIC, dev_act_year NUMERIC, - total_act_year NUMERIC, - supp_corr_q2 NUMERIC, supp_corr_q3 NUMERIC, supp_corr_q4 NUMERIC, - dev_corr_q2 NUMERIC, dev_corr_q3 NUMERIC, dev_corr_q4 NUMERIC -) +CREATE OR REPLACE FUNCTION v3.v_form1_smeta(p_year integer, p_org_unit_id integer) + RETURNS TABLE(row_type character varying, depth integer, section_code character varying, name character varying, supp_plan_q1 numeric, supp_plan_q2 numeric, supp_plan_q3 numeric, supp_plan_q4 numeric, supp_plan_year numeric, dev_plan_q1 numeric, dev_plan_q2 numeric, dev_plan_q3 numeric, dev_plan_q4 numeric, dev_plan_year numeric, total_plan_year numeric, supp_appr_q1 numeric, supp_appr_q2 numeric, supp_appr_q3 numeric, supp_appr_q4 numeric, supp_appr_year numeric, dev_appr_q1 numeric, dev_appr_q2 numeric, dev_appr_q3 numeric, dev_appr_q4 numeric, dev_appr_year numeric, total_appr_year numeric, supp_act_q1 numeric, supp_act_q2 numeric, supp_act_q3 numeric, supp_act_q4 numeric, supp_act_year numeric, dev_act_q1 numeric, dev_act_q2 numeric, dev_act_q3 numeric, dev_act_q4 numeric, dev_act_year numeric, total_act_year numeric, supp_corr_q2 numeric, supp_corr_q3 numeric, supp_corr_q4 numeric, dev_corr_q2 numeric, dev_corr_q3 numeric, dev_corr_q4 numeric) + LANGUAGE plpgsql + STABLE + SET search_path TO 'v3', 'pg_catalog' AS $function$ +#variable_conflict use_column DECLARE v_ahr INT; v_cap INT; v_oper INT; v_sections TEXT[] := ARRAY['plan','approved','q1','q2','q3','q4']; @@ -4235,9 +4222,7 @@ BEGIN ORDER BY m.sc; END; $function$ -LANGUAGE plpgsql STABLE SET search_path = v3, pg_catalog ; - -- DROP FUNCTION v3.v_form2_sheet_sections(int4, varchar, _text); CREATE OR REPLACE FUNCTION v3.v_form2_sheet_sections(p_form_id integer, p_sheet character varying, p_sections text[] DEFAULT NULL::text[]) diff --git a/api/tests/sqls/fixture.sql b/api/tests/sqls/fixture.sql index 6aa3e65..c587bf6 100644 --- a/api/tests/sqls/fixture.sql +++ b/api/tests/sqls/fixture.sql @@ -26,7 +26,7 @@ SELECT setval('v3.budget_line_id_seq', 1); INSERT INTO v3.form_phase (budget_form_id,sheet,phase_code,"role",column_keys,opens_at,closes_at) VALUES (1,'AHR','test','DFIP','{{plan.q1}}','2026-05-05 03:00:00+03','2026-06-06 03:00:00+03'); -INSERT INTO v3.vsp (id,branch_id,reg_number,address,format,opened_at,placement_type,staff_count,total_area,closed_at,is_active,updated_at,is_deleted,created_at,created_by,system_code,updated_by,vsp_type,notes,location_form,numbers,rent_contract_num,rent_end_date) VALUES - (1,2,'Тестовый всп 1','Тестовая 12','укукк','2026-05-07','ывс',2026,230,'2026-06-16',false,'2026-06-18 15:46:38.611903',false,'2026-06-04 14:36:59.737727',1,'1233',91,'','','встроенное помещение',NULL,'',NULL), - (2,2,'Test12 -----','Тестовая 125','формат 15 ','2026-06-08',NULL,NULL,58,NULL,true,'2026-06-16 18:53:17.986651',false,'2026-06-09 09:04:33.29858',91,'123-1234',91,'субаренда','Работает ','аренда',155,'12-45','2026-10-02'); +INSERT INTO v3.vsp (id,branch_id,reg_number,address,format,opened_at,placement_type,staff_count,total_area,closed_at,is_active,updated_at,is_deleted,created_at,created_by,system_code,updated_by,vsp_type,notes,location_form,rent_contract_num,rent_end_date) VALUES + (1,2,'Тестовый всп 1','Тестовая 12','укукк','2026-05-07','ывс',2026,230,'2026-06-16',false,'2026-06-18 15:46:38.611903',false,'2026-06-04 14:36:59.737727',1,'1233',91,'','','встроенное помещение','',NULL), + (2,2,'Test12 -----','Тестовая 125','формат 15 ','2026-06-08',NULL,NULL,58,NULL,true,'2026-06-16 18:53:17.986651',false,'2026-06-09 09:04:33.29858',91,'123-1234',91,'субаренда','Работает ','аренда','12-45','2026-10-02'); SELECT setval('v3.vsp_id_seq', 2); From c8cc1afec103d8cf34de7dc3e0b32199ead9bc9d Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Tue, 30 Jun 2026 15:07:21 +0300 Subject: [PATCH 06/20] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20constants.js=20=D0=B2=20=D0=BF=D0=B0=D0=BF=D0=BA=D1=83?= =?UTF-8?q?=20constants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/api/projects.js | 2 +- web/src/app/Routes.jsx | 1 + .../components/HeaderMenu/HeaderSwitch.jsx | 2 +- web/src/components/Stages/AddStagesModal.jsx | 2 +- .../components/Stages/StageInfoForTooltip.jsx | 2 +- .../Stages/StagesTable/StagesTable.jsx | 2 +- web/src/components/common/PaginatedList.jsx | 2 +- web/src/components/common/Selects/Selects.jsx | 2 +- .../common/SwitchFormTask/SwitchFormTask.jsx | 2 +- .../components/common/TableCard/TableCard.jsx | 2 +- .../components/common/TableList/TableList.jsx | 7 +- .../components/common/TaskCardComponent.jsx | 2 +- web/src/{ => constants}/constants.jsx | 0 web/src/constants/projectConfig.jsx | 90 ++++++++ .../AuditLogsPage/AuditLogsPage.jsx | 2 +- .../components/AuditLogsTable.jsx | 2 +- .../AuditLogsPage/utils/transformers.jsx | 2 +- .../pages/AdminPanel/SppsPage/SppsPage.jsx | 2 +- .../AdminPanel/UsersPage/ModalEditUserSsp.jsx | 2 +- .../UsersPage/UserTable/EditUserModal.jsx | 2 +- .../UsersPage/UserTable/UserTable.jsx | 4 +- .../AdminPanel/UsersPage/UserTableForAdd.jsx | 2 +- .../AdminPanel/UsersPage/UsersActionBar.jsx | 2 +- .../pages/AdminPanel/UsersPage/UsersPage.jsx | 4 +- web/src/pages/DictVspPage/DictVspPage.jsx | 2 +- .../components/Modals/ModalEditAddVsp.jsx | 2 +- .../DictVspPage/components/TableDictVsp.jsx | 2 +- web/src/pages/NewFormTablePage.jsx | 2 +- .../pages/ProjectsPage/ModalCreateProject.jsx | 146 ++++++++++++- web/src/pages/ProjectsPage/ProjectCard.jsx | 119 +++++----- web/src/pages/ProjectsPage/ProjectsPage.jsx | 203 +++++++++++------- web/src/pages/TablePage.jsx | 2 +- web/src/pages/TaskPage/TaskPage.jsx | 104 +++++---- web/src/pages/TasksPage/TasksPage.jsx | 3 +- 34 files changed, 513 insertions(+), 214 deletions(-) rename web/src/{ => constants}/constants.jsx (100%) create mode 100644 web/src/constants/projectConfig.jsx diff --git a/web/src/api/projects.js b/web/src/api/projects.js index 218ec55..ae05081 100644 --- a/web/src/api/projects.js +++ b/web/src/api/projects.js @@ -14,7 +14,7 @@ export const ProjectsApi = { }, update: (id, data) => { - return api.put(`/projects/${id}`, data).then((r) => r.data); + return api.patch(`/projects/${id}`, data).then((r) => r.data); }, delete: (id) => { diff --git a/web/src/app/Routes.jsx b/web/src/app/Routes.jsx index 7b62aa3..4387604 100644 --- a/web/src/app/Routes.jsx +++ b/web/src/app/Routes.jsx @@ -41,6 +41,7 @@ export const AppRoutes = () => { }/> } /> } /> + } /> } /> } /> } /> diff --git a/web/src/components/HeaderMenu/HeaderSwitch.jsx b/web/src/components/HeaderMenu/HeaderSwitch.jsx index dcd49f1..561da87 100644 --- a/web/src/components/HeaderMenu/HeaderSwitch.jsx +++ b/web/src/components/HeaderMenu/HeaderSwitch.jsx @@ -4,7 +4,7 @@ import { NavLink } from 'react-router-dom'; import styled from '@emotion/styled'; import { TasksSvg, AdminPanelSvg, DictSvg } from '../common/icons/icons'; import { useAuth } from '../../app/context/AuthProvider'; -import { ROLES_NAME_ID } from '../../constants'; +import { ROLES_NAME_ID } from '../../constants/constants'; const Switch = styled.div` margin-left: 1rem; diff --git a/web/src/components/Stages/AddStagesModal.jsx b/web/src/components/Stages/AddStagesModal.jsx index 4b61bee..cdcec58 100644 --- a/web/src/components/Stages/AddStagesModal.jsx +++ b/web/src/components/Stages/AddStagesModal.jsx @@ -25,7 +25,7 @@ import { StageStatusChip } from './StageStatusChip'; import { formatDateForApi } from './utils'; import CollapsibleTree from '../common/CollapsibleTree'; import { collectLeafColumns } from '../RealtimeTable/utils/columnUtils'; -import { STAGE_ROLE_RUSSIAN_NAME } from '../../constants'; +import { STAGE_ROLE_RUSSIAN_NAME } from '../../constants/constants'; export const AddStagesModal = ({ isOpen, diff --git a/web/src/components/Stages/StageInfoForTooltip.jsx b/web/src/components/Stages/StageInfoForTooltip.jsx index b0e13b3..ec2ef96 100644 --- a/web/src/components/Stages/StageInfoForTooltip.jsx +++ b/web/src/components/Stages/StageInfoForTooltip.jsx @@ -1,6 +1,6 @@ import { Box, Divider, Stack } from '@mui/material'; import { UnLockedSvg } from '../common/icons/icons'; -import { ROLES_ID_RUSSIAN_NAME, EDIT_ACCESS_RUSSIAN } from '../../constants'; +import { ROLES_ID_RUSSIAN_NAME, EDIT_ACCESS_RUSSIAN } from '../../constants/constants'; export const StageInfoForTooltip = ({ stageData = [] }) => { const accessData = stageData[0] || []; diff --git a/web/src/components/Stages/StagesTable/StagesTable.jsx b/web/src/components/Stages/StagesTable/StagesTable.jsx index 8a52ce6..4cef924 100644 --- a/web/src/components/Stages/StagesTable/StagesTable.jsx +++ b/web/src/components/Stages/StagesTable/StagesTable.jsx @@ -20,7 +20,7 @@ import { import { getStageStatus, getStatusColors } from './utils'; import { formatDate } from '../../../utils/formatDate'; import { StageStatusChip } from '../StageStatusChip'; -import { ROLES_NAME_ID, SHEET_NAME, STAGE_ROLE_RUSSIAN_NAME } from '../../../constants'; +import { ROLES_NAME_ID, SHEET_NAME, STAGE_ROLE_RUSSIAN_NAME } from '../../../constants/constants'; import { useAuth } from '../../../app/context/AuthProvider'; export const StagesTable = ({ stages, onEdit, onDelete }) => { diff --git a/web/src/components/common/PaginatedList.jsx b/web/src/components/common/PaginatedList.jsx index ce4ee52..430ce72 100644 --- a/web/src/components/common/PaginatedList.jsx +++ b/web/src/components/common/PaginatedList.jsx @@ -56,7 +56,7 @@ export function PaginatedList({ extraActions = null, enableExport = true, limitOptions = [10, 20, 50, 100, 200], - maxHeight = 'calc(110vh - 300px)', + maxHeight = 'calc(100vh - 300px)', enableScroll = true, }) { const [exportMode, setExportMode] = useState(false); diff --git a/web/src/components/common/Selects/Selects.jsx b/web/src/components/common/Selects/Selects.jsx index 4787aa1..60c1e8b 100644 --- a/web/src/components/common/Selects/Selects.jsx +++ b/web/src/components/common/Selects/Selects.jsx @@ -1,5 +1,5 @@ import { useEffect, useState, useRef } from 'react'; -import { EDIT_ACCESS_RUSSIAN, ROLES_ID_RUSSIAN_NAME } from '../../../constants'; +import { EDIT_ACCESS_RUSSIAN, ROLES_ID_RUSSIAN_NAME } from '../../../constants/constants'; import { SelectWrapper, SelectContainer, diff --git a/web/src/components/common/SwitchFormTask/SwitchFormTask.jsx b/web/src/components/common/SwitchFormTask/SwitchFormTask.jsx index b48d6d9..4e2eab0 100644 --- a/web/src/components/common/SwitchFormTask/SwitchFormTask.jsx +++ b/web/src/components/common/SwitchFormTask/SwitchFormTask.jsx @@ -1,5 +1,5 @@ import { useAuth } from '../../../app/context/AuthProvider'; -import { ROLES_NAME_ID } from '../../../constants'; +import { ROLES_NAME_ID } from '../../../constants/constants'; import { Switch, Buttons, StyledNavLink } from './SwitchFormTask.style'; export function SwitchFormTask() { diff --git a/web/src/components/common/TableCard/TableCard.jsx b/web/src/components/common/TableCard/TableCard.jsx index 367d163..1ddc649 100644 --- a/web/src/components/common/TableCard/TableCard.jsx +++ b/web/src/components/common/TableCard/TableCard.jsx @@ -1,4 +1,4 @@ -import { DIRECTION_TRANSLATE, FORM_TYPE_OPTIONS } from '../../../constants'; +import { DIRECTION_TRANSLATE, FORM_TYPE_OPTIONS } from '../../../constants/constants'; import { Section, SectionStartPart, diff --git a/web/src/components/common/TableList/TableList.jsx b/web/src/components/common/TableList/TableList.jsx index e0afa57..4dcb645 100644 --- a/web/src/components/common/TableList/TableList.jsx +++ b/web/src/components/common/TableList/TableList.jsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { Box, Stack, Typography } from '@mui/material'; import { useNavigate } from 'react-router-dom'; import TableCard from '../TableCard/TableCard'; @@ -12,6 +12,9 @@ const TablesList = ({ formInfo }) => { const navigate = useNavigate(); + const isProject = useMemo(() => { + return !!projects; + }, [projects]) const handleNavigate = (path) => { navigate(path); @@ -22,7 +25,7 @@ const TablesList = ({ if (!formInfo){ return; } - const path = `${basePath}/form/${formInfo.id}/form-type/${formInfo.form_type_code}/${table.sheet}/${table?.direction}`; + const path = `${basePath}/form/${formInfo.id}/form-type/${isProject ? 'project' : formInfo.form_type_code}/${table.sheet}/${table?.direction}`; return ( { diff --git a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx index 60d32ed..f08e7eb 100644 --- a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx +++ b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx @@ -14,7 +14,7 @@ import { PrimaryButton, } from '../../../../components/common/Buttons/Buttons'; import { useAuth } from '../../../../app/context/AuthProvider'; -import { ROLES_NAME_ID } from '../../../../constants'; +import { ROLES_NAME_ID } from '../../../../constants/constants'; import { ModalContainer, FieldContainer, diff --git a/web/src/pages/DictVspPage/components/TableDictVsp.jsx b/web/src/pages/DictVspPage/components/TableDictVsp.jsx index d1c4397..580b3b2 100644 --- a/web/src/pages/DictVspPage/components/TableDictVsp.jsx +++ b/web/src/pages/DictVspPage/components/TableDictVsp.jsx @@ -11,7 +11,7 @@ import { PrimaryOutlinedButton, } from '../../../components/common/Buttons/Buttons'; import { useAuth } from '../../../app/context/AuthProvider'; -import { ROLES_NAME_ID } from '../../../constants'; +import { ROLES_NAME_ID } from '../../../constants/constants'; import ModalExport from './Modals/ModalExport'; const TableDictVsp = ({ diff --git a/web/src/pages/NewFormTablePage.jsx b/web/src/pages/NewFormTablePage.jsx index e144ff0..ac51181 100644 --- a/web/src/pages/NewFormTablePage.jsx +++ b/web/src/pages/NewFormTablePage.jsx @@ -8,7 +8,7 @@ import { useParams } from 'react-router-dom'; import { RealtimeProvider } from '../components/RealtimeTable/contexts/RealtimeContext'; import { useAuth } from '../app/context/AuthProvider'; import { BackButton } from '../components/common/Buttons/BackButton'; -import { SHEET_NAME } from '../constants'; +import { SHEET_NAME } from '../constants/constants'; const TableInfo = ({ formId, sheetName }) => { const portalContent = ( diff --git a/web/src/pages/ProjectsPage/ModalCreateProject.jsx b/web/src/pages/ProjectsPage/ModalCreateProject.jsx index 5f7034a..20c3f94 100644 --- a/web/src/pages/ProjectsPage/ModalCreateProject.jsx +++ b/web/src/pages/ProjectsPage/ModalCreateProject.jsx @@ -1,4 +1,5 @@ -import { useState } from 'react'; +// src/components/common/ProjectCardComponent/ModalCreateProject.jsx +import { useState, useEffect } from 'react'; import { Box, Button, Divider, TextField, Typography } from '@mui/material'; import SelectWithOptions from '../AdminPanel/components/SelectWithOptions'; import Modal from '../../components/common/Modal/Modal'; @@ -9,25 +10,103 @@ export const ModalCreateProject = ({ onClose, onCreate, config = {}, + initialData = null, + isEdit = false, + projectId = null, }) => { const [projectData, setProjectData] = useState(() => { - const initialData = {}; + // Если есть initialData, используем её, иначе создаем из конфига + if (initialData) { + return { ...initialData }; + } + const initial = {}; Object.keys(config).forEach((key) => { - initialData[key] = config[key].defaultValue; + initial[key] = config[key].defaultValue; }); - return initialData; + return initial; }); + const [errors, setErrors] = useState({}); + + // Обновляем данные при изменении initialData + useEffect(() => { + if (initialData) { + setProjectData({ ...initialData }); + } else { + const initial = {}; + Object.keys(config).forEach((key) => { + initial[key] = config[key].defaultValue; + }); + setProjectData(initial); + } + setErrors({}); + }, [initialData, config]); + const handleChange = (field, value) => { setProjectData((prev) => ({ ...prev, [field]: value, })); + // Очищаем ошибку для поля при изменении + if (errors[field]) { + setErrors((prev) => ({ + ...prev, + [field]: undefined, + })); + } + }; + + const validateField = (fieldName, config) => { + if (config.required_field) { + const value = projectData[fieldName]; + + // Проверка для разных типов полей + if (config.type === 'multiselect') { + if (!value || (Array.isArray(value) && value.length === 0) || value === '') { + return `Поле "${fieldName}" обязательно для заполнения`; + } + } else if (config.type === 'text') { + if (!value || value.trim() === '') { + return `Поле "${fieldName}" обязательно для заполнения`; + } + } else if (config.type === 'number') { + if (value === null || value === undefined || value === '') { + return `Поле "${fieldName}" обязательно для заполнения`; + } + // Проверка на минимальное значение + if (config.min !== undefined && Number(value) < config.min) { + return `Значение должно быть не меньше ${config.min}`; + } + // Проверка на максимальное значение + if (config.max !== undefined && Number(value) > config.max) { + return `Значение должно быть не больше ${config.max}`; + } + } + } + return null; + }; + + const validateAllFields = () => { + const newErrors = {}; + let hasErrors = false; + + Object.entries(config).forEach(([fieldName, fieldConfig]) => { + const error = validateField(fieldName, fieldConfig); + if (error) { + newErrors[fieldName] = error; + hasErrors = true; + } + }); + + setErrors(newErrors); + return !hasErrors; }; const handleClickCreate = () => { - onCreate(projectData); - onClose(); + if (validateAllFields()) { + onCreate(projectData); + // Не закрываем модалку здесь, пусть это делает родительский компонент + } }; const handleClose = () => { @@ -36,10 +115,14 @@ export const ModalCreateProject = ({ resetData[key] = config[key].defaultValue; }); setProjectData(resetData); + setErrors({}); onClose(); }; const renderField = (fieldName, config) => { + const hasError = !!errors[fieldName]; + const errorText = errors[fieldName]; + switch (config.type) { case 'multiselect': return ( @@ -50,9 +133,13 @@ export const ModalCreateProject = ({ fontWeight: '400', fontSize: '0.75rem', paddingBottom: '.25rem', + color: hasError ? 'var(--error-color, #d32f2f)' : 'var(--grey-dark)', }} > {fieldName} + {config.required_field && ( + * + )} handleChange(fieldName, value)} width="28.25rem" + style={{ + borderColor: hasError ? 'var(--error-color, #d32f2f)' : undefined, + borderWidth: hasError ? '2px' : undefined, + }} /> + {hasError && ( + + {errorText} + + )}
); @@ -73,11 +175,14 @@ export const ModalCreateProject = ({ sx={{ fontWeight: '400', fontSize: '0.75rem', - color: 'var(--grey-dark)', + color: hasError ? 'var(--error-color, #d32f2f)' : 'var(--grey-dark)', paddingBottom: '.25rem', }} > {fieldName} + {config.required_field && ( + * + )} handleChange(fieldName, e.target.value)} placeholder={config.placeholder} size="small" + error={hasError} + helperText={hasError ? errorText : ''} + FormHelperTextProps={{ + sx: { + marginLeft: 0, + fontSize: '0.75rem', + }, + }} />
); @@ -97,11 +210,14 @@ export const ModalCreateProject = ({ sx={{ fontWeight: '400', fontSize: '0.75rem', - color: 'var(--grey-dark)', + color: hasError ? 'var(--error-color, #d32f2f)' : 'var(--grey-dark)', paddingBottom: '.25rem', }} > {fieldName} + {config.required_field && ( + * + )} ); @@ -136,7 +260,7 @@ export const ModalCreateProject = ({ return ( - Создать + {isEdit ? 'Сохранить' : 'Создать'} } @@ -180,4 +304,4 @@ export const ModalCreateProject = ({ ); -}; +}; \ No newline at end of file diff --git a/web/src/pages/ProjectsPage/ProjectCard.jsx b/web/src/pages/ProjectsPage/ProjectCard.jsx index 29f281c..15ed15c 100644 --- a/web/src/pages/ProjectsPage/ProjectCard.jsx +++ b/web/src/pages/ProjectsPage/ProjectCard.jsx @@ -25,6 +25,7 @@ import { } from '../../components/common/icons/icons'; import { IconWithContent } from '../../components/common/IconWithContent'; import { ExportButton } from '../../components/common/Buttons/ButtonsActions'; +import { ModalCreateProject } from './ModalCreateProject'; const ProjectCard = styled.div` width: 26.8rem; @@ -137,17 +138,9 @@ const getStatusLabel = (status) => { return statusMap[status] || status || 'Не указан'; }; -const getLevelLabel = (level) => { - const levelMap = { - project: 'Проект', - subproject: 'Подпроект', - task: 'Задача', - }; - return levelMap[level] || level || 'Не указан'; -}; - export const ProjectCardComponent = ({ project, + projectDataInit, exportMode = false, isLoadingFile = false, onAddForExport, @@ -172,22 +165,41 @@ export const ProjectCardComponent = ({ } = project; const [isEditModalOpen, setEditModalOpen] = useState(false); - const [editedName, setEditedName] = useState(''); const [currentName, setCurrentName] = useState(name || ''); const [isChecked, setIsChecked] = useState(false); + const [editFormData, setEditFormData] = useState({}); + const [projectData, setProjectData] = useState(projectDataInit); useEffect(() => { setIsChecked(false); }, [exportMode]); + + + // Функция для подготовки данных проекта к редактированию + const prepareProjectDataForEdit = () => { + return { + 'ССП/РФ': project.org_unit_id || null, + 'Год': year || null, + 'Тип проекта развития': project_type || null, + 'Название проекта': currentName, + 'Формат ВСП': vsp_format || null, + 'Адрес объекта': object_address || '', + 'Целевая численность, чел.': staff_count || 0, + 'Тип размещения': placement_type || null, + 'Площадь размещения, м2': total_area || 0, + }; + }; + const handleOpenEdit = (event) => { event.stopPropagation(); - setEditedName(currentName); + setEditFormData(prepareProjectDataForEdit()); setEditModalOpen(true); }; const handleCloseEdit = () => { setEditModalOpen(false); + setEditFormData({}); }; const handleCheckboxClick = (event) => { @@ -211,30 +223,39 @@ export const ProjectCardComponent = ({ } }; - const updateProject = async (nextName) => { + // Обновленная функция обновления проекта + const updateProject = async (formData) => { try { - await ProjectsApi.update(id, { name: nextName }); - setCurrentName(nextName); + const projectData = { + name: formData['Название проекта'] || currentName, + project_type: formData['Тип проекта развития'] || null, + vsp_format: formData['Формат ВСП'] || null, + object_address: formData['Адрес объекта'] || '', + staff_count: Number(formData['Целевая численность, чел.']) || 0, + placement_type: formData['Тип размещения'] || null, + total_area: Number(formData['Площадь размещения, м2']) || 0, + year: formData['Год'] ? Number(formData['Год']) : null, + branch_id: formData['ССП/РФ'] || null, + }; + + await ProjectsApi.update(id, projectData); + + // Обновляем локальные данные + setCurrentName(projectData.name); setEditModalOpen(false); - toast.success('Название проекта обновлено'); + toast.success('Данные проекта успешно обновлены'); + + // Можно добавить рефреш данных или перезагрузку страницы + window.location.reload(); // или используйте callback для обновления списка } catch (error) { toast.error( - error?.response?.data?.detail || 'Не удалось обновить название проекта', + error?.response?.data?.detail || 'Не удалось обновить данные проекта', ); } }; - const handleSaveName = async () => { - const nextName = editedName.trim(); - if (!nextName) { - toast.error('Название не может быть пустым'); - return; - } - if (nextName === currentName) { - setEditModalOpen(false); - return; - } - await updateProject(nextName); + const handleSaveProject = async (formData) => { + await updateProject(formData); }; const getInitials = (name) => { @@ -252,18 +273,21 @@ export const ProjectCardComponent = ({ ID: {id} - + {!exportMode && ( <> {status && ( - )} - - + {/* {Пока нет редактирование + экспорт} */} + {/* + */} )} @@ -272,18 +296,13 @@ export const ProjectCardComponent = ({ {currentName} - {level && ( - - )} {project_type && ( )} {report_count !== undefined && report_count !== null && ( )} - {parent_id && ( - - )} + @@ -302,18 +321,6 @@ export const ProjectCardComponent = ({ }> {org_unit_name || 'Организация не указана'} - {object_address && ( - - {object_address} - - )} - {(staff_count || total_area) && ( - - {staff_count && `👥 ${staff_count}`} - {staff_count && total_area && ' | '} - {total_area && `📐 ${total_area} м²`} - - )} {exportMode && ( @@ -327,6 +334,16 @@ export const ProjectCardComponent = ({ )} + + ); }; \ No newline at end of file diff --git a/web/src/pages/ProjectsPage/ProjectsPage.jsx b/web/src/pages/ProjectsPage/ProjectsPage.jsx index d4f59a0..29bd04a 100644 --- a/web/src/pages/ProjectsPage/ProjectsPage.jsx +++ b/web/src/pages/ProjectsPage/ProjectsPage.jsx @@ -1,4 +1,3 @@ -// src/pages/ProjectsPage/ProjectsPage.jsx import { useEffect, useMemo, useState } from 'react'; import { ProjectsApi } from '../../api/projects'; import { CardsSkeleton } from '../../components/common/Skeleton'; @@ -18,12 +17,14 @@ import { Typography, IconButton, Tooltip, + TextField, + Autocomplete, } from '@mui/material'; import { toast } from 'react-toastify'; import { ModalCreateProject } from './ModalCreateProject'; import { ROLES_NAME_ID, -} from '../../constants'; +} from '../../constants/constants'; import { useAuth } from '../../app/context/AuthProvider'; import { PrimaryButton } from '../../components/common/Buttons/Buttons'; import { @@ -34,79 +35,20 @@ import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; import { WhitePlus } from '../../components/common/icons/icons'; import { useNavigate } from 'react-router-dom'; import { PaginatedList } from '../../components/common/PaginatedList'; +import { DEFAULT_PROJECT_CONFIG } from '../../constants/projectConfig'; +import { SspApi } from '../../api/ssp'; - -// Конфигурация для создания проекта -const defaultProjectConfig = { - 'Тип проекта развития': { - type: 'multiselect', - options: [ - 'Открытие ВСП', - 'Закрытие ВСП', - 'Переезд ВСП', - 'Реновация РФ', - 'Открытие УРМ', - ], - placeholder: 'Выберите тип проекта', - defaultValue: null, - }, - 'Название проекта': { - type: 'text', - placeholder: 'Введите название проекта', - defaultValue: '', - }, - 'Формат ВСП': { - type: 'multiselect', - options: [ - 'Фланговый', - 'Типовой', - 'Розничный', - 'МСБ', - 'Лёгкий', - 'Мини', - 'Розничный-киоск', - 'МБО', - 'Офис самообслуживания', - 'Другое', - ], - placeholder: 'Выберите формат ВСП', - defaultValue: null, - }, - 'Адрес объекта': { - type: 'text', - placeholder: 'Введите адрес объекта', - defaultValue: '', - }, - 'Целевая численность, чел.': { - type: 'number', - placeholder: 'Введите число', - defaultValue: 0, - min: 0, - step: 1, - }, - 'Тип размещения': { - type: 'multiselect', - options: ['Собственность', 'Аренда', 'Субаренда'], - placeholder: 'Выберите тип размещения', - defaultValue: null, - }, - 'Площадь размещения, м2': { - type: 'number', - placeholder: 'Введите число', - defaultValue: 0, - min: 0, - step: 1, - }, -}; +export { DEFAULT_PROJECT_CONFIG } from '../../constants/projectConfig'; export default function ProjectsPage() { const navigate = useNavigate(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [modalOpen, setModalOpen] = useState(false); - const [query, setQuery] = useState(''); - const [statusFilter, setStatusFilter] = useState(''); - const [levelFilter, setLevelFilter] = useState(''); + + // Новые фильтры + const [yearFilter, setYearFilter] = useState(''); + const [branchFilter, setBranchFilter] = useState(''); // Pagination state const [page, setPage] = useState(1); @@ -118,11 +60,47 @@ export default function ProjectsPage() { const [exportMode, setExportMode] = useState(false); const [exportList, setExportList] = useState([]); + const [projectData, setProjectData] = useState(DEFAULT_PROJECT_CONFIG); + + // Получаем список годов для фильтра (можно динамически или задать диапазон) + const yearOptions = useMemo(() => { + const currentYear = new Date().getFullYear(); + const years = []; + for (let year = currentYear - 5; year <= currentYear + 2; year++) { + years.push(year); + } + return years; + }, []); + + useEffect(() => { + if (!user) return; + if (user.role_id == ROLES_NAME_ID.admin) { + SspApi.getAll().then(data => { + if (data.success) { + setProjectData(prev => ({ + ...prev, 'ССП/РФ': { + ...prev['ССП/РФ'], + options: data.result + } + })) + return; + } + toast.error('Ошибка при получении ССП/РФ'); + }); + return; + } + setProjectData(prev => ({ + ...prev, 'ССП/РФ': { + ...prev['ССП/РФ'], + options: user.org_units, + } + })) + }, [user]) + const openModal = () => { setModalOpen(true); }; - // Маппинг полей из модалки в API const mapFormDataToApi = (formData) => { const apiData = { name: formData['Название проекта'] || '', @@ -132,12 +110,9 @@ export default function ProjectsPage() { staff_count: formData['Целевая численность, чел.'] || 0, placement_type: formData['Тип размещения'] || null, total_area: formData['Площадь размещения, м2'] || 0, - // Добавляем значения по умолчанию для обязательных полей - year: new Date().getFullYear(), - org_unit_id: user?.org_unit_id || null, - form_type_code: 'project', // или другое значение по умолчанию - status: 'active', - level: 'project', + year: formData['Год'] || null, + branch_id: formData['ССП/РФ'] || null, + }; return apiData; }; @@ -169,6 +144,9 @@ export default function ProjectsPage() { const params = { offset: skip, limit: currentLimit, + // Добавляем фильтры в параметры запроса + ...(yearFilter && { year: parseInt(yearFilter) }), + ...(branchFilter && { branch_id: parseInt(branchFilter.id) }), }; const res = await ProjectsApi.list(params); @@ -184,10 +162,11 @@ export default function ProjectsPage() { } }; + // Сбрасываем страницу при изменении любых фильтров useEffect(() => { setPage(1); loadProjects(1, limit); - }, [query, statusFilter, levelFilter]); + }, [yearFilter, branchFilter]); const handlePageChange = (event, value) => { setPage(value); @@ -201,6 +180,13 @@ export default function ProjectsPage() { loadProjects(1, newLimit); }; + // Сброс всех фильтров + const handleClearFilters = () => { + setYearFilter(''); + setBranchFilter(''); + setPage(1); + }; + useEffect(() => { loadProjects(page, limit); }, []); @@ -253,6 +239,68 @@ export default function ProjectsPage() { + {/* Фильтры */} + + + {/* Фильтр по году */} + + + + + {/* Фильтр по ССП/РФ */} + + option.title || option.name || '-'} + value={ + branchFilter + } + onChange={(event, newValue) => { + setBranchFilter(newValue); + }} + sx={{ height: '2.5rem', minWidth: '21.25rem' }} + renderInput={(params) => ( + + )} + /> + + + + )} @@ -286,7 +335,7 @@ export default function ProjectsPage() { open={modalOpen} onClose={() => setModalOpen(false)} onCreate={handleCreateProject} - config={defaultProjectConfig} + config={projectData} /> ); diff --git a/web/src/pages/TablePage.jsx b/web/src/pages/TablePage.jsx index d678eed..4540c9e 100644 --- a/web/src/pages/TablePage.jsx +++ b/web/src/pages/TablePage.jsx @@ -57,7 +57,7 @@ export default function TablePage() { const connection = connectToTable(tableId, user?.id, { onError: () => { - toast.error('Ошибка подключения к серверу реального времени'); + toast.error('Ошибка подключения к серверу'); }, onClose: (event) => { if (isUnmountingRef.current) { diff --git a/web/src/pages/TaskPage/TaskPage.jsx b/web/src/pages/TaskPage/TaskPage.jsx index 62b22e0..9dfdfd9 100644 --- a/web/src/pages/TaskPage/TaskPage.jsx +++ b/web/src/pages/TaskPage/TaskPage.jsx @@ -3,6 +3,7 @@ import { createPortal } from 'react-dom'; import { useParams, useNavigate } from 'react-router-dom'; import { TasksApi } from '../../api/tasks'; import { TablesApi } from '../../api/tables'; +import { ProjectsApi } from '../../api/projects'; // Добавьте импорт API для проектов import { TaskInfoContainer, NameTask, @@ -21,13 +22,13 @@ import { FormsApi } from '../../api/forms'; import { ExportWithTextButton } from '../../components/common/Buttons/ButtonsActions'; import { exportSingleForm } from '../../utils/exportForm'; import TablesList from '../../components/common/TableList/TableList'; -import { DIRECTION_TRANSLATE, FORM_TYPE_TRANSLATE, SHEET_NAME } from '../../constants'; +import { DIRECTION_TRANSLATE, FORM_TYPE_TRANSLATE, SHEET_NAME } from '../../constants/constants'; -const TaskInfo = ({ task }) => { +const TaskInfo = ({ task, isProject }) => { const portalContent = ( - - {FORM_TYPE_TRANSLATE[task.form_type_code] || ''} + + {isProject ? 'Проект' : FORM_TYPE_TRANSLATE[task.form_type_code] || ''} ); @@ -39,9 +40,13 @@ const TaskInfo = ({ task }) => { }; export default function TaskPage() { - const { taskId } = useParams(); + const { taskId, projectId } = useParams(); const navigate = useNavigate(); - const id = Number(taskId); + + // Определяем, что у нас за ID и какой тип + const isProject = !!projectId; + const id = isProject ? Number(projectId) : Number(taskId); + const [task, setTask] = useState(null); const [tables, setTables] = useState([]); const [isLoading, setIsLoading] = useState(false); @@ -50,23 +55,42 @@ export default function TaskPage() { const [modalProjectOpen, setModalProjectOpen] = useState(false); const [tempProjects, setTempProjects] = useState([]); const [projects, setProjects] = useState([]); + const [isProjectData, setIsProjectData] = useState(false); useEffect(() => { - const getSheets = async () => { + const getData = async () => { setIsLoading(true); try { - const data = await TasksApi.getSheets(id); - // Преобразуем данные с учетом direction - const mappedTables = data.result.all_sheets.map(sheet => ({ - name: SHEET_NAME[sheet.sheet_name] || sheet.sheet_name, - sheet: sheet.sheet_name, - direction: sheet.direction, - })); - //пока скрыт - setTables(mappedTables.filter(t => t.sheet !== "OTCH9F",)); + if (isProject) { + // Получаем информацию о проекте + const projectData = await ProjectsApi.get(id); + setTask(projectData.result); + setIsProjectData(true); + console.log(projectData.result.reports); + + const mappedTables = projectData.result.reports.map(sheet => ({ + name: SHEET_NAME[sheet.report_type] || sheet.report_type, + sheet: sheet.report_type, + })); + setTables(mappedTables); + } else { + // Получаем информацию о задаче + const taskData = await TasksApi.getById(id); + setTask(taskData.result); + setIsProjectData(false); + + // Получаем таблицы задачи + const tablesData = await TasksApi.getSheets(id); + const mappedTables = tablesData.result.all_sheets.map(sheet => ({ + name: SHEET_NAME[sheet.sheet_name] || sheet.sheet_name, + sheet: sheet.sheet_name, + direction: sheet.direction, + })); + setTables(mappedTables.filter(t => t.sheet !== "OTCH9F")); + } } catch (error) { toast.error( - error?.response?.data?.detail || 'Ошибка получения данных задачи', + error?.response?.data?.detail || `Ошибка получения данных ${isProject ? 'проекта' : 'задачи'}`, ); } finally { setIsLoading(false); @@ -74,27 +98,11 @@ export default function TaskPage() { }; if (Number.isFinite(id)) { - getSheets(); + getData(); } - }, [id]); + }, [id, isProject]); - useEffect(() => { - const getFormInfo = async () => { - setIsLoading(true); - try { - const data = await TasksApi.getById(id); - setTask(data.result); - } catch (error) { - // обработка ошибки - } finally { - setIsLoading(false); - } - }; - - if (Number.isFinite(id)) { - getFormInfo(); - } - }, [id]); + // Объединили два useEffect в один const handleCreateProject = (projectData) => { // логика создания проекта @@ -106,6 +114,14 @@ export default function TaskPage() { return searchString.includes(query.toLowerCase()); }); + // Функция для экспорта + const handleExport = () => { + const fileName = isProject + ? `project_${task?.title || id}` + : `form_${task?.title || taskId}`; + exportSingleForm(id, fileName); + }; + if (isLoading) { return (
@@ -116,7 +132,7 @@ export default function TaskPage() { return ( <> - {task && } + {task && } - exportSingleForm(taskId, task?.title ?? 'form')} - /> + setModalStageOpen(true)} @@ -155,9 +169,10 @@ export default function TaskPage() { setModalStageOpen(false)} - taskId={taskId} - mode="task" - formTypeCode={task?.form_type_code || ''} + taskId={isProject ? undefined : taskId} + projectId={isProject ? projectId : undefined} + mode={isProject ? "project" : "task"} + formTypeCode={ task?.form_type_code || ''} sheets={tables} /> @@ -168,8 +183,9 @@ export default function TaskPage() { query={query} projects={projects} filteredTables={filteredTables} - basePath="/table" + basePath={"/table"} formInfo={task} + isProject={isProject} /> diff --git a/web/src/pages/TasksPage/TasksPage.jsx b/web/src/pages/TasksPage/TasksPage.jsx index aee48c2..f9bb40a 100644 --- a/web/src/pages/TasksPage/TasksPage.jsx +++ b/web/src/pages/TasksPage/TasksPage.jsx @@ -27,7 +27,7 @@ import { ORG_UNIT_TYPE_OPTIONS, ROLES_NAME_ID, FORM_TYPE_TRANSLATE -} from '../../constants'; +} from '../../constants/constants'; import { useAuth } from '../../app/context/AuthProvider'; import { SspApi } from '../../api/ssp'; import { PrimaryButton } from '../../components/common/Buttons/Buttons'; @@ -256,7 +256,6 @@ export default function TasksPage() { <> - Date: Wed, 1 Jul 2026 15:29:28 +0300 Subject: [PATCH 07/20] =?UTF-8?q?form3-permissions:=20=D1=84=D0=B0=D0=B7?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BB=D1=8F=203=20=D1=84=D1=80=D0=BC=D1=8B,=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/alembic/versions/0001_initial_schema.py | 37 ++ api/alembic/versions/sql/0002_functions.sql | 405 +++++++++++++++++- .../versions/sql/0003_initial_data.sql | 27 +- api/src/db/models/__init__.py | 1 + api/src/db/models/form3_phase.py | 27 ++ api/tests/sqls/fixture.sql | 9 +- 6 files changed, 500 insertions(+), 6 deletions(-) create mode 100644 api/src/db/models/form3_phase.py diff --git a/api/alembic/versions/0001_initial_schema.py b/api/alembic/versions/0001_initial_schema.py index 7b0c29b..c4561d8 100644 --- a/api/alembic/versions/0001_initial_schema.py +++ b/api/alembic/versions/0001_initial_schema.py @@ -762,6 +762,43 @@ def upgrade() -> None: ['code'], schema='v3', ) + create_table_if_not_exists( + 'form3_phase', + sa.Column('rf_project_report_id', sa.Integer(),primary_key=True), + sa.Column('phase_code', sa.String(), primary_key=True), + sa.Column('role', sa.String(), nullable=False), + sa.Column('column_keys', postgresql.ARRAY(sa.Text()), nullable=False), + sa.Column('opens_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('closes_at', sa.DateTime(timezone=True), nullable=False), + schema='v3', + ) + + create_check_constraint_if_not_exists( + 'chk_v3_form3_phase_window', 'form3_phase', + sa.text('closes_at > opens_at'), + schema='v3', + ) + create_check_constraint_if_not_exists( + 'chk_v3_form3_phase_columns', 'form3_phase', + sa.text('cardinality(column_keys) > 0'), + schema='v3', + ) + create_check_constraint_if_not_exists( + 'chk_v3_form3_phase_no_admin', 'form3_phase', + sa.text("role != 'ADMIN'"), + schema='v3', + ) + create_index_if_not_exists( + 'ix_v3_form3_phase_active', 'form3_phase', + ['rf_project_report_id', 'role', 'opens_at', 'closes_at'], + schema='v3', + ) + create_index_if_not_exists( + 'ix_v3_form3_phase_columns_gin', 'form3_phase', + ['column_keys'], + schema='v3', + postgresql_using='gin', + ) create_table_if_not_exists( 'security_detail', sa.Column('id', sa.Integer(), diff --git a/api/alembic/versions/sql/0002_functions.sql b/api/alembic/versions/sql/0002_functions.sql index 7c6326c..987eb91 100644 --- a/api/alembic/versions/sql/0002_functions.sql +++ b/api/alembic/versions/sql/0002_functions.sql @@ -7772,4 +7772,407 @@ BEGIN END; $function$ -; \ No newline at end of file +; + + + +CREATE OR REPLACE FUNCTION v3.copy_template_to_report(p_report_id INT) +RETURNS INTEGER +AS $function$ +DECLARE + v_report_type VARCHAR; + v_inserted INTEGER; +BEGIN + SELECT report_type INTO v_report_type + FROM v3.rf_project_report + WHERE id = p_report_id; + + IF NOT FOUND THEN + RAISE EXCEPTION 'rf_project_report id=% не существует', p_report_id; + END IF; + + INSERT INTO v3.form3_phase + (rf_project_report_id, phase_code, role, column_keys, opens_at, closes_at) + SELECT p_report_id, pt.phase_code, pt.role, + pt.column_keys, pt.opens_at, pt.closes_at + FROM v3.phase_template pt + WHERE pt.form_type = 'FORM_3' + AND pt.sheet = v_report_type + ON CONFLICT (rf_project_report_id, phase_code) DO NOTHING; + + GET DIAGNOSTICS v_inserted = ROW_COUNT; + RETURN v_inserted; +END; +$function$ +LANGUAGE plpgsql VOLATILE; + +CREATE OR REPLACE FUNCTION v3.user_in_report_org(p_user_id INT, p_report_id INT) +RETURNS BOOLEAN +AS $function$ +DECLARE + v_org INT; +BEGIN + SELECT p.org_unit_id + INTO v_org + FROM v3.rf_project_report r + JOIN v3.project p ON p.id = r.project_id + WHERE r.id = p_report_id; + + IF v_org IS NULL THEN + RETURN TRUE; -- проект без org_unit — пропускаем фильтр + END IF; + + RETURN EXISTS ( + SELECT 1 + FROM v3.user_org + WHERE user_id = p_user_id + AND org_unit_id = v_org + ); +END; +$function$ +LANGUAGE plpgsql STABLE; + +CREATE OR REPLACE FUNCTION v3.editable_columns_for3( + p_report_id INT, + p_user_id INT +) +RETURNS TABLE ( + column_key TEXT, + closes_at TIMESTAMPTZ +) +AS $function$ +DECLARE + v_role VARCHAR; +BEGIN + IF NOT EXISTS (SELECT 1 FROM v3.rf_project_report WHERE id = p_report_id) THEN + RAISE EXCEPTION 'rf_project_report id=% не существует', p_report_id; + END IF; + + v_role := v3.user_role_code(p_user_id); + IF v_role IS NULL THEN + RETURN; -- неизвестный/неактивный юзер → пустая маска + END IF; + + -- ADMIN: UNION всех column_keys всех фаз отчёта. + IF v_role = 'ADMIN' THEN + RETURN QUERY + SELECT ck AS column_key, + MAX(fp.closes_at) AS closes_at + FROM v3.form3_phase fp, + LATERAL unnest(fp.column_keys) AS ck + WHERE fp.rf_project_report_id = p_report_id + GROUP BY ck; + RETURN; + END IF; + + -- EXECUTOR_RF без назначения → пустая маска (default deny). + IF v_role = 'EXECUTOR_RF' AND NOT v3.user_in_report_org(p_user_id, p_report_id) THEN + RETURN; + END IF; + + RETURN QUERY + SELECT ck AS column_key, + MAX(fp.closes_at) AS closes_at + FROM v3.form3_phase fp, + LATERAL unnest(fp.column_keys) AS ck + WHERE fp.rf_project_report_id = p_report_id + AND fp.role = v_role + AND now() BETWEEN fp.opens_at AND fp.closes_at + GROUP BY ck; +END; +$function$ +LANGUAGE plpgsql STABLE; + +CREATE OR REPLACE FUNCTION v3.can_edit3( + p_report_id INT, + p_column_key TEXT, + p_user_id INT +) +RETURNS JSONB +AS $function$ +DECLARE + v_role VARCHAR; + v_active_close TIMESTAMPTZ; + v_role_has_col BOOLEAN; + v_next_open TIMESTAMPTZ; + v_last_close TIMESTAMPTZ; +BEGIN + IF NOT EXISTS (SELECT 1 FROM v3.rf_project_report WHERE id = p_report_id) THEN + RAISE EXCEPTION 'rf_project_report id=% не существует', p_report_id; + END IF; + + v_role := v3.user_role_code(p_user_id); + IF v_role IS NULL THEN + RETURN jsonb_build_object( + 'ok', false, + 'code', 'role_not_allowed', + 'detail', 'unknown or inactive user' + ); + END IF; + + -- ADMIN — bypass всех проверок. + IF v_role = 'ADMIN' THEN + RETURN jsonb_build_object('ok', true, 'admin', true); + END IF; + + -- EXECUTOR_RF: фильтр по user_org проекта отчёта. + IF v_role = 'EXECUTOR_RF' AND NOT v3.user_in_report_org(p_user_id, p_report_id) THEN + RETURN jsonb_build_object( + 'ok', false, + 'code', 'org_not_assigned', + 'detail', p_column_key + ); + END IF; + + -- 1. Активная сейчас фаза, в которой эта колонка перечислена для этой роли? + SELECT MAX(fp.closes_at) + INTO v_active_close + FROM v3.form3_phase fp + WHERE fp.rf_project_report_id = p_report_id + AND fp.role = v_role + AND p_column_key = ANY(fp.column_keys) + AND now() BETWEEN fp.opens_at AND fp.closes_at; + + IF v_active_close IS NOT NULL THEN + RETURN jsonb_build_object( + 'ok', true, + 'closes_at', v_active_close + ); + END IF; + + -- 2. Колонка В ПРИНЦИПЕ есть хоть в одной фазе этой роли на этом отчёте? + SELECT EXISTS ( + SELECT 1 + FROM v3.form3_phase fp + WHERE fp.rf_project_report_id = p_report_id + AND fp.role = v_role + AND p_column_key = ANY(fp.column_keys) + ) INTO v_role_has_col; + + IF NOT v_role_has_col THEN + RETURN jsonb_build_object( + 'ok', false, + 'code', 'role_not_allowed', + 'detail', p_column_key + ); + END IF; + + -- 3. Колонка доступна, но окно не активно. Подсказать ближайшее. + SELECT MIN(fp.opens_at) + INTO v_next_open + FROM v3.form3_phase fp + WHERE fp.rf_project_report_id = p_report_id + AND fp.role = v_role + AND p_column_key = ANY(fp.column_keys) + AND fp.opens_at > now(); + + IF v_next_open IS NOT NULL THEN + RETURN jsonb_build_object( + 'ok', false, + 'code', 'window_closed', + 'detail', p_column_key, + 'opens_at', v_next_open + ); + END IF; + + SELECT MAX(fp.closes_at) + INTO v_last_close + FROM v3.form3_phase fp + WHERE fp.rf_project_report_id = p_report_id + AND fp.role = v_role + AND p_column_key = ANY(fp.column_keys) + AND fp.closes_at <= now(); + + RETURN jsonb_build_object( + 'ok', false, + 'code', 'window_closed', + 'detail', p_column_key, + 'closes_at', v_last_close + ); +END; +$function$ +LANGUAGE plpgsql STABLE; + +-- ─── 3. Authz-обёртки upd_form3_cell/cells (доп. сигнатуры с p_user_id) ───── + +CREATE OR REPLACE FUNCTION v3.upd_form3_cells( + p_report_id INT, + p_changes JSONB, + p_user_id INT +) +RETURNS TABLE ( + row_type VARCHAR, + depth INT, + sort_order BIGINT, + data JSONB +) +AS $function$ +DECLARE + v_change JSONB; + v_column TEXT; + v_decision JSONB; + v_msg TEXT; +BEGIN + IF p_user_id IS NULL THEN + RAISE EXCEPTION 'role_not_allowed: '; + END IF; + + IF NOT EXISTS (SELECT 1 FROM v3.app_user WHERE id = p_user_id AND is_active) THEN + RAISE EXCEPTION 'role_not_allowed: unknown or inactive user %', p_user_id; + END IF; + + IF p_changes IS NULL OR jsonb_typeof(p_changes) <> 'array' THEN + RAISE EXCEPTION 'p_changes must be a JSONB array'; + END IF; + + FOR v_change IN SELECT * FROM jsonb_array_elements(p_changes) + LOOP + v_column := v_change->>'column'; + IF v_column IS NULL THEN + RAISE EXCEPTION 'change must have column: %', v_change; + END IF; + + v_decision := v3.can_edit3(p_report_id, v_column, p_user_id); + + IF NOT (v_decision->>'ok')::boolean THEN + IF v_decision->>'code' = 'role_not_allowed' THEN + RAISE EXCEPTION 'role_not_allowed: %', v_column; + + ELSIF v_decision->>'code' = 'org_not_assigned' THEN + RAISE EXCEPTION 'org_not_assigned: %', v_column; + + ELSIF v_decision->>'code' = 'window_closed' THEN + IF v_decision ? 'opens_at' THEN + v_msg := format('window_closed: %s (opens %s)', + v_column, v_decision->>'opens_at'); + ELSIF v_decision->>'closes_at' IS NOT NULL THEN + v_msg := format('window_closed: %s (closed %s)', + v_column, v_decision->>'closes_at'); + ELSE + v_msg := format('window_closed: %s (no phase)', v_column); + END IF; + RAISE EXCEPTION '%', v_msg; + + ELSE + RAISE EXCEPTION '%: %', v_decision->>'code', v_column; + END IF; + END IF; + END LOOP; + + RETURN QUERY + SELECT * FROM v3.upd_form3_cells(p_report_id, p_changes); +END; +$function$ +LANGUAGE plpgsql VOLATILE; + +CREATE OR REPLACE FUNCTION v3.upd_form3_cell( + p_report_id INT, + p_line_id INT, + p_column TEXT, + p_value JSONB, + p_user_id INT +) +RETURNS TABLE ( + row_type VARCHAR, + depth INT, + sort_order BIGINT, + data JSONB +) +AS $function$ + SELECT * FROM v3.upd_form3_cells( + p_report_id, + jsonb_build_array(jsonb_build_object( + 'line_id', p_line_id, + 'column', p_column, + 'value', p_value + )), + p_user_id + ); +$function$ +LANGUAGE sql VOLATILE; + +-- ─── 4. add_project — раскладка snapshot обоих отчётов ────────────────────── + +CREATE OR REPLACE FUNCTION v3.add_project( + p_name VARCHAR, + p_year INT, + p_org_unit_id INT, + p_level VARCHAR DEFAULT 'project', + p_parent_id INT DEFAULT NULL, + p_project_type VARCHAR DEFAULT NULL, + p_vsp_format VARCHAR DEFAULT NULL, + p_placement_type VARCHAR DEFAULT NULL, + p_object_address VARCHAR DEFAULT NULL, + p_staff_count INT DEFAULT NULL, + p_total_area NUMERIC DEFAULT NULL +) +RETURNS TABLE ( + project_id INT, + limit_report_id INT, + current_expenses_report_id INT +) +AS $function$ +DECLARE + v_pid INT; + v_lim INT; + v_cur INT; +BEGIN + IF p_name IS NULL OR length(trim(p_name)) = 0 THEN + RAISE EXCEPTION 'p_name обязателен'; + END IF; + IF p_year IS NULL THEN + RAISE EXCEPTION 'p_year обязателен'; + END IF; + IF p_org_unit_id IS NULL THEN + RAISE EXCEPTION 'p_org_unit_id обязателен'; + END IF; + IF NOT EXISTS (SELECT 1 FROM v3.org_unit WHERE id = p_org_unit_id) THEN + RAISE EXCEPTION 'org_unit id=% не существует', p_org_unit_id; + END IF; + IF p_parent_id IS NOT NULL AND + NOT EXISTS (SELECT 1 FROM v3.project WHERE id = p_parent_id AND level = 'program') THEN + RAISE EXCEPTION 'parent project id=% не существует или не имеет level=program', p_parent_id; + END IF; + + INSERT INTO v3.project ( + name, level, parent_id, org_unit_id, + project_type, vsp_format, placement_type, object_address, staff_count, total_area + ) VALUES ( + p_name, p_level, p_parent_id, p_org_unit_id, + p_project_type, p_vsp_format, p_placement_type, p_object_address, p_staff_count, p_total_area + ) RETURNING id INTO v_pid; + + INSERT INTO v3.rf_project_report (project_id, year, report_type) + VALUES (v_pid, p_year, 'LIMIT') RETURNING id INTO v_lim; + INSERT INTO v3.rf_project_report (project_id, year, report_type) + VALUES (v_pid, p_year, 'CURRENT_EXPENSES') RETURNING id INTO v_cur; + + -- Snapshot RBAC-фаз (иначе default deny — отчёт read-only). + PERFORM v3.copy_template_to_report(v_lim); + PERFORM v3.copy_template_to_report(v_cur); + + PERFORM v3.log_event( + 'PROJECT_CREATE', 'PROJECT_CREATE', + jsonb_strip_nulls(jsonb_build_object( + 'project_id', v_pid, + 'name', p_name, + 'year', p_year, + 'level', p_level, + 'parent_id', p_parent_id, + 'org_unit_id', p_org_unit_id, + 'project_type', p_project_type, + 'vsp_format', p_vsp_format, + 'placement_type', p_placement_type, + 'object_address', p_object_address, + 'staff_count', p_staff_count, + 'total_area', p_total_area, + 'limit_report_id', v_lim, + 'current_expenses_report_id', v_cur + )) + ); + + RETURN QUERY SELECT v_pid, v_lim, v_cur; +END; +$function$ +LANGUAGE plpgsql VOLATILE; + diff --git a/api/alembic/versions/sql/0003_initial_data.sql b/api/alembic/versions/sql/0003_initial_data.sql index 6c98e5e..bef1b34 100644 --- a/api/alembic/versions/sql/0003_initial_data.sql +++ b/api/alembic/versions/sql/0003_initial_data.sql @@ -4250,4 +4250,29 @@ INSERT INTO v3.expense_item_form_type (expense_item_id,form_type_code) VALUES INSERT INTO v3.expense_item_form_type (expense_item_id,form_type_code) VALUES (798,'FORM_3'); -REFRESH MATERIALIZED VIEW CONCURRENTLY v3.mv_expense_item_tree; \ No newline at end of file +REFRESH MATERIALIZED VIEW CONCURRENTLY v3.mv_expense_item_tree; + + +-- ─── 5. Seed фаз FORM_3 (идемпотентно, только FORM_3) ────────────────────── +-- DELETE скоупится на FORM_3 → фазы FORM_1/2/4 не затрагиваются. +DELETE FROM v3.phase_template WHERE form_type = 'FORM_3'; + +INSERT INTO v3.phase_template + (form_type, sheet, phase_code, role, column_keys, opens_at, closes_at) +SELECT 'FORM_3', sh, 'RF_FILL_2026', 'EXECUTOR_RF', + ARRAY[ + 'q1.adj_by_items','q1.adj_increase','q1.m1','q1.m2','q1.m3', + 'q2.adj_by_items','q2.adj_increase','q2.m1','q2.m2','q2.m3', + 'q3.adj_by_items','q3.adj_increase','q3.m1','q3.m2','q3.m3', + 'q4.adj_by_items','q4.adj_increase','q4.m1','q4.m2','q4.m3','q4.spod' + ], + '2026-01-01 00:00:00+00'::timestamptz, + '2026-12-31 23:59:59+00'::timestamptz +FROM (VALUES ('LIMIT'), ('CURRENT_EXPENSES')) AS s(sh); + +-- ─── 6. Backfill v3.form3_phase для существующих отчётов ──────────────────── +-- ON CONFLICT DO NOTHING внутри copy_template_to_report → повторный прогон +-- ничего не дублирует. +SELECT id, v3.copy_template_to_report(id) AS phases_inserted + FROM v3.rf_project_report + ORDER BY id; \ No newline at end of file diff --git a/api/src/db/models/__init__.py b/api/src/db/models/__init__.py index b1130b0..d8e60fa 100644 --- a/api/src/db/models/__init__.py +++ b/api/src/db/models/__init__.py @@ -10,6 +10,7 @@ from src.db.models.collegial_approval import CollegialApproval from src.db.models.contract_detail import ContractDetail from src.db.models.contract_summary import ContractSummary from src.db.models.expense_item import ExpenseItem +from src.db.models.form3_phase import Form3Phase from src.db.models.form_limit import FormLimit from src.db.models.form_phase import FormPhase from src.db.models.form_type import FormType diff --git a/api/src/db/models/form3_phase.py b/api/src/db/models/form3_phase.py new file mode 100644 index 0000000..efccb10 --- /dev/null +++ b/api/src/db/models/form3_phase.py @@ -0,0 +1,27 @@ +from datetime import datetime + +from sqlalchemy import ARRAY, CheckConstraint, DateTime, ForeignKey, Index, Integer, String, Text, text +from sqlalchemy.orm import Mapped, mapped_column + +from src.db.base import Base + + +class Form3Phase(Base): + __tablename__ = "form3_phase" + __table_args__ = ( + CheckConstraint(text("cardinality(column_keys) > 0"), name="chk_v3_form3_phase_columns"), + CheckConstraint(text("role != 'ADMIN'"), name="chk_v3_form3_phase_no_admin"), + CheckConstraint(text("closes_at > opens_at"), name="chk_v3_form3_phase_window"), + Index("ix_v3_form3_phase_active", "rf_project_report_id", "role", "opens_at", "closes_at"), + Index("ix_v3_form3_phase_columns_gin", "column_keys", postgresql_using="gin"), + {"schema": "v3"}, + ) + + rf_project_report_id: Mapped[int] = mapped_column( + Integer, ForeignKey("v3.rf_project_report.id", ondelete="CASCADE"), primary_key=True + ) + phase_code: Mapped[str] = mapped_column(String, primary_key=True) + role: Mapped[str] = mapped_column(String, ForeignKey("v3.role.code")) + column_keys: Mapped[list[str]] = mapped_column(ARRAY(Text)) + opens_at: Mapped[datetime] = mapped_column(DateTime(timezone=True)) + closes_at: Mapped[datetime] = mapped_column(DateTime(timezone=True)) diff --git a/api/tests/sqls/fixture.sql b/api/tests/sqls/fixture.sql index c587bf6..8e6ac01 100644 --- a/api/tests/sqls/fixture.sql +++ b/api/tests/sqls/fixture.sql @@ -26,7 +26,8 @@ SELECT setval('v3.budget_line_id_seq', 1); INSERT INTO v3.form_phase (budget_form_id,sheet,phase_code,"role",column_keys,opens_at,closes_at) VALUES (1,'AHR','test','DFIP','{{plan.q1}}','2026-05-05 03:00:00+03','2026-06-06 03:00:00+03'); -INSERT INTO v3.vsp (id,branch_id,reg_number,address,format,opened_at,placement_type,staff_count,total_area,closed_at,is_active,updated_at,is_deleted,created_at,created_by,system_code,updated_by,vsp_type,notes,location_form,rent_contract_num,rent_end_date) VALUES - (1,2,'Тестовый всп 1','Тестовая 12','укукк','2026-05-07','ывс',2026,230,'2026-06-16',false,'2026-06-18 15:46:38.611903',false,'2026-06-04 14:36:59.737727',1,'1233',91,'','','встроенное помещение','',NULL), - (2,2,'Test12 -----','Тестовая 125','формат 15 ','2026-06-08',NULL,NULL,58,NULL,true,'2026-06-16 18:53:17.986651',false,'2026-06-09 09:04:33.29858',91,'123-1234',91,'субаренда','Работает ','аренда','12-45','2026-10-02'); -SELECT setval('v3.vsp_id_seq', 2); +INSERT INTO v3.vsp (id,branch_id,reg_number,address,format,opened_at,placement_type,staff_count,total_area,closed_at,is_active,updated_at,is_deleted,created_at,created_by,system_code,updated_by,vsp_type,notes,rent_contract_num,rent_end_date) VALUES + (1,2,'Тестовый всп 1','Тестовая 12','укукк','2026-05-07','ывс',2026,230,'2026-06-16',false,'2026-06-18 15:46:38.611903',false,'2026-06-04 14:36:59.737727',1,'1233',91,'','','',NULL), + (2,2,'Test12 -----','Тестовая 125','формат 15 ','2026-06-08',NULL,NULL,58,NULL,true,'2026-06-16 18:53:17.986651',false,'2026-06-09 09:04:33.29858',91,'123-1234',91,'субаренда','Работает ','12-45','2026-10-02'), + (3,2,'3434','победы 12','формат','2026-06-01','субаренда', NULL,34,NULL,true,'2026-07-01 13:32:35.327097',false,'2026-06-29 15:53:50.236062',91,'3434',NULL,'2','примечание','567','2026-07-01'); +SELECT setval('v3.vsp_id_seq', 3); From 4ec4936a0f86c2e1839597b3f8d6ac4bc6f85ca3 Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Thu, 2 Jul 2026 09:59:16 +0300 Subject: [PATCH 08/20] =?UTF-8?q?websocket-projects:=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20line?= =?UTF-8?q?=5Fid,=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/api/v1/websocket.py | 35 +++++++++++++---- api/src/repository/budget_line_repository.py | 2 +- .../rf_project_report_line_repository.py | 39 +++++++++++++++++++ .../rf_project_report_repository.py | 33 ++++++++++++++++ .../rf_project_report_line_service.py | 34 ++++++++++++++++ api/src/services/rf_project_report_service.py | 31 +++++++++++++++ 6 files changed, 165 insertions(+), 9 deletions(-) create mode 100644 api/src/repository/rf_project_report_line_repository.py create mode 100644 api/src/repository/rf_project_report_repository.py create mode 100644 api/src/services/rf_project_report_line_service.py create mode 100644 api/src/services/rf_project_report_service.py diff --git a/api/src/api/v1/websocket.py b/api/src/api/v1/websocket.py index d23a114..662b57c 100644 --- a/api/src/api/v1/websocket.py +++ b/api/src/api/v1/websocket.py @@ -14,6 +14,8 @@ from sqlalchemy.exc import IntegrityError from fastapi import APIRouter, WebSocket, WebSocketDisconnect, status from sqlalchemy.ext.asyncio import AsyncSession +from src.services.rf_project_report_service import RfProjectReportService +from src.services.rf_project_report_line_service import RfProjectReportLineService from src.repository.user_repository import UserRepository from src.services.budget_line_service import BudgetLineService from src.api.v1.deps import get_user_by_token @@ -490,7 +492,8 @@ class FormEventProcess: class ProjectEventProcess: def __init__(self, db: AsyncSession): self.project_service: ProjectService = ProjectService(db) - self.bf_service: BudgetFormService = BudgetFormService(db) + self.prl_service: RfProjectReportLineService = RfProjectReportLineService(db) + self.pr_service: RfProjectReportService = RfProjectReportService(db) self.user_service: UserService = UserService(db) async def process( @@ -573,11 +576,16 @@ class ProjectEventProcess: expense_item_id: Optional[int] = None } """ - project = await self.project_service.get(project_id=project_id, user=user) - if not project: + project_report = await self.pr_service.get( + year=year, + report_type=report_type, + project_id=project_id, + ) + if not project_report: return None - - return await self.project_service.add_form3_line( + + ids = await self.prl_service.get_ids(project_report_id=project_report.id) + result = await self.project_service.add_form3_line( project_id=project_id, year=year, report_type=report_type, @@ -585,6 +593,16 @@ class ProjectEventProcess: user=user, ) + final_result = { + "data": result, + "new_line_id": None, + } + for el in result: + if el[3]["line_id"] and el[3]["line_id"] not in ids: + final_result["new_line_id"] = el[3]["line_id"] + return final_result + return final_result + async def __del_row( self, event_data: dict, @@ -595,7 +613,7 @@ class ProjectEventProcess: ) -> list[tuple]: """ data = { - "line_id": int, + "row_id": int, } """ project = await self.project_service.get(project_id=project_id, user=user) @@ -606,7 +624,7 @@ class ProjectEventProcess: project_id=project_id, year=year, report_type=report_type, - line_id=event_data["line_id"], + line_id=event_data["row_id"], user=user, ) @@ -776,6 +794,7 @@ async def process_websocket( async with get_db_session(user_id=user_id) as db: processor = processor_cls(db) t0 = time.perf_counter() + data_old = data.copy() data["result"] = await processor.process( event_data=data, user_id=user_id, @@ -789,7 +808,7 @@ async def process_websocket( "time_ms": f"{db_ms:.2f}", "event": data.get("event"), } - extra.update(data) + extra.update(data_old) logger.info( f"db_time: {extra}", extra=extra, diff --git a/api/src/repository/budget_line_repository.py b/api/src/repository/budget_line_repository.py index 0ca3c71..ed113c0 100644 --- a/api/src/repository/budget_line_repository.py +++ b/api/src/repository/budget_line_repository.py @@ -12,7 +12,7 @@ class BudgetLineRepository: query = select(BudgetLine).where(BudgetLine.id == budget_line_id).limit(1) return (await self.db.execute(query)).scalar_one_or_none() - async def get_list(self, budget_line_ids: list[int]) -> BudgetLine | None: + async def get_list(self, budget_line_ids: list[int]) -> list[BudgetLine]: query = select(BudgetLine).where(BudgetLine.id.in_(budget_line_ids)) return (await self.db.execute(query)).scalars().all() diff --git a/api/src/repository/rf_project_report_line_repository.py b/api/src/repository/rf_project_report_line_repository.py new file mode 100644 index 0000000..3ec5abe --- /dev/null +++ b/api/src/repository/rf_project_report_line_repository.py @@ -0,0 +1,39 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.models.rf_project_report_line import RfProjectReportLine + + + +class RfProjectReportLineRepository: + def __init__(self, db: AsyncSession): + self.db = db + + async def get(self, line_id: int) -> RfProjectReportLine | None: + query = select( + RfProjectReportLine + ).where( + RfProjectReportLine.id == line_id + ).limit(1) + return (await self.db.execute(query)).scalar_one_or_none() + + async def get_list(self, line_ids: list[int]) -> list[RfProjectReportLine]: + query = select( + RfProjectReportLine + ).where( + RfProjectReportLine.id.in_(line_ids) + ) + return (await self.db.execute(query)).scalars().all() + + async def get_ids( + self, + project_report_id: int, + ) -> list[int]: + + query = select( + RfProjectReportLine.id + ).where( + RfProjectReportLine.rf_project_report_id == project_report_id + ) + return (await self.db.execute(query)).scalars().all() + diff --git a/api/src/repository/rf_project_report_repository.py b/api/src/repository/rf_project_report_repository.py new file mode 100644 index 0000000..6337a80 --- /dev/null +++ b/api/src/repository/rf_project_report_repository.py @@ -0,0 +1,33 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.models.rf_project_report import RfProjectReport + + + +class RfProjectReportRepository: + def __init__(self, db: AsyncSession): + self.db = db + + async def get( + self, + report_id: int | None = None, + year: int | None = None, + report_type: str | None = None, + project_id: int | None = None, + ) -> RfProjectReport | None: + assert report_id is not None or all((el is not None for el in (year, report_type, project_id))) + query = select( + RfProjectReport + ) + if report_id is not None: + query = query.where(RfProjectReport.id == report_id) + else: + query = query.where( + RfProjectReport.year == year, + RfProjectReport.report_type == report_type, + RfProjectReport.project_id == project_id + ) + + query = query.limit(1) + return (await self.db.execute(query)).scalar_one_or_none() diff --git a/api/src/services/rf_project_report_line_service.py b/api/src/services/rf_project_report_line_service.py new file mode 100644 index 0000000..e29c48d --- /dev/null +++ b/api/src/services/rf_project_report_line_service.py @@ -0,0 +1,34 @@ + +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.models.rf_project_report_line import RfProjectReportLine +from src.repository.rf_project_report_line_repository import RfProjectReportLineRepository +from src.db.models.app_user import AppUser + + + + +class RfProjectReportLineService: + def __init__(self, db: AsyncSession): + self.db = db + self.prl_repo = RfProjectReportLineRepository(db) + + async def get( + self, + user: AppUser, + line_id: int, + ) -> RfProjectReportLine | None: + return await self.prl_repo.get(line_id=line_id) + + async def get_list( + self, + user: AppUser, + line_ids: list[int], + ) -> list[RfProjectReportLine]: + return await self.prl_repo.get_list(line_ids=line_ids) + + async def get_ids( + self, + project_report_id: int, + ) -> list[int]: + return await self.prl_repo.get_ids(project_report_id=project_report_id) diff --git a/api/src/services/rf_project_report_service.py b/api/src/services/rf_project_report_service.py new file mode 100644 index 0000000..293bf03 --- /dev/null +++ b/api/src/services/rf_project_report_service.py @@ -0,0 +1,31 @@ + +from sqlalchemy.ext.asyncio import AsyncSession + +from src.db.models.rf_project_report import RfProjectReport +from src.repository.rf_project_report_repository import RfProjectReportRepository +from src.db.models.rf_project_report_line import RfProjectReportLine +from src.repository.rf_project_report_line_repository import RfProjectReportLineRepository +from src.db.models.app_user import AppUser + + + + +class RfProjectReportService: + def __init__(self, db: AsyncSession): + self.db = db + self.pr_repo = RfProjectReportRepository(db) + + async def get( + self, + user: AppUser| None = None, + report_id: int | None = None, + year: int | None = None, + report_type: str | None = None, + project_id: int | None = None, + ) -> RfProjectReport | None: + return await self.pr_repo.get( + report_id=report_id, + year=year, + report_type=report_type, + project_id=project_id, + ) From 40c373b5ed9b2c1b169fec5ba67282ab0f7f7106 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 2 Jul 2026 14:43:35 +0300 Subject: [PATCH 09/20] projects --- web/src/api/dict-vsp.js | 6 +- web/src/api/projects.js | 17 +- web/src/app/Routes.jsx | 2 +- .../RealtimeTable/RealtimeTable.jsx | 8 +- .../SettingPanel/SettingPanel.jsx | 66 +- .../RealtimeTable/constants/FORM_2/AHR.js | 5481 ++++++++--------- .../RealtimeTable/constants/FORM_2/CAP.js | 736 +-- .../RealtimeTable/constants/FORM_2/OPER.js | 973 ++- .../RealtimeTable/constants/FORM_3/LP.js | 555 -- .../RealtimeTable/constants/FORM_3/PROJECT.js | 577 -- .../RealtimeTable/constants/FORM_3/TR.js | 555 -- .../constants/PROJECT/CURRENT_EXPENSES.js | 1003 +++ .../RealtimeTable/constants/PROJECT/LIMIT.js | 1003 +++ .../RealtimeTable/contexts/RealtimeContext.js | 40 +- .../RealtimeTable/hooks/useRealtimeData.js | 8 +- .../RealtimeTable/hooks/useWebSocket.js | 15 - .../components/common/NavigationToggle.jsx | 33 + web/src/components/common/PaginatedList.jsx | 70 +- .../components/common/TableList/TableList.jsx | 9 +- web/src/pages/NewFormTablePage.jsx | 20 +- web/src/pages/ProjectsPage/ProjectsPage.jsx | 114 +- web/src/pages/StyledForPage.jsx | 3 +- web/src/pages/TaskPage/TaskPage.jsx | 4 +- web/src/pages/TasksPage/TasksPage.jsx | 10 +- web/src/utils/exportFile.js | 64 + web/src/utils/exportForm.js | 48 - 26 files changed, 5811 insertions(+), 5609 deletions(-) delete mode 100644 web/src/components/RealtimeTable/constants/FORM_3/LP.js delete mode 100644 web/src/components/RealtimeTable/constants/FORM_3/PROJECT.js delete mode 100644 web/src/components/RealtimeTable/constants/FORM_3/TR.js create mode 100644 web/src/components/RealtimeTable/constants/PROJECT/CURRENT_EXPENSES.js create mode 100644 web/src/components/RealtimeTable/constants/PROJECT/LIMIT.js create mode 100644 web/src/components/common/NavigationToggle.jsx create mode 100644 web/src/utils/exportFile.js delete mode 100644 web/src/utils/exportForm.js diff --git a/web/src/api/dict-vsp.js b/web/src/api/dict-vsp.js index 6bf40c6..43cf247 100644 --- a/web/src/api/dict-vsp.js +++ b/web/src/api/dict-vsp.js @@ -21,7 +21,7 @@ export const DictVspApi = { responseType: "blob", }); }, - getDropdownVsp(params){ - return api.get(`/dict/info/dropdown`, params).then((r) => r.data); - } + getDropdownVsp(params) { + return api.get(`/dict/info/dropdown`, { params }).then((r) => r.data); + }, }; diff --git a/web/src/api/projects.js b/web/src/api/projects.js index ae05081..1e2397f 100644 --- a/web/src/api/projects.js +++ b/web/src/api/projects.js @@ -21,19 +21,14 @@ export const ProjectsApi = { return api.delete(`/projects/${id}`).then((r) => r.data); }, - getTasks: (projectId) => { - return api.get(`/projects/${projectId}/tasks`).then((r) => r.data); - }, - - addTask: (projectId, taskId) => { + getTableData: (id, sheetName, year) => { return api - .post(`/projects/${projectId}/tasks/${taskId}`) + .get(`/projects/${id}/report/${year}/${sheetName}`) .then((r) => r.data); }, - - removeTask: (projectId, taskId) => { - return api - .delete(`/projects/${projectId}/tasks/${taskId}`) - .then((r) => r.data); + export: (id, year, sheetName) => { + return api.get(`/export/project/${id}/report/${year}/${sheetName}`, { + responseType: "blob", + }); }, }; diff --git a/web/src/app/Routes.jsx b/web/src/app/Routes.jsx index 4387604..d0945a3 100644 --- a/web/src/app/Routes.jsx +++ b/web/src/app/Routes.jsx @@ -52,7 +52,7 @@ export const AppRoutes = () => { } /> } /> } /> - } /> + } /> diff --git a/web/src/components/RealtimeTable/RealtimeTable.jsx b/web/src/components/RealtimeTable/RealtimeTable.jsx index 6041ca3..b307303 100644 --- a/web/src/components/RealtimeTable/RealtimeTable.jsx +++ b/web/src/components/RealtimeTable/RealtimeTable.jsx @@ -29,8 +29,8 @@ import { additionVspRowTable } from './constants/addingRowConfig'; import { SelectVspModal } from './Modals/SelectVspModal'; import { getRowId } from './utils/rowUtils'; -const RealtimeTable = ({ formType, formId, sheetName, direction }) => { - const { data, setData, isLoading: isTableLoading, editingCells: dataEditingCells } = useRealtimeData(formId, sheetName, direction); +const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => { + const { data, setData, isLoading: isTableLoading, editingCells: dataEditingCells } = useRealtimeData(formId, sheetName, direction, formType, year); const [globalFilter, setGlobalFilter] = useState(''); const [showColumnFilters, setShowColumnFilters] = useState(false); const [selectedColumnId, setSelectedColumnId] = useState(); @@ -360,6 +360,8 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { formId={formId} sheetName={sheetName} direction={direction} + year={year} + isProject={formType == 'PROJECT'} />
@@ -420,8 +422,6 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { onClose={() => setIsOpenModalSelectVsp(false)} formId={formId} onSelect={handleAddVspRow} - // vspOptions={} - // selectedVSP={} title="Выбор ВСП" /> diff --git a/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx b/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx index 5725c84..3347501 100644 --- a/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx +++ b/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx @@ -18,7 +18,7 @@ import CollapsibleTree from '../../common/CollapsibleTree'; import ZoomSlider from './ZoomSlider'; import SearchComponent from '../../common/SearchComponent'; import { ExportDefaultButton } from '../../common/Buttons/ButtonsActions'; -import { exportSheet } from '../../../utils/exportForm'; +import { exportSheet, exportSheetProject } from '../../../utils/exportFile'; const SettingPanel = ({ selectedColumnId, @@ -39,6 +39,8 @@ const SettingPanel = ({ formId, sheetName, direction, + year, + isProject, }) => { const [isPinned, setIsPinned] = useState(false); const [isExporting, setIsExporting] = useState(false); @@ -76,7 +78,16 @@ const SettingPanel = ({ const handleClickDeleteFormula = () => { }; const handleExport = async () => { - if (!formId || !sheetName || isExporting) return; + if (isExporting) return; + if (isProject) { + if (!formId || !sheetName || !year) return; + setIsExporting(true); + await exportSheetProject(formId, sheetName, year); + setIsExporting(false); + return; + } + + if (!formId || !sheetName) return; setIsExporting(true); await exportSheet(formId, sheetName, direction); setIsExporting(false); @@ -115,40 +126,27 @@ const SettingPanel = ({ - - - - - - - - + {!isProject ?? + <> + + + + + + + + - - - - - - - - - {/* - - - - - - - - - - - - - - - */} + + + + + + + + + } {columns ? ( diff --git a/web/src/components/RealtimeTable/constants/FORM_2/AHR.js b/web/src/components/RealtimeTable/constants/FORM_2/AHR.js index 269dd80..f351d21 100644 --- a/web/src/components/RealtimeTable/constants/FORM_2/AHR.js +++ b/web/src/components/RealtimeTable/constants/FORM_2/AHR.js @@ -1,3227 +1,3190 @@ -import { - greenColumn, - whiteColumn, - orangeColumn, - yellowColumn, - redColumn, - blueColumn, -} from "../columnColors"; -export const config = { - config: { - colors: { - "data.header.section_code": { - color_type: greenColumn, - accessorKey: "data.header.section_code", - }, - "data.header.item_id": { - color_type: greenColumn, - accessorKey: "data.header.item_id", - }, - "data.header.num_group": { - color_type: greenColumn, - accessorKey: "data.header.num_group", - }, - "data.header.name": { - color_type: greenColumn, - accessorKey: "data.header.name", - }, - "data.header.vsp_id": { - color_type: greenColumn, - accessorKey: "data.header.vsp_id", - }, - "data.plan.q1": { - color_type: greenColumn, - accessorKey: "data.plan.q1", - }, - "data.plan.q2": { - color_type: greenColumn, - accessorKey: "data.plan.q2", - }, - "data.plan.q3": { - color_type: greenColumn, - accessorKey: "data.plan.q3", - }, - "data.plan.q4": { - color_type: greenColumn, - accessorKey: "data.plan.q4", - }, - "data.plan.year": { - color_type: greenColumn, - accessorKey: "data.plan.year", - }, - "data.plan.comment": { - color_type: greenColumn, - accessorKey: "data.plan.comment", - }, - "data.2026_god_field_field": { - color_type: whiteColumn, - accessorKey: "data.2026_god_field_field", - }, - "data.totals.fact_year": { - color_type: greenColumn, - accessorKey: "data.totals.fact_year", - }, - "data.totals.pay_year": { - color_type: blueColumn, - accessorKey: "data.totals.pay_year", - }, - "data.seq_dfip.q1": { - color_type: greenColumn, - accessorKey: "data.seq_dfip.q1", - }, - "data.seq_dfip.q2": { - color_type: greenColumn, - accessorKey: "data.seq_dfip.q2", - }, - "data.seq_dfip.q3": { - color_type: greenColumn, - accessorKey: "data.seq_dfip.q3", - }, - "data.seq_dfip.q4": { - color_type: greenColumn, - accessorKey: "data.seq_dfip.q4", - }, - "data.seq_dfip.year": { - color_type: greenColumn, - accessorKey: "data.seq_dfip.year", - }, - "data.seq_dfip.justification": { - color_type: greenColumn, - accessorKey: "data.seq_dfip.justification", - }, - "data.seq_ssp.q1": { - color_type: greenColumn, - accessorKey: "data.seq_ssp.q1", - }, - "data.seq_ssp.q2": { - color_type: greenColumn, - accessorKey: "data.seq_ssp.q2", - }, - "data.seq_ssp.q3": { - color_type: greenColumn, - accessorKey: "data.seq_ssp.q3", - }, - "data.seq_ssp.q4": { - color_type: greenColumn, - accessorKey: "data.seq_ssp.q4", - }, - "data.seq_ssp.year": { - color_type: greenColumn, - accessorKey: "data.seq_ssp.year", + + import { + greenColumn, + whiteColumn, + orangeColumn, + yellowColumn, + redColumn, + blueColumn, + } from '../columnColors'; + export const config = { + "config":{ + "colors":{ + "data.header.section_code":{ + "color_type":greenColumn, + "accessorKey":"data.header.section_code" + }, + "data.header.item_id":{ + "color_type":greenColumn, + "accessorKey":"data.header.item_id" + }, + "data.header.num_group":{ + "color_type":greenColumn, + "accessorKey":"data.header.num_group" + }, + "data.header.name":{ + "color_type":greenColumn, + "accessorKey":"data.header.name" + }, + "data.header.vsp_id":{ + "color_type":greenColumn, + "accessorKey":"data.header.vsp_id" + }, + "data.plan.q1":{ + "color_type":greenColumn, + "accessorKey":"data.plan.q1" + }, + "data.plan.q2":{ + "color_type":greenColumn, + "accessorKey":"data.plan.q2" + }, + "data.plan.q3":{ + "color_type":greenColumn, + "accessorKey":"data.plan.q3" + }, + "data.plan.q4":{ + "color_type":greenColumn, + "accessorKey":"data.plan.q4" + }, + "data.plan.year":{ + "color_type":greenColumn, + "accessorKey":"data.plan.year" + }, + "data.plan.comment":{ + "color_type":greenColumn, + "accessorKey":"data.plan.comment" + }, + "2026_god_field_field":{ + "color_type":whiteColumn, + "accessorKey":"2026_god_field_field" + }, + "data.seq_dfip.q1":{ + "color_type":greenColumn, + "accessorKey":"data.seq_dfip.q1" + }, + "data.seq_dfip.q2":{ + "color_type":greenColumn, + "accessorKey":"data.seq_dfip.q2" + }, + "data.seq_dfip.q3":{ + "color_type":greenColumn, + "accessorKey":"data.seq_dfip.q3" + }, + "data.seq_dfip.q4":{ + "color_type":greenColumn, + "accessorKey":"data.seq_dfip.q4" + }, + "data.seq_dfip.year":{ + "color_type":greenColumn, + "accessorKey":"data.seq_dfip.year" + }, + "data.seq_dfip.justification":{ + "color_type":greenColumn, + "accessorKey":"data.seq_dfip.justification" + }, + "data.seq_ssp.q1":{ + "color_type":greenColumn, + "accessorKey":"data.seq_ssp.q1" + }, + "data.seq_ssp.q2":{ + "color_type":greenColumn, + "accessorKey":"data.seq_ssp.q2" + }, + "data.seq_ssp.q3":{ + "color_type":greenColumn, + "accessorKey":"data.seq_ssp.q3" + }, + "data.seq_ssp.q4":{ + "color_type":greenColumn, + "accessorKey":"data.seq_ssp.q4" + }, + "data.seq_ssp.year":{ + "color_type":greenColumn, + "accessorKey":"data.seq_ssp.year" + }, + "data.seq_ssp.justification":{ + "color_type":greenColumn, + "accessorKey":"data.seq_ssp.justification" + }, + "data.approved.q1":{ + "color_type":greenColumn, + "accessorKey":"data.approved.q1" }, - "data.seq_ssp.justification": { - color_type: greenColumn, - accessorKey: "data.seq_ssp.justification", + "data.approved.q2":{ + "color_type":greenColumn, + "accessorKey":"data.approved.q2" }, - "data.approved.q1": { - color_type: greenColumn, - accessorKey: "data.approved.q1", + "data.approved.q3":{ + "color_type":greenColumn, + "accessorKey":"data.approved.q3" }, - "data.approved.q2": { - color_type: greenColumn, - accessorKey: "data.approved.q2", + "data.approved.q4":{ + "color_type":greenColumn, + "accessorKey":"data.approved.q4" }, - "data.approved.q3": { - color_type: greenColumn, - accessorKey: "data.approved.q3", + "data.approved.year":{ + "color_type":greenColumn, + "accessorKey":"data.approved.year" }, - "data.approved.q4": { - color_type: greenColumn, - accessorKey: "data.approved.q4", + "data.contract.counterparty":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.counterparty" }, - "data.approved.year": { - color_type: greenColumn, - accessorKey: "data.approved.year", + "data.contract.reference":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.reference" }, - "data.contract.counterparty": { - color_type: orangeColumn, - accessorKey: "data.contract.counterparty", + "data.contract.date":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.date" }, - "data.contract.reference": { - color_type: orangeColumn, - accessorKey: "data.contract.reference", + "data.contract.subject":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.subject" }, - "data.contract.date": { - color_type: orangeColumn, - accessorKey: "data.contract.date", + "data.contract.currency":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.currency" }, - "data.contract.subject": { - color_type: orangeColumn, - accessorKey: "data.contract.subject", + "data.contract.ceiling":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.ceiling" }, - "data.contract.currency": { - color_type: orangeColumn, - accessorKey: "data.contract.currency", + "data.contract.vat_rate":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.vat_rate" }, - "data.contract.ceiling": { - color_type: orangeColumn, - accessorKey: "data.contract.ceiling", + "data.contract.deadline":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.deadline" }, - "data.contract.vat_rate": { - color_type: orangeColumn, - accessorKey: "data.contract.vat_rate", + "data.contract.scheme":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.scheme" }, - "data.contract.deadline": { - color_type: orangeColumn, - accessorKey: "data.contract.deadline", + "data.contract.act":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.act" }, - "data.contract.scheme": { - color_type: orangeColumn, - accessorKey: "data.contract.scheme", + "data.contract.comment":{ + "color_type":orangeColumn, + "accessorKey":"data.contract.comment" }, - "data.contract.act": { - color_type: orangeColumn, - accessorKey: "data.contract.act", + "data.booking.y2026.q1":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2026.q1" }, - "data.contract.comment": { - color_type: orangeColumn, - accessorKey: "data.contract.comment", + "data.booking.y2026.q2":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2026.q2" }, - "data.booking.y2026.q1": { - color_type: orangeColumn, - accessorKey: "data.booking.y2026.q1", + "data.booking.y2026.q3":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2026.q3" }, - "data.booking.y2026.q2": { - color_type: orangeColumn, - accessorKey: "data.booking.y2026.q2", + "data.booking.y2026.q4":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2026.q4" }, - "data.booking.y2026.q3": { - color_type: orangeColumn, - accessorKey: "data.booking.y2026.q3", + "data.booking.y2027.q1":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2027.q1" }, - "data.booking.y2026.q4": { - color_type: orangeColumn, - accessorKey: "data.booking.y2026.q4", + "data.booking.y2027.q2":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2027.q2" }, - "data.booking.y2027.q1": { - color_type: orangeColumn, - accessorKey: "data.booking.y2027.q1", + "data.booking.y2027.q3":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2027.q3" }, - "data.booking.y2027.q2": { - color_type: orangeColumn, - accessorKey: "data.booking.y2027.q2", + "data.booking.y2027.q4":{ + "color_type":orangeColumn, + "accessorKey":"data.booking.y2027.q4" }, - "data.booking.y2027.q3": { - color_type: orangeColumn, - accessorKey: "data.booking.y2027.q3", + "data.q1.adj_current":{ + "color_type":yellowColumn, + "accessorKey":"data.q1.adj_current" }, - "data.booking.y2027.q4": { - color_type: orangeColumn, - accessorKey: "data.booking.y2027.q4", + "data.q1.adj_ssp":{ + "color_type":yellowColumn, + "accessorKey":"data.q1.adj_ssp" }, - "data.q1.adj_current": { - color_type: yellowColumn, - accessorKey: "data.q1.adj_current", + "data.q1.adj_reserve":{ + "color_type":yellowColumn, + "accessorKey":"data.q1.adj_reserve" }, - "data.q1.adj_ssp": { - color_type: yellowColumn, - accessorKey: "data.q1.adj_ssp", + "data.q1.adj_comment":{ + "color_type":yellowColumn, + "accessorKey":"data.q1.adj_comment" }, - "data.q1.adj_reserve": { - color_type: yellowColumn, - accessorKey: "data.q1.adj_reserve", + "data.q1.corrected_plan":{ + "color_type":yellowColumn, + "accessorKey":"data.q1.corrected_plan" }, - "data.q1.adj_comment": { - color_type: yellowColumn, - accessorKey: "data.q1.adj_comment", + "1_kvartal_2026_goda_field_field":{ + "color_type":whiteColumn, + "accessorKey":"1_kvartal_2026_goda_field_field" }, - "data.q1.corrected_plan": { - color_type: yellowColumn, - accessorKey: "data.q1.corrected_plan", + "data.q1.pay_date":{ + "color_type":blueColumn, + "accessorKey":"data.q1.pay_date" }, - "data.1_kvartal_2026_goda_field_field": { - color_type: whiteColumn, - accessorKey: "data.1_kvartal_2026_goda_field_field", + "data.q1.pay_amount":{ + "color_type":blueColumn, + "accessorKey":"data.q1.pay_amount" }, - "data.q1.pay_date": { - color_type: blueColumn, - accessorKey: "data.q1.pay_date", + "data.q1.pay_comment":{ + "color_type":blueColumn, + "accessorKey":"data.q1.pay_comment" }, - "data.q1.pay_amount": { - color_type: blueColumn, - accessorKey: "data.q1.pay_amount", + "data.q1.pay_act":{ + "color_type":blueColumn, + "accessorKey":"data.q1.pay_act" }, - "data.q1.pay_comment": { - color_type: blueColumn, - accessorKey: "data.q1.pay_comment", + "data.q1.booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q1.booking" }, - "data.q1.pay_act": { - color_type: blueColumn, - accessorKey: "data.q1.pay_act", + "data.q1.actual_m1":{ + "color_type":greenColumn, + "accessorKey":"data.q1.actual_m1" }, - "data.q1.booking": { - color_type: orangeColumn, - accessorKey: "data.q1.booking", + "data.q1.actual_m2":{ + "color_type":greenColumn, + "accessorKey":"data.q1.actual_m2" }, - "data.q1.actual_m1": { - color_type: greenColumn, - accessorKey: "data.q1.actual_m1", + "data.q1.actual_m3":{ + "color_type":greenColumn, + "accessorKey":"data.q1.actual_m3" }, - "data.q1.actual_m2": { - color_type: greenColumn, - accessorKey: "data.q1.actual_m2", + "data.q1.actual_quarter":{ + "color_type":greenColumn, + "accessorKey":"data.q1.actual_quarter" }, - "data.q1.actual_m3": { - color_type: greenColumn, - accessorKey: "data.q1.actual_m3", + "data.q1.residual_after_booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q1.residual_after_booking" }, - "data.q1.actual_quarter": { - color_type: greenColumn, - accessorKey: "data.q1.actual_quarter", + "data.q1.residual_after_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q1.residual_after_actual" }, - "data.q1.residual_after_booking": { - color_type: orangeColumn, - accessorKey: "data.q1.residual_after_booking", + "data.q1.transfer_q2":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_q2" }, - "data.q1.residual_after_actual": { - color_type: greenColumn, - accessorKey: "data.q1.residual_after_actual", + "data.q1.transfer_q2_delay_acts":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_q2_delay_acts" }, - "data.q1.transfer_q2": { - color_type: redColumn, - accessorKey: "data.q1.transfer_q2", + "data.q1.transfer_q2_delay_procurement":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_q2_delay_procurement" }, - "data.q1.transfer_q2_delay_acts": { - color_type: redColumn, - accessorKey: "data.q1.transfer_q2_delay_acts", + "data.q1.transfer_q2_economy_rf":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_q2_economy_rf" }, - "data.q1.transfer_q2_delay_procurement": { - color_type: redColumn, - accessorKey: "data.q1.transfer_q2_delay_procurement", + "data.q1.transfer_next_comment":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_next_comment" }, - "data.q1.transfer_q2_economy_rf": { - color_type: redColumn, - accessorKey: "data.q1.transfer_q2_economy_rf", + "data.q1.transfer_q3":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_q3" }, - "data.q1.transfer_next_comment": { - color_type: redColumn, - accessorKey: "data.q1.transfer_next_comment", + "data.q1.transfer_q4":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_q4" }, - "data.q1.transfer_q3": { - color_type: redColumn, - accessorKey: "data.q1.transfer_q3", + "data.q1.transfer_far_comment":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_far_comment" }, - "data.q1.transfer_q4": { - color_type: redColumn, - accessorKey: "data.q1.transfer_q4", + "data.q1.transfer_econ":{ + "color_type":redColumn, + "accessorKey":"data.q1.transfer_econ" }, - "data.q1.transfer_far_comment": { - color_type: redColumn, - accessorKey: "data.q1.transfer_far_comment", + "data.q1.total":{ + "color_type":redColumn, + "accessorKey":"data.q1.total" }, - "data.q1.transfer_econ": { - color_type: redColumn, - accessorKey: "data.q1.transfer_econ", + "data.q2.target_change":{ + "color_type":redColumn, + "accessorKey":"data.q2.target_change" }, - "data.q1.total": { - color_type: redColumn, - accessorKey: "data.q1.total", + "data.q2.base_correction":{ + "color_type":redColumn, + "accessorKey":"data.q2.base_correction" }, - "data.q2.target_change": { - color_type: redColumn, - accessorKey: "data.q2.target_change", + "data.q2.base_correction_comment":{ + "color_type":redColumn, + "accessorKey":"data.q2.base_correction_comment" }, - "data.q2.base_correction": { - color_type: redColumn, - accessorKey: "data.q2.base_correction", + "data.q2.revision_inc":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.revision_inc" }, - "data.q2.base_correction_comment": { - color_type: redColumn, - accessorKey: "data.q2.base_correction_comment", + "data.q2.revision_seq":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.revision_seq" }, - "data.q2.revision_inc": { - color_type: yellowColumn, - accessorKey: "data.q2.revision_inc", + "data.q2.revision_comment":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.revision_comment" }, - "data.q2.revision_seq": { - color_type: yellowColumn, - accessorKey: "data.q2.revision_seq", + "data.q2.new_plan":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.new_plan" }, - "data.q2.revision_comment": { - color_type: yellowColumn, - accessorKey: "data.q2.revision_comment", + "2_kvartal_2026_goda_field_field":{ + "color_type":whiteColumn, + "accessorKey":"2_kvartal_2026_goda_field_field" }, - "data.q2.new_plan": { - color_type: yellowColumn, - accessorKey: "data.q2.new_plan", + "data.q2.adj_current":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.adj_current" }, - "data.2_kvartal_2026_goda_field_field": { - color_type: whiteColumn, - accessorKey: "data.2_kvartal_2026_goda_field_field", + "data.q2.adj_ssp":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.adj_ssp" }, - "data.q2.adj_current": { - color_type: yellowColumn, - accessorKey: "data.q2.adj_current", + "data.q2.adj_reserve":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.adj_reserve" }, - "data.q2.adj_ssp": { - color_type: yellowColumn, - accessorKey: "data.q2.adj_ssp", + "data.q2.adj_comment":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.adj_comment" }, - "data.q2.adj_reserve": { - color_type: yellowColumn, - accessorKey: "data.q2.adj_reserve", + "data.q2.corrected_plan":{ + "color_type":yellowColumn, + "accessorKey":"data.q2.corrected_plan" }, - "data.q2.adj_comment": { - color_type: yellowColumn, - accessorKey: "data.q2.adj_comment", + "data.q2.pay_date":{ + "color_type":blueColumn, + "accessorKey":"data.q2.pay_date" }, - "data.q2.corrected_plan": { - color_type: yellowColumn, - accessorKey: "data.q2.corrected_plan", + "data.q2.pay_amount":{ + "color_type":blueColumn, + "accessorKey":"data.q2.pay_amount" }, - "data.q2.pay_date": { - color_type: blueColumn, - accessorKey: "data.q2.pay_date", + "data.q2.pay_comment":{ + "color_type":blueColumn, + "accessorKey":"data.q2.pay_comment" }, - "data.q2.pay_amount": { - color_type: blueColumn, - accessorKey: "data.q2.pay_amount", + "data.q2.pay_act":{ + "color_type":blueColumn, + "accessorKey":"data.q2.pay_act" }, - "data.q2.pay_comment": { - color_type: blueColumn, - accessorKey: "data.q2.pay_comment", + "data.q2.booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q2.booking" }, - "data.q2.pay_act": { - color_type: blueColumn, - accessorKey: "data.q2.pay_act", + "data.q2.actual_m1":{ + "color_type":greenColumn, + "accessorKey":"data.q2.actual_m1" }, - "data.q2.booking": { - color_type: orangeColumn, - accessorKey: "data.q2.booking", + "data.q2.actual_m2":{ + "color_type":greenColumn, + "accessorKey":"data.q2.actual_m2" }, - "data.q2.actual_m1": { - color_type: greenColumn, - accessorKey: "data.q2.actual_m1", + "data.q2.actual_m3":{ + "color_type":greenColumn, + "accessorKey":"data.q2.actual_m3" }, - "data.q2.actual_m2": { - color_type: greenColumn, - accessorKey: "data.q2.actual_m2", + "data.q2.actual_quarter":{ + "color_type":greenColumn, + "accessorKey":"data.q2.actual_quarter" }, - "data.q2.actual_m3": { - color_type: greenColumn, - accessorKey: "data.q2.actual_m3", + "data.q2.residual_after_booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q2.residual_after_booking" }, - "data.q2.actual_quarter": { - color_type: greenColumn, - accessorKey: "data.q2.actual_quarter", + "data.q2.residual_after_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q2.residual_after_actual" }, - "data.q2.residual_after_booking": { - color_type: orangeColumn, - accessorKey: "data.q2.residual_after_booking", + "data.q2.transfer_q3":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_q3" }, - "data.q2.residual_after_actual": { - color_type: greenColumn, - accessorKey: "data.q2.residual_after_actual", + "data.q2.transfer_q3_delay_acts":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_q3_delay_acts" }, - "data.q2.transfer_q3": { - color_type: redColumn, - accessorKey: "data.q2.transfer_q3", + "data.q2.transfer_q3_delay_procurement":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_q3_delay_procurement" }, - "data.q2.transfer_q3_delay_acts": { - color_type: redColumn, - accessorKey: "data.q2.transfer_q3_delay_acts", + "data.q2.transfer_q3_economy_rf":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_q3_economy_rf" }, - "data.q2.transfer_q3_delay_procurement": { - color_type: redColumn, - accessorKey: "data.q2.transfer_q3_delay_procurement", + "data.q2.transfer_next_comment":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_next_comment" }, - "data.q2.transfer_q3_economy_rf": { - color_type: redColumn, - accessorKey: "data.q2.transfer_q3_economy_rf", + "data.q2.transfer_q4":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_q4" }, - "data.q2.transfer_next_comment": { - color_type: redColumn, - accessorKey: "data.q2.transfer_next_comment", + "data.q2.transfer_far_comment":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_far_comment" }, - "data.q2.transfer_q4": { - color_type: redColumn, - accessorKey: "data.q2.transfer_q4", + "data.q2.transfer_econ":{ + "color_type":redColumn, + "accessorKey":"data.q2.transfer_econ" }, - "data.q2.transfer_far_comment": { - color_type: redColumn, - accessorKey: "data.q2.transfer_far_comment", + "data.q2.total":{ + "color_type":redColumn, + "accessorKey":"data.q2.total" }, - "data.q2.transfer_econ": { - color_type: redColumn, - accessorKey: "data.q2.transfer_econ", + "data.q3.target_change":{ + "color_type":redColumn, + "accessorKey":"data.q3.target_change" }, - "data.q2.total": { - color_type: redColumn, - accessorKey: "data.q2.total", + "data.q3.base_correction":{ + "color_type":redColumn, + "accessorKey":"data.q3.base_correction" }, - "data.q3.target_change": { - color_type: redColumn, - accessorKey: "data.q3.target_change", + "data.q3.base_correction_comment":{ + "color_type":redColumn, + "accessorKey":"data.q3.base_correction_comment" }, - "data.q3.base_correction": { - color_type: redColumn, - accessorKey: "data.q3.base_correction", + "data.q3.revision_inc":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.revision_inc" }, - "data.q3.base_correction_comment": { - color_type: redColumn, - accessorKey: "data.q3.base_correction_comment", + "data.q3.revision_seq":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.revision_seq" }, - "data.q3.revision_inc": { - color_type: yellowColumn, - accessorKey: "data.q3.revision_inc", + "data.q3.revision_comment":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.revision_comment" }, - "data.q3.revision_seq": { - color_type: yellowColumn, - accessorKey: "data.q3.revision_seq", + "data.q3.new_plan":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.new_plan" }, - "data.q3.revision_comment": { - color_type: yellowColumn, - accessorKey: "data.q3.revision_comment", + "3_kvartal_2026_goda_field_field":{ + "color_type":whiteColumn, + "accessorKey":"3_kvartal_2026_goda_field_field" }, - "data.q3.new_plan": { - color_type: yellowColumn, - accessorKey: "data.q3.new_plan", + "data.q3.adj_current":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.adj_current" }, - "data.3_kvartal_2026_goda_field_field": { - color_type: whiteColumn, - accessorKey: "data.3_kvartal_2026_goda_field_field", + "data.q3.adj_ssp":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.adj_ssp" }, - "data.q3.adj_current": { - color_type: yellowColumn, - accessorKey: "data.q3.adj_current", + "data.q3.adj_reserve":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.adj_reserve" }, - "data.q3.adj_ssp": { - color_type: yellowColumn, - accessorKey: "data.q3.adj_ssp", + "data.q3.adj_comment":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.adj_comment" }, - "data.q3.adj_reserve": { - color_type: yellowColumn, - accessorKey: "data.q3.adj_reserve", + "data.q3.corrected_plan":{ + "color_type":yellowColumn, + "accessorKey":"data.q3.corrected_plan" }, - "data.q3.adj_comment": { - color_type: yellowColumn, - accessorKey: "data.q3.adj_comment", + "data.q3.pay_date":{ + "color_type":blueColumn, + "accessorKey":"data.q3.pay_date" }, - "data.q3.corrected_plan": { - color_type: yellowColumn, - accessorKey: "data.q3.corrected_plan", + "data.q3.pay_amount":{ + "color_type":blueColumn, + "accessorKey":"data.q3.pay_amount" }, - "data.q3.pay_date": { - color_type: blueColumn, - accessorKey: "data.q3.pay_date", + "data.q3.pay_comment":{ + "color_type":blueColumn, + "accessorKey":"data.q3.pay_comment" }, - "data.q3.pay_amount": { - color_type: blueColumn, - accessorKey: "data.q3.pay_amount", + "data.q3.pay_act":{ + "color_type":blueColumn, + "accessorKey":"data.q3.pay_act" }, - "data.q3.pay_comment": { - color_type: blueColumn, - accessorKey: "data.q3.pay_comment", + "data.q3.booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q3.booking" }, - "data.q3.pay_act": { - color_type: blueColumn, - accessorKey: "data.q3.pay_act", + "data.q3.actual_m1":{ + "color_type":greenColumn, + "accessorKey":"data.q3.actual_m1" }, - "data.q3.booking": { - color_type: orangeColumn, - accessorKey: "data.q3.booking", + "data.q3.actual_m2":{ + "color_type":greenColumn, + "accessorKey":"data.q3.actual_m2" }, - "data.q3.actual_m1": { - color_type: greenColumn, - accessorKey: "data.q3.actual_m1", + "data.q3.actual_m3":{ + "color_type":greenColumn, + "accessorKey":"data.q3.actual_m3" }, - "data.q3.actual_m2": { - color_type: greenColumn, - accessorKey: "data.q3.actual_m2", + "data.q3.actual_quarter":{ + "color_type":greenColumn, + "accessorKey":"data.q3.actual_quarter" }, - "data.q3.actual_m3": { - color_type: greenColumn, - accessorKey: "data.q3.actual_m3", + "data.q3.residual_after_booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q3.residual_after_booking" }, - "data.q3.actual_quarter": { - color_type: greenColumn, - accessorKey: "data.q3.actual_quarter", + "data.q3.residual_after_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q3.residual_after_actual" }, - "data.q3.residual_after_booking": { - color_type: orangeColumn, - accessorKey: "data.q3.residual_after_booking", + "data.q3.transfer_q4":{ + "color_type":redColumn, + "accessorKey":"data.q3.transfer_q4" }, - "data.q3.residual_after_actual": { - color_type: greenColumn, - accessorKey: "data.q3.residual_after_actual", + "data.q3.transfer_q4_delay_acts":{ + "color_type":redColumn, + "accessorKey":"data.q3.transfer_q4_delay_acts" }, - "data.q3.transfer_q4": { - color_type: redColumn, - accessorKey: "data.q3.transfer_q4", + "data.q3.transfer_q4_delay_procurement":{ + "color_type":redColumn, + "accessorKey":"data.q3.transfer_q4_delay_procurement" }, - "data.q3.transfer_q4_delay_acts": { - color_type: redColumn, - accessorKey: "data.q3.transfer_q4_delay_acts", + "data.q3.transfer_q4_economy_rf":{ + "color_type":redColumn, + "accessorKey":"data.q3.transfer_q4_economy_rf" }, - "data.q3.transfer_q4_delay_procurement": { - color_type: redColumn, - accessorKey: "data.q3.transfer_q4_delay_procurement", + "data.q3.transfer_next_comment":{ + "color_type":redColumn, + "accessorKey":"data.q3.transfer_next_comment" }, - "data.q3.transfer_q4_economy_rf": { - color_type: redColumn, - accessorKey: "data.q3.transfer_q4_economy_rf", + "data.q3.transfer_econ":{ + "color_type":redColumn, + "accessorKey":"data.q3.transfer_econ" }, - "data.q3.transfer_next_comment": { - color_type: redColumn, - accessorKey: "data.q3.transfer_next_comment", + "data.q3.total":{ + "color_type":redColumn, + "accessorKey":"data.q3.total" }, - "data.q3.transfer_econ": { - color_type: redColumn, - accessorKey: "data.q3.transfer_econ", + "data.q4.target_change":{ + "color_type":redColumn, + "accessorKey":"data.q4.target_change" }, - "data.q3.total": { - color_type: redColumn, - accessorKey: "data.q3.total", + "data.q4.base_correction":{ + "color_type":redColumn, + "accessorKey":"data.q4.base_correction" }, - "data.q4.target_change": { - color_type: redColumn, - accessorKey: "data.q4.target_change", + "data.q4.base_correction_comment":{ + "color_type":redColumn, + "accessorKey":"data.q4.base_correction_comment" }, - "data.q4.base_correction": { - color_type: redColumn, - accessorKey: "data.q4.base_correction", + "data.q4.revision_inc":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.revision_inc" }, - "data.q4.base_correction_comment": { - color_type: redColumn, - accessorKey: "data.q4.base_correction_comment", + "data.q4.revision_seq":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.revision_seq" }, - "data.q4.revision_inc": { - color_type: yellowColumn, - accessorKey: "data.q4.revision_inc", + "data.q4.revision_comment":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.revision_comment" }, - "data.q4.revision_seq": { - color_type: yellowColumn, - accessorKey: "data.q4.revision_seq", + "data.q4.new_plan":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.new_plan" }, - "data.q4.revision_comment": { - color_type: yellowColumn, - accessorKey: "data.q4.revision_comment", + "4_kvartal_2026_goda_field_field":{ + "color_type":whiteColumn, + "accessorKey":"4_kvartal_2026_goda_field_field" }, - "data.q4.new_plan": { - color_type: yellowColumn, - accessorKey: "data.q4.new_plan", + "data.q4.adj_current":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.adj_current" }, - "data.4_kvartal_2026_goda_field_field": { - color_type: whiteColumn, - accessorKey: "data.4_kvartal_2026_goda_field_field", + "data.q4.adj_ssp":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.adj_ssp" }, - "data.q4.adj_current": { - color_type: yellowColumn, - accessorKey: "data.q4.adj_current", + "data.q4.adj_reserve":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.adj_reserve" }, - "data.q4.adj_ssp": { - color_type: yellowColumn, - accessorKey: "data.q4.adj_ssp", + "data.q4.adj_comment":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.adj_comment" }, - "data.q4.adj_reserve": { - color_type: yellowColumn, - accessorKey: "data.q4.adj_reserve", + "data.q4.corrected_plan":{ + "color_type":yellowColumn, + "accessorKey":"data.q4.corrected_plan" }, - "data.q4.adj_comment": { - color_type: yellowColumn, - accessorKey: "data.q4.adj_comment", + "data.q4.pay_date":{ + "color_type":blueColumn, + "accessorKey":"data.q4.pay_date" }, - "data.q4.corrected_plan": { - color_type: yellowColumn, - accessorKey: "data.q4.corrected_plan", + "data.q4.pay_amount":{ + "color_type":blueColumn, + "accessorKey":"data.q4.pay_amount" }, - "data.q4.pay_date": { - color_type: blueColumn, - accessorKey: "data.q4.pay_date", + "data.q4.pay_comment":{ + "color_type":blueColumn, + "accessorKey":"data.q4.pay_comment" }, - "data.q4.pay_amount": { - color_type: blueColumn, - accessorKey: "data.q4.pay_amount", + "data.q4.pay_act":{ + "color_type":blueColumn, + "accessorKey":"data.q4.pay_act" }, - "data.q4.pay_comment": { - color_type: blueColumn, - accessorKey: "data.q4.pay_comment", + "data.q4.booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q4.booking" }, - "data.q4.pay_act": { - color_type: blueColumn, - accessorKey: "data.q4.pay_act", + "data.q4.actual_m1":{ + "color_type":greenColumn, + "accessorKey":"data.q4.actual_m1" }, - "data.q4.booking": { - color_type: orangeColumn, - accessorKey: "data.q4.booking", + "data.q4.actual_m2":{ + "color_type":greenColumn, + "accessorKey":"data.q4.actual_m2" }, - "data.q4.actual_m1": { - color_type: greenColumn, - accessorKey: "data.q4.actual_m1", + "data.q4.actual_m3":{ + "color_type":greenColumn, + "accessorKey":"data.q4.actual_m3" }, - "data.q4.actual_m2": { - color_type: greenColumn, - accessorKey: "data.q4.actual_m2", + "data.q4.actual_spod":{ + "color_type":greenColumn, + "accessorKey":"data.q4.actual_spod" }, - "data.q4.actual_m3": { - color_type: greenColumn, - accessorKey: "data.q4.actual_m3", + "data.q4.actual_quarter":{ + "color_type":greenColumn, + "accessorKey":"data.q4.actual_quarter" }, - "data.q4.actual_spod": { - color_type: greenColumn, - accessorKey: "data.q4.actual_spod", + "data.q4.residual_after_booking":{ + "color_type":orangeColumn, + "accessorKey":"data.q4.residual_after_booking" }, - "data.q4.actual_quarter": { - color_type: greenColumn, - accessorKey: "data.q4.actual_quarter", + "data.q4.residual_after_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q4.residual_after_actual" }, - "data.q4.residual_after_booking": { - color_type: orangeColumn, - accessorKey: "data.q4.residual_after_booking", + "data.q4.transfer_econ":{ + "color_type":redColumn, + "accessorKey":"data.q4.transfer_econ" }, - "data.q4.residual_after_actual": { - color_type: greenColumn, - accessorKey: "data.q4.residual_after_actual", + "data.totals.fact_year":{ + "color_type":greenColumn, + "accessorKey":"data.totals.fact_year" }, - "data.q4.transfer_econ": { - color_type: redColumn, - accessorKey: "data.q4.transfer_econ", + "2026_god_field_field_5":{ + "color_type":whiteColumn, + "accessorKey":"2026_god_field_field_5" }, + "data.totals.pay_year":{ + "color_type":blueColumn, + "accessorKey":"data.totals.pay_year" + } }, - columns: [ + "columns":[ { - header: "", - accessorKey: "field", - columns: [ + "header":" ", + "accessorKey":"field", + "columns":[ { - header: "", - accessorKey: "field_field", - columns: [ + "header":" ", + "accessorKey":"field_field", + "columns":[ { - header: "Код раздела", - accessorKey: "data.header.section_code", - columnLetter: "A", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Код раздела", + "accessorKey":"data.header.section_code", + "columnLetter":"A", + "size":150, + "filterFn":"contains" }, { - header: "ID статьи", - accessorKey: "data.header.item_id", - columnLetter: "B", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ID статьи", + "accessorKey":"data.header.item_id", + "columnLetter":"B", + "size":150, + "filterFn":"contains" }, { - header: "ID группы номенклатуры", - accessorKey: "data.header.num_group", - columnLetter: "C", - size: 220, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ID группы номенклатуры", + "accessorKey":"data.header.num_group", + "columnLetter":"C", + "size":220, + "filterFn":"contains" }, { - header: "Наименование", - accessorKey: "data.header.name", - columnLetter: "D", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Наименование", + "accessorKey":"data.header.name", + "columnLetter":"D", + "size":150, + "filterFn":"contains" }, { - header: "ВСП РФ", - accessorKey: "data.header.vsp_id", - columnLetter: "E", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"ВСП РФ", + "accessorKey":"data.header.vsp_id", + "columnLetter":"E", + "size":150, + "filterFn":"contains" + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2026 год.", - accessorKey: "2026_god", - columns: [ + "header":"2026 год", + "accessorKey":"2026_god", + "columns":[ { - header: "Планирование годовых показателей", - accessorKey: "2026_god_planirovanie_godovykh_pokazateley", - columns: [ + "header":"Планирование годовых показателей", + "accessorKey":"2026_god_planirovanie_godovykh_pokazateley", + "columns":[ { - header: "1 квартал", - accessorKey: "data.plan.q1", - columnLetter: "F", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"1 квартал", + "accessorKey":"data.plan.q1", + "columnLetter":"F", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2 квартал", - accessorKey: "data.plan.q2", - columnLetter: "G", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"2 квартал", + "accessorKey":"data.plan.q2", + "columnLetter":"G", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "3 квартал", - accessorKey: "data.plan.q3", - columnLetter: "H", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"3 квартал", + "accessorKey":"data.plan.q3", + "columnLetter":"H", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "4 квартал", - accessorKey: "data.plan.q4", - columnLetter: "I", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"4 квартал", + "accessorKey":"data.plan.q4", + "columnLetter":"I", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Год", - accessorKey: "data.plan.year", - columnLetter: "J", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Год", + "accessorKey":"data.plan.year", + "columnLetter":"J", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.plan.comment", - columnLetter: "K", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Комментарий", + "accessorKey":"data.plan.comment", + "columnLetter":"K", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Секвестирование ДФиП", - accessorKey: "2026_god_sekvestirovanie_dfip", - columns: [ + "header":"Секвестирование ДФиП", + "accessorKey":"2026_god_sekvestirovanie_dfip", + "columns":[ { - header: "1 квартал", - accessorKey: "data.seq_dfip.q1", - columnLetter: "M", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"1 квартал", + "accessorKey":"data.seq_dfip.q1", + "columnLetter":"M", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2 квартал", - accessorKey: "data.seq_dfip.q2", - columnLetter: "N", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"2 квартал", + "accessorKey":"data.seq_dfip.q2", + "columnLetter":"N", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "3 квартал", - accessorKey: "data.seq_dfip.q3", - columnLetter: "O", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"3 квартал", + "accessorKey":"data.seq_dfip.q3", + "columnLetter":"O", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "4 квартал", - accessorKey: "data.seq_dfip.q4", - columnLetter: "P", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"4 квартал", + "accessorKey":"data.seq_dfip.q4", + "columnLetter":"P", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Год", - accessorKey: "data.seq_dfip.year", - columnLetter: "Q", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Год", + "accessorKey":"data.seq_dfip.year", + "columnLetter":"Q", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Обоснование", - accessorKey: "data.seq_dfip.justification", - columnLetter: "R", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Обоснование", + "accessorKey":"data.seq_dfip.justification", + "columnLetter":"R", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Секвестирование ССП ГО", - accessorKey: "2026_god_sekvestirovanie_ssp_go", - columns: [ + "header":"Секвестирование ССП ГО", + "accessorKey":"2026_god_sekvestirovanie_ssp_go", + "columns":[ { - header: "1 квартал", - accessorKey: "data.seq_ssp.q1", - columnLetter: "T", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"1 квартал", + "accessorKey":"data.seq_ssp.q1", + "columnLetter":"T", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2 квартал", - accessorKey: "data.seq_ssp.q2", - columnLetter: "U", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"2 квартал", + "accessorKey":"data.seq_ssp.q2", + "columnLetter":"U", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "3 квартал", - accessorKey: "data.seq_ssp.q3", - columnLetter: "V", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"3 квартал", + "accessorKey":"data.seq_ssp.q3", + "columnLetter":"V", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "4 квартал", - accessorKey: "data.seq_ssp.q4", - columnLetter: "W", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"4 квартал", + "accessorKey":"data.seq_ssp.q4", + "columnLetter":"W", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Год", - accessorKey: "data.seq_ssp.year", - columnLetter: "X", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Год", + "accessorKey":"data.seq_ssp.year", + "columnLetter":"X", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Обоснование", - accessorKey: "data.seq_ssp.justification", - columnLetter: "Y", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Обоснование", + "accessorKey":"data.seq_ssp.justification", + "columnLetter":"Y", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Утвержденная смета расходов", - accessorKey: "2026_god_utverzhdennaya_smeta_raskhodov", - columns: [ + "header":"Утвержденная смета расходов", + "accessorKey":"2026_god_utverzhdennaya_smeta_raskhodov", + "columns":[ { - header: "1 квартал", - accessorKey: "data.approved.q1", - columnLetter: "AA", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"1 квартал", + "accessorKey":"data.approved.q1", + "columnLetter":"AA", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2 квартал", - accessorKey: "data.approved.q2", - columnLetter: "AB", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"2 квартал", + "accessorKey":"data.approved.q2", + "columnLetter":"AB", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "3 квартал", - accessorKey: "data.approved.q3", - columnLetter: "AC", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"3 квартал", + "accessorKey":"data.approved.q3", + "columnLetter":"AC", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "4 квартал", - accessorKey: "data.approved.q4", - columnLetter: "AD", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"4 квартал", + "accessorKey":"data.approved.q4", + "columnLetter":"AD", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Год", - accessorKey: "data.approved.year", - columnLetter: "AE", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Год", + "accessorKey":"data.approved.year", + "columnLetter":"AE", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Параметры заключенного хозяйственного договора", - accessorKey: - "2026_god_parametry_zaklyuchennogo_khozyaystvennogo_dogovora", - columns: [ + "header":"Параметры заключенного хозяйственного договора", + "accessorKey":"2026_god_parametry_zaklyuchennogo_khozyaystvennogo_dogovora", + "columns":[ { - header: "Контрагент", - accessorKey: "data.contract.counterparty", - columnLetter: "AG", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Контрагент", + "accessorKey":"data.contract.counterparty", + "columnLetter":"AG", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Номер", - accessorKey: "data.contract.reference", - columnLetter: "AH", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Номер", + "accessorKey":"data.contract.reference", + "columnLetter":"AH", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Дата", - accessorKey: "data.contract.date", - columnLetter: "AI", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Дата", + "accessorKey":"data.contract.date", + "columnLetter":"AI", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Предмет", - accessorKey: "data.contract.subject", - columnLetter: "AJ", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Предмет", + "accessorKey":"data.contract.subject", + "columnLetter":"AJ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Валюта", - accessorKey: "data.contract.currency", - columnLetter: "AK", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Валюта", + "accessorKey":"data.contract.currency", + "columnLetter":"AK", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Предельная стоимость", - accessorKey: "data.contract.ceiling", - columnLetter: "AL", - size: 200, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Предельная стоимость", + "accessorKey":"data.contract.ceiling", + "columnLetter":"AL", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Ставка НДС (%)", - accessorKey: "data.contract.vat_rate", - columnLetter: "AM", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Ставка НДС (%)", + "accessorKey":"data.contract.vat_rate", + "columnLetter":"AM", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Срок", - accessorKey: "data.contract.deadline", - columnLetter: "AN", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Срок", + "accessorKey":"data.contract.deadline", + "columnLetter":"AN", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Схема платежа", - accessorKey: "data.contract.scheme", - columnLetter: "AO", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Схема платежа", + "accessorKey":"data.contract.scheme", + "columnLetter":"AO", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "АКТ", - accessorKey: "data.contract.act", - columnLetter: "AP", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"АКТ", + "accessorKey":"data.contract.act", + "columnLetter":"AP", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.contract.comment", - columnLetter: "AQ", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.contract.comment", + "columnLetter":"AQ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "Бронь средств в 1 квартале", - accessorKey: "data.booking.y2026.q1", - columnLetter: "AR", - size: 260, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь средств в 1 квартале", + "accessorKey":"data.booking.y2026.q1", + "columnLetter":"AR", + "size":260, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Бронь средств во 2 квартале", - accessorKey: "data.booking.y2026.q2", - columnLetter: "AS", - size: 270, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь средств во 2 квартале", + "accessorKey":"data.booking.y2026.q2", + "columnLetter":"AS", + "size":270, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Бронь средств в 3 квартале", - accessorKey: "data.booking.y2026.q3", - columnLetter: "AT", - size: 260, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь средств в 3 квартале", + "accessorKey":"data.booking.y2026.q3", + "columnLetter":"AT", + "size":260, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Бронь средств в 4 квартале", - accessorKey: "data.booking.y2026.q4", - columnLetter: "AU", - size: 260, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Бронь средств в 4 квартале", + "accessorKey":"data.booking.y2026.q4", + "columnLetter":"AU", + "size":260, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2027 год.", - accessorKey: "2027_god", - columns: [ + "header":"2027 год", + "accessorKey":"2027_god", + "columns":[ { - header: "", - accessorKey: "2027_god_field", - columns: [ + "header":"", + "accessorKey":"2027_god_field", + "columns":[ { - header: "Бронь средств в 1 квартале", - accessorKey: "data.booking.y2027.q1", - columnLetter: "AV", - size: 260, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь средств в 1 квартале", + "accessorKey":"data.booking.y2027.q1", + "columnLetter":"AV", + "size":260, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Бронь средств во 2 квартале", - accessorKey: "data.booking.y2027.q2", - columnLetter: "AW", - size: 270, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь средств во 2 квартале", + "accessorKey":"data.booking.y2027.q2", + "columnLetter":"AW", + "size":270, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Бронь средств в 3 квартале", - accessorKey: "data.booking.y2027.q3", - columnLetter: "AX", - size: 260, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь средств в 3 квартале", + "accessorKey":"data.booking.y2027.q3", + "columnLetter":"AX", + "size":260, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Бронь средств в 4 квартале", - accessorKey: "data.booking.y2027.q4", - columnLetter: "AY", - size: 260, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Бронь средств в 4 квартале", + "accessorKey":"data.booking.y2027.q4", + "columnLetter":"AY", + "size":260, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "1 квартал 2026 года", - accessorKey: "1_kvartal_2026_goda", - columns: [ + "header":"1 квартал 2026 года", + "accessorKey":"1_kvartal_2026_goda", + "columns":[ { - header: "Корректировки плановых значений", - accessorKey: - "1_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", - columns: [ + "header":"Корректировки плановых значений", + "accessorKey":"1_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", + "columns":[ { - header: "Текущие( = 0)", - accessorKey: "data.q1.adj_current", - columnLetter: "BA", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Текущие( = 0)", + "accessorKey":"data.q1.adj_current", + "columnLetter":"BA", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Корректиз сметы ГО", - accessorKey: "data.q1.adj_ssp", - columnLetter: "BB", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректиз сметы ГО", + "accessorKey":"data.q1.adj_ssp", + "columnLetter":"BB", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Корректиз резерва", - accessorKey: "data.q1.adj_reserve", - columnLetter: "BC", - size: 180, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректиз резерва", + "accessorKey":"data.q1.adj_reserve", + "columnLetter":"BC", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q1.adj_comment", - columnLetter: "BD", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q1.adj_comment", + "columnLetter":"BD", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Базовый план с учетом корректировок", - accessorKey: "data.q1.corrected_plan", - columnLetter: "BE", - size: 350, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Базовый план с учетом корректировок", + "accessorKey":"data.q1.corrected_plan", + "columnLetter":"BE", + "size":350, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Согласование платежей", - accessorKey: "1_kvartal_2026_goda_soglasovanie_platezhey", - columns: [ + "header":"Согласование платежей", + "accessorKey":"1_kvartal_2026_goda_soglasovanie_platezhey", + "columns":[ { - header: "Дата платежа", - accessorKey: "data.q1.pay_date", - columnLetter: "BG", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Дата платежа", + "accessorKey":"data.q1.pay_date", + "columnLetter":"BG", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Сумма платежа", - accessorKey: "data.q1.pay_amount", - columnLetter: "BH", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Сумма платежа", + "accessorKey":"data.q1.pay_amount", + "columnLetter":"BH", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q1.pay_comment", - columnLetter: "BI", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q1.pay_comment", + "columnLetter":"BI", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Предоставление акта", - accessorKey: "data.q1.pay_act", - columnLetter: "BJ", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Предоставление акта", + "accessorKey":"data.q1.pay_act", + "columnLetter":"BJ", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Фактические расходы", - accessorKey: "1_kvartal_2026_goda_fakticheskie_raskhody", - columns: [ + "header":"Фактические расходы", + "accessorKey":"1_kvartal_2026_goda_fakticheskie_raskhody", + "columns":[ { - header: "Бронь1 квартал", - accessorKey: "data.q1.booking", - columnLetter: "BL", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь1 квартал", + "accessorKey":"data.q1.booking", + "columnLetter":"BL", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "ФактЯнварь", - accessorKey: "data.q1.actual_m1", - columnLetter: "BM", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактЯнварь", + "accessorKey":"data.q1.actual_m1", + "columnLetter":"BM", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "ФактФевраль", - accessorKey: "data.q1.actual_m2", - columnLetter: "BN", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактФевраль", + "accessorKey":"data.q1.actual_m2", + "columnLetter":"BN", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "ФактМарт", - accessorKey: "data.q1.actual_m3", - columnLetter: "BO", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактМарт", + "accessorKey":"data.q1.actual_m3", + "columnLetter":"BO", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "Факт1 квартал", - accessorKey: "data.q1.actual_quarter", - columnLetter: "BP", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Факт1 квартал", + "accessorKey":"data.q1.actual_quarter", + "columnLetter":"BP", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "Остаток после брони 1 квартала", - accessorKey: "data.q1.residual_after_booking", - columnLetter: "BQ", - size: 300, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Остаток после брони 1 квартала", + "accessorKey":"data.q1.residual_after_booking", + "columnLetter":"BQ", + "size":300, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Остаток после факта 1 квартала", - accessorKey: "data.q1.residual_after_actual", - columnLetter: "BR", - size: 300, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Остаток после факта 1 квартала", + "accessorKey":"data.q1.residual_after_actual", + "columnLetter":"BR", + "size":300, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Корректировка остатка в последующие кварталы", - accessorKey: - "1_kvartal_2026_goda_korrektirovka_ostatka_v_posleduyuschie_kvartaly", - columns: [ + "header":"Корректировка остатка в последующие кварталы", + "accessorKey":"1_kvartal_2026_goda_korrektirovka_ostatka_v_posleduyuschie_kvartaly", + "columns":[ { - header: "Перенос во 2 квартал", - accessorKey: "data.q1.transfer_q2", - columnLetter: "BT", - size: 200, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Перенос во 2 квартал", + "accessorKey":"data.q1.transfer_q2", + "columnLetter":"BT", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Задержка списания расходов / предоставления актов", - accessorKey: "data.q1.transfer_q2_delay_acts", - columnLetter: "BU", - size: 490, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Задержка списания расходов / предоставления актов", + "accessorKey":"data.q1.transfer_q2_delay_acts", + "columnLetter":"BU", + "size":490, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Задержка закупочных процедур", - accessorKey: "data.q1.transfer_q2_delay_procurement", - columnLetter: "BV", - size: 280, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Задержка закупочных процедур", + "accessorKey":"data.q1.transfer_q2_delay_procurement", + "columnLetter":"BV", + "size":280, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "экономия (будет использована РФ)", - accessorKey: "data.q1.transfer_q2_economy_rf", - columnLetter: "BW", - size: 320, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"экономия (будет использована РФ)", + "accessorKey":"data.q1.transfer_q2_economy_rf", + "columnLetter":"BW", + "size":320, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Комментарий переноса во2 квартал", - accessorKey: "data.q1.transfer_next_comment", - columnLetter: "BX", - size: 330, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий переноса во2 квартал", + "accessorKey":"data.q1.transfer_next_comment", + "columnLetter":"BX", + "size":330, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Перенос в 3 квартал", - accessorKey: "data.q1.transfer_q3", - columnLetter: "BY", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Перенос в 3 квартал", + "accessorKey":"data.q1.transfer_q3", + "columnLetter":"BY", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Перенос в 4 квартал", - accessorKey: "data.q1.transfer_q4", - columnLetter: "BZ", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Перенос в 4 квартал", + "accessorKey":"data.q1.transfer_q4", + "columnLetter":"BZ", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Комментарий переноса в3 и 4 квартал", - accessorKey: "data.q1.transfer_far_comment", - columnLetter: "CA", - size: 360, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий переноса в3 и 4 квартал", + "accessorKey":"data.q1.transfer_far_comment", + "columnLetter":"CA", + "size":360, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Перенос в фонд экономии", - accessorKey: "data.q1.transfer_econ", - columnLetter: "CB", - size: 230, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Перенос в фонд экономии", + "accessorKey":"data.q1.transfer_econ", + "columnLetter":"CB", + "size":230, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "ВСЕГО", - accessorKey: "data.q1.total", - columnLetter: "CC", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"ВСЕГО", + "accessorKey":"data.q1.total", + "columnLetter":"CC", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2 квартал 2026 года", - accessorKey: "2_kvartal_2026_goda", - columns: [ + "header":"2 квартал 2026 года", + "accessorKey":"2_kvartal_2026_goda", + "columns":[ { - header: "Корректировка базового плана", - accessorKey: "2_kvartal_2026_goda_korrektirovka_bazovogo_plana", - columns: [ + "header":"Корректировка базового плана", + "accessorKey":"2_kvartal_2026_goda_korrektirovka_bazovogo_plana", + "columns":[ { - header: - "Изменение целевого назначения перенесенной экономии ( =0)", - accessorKey: "data.q2.target_change", - columnLetter: "CE", - size: 570, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Изменение целевого назначения перенесенной экономии ( =0)", + "accessorKey":"data.q2.target_change", + "columnLetter":"CE", + "size":570, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Корректировка статей базового плана ( =0)", - accessorKey: "data.q2.base_correction", - columnLetter: "CF", - size: 410, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректировка статей базового плана ( =0)", + "accessorKey":"data.q2.base_correction", + "columnLetter":"CF", + "size":410, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Комментарий изменения базового плана", - accessorKey: "data.q2.base_correction_comment", - columnLetter: "CG", - size: 360, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий изменения базового плана", + "accessorKey":"data.q2.base_correction_comment", + "columnLetter":"CG", + "size":360, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "ДФиПУвеличение плана( >0)", - accessorKey: "data.q2.revision_inc", - columnLetter: "CH", - size: 270, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ДФиПУвеличение плана( >0)", + "accessorKey":"data.q2.revision_inc", + "columnLetter":"CH", + "size":270, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "ДФиПCеквестр плана( <0)", - accessorKey: "data.q2.revision_seq", - columnLetter: "CI", - size: 250, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ДФиПCеквестр плана( <0)", + "accessorKey":"data.q2.revision_seq", + "columnLetter":"CI", + "size":250, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q2.revision_comment", - columnLetter: "CJ", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q2.revision_comment", + "columnLetter":"CJ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Скорректированный план на подпись", - accessorKey: "data.q2.new_plan", - columnLetter: "CK", - size: 330, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Скорректированный план на подпись", + "accessorKey":"data.q2.new_plan", + "columnLetter":"CK", + "size":330, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - - { - header: "Корректировки плановых значений", - accessorKey: - "2_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", - columns: [ - { - header: "Текущие( = 0)", - accessorKey: "data.q2.adj_current", - columnLetter: "CM", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Корректиз сметы ГО", - accessorKey: "data.q2.adj_ssp", - columnLetter: "CN", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Корректиз резерва", - accessorKey: "data.q2.adj_reserve", - columnLetter: "CO", - size: 180, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Комментарий", - accessorKey: "data.q2.adj_comment", - columnLetter: "CP", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Скорректированный план с учетом корректировок", - accessorKey: "data.q2.corrected_plan", - columnLetter: "CQ", - size: 450, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Согласование платежей", - accessorKey: "2_kvartal_2026_goda_soglasovanie_platezhey", - columns: [ - { - header: "Дата платежа", - accessorKey: "data.q2.pay_date", - columnLetter: "CS", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Сумма платежа", - accessorKey: "data.q2.pay_amount", - columnLetter: "CT", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Комментарий", - accessorKey: "data.q2.pay_comment", - columnLetter: "CU", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Предоставление акта", - accessorKey: "data.q2.pay_act", - columnLetter: "CV", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Фактические расходы", - accessorKey: "2_kvartal_2026_goda_fakticheskie_raskhody", - columns: [ - { - header: "Бронь2 квартал", - accessorKey: "data.q2.booking", - columnLetter: "CX", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "ФактАпрель", - accessorKey: "data.q2.actual_m1", - columnLetter: "CY", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "ФактМай", - accessorKey: "data.q2.actual_m2", - columnLetter: "CZ", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "ФактИюнь", - accessorKey: "data.q2.actual_m3", - columnLetter: "DA", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Факт2 квартал", - accessorKey: "data.q2.actual_quarter", - columnLetter: "DB", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Остаток после брони 2 квартала", - accessorKey: "data.q2.residual_after_booking", - columnLetter: "DC", - size: 300, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Остаток после факта 2 квартала", - accessorKey: "data.q2.residual_after_actual", - columnLetter: "DD", - size: 300, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Корректировка остатка в последующие кварталы", - accessorKey: - "2_kvartal_2026_goda_korrektirovka_ostatka_v_posleduyuschie_kvartaly", - columns: [ - { - header: "Перенос в 3 квартал", - accessorKey: "data.q2.transfer_q3", - columnLetter: "DF", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Задержка списания расходов / предоставления актов", - accessorKey: "data.q2.transfer_q3_delay_acts", - columnLetter: "DG", - size: 490, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Задержка закупочных процедур", - accessorKey: "data.q2.transfer_q3_delay_procurement", - columnLetter: "DH", - size: 280, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "экономия (будет использована РФ)", - accessorKey: "data.q2.transfer_q3_economy_rf", - columnLetter: "DI", - size: 320, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Комментарий переноса в3 квартал", - accessorKey: "data.q2.transfer_next_comment", - columnLetter: "DJ", - size: 320, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Перенос в 4 квартал", - accessorKey: "data.q2.transfer_q4", - columnLetter: "DK", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Комментарий переноса в4 квартал", - accessorKey: "data.q2.transfer_far_comment", - columnLetter: "DL", - size: 320, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Перенос в фонд экономии", - accessorKey: "data.q2.transfer_econ", - columnLetter: "DM", - size: 230, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "ВСЕГО", - accessorKey: "data.q2.total", - columnLetter: "DN", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "3 квартал 2026 года", - accessorKey: "3_kvartal_2026_goda", - columns: [ - { - header: "Корректировка базового плана", - accessorKey: "3_kvartal_2026_goda_korrektirovka_bazovogo_plana", - columns: [ - { - header: - "Изменение целевого назначения перенесенной экономии ( =0)", - accessorKey: "data.q3.target_change", - columnLetter: "DP", - size: 570, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Корректировка статей базового плана ( =0)", - accessorKey: "data.q3.base_correction", - columnLetter: "DQ", - size: 410, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Комментарий изменения базового плана", - accessorKey: "data.q3.base_correction_comment", - columnLetter: "DR", - size: 360, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "ДФиПУвеличение плана( >0)", - accessorKey: "data.q3.revision_inc", - columnLetter: "DS", - size: 270, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "ДФиПCеквестр плана( <0)", - accessorKey: "data.q3.revision_seq", - columnLetter: "DT", - size: 250, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Комментарий", - accessorKey: "data.q3.revision_comment", - columnLetter: "DU", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Скорректированный план на подпись", - accessorKey: "data.q3.new_plan", - columnLetter: "DV", - size: 330, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Корректировки плановых значений", - accessorKey: - "3_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", - columns: [ + "header":"Корректировки плановых значений", + "accessorKey":"2_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", + "columns":[ { - header: "Текущие( = 0)", - accessorKey: "data.q3.adj_current", - columnLetter: "DX", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Текущие( = 0)", + "accessorKey":"data.q2.adj_current", + "columnLetter":"CM", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Корректиз сметы ГО", - accessorKey: "data.q3.adj_ssp", - columnLetter: "DY", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректиз сметы ГО", + "accessorKey":"data.q2.adj_ssp", + "columnLetter":"CN", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Корректиз резерва", - accessorKey: "data.q3.adj_reserve", - columnLetter: "DZ", - size: 180, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректиз резерва", + "accessorKey":"data.q2.adj_reserve", + "columnLetter":"CO", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q3.adj_comment", - columnLetter: "EA", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q2.adj_comment", + "columnLetter":"CP", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Скорректированный план с учетом корректировок", - accessorKey: "data.q3.corrected_plan", - columnLetter: "EB", - size: 450, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Скорректированный план с учетом корректировок", + "accessorKey":"data.q2.corrected_plan", + "columnLetter":"CQ", + "size":450, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Согласование платежей", - accessorKey: "3_kvartal_2026_goda_soglasovanie_platezhey", - columns: [ + "header":"Согласование платежей", + "accessorKey":"2_kvartal_2026_goda_soglasovanie_platezhey", + "columns":[ { - header: "Дата платежа", - accessorKey: "data.q3.pay_date", - columnLetter: "ED", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Дата платежа", + "accessorKey":"data.q2.pay_date", + "columnLetter":"CS", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Сумма платежа", - accessorKey: "data.q3.pay_amount", - columnLetter: "EE", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Сумма платежа", + "accessorKey":"data.q2.pay_amount", + "columnLetter":"CT", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q3.pay_comment", - columnLetter: "EF", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q2.pay_comment", + "columnLetter":"CU", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Предоставление акта", - accessorKey: "data.q3.pay_act", - columnLetter: "EG", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Предоставление акта", + "accessorKey":"data.q2.pay_act", + "columnLetter":"CV", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Фактические расходы", - accessorKey: "3_kvartal_2026_goda_fakticheskie_raskhody", - columns: [ + "header":"Фактические расходы", + "accessorKey":"2_kvartal_2026_goda_fakticheskie_raskhody", + "columns":[ { - header: "Бронь3 квартал", - accessorKey: "data.q3.booking", - columnLetter: "EI", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь2 квартал", + "accessorKey":"data.q2.booking", + "columnLetter":"CX", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "ФактИюль", - accessorKey: "data.q3.actual_m1", - columnLetter: "EJ", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактАпрель", + "accessorKey":"data.q2.actual_m1", + "columnLetter":"CY", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "ФактАвгуст", - accessorKey: "data.q3.actual_m2", - columnLetter: "EK", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактМай", + "accessorKey":"data.q2.actual_m2", + "columnLetter":"CZ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "ФактСентябрь", - accessorKey: "data.q3.actual_m3", - columnLetter: "EL", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактИюнь", + "accessorKey":"data.q2.actual_m3", + "columnLetter":"DA", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "Факт3 квартал", - accessorKey: "data.q3.actual_quarter", - columnLetter: "EM", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Факт2 квартал", + "accessorKey":"data.q2.actual_quarter", + "columnLetter":"DB", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "Остаток после брони 3 квартала", - accessorKey: "data.q3.residual_after_booking", - columnLetter: "EN", - size: 300, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Остаток после брони 2 квартала", + "accessorKey":"data.q2.residual_after_booking", + "columnLetter":"DC", + "size":300, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Остаток после факта 3 квартала", - accessorKey: "data.q3.residual_after_actual", - columnLetter: "EO", - size: 300, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Остаток после факта 2 квартала", + "accessorKey":"data.q2.residual_after_actual", + "columnLetter":"DD", + "size":300, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Корректировка остатка в последующий квартал", - accessorKey: - "3_kvartal_2026_goda_korrektirovka_ostatka_v_posleduyuschiy_kvartal", - columns: [ + "header":"Корректировка остатка в последующие кварталы", + "accessorKey":"2_kvartal_2026_goda_korrektirovka_ostatka_v_posleduyuschie_kvartaly", + "columns":[ { - header: "Перенос в 4 квартал", - accessorKey: "data.q3.transfer_q4", - columnLetter: "EQ", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Перенос в 3 квартал", + "accessorKey":"data.q2.transfer_q3", + "columnLetter":"DF", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Задержка списания расходов / предоставления актов", - accessorKey: "data.q3.transfer_q4_delay_acts", - columnLetter: "ER", - size: 490, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Задержка списания расходов / предоставления актов", + "accessorKey":"data.q2.transfer_q3_delay_acts", + "columnLetter":"DG", + "size":490, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Задержка закупочных процедур", - accessorKey: "data.q3.transfer_q4_delay_procurement", - columnLetter: "ES", - size: 280, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Задержка закупочных процедур", + "accessorKey":"data.q2.transfer_q3_delay_procurement", + "columnLetter":"DH", + "size":280, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "экономия (будет использована РФ)", - accessorKey: "data.q3.transfer_q4_economy_rf", - columnLetter: "ET", - size: 320, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"экономия (будет использована РФ)", + "accessorKey":"data.q2.transfer_q3_economy_rf", + "columnLetter":"DI", + "size":320, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Комментарий переноса в4 квартал", - accessorKey: "data.q3.transfer_next_comment", - columnLetter: "EU", - size: 320, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий переноса в3 квартал", + "accessorKey":"data.q2.transfer_next_comment", + "columnLetter":"DJ", + "size":320, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Перенос в фонд экономии", - accessorKey: "data.q3.transfer_econ", - columnLetter: "EV", - size: 230, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Перенос в 4 квартал", + "accessorKey":"data.q2.transfer_q4", + "columnLetter":"DK", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "ВСЕГО", - accessorKey: "data.q3.total", - columnLetter: "EW", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий переноса в4 квартал", + "accessorKey":"data.q2.transfer_far_comment", + "columnLetter":"DL", + "size":320, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, + { + "header":"Перенос в фонд экономии", + "accessorKey":"data.q2.transfer_econ", + "columnLetter":"DM", + "size":230, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + }, + { + "header":"ВСЕГО", + "accessorKey":"data.q2.total", + "columnLetter":"DN", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "4 квартал 2026 года", - accessorKey: "4_kvartal_2026_goda", - columns: [ + "header":"3 квартал 2026 года", + "accessorKey":"3_kvartal_2026_goda", + "columns":[ { - header: "Корректировка базового плана", - accessorKey: "4_kvartal_2026_goda_korrektirovka_bazovogo_plana", - columns: [ + "header":"Корректировка базового плана", + "accessorKey":"3_kvartal_2026_goda_korrektirovka_bazovogo_plana", + "columns":[ { - header: - "Изменение целевого назначения перенесенной экономии ( =0)", - accessorKey: "data.q4.target_change", - columnLetter: "EY", - size: 570, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Изменение целевого назначения перенесенной экономии ( =0)", + "accessorKey":"data.q3.target_change", + "columnLetter":"DP", + "size":570, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Корректировка статей базового плана ( =0)", - accessorKey: "data.q4.base_correction", - columnLetter: "EZ", - size: 410, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректировка статей базового плана ( =0)", + "accessorKey":"data.q3.base_correction", + "columnLetter":"DQ", + "size":410, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "Комментарий изменения базового плана", - accessorKey: "data.q4.base_correction_comment", - columnLetter: "FA", - size: 360, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий изменения базового плана", + "accessorKey":"data.q3.base_correction_comment", + "columnLetter":"DR", + "size":360, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, { - header: "ДФиПУвеличение плана( >0)", - accessorKey: "data.q4.revision_inc", - columnLetter: "FB", - size: 270, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ДФиПУвеличение плана( >0)", + "accessorKey":"data.q3.revision_inc", + "columnLetter":"DS", + "size":270, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "ДФиПCеквестр плана( <0)", - accessorKey: "data.q4.revision_seq", - columnLetter: "FC", - size: 250, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ДФиПCеквестр плана( <0)", + "accessorKey":"data.q3.revision_seq", + "columnLetter":"DT", + "size":250, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q4.revision_comment", - columnLetter: "FD", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q3.revision_comment", + "columnLetter":"DU", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Скорректированный план на подпись", - accessorKey: "data.q4.new_plan", - columnLetter: "FE", - size: 330, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Скорректированный план на подпись", + "accessorKey":"data.q3.new_plan", + "columnLetter":"DV", + "size":330, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, - + { - header: "Корректировки плановых значений", - accessorKey: - "4_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", - columns: [ + "header":"Корректировки плановых значений", + "accessorKey":"3_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", + "columns":[ { - header: "Текущие( = 0)", - accessorKey: "data.q4.adj_current", - columnLetter: "FG", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Текущие( = 0)", + "accessorKey":"data.q3.adj_current", + "columnLetter":"DX", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Корректиз сметы ГО", - accessorKey: "data.q4.adj_ssp", - columnLetter: "FH", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректиз сметы ГО", + "accessorKey":"data.q3.adj_ssp", + "columnLetter":"DY", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Корректиз резерва", - accessorKey: "data.q4.adj_reserve", - columnLetter: "FI", - size: 180, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректиз резерва", + "accessorKey":"data.q3.adj_reserve", + "columnLetter":"DZ", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q4.adj_comment", - columnLetter: "FJ", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q3.adj_comment", + "columnLetter":"EA", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, { - header: "Скорректированный план с учетом корректировок", - accessorKey: "data.q4.corrected_plan", - columnLetter: "FK", - size: 450, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Скорректированный план с учетом корректировок", + "accessorKey":"data.q3.corrected_plan", + "columnLetter":"EB", + "size":450, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Согласование платежей", - accessorKey: "4_kvartal_2026_goda_soglasovanie_platezhey", - columns: [ + "header":"Согласование платежей", + "accessorKey":"3_kvartal_2026_goda_soglasovanie_platezhey", + "columns":[ { - header: "Дата платежа", - accessorKey: "data.q4.pay_date", - columnLetter: "FM", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Дата платежа", + "accessorKey":"data.q3.pay_date", + "columnLetter":"ED", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Сумма платежа", - accessorKey: "data.q4.pay_amount", - columnLetter: "FN", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Сумма платежа", + "accessorKey":"data.q3.pay_amount", + "columnLetter":"EE", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Комментарий", - accessorKey: "data.q4.pay_comment", - columnLetter: "FO", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Комментарий", + "accessorKey":"data.q3.pay_comment", + "columnLetter":"EF", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } }, { - header: "Предоставление акта", - accessorKey: "data.q4.pay_act", - columnLetter: "FP", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Предоставление акта", + "accessorKey":"data.q3.pay_act", + "columnLetter":"EG", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Фактические расходы", - accessorKey: "4_kvartal_2026_goda_fakticheskie_raskhody", - columns: [ + "header":"Фактические расходы", + "accessorKey":"3_kvartal_2026_goda_fakticheskie_raskhody", + "columns":[ { - header: "Бронь4 квартал", - accessorKey: "data.q4.booking", - columnLetter: "FR", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Бронь3 квартал", + "accessorKey":"data.q3.booking", + "columnLetter":"EI", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "ФактОктябрь", - accessorKey: "data.q4.actual_m1", - columnLetter: "FS", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактИюль", + "accessorKey":"data.q3.actual_m1", + "columnLetter":"EJ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "ФактНоябрь", - accessorKey: "data.q4.actual_m2", - columnLetter: "FT", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактАвгуст", + "accessorKey":"data.q3.actual_m2", + "columnLetter":"EK", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "ФактДекабрь", - accessorKey: "data.q4.actual_m3", - columnLetter: "FU", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"ФактСентябрь", + "accessorKey":"data.q3.actual_m3", + "columnLetter":"EL", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "СПОД(Январь)", - accessorKey: "data.q4.actual_spod", - columnLetter: "FV", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Факт3 квартал", + "accessorKey":"data.q3.actual_quarter", + "columnLetter":"EM", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } }, { - header: "Факт4 квартал(с уч СПОД)", - accessorKey: "data.q4.actual_quarter", - columnLetter: "FW", - size: 260, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Остаток после брони 3 квартала", + "accessorKey":"data.q3.residual_after_booking", + "columnLetter":"EN", + "size":300, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } }, { - header: "Остаток после брони 4 квартала (с уч СПОД)", - accessorKey: "data.q4.residual_after_booking", - columnLetter: "FX", - size: 420, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Остаток после факта 4 квартала (с уч СПОД)", - accessorKey: "data.q4.residual_after_actual", - columnLetter: "FY", - size: 420, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "header":"Остаток после факта 3 квартала", + "accessorKey":"data.q3.residual_after_actual", + "columnLetter":"EO", + "size":300, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, { - header: "Экономия", - accessorKey: "4_kvartal_2026_goda_ekonomiya", - columns: [ + "header":"Корректировка остатка в последующий квартал", + "accessorKey":"3_kvartal_2026_goda_korrektirovka_ostatka_v_posleduyuschiy_kvartal", + "columns":[ { - header: "Перенос в фонд экономии", - accessorKey: "data.q4.transfer_econ", - columnLetter: "GA", - size: 230, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Перенос в 4 квартал", + "accessorKey":"data.q3.transfer_q4", + "columnLetter":"EQ", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, + { + "header":"Задержка списания расходов / предоставления актов", + "accessorKey":"data.q3.transfer_q4_delay_acts", + "columnLetter":"ER", + "size":490, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + }, + { + "header":"Задержка закупочных процедур", + "accessorKey":"data.q3.transfer_q4_delay_procurement", + "columnLetter":"ES", + "size":280, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + }, + { + "header":"экономия (будет использована РФ)", + "accessorKey":"data.q3.transfer_q4_economy_rf", + "columnLetter":"ET", + "size":320, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + }, + { + "header":"Комментарий переноса в4 квартал", + "accessorKey":"data.q3.transfer_next_comment", + "columnLetter":"EU", + "size":320, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + }, + { + "header":"Перенос в фонд экономии", + "accessorKey":"data.q3.transfer_econ", + "columnLetter":"EV", + "size":230, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + }, + { + "header":"ВСЕГО", + "accessorKey":"data.q3.total", + "columnLetter":"EW", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, { - header: "2026 год", - accessorKey: "2026_god_43", - columns: [ + "header":"4 квартал 2026 года", + "accessorKey":"4_kvartal_2026_goda", + "columns":[ { - header: "", - accessorKey: "2026_god_field_5", - columns: [ + "header":"Корректировка базового плана", + "accessorKey":"4_kvartal_2026_goda_korrektirovka_bazovogo_plana", + "columns":[ { - header: "Сумма фактических расходов за год", - accessorKey: "data.totals.fact_year", - columnLetter: "GC", - size: 330, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Изменение целевого назначения перенесенной экономии ( =0)", + "accessorKey":"data.q4.target_change", + "columnLetter":"EY", + "size":570, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, - { - header: "Сумма оплаты за год", - accessorKey: "data.totals.pay_year", - columnLetter: "GE", - size: 190, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "header":"Корректировка статей базового плана ( =0)", + "accessorKey":"data.q4.base_correction", + "columnLetter":"EZ", + "size":410, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } }, + { + "header":"Комментарий изменения базового плана", + "accessorKey":"data.q4.base_correction_comment", + "columnLetter":"FA", + "size":360, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + }, + { + "header":"ДФиПУвеличение плана( >0)", + "accessorKey":"data.q4.revision_inc", + "columnLetter":"FB", + "size":270, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + }, + { + "header":"ДФиПCеквестр плана( <0)", + "accessorKey":"data.q4.revision_seq", + "columnLetter":"FC", + "size":250, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + }, + { + "header":"Комментарий", + "accessorKey":"data.q4.revision_comment", + "columnLetter":"FD", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + }, + { + "header":"Скорректированный план на подпись", + "accessorKey":"data.q4.new_plan", + "columnLetter":"FE", + "size":330, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + }, + + { + "header":"Корректировки плановых значений", + "accessorKey":"4_kvartal_2026_goda_korrektirovki_planovykh_znacheniy", + "columns":[ + { + "header":"Текущие( = 0)", + "accessorKey":"data.q4.adj_current", + "columnLetter":"FG", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } }, - }, + { + "header":"Корректиз сметы ГО", + "accessorKey":"data.q4.adj_ssp", + "columnLetter":"FH", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + }, + { + "header":"Корректиз резерва", + "accessorKey":"data.q4.adj_reserve", + "columnLetter":"FI", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + }, + { + "header":"Комментарий", + "accessorKey":"data.q4.adj_comment", + "columnLetter":"FJ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + }, + { + "header":"Скорректированный план с учетом корректировок", + "accessorKey":"data.q4.corrected_plan", + "columnLetter":"FK", + "size":450, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFF66", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } }, + { + "header":"Согласование платежей", + "accessorKey":"4_kvartal_2026_goda_soglasovanie_platezhey", + "columns":[ + { + "header":"Дата платежа", + "accessorKey":"data.q4.pay_date", + "columnLetter":"FM", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + }, + { + "header":"Сумма платежа", + "accessorKey":"data.q4.pay_amount", + "columnLetter":"FN", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + }, + { + "header":"Комментарий", + "accessorKey":"data.q4.pay_comment", + "columnLetter":"FO", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + }, + { + "header":"Предоставление акта", + "accessorKey":"data.q4.pay_act", + "columnLetter":"FP", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + }, + { + "header":"Фактические расходы", + "accessorKey":"4_kvartal_2026_goda_fakticheskie_raskhody", + "columns":[ + { + "header":"Бронь4 квартал", + "accessorKey":"data.q4.booking", + "columnLetter":"FR", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } + }, + { + "header":"ФактОктябрь", + "accessorKey":"data.q4.actual_m1", + "columnLetter":"FS", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"ФактНоябрь", + "accessorKey":"data.q4.actual_m2", + "columnLetter":"FT", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"ФактДекабрь", + "accessorKey":"data.q4.actual_m3", + "columnLetter":"FU", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"СПОД(Январь)", + "accessorKey":"data.q4.actual_spod", + "columnLetter":"FV", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт4 квартал(с уч СПОД)", + "accessorKey":"data.q4.actual_quarter", + "columnLetter":"FW", + "size":260, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Остаток после брони 4 квартала (с уч СПОД)", + "accessorKey":"data.q4.residual_after_booking", + "columnLetter":"FX", + "size":420, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FABF8F", + "color":"#000000" + } + } + }, + { + "header":"Остаток после факта 4 квартала (с уч СПОД)", + "accessorKey":"data.q4.residual_after_actual", + "columnLetter":"FY", + "size":420, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + }, + { + "header":"Экономия", + "accessorKey":"4_kvartal_2026_goda_ekonomiya", + "columns":[ + { + "header":"Перенос в фонд экономии", + "accessorKey":"data.q4.transfer_econ", + "columnLetter":"GA", + "size":230, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#903C39", + "color":"#FFFFFF" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + } ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } }, - ], - }, -}; + { + "header":"2026 год.", + "accessorKey":"2026_god_43", + "columns":[ + { + "header":"", + "accessorKey":"2026_god_field_5", + "columns":[ + { + "header":"Сумма фактических расходов за год", + "accessorKey":"data.totals.fact_year", + "columnLetter":"GC", + "size":330, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Сумма оплаты за год", + "accessorKey":"data.totals.pay_year", + "columnLetter":"GE", + "size":190, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#95B3D7", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#B2A1C7", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#FFFFFF", + "color":"#000000" + } + } + } + ] + } +} \ No newline at end of file diff --git a/web/src/components/RealtimeTable/constants/FORM_2/CAP.js b/web/src/components/RealtimeTable/constants/FORM_2/CAP.js index 5fdd11c..7d1c3c7 100644 --- a/web/src/components/RealtimeTable/constants/FORM_2/CAP.js +++ b/web/src/components/RealtimeTable/constants/FORM_2/CAP.js @@ -29,114 +29,6 @@ export const config = { color_type: orangeColumn, accessorKey: "data.header.internal_order", }, - "data.collegial.approved": { - color_type: orangeColumn, - accessorKey: "data.collegial.approved", - }, - "data.collegial.protocol": { - color_type: orangeColumn, - accessorKey: "data.collegial.protocol", - }, - field_kollegialnye_organy_field: { - color_type: orangeColumn, - accessorKey: "field_kollegialnye_organy_field", - }, - "data.collegial.note": { - color_type: orangeColumn, - accessorKey: "data.collegial.note", - }, - "data.ckk.ceiling": { - color_type: orangeColumn, - accessorKey: "data.ckk.ceiling", - }, - "data.ckk.rf_schedule": { - color_type: orangeColumn, - accessorKey: "data.ckk.rf_schedule", - }, - "data.ckk.deadline": { - color_type: orangeColumn, - accessorKey: "data.ckk.deadline", - }, - "data.ckk.proc_plan": { - color_type: orangeColumn, - accessorKey: "data.ckk.proc_plan", - }, - "data.ckk.proc_method": { - color_type: orangeColumn, - accessorKey: "data.ckk.proc_method", - }, - "data.ckk.comment": { - color_type: orangeColumn, - accessorKey: "data.ckk.comment", - }, - "data.contract_detail.counterparty": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.counterparty", - }, - "data.contract_detail.reference": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.reference", - }, - "data.contract_detail.addenda": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.addenda", - }, - "data.contract_detail.subject": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.subject", - }, - "data.contract_detail.currency": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.currency", - }, - "data.contract_detail.ceiling": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.ceiling", - }, - "data.contract_detail.rf_schedule": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.rf_schedule", - }, - "data.contract_detail.vat_rate": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.vat_rate", - }, - "data.contract_detail.exchange_rate": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.exchange_rate", - }, - "data.contract_detail.amount_foreign": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.amount_foreign", - }, - "data.contract_detail.deadline": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.deadline", - }, - "data.contract_detail.payment_scheme": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.payment_scheme", - }, - "data.contract_detail.act": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.act", - }, - "data.contract_detail.comment": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.comment", - }, - field_ref_field: { - color_type: whiteColumn, - accessorKey: "field_ref_field", - }, - "data.totals.fact_year": { - color_type: greenColumn, - accessorKey: "data.totals.fact_year", - }, - "data.totals.pay_year": { - color_type: blueColumn, - accessorKey: "data.totals.pay_year", - }, "data.plan.q1": { color_type: orangeColumn, accessorKey: "data.plan.q1", @@ -266,37 +158,133 @@ export const config = { accessorKey: "data.approved.year", }, "data.collegial.approved": { - color_type: whiteColumn, + color_type: orangeColumn, accessorKey: "data.collegial.approved", }, "data.collegial.protocol": { - color_type: whiteColumn, + color_type: orangeColumn, accessorKey: "data.collegial.protocol", }, field_kollegialnye_organy_field: { - color_type: whiteColumn, + color_type: orangeColumn, accessorKey: "field_kollegialnye_organy_field", }, "data.collegial.note": { - color_type: whiteColumn, + color_type: orangeColumn, accessorKey: "data.collegial.note", }, - field_field_field: { - color_type: whiteColumn, - accessorKey: "field_field_field", - }, "data.ckk.ceiling": { - color_type: whiteColumn, + color_type: orangeColumn, accessorKey: "data.ckk.ceiling", }, "data.ckk.q1": { color_type: orangeColumn, accessorKey: "data.ckk.q1", }, + "data.ckk.q2": { + color_type: orangeColumn, + accessorKey: "data.ckk.q2", + }, + "data.ckk.q3": { + color_type: orangeColumn, + accessorKey: "data.ckk.q3", + }, + "data.ckk.q4": { + color_type: orangeColumn, + accessorKey: "data.ckk.q4", + }, + "data.ckk.rf_schedule": { + color_type: orangeColumn, + accessorKey: "data.ckk.rf_schedule", + }, + "data.ckk.deadline": { + color_type: orangeColumn, + accessorKey: "data.ckk.deadline", + }, + "data.ckk.proc_plan": { + color_type: orangeColumn, + accessorKey: "data.ckk.proc_plan", + }, + "data.ckk.proc_method": { + color_type: orangeColumn, + accessorKey: "data.ckk.proc_method", + }, + "data.ckk.comment": { + color_type: orangeColumn, + accessorKey: "data.ckk.comment", + }, + "data.contract_detail.counterparty": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.counterparty", + }, + "data.contract_detail.reference": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.reference", + }, + "data.contract_detail.addenda": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.addenda", + }, + "data.contract_detail.subject": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.subject", + }, + "data.contract_detail.currency": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.currency", + }, + "data.contract_detail.ceiling": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.ceiling", + }, "data.contract_detail.q1": { color_type: orangeColumn, accessorKey: "data.contract_detail.q1", }, + "data.contract_detail.q2": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.q2", + }, + "data.contract_detail.q3": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.q3", + }, + "data.contract_detail.q4": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.q4", + }, + "data.contract_detail.rf_schedule": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.rf_schedule", + }, + "data.contract_detail.vat_rate": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.vat_rate", + }, + "data.contract_detail.exchange_rate": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.exchange_rate", + }, + "data.contract_detail.amount_foreign": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.amount_foreign", + }, + "data.contract_detail.deadline": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.deadline", + }, + "data.contract_detail.payment_scheme": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.payment_scheme", + }, + "data.contract_detail.act": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.act", + }, + "data.contract_detail.comment": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.comment", + }, "data.q1.adj_current": { color_type: yellowColumn, accessorKey: "data.q1.adj_current", @@ -310,12 +298,13 @@ export const config = { accessorKey: "data.q1.adj_rf", }, "data.q1.adj_reserve": { - color_type: whiteColumn, + color_type: yellowColumn, accessorKey: "data.q1.adj_reserve", }, - "1_kv_26_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc": { + "1_kvartal_2026_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc": { color_type: redColumn, - accessorKey: "1_kv_26_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc", + accessorKey: + "1_kvartal_2026_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc", }, "data.q1.adj_comment": { color_type: yellowColumn, @@ -325,6 +314,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q1.corrected_plan", }, + "1_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "1_kvartal_2026_ref_field", + }, "data.q1.pay_date": { color_type: blueColumn, accessorKey: "data.q1.pay_date", @@ -349,6 +342,10 @@ export const config = { color_type: blueColumn, accessorKey: "data.q1.pay_act", }, + "1_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "1_kvartal_2026_field_field", + }, "data.q1.booking": { color_type: orangeColumn, accessorKey: "data.q1.booking", @@ -397,14 +394,6 @@ export const config = { color_type: redColumn, accessorKey: "data.q1.total", }, - "data.ckk.q2": { - color_type: orangeColumn, - accessorKey: "data.ckk.q2", - }, - "data.contract_detail.q2": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.q2", - }, "data.q2.rev_eco": { color_type: redColumn, accessorKey: "data.q2.rev_eco", @@ -429,6 +418,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q2.new_plan", }, + "2_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "2_kvartal_2026_field_field", + }, "data.q2.adj_current": { color_type: yellowColumn, accessorKey: "data.q2.adj_current", @@ -445,14 +438,19 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q2.adj_reserve", }, - "2_kv_26_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc": { + "2_kvartal_2026_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc": { color_type: redColumn, - accessorKey: "2_kv_26_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc", + accessorKey: + "2_kvartal_2026_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc", }, "data.q2.corrected_plan": { color_type: yellowColumn, accessorKey: "data.q2.corrected_plan", }, + "2_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "2_kvartal_2026_ref_field", + }, "data.q2.pay_date": { color_type: blueColumn, accessorKey: "data.q2.pay_date", @@ -521,14 +519,6 @@ export const config = { color_type: redColumn, accessorKey: "data.q2.total", }, - "data.ckk.q3": { - color_type: orangeColumn, - accessorKey: "data.ckk.q3", - }, - "data.contract_detail.q3": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.q3", - }, "data.q3.rev_eco": { color_type: redColumn, accessorKey: "data.q3.rev_eco", @@ -553,6 +543,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q3.new_plan", }, + "3_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "3_kvartal_2026_field_field", + }, "data.q3.adj_current": { color_type: yellowColumn, accessorKey: "data.q3.adj_current", @@ -569,14 +563,19 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q3.adj_reserve", }, - "3_kv_26_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc": { + "3_kvartal_2026_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc": { color_type: redColumn, - accessorKey: "3_kv_26_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc", + accessorKey: + "3_kvartal_2026_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc", }, "data.q3.corrected_plan": { color_type: yellowColumn, accessorKey: "data.q3.corrected_plan", }, + "3_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "3_kvartal_2026_ref_field", + }, "data.q3.pay_date": { color_type: blueColumn, accessorKey: "data.q3.pay_date", @@ -641,14 +640,6 @@ export const config = { color_type: redColumn, accessorKey: "data.q3.total", }, - "data.ckk.q4": { - color_type: orangeColumn, - accessorKey: "data.ckk.q4", - }, - "data.contract_detail.q4": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.q4", - }, "data.q4.rev_eco": { color_type: redColumn, accessorKey: "data.q4.rev_eco", @@ -677,6 +668,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q4.new_plan", }, + "4_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "4_kvartal_2026_field_field", + }, "data.q4.adj_current": { color_type: yellowColumn, accessorKey: "data.q4.adj_current", @@ -697,6 +692,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q4.corrected_plan", }, + "4_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "4_kvartal_2026_ref_field", + }, "data.q4.pay_date": { color_type: blueColumn, accessorKey: "data.q4.pay_date", @@ -753,9 +752,9 @@ export const config = { color_type: greenColumn, accessorKey: "data.q4.rem_actual", }, - "4_kv_26_zakrytie_4_go_kvartala_field": { + "4_kvartal_2026_zakrytie_4_go_kvartala_field": { color_type: redColumn, - accessorKey: "4_kv_26_zakrytie_4_go_kvartala_field", + accessorKey: "4_kvartal_2026_zakrytie_4_go_kvartala_field", }, "data.q4.economy": { color_type: redColumn, @@ -765,10 +764,18 @@ export const config = { color_type: redColumn, accessorKey: "data.q4.total", }, + "data.totals.fact_year": { + color_type: greenColumn, + accessorKey: "data.totals.fact_year", + }, + "data.totals.pay_year": { + color_type: blueColumn, + accessorKey: "data.totals.pay_year", + }, }, columns: [ { - header: "", + header: " ", accessorKey: "field", columns: [ { @@ -783,12 +790,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "ID статьи", @@ -802,12 +803,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "ID группы номенклатуры", @@ -821,12 +816,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "Наименование", @@ -840,12 +829,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "Внутренний заказ", @@ -859,12 +842,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, ], muiTableHeadCellProps: { @@ -1075,7 +1052,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, @@ -1096,12 +1073,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "Назначение расхода фактической аллокации", @@ -1116,17 +1087,11 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, @@ -1234,7 +1199,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, @@ -1342,7 +1307,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, @@ -1431,13 +1396,13 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, }, { - header: "-", + header: " ", accessorKey: "field_6", columns: [ { @@ -1487,12 +1452,23 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, }, - + ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, + { + header: " ", + accessorKey: "field_10", + columns: [ { header: "ЦКК", accessorKey: "field_tskk", @@ -1518,7 +1494,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1531,7 +1507,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1544,7 +1520,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1557,7 +1533,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1630,11 +1606,23 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, }, + ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, + { + header: " ", + accessorKey: "field_20", + columns: [ { header: "Договор", accessorKey: "field_dogovor", @@ -1725,7 +1713,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1738,7 +1726,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1751,7 +1739,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1764,7 +1752,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1876,7 +1864,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -1913,7 +1901,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -1932,7 +1920,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -1951,7 +1939,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -1970,7 +1958,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -1990,7 +1978,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2009,7 +1997,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2027,7 +2015,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2040,7 +2028,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2053,7 +2041,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2066,7 +2054,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2079,7 +2067,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2092,7 +2080,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2100,11 +2088,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, }, + { header: "Бронь 1 кв 26", accessorKey: "1_kvartal_2026_bron_1_kv_26", @@ -2125,7 +2114,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2144,7 +2133,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2163,7 +2152,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2182,7 +2171,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2201,7 +2190,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2220,7 +2209,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2239,7 +2228,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2256,8 +2245,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2269,8 +2258,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2282,8 +2271,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2295,8 +2284,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2308,16 +2297,16 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2354,8 +2343,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2373,8 +2362,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2392,8 +2381,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2411,8 +2400,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2430,8 +2419,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2449,7 +2438,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2475,7 +2464,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2494,7 +2483,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2513,7 +2502,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2532,7 +2521,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2552,11 +2541,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Платеж и предоставление акта", accessorKey: "2_kvartal_2026_platezh_i_predostavlenie_akta", @@ -2569,7 +2559,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2582,7 +2572,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2595,7 +2585,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2608,7 +2598,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2621,7 +2611,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2634,7 +2624,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2642,7 +2632,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2667,7 +2657,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2686,7 +2676,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2705,7 +2695,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2724,7 +2714,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2743,7 +2733,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2762,7 +2752,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2781,7 +2771,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2798,8 +2788,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2811,8 +2801,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2824,8 +2814,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2837,16 +2827,16 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2883,8 +2873,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2902,8 +2892,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2921,8 +2911,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2940,8 +2930,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2959,8 +2949,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2978,7 +2968,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3004,7 +2994,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3023,7 +3013,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3042,7 +3032,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3061,7 +3051,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3081,11 +3071,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Платеж и предоставление акта", accessorKey: "3_kvartal_2026_platezh_i_predostavlenie_akta", @@ -3098,7 +3089,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3111,7 +3102,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3124,7 +3115,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3137,7 +3128,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3150,7 +3141,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3163,7 +3154,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3171,7 +3162,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3196,7 +3187,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3215,7 +3206,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3234,7 +3225,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3253,7 +3244,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3272,7 +3263,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3291,7 +3282,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3310,7 +3301,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3327,8 +3318,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3340,8 +3331,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3353,16 +3344,16 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3399,8 +3390,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3418,8 +3409,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3437,8 +3428,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3456,8 +3447,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3482,8 +3473,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3501,7 +3492,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3527,7 +3518,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3546,7 +3537,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3565,7 +3556,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3584,7 +3575,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3603,11 +3594,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Платеж и предоставление акта", accessorKey: "4_kvartal_2026_platezh_i_predostavlenie_akta", @@ -3620,7 +3612,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3633,7 +3625,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3646,7 +3638,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3659,7 +3651,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3672,7 +3664,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3685,7 +3677,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3693,7 +3685,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3718,7 +3710,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3737,7 +3729,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3756,7 +3748,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3775,7 +3767,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3794,7 +3786,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3813,7 +3805,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3832,7 +3824,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3851,7 +3843,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3868,8 +3860,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3881,16 +3873,16 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3903,12 +3895,12 @@ export const config = { }, }, { - header: "Факт", - accessorKey: "fakt", + header: " ", + accessorKey: "88", columns: [ { header: "Факт 26", - accessorKey: "fakt_fakt_26", + accessorKey: "88_fakt_26", columns: [ { header: "", @@ -3916,11 +3908,17 @@ export const config = { columnLetter: "HE", size: 150, filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3934,12 +3932,12 @@ export const config = { }, }, { - header: "Сумма", - accessorKey: "summa", + header: " ", + accessorKey: "77", columns: [ { header: "Сумма оплаты", - accessorKey: "summa_summa_oplaty", + accessorKey: "77_summa_oplaty", columns: [ { header: "", @@ -3947,11 +3945,17 @@ export const config = { columnLetter: "HG", size: 150, filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, diff --git a/web/src/components/RealtimeTable/constants/FORM_2/OPER.js b/web/src/components/RealtimeTable/constants/FORM_2/OPER.js index 07065c6..2f68548 100644 --- a/web/src/components/RealtimeTable/constants/FORM_2/OPER.js +++ b/web/src/components/RealtimeTable/constants/FORM_2/OPER.js @@ -29,114 +29,6 @@ export const config = { color_type: blueColumn, accessorKey: "data.header.internal_order", }, - "data.collegial.approved": { - color_type: orangeColumn, - accessorKey: "data.collegial.approved", - }, - "data.collegial.protocol": { - color_type: orangeColumn, - accessorKey: "data.collegial.protocol", - }, - field_kollegialnye_organy_field: { - color_type: orangeColumn, - accessorKey: "field_kollegialnye_organy_field", - }, - "data.collegial.note": { - color_type: orangeColumn, - accessorKey: "data.collegial.note", - }, - "data.ckk.ceiling": { - color_type: orangeColumn, - accessorKey: "data.ckk.ceiling", - }, - "data.ckk.rf_schedule": { - color_type: orangeColumn, - accessorKey: "data.ckk.rf_schedule", - }, - "data.ckk.deadline": { - color_type: orangeColumn, - accessorKey: "data.ckk.deadline", - }, - "data.ckk.proc_plan": { - color_type: orangeColumn, - accessorKey: "data.ckk.proc_plan", - }, - "data.ckk.proc_method": { - color_type: orangeColumn, - accessorKey: "data.ckk.proc_method", - }, - "data.ckk.comment": { - color_type: orangeColumn, - accessorKey: "data.ckk.comment", - }, - "data.contract_detail.counterparty": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.counterparty", - }, - "data.contract_detail.reference": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.reference", - }, - "data.contract_detail.addenda": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.addenda", - }, - "data.contract_detail.subject": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.subject", - }, - "data.contract_detail.currency": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.currency", - }, - "data.contract_detail.ceiling": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.ceiling", - }, - "data.contract_detail.rf_schedule": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.rf_schedule", - }, - "data.contract_detail.vat_rate": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.vat_rate", - }, - "data.contract_detail.exchange_rate": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.exchange_rate", - }, - "data.contract_detail.amount_foreign": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.amount_foreign", - }, - "data.contract_detail.deadline": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.deadline", - }, - "data.contract_detail.payment_scheme": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.payment_scheme", - }, - "data.contract_detail.act": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.act", - }, - "data.contract_detail.comment": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.comment", - }, - field_ref_field: { - color_type: whiteColumn, - accessorKey: "field_ref_field", - }, - "data.totals.fact_year": { - color_type: greenColumn, - accessorKey: "data.totals.fact_year", - }, - "data.totals.pay_year": { - color_type: blueColumn, - accessorKey: "data.totals.pay_year", - }, "data.plan.q1": { color_type: blueColumn, accessorKey: "data.plan.q1", @@ -265,14 +157,134 @@ export const config = { color_type: blueColumn, accessorKey: "data.approved.year", }, + "data.collegial.approved": { + color_type: orangeColumn, + accessorKey: "data.collegial.approved", + }, + "data.collegial.protocol": { + color_type: orangeColumn, + accessorKey: "data.collegial.protocol", + }, + field_kollegialnye_organy_field: { + color_type: orangeColumn, + accessorKey: "field_kollegialnye_organy_field", + }, + "data.collegial.note": { + color_type: orangeColumn, + accessorKey: "data.collegial.note", + }, + "data.ckk.ceiling": { + color_type: orangeColumn, + accessorKey: "data.ckk.ceiling", + }, "data.ckk.q1": { color_type: orangeColumn, accessorKey: "data.ckk.q1", }, + "data.ckk.q2": { + color_type: orangeColumn, + accessorKey: "data.ckk.q2", + }, + "data.ckk.q3": { + color_type: orangeColumn, + accessorKey: "data.ckk.q3", + }, + "data.ckk.q4": { + color_type: orangeColumn, + accessorKey: "data.ckk.q4", + }, + "data.ckk.rf_schedule": { + color_type: orangeColumn, + accessorKey: "data.ckk.rf_schedule", + }, + "data.ckk.deadline": { + color_type: orangeColumn, + accessorKey: "data.ckk.deadline", + }, + "data.ckk.proc_plan": { + color_type: orangeColumn, + accessorKey: "data.ckk.proc_plan", + }, + "data.ckk.proc_method": { + color_type: orangeColumn, + accessorKey: "data.ckk.proc_method", + }, + "data.ckk.comment": { + color_type: orangeColumn, + accessorKey: "data.ckk.comment", + }, + "data.contract_detail.counterparty": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.counterparty", + }, + "data.contract_detail.reference": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.reference", + }, + "data.contract_detail.addenda": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.addenda", + }, + "data.contract_detail.subject": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.subject", + }, + "data.contract_detail.currency": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.currency", + }, + "data.contract_detail.ceiling": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.ceiling", + }, "data.contract_detail.q1": { color_type: orangeColumn, accessorKey: "data.contract_detail.q1", }, + "data.contract_detail.q2": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.q2", + }, + "data.contract_detail.q3": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.q3", + }, + "data.contract_detail.q4": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.q4", + }, + "data.contract_detail.rf_schedule": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.rf_schedule", + }, + "data.contract_detail.vat_rate": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.vat_rate", + }, + "data.contract_detail.exchange_rate": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.exchange_rate", + }, + "data.contract_detail.amount_foreign": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.amount_foreign", + }, + "data.contract_detail.deadline": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.deadline", + }, + "data.contract_detail.payment_scheme": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.payment_scheme", + }, + "data.contract_detail.act": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.act", + }, + "data.contract_detail.comment": { + color_type: orangeColumn, + accessorKey: "data.contract_detail.comment", + }, "data.q1.adj_current": { color_type: yellowColumn, accessorKey: "data.q1.adj_current", @@ -289,9 +301,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q1.adj_reserve", }, - "1_kv_26_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc": { + "1_kvartal_2026_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc": { color_type: redColumn, - accessorKey: "1_kv_26_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc", + accessorKey: + "1_kvartal_2026_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc", }, "data.q1.adj_comment": { color_type: yellowColumn, @@ -301,6 +314,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q1.corrected_plan", }, + "1_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "1_kvartal_2026_ref_field", + }, "data.q1.pay_date": { color_type: blueColumn, accessorKey: "data.q1.pay_date", @@ -325,6 +342,10 @@ export const config = { color_type: blueColumn, accessorKey: "data.q1.pay_act", }, + "1_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "1_kvartal_2026_field_field", + }, "data.q1.booking": { color_type: orangeColumn, accessorKey: "data.q1.booking", @@ -373,14 +394,6 @@ export const config = { color_type: redColumn, accessorKey: "data.q1.total", }, - "data.ckk.q2": { - color_type: orangeColumn, - accessorKey: "data.ckk.q2", - }, - "data.contract_detail.q2": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.q2", - }, "data.q2.rev_eco": { color_type: redColumn, accessorKey: "data.q2.rev_eco", @@ -405,6 +418,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q2.new_plan", }, + "2_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "2_kvartal_2026_field_field", + }, "data.q2.adj_current": { color_type: yellowColumn, accessorKey: "data.q2.adj_current", @@ -421,14 +438,19 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q2.adj_reserve", }, - "2_kv_26_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc": { + "2_kvartal_2026_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc": { color_type: redColumn, - accessorKey: "2_kv_26_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc", + accessorKey: + "2_kvartal_2026_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc", }, "data.q2.corrected_plan": { color_type: yellowColumn, accessorKey: "data.q2.corrected_plan", }, + "2_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "2_kvartal_2026_ref_field", + }, "data.q2.pay_date": { color_type: blueColumn, accessorKey: "data.q2.pay_date", @@ -497,14 +519,6 @@ export const config = { color_type: redColumn, accessorKey: "data.q2.total", }, - "data.ckk.q3": { - color_type: orangeColumn, - accessorKey: "data.ckk.q3", - }, - "data.contract_detail.q3": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.q3", - }, "data.q3.rev_eco": { color_type: redColumn, accessorKey: "data.q3.rev_eco", @@ -529,6 +543,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q3.new_plan", }, + "3_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "3_kvartal_2026_field_field", + }, "data.q3.adj_current": { color_type: yellowColumn, accessorKey: "data.q3.adj_current", @@ -545,14 +563,19 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q3.adj_reserve", }, - "3_kv_26_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc": { + "3_kvartal_2026_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc": { color_type: redColumn, - accessorKey: "3_kv_26_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc", + accessorKey: + "3_kvartal_2026_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc", }, "data.q3.corrected_plan": { color_type: yellowColumn, accessorKey: "data.q3.corrected_plan", }, + "3_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "3_kvartal_2026_ref_field", + }, "data.q3.pay_date": { color_type: blueColumn, accessorKey: "data.q3.pay_date", @@ -617,14 +640,6 @@ export const config = { color_type: redColumn, accessorKey: "data.q3.total", }, - "data.ckk.q4": { - color_type: orangeColumn, - accessorKey: "data.ckk.q4", - }, - "data.contract_detail.q4": { - color_type: orangeColumn, - accessorKey: "data.contract_detail.q4", - }, "data.q4.rev_eco": { color_type: redColumn, accessorKey: "data.q4.rev_eco", @@ -653,6 +668,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q4.new_plan", }, + "4_kvartal_2026_field_field": { + color_type: whiteColumn, + accessorKey: "4_kvartal_2026_field_field", + }, "data.q4.adj_current": { color_type: yellowColumn, accessorKey: "data.q4.adj_current", @@ -673,6 +692,10 @@ export const config = { color_type: yellowColumn, accessorKey: "data.q4.corrected_plan", }, + "4_kvartal_2026_ref_field": { + color_type: whiteColumn, + accessorKey: "4_kvartal_2026_ref_field", + }, "data.q4.pay_date": { color_type: blueColumn, accessorKey: "data.q4.pay_date", @@ -729,9 +752,9 @@ export const config = { color_type: greenColumn, accessorKey: "data.q4.rem_actual", }, - "4_kv_26_zakrytie_4_go_kvartala_field": { + "4_kvartal_2026_zakrytie_4_go_kvartala_field": { color_type: redColumn, - accessorKey: "4_kv_26_zakrytie_4_go_kvartala_field", + accessorKey: "4_kvartal_2026_zakrytie_4_go_kvartala_field", }, "data.q4.economy": { color_type: redColumn, @@ -741,10 +764,18 @@ export const config = { color_type: redColumn, accessorKey: "data.q4.total", }, + "data.totals.fact_year": { + color_type: greenColumn, + accessorKey: "data.totals.fact_year", + }, + "data.totals.pay_year": { + color_type: blueColumn, + accessorKey: "data.totals.pay_year", + }, }, columns: [ { - header: "", + header: " ", accessorKey: "field", columns: [ { @@ -759,12 +790,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "ID статьи", @@ -778,12 +803,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "ID группы номенклатуры", @@ -797,12 +816,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "Наименование", @@ -816,12 +829,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "Внутренний заказ", @@ -835,17 +842,17 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - header: "Планируемые ССП показатели сметы расходов.", + header: "Планируемые ССП показатели сметы расходов", accessorKey: "planiruemye_ssp_pokazateli_smety_raskhodov", columns: [ { @@ -1045,13 +1052,13 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, }, { - header: "Аллокация расходов.", + header: "Аллокация расходов", accessorKey: "allokatsiya_raskhodov", columns: [ { @@ -1066,12 +1073,6 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, { header: "Назначение расхода фактической аллокации", @@ -1086,23 +1087,17 @@ export const config = { filterFn: "contains", }, ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, }, { - header: "Секвестирование ДФиП.", + header: "Секвестирование ДФиП", accessorKey: "sekvestirovanie_dfip", columns: [ { @@ -1204,7 +1199,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, @@ -1312,7 +1307,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, @@ -1401,13 +1396,13 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#BFBFBF", color: "#000000", }, }, }, { - header: "-", + header: " ", accessorKey: "field_6", columns: [ { @@ -1440,19 +1435,7 @@ export const config = { }, }, }, - { - header: "", - accessorKey: "field_kollegialnye_organy_field", - columnLetter: "AU", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, + { header: "Примечание", accessorKey: "data.collegial.note", @@ -1469,36 +1452,23 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, }, - { - header: "", - accessorKey: "field_field", - columns: [ - { - header: "", - accessorKey: "field_field_field", - columnLetter: "AW", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, + ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", }, + }, + }, + { + header: " ", + accessorKey: "field_10", + columns: [ { header: "ЦКК", accessorKey: "field_tskk", @@ -1524,7 +1494,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1537,7 +1507,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1550,7 +1520,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1563,7 +1533,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1636,11 +1606,23 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, }, + ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, + { + header: " ", + accessorKey: "field_20", + columns: [ { header: "Договор", accessorKey: "field_dogovor", @@ -1731,7 +1713,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1744,7 +1726,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1757,7 +1739,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1770,7 +1752,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#C5D9F1", + backgroundColor: "#748C42", color: "#000000", }, }, @@ -1882,12 +1864,18 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { header: "1 квартал 2026", @@ -1913,7 +1901,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -1932,7 +1920,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -1951,7 +1939,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -1970,31 +1958,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Перенос во 2 кв 26", - accessorKey: "1_kvartal_2026_perenos_vo_2_kv_26", - columns: [ - { - header: "Сумма, тыс. руб. (с учетом НДC)", - accessorKey: - "1_kvartal_2026_perenos_vo_2_kv_26_summa_tys_rub_s_uchetom_ndc", - columnLetter: "CF", - size: 310, - filterFn: "contains", - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Комментарий", accessorKey: "1_kvartal_2026_kommentariy", @@ -2009,7 +1978,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2028,26 +1997,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "", - accessorKey: "1_kvartal_2026_field", - columns: [ - { - header: "", - accessorKey: "1_kvartal_2026_field_field", - columnLetter: "CI", - size: 150, - filterFn: "contains", - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2064,7 +2014,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2077,7 +2027,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2090,7 +2040,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2103,7 +2053,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2116,7 +2066,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2129,7 +2079,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2137,11 +2087,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, }, + { header: "Бронь 1 кв 26", accessorKey: "1_kvartal_2026_bron_1_kv_26", @@ -2162,7 +2113,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2181,7 +2132,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2200,7 +2151,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2219,7 +2170,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2238,7 +2189,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2257,7 +2208,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2276,7 +2227,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2293,8 +2244,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2306,8 +2257,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2319,8 +2270,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2332,8 +2283,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2345,20 +2296,26 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { header: "2 квартал 2026", @@ -2385,8 +2342,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2404,8 +2361,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2423,8 +2380,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2442,8 +2399,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2461,8 +2418,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2480,30 +2437,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "", - accessorKey: "2_kvartal_2026_field", - columns: [ - { - header: "", - accessorKey: "2_kvartal_2026_field_field", - columnLetter: "DK", - size: 150, - filterFn: "contains", - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Текущие корректировки( = 0)", accessorKey: "2_kvartal_2026_tekuschie_korrektirovki_0", @@ -2524,7 +2463,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2543,7 +2482,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2562,7 +2501,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -2581,31 +2520,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Перенос в 3 кв 26", - accessorKey: "2_kvartal_2026_perenos_v_3_kv_26", - columns: [ - { - header: "Сумма, тыс. руб. (с учетом НДC)", - accessorKey: - "2_kvartal_2026_perenos_v_3_kv_26_summa_tys_rub_s_uchetom_ndc", - columnLetter: "DP", - size: 310, - filterFn: "contains", - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Скорр. план 2 кв. 26", accessorKey: "2_kvartal_2026_skorr_plan_2_kv_26", @@ -2620,11 +2540,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Платеж и предоставление акта", accessorKey: "2_kvartal_2026_platezh_i_predostavlenie_akta", @@ -2637,7 +2558,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2650,7 +2571,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2663,7 +2584,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2676,7 +2597,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2689,7 +2610,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2702,7 +2623,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2710,7 +2631,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -2735,7 +2656,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2754,7 +2675,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2773,7 +2694,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2792,7 +2713,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2811,7 +2732,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2830,7 +2751,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -2849,7 +2770,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -2866,8 +2787,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2879,8 +2800,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2892,8 +2813,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2905,20 +2826,26 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { header: "3 квартал 2026", @@ -2945,8 +2872,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2964,8 +2891,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -2983,8 +2910,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3002,8 +2929,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3021,8 +2948,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3040,30 +2967,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "", - accessorKey: "3_kvartal_2026_field", - columns: [ - { - header: "", - accessorKey: "3_kvartal_2026_field_field", - columnLetter: "ET", - size: 150, - filterFn: "contains", - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Текущие корректировки( = 0)", accessorKey: "3_kvartal_2026_tekuschie_korrektirovki_0", @@ -3084,7 +2993,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3103,7 +3012,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3122,7 +3031,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3141,31 +3050,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "Перенос в 4 кв 26", - accessorKey: "3_kvartal_2026_perenos_v_4_kv_26", - columns: [ - { - header: "Сумма, тыс. руб. (с учетом НДC)", - accessorKey: - "3_kvartal_2026_perenos_v_4_kv_26_summa_tys_rub_s_uchetom_ndc", - columnLetter: "EY", - size: 310, - filterFn: "contains", - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Скорр. план 3 кв. 26", accessorKey: "3_kvartal_2026_skorr_plan_3_kv_26", @@ -3180,11 +3070,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Платеж и предоставление акта", accessorKey: "3_kvartal_2026_platezh_i_predostavlenie_akta", @@ -3197,7 +3088,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3210,7 +3101,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3223,7 +3114,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3236,7 +3127,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3249,7 +3140,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3262,7 +3153,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3270,7 +3161,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3295,7 +3186,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3314,7 +3205,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3333,7 +3224,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3352,7 +3243,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3371,7 +3262,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3390,7 +3281,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3409,7 +3300,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3426,8 +3317,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3439,8 +3330,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3452,20 +3343,26 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { header: "4 квартал 2026", @@ -3492,8 +3389,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3511,8 +3408,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3530,8 +3427,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3549,8 +3446,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3575,8 +3472,8 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -3594,30 +3491,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, - { - header: "", - accessorKey: "4_kvartal_2026_field", - columns: [ - { - header: "", - accessorKey: "4_kvartal_2026_field_field", - columnLetter: "GB", - size: 150, - filterFn: "contains", - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Текущие корректировки( = 0)", accessorKey: "4_kvartal_2026_tekuschie_korrektirovki_0", @@ -3638,7 +3517,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3657,7 +3536,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3676,7 +3555,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3695,7 +3574,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, @@ -3714,11 +3593,12 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FFFF66", color: "#000000", }, }, }, + { header: "Платеж и предоставление акта", accessorKey: "4_kvartal_2026_platezh_i_predostavlenie_akta", @@ -3731,7 +3611,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3744,7 +3624,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3757,7 +3637,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3770,7 +3650,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3783,7 +3663,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3796,7 +3676,7 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3804,7 +3684,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, @@ -3829,7 +3709,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3848,7 +3728,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3867,7 +3747,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3886,7 +3766,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3905,7 +3785,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3924,7 +3804,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3943,7 +3823,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#FABF8F", color: "#000000", }, }, @@ -3962,7 +3842,7 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, @@ -3971,19 +3851,6 @@ export const config = { header: "Закрытие 4-го квартала", accessorKey: "4_kvartal_2026_zakrytie_4_go_kvartala", columns: [ - { - header: "", - accessorKey: "4_kvartal_2026_zakrytie_4_go_kvartala_field", - columnLetter: "GZ", - size: 150, - filterFn: "contains", - muiTableHeadCellProps: { - sx: { - backgroundColor: "#FFFFFF", - color: "#000000", - }, - }, - }, { header: "Перенос в фонд экономии", accessorKey: "data.q4.economy", @@ -3992,8 +3859,8 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, @@ -4005,28 +3872,34 @@ export const config = { filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", - color: "#000000", + backgroundColor: "#903C39", + color: "#FFFFFF", }, }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - header: "Факт", - accessorKey: "fakt", + header: " ", + accessorKey: "11", columns: [ { header: "Факт 26", - accessorKey: "fakt_fakt_26", + accessorKey: "11_fakt_26", columns: [ { header: "", @@ -4038,20 +3911,26 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#C2D69B", color: "#000000", }, }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - header: "Сумма", - accessorKey: "summa", + header: " ", + accessorKey: "111", columns: [ { header: "Сумма оплаты", - accessorKey: "summa_summa_oplaty", + accessorKey: "111_summa_oplaty", columns: [ { header: "", @@ -4063,12 +3942,18 @@ export const config = { ], muiTableHeadCellProps: { sx: { - backgroundColor: "#FFFFFF", + backgroundColor: "#95B3D7", color: "#000000", }, }, }, ], + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, ], }, diff --git a/web/src/components/RealtimeTable/constants/FORM_3/LP.js b/web/src/components/RealtimeTable/constants/FORM_3/LP.js deleted file mode 100644 index b283987..0000000 --- a/web/src/components/RealtimeTable/constants/FORM_3/LP.js +++ /dev/null @@ -1,555 +0,0 @@ - - import { - greenColumn, - whiteColumn, - orangeColumn, - yellowColumn, - redColumn, - blueColumn, - } from '../columnColors'; - export const config = { - "config":{ - "colors":{ - "kod_razdela_kod_razdela":{ - "color_type":whiteColumn, - "accessorKey":"kod_razdela_kod_razdela" - }, - "id_stati_id_stati":{ - "color_type":whiteColumn, - "accessorKey":"id_stati_id_stati" - }, - "id_gruppy_nomenklatury_id_gruppy_nomenklatury":{ - "color_type":whiteColumn, - "accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury" - }, - "naimenovanie_naimenovanie":{ - "color_type":whiteColumn, - "accessorKey":"naimenovanie_naimenovanie" - }, - "korrektirovka_limita_po_statyam_smety":{ - "color_type":whiteColumn, - "accessorKey":"korrektirovka_limita_po_statyam_smety" - }, - "field_uvelichenie_smety":{ - "color_type":whiteColumn, - "accessorKey":"field_uvelichenie_smety" - }, - "field_za_yanvar":{ - "color_type":whiteColumn, - "accessorKey":"field_za_yanvar" - }, - "field_za_fevral":{ - "color_type":whiteColumn, - "accessorKey":"field_za_fevral" - }, - "field_itogo_i_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_i_kvartal" - }, - "field_za_aprel":{ - "color_type":whiteColumn, - "accessorKey":"field_za_aprel" - }, - "field_za_may":{ - "color_type":whiteColumn, - "accessorKey":"field_za_may" - }, - "field_itogo_ii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_ii_kvartal" - }, - "field_za_iyul":{ - "color_type":whiteColumn, - "accessorKey":"field_za_iyul" - }, - "field_za_avgust":{ - "color_type":whiteColumn, - "accessorKey":"field_za_avgust" - }, - "field_itogo_iii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_iii_kvartal" - }, - "field_za_oktyabr":{ - "color_type":whiteColumn, - "accessorKey":"field_za_oktyabr" - }, - "field_za_noyabr":{ - "color_type":whiteColumn, - "accessorKey":"field_za_noyabr" - }, - "field_spod":{ - "color_type":whiteColumn, - "accessorKey":"field_spod" - }, - "field_itogo_iv_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_iv_kvartal" - }, - "itogo_itogo":{ - "color_type":whiteColumn, - "accessorKey":"itogo_itogo" - }, - "fakt_zamart":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zamart" - }, - "fakt_zaiyun":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zaiyun" - }, - "fakt_zasentyabr":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zasentyabr" - }, - "fakt_zadekabr":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zadekabr" - }, - "ekonomiya_pereraskhod_ekonomiya_pereraskhod":{ - "color_type":whiteColumn, - "accessorKey":"ekonomiya_pereraskhod_ekonomiya_pereraskhod" - }, - "limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal" - }, - "limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal" - }, - "limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal" - } - }, - "columns":[ - { - "header":"Код раздела", - "accessorKey":"kod_razdela", - "columns":[ - { - "header":"Код раздела", - "accessorKey":"kod_razdela_kod_razdela", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"ID статьи", - "accessorKey":"id_stati", - "columns":[ - { - "header":"ID статьи", - "accessorKey":"id_stati_id_stati", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"ID группы номенклатуры", - "accessorKey":"id_gruppy_nomenklatury", - "columns":[ - { - "header":"ID группы номенклатуры", - "accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Наименование", - "accessorKey":"naimenovanie", - "columns":[ - { - "header":"Наименование", - "accessorKey":"naimenovanie_naimenovanie", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Корректировка лимита", - "accessorKey":"korrektirovka_limita", - "columns":[ - { - "header":"по статьям сметы *", - "accessorKey":"korrektirovka_limita_po_statyam_smety", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"", - "accessorKey":"field", - "columns":[ - { - "header":"увеличение сметы **", - "accessorKey":"field_uvelichenie_smety", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ЯНВАРЬ", - "accessorKey":"field_za_yanvar", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ФЕВРАЛЬ", - "accessorKey":"field_za_fevral", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого I квартал", - "accessorKey":"field_itogo_i_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за АПРЕЛЬ", - "accessorKey":"field_za_aprel", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за МАЙ", - "accessorKey":"field_za_may", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого II квартал", - "accessorKey":"field_itogo_ii_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ИЮЛЬ", - "accessorKey":"field_za_iyul", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за АВГУСТ", - "accessorKey":"field_za_avgust", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого III квартал", - "accessorKey":"field_itogo_iii_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ОКТЯБРЬ", - "accessorKey":"field_za_oktyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за НОЯБРЬ", - "accessorKey":"field_za_noyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"СПОД", - "accessorKey":"field_spod", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого IV квартал", - "accessorKey":"field_itogo_iv_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого", - "accessorKey":"itogo", - "columns":[ - { - "header":"Итого", - "accessorKey":"itogo_itogo", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Факт", - "accessorKey":"fakt", - "columns":[ - { - "header":"заМАРТ", - "accessorKey":"fakt_zamart", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заИЮНЬ", - "accessorKey":"fakt_zaiyun", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заСЕНТЯБРЬ", - "accessorKey":"fakt_zasentyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заДЕКАБРЬ", - "accessorKey":"fakt_zadekabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"экономия (+) перерасход (-)", - "accessorKey":"ekonomiya_pereraskhod", - "columns":[ - { - "header":"экономия (+) перерасход (-)", - "accessorKey":"ekonomiya_pereraskhod_ekonomiya_pereraskhod", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Лимит затрат / остаток лимита затрат на II квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal", - "columns":[ - { - "header":"Лимит затрат / остаток лимита затрат на II квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Лимит затрат / остаток лимита затрат на III квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal", - "columns":[ - { - "header":"Лимит затрат / остаток лимита затрат на III квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Лимит затрат / остаток лимита затрат на IV квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal", - "columns":[ - { - "header":"Лимит затрат / остаток лимита затрат на IV квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ] - } -} \ No newline at end of file diff --git a/web/src/components/RealtimeTable/constants/FORM_3/PROJECT.js b/web/src/components/RealtimeTable/constants/FORM_3/PROJECT.js deleted file mode 100644 index c4b84d3..0000000 --- a/web/src/components/RealtimeTable/constants/FORM_3/PROJECT.js +++ /dev/null @@ -1,577 +0,0 @@ - - import { - greenColumn, - whiteColumn, - orangeColumn, - yellowColumn, - redColumn, - blueColumn, - } from '../columnColors'; - export const config = { - "config":{ - "colors":{ - "kod_razdela_kod_razdela":{ - "color_type":whiteColumn, - "accessorKey":"kod_razdela_kod_razdela" - }, - "id_stati_id_stati":{ - "color_type":whiteColumn, - "accessorKey":"id_stati_id_stati" - }, - "id_gruppy_nomenklatury_id_gruppy_nomenklatury":{ - "color_type":whiteColumn, - "accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury" - }, - "naimenovanie_naimenovanie":{ - "color_type":whiteColumn, - "accessorKey":"naimenovanie_naimenovanie" - }, - "korrektirovka_plana_po_statyam_smety":{ - "color_type":whiteColumn, - "accessorKey":"korrektirovka_plana_po_statyam_smety" - }, - "field_uvelichenie_smety":{ - "color_type":whiteColumn, - "accessorKey":"field_uvelichenie_smety" - }, - "field_za_yanvar":{ - "color_type":whiteColumn, - "accessorKey":"field_za_yanvar" - }, - "field_za_fevral":{ - "color_type":whiteColumn, - "accessorKey":"field_za_fevral" - }, - "field_itogo_i_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_i_kvartal" - }, - "field_za_aprel":{ - "color_type":whiteColumn, - "accessorKey":"field_za_aprel" - }, - "field_za_may":{ - "color_type":whiteColumn, - "accessorKey":"field_za_may" - }, - "field_itogo_ii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_ii_kvartal" - }, - "field_za_iyul":{ - "color_type":whiteColumn, - "accessorKey":"field_za_iyul" - }, - "field_za_avgust":{ - "color_type":whiteColumn, - "accessorKey":"field_za_avgust" - }, - "field_itogo_iii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_iii_kvartal" - }, - "field_za_oktyabr":{ - "color_type":whiteColumn, - "accessorKey":"field_za_oktyabr" - }, - "field_za_noyabr":{ - "color_type":whiteColumn, - "accessorKey":"field_za_noyabr" - }, - "field_spod":{ - "color_type":whiteColumn, - "accessorKey":"field_spod" - }, - "field_itogo_iv_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_iv_kvartal" - }, - "itogo_korrektirovka_itogo_korrektirovka":{ - "color_type":whiteColumn, - "accessorKey":"itogo_korrektirovka_itogo_korrektirovka" - }, - "fakt_zamart":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zamart" - }, - "fakt_zaiyun":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zaiyun" - }, - "fakt_zasentyabr":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zasentyabr" - }, - "fakt_zadekabr":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zadekabr" - }, - "ekonomiya_pereraskhod_ekonomiya_pereraskhod":{ - "color_type":whiteColumn, - "accessorKey":"ekonomiya_pereraskhod_ekonomiya_pereraskhod" - }, - "smeta_raskhodov_po_razvitiyu_na_ii_kvartal_smeta_raskhodov_po_razvitiyu_na_ii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_ii_kvartal_smeta_raskhodov_po_razvitiyu_na_ii_kvartal" - }, - "itogo_skorrek_smeta_itogo_skorrek_smeta":{ - "color_type":whiteColumn, - "accessorKey":"itogo_skorrek_smeta_itogo_skorrek_smeta" - }, - "smeta_raskhodov_po_razvitiyu_na_iii_kvartal_smeta_raskhodov_po_razvitiyu_na_iii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_iii_kvartal_smeta_raskhodov_po_razvitiyu_na_iii_kvartal" - }, - "smeta_raskhodov_po_razvitiyu_na_iv_kvartal_smeta_raskhodov_po_razvitiyu_na_iv_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_iv_kvartal_smeta_raskhodov_po_razvitiyu_na_iv_kvartal" - } - }, - "columns":[ - { - "header":"Код раздела", - "accessorKey":"kod_razdela", - "columns":[ - { - "header":"Код раздела", - "accessorKey":"kod_razdela_kod_razdela", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"ID статьи", - "accessorKey":"id_stati", - "columns":[ - { - "header":"ID статьи", - "accessorKey":"id_stati_id_stati", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"ID группы номенклатуры", - "accessorKey":"id_gruppy_nomenklatury", - "columns":[ - { - "header":"ID группы номенклатуры", - "accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Наименование", - "accessorKey":"naimenovanie", - "columns":[ - { - "header":"Наименование", - "accessorKey":"naimenovanie_naimenovanie", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Корректировка плана", - "accessorKey":"korrektirovka_plana", - "columns":[ - { - "header":"по статьям сметы *", - "accessorKey":"korrektirovka_plana_po_statyam_smety", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"", - "accessorKey":"field", - "columns":[ - { - "header":"увеличение сметы **", - "accessorKey":"field_uvelichenie_smety", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ЯНВАРЬ", - "accessorKey":"field_za_yanvar", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ФЕВРАЛЬ", - "accessorKey":"field_za_fevral", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого I квартал", - "accessorKey":"field_itogo_i_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за АПРЕЛЬ", - "accessorKey":"field_za_aprel", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за МАЙ", - "accessorKey":"field_za_may", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого II квартал", - "accessorKey":"field_itogo_ii_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ИЮЛЬ", - "accessorKey":"field_za_iyul", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за АВГУСТ", - "accessorKey":"field_za_avgust", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого III квартал", - "accessorKey":"field_itogo_iii_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ОКТЯБРЬ", - "accessorKey":"field_za_oktyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за НОЯБРЬ", - "accessorKey":"field_za_noyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"СПОД", - "accessorKey":"field_spod", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого IV квартал", - "accessorKey":"field_itogo_iv_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого корректировка", - "accessorKey":"itogo_korrektirovka", - "columns":[ - { - "header":"Итого корректировка", - "accessorKey":"itogo_korrektirovka_itogo_korrektirovka", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Факт", - "accessorKey":"fakt", - "columns":[ - { - "header":"заМАРТ", - "accessorKey":"fakt_zamart", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заИЮНЬ", - "accessorKey":"fakt_zaiyun", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заСЕНТЯБРЬ", - "accessorKey":"fakt_zasentyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заДЕКАБРЬ", - "accessorKey":"fakt_zadekabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"экономия (+) перерасход (-)", - "accessorKey":"ekonomiya_pereraskhod", - "columns":[ - { - "header":"экономия (+) перерасход (-)", - "accessorKey":"ekonomiya_pereraskhod_ekonomiya_pereraskhod", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Смета расходов по развитию на II квартал", - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_ii_kvartal", - "columns":[ - { - "header":"Смета расходов по развитию на II квартал", - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_ii_kvartal_smeta_raskhodov_po_razvitiyu_na_ii_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого скоррек. смета", - "accessorKey":"itogo_skorrek_smeta", - "columns":[ - { - "header":"Итого скоррек. смета", - "accessorKey":"itogo_skorrek_smeta_itogo_skorrek_smeta", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Смета расходов по развитию на III квартал", - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_iii_kvartal", - "columns":[ - { - "header":"Смета расходов по развитию на III квартал", - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_iii_kvartal_smeta_raskhodov_po_razvitiyu_na_iii_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Смета расходов по развитию на IV квартал", - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_iv_kvartal", - "columns":[ - { - "header":"Смета расходов по развитию на IV квартал", - "accessorKey":"smeta_raskhodov_po_razvitiyu_na_iv_kvartal_smeta_raskhodov_po_razvitiyu_na_iv_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ] - } -} \ No newline at end of file diff --git a/web/src/components/RealtimeTable/constants/FORM_3/TR.js b/web/src/components/RealtimeTable/constants/FORM_3/TR.js deleted file mode 100644 index b283987..0000000 --- a/web/src/components/RealtimeTable/constants/FORM_3/TR.js +++ /dev/null @@ -1,555 +0,0 @@ - - import { - greenColumn, - whiteColumn, - orangeColumn, - yellowColumn, - redColumn, - blueColumn, - } from '../columnColors'; - export const config = { - "config":{ - "colors":{ - "kod_razdela_kod_razdela":{ - "color_type":whiteColumn, - "accessorKey":"kod_razdela_kod_razdela" - }, - "id_stati_id_stati":{ - "color_type":whiteColumn, - "accessorKey":"id_stati_id_stati" - }, - "id_gruppy_nomenklatury_id_gruppy_nomenklatury":{ - "color_type":whiteColumn, - "accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury" - }, - "naimenovanie_naimenovanie":{ - "color_type":whiteColumn, - "accessorKey":"naimenovanie_naimenovanie" - }, - "korrektirovka_limita_po_statyam_smety":{ - "color_type":whiteColumn, - "accessorKey":"korrektirovka_limita_po_statyam_smety" - }, - "field_uvelichenie_smety":{ - "color_type":whiteColumn, - "accessorKey":"field_uvelichenie_smety" - }, - "field_za_yanvar":{ - "color_type":whiteColumn, - "accessorKey":"field_za_yanvar" - }, - "field_za_fevral":{ - "color_type":whiteColumn, - "accessorKey":"field_za_fevral" - }, - "field_itogo_i_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_i_kvartal" - }, - "field_za_aprel":{ - "color_type":whiteColumn, - "accessorKey":"field_za_aprel" - }, - "field_za_may":{ - "color_type":whiteColumn, - "accessorKey":"field_za_may" - }, - "field_itogo_ii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_ii_kvartal" - }, - "field_za_iyul":{ - "color_type":whiteColumn, - "accessorKey":"field_za_iyul" - }, - "field_za_avgust":{ - "color_type":whiteColumn, - "accessorKey":"field_za_avgust" - }, - "field_itogo_iii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_iii_kvartal" - }, - "field_za_oktyabr":{ - "color_type":whiteColumn, - "accessorKey":"field_za_oktyabr" - }, - "field_za_noyabr":{ - "color_type":whiteColumn, - "accessorKey":"field_za_noyabr" - }, - "field_spod":{ - "color_type":whiteColumn, - "accessorKey":"field_spod" - }, - "field_itogo_iv_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"field_itogo_iv_kvartal" - }, - "itogo_itogo":{ - "color_type":whiteColumn, - "accessorKey":"itogo_itogo" - }, - "fakt_zamart":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zamart" - }, - "fakt_zaiyun":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zaiyun" - }, - "fakt_zasentyabr":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zasentyabr" - }, - "fakt_zadekabr":{ - "color_type":whiteColumn, - "accessorKey":"fakt_zadekabr" - }, - "ekonomiya_pereraskhod_ekonomiya_pereraskhod":{ - "color_type":whiteColumn, - "accessorKey":"ekonomiya_pereraskhod_ekonomiya_pereraskhod" - }, - "limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal" - }, - "limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal" - }, - "limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal":{ - "color_type":whiteColumn, - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal" - } - }, - "columns":[ - { - "header":"Код раздела", - "accessorKey":"kod_razdela", - "columns":[ - { - "header":"Код раздела", - "accessorKey":"kod_razdela_kod_razdela", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"ID статьи", - "accessorKey":"id_stati", - "columns":[ - { - "header":"ID статьи", - "accessorKey":"id_stati_id_stati", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"ID группы номенклатуры", - "accessorKey":"id_gruppy_nomenklatury", - "columns":[ - { - "header":"ID группы номенклатуры", - "accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Наименование", - "accessorKey":"naimenovanie", - "columns":[ - { - "header":"Наименование", - "accessorKey":"naimenovanie_naimenovanie", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Корректировка лимита", - "accessorKey":"korrektirovka_limita", - "columns":[ - { - "header":"по статьям сметы *", - "accessorKey":"korrektirovka_limita_po_statyam_smety", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"", - "accessorKey":"field", - "columns":[ - { - "header":"увеличение сметы **", - "accessorKey":"field_uvelichenie_smety", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ЯНВАРЬ", - "accessorKey":"field_za_yanvar", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ФЕВРАЛЬ", - "accessorKey":"field_za_fevral", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого I квартал", - "accessorKey":"field_itogo_i_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за АПРЕЛЬ", - "accessorKey":"field_za_aprel", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за МАЙ", - "accessorKey":"field_za_may", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого II квартал", - "accessorKey":"field_itogo_ii_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ИЮЛЬ", - "accessorKey":"field_za_iyul", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за АВГУСТ", - "accessorKey":"field_za_avgust", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого III квартал", - "accessorKey":"field_itogo_iii_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за ОКТЯБРЬ", - "accessorKey":"field_za_oktyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"за НОЯБРЬ", - "accessorKey":"field_za_noyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"СПОД", - "accessorKey":"field_spod", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого IV квартал", - "accessorKey":"field_itogo_iv_kvartal", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Итого", - "accessorKey":"itogo", - "columns":[ - { - "header":"Итого", - "accessorKey":"itogo_itogo", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Факт", - "accessorKey":"fakt", - "columns":[ - { - "header":"заМАРТ", - "accessorKey":"fakt_zamart", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заИЮНЬ", - "accessorKey":"fakt_zaiyun", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заСЕНТЯБРЬ", - "accessorKey":"fakt_zasentyabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"заДЕКАБРЬ", - "accessorKey":"fakt_zadekabr", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"экономия (+) перерасход (-)", - "accessorKey":"ekonomiya_pereraskhod", - "columns":[ - { - "header":"экономия (+) перерасход (-)", - "accessorKey":"ekonomiya_pereraskhod_ekonomiya_pereraskhod", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Лимит затрат / остаток лимита затрат на II квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal", - "columns":[ - { - "header":"Лимит затрат / остаток лимита затрат на II квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Лимит затрат / остаток лимита затрат на III квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal", - "columns":[ - { - "header":"Лимит затрат / остаток лимита затрат на III квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - }, - { - "header":"Лимит затрат / остаток лимита затрат на IV квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal", - "columns":[ - { - "header":"Лимит затрат / остаток лимита затрат на IV квартал", - "accessorKey":"limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal", - "size":150, - "filterFn":"contains" - } - ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } - } - ] - } -} \ No newline at end of file diff --git a/web/src/components/RealtimeTable/constants/PROJECT/CURRENT_EXPENSES.js b/web/src/components/RealtimeTable/constants/PROJECT/CURRENT_EXPENSES.js new file mode 100644 index 0000000..83d059f --- /dev/null +++ b/web/src/components/RealtimeTable/constants/PROJECT/CURRENT_EXPENSES.js @@ -0,0 +1,1003 @@ + + import { + greenColumn, + whiteColumn, + orangeColumn, + yellowColumn, + redColumn, + blueColumn, + } from '../columnColors'; + export const config = { + "config":{ + "colors":{ + "data.header.section_code":{ + "color_type":greenColumn, + "accessorKey":"data.header.section_code" + }, + "data.header.item_id":{ + "color_type":greenColumn, + "accessorKey":"data.header.item_id" + }, + "data.header.num_group_id":{ + "color_type":greenColumn, + "accessorKey":"data.header.num_group_id" + }, + "data.header.name":{ + "color_type":greenColumn, + "accessorKey":"data.header.name" + }, + "data.q1.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q1.adj_by_items" + }, + "data.q1.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q1.adj_increase" + }, + "data.q1.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q1.total_corr" + }, + "data.q1.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q1.m1" + }, + "data.q1.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q1.m2" + }, + "data.q1.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q1.m3" + }, + "data.q1.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q1.quarter_actual" + }, + "data.q1.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q1.economy" + }, + "data.q2.carryover":{ + "color_type":greenColumn, + "accessorKey":"data.q2.carryover" + }, + "data.q2.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q2.adj_by_items" + }, + "data.q2.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q2.adj_increase" + }, + "data.q2.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q2.total_corr" + }, + "data.q2.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q2.m1" + }, + "data.q2.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q2.m2" + }, + "data.q2.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q2.m3" + }, + "data.q2.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q2.quarter_actual" + }, + "data.q2.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q2.economy" + }, + "data.q3.carryover":{ + "color_type":greenColumn, + "accessorKey":"data.q3.carryover" + }, + "data.q3.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q3.adj_by_items" + }, + "data.q3.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q3.adj_increase" + }, + "data.q3.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q3.total_corr" + }, + "data.q3.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q3.m1" + }, + "data.q3.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q3.m2" + }, + "data.q3.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q3.m3" + }, + "data.q3.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q3.quarter_actual" + }, + "data.q3.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q3.economy" + }, + "data.q4.carryover":{ + "color_type":greenColumn, + "accessorKey":"data.q4.carryover" + }, + "data.q4.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q4.adj_by_items" + }, + "data.q4.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q4.adj_increase" + }, + "data.q4.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q4.total_corr" + }, + "data.q4.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q4.m1" + }, + "data.q4.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q4.m2" + }, + "data.q4.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q4.m3" + }, + "data.q4.spod":{ + "color_type":greenColumn, + "accessorKey":"data.q4.spod" + }, + "data.q4.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q4.quarter_actual" + }, + "data.q4.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q4.economy" + } + }, + "columns":[ + { + "header":"", + "accessorKey":"field", + "columns":[ + { + "header":"Код раздела", + "accessorKey":"field_kod_razdela", + "columns":[ + { + "header":"", + "accessorKey":"data.header.section_code", + "columnLetter":"A", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"ID статьи", + "accessorKey":"field_id_stati", + "columns":[ + { + "header":"", + "accessorKey":"data.header.item_id", + "columnLetter":"B", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"ID группы номенклатуры", + "accessorKey":"field_id_gruppy_nomenklatury", + "columns":[ + { + "header":"", + "accessorKey":"data.header.num_group_id", + "columnLetter":"C", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Наименование", + "accessorKey":"field_naimenovanie", + "columns":[ + { + "header":"", + "accessorKey":"data.header.name", + "columnLetter":"D", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении текущих расходов в I квартале", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_i_kvartale", + "columns":[ + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_i_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q1.adj_by_items", + "columnLetter":"E", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q1.adj_increase", + "columnLetter":"F", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_i_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q1.total_corr", + "columnLetter":"G", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_i_kvartale_fakt", + "columns":[ + { + "header":"за ЯНВАРЬ", + "accessorKey":"data.q1.m1", + "columnLetter":"H", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за ФЕВРАЛЬ", + "accessorKey":"data.q1.m2", + "columnLetter":"I", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заМАРТ", + "accessorKey":"data.q1.m3", + "columnLetter":"J", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого I квартал", + "accessorKey":"data.q1.quarter_actual", + "columnLetter":"K", + "size":160, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_i_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q1.economy", + "columnLetter":"L", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении текущих расходов в II квартале", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_ii_kvartale", + "columns":[ + { + "header":"Лимит затрат / остаток лимита затрат на II квартал", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_ii_kvartale_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal", + "columns":[ + { + "header":"", + "accessorKey":"data.q2.carryover", + "columnLetter":"N", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_ii_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q2.adj_by_items", + "columnLetter":"O", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q2.adj_increase", + "columnLetter":"P", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_ii_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q2.total_corr", + "columnLetter":"Q", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_ii_kvartale_fakt", + "columns":[ + { + "header":"за АПРЕЛЬ", + "accessorKey":"data.q2.m1", + "columnLetter":"R", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за МАЙ", + "accessorKey":"data.q2.m2", + "columnLetter":"S", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заИЮНЬ", + "accessorKey":"data.q2.m3", + "columnLetter":"T", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого II квартал", + "accessorKey":"data.q2.quarter_actual", + "columnLetter":"U", + "size":170, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_ii_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q2.economy", + "columnLetter":"V", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении текущих расходов в III квартале", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iii_kvartale", + "columns":[ + { + "header":"Лимит затрат / остаток лимита затрат на III квартал", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iii_kvartale_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal", + "columns":[ + { + "header":"", + "accessorKey":"data.q3.carryover", + "columnLetter":"X", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iii_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q3.adj_by_items", + "columnLetter":"Y", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q3.adj_increase", + "columnLetter":"Z", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iii_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q3.total_corr", + "columnLetter":"AA", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iii_kvartale_fakt", + "columns":[ + { + "header":"за ИЮЛЬ", + "accessorKey":"data.q3.m1", + "columnLetter":"AB", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за АВГУСТ", + "accessorKey":"data.q3.m2", + "columnLetter":"AC", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заСЕНТЯБРЬ", + "accessorKey":"data.q3.m3", + "columnLetter":"AD", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого III квартал", + "accessorKey":"data.q3.quarter_actual", + "columnLetter":"AE", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iii_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q3.economy", + "columnLetter":"AF", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении текущих расходов в IV квартале", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iv_kvartale", + "columns":[ + { + "header":"Лимит затрат / остаток лимита затрат на IV квартал", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iv_kvartale_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal", + "columns":[ + { + "header":"", + "accessorKey":"data.q4.carryover", + "columnLetter":"AH", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iv_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q4.adj_by_items", + "columnLetter":"AI", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q4.adj_increase", + "columnLetter":"AJ", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iv_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q4.total_corr", + "columnLetter":"AK", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iv_kvartale_fakt", + "columns":[ + { + "header":"за ОКТЯБРЬ", + "accessorKey":"data.q4.m1", + "columnLetter":"AL", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за НОЯБРЬ", + "accessorKey":"data.q4.m2", + "columnLetter":"AM", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заДЕКАБРЬ", + "accessorKey":"data.q4.m3", + "columnLetter":"AN", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"СПОД", + "accessorKey":"data.q4.spod", + "columnLetter":"AO", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого IV квартал", + "accessorKey":"data.q4.quarter_actual", + "columnLetter":"AP", + "size":170, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_tekuschikh_raskhodov_v_iv_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q4.economy", + "columnLetter":"AQ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + } + ] + } +} \ No newline at end of file diff --git a/web/src/components/RealtimeTable/constants/PROJECT/LIMIT.js b/web/src/components/RealtimeTable/constants/PROJECT/LIMIT.js new file mode 100644 index 0000000..17c5234 --- /dev/null +++ b/web/src/components/RealtimeTable/constants/PROJECT/LIMIT.js @@ -0,0 +1,1003 @@ + + import { + greenColumn, + whiteColumn, + orangeColumn, + yellowColumn, + redColumn, + blueColumn, + } from '../columnColors'; + export const config = { + "config":{ + "colors":{ + "data.header.section_code":{ + "color_type":greenColumn, + "accessorKey":"data.header.section_code" + }, + "data.header.item_id":{ + "color_type":greenColumn, + "accessorKey":"data.header.item_id" + }, + "data.header.num_group_id":{ + "color_type":greenColumn, + "accessorKey":"data.header.num_group_id" + }, + "data.header.name":{ + "color_type":greenColumn, + "accessorKey":"data.header.name" + }, + "data.q1.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q1.adj_by_items" + }, + "data.q1.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q1.adj_increase" + }, + "data.q1.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q1.total_corr" + }, + "data.q1.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q1.m1" + }, + "data.q1.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q1.m2" + }, + "data.q1.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q1.m3" + }, + "data.q1.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q1.quarter_actual" + }, + "data.q1.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q1.economy" + }, + "data.q2.carryover":{ + "color_type":greenColumn, + "accessorKey":"data.q2.carryover" + }, + "data.q2.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q2.adj_by_items" + }, + "data.q2.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q2.adj_increase" + }, + "data.q2.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q2.total_corr" + }, + "data.q2.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q2.m1" + }, + "data.q2.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q2.m2" + }, + "data.q2.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q2.m3" + }, + "data.q2.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q2.quarter_actual" + }, + "data.q2.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q2.economy" + }, + "data.q3.carryover":{ + "color_type":greenColumn, + "accessorKey":"data.q3.carryover" + }, + "data.q3.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q3.adj_by_items" + }, + "data.q3.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q3.adj_increase" + }, + "data.q3.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q3.total_corr" + }, + "data.q3.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q3.m1" + }, + "data.q3.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q3.m2" + }, + "data.q3.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q3.m3" + }, + "data.q3.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q3.quarter_actual" + }, + "data.q3.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q3.economy" + }, + "data.q4.carryover":{ + "color_type":greenColumn, + "accessorKey":"data.q4.carryover" + }, + "data.q4.adj_by_items":{ + "color_type":greenColumn, + "accessorKey":"data.q4.adj_by_items" + }, + "data.q4.adj_increase":{ + "color_type":greenColumn, + "accessorKey":"data.q4.adj_increase" + }, + "data.q4.total_corr":{ + "color_type":greenColumn, + "accessorKey":"data.q4.total_corr" + }, + "data.q4.m1":{ + "color_type":greenColumn, + "accessorKey":"data.q4.m1" + }, + "data.q4.m2":{ + "color_type":greenColumn, + "accessorKey":"data.q4.m2" + }, + "data.q4.m3":{ + "color_type":greenColumn, + "accessorKey":"data.q4.m3" + }, + "data.q4.spod":{ + "color_type":greenColumn, + "accessorKey":"data.q4.spod" + }, + "data.q4.quarter_actual":{ + "color_type":greenColumn, + "accessorKey":"data.q4.quarter_actual" + }, + "data.q4.economy":{ + "color_type":greenColumn, + "accessorKey":"data.q4.economy" + } + }, + "columns":[ + { + "header":"", + "accessorKey":"field", + "columns":[ + { + "header":"Код раздела", + "accessorKey":"field_kod_razdela", + "columns":[ + { + "header":"", + "accessorKey":"data.header.section_code", + "columnLetter":"A", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"ID статьи", + "accessorKey":"field_id_stati", + "columns":[ + { + "header":"", + "accessorKey":"data.header.item_id", + "columnLetter":"B", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"ID группы номенклатуры", + "accessorKey":"field_id_gruppy_nomenklatury", + "columns":[ + { + "header":"", + "accessorKey":"data.header.num_group_id", + "columnLetter":"C", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Наименование", + "accessorKey":"field_naimenovanie", + "columns":[ + { + "header":"", + "accessorKey":"data.header.name", + "columnLetter":"D", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении лимита затрат, утвержденного Правлением Банка в I квартале", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_i_kvartale", + "columns":[ + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_i_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q1.adj_by_items", + "columnLetter":"E", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q1.adj_increase", + "columnLetter":"F", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_i_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q1.total_corr", + "columnLetter":"G", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_i_kvartale_fakt", + "columns":[ + { + "header":"за ЯНВАРЬ", + "accessorKey":"data.q1.m1", + "columnLetter":"H", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за ФЕВРАЛЬ", + "accessorKey":"data.q1.m2", + "columnLetter":"I", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заМАРТ", + "accessorKey":"data.q1.m3", + "columnLetter":"J", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого I квартал", + "accessorKey":"data.q1.quarter_actual", + "columnLetter":"K", + "size":160, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_i_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q1.economy", + "columnLetter":"L", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении лимита затрат, утвержденного Правлением Банка в II квартале", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_ii_kvartale", + "columns":[ + { + "header":"Лимит затрат / остаток лимита затрат на II квартал", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_ii_kvartale_limit_zatrat_ostatok_limita_zatrat_na_ii_kvartal", + "columns":[ + { + "header":"", + "accessorKey":"data.q2.carryover", + "columnLetter":"N", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_ii_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q2.adj_by_items", + "columnLetter":"O", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q2.adj_increase", + "columnLetter":"P", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_ii_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q2.total_corr", + "columnLetter":"Q", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_ii_kvartale_fakt", + "columns":[ + { + "header":"за АПРЕЛЬ", + "accessorKey":"data.q2.m1", + "columnLetter":"R", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за МАЙ", + "accessorKey":"data.q2.m2", + "columnLetter":"S", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заИЮНЬ", + "accessorKey":"data.q2.m3", + "columnLetter":"T", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого II квартал", + "accessorKey":"data.q2.quarter_actual", + "columnLetter":"U", + "size":170, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_ii_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q2.economy", + "columnLetter":"V", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении лимита затрат, утвержденного Правлением Банка в III квартале", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iii_kvartale", + "columns":[ + { + "header":"Лимит затрат / остаток лимита затрат на III квартал", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iii_kvartale_limit_zatrat_ostatok_limita_zatrat_na_iii_kvartal", + "columns":[ + { + "header":"", + "accessorKey":"data.q3.carryover", + "columnLetter":"X", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iii_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q3.adj_by_items", + "columnLetter":"Y", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q3.adj_increase", + "columnLetter":"Z", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iii_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q3.total_corr", + "columnLetter":"AA", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iii_kvartale_fakt", + "columns":[ + { + "header":"за ИЮЛЬ", + "accessorKey":"data.q3.m1", + "columnLetter":"AB", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за АВГУСТ", + "accessorKey":"data.q3.m2", + "columnLetter":"AC", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заСЕНТЯБРЬ", + "accessorKey":"data.q3.m3", + "columnLetter":"AD", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого III квартал", + "accessorKey":"data.q3.quarter_actual", + "columnLetter":"AE", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iii_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q3.economy", + "columnLetter":"AF", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + }, + { + "header":"Отчет об исполнении лимита затрат, утвержденного Правлением Банка в IV квартале", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iv_kvartale", + "columns":[ + { + "header":"Лимит затрат / остаток лимита затрат на IV квартал", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iv_kvartale_limit_zatrat_ostatok_limita_zatrat_na_iv_kvartal", + "columns":[ + { + "header":"", + "accessorKey":"data.q4.carryover", + "columnLetter":"AH", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Корректировка лимита", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iv_kvartale_korrektirovka_limita", + "columns":[ + { + "header":"по статьям сметы *", + "accessorKey":"data.q4.adj_by_items", + "columnLetter":"AI", + "size":180, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"увеличение сметы **", + "accessorKey":"data.q4.adj_increase", + "columnLetter":"AJ", + "size":200, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iv_kvartale_itogo", + "columns":[ + { + "header":"", + "accessorKey":"data.q4.total_corr", + "columnLetter":"AK", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Факт", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iv_kvartale_fakt", + "columns":[ + { + "header":"за ОКТЯБРЬ", + "accessorKey":"data.q4.m1", + "columnLetter":"AL", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"за НОЯБРЬ", + "accessorKey":"data.q4.m2", + "columnLetter":"AM", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"заДЕКАБРЬ", + "accessorKey":"data.q4.m3", + "columnLetter":"AN", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"СПОД", + "accessorKey":"data.q4.spod", + "columnLetter":"AO", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"Итого IV квартал", + "accessorKey":"data.q4.quarter_actual", + "columnLetter":"AP", + "size":170, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + }, + { + "header":"экономия (+) перерасход (-)", + "accessorKey":"otchet_ob_ispolnenii_limita_zatrat_utverzhdennogo_pravleniem_banka_v_iv_kvartale_ekonomiya_pereraskhod", + "columns":[ + { + "header":"", + "accessorKey":"data.q4.economy", + "columnLetter":"AQ", + "size":150, + "filterFn":"contains", + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ], + "muiTableHeadCellProps":{ + "sx":{ + "backgroundColor":"#C2D69B", + "color":"#000000" + } + } + } + ] + } + ] + } +} \ No newline at end of file diff --git a/web/src/components/RealtimeTable/contexts/RealtimeContext.js b/web/src/components/RealtimeTable/contexts/RealtimeContext.js index ff40381..9238aa1 100644 --- a/web/src/components/RealtimeTable/contexts/RealtimeContext.js +++ b/web/src/components/RealtimeTable/contexts/RealtimeContext.js @@ -25,17 +25,29 @@ export const RealtimeProvider = ({ formId, sheetName, direction, + year, userId, + isProject = false, }) => { // Формируем URL (кастомные секреты на фронте пока недоступны, делаем через REACT_APP_ROOT_PATH) - const wsUrl = `${(process.env.REACT_APP_API_URL || process.env.REACT_APP_API_URL || process.env.REACT_APP_ROOT_PATH || "ws://localhost:8000").replace(/^http/, "ws")}/api/v1/ws/form/${formId}/sheet/${sheetName}${direction ? `?direction=${direction}` : ""}`; + const wsUrl = + `${( + process.env.REACT_APP_API_URL || + process.env.REACT_APP_API_URL || + process.env.REACT_APP_ROOT_PATH || + "ws://localhost:8000" + ).replace(/^http/, "ws")}` + + (!isProject + ? `/api/v1/ws/form/${formId}/sheet/${sheetName}${direction ? `?direction=${direction}` : ""}` + : `/api/v1/ws/projects/${formId}/report/${year}/${sheetName}`); + //для ячеек которые редактируются другими пользователями const [lockedCells, setLockedCells] = useState([]); const handleMessage = useCallback((data) => { // Обработка ошибок if (data.error) { - console.log(data.error.message) - toast.error("Server error:" + data.error.message || ''); + console.log(data.error.message); + toast.error("Server error:" + data.error.message || ""); onErrorRef.current?.(data.error); return; } @@ -145,6 +157,19 @@ export const RealtimeProvider = ({ } }, [isConnected]); + const addCommonField = (message) => { + if (isProject) { + message.report_type = sheetName; + message.project_id = formId; + message.year = year; + } else { + message.sheet = sheetName; + message.form_id = formId; + message.direction = direction; + } + return message; + }; + // Функция для начала редактирования ячейки const startEditing = useCallback( async (row, column) => { @@ -249,10 +274,9 @@ export const RealtimeProvider = ({ const message = { event: "row_added", data: rowData, - sheet: sheetName, - form_id: formId, - direction: direction, }; + addCommonField(message); + return sendMessage(message); }, [isConnected, sendMessage, sheetName, formId, direction], @@ -268,10 +292,8 @@ export const RealtimeProvider = ({ const message = { event: "row_deleted", data: { row_id: rowId }, - sheet: sheetName, - form_id: formId, - direction: direction, }; + addCommonField(message); return sendMessage(message); }, diff --git a/web/src/components/RealtimeTable/hooks/useRealtimeData.js b/web/src/components/RealtimeTable/hooks/useRealtimeData.js index 964f1ab..0c2d101 100644 --- a/web/src/components/RealtimeTable/hooks/useRealtimeData.js +++ b/web/src/components/RealtimeTable/hooks/useRealtimeData.js @@ -4,8 +4,9 @@ import { useRealtime } from "../contexts/RealtimeContext"; import { deleteRow, insertCell, updateCells } from "../utils/cellUtils"; import { toast } from "react-toastify"; import { isVspNewRow, isVspRow } from "../utils/rowUtils"; +import { ProjectsApi } from "../../../api/projects"; -const useRealtimeData = (formId, sheetName, direction) => { +const useRealtimeData = (formId, sheetName, direction, formType, year) => { const [data, setData] = useState([]); const [isConnected, setIsConnected] = useState(false); const [error, setError] = useState(null); @@ -77,7 +78,10 @@ const useRealtimeData = (formId, sheetName, direction) => { try { setIsLoading(true); let res; - if (direction !== null) { + + if(formType == 'PROJECT'){ + res = await ProjectsApi.getTableData(formId, sheetName, year) + } else if (direction !== null) { res = await FormsSheetApi.get(formId, sheetName, { params: { direction: direction }, }); diff --git a/web/src/components/RealtimeTable/hooks/useWebSocket.js b/web/src/components/RealtimeTable/hooks/useWebSocket.js index 57e3958..8ee2f66 100644 --- a/web/src/components/RealtimeTable/hooks/useWebSocket.js +++ b/web/src/components/RealtimeTable/hooks/useWebSocket.js @@ -107,20 +107,6 @@ export const useWebSocket = (url, onMessage) => { return false; }, []); - const login = useCallback( - (token) => { - if (!token) { - console.warn("No token provided for login"); - return false; - } - return sendMessage({ - event: "user_login", - data: { token }, - }); - }, - [sendMessage], - ); - useEffect(() => { connect(); return () => disconnect(); @@ -130,7 +116,6 @@ export const useWebSocket = (url, onMessage) => { isConnected: isConnectedRef, error, sendMessage, - login, disconnect, }; }; diff --git a/web/src/components/common/NavigationToggle.jsx b/web/src/components/common/NavigationToggle.jsx new file mode 100644 index 0000000..077670d --- /dev/null +++ b/web/src/components/common/NavigationToggle.jsx @@ -0,0 +1,33 @@ +// components/NavigationToggle.jsx +import React from 'react'; +import { Box, Typography } from '@mui/material'; +import { PrimaryOutlinedButton } from './Buttons/Buttons'; // Ваш компонент кнопки + +const NavigationToggle = ({ currentView, onViewChange }) => { + const handleNavigateToTasks = () => { + onViewChange('/tasks'); + }; + + const handleNavigateToProjects = () => { + onViewChange('/projects'); + }; + + return ( + + {currentView === 'tasks' ? ( + + ← К проектам + + ) : ( + + ← К задачам + + )} + + {currentView === 'tasks' ? 'Управление задачами' : 'Управление проектами'} + + + ); +}; + +export default NavigationToggle; \ No newline at end of file diff --git a/web/src/components/common/PaginatedList.jsx b/web/src/components/common/PaginatedList.jsx index 430ce72..2933fb1 100644 --- a/web/src/components/common/PaginatedList.jsx +++ b/web/src/components/common/PaginatedList.jsx @@ -14,7 +14,7 @@ import { ExportExitButton, ExportWithTextButton, } from './Buttons/ButtonsActions'; -import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; +import { exportBulkForms, exportSingleForm } from '../../utils/exportFile'; /** * Универсальный компонент для отображения списка с пагинацией и экспортом @@ -32,12 +32,13 @@ import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; * @param {Function} props.getItemTitle - Функция получения заголовка элемента * @param {string} props.entityName - Название сущности (для текстов) * @param {string} props.emptyMessage - Сообщение при пустом списке - * @param {number} props.skeletonCount - Количество скелетонов + * @param {number} props.skeletonCount - Количество силуэтов таблиц при загрузки * @param {Object} props.extraActions - Дополнительные действия справа * @param {boolean} props.enableExport - Включить экспорт * @param {Array} props.limitOptions - Опции для выбора лимита * @param {number} props.maxHeight - Максимальная высота контейнера со скроллом * @param {boolean} props.enableScroll - Включить скролл для списка + * @param {boolean} props.filterActions - Элементы фильтрации */ export function PaginatedList({ items = [], @@ -58,6 +59,7 @@ export function PaginatedList({ limitOptions = [10, 20, 50, 100, 200], maxHeight = 'calc(100vh - 300px)', enableScroll = true, + filterActions = null, }) { const [exportMode, setExportMode] = useState(false); const [exportList, setExportList] = useState([]); @@ -104,37 +106,45 @@ export function PaginatedList({ }; return ( - + {/* Верхняя панель с экспортом и дополнительными действиями */} {enableExport && ( - - {exportMode && ( - - Выделено {entityName}: {exportList.length} - - )} - - - {!exportMode ? ( - <> - setExportMode(true)} - /> - {extraActions} - - ) : ( - <> - - setExportMode(false)} /> - + +
+ {filterActions} +
+ + {exportMode && ( + + Выделено {entityName}: {exportList.length} + )} -
+ + + {!exportMode ? ( + <> + setExportMode(true)} + height='2.5rem' + /> + {extraActions} + + ) : ( + <> + + setExportMode(false)} /> + + )} + +
+ )} {/* Контейнер со скроллом для списка */} @@ -238,7 +248,7 @@ export function PaginatedList({ /> )} /> - + )} diff --git a/web/src/components/common/TableList/TableList.jsx b/web/src/components/common/TableList/TableList.jsx index 4dcb645..1a9ea9f 100644 --- a/web/src/components/common/TableList/TableList.jsx +++ b/web/src/components/common/TableList/TableList.jsx @@ -6,15 +6,12 @@ import { toast } from 'react-toastify'; const TablesList = ({ filteredTables, - projects, query, basePath = '/table', - formInfo + formInfo, + isProject = false, }) => { const navigate = useNavigate(); - const isProject = useMemo(() => { - return !!projects; - }, [projects]) const handleNavigate = (path) => { navigate(path); @@ -25,7 +22,7 @@ const TablesList = ({ if (!formInfo){ return; } - const path = `${basePath}/form/${formInfo.id}/form-type/${isProject ? 'project' : formInfo.form_type_code}/${table.sheet}/${table?.direction}`; + const path = `${basePath}/form/${formInfo.id}/form-type/${isProject ? 'PROJECT' : formInfo.form_type_code}/${table.sheet}/${table?.direction}/${table?.year}`; return ( { +const TableInfo = ({ formId, sheetName, isProject = false }) => { + const path = (isProject ? `/project/` : '/task/') + formId; const portalContent = ( - + {sheetName && ( {SHEET_NAME[sheetName] || sheetName} )} @@ -28,20 +29,29 @@ const TableInfo = ({ formId, sheetName }) => { }; export default function NewTablePage() { - const { formId, formType, sheetName, direction } = useParams(); + const { formId, formType, sheetName, direction, year } = useParams(); const { user } = useAuth(); + const isProject = formType == 'PROJECT'; return ( <> - {formId && } + {formId && } {user && ( - + )} diff --git a/web/src/pages/ProjectsPage/ProjectsPage.jsx b/web/src/pages/ProjectsPage/ProjectsPage.jsx index 29bd04a..4b126b2 100644 --- a/web/src/pages/ProjectsPage/ProjectsPage.jsx +++ b/web/src/pages/ProjectsPage/ProjectsPage.jsx @@ -26,17 +26,18 @@ import { ROLES_NAME_ID, } from '../../constants/constants'; import { useAuth } from '../../app/context/AuthProvider'; -import { PrimaryButton } from '../../components/common/Buttons/Buttons'; +import { PrimaryButton, PrimaryOutlinedButton } from '../../components/common/Buttons/Buttons'; import { ExportExitButton, ExportWithTextButton, } from '../../components/common/Buttons/ButtonsActions'; -import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; +import { exportBulkForms, exportSingleForm } from '../../utils/exportFile'; import { WhitePlus } from '../../components/common/icons/icons'; import { useNavigate } from 'react-router-dom'; import { PaginatedList } from '../../components/common/PaginatedList'; import { DEFAULT_PROJECT_CONFIG } from '../../constants/projectConfig'; import { SspApi } from '../../api/ssp'; +import NavigationToggle from '../../components/common/NavigationToggle'; export { DEFAULT_PROJECT_CONFIG } from '../../constants/projectConfig'; @@ -213,10 +214,6 @@ export default function ProjectsPage() { exportSingleForm(projectId, projectTitle); }; - const handleNavigateToTasks = () => { - navigate('/tasks'); - }; - const handleRefresh = () => { loadProjects(page, limit); toast.info('Список проектов обновлен'); @@ -228,78 +225,7 @@ export default function ProjectsPage() { <> - - {/* Навигация */} - - - - Управление проектами - - - - {/* Фильтры */} - - - {/* Фильтр по году */} - - - - - {/* Фильтр по ССП/РФ */} - - option.title || option.name || '-'} - value={ - branchFilter - } - onChange={(event, newValue) => { - setBranchFilter(newValue); - }} - sx={{ height: '2.5rem', minWidth: '21.25rem' }} - renderInput={(params) => ( - - )} - /> - - - + navigate(path)} /> project.name || 'Проект'} extraActions={ user.role_id === ROLES_NAME_ID.admin && ( - }> + } height='2.5rem' > Создать проект ) } + filterActions={ + + + + option.title || option.name || '-'} + value={branchFilter} + onChange={(event, newValue) => setBranchFilter(newValue)} + sx={{ width: 200 }} + renderInput={(params) => ( + + )} + /> + Сбросить + + } /> diff --git a/web/src/pages/StyledForPage.jsx b/web/src/pages/StyledForPage.jsx index 7db3b82..49ee02f 100644 --- a/web/src/pages/StyledForPage.jsx +++ b/web/src/pages/StyledForPage.jsx @@ -1,7 +1,8 @@ import styled from '@emotion/styled'; const PageContainer = styled.div` - padding: 2.5rem; + padding: 2rem; + padding-top: 1rem; box-sizing: border-box; display: flex; flex-direction: column; diff --git a/web/src/pages/TaskPage/TaskPage.jsx b/web/src/pages/TaskPage/TaskPage.jsx index 9dfdfd9..591d23f 100644 --- a/web/src/pages/TaskPage/TaskPage.jsx +++ b/web/src/pages/TaskPage/TaskPage.jsx @@ -20,7 +20,7 @@ import { SettingModal as SettingStageModal } from '../../components/Stages/Setti import { PrimaryOutlinedButton } from '../../components/common/Buttons/Buttons'; import { FormsApi } from '../../api/forms'; import { ExportWithTextButton } from '../../components/common/Buttons/ButtonsActions'; -import { exportSingleForm } from '../../utils/exportForm'; +import { exportSingleForm } from '../../utils/exportFile'; import TablesList from '../../components/common/TableList/TableList'; import { DIRECTION_TRANSLATE, FORM_TYPE_TRANSLATE, SHEET_NAME } from '../../constants/constants'; @@ -66,11 +66,11 @@ export default function TaskPage() { const projectData = await ProjectsApi.get(id); setTask(projectData.result); setIsProjectData(true); - console.log(projectData.result.reports); const mappedTables = projectData.result.reports.map(sheet => ({ name: SHEET_NAME[sheet.report_type] || sheet.report_type, sheet: sheet.report_type, + year: sheet.year, })); setTables(mappedTables); } else { diff --git a/web/src/pages/TasksPage/TasksPage.jsx b/web/src/pages/TasksPage/TasksPage.jsx index f9bb40a..5a01f23 100644 --- a/web/src/pages/TasksPage/TasksPage.jsx +++ b/web/src/pages/TasksPage/TasksPage.jsx @@ -35,11 +35,13 @@ import { ExportExitButton, ExportWithTextButton, } from '../../components/common/Buttons/ButtonsActions'; -import { exportBulkForms, exportSingleForm } from '../../utils/exportForm'; +import { exportBulkForms, exportSingleForm } from '../../utils/exportFile'; import { WhitePlus } from '../../components/common/icons/icons'; import { OrgUnitsAutocompletePaper } from '../../components/common/OrgUnitsAutocompletePaper/OrgUnitsAutocompletePaper'; import { renderOrgUnitValue } from '../../components/common/OrgUnitsAutocompletePaper/renderOrgUnitValue'; import { PaginatedList } from '../../components/common/PaginatedList'; +import NavigationToggle from '../../components/common/NavigationToggle'; +import { useNavigate } from 'react-router'; const modalSelectMenuProps = { sx: { zIndex: 1301 }, @@ -53,6 +55,8 @@ const modalSelectSx = { }; export default function TasksPage() { + const navigate = useNavigate(); + const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [loadingUpdate, setLoadingUpdate] = useState(false); @@ -256,7 +260,7 @@ export default function TasksPage() { <> - + navigate(path)} /> task.title || 'Задача'} extraActions={ user.role_id === ROLES_NAME_ID.admin && ( - }> + } height={'2.5rem'}> Создать задачу ) diff --git a/web/src/utils/exportFile.js b/web/src/utils/exportFile.js new file mode 100644 index 0000000..3009b55 --- /dev/null +++ b/web/src/utils/exportFile.js @@ -0,0 +1,64 @@ +import { FormsSheetApi } from "../api/form_sheet"; +import { ProjectsApi } from "../api/projects"; +import { TasksApi } from "../api/tasks"; +import { downloadFile } from "./downloadFile"; +import { getApiErrorMessage } from "./getApiErrorMessage"; +import { toast } from "react-toastify"; + +export const exportSingleForm = async (taskId, taskTitle) => { + try { + const response = await TasksApi.exportTask(taskId); + await downloadFile(response, taskTitle, "xlsx"); + } catch (error) { + const message = await getApiErrorMessage( + error, + "Ошибка при скачивании файла", + ); + toast.error(message); + } +}; + +export const exportSheet = async (formId, sheetName, direction) => { + try { + const normalizedDirection = + direction && direction !== "null" ? direction : undefined; + const params = normalizedDirection + ? { direction: normalizedDirection } + : {}; + const response = await FormsSheetApi.export(formId, sheetName, params); + await downloadFile(response, sheetName, "xlsx"); + } catch (error) { + const message = await getApiErrorMessage( + error, + "Ошибка при скачивании файла", + ); + toast.error(message); + } +}; + +export const exportSheetProject = async (formId, sheetName, year) => { + try { + const response = await ProjectsApi.export(formId, year, sheetName); + await downloadFile(response, sheetName, "xlsx"); + } catch (error) { + const message = await getApiErrorMessage( + error, + "Ошибка при скачивании файла", + ); + toast.error(message); + } +}; + +export const exportBulkForms = async (formIds, fileName = "Задачи") => { + try { + const response = await TasksApi.exportTasks({ form_ids: formIds }); + await downloadFile(response, fileName, "xlsx"); + } catch (error) { + const message = await getApiErrorMessage( + error, + "Ошибка при скачивании файла", + ); + toast.error(message); + throw error; + } +}; diff --git a/web/src/utils/exportForm.js b/web/src/utils/exportForm.js deleted file mode 100644 index 56eba58..0000000 --- a/web/src/utils/exportForm.js +++ /dev/null @@ -1,48 +0,0 @@ -import { FormsSheetApi } from '../api/form_sheet'; -import { TasksApi } from '../api/tasks'; -import { downloadFile } from './downloadFile'; -import { getApiErrorMessage } from './getApiErrorMessage'; -import { toast } from 'react-toastify'; - -export const exportSingleForm = async (taskId, taskTitle) => { - try { - const response = await TasksApi.exportTask(taskId); - await downloadFile(response, taskTitle, 'xlsx'); - } catch (error) { - const message = await getApiErrorMessage( - error, - 'Ошибка при скачивании файла', - ); - toast.error(message); - } -}; - -export const exportSheet = async (formId, sheetName, direction) => { - try { - const normalizedDirection = - direction && direction !== 'null' ? direction : undefined; - const params = normalizedDirection ? { direction: normalizedDirection } : {}; - const response = await FormsSheetApi.export(formId, sheetName, params); - await downloadFile(response, sheetName, 'xlsx'); - } catch (error) { - const message = await getApiErrorMessage( - error, - 'Ошибка при скачивании файла', - ); - toast.error(message); - } -}; - -export const exportBulkForms = async (formIds, fileName = 'Задачи') => { - try { - const response = await TasksApi.exportTasks({ form_ids: formIds }); - await downloadFile(response, fileName, 'xlsx'); - } catch (error) { - const message = await getApiErrorMessage( - error, - 'Ошибка при скачивании файла', - ); - toast.error(message); - throw error; - } -}; From cc62551c92be931d3cac21b4ad62d6c7ccf6f89c Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 2 Jul 2026 16:07:44 +0300 Subject: [PATCH 10/20] 1134 --- .../AdminPanel/AuditLogsPage/constants/configEvent.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx b/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx index 5ded6f4..bebd544 100644 --- a/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx +++ b/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx @@ -82,15 +82,15 @@ export const EVENT_CONFIGS = { }, ACCESS_EXTEND: { form_id: 'Информация о задаче', - closes_at_after: 'Дата закрытия', - closes_at_before: 'Дата открытия', + closes_at_after: 'Дата закрытия (новая)', + closes_at_before: 'Дата закрытия (старая)', phase_name: 'Названия этапа', sheet: "Лист", }, ACCESS_WINDOW_CHANGE: { form_id: 'Информация о задаче', closes_at: 'Дата закрытия', - open_at: 'Дата открытия', + opens_at: 'Дата открытия', phase_name: 'Названия этапа', role: 'Для роли', column_keys: 'Колонки в этапе', From 2e781ca8093fbe6c5e6fa797c606874fe806c7c1 Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Thu, 2 Jul 2026 16:44:45 +0300 Subject: [PATCH 11/20] =?UTF-8?q?projects-sheets:=20=D0=B3=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2,=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=B3=D0=BE=D0=B4=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/domain/schemas.py | 2 +- api/src/repository/project_repository.py | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/api/src/domain/schemas.py b/api/src/domain/schemas.py index d56835e..b11133e 100644 --- a/api/src/domain/schemas.py +++ b/api/src/domain/schemas.py @@ -362,7 +362,7 @@ class AddProjectBody(BaseModel): max_length=30, pattern=r"^[^+\-\/\\=&*\s]{1,30}$", ) - year: int + year: int = Field(default_factory=lambda: datetime.now().year) branch_id: int level: Literal["project", "program"] = "project" parent_id: Optional[int] = None diff --git a/api/src/repository/project_repository.py b/api/src/repository/project_repository.py index 1faae5e..f0492bf 100644 --- a/api/src/repository/project_repository.py +++ b/api/src/repository/project_repository.py @@ -14,7 +14,7 @@ class ProjectRepository: self.db = db @staticmethod - def _serialize_project(project: Project, org_unit_name: str | None, report_count: int) -> dict: + def _serialize_project(project: Project, org_unit_name: str | None, report_count: int, years: list[InterruptedError] | None = None) -> dict: return { "id": project.id, "name": project.name, @@ -29,6 +29,7 @@ class ProjectRepository: "org_unit_id": project.org_unit_id, "org_unit_name": org_unit_name, "report_count": int(report_count), + "years": years, } @staticmethod @@ -66,11 +67,19 @@ class ProjectRepository: .scalar_subquery() ) + report_years_subq = ( + select(RfProjectReport.year) + .where(RfProjectReport.project_id == Project.id) + .distinct() + .scalar_subquery() + ) + query = ( select( Project, OrgUnit.title.label("org_unit_name"), report_count_subq.label("report_count"), + func.array(report_years_subq).label("years"), ) .outerjoin(OrgUnit, OrgUnit.id == Project.org_unit_id) .order_by(Project.id) @@ -82,7 +91,7 @@ class ProjectRepository: query = query.limit(limit) rows = (await self.db.execute(query)).all() - payload = [self._serialize_project(row[0], row[1], row[2]) for row in rows] + payload = [self._serialize_project(row[0], row[1], row[2], row[3]) for row in rows] if not with_count: return payload @@ -101,11 +110,18 @@ class ProjectRepository: .where(RfProjectReport.project_id == Project.id) .scalar_subquery() ) + report_years_subq = ( + select(RfProjectReport.year) + .where(RfProjectReport.project_id == Project.id) + .distinct() + .scalar_subquery() + ) query = ( select( Project, OrgUnit.title.label("org_unit_name"), report_count_subq.label("report_count"), + func.array(report_years_subq).label("years"), ) .outerjoin(OrgUnit, OrgUnit.id == Project.org_unit_id) .where(Project.id == project_id) @@ -117,7 +133,7 @@ class ProjectRepository: row = (await self.db.execute(query)).first() if not row: return None - return self._serialize_project(row[0], row[1], row[2]) + return self._serialize_project(row[0], row[1], row[2], row[3]) async def get_reports(self, project_id: int) -> list[dict]: line_count_subq = ( From a23a2dffc61ab473da045bacd822c174bc2d9d8d Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 2 Jul 2026 17:31:23 +0300 Subject: [PATCH 12/20] 865 --- .../RealtimeTable/Cell/Cell/Cell.jsx | 16 ++++++----- .../RealtimeTable/RealtimeTable.jsx | 6 +++++ .../RealtimeTable/TableHead/TableHead.jsx | 27 ++++++++++++------- .../components/RealtimeTable/tableColumns.jsx | 1 + 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx index 2164513..50a7c4a 100644 --- a/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx +++ b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx @@ -31,12 +31,13 @@ const LockBadge = styled.div` `; // Функция для подсветки текста -const highlightText = (text, searchQuery) => { - if (!searchQuery || !text) return text; - - const escapedQuery = searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const regex = new RegExp(`(${escapedQuery})`, 'gi'); +const highlightText = (text, searchQueries) => { + if (!text) return text; + const cleanSearchQueries = searchQueries.filter(q => (q !== undefined && q !== '')); + if (cleanSearchQueries.length == 0) return text; + const escapedQueries = cleanSearchQueries.map(query => query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + const regex = new RegExp(`(${ escapedQueries.join('|')})`, 'gi'); const parts = text.split(regex); return parts.map((part, index) => @@ -89,7 +90,7 @@ const formatNumber = (value, asInteger = false) => { }); }; -const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundColor, color, isEditable }) => { +const Cell = React.memo(({ cell, row, column, onClick, globalFilter, columnFilter, backgroundColor, color, isEditable }) => { const { lockedCells } = useRealtime(); const cellKey = `${row.id}_${column.id}`; @@ -105,9 +106,10 @@ const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundC } const highlightedContent = useMemo(() => { - return highlightText(textValue, globalFilter); + return highlightText(textValue, [globalFilter, columnFilter]); }, [textValue, globalFilter]); + // Базовые стили для заблокированной ячейки const lockedStyles = isLocked ? { border: '2px solid #e0e0e0', diff --git a/web/src/components/RealtimeTable/RealtimeTable.jsx b/web/src/components/RealtimeTable/RealtimeTable.jsx index b307303..b75259b 100644 --- a/web/src/components/RealtimeTable/RealtimeTable.jsx +++ b/web/src/components/RealtimeTable/RealtimeTable.jsx @@ -229,6 +229,12 @@ const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => { minHeight: '1px', maxHeight: '1px', visibility: 'hidden', + '& svg': { + height: '1px', + minHeight: '1px', + maxHeight: '1px', + visibility: 'hidden', + } }, }, muiTablePaperProps: getTablePaperStyles(), diff --git a/web/src/components/RealtimeTable/TableHead/TableHead.jsx b/web/src/components/RealtimeTable/TableHead/TableHead.jsx index 9f819d9..efd1296 100644 --- a/web/src/components/RealtimeTable/TableHead/TableHead.jsx +++ b/web/src/components/RealtimeTable/TableHead/TableHead.jsx @@ -313,10 +313,10 @@ const FilterCell = ({ column, table }) => { onChange={(e) => handleFilterChange(e.target.value)} style={{ width: '100%', - padding: '4px 6px', - fontSize: '11px', + padding: '0.25rem 0.375rem', + fontSize: '0.6875rem', border: '1px solid #ddd', - borderRadius: '4px', + borderRadius: '0.25rem', backgroundColor: 'white', }} > @@ -330,23 +330,30 @@ const FilterCell = ({ column, table }) => { ); case 'range': { - // Для диапазона можно реализовать два поля const [min, max] = column.getFilterValue() || ['', '']; return ( -
+
{/* 4px */} column.setFilterValue([e.target.value, max])} - style={{ width: '50%', padding: '4px', fontSize: '11px' }} + style={{ + width: '50%', + padding: '0.25rem', + fontSize: '0.6875rem' + }} /> column.setFilterValue([min, e.target.value])} - style={{ width: '50%', padding: '4px', fontSize: '11px' }} + style={{ + width: '50%', + padding: '0.25rem', + fontSize: '0.6875rem' + }} />
); @@ -361,10 +368,10 @@ const FilterCell = ({ column, table }) => { placeholder="Поиск..." style={{ width: '100%', - padding: '4px 6px', - fontSize: '11px', + padding: '0.25rem 0.375rem', + fontSize: '0.6875rem', border: '1px solid #ddd', - borderRadius: '4px', + borderRadius: '0.25rem', boxSizing: 'border-box', }} /> diff --git a/web/src/components/RealtimeTable/tableColumns.jsx b/web/src/components/RealtimeTable/tableColumns.jsx index a47d5ce..2c6dd4e 100644 --- a/web/src/components/RealtimeTable/tableColumns.jsx +++ b/web/src/components/RealtimeTable/tableColumns.jsx @@ -112,6 +112,7 @@ export const getTableColumns = ({ globalFilter={ table.getState().globalFilter } + columnFilter={table.getState().columnFilters?.find(f => f.id === column.id)?.value} isEditable={row.original?.row_type === 'INPUT' || false} backgroundColor={columnColors[column.id]?.color_type?.[row.original?.row_type || row.row_type]} color={columnColors[column.id]?.color_type?.['COLOR']} From 019b93092cb84f69791877242a0bd403cb5942d8 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 2 Jul 2026 17:45:00 +0300 Subject: [PATCH 13/20] fix-websocket --- .../RealtimeTable/contexts/RealtimeContext.js | 12 ++++++------ .../components/RealtimeTable/hooks/useWebSocket.js | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/web/src/components/RealtimeTable/contexts/RealtimeContext.js b/web/src/components/RealtimeTable/contexts/RealtimeContext.js index 9238aa1..5274d4f 100644 --- a/web/src/components/RealtimeTable/contexts/RealtimeContext.js +++ b/web/src/components/RealtimeTable/contexts/RealtimeContext.js @@ -93,7 +93,7 @@ export const RealtimeProvider = ({ } }, []); - const { isConnected, sendMessage, disconnect, lastError } = useWebSocket( + const { isConnectedRef, isConnected, sendMessage, disconnect, lastError } = useWebSocket( wsUrl, handleMessage, ); @@ -176,7 +176,7 @@ export const RealtimeProvider = ({ const columnId = column.id; const rowId = row.id; - if (!isConnected) { + if (!isConnectedRef) { onErrorRef.current?.("WebSocket не подключен"); return false; } @@ -208,7 +208,7 @@ export const RealtimeProvider = ({ const columnId = column.id; const rowId = row.id; - if (!isConnected) { + if (!isConnectedRef) { onErrorRef.current?.("WebSocket не подключен"); return false; } @@ -238,7 +238,7 @@ export const RealtimeProvider = ({ async (row, column, value) => { const columnId = column.id; const rowId = row.id; - if (!isConnected) { + if (!isConnectedRef) { onErrorRef.current?.("WebSocket не подключен"); return false; } @@ -266,7 +266,7 @@ export const RealtimeProvider = ({ const addRow = useCallback( async (rowData) => { - if (!isConnected) { + if (!isConnectedRef) { onErrorRef.current?.("Нет подключения или авторизации"); return false; } @@ -284,7 +284,7 @@ export const RealtimeProvider = ({ const deleteRow = useCallback( async (rowId) => { - if (!isConnected) { + if (!isConnectedRef) { onErrorRef.current?.("Нет подключения или авторизации"); return false; } diff --git a/web/src/components/RealtimeTable/hooks/useWebSocket.js b/web/src/components/RealtimeTable/hooks/useWebSocket.js index 8ee2f66..55f43b0 100644 --- a/web/src/components/RealtimeTable/hooks/useWebSocket.js +++ b/web/src/components/RealtimeTable/hooks/useWebSocket.js @@ -113,7 +113,8 @@ export const useWebSocket = (url, onMessage) => { }, [connect, disconnect]); return { - isConnected: isConnectedRef, + isConnectedRef, + isConnected, error, sendMessage, disconnect, From 944fbe4d7efcb856d5ce1e78fd6585ea2376e359 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 2 Jul 2026 17:57:35 +0300 Subject: [PATCH 14/20] fix-setting panel --- web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx b/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx index 3347501..292ee04 100644 --- a/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx +++ b/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx @@ -126,8 +126,7 @@ const SettingPanel = ({ - - {!isProject ?? + {!isProject && <> From 2cc53b6846996cced858aed59021deac2d1a2849 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 2 Jul 2026 18:10:35 +0300 Subject: [PATCH 15/20] fix-vsp rename fields --- .../AuditLogsPage/constants/configEvent.jsx | 10 +++---- .../components/Modals/ModalEditAddVsp.jsx | 28 +++++++++---------- .../DictVspPage/components/TableDictVsp.jsx | 2 +- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx b/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx index bebd544..e1e700f 100644 --- a/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx +++ b/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx @@ -12,8 +12,8 @@ export const EVENT_CONFIGS = { format: 'Утвержденный формат', opened_at: 'Дата открытия ВСП', notes: 'Примечания', - location_form: 'Форма расположения ВСП', - numbers: 'Штатная численность ВСП', + placement_type: 'Форма расположения ВСП', + staff_count: 'Штатная численность ВСП', total_area: 'Площадь помещений ВСП', rent_contract_num: 'Номер договора аренды', rent_end_date: 'Срок окончания договора аренды', @@ -22,7 +22,6 @@ export const EVENT_CONFIGS = { closed_at: 'Дата закрытия ВСП', user_email: 'Почта пользователя', staff_count: 'Кол-во работников', - placement_type: 'Тип размещение', is_active: 'Активный', }, VSP_UPDATE: { @@ -32,8 +31,8 @@ export const EVENT_CONFIGS = { format: 'Утвержденный формат', opened_at: 'Дата открытия ВСП', notes: 'Примечания', - location_form: 'Форма расположения ВСП', - numbers: 'Штатная численность ВСП', + placement_type: 'Форма расположения ВСП', + staff_count: 'Штатная численность ВСП', total_area: 'Площадь помещений ВСП', rent_contract_num: 'Номер договора аренды', rent_end_date: 'Срок окончания договора аренды', @@ -42,7 +41,6 @@ export const EVENT_CONFIGS = { closed_at: 'Дата закрытия ВСП', user_email: 'Почта пользователя', staff_count: 'Кол-во работников', - placement_type: 'Тип размещение', is_active: 'Активный', }, USER_ACCESS_GRANTED: { diff --git a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx index 96d67ee..1b56ad9 100644 --- a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx +++ b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx @@ -43,8 +43,8 @@ const ModalEditAddVsp = ({ open_date: null, close_date: null, notes: '', - location_form: '', - numbers: '', + placement_type: '', + staff_count: '', area: null, rent_contract_num: '', rent_end_date: null, @@ -94,8 +94,8 @@ const ModalEditAddVsp = ({ ? new Date(initialData.close_date) : null, notes: initialData.notes || '', - location_form: initialData.location_form || '', - numbers: initialData.staff_count?.toString() || '', + placement_type: initialData.placement_type || '', + staff_count: initialData.staff_count?.toString() || '', area: initialData.area || null, rent_contract_num: initialData.rent_contract_num || '', rent_end_date: initialData.rent_end_date @@ -114,8 +114,8 @@ const ModalEditAddVsp = ({ open_date: null, close_date: null, notes: '', - location_form: '', - numbers: '', + placement_type: '', + staff_count: '', area: null, rent_contract_num: '', rent_end_date: null, @@ -215,7 +215,7 @@ const ModalEditAddVsp = ({ const submitData = { ...formData, - numbers: formData.staff_count ? parseInt(formData.staff_count, 10) : null, + staff_count: formData.staff_count ? parseInt(formData.staff_count, 10) : null, area: formData.area ? parseFloat(formData.area) : null, open_date: formData.open_date ? formData.open_date.toLocaleDateString('en-CA') @@ -255,8 +255,8 @@ const ModalEditAddVsp = ({ open_date: null, close_date: null, notes: '', - location_form: '', - numbers: '', + placement_type: '', + staff_count: '', area: '', rent_contract_num: '', rent_end_date: null, @@ -461,11 +461,11 @@ const ModalEditAddVsp = ({ Форма расположения ВСП Date: Thu, 2 Jul 2026 18:10:35 +0300 Subject: [PATCH 16/20] fix-vsp rename fields --- .../AuditLogsPage/constants/configEvent.jsx | 12 +++----- .../components/Modals/ModalEditAddVsp.jsx | 28 +++++++++---------- .../DictVspPage/components/TableDictVsp.jsx | 2 +- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx b/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx index bebd544..a376655 100644 --- a/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx +++ b/web/src/pages/AdminPanel/AuditLogsPage/constants/configEvent.jsx @@ -12,8 +12,8 @@ export const EVENT_CONFIGS = { format: 'Утвержденный формат', opened_at: 'Дата открытия ВСП', notes: 'Примечания', - location_form: 'Форма расположения ВСП', - numbers: 'Штатная численность ВСП', + placement_type: 'Форма расположения ВСП', + staff_count: 'Штатная численность ВСП', total_area: 'Площадь помещений ВСП', rent_contract_num: 'Номер договора аренды', rent_end_date: 'Срок окончания договора аренды', @@ -21,8 +21,6 @@ export const EVENT_CONFIGS = { branch_name: 'Региональный филиал ', closed_at: 'Дата закрытия ВСП', user_email: 'Почта пользователя', - staff_count: 'Кол-во работников', - placement_type: 'Тип размещение', is_active: 'Активный', }, VSP_UPDATE: { @@ -32,8 +30,8 @@ export const EVENT_CONFIGS = { format: 'Утвержденный формат', opened_at: 'Дата открытия ВСП', notes: 'Примечания', - location_form: 'Форма расположения ВСП', - numbers: 'Штатная численность ВСП', + placement_type: 'Форма расположения ВСП', + staff_count: 'Штатная численность ВСП', total_area: 'Площадь помещений ВСП', rent_contract_num: 'Номер договора аренды', rent_end_date: 'Срок окончания договора аренды', @@ -41,8 +39,6 @@ export const EVENT_CONFIGS = { 'changes.branch_name': 'Региональный филиал ', closed_at: 'Дата закрытия ВСП', user_email: 'Почта пользователя', - staff_count: 'Кол-во работников', - placement_type: 'Тип размещение', is_active: 'Активный', }, USER_ACCESS_GRANTED: { diff --git a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx index 96d67ee..1b56ad9 100644 --- a/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx +++ b/web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx @@ -43,8 +43,8 @@ const ModalEditAddVsp = ({ open_date: null, close_date: null, notes: '', - location_form: '', - numbers: '', + placement_type: '', + staff_count: '', area: null, rent_contract_num: '', rent_end_date: null, @@ -94,8 +94,8 @@ const ModalEditAddVsp = ({ ? new Date(initialData.close_date) : null, notes: initialData.notes || '', - location_form: initialData.location_form || '', - numbers: initialData.staff_count?.toString() || '', + placement_type: initialData.placement_type || '', + staff_count: initialData.staff_count?.toString() || '', area: initialData.area || null, rent_contract_num: initialData.rent_contract_num || '', rent_end_date: initialData.rent_end_date @@ -114,8 +114,8 @@ const ModalEditAddVsp = ({ open_date: null, close_date: null, notes: '', - location_form: '', - numbers: '', + placement_type: '', + staff_count: '', area: null, rent_contract_num: '', rent_end_date: null, @@ -215,7 +215,7 @@ const ModalEditAddVsp = ({ const submitData = { ...formData, - numbers: formData.staff_count ? parseInt(formData.staff_count, 10) : null, + staff_count: formData.staff_count ? parseInt(formData.staff_count, 10) : null, area: formData.area ? parseFloat(formData.area) : null, open_date: formData.open_date ? formData.open_date.toLocaleDateString('en-CA') @@ -255,8 +255,8 @@ const ModalEditAddVsp = ({ open_date: null, close_date: null, notes: '', - location_form: '', - numbers: '', + placement_type: '', + staff_count: '', area: '', rent_contract_num: '', rent_end_date: null, @@ -461,11 +461,11 @@ const ModalEditAddVsp = ({ Форма расположения ВСП Date: Thu, 2 Jul 2026 19:07:58 +0300 Subject: [PATCH 17/20] fix aurora-1149 --- .../RealtimeTable/Cell/EditCell/EditCell.jsx | 34 ++++++++++++++++--- .../RealtimeTable/RealtimeTable.jsx | 1 + .../components/RealtimeTable/tableColumns.jsx | 4 +++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx index 5a0687c..72fccb1 100644 --- a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx +++ b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx @@ -2,15 +2,18 @@ import { useEffect, useRef, useLayoutEffect, useState } from 'react'; import { isFormula, extractFormula, calculateFormula, formatNumber } from '../../utils/formulaUtils'; import { saveToStorage, loadFromStorage } from '../../utils/localStorageUtils'; +import { useRealtime } from '../../contexts/RealtimeContext'; + +const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId, table }) => { + const { endEditing: contextEndEditing } = useRealtime(); -const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { const [curValue, setCurValue] = useState(value); const [displayValue, setDisplayValue] = useState(value); const [isFormulaMode, setIsFormulaMode] = useState(false); - + // Ключ для хранения формул в localStorage const storageKey = `formula_${tableId}_${cellId}`; - + const trFrag = refCell.current.offsetParent.offsetParent; const tdFrag = refCell.current.offsetParent; const left = tdFrag.offsetLeft; @@ -69,7 +72,7 @@ const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { if (isFormula(curValue)) { // Сохраняем формулу в localStorage saveToStorage(storageKey, curValue); - + // Вычисляем и сохраняем результат try { const formula = extractFormula(curValue); @@ -108,6 +111,29 @@ const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { return displayValue; }; + const finishEditing = () => { + const editingCell = table.getState().editingCell || null; + if (editingCell) { + contextEndEditing?.(editingCell.row, editingCell.column); + } + }; + + useEffect(() => { + const handleClickOutside = (event) => { + // Проверяем, был ли клик внутри элемента редактирования + const editElement = ref.current; + if (editElement && !editElement.contains(event.target)) { + finishEditing(); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [ref]); + return ( diff --git a/web/src/components/RealtimeTable/RealtimeTable.jsx b/web/src/components/RealtimeTable/RealtimeTable.jsx index b75259b..1427d6e 100644 --- a/web/src/components/RealtimeTable/RealtimeTable.jsx +++ b/web/src/components/RealtimeTable/RealtimeTable.jsx @@ -177,6 +177,7 @@ const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => { measureElement: (el) => el?.offsetHeight || TABLE_ROW_HEIGHT, }, onEditingCellChange: (cell) => { + console.log(cell, editingCell); if (cell) { if (editingCell) return; contextStartEditing?.(cell.row, cell.column); diff --git a/web/src/components/RealtimeTable/tableColumns.jsx b/web/src/components/RealtimeTable/tableColumns.jsx index 2c6dd4e..1353217 100644 --- a/web/src/components/RealtimeTable/tableColumns.jsx +++ b/web/src/components/RealtimeTable/tableColumns.jsx @@ -3,6 +3,7 @@ import { createPortal } from 'react-dom'; import { columns as mockColumns } from '../../mocks/mockTable'; import { config } from './constants/FORM_2/AHR'; import { useParams } from 'react-router'; +import { useRealtime } from './contexts/RealtimeContext'; function EditCellPortal({ cell, @@ -20,6 +21,8 @@ function EditCellPortal({ const [isSaving, setIsSaving] = useState(false); const isDisabled = false; + const { endEditing: contextEndEditing } = useRealtime(); + useEffect(() => { if (ref.current) { const tbodyRef = ref.current.offsetParent?.offsetParent?.offsetParent; @@ -68,6 +71,7 @@ function EditCellPortal({ disabled={!isEditable} onChange={handleChange} tableId={tableKey} + table={table} cellId={cell.row.id + '_' + cell.column.id} />, refTbody, From acd4645a4e434890d5850870935893266c561605 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 2 Jul 2026 19:07:58 +0300 Subject: [PATCH 18/20] fix aurora-1149 --- .../RealtimeTable/Cell/EditCell/EditCell.jsx | 45 ++++++++++++++----- .../RealtimeTable/RealtimeTable.jsx | 3 -- .../components/RealtimeTable/tableColumns.jsx | 4 ++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx index 5a0687c..5cc4386 100644 --- a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx +++ b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx @@ -2,15 +2,18 @@ import { useEffect, useRef, useLayoutEffect, useState } from 'react'; import { isFormula, extractFormula, calculateFormula, formatNumber } from '../../utils/formulaUtils'; import { saveToStorage, loadFromStorage } from '../../utils/localStorageUtils'; +import { useRealtime } from '../../contexts/RealtimeContext'; + +const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId, table }) => { + const { endEditing: contextEndEditing } = useRealtime(); -const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { const [curValue, setCurValue] = useState(value); const [displayValue, setDisplayValue] = useState(value); const [isFormulaMode, setIsFormulaMode] = useState(false); - + // Ключ для хранения формул в localStorage const storageKey = `formula_${tableId}_${cellId}`; - + const trFrag = refCell.current.offsetParent.offsetParent; const tdFrag = refCell.current.offsetParent; const left = tdFrag.offsetLeft; @@ -69,7 +72,7 @@ const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { if (isFormula(curValue)) { // Сохраняем формулу в localStorage saveToStorage(storageKey, curValue); - + // Вычисляем и сохраняем результат try { const formula = extractFormula(curValue); @@ -108,6 +111,32 @@ const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { return displayValue; }; + const finishEditing = () => { + if (!disabled) { + handleSave(); + } + const editingCell = table.getState().editingCell || null; + if (editingCell) { + contextEndEditing?.(editingCell.row, editingCell.column); + } + }; + + useEffect(() => { + const handleClickOutside = (event) => { + // Проверяем, был ли клик внутри элемента редактирования + const editElement = ref.current; + if (editElement && !editElement.contains(event.target)) { + finishEditing(); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [ref, finishEditing]); + return ( @@ -150,16 +179,10 @@ const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { }} onChange={handleChangeValue} value={curValue} - onBlur={handleSave} onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); - handleSave(); - // Закрываем редактирование - if (onChange) { - // Симулируем завершение редактирования - document.activeElement?.blur(); - } + finishEditing(); } }} placeholder={isFormulaMode ? 'Введите формулу (начинается с =)' : ''} diff --git a/web/src/components/RealtimeTable/RealtimeTable.jsx b/web/src/components/RealtimeTable/RealtimeTable.jsx index b75259b..c40ca7e 100644 --- a/web/src/components/RealtimeTable/RealtimeTable.jsx +++ b/web/src/components/RealtimeTable/RealtimeTable.jsx @@ -63,7 +63,6 @@ const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => { addRow: contextAddRow, deleteRow: contextDeleteRow, startEditing: contextStartEditing, - endEditing: contextEndEditing, } = useRealtime(); const { @@ -180,8 +179,6 @@ const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => { if (cell) { if (editingCell) return; contextStartEditing?.(cell.row, cell.column); - } else { - contextEndEditing?.(editingCell.row, editingCell.column); } }, columnVirtualizerOptions: ({ table }) => ({ diff --git a/web/src/components/RealtimeTable/tableColumns.jsx b/web/src/components/RealtimeTable/tableColumns.jsx index 2c6dd4e..1353217 100644 --- a/web/src/components/RealtimeTable/tableColumns.jsx +++ b/web/src/components/RealtimeTable/tableColumns.jsx @@ -3,6 +3,7 @@ import { createPortal } from 'react-dom'; import { columns as mockColumns } from '../../mocks/mockTable'; import { config } from './constants/FORM_2/AHR'; import { useParams } from 'react-router'; +import { useRealtime } from './contexts/RealtimeContext'; function EditCellPortal({ cell, @@ -20,6 +21,8 @@ function EditCellPortal({ const [isSaving, setIsSaving] = useState(false); const isDisabled = false; + const { endEditing: contextEndEditing } = useRealtime(); + useEffect(() => { if (ref.current) { const tbodyRef = ref.current.offsetParent?.offsetParent?.offsetParent; @@ -68,6 +71,7 @@ function EditCellPortal({ disabled={!isEditable} onChange={handleChange} tableId={tableKey} + table={table} cellId={cell.row.id + '_' + cell.column.id} />, refTbody, From 88e12d1a8b0b03ec1f1ef95534be3e9400286b8b Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Fri, 3 Jul 2026 15:07:44 +0300 Subject: [PATCH 19/20] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=B3=D0=BE=D0=B4=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/constants/projectConfig.jsx | 2 +- .../pages/ProjectsPage/ModalCreateProject.jsx | 35 ++++++++----------- web/src/pages/ProjectsPage/ProjectCard.jsx | 6 ++-- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/web/src/constants/projectConfig.jsx b/web/src/constants/projectConfig.jsx index d94a38f..6fd96a4 100644 --- a/web/src/constants/projectConfig.jsx +++ b/web/src/constants/projectConfig.jsx @@ -12,7 +12,7 @@ export const DEFAULT_PROJECT_CONFIG = { defaultValue: null, min: 0, step: 1, - required_field: true, + required_field: false, }, 'Тип проекта развития': { type: 'multiselect', diff --git a/web/src/pages/ProjectsPage/ModalCreateProject.jsx b/web/src/pages/ProjectsPage/ModalCreateProject.jsx index 20c3f94..3ee10fe 100644 --- a/web/src/pages/ProjectsPage/ModalCreateProject.jsx +++ b/web/src/pages/ProjectsPage/ModalCreateProject.jsx @@ -1,4 +1,3 @@ -// src/components/common/ProjectCardComponent/ModalCreateProject.jsx import { useState, useEffect } from 'react'; import { Box, Button, Divider, TextField, Typography } from '@mui/material'; import SelectWithOptions from '../AdminPanel/components/SelectWithOptions'; @@ -11,43 +10,41 @@ export const ModalCreateProject = ({ onCreate, config = {}, initialData = null, - isEdit = false, - projectId = null, + title = 'Создание проекта', + buttonText = 'Создать', }) => { const [projectData, setProjectData] = useState(() => { - // Если есть initialData, используем её, иначе создаем из конфига if (initialData) { return { ...initialData }; } - const initial = {}; + // Иначе создаем из конфига + const data = {}; Object.keys(config).forEach((key) => { - initial[key] = config[key].defaultValue; + data[key] = config[key].defaultValue; }); - return initial; + return data; }); const [errors, setErrors] = useState({}); - // Обновляем данные при изменении initialData useEffect(() => { if (initialData) { setProjectData({ ...initialData }); } else { - const initial = {}; + const data = {}; Object.keys(config).forEach((key) => { - initial[key] = config[key].defaultValue; + data[key] = config[key].defaultValue; }); - setProjectData(initial); + setProjectData(data); } setErrors({}); - }, [initialData, config]); + }, [initialData, config, open]); const handleChange = (field, value) => { setProjectData((prev) => ({ ...prev, [field]: value, })); - // Очищаем ошибку для поля при изменении if (errors[field]) { setErrors((prev) => ({ ...prev, @@ -59,8 +56,7 @@ export const ModalCreateProject = ({ const validateField = (fieldName, config) => { if (config.required_field) { const value = projectData[fieldName]; - - // Проверка для разных типов полей + if (config.type === 'multiselect') { if (!value || (Array.isArray(value) && value.length === 0) || value === '') { return `Поле "${fieldName}" обязательно для заполнения`; @@ -73,11 +69,9 @@ export const ModalCreateProject = ({ if (value === null || value === undefined || value === '') { return `Поле "${fieldName}" обязательно для заполнения`; } - // Проверка на минимальное значение if (config.min !== undefined && Number(value) < config.min) { return `Значение должно быть не меньше ${config.min}`; } - // Проверка на максимальное значение if (config.max !== undefined && Number(value) > config.max) { return `Значение должно быть не больше ${config.max}`; } @@ -105,7 +99,7 @@ export const ModalCreateProject = ({ const handleClickCreate = () => { if (validateAllFields()) { onCreate(projectData); - // Не закрываем модалку здесь, пусть это делает родительский компонент + onClose(); } }; @@ -225,7 +219,6 @@ export const ModalCreateProject = ({ value={projectData[fieldName] || ''} onChange={(e) => { const inputValue = e.target.value; - //только числа const isValidInput = /^\d*\.?\d*$/.test(inputValue) || inputValue === ''; if (isValidInput) { @@ -260,7 +253,7 @@ export const ModalCreateProject = ({ return ( - {isEdit ? 'Сохранить' : 'Создать'} + {buttonText} } diff --git a/web/src/pages/ProjectsPage/ProjectCard.jsx b/web/src/pages/ProjectsPage/ProjectCard.jsx index 15ed15c..36ace2a 100644 --- a/web/src/pages/ProjectsPage/ProjectCard.jsx +++ b/web/src/pages/ProjectsPage/ProjectCard.jsx @@ -151,7 +151,7 @@ export const ProjectCardComponent = ({ id, name, org_unit_name, - year, + years, status, level, project_type, @@ -180,7 +180,7 @@ export const ProjectCardComponent = ({ const prepareProjectDataForEdit = () => { return { 'ССП/РФ': project.org_unit_id || null, - 'Год': year || null, + 'Год': years || null, 'Тип проекта развития': project_type || null, 'Название проекта': currentName, 'Формат ВСП': vsp_format || null, @@ -316,7 +316,7 @@ export const ProjectCardComponent = ({ > }> - {year || 'Год не указан'} + {years.join(', ') || 'Год не указан'} }> {org_unit_name || 'Организация не указана'} From 0a99aeed0cbbcfb3ccf8aa9214b35be3fc71e774 Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Fri, 3 Jul 2026 15:35:20 +0300 Subject: [PATCH 20/20] =?UTF-8?q?project-sheets:=20=D0=B3=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=BE=D0=BF=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=81=20null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/domain/schemas.py | 4 +++ .../integration/test_projects_api_smoke.py | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/api/src/domain/schemas.py b/api/src/domain/schemas.py index b11133e..47ae594 100644 --- a/api/src/domain/schemas.py +++ b/api/src/domain/schemas.py @@ -374,6 +374,10 @@ class AddProjectBody(BaseModel): staff_count: Optional[int] = None total_area: Optional[float] = None + @field_validator("year", mode="before") + @classmethod + def optional_year(cls, v: Any) -> Any: + return v or datetime.now().year class AddLineSchema(BaseModel): expense_item_id: Optional[int] = None diff --git a/api/tests/integration/test_projects_api_smoke.py b/api/tests/integration/test_projects_api_smoke.py index dc21b78..b480698 100644 --- a/api/tests/integration/test_projects_api_smoke.py +++ b/api/tests/integration/test_projects_api_smoke.py @@ -48,6 +48,31 @@ def _add_line(client, admin_tokens, auth_headers, project_id: int) -> int: pytest.skip("Не удалось подобрать expense_item_id для add_form3_line в текущей БД") +def test_create_project_smoke(client, admin_tokens, auth_headers): + name = f"PT_{uuid.uuid4().hex[:10]}" + response = client.post( + "/api/v1/projects", + json={"name": name, "year": None, "branch_id": 1}, + headers=auth_headers(admin_tokens), + ) + assert response.status_code == 200 + payload = response.json() + assert "project_id" in payload + assert (project_id := payload["project_id"]) is not None + response = client.get( + f"/api/v1/projects/{project_id}", + headers=auth_headers(admin_tokens), + ) + assert response.status_code == 200 + payload = response.json() + assert "result" in payload + assert "id" in payload["result"] + assert payload["result"]["id"] == project_id + assert "years" in payload["result"] + assert isinstance(payload["result"]["years"], list) + assert len(payload["result"]["years"]) == 1 + + def test_projects_write_smoke(client, admin_tokens, auth_headers): project_id, name = _create_project(client, admin_tokens, auth_headers)