diff --git a/app/panels/rrp_conf_editor/iud_form_dialog.js b/app/panels/rrp_conf_editor/IUD/iud_form_dialog.js
similarity index 84%
rename from app/panels/rrp_conf_editor/iud_form_dialog.js
rename to app/panels/rrp_conf_editor/IUD/iud_form_dialog.js
index 936de02..61b41c7 100644
--- a/app/panels/rrp_conf_editor/iud_form_dialog.js
+++ b/app/panels/rrp_conf_editor/IUD/iud_form_dialog.js
@@ -10,8 +10,8 @@
import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogTitle, IconButton, Icon, DialogContent, Typography, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты
-import { ApplicationСtx } from "../../context/application"; //Контекст приложения
-import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
+import { ApplicationСtx } from "../../../context/application"; //Контекст приложения
+import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
import { IUDFormTextField } from "./iud_form_text_field"; //Компонент поля ввода
//---------
@@ -65,7 +65,9 @@ const IUDFormDialog = ({ initial, onClose, onReload }) => {
};
//При изменении значения элемента
- const handleDialogItemChange = (item, value) => setFormData(pv => ({ ...pv, [item]: value }));
+ const handleDialogItemChange = (item, value) => {
+ setFormData(pv => ({ ...pv, [item]: value }));
+ };
//Отработка изменений в разделе или показателе раздела
const changeSections = useCallback(async () => {
@@ -139,13 +141,11 @@ const IUDFormDialog = ({ initial, onClose, onReload }) => {
NPRN: formData.prn,
SCODE: formData.code,
SNAME: formData.name,
- SCOLCODE: formData.colCode,
- SCOLVER: formData.colVCode,
- SROWCODE: formData.rowCode,
- SROWVER: formData.rowVCode
+ NRRPROW: formData.rowRn,
+ NRRPCOLUMN: formData.colRn
}
});
- }, [executeStored, formData.code, formData.colVCode, formData.colCode, formData.name, formData.prn, formData.rowCode, formData.rowVCode]);
+ }, [executeStored, formData.code, formData.colRn, formData.name, formData.prn, formData.rowRn]);
//Исправление показателя раздела
const editRRPCONFSCTNMRK = useCallback(async () => {
@@ -210,14 +210,15 @@ const IUDFormDialog = ({ initial, onClose, onReload }) => {
const selectRow = (showDictionary, callBack) => {
showDictionary({
unitCode: "RRPRow",
+ inputParameters: [{ name: "in_RN", value: formData.rowRn }],
callBack: res => {
if (res.success === true) {
- callBack(res.outParameters.out_CODE, res.outParameters.out_RRPVERSION_CODE, res.outParameters.out_RRPVERSION);
+ callBack(res.outParameters.out_CODE, res.outParameters.out_RN);
setFormData(pv => ({
...pv,
+ reload: true,
rowCode: res.outParameters.out_CODE,
- rowVCode: res.outParameters.out_RRPVERSION_CODE,
- rowVRn: res.outParameters.out_RRPVERSION
+ rowRn: res.outParameters.out_RN
}));
} else callBack(null);
}
@@ -228,14 +229,15 @@ const IUDFormDialog = ({ initial, onClose, onReload }) => {
const selectColumn = (showDictionary, callBack) => {
showDictionary({
unitCode: "RRPColumn",
+ inputParameters: [{ name: "in_RN", value: formData.colRn }],
callBack: res => {
if (res.success === true) {
- callBack(res.outParameters.out_CODE, res.outParameters.out_RRPVERSION_CODE, res.outParameters.out_RRPVERSION);
+ callBack(res.outParameters.out_CODE, res.outParameters.out_RN);
setFormData(pv => ({
...pv,
+ reload: true,
colCode: res.outParameters.out_CODE,
- colVCode: res.outParameters.out_RRPVERSION_CODE,
- colVRn: res.outParameters.out_RRPVERSION
+ colRn: res.outParameters.out_RN
}));
} else callBack(null);
}
@@ -247,26 +249,41 @@ const IUDFormDialog = ({ initial, onClose, onReload }) => {
const data = await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODE_NAME",
args: {
- SSCTNCODE: formData.sctnCode,
- SROWCODE: formData.rowCode,
- NROWVER: formData.rowVRn,
- SCOLUMNCODE: formData.colCode,
- NCOLUMNVER: formData.colVRn
+ NRRPCONFSCTN: formData.prn,
+ NRRPROW: formData.rowRn,
+ NRRPCOLUMN: formData.colRn
}
});
setFormData(pv => ({
...pv,
+ reload: false,
code: data.SCODE,
name: data.SNAME
}));
- }, [executeStored, formData.colCode, formData.colVRn, formData.rowCode, formData.rowVRn, formData.sctnCode]);
+ }, [executeStored, formData.colRn, formData.prn, formData.rowRn]);
+
+ //Считывание наименования показателя
+ const getMarkName = useCallback(async () => {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_NAME",
+ args: {
+ NRRPCONFSCTNMRK: formData.rn
+ }
+ });
+ setFormData(pv => ({
+ ...pv,
+ reload: false,
+ name: data.SNAME
+ }));
+ }, [executeStored, formData.rn]);
//Получение наименования и мнемокода показателя раздела при заполнении необходимых полей
useEffect(() => {
- formData.status == STATUSES.RRPCONFSCTNMRK_CREATE && formData.sctnName && formData.sctnCode && formData.colCode && formData.rowCode
- ? getSctnMrkCodeName()
- : null;
- }, [formData.colCode, formData.rowCode, formData.sctnCode, formData.sctnName, formData.status, getSctnMrkCodeName]);
+ //Если это добавление показателя и требуется сформировать мнемокод и наименование
+ formData.status == STATUSES.RRPCONFSCTNMRK_CREATE && formData.reload && formData.rowRn && formData.colRn ? getSctnMrkCodeName() : null;
+ //Если это исправление и требуется инициализировать наименование показателя
+ formData.status == STATUSES.RRPCONFSCTNMRK_EDIT && formData.reload ? getMarkName() : null;
+ }, [formData.status, formData.reload, formData.rowRn, formData.colRn, getSctnMrkCodeName, getMarkName]);
//Генерация содержимого
return (
diff --git a/app/panels/rrp_conf_editor/iud_form_text_field.js b/app/panels/rrp_conf_editor/IUD/iud_form_text_field.js
similarity index 100%
rename from app/panels/rrp_conf_editor/iud_form_text_field.js
rename to app/panels/rrp_conf_editor/IUD/iud_form_text_field.js
diff --git a/app/panels/rrp_conf_editor/components/layouts.js b/app/panels/rrp_conf_editor/components/layouts.js
new file mode 100644
index 0000000..3c1c1d7
--- /dev/null
+++ b/app/panels/rrp_conf_editor/components/layouts.js
@@ -0,0 +1,344 @@
+/*
+ Парус 8 - Панели мониторинга - РО - Редактор настройки регламентированного отчёта
+ Дополнительная разметка и вёрстка клиентских элементов
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import {
+ IconButton,
+ Icon,
+ Link,
+ Card,
+ CardContent,
+ CardHeader,
+ Menu,
+ MenuItem,
+ Table,
+ TableRow,
+ TableCell,
+ TableBody,
+ Box,
+ Typography
+} from "@mui/material"; //Интерфейсные компоненты
+
+//---------
+//Константы
+//---------
+
+//Стили
+export const STYLES = {
+ BOX_ROW: { display: "flex", justifyContent: "center", alignItems: "center" },
+ LINK_STYLE: { component: "button", cursor: "pointer", width: "-webkit-fill-available" },
+ DATA_CELL: columnDef => ({
+ padding: "5px 5px",
+ fontSize: "0.775rem",
+ letterSpacing: "0.005em",
+ textAlign: "center",
+ wordBreak: "break-all",
+ backgroundColor: columnDef.name === "SROW_NAME" ? "#b4b4b4" : "trasparent"
+ }),
+ DATA_CELL_CARD: {
+ padding: "0px 3px 3px 0px",
+ border: "1px solid lightgrey",
+ borderRadius: "5%"
+ },
+ DATA_CELL_CARD_HEADER: {
+ padding: "0px"
+ },
+ DATA_CELL_CARD_SUBHEADER: {
+ textAlign: "left",
+ paddingLeft: "10px",
+ fontSize: "1rem",
+ fontWeight: "450"
+ },
+ DATA_CELL_CARD_CONTENT: listLength => {
+ return {
+ fontSize: "0.75rem",
+ padding: "5px 0px",
+ minHeight: "105px",
+ maxHeight: "105px",
+ overflowY: "auto",
+ "&::-webkit-scrollbar": {
+ width: "8px"
+ },
+ "&::-webkit-scrollbar-track": {
+ borderRadius: "8px",
+ backgroundColor: "#EBEBEB"
+ },
+ "&::-webkit-scrollbar-thumb": {
+ borderRadius: "8px",
+ backgroundColor: "#b4b4b4"
+ },
+ "&::-webkit-scrollbar-thumb:hover": {
+ backgroundColor: "#808080"
+ },
+ "&:last-child": {
+ paddingBottom: "0px"
+ },
+ ...(listLength === 0 ? { display: "flex", justifyContent: "center", alignItems: "center" } : null)
+ };
+ },
+ DATA_CELL_CARD_CONTEXT_FONT: {
+ fontSize: "0.75rem"
+ },
+ DATA_CELL_CARD_CONTEXT_MARK: {
+ padding: "0px 0px 0px 10px",
+ borderBottom: "1px solid #EBEBEB"
+ },
+ DATA_CELL_CN: {
+ textOverflow: "ellipsis",
+ overflow: "hidden",
+ whiteSpace: "pre",
+ padding: "0px 5px",
+ maxWidth: "100px",
+ border: "none"
+ },
+ GRID_PANEL_CARD: { maxWidth: 400, flexDirection: "column", display: "flex" },
+ MARK_INFO: {
+ fontSize: "0.8rem",
+ textAlign: "left",
+ textOverflow: "ellipsis",
+ overflow: "hidden",
+ whiteSpace: "pre",
+ maxWidth: "max-content",
+ width: "-webkit-fill-available"
+ },
+ BUTTON_CN_INSERT: {
+ padding: "0px 8px",
+ marginBottom: "2px",
+ "& .MuiIcon-root": {
+ fontWeight: "bold",
+ fontSize: "1rem"
+ }
+ },
+ HEAD_CELL: {
+ backgroundColor: "#b4b4b4",
+ textAlign: "center"
+ },
+ HEAD_CELL_STACK: {
+ justifyContent: "space-around"
+ }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Действия карты показателя
+const DataCellCardActions = ({ columnDef, menuItems, cellData, markRn }) => {
+ //Собственное состояние
+ const [cardActions, setCardActions] = useState({ anchorMenuMethods: null, openMethods: false });
+
+ //По нажатию на открытие меню действий
+ const handleMethodsMenuButtonClick = event => {
+ setCardActions(pv => ({ ...pv, anchorMenuMethods: event.currentTarget, openMethods: true }));
+ };
+
+ //При закрытии меню
+ const handleMethodsMenuClose = () => {
+ setCardActions(pv => ({ ...pv, anchorMenuMethods: null, openMethods: false }));
+ };
+ return (
+
+
+ more_vert
+
+
+
+ );
+};
+
+//Контроль свойств - Действия карты показателя
+DataCellCardActions.propTypes = {
+ columnDef: PropTypes.object.isRequired,
+ menuItems: PropTypes.array,
+ cellData: PropTypes.any,
+ markRn: PropTypes.number
+};
+
+//Таблица составов показателя
+const MarkCnList = ({ markRn, list, handleMarkCnOpen }) => {
+ return (
+
+
+ {list.map((el, index) => {
+ return (
+
+
+ handleMarkCnOpen(markRn, el.NRN)}>
+ {el.SDESC}
+
+
+
+ );
+ })}
+
+
+ );
+};
+
+//Контроль свойств - Таблица составов показателя
+MarkCnList.propTypes = {
+ markRn: PropTypes.number.isRequired,
+ list: PropTypes.array.isRequired,
+ handleMarkCnOpen: PropTypes.func.isRequired
+};
+
+//Ячейка таблицы строки
+const DataCellContent = ({ row, columnDef, menuItems, sectionRn, handleMarkAdd, handleMarkOpen, handleMarkCnOpen, handleMarkCnInsert }) => {
+ //Считываем информацию о показателе
+ let mark = {
+ sectionRn: sectionRn,
+ data: row[columnDef.name],
+ nRn: row["NMARK_RN_" + columnDef.name.substring(5)],
+ sCode: row["SMARK_CODE_" + columnDef.name.substring(5)],
+ sRowCode: row["SROW_CODE"],
+ nRowRn: row["NROW_RN"],
+ sColCode: columnDef.name.substring(5),
+ nColRn: row["NCOL_RN_" + columnDef.name.substring(5)],
+ rCnList: row["MARK_CNS_" + columnDef.name.substring(5)] ? [...row["MARK_CNS_" + columnDef.name.substring(5)]] : []
+ };
+
+ return (
+ <>
+ {mark.nRn ? (
+
+
+ (handleMarkOpen ? handleMarkOpen(mark.nRn) : null)}>
+ Состав
+
+ {mark.rCnList.length !== 0 ? (
+ handleMarkCnInsert(mark.nRn)}>
+ add
+
+ ) : null}
+
+ }
+ subheaderTypographyProps={STYLES.DATA_CELL_CARD_SUBHEADER}
+ action={}
+ >
+
+
+ {mark.sCode}
+
+
+
+ {mark.rCnList.length !== 0 ? (
+
+ ) : (
+
+ Показатель не имеет состава
+ (handleMarkCnInsert ? handleMarkCnInsert(mark.nRn) : null)}>
+ Добавить
+
+
+ )}
+
+
+ ) : (
+
+ Показатель отсутствует
+
+ handleMarkOpen ? handleMarkAdd(mark.sectionRn, mark.nRowRn, mark.sRowCode, mark.nColRn, mark.sColCode) : null
+ }
+ >
+ Добавить
+
+
+ )}
+ >
+ );
+};
+
+//Контроль свойств - Ячейка таблицы строки
+DataCellContent.propTypes = {
+ row: PropTypes.object.isRequired,
+ columnDef: PropTypes.object.isRequired,
+ menuItems: PropTypes.array,
+ sectionRn: PropTypes.number.isRequired,
+ handleMarkAdd: PropTypes.func,
+ handleMarkOpen: PropTypes.func,
+ handleMarkCnOpen: PropTypes.func,
+ handleMarkCnInsert: PropTypes.func
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Генерация представления ячейки c данными показателя раздела регламентированного отчета
+export const confSctnMrkCellRender = ({
+ row,
+ columnDef,
+ sectionRn,
+ handleMarkAdd,
+ handleMarkOpen,
+ handleMarkCnOpen,
+ handleMarkCnInsert,
+ menuItems
+}) => {
+ //Иницализируем стили
+ let cellStyle = STYLES.DATA_CELL(columnDef);
+ //Считываем значение
+ let data = row[columnDef.name];
+ //Если это не наименование строки и есть значение
+ columnDef.name != "SROW_NAME" && data != undefined && columnDef.visible == true
+ ? (data = (
+
+ ))
+ : null;
+ return { cellStyle: { ...cellStyle }, data: data };
+};
+
+//Генерация представления ячейки заголовка группы c данными показателя раздела регламентированного отчета
+export const confSctnMrkHeadCellRender = ({ columnDef }) => {
+ return {
+ cellStyle: STYLES.HEAD_CELL,
+ stackStyle: STYLES.HEAD_CELL_STACK,
+ data: columnDef.caption
+ };
+};
diff --git a/app/panels/rrp_conf_editor/components/rrp_section.js b/app/panels/rrp_conf_editor/components/rrp_section.js
new file mode 100644
index 0000000..f8ecf18
--- /dev/null
+++ b/app/panels/rrp_conf_editor/components/rrp_section.js
@@ -0,0 +1,243 @@
+/*
+ Парус 8 - Панели мониторинга - РО - Редактор настройки регламентированного отчёта
+ Компонент панели: Раздел настройки
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Box, IconButton, Icon, Dialog, DialogTitle, DialogContent, Typography, List, ListItem } from "@mui/material"; //Интерфейсные элементы
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { SectionTabPanel } from "./section_tab_panel"; //Компонент вкладки раздела
+import { confSctnMrkCellRender, confSctnMrkHeadCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ GRID_SIZES: (height, pxOuterMenuH, pxPanelHeaderH, pxTabsH) => ({
+ padding: 0,
+ minWidth: "98vw",
+ minHeight: (height - pxOuterMenuH - pxPanelHeaderH - pxTabsH) * 0.93,
+ maxWidth: "98vw",
+ maxHeight: (height - pxOuterMenuH - pxPanelHeaderH - pxTabsH) * 0.93
+ }),
+ TABLE_CONTAINER: {
+ display: "flex",
+ justifyContent: "center",
+ alignItems: "center",
+ paddingTop: 1,
+ paddingBottom: 1
+ },
+ SECTION_ACTIONS: { display: "flex", justifyContent: "space-between", padding: "0px 5px" },
+ TABLE_SCROLL: {
+ "&::-webkit-scrollbar": {
+ width: "12px",
+ height: "12px"
+ },
+ "&::-webkit-scrollbar-track": {
+ borderRadius: "88px",
+ backgroundColor: "#EBEBEB"
+ },
+ "&::-webkit-scrollbar-thumb": {
+ borderRadius: "88px",
+ backgroundColor: "#b4b4b4",
+ backgroundClip: "padding-box",
+ border: "3px solid #EBEBEB"
+ },
+ "&::-webkit-scrollbar-thumb:hover": {
+ backgroundColor: "#808080"
+ }
+ },
+ HELP_LIST_ITEM: {
+ padding: "0px 0px 0px 5px",
+ whiteSpace: "pre",
+ fontSize: "0.95rem"
+ },
+ HELP_LIST_ITEM_NAME: {
+ fontWeight: "bold",
+ fontSize: "inherit",
+ minWidth: "45px"
+ },
+ HELP_LIST_ITEM_DESC: {
+ fontSize: "inherit"
+ }
+};
+
+//---------------------------------------------
+//Вспомогательные функции и компоненты
+//---------------------------------------------
+
+//Элемент списка расшифровки состава
+const HelpListItem = ({ name, desc }) => {
+ return (
+
+ {name}
+ {` - ${desc}`}
+
+ );
+};
+
+//Контроль свойств - Элемент списка расшифровки состава
+HelpListItem.propTypes = {
+ name: PropTypes.string.isRequired,
+ desc: PropTypes.string.isRequired
+};
+
+//Диалог дополнительной информации
+const HelpDialog = ({ handleOpenHelpChange }) => {
+ //Генерация содержимого
+ return (
+
+ );
+};
+
+//Контроль свойств - Диалог дополнительной информации
+HelpDialog.propTypes = {
+ handleOpenHelpChange: PropTypes.func.isRequired
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Раздел настройки
+const SectionTab = ({
+ section,
+ tabValue,
+ index,
+ containerProps,
+ handleMarkAdd,
+ handleReload,
+ handleMarkOpen,
+ handleMarkCnOpen,
+ handleMarkCnInsert,
+ menuItems
+}) => {
+ //Состояние - диалог информации
+ const [openHelp, setOpenHelp] = useState(false);
+
+ //Изменение состояния диалога информации
+ const handleOpenHelpChange = () => {
+ setOpenHelp(!openHelp);
+ };
+
+ //Генерация содержимого
+ return (
+ <>
+
+
+
+ handleMarkAdd(section.rn)}>
+ add
+
+ handleReload()}>
+ refresh
+
+
+
+ handleOpenHelpChange()}>
+ help
+
+
+
+ {section.dataLoaded && section.columnsDef.length > 3 ? (
+
+
+ confSctnMrkCellRender({
+ ...prms,
+ sectionRn: section.rn,
+ handleMarkAdd: handleMarkAdd,
+ handleMarkOpen: handleMarkOpen,
+ handleMarkCnOpen: handleMarkCnOpen,
+ handleMarkCnInsert: handleMarkCnInsert,
+ menuItems: menuItems
+ })
+ }
+ headCellRender={confSctnMrkHeadCellRender}
+ />
+
+ ) : null}
+
+ {openHelp ? : null}
+ >
+ );
+};
+
+//Контроль свойств - Раздел настройки
+SectionTab.propTypes = {
+ section: PropTypes.object.isRequired,
+ tabValue: PropTypes.number,
+ index: PropTypes.number,
+ containerProps: PropTypes.object,
+ handleMarkAdd: PropTypes.func,
+ handleReload: PropTypes.func,
+ handleMarkOpen: PropTypes.func,
+ handleMarkCnOpen: PropTypes.func,
+ handleMarkCnInsert: PropTypes.func,
+ menuItems: PropTypes.array
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { SectionTab };
diff --git a/app/panels/rrp_conf_editor/section_tab_panel.js b/app/panels/rrp_conf_editor/components/section_tab_panel.js
similarity index 80%
rename from app/panels/rrp_conf_editor/section_tab_panel.js
rename to app/panels/rrp_conf_editor/components/section_tab_panel.js
index afed14c..9f24331 100644
--- a/app/panels/rrp_conf_editor/section_tab_panel.js
+++ b/app/panels/rrp_conf_editor/components/section_tab_panel.js
@@ -9,7 +9,17 @@
import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
-import { Box, Typography } from "@mui/material"; //Интерфейсные компоненты
+import { Box } from "@mui/material"; //Интерфейсные компоненты
+
+//---------
+//Константы
+//---------
+
+const STYLES = {
+ SECTION_INFO: {
+ padding: "24px 5px 0px 5px"
+ }
+};
//---------------
//Тело компонента
@@ -21,11 +31,7 @@ const SectionTabPanel = props => {
//Генерация содержимого
return (
- {value === index && (
-
- {children}
-
- )}
+ {value === index && {children}}
);
};
diff --git a/app/panels/rrp_conf_editor/hooks.js b/app/panels/rrp_conf_editor/hooks.js
index 9fff362..6979162 100644
--- a/app/panels/rrp_conf_editor/hooks.js
+++ b/app/panels/rrp_conf_editor/hooks.js
@@ -7,7 +7,17 @@
//Подключение библиотек
//---------------------
-import { useState, useLayoutEffect } from "react"; //Классы React
+import { useState, useContext, useEffect, useCallback, useLayoutEffect } from "react"; //Классы React
+import { ApplicationСtx } from "../../context/application"; //Контекст приложения
+import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
+import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
+import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
+import { STATUSES } from "./IUD/iud_form_dialog"; //Статусы диалогов
+import { TEXTS } from "../../../app.text"; //Тексты для ошибок
+
+//---------------------------------------------
+//Вспомогательные функции форматирования данных
+//---------------------------------------------
//-----------
//Тело модуля
@@ -32,8 +42,359 @@ const useWindowResize = () => {
return size;
};
+//Хук для настройки регламентированного отчета
+const useConf = (currentTab, handleSectionChange) => {
+ //Собственное состояние - таблица данных
+ const dataGrid = {
+ rn: 0,
+ code: "",
+ name: "",
+ dataLoaded: false,
+ columnsDef: [],
+ groups: [],
+ rows: [],
+ fixedHeader: false,
+ fixedColumns: 0,
+ reload: false
+ };
+
+ //Собственное состояние
+ const [rrpConf, setRrpConf] = useState({
+ docLoaded: false,
+ sections: [],
+ reload: true
+ });
+
+ //Состояние массива данных разделов
+ const [dataGrids] = useState([]);
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //Подключение к контексту навигации
+ const { getNavigationSearch } = useContext(NavigationCtx);
+
+ //При необходимости обновить
+ const handleReload = useCallback(async () => {
+ setRrpConf(pv => ({ ...pv, reload: true }));
+ }, []);
+
+ //Загрузка данных разделов регламентированного отчёта
+ const loadData = useCallback(async () => {
+ if (rrpConf.reload) {
+ //Переменная номера раздела с фокусом
+ let tabFocus = currentTab ? currentTab : 0;
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.RRPCONF_GET_SECTIONS",
+ args: {
+ NRN_RRPCONF: Number(getNavigationSearch().NRN)
+ },
+ respArg: "COUT"
+ });
+ //Флаг первой загрузки данных
+ let firstLoad = dataGrids.length == 0 ? true : false;
+ //Копирование массива уже загруженных разделов
+ let cloneDGs = dataGrids.slice();
+ //Массив из нескольких разделов и из одного
+ const sections = data.SECTIONS ? (data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS]) : [];
+ //Заполнение очередного раздела по шаблону
+ sections.map(s => {
+ let dg = {};
+ Object.assign(dg, dataGrid, {
+ rn: s.NRN,
+ code: s.SCODE,
+ name: s.SNAME,
+ delete_allow: s.NDELETE_ALLOW,
+ dataLoaded: true,
+ columnsDef: [...(s.XDATA.XCOLUMNS_DEF || [])],
+ groups: [...(s.XDATA.XGROUPS || [])],
+ rows: [...(s.XDATA.XROWS || [])],
+ fixedHeader: s.XDATA.XDATA_GRID.fixedHeader,
+ fixedColumns: s.XDATA.XDATA_GRID.fixedColumns,
+ reload: false
+ });
+ //Если раздел имеет составы показателей
+ if (s.MARK_CNS.MARK_CN) {
+ //Обходим строки раздела
+ dg.rows.map(row => {
+ //Цикл по ключам строки
+ for (let key in row) {
+ //Если это ключ для группы составов показателей
+ if (key.match(/MARK_CNS_.*/)) {
+ //Считываем рег. номер показателя
+ let markRn = key.substring(9);
+ //Переносим из раздела
+ row[key] = Array.isArray(s.MARK_CNS.MARK_CN)
+ ? [...s.MARK_CNS.MARK_CN].filter(el => el.NPRN === row[`NMARK_RN_${markRn}`])
+ : s.MARK_CNS.MARK_CN.NPRN === row[`NMARK_RN_${markRn}`]
+ ? [s.MARK_CNS.MARK_CN]
+ : null;
+ }
+ }
+ });
+ }
+ //Ищем загружен ли уже раздел с таким же ид.
+ const dgItem = dataGrids.find(x => x.rn === dg.rn);
+ //Его индекс, если нет соответствия, то -1
+ let index = dataGrids.indexOf(dgItem);
+ //Если было соответствие
+ if (dgItem) {
+ //Если в нём не найдено изменений
+ if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) {
+ //То из копированного массива его удаляем
+ cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1);
+ } else {
+ //Иначе обновляем раздел в массиве
+ dataGrids[index] = dg;
+ //Удаляем из копированного массива
+ cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1);
+ //Устанавливаем фокус на обновлённый раздел
+ tabFocus = index;
+ }
+ } else {
+ //Если раздел новый, то добавляем его в массив данных
+ dataGrids.push(dg);
+ //И устанавливаем на него фокус, если флаг первой загрузки = false
+ tabFocus = !firstLoad ? dataGrids.length - 1 : 0;
+ }
+ });
+ //Обходим разделы, что остались в копированном массиве (на удаление)
+ cloneDGs.map(s => {
+ let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));
+ //Устаревший раздел удаляем из массива данных
+ dataGrids.splice(curIndex, 1);
+ //Фокус на предшествующий раздел
+ if (curIndex > 0) tabFocus = curIndex - 1;
+ //Иначе фокус на следующий, если был удалён первый раздел
+ else tabFocus = curIndex;
+ });
+ setRrpConf(pv => ({
+ ...pv,
+ docLoaded: true,
+ reload: false,
+ sections: dataGrids
+ }));
+ handleSectionChange(tabFocus);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [rrpConf.reload, rrpConf.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [rrpConf.reload, dataGrid.reload, loadData]);
+
+ return [rrpConf, handleReload];
+};
+
+//Хук для вкладки
+const useTab = () => {
+ //Состояние раздела
+ const [tabValue, setTabValue] = useState("");
+
+ //Переключение раздела
+ const handleSectionChange = useCallback(newValue => {
+ setTabValue(newValue);
+ }, []);
+
+ return [tabValue, handleSectionChange];
+};
+
+//Хук для функций открытия записей
+const useRecOpen = handleReload => {
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //Подключение к контексту приложения
+ const { pOnlineShowDictionary } = useContext(ApplicationСtx);
+
+ //Подключение к контексту сообщений
+ const { showMsgErr } = useContext(MessagingСtx);
+
+ //Отображение показателя раздела
+ const handleMarkOpen = useCallback(
+ async nRrpConfSctnMrk => {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODES",
+ args: {
+ NRN: nRrpConfSctnMrk
+ },
+ tagValueProcessor: () => undefined
+ });
+ if (data) {
+ pOnlineShowDictionary({
+ unitCode: "RRPConfig",
+ showMethod: "main_mrk_settings",
+ inputParameters: [
+ { name: "in_CODE", value: data.SRRPCONF },
+ { name: "in_SCTN_CODE", value: data.SRRPCONFSCTN },
+ { name: "in_MRK_CODE", value: data.SRRPCONFSCTNMRK }
+ ],
+ callBack: res => {
+ res.success ? handleReload() : null;
+ }
+ });
+ } else showMsgErr(TEXTS.NO_DATA_FOUND);
+ },
+ [executeStored, handleReload, pOnlineShowDictionary, showMsgErr]
+ );
+
+ //Отображение показателя раздела
+ const handleMarkCnOpen = useCallback(
+ async (nRrpConfSctnMrk, nRrpConfSctnMrkCn) => {
+ pOnlineShowDictionary({
+ unitCode: "RRPConfigSectionMark",
+ showMethod: "link_cn",
+ inputParameters: [
+ { name: "in_RN", value: nRrpConfSctnMrk },
+ { name: "in_RRPCONFSCTNMRKCN", value: nRrpConfSctnMrkCn }
+ ],
+ callBack: res => {
+ res.success ? handleReload() : null;
+ }
+ });
+ },
+ [handleReload, pOnlineShowDictionary]
+ );
+
+ //Отображение показателя раздела
+ const handleMarkCnInsert = useCallback(
+ async nRrpConfSctnMrk => {
+ pOnlineShowDictionary({
+ unitCode: "RRPConfigSectionMarkConstitution",
+ showMethod: "link_add",
+ inputParameters: [{ name: "in_PRN", value: nRrpConfSctnMrk }],
+ callBack: res => {
+ res.success ? handleReload() : null;
+ }
+ });
+ },
+ [handleReload, pOnlineShowDictionary]
+ );
+
+ return [handleMarkOpen, handleMarkCnOpen, handleMarkCnInsert];
+};
+
+//Хук для форм диалогового окна
+const useFormDialog = () => {
+ //Состояние открытия диалогового окна
+ const [formOpen, setForm] = useState(false);
+
+ //Состояние диалогового окна
+ const [formData, setFormData] = useState({
+ reload: false,
+ rn: "",
+ prn: "",
+ sctnName: "",
+ sctnCode: "",
+ status: "",
+ code: "",
+ name: "",
+ colCode: "",
+ colRn: null,
+ rowCode: "",
+ rowRn: null
+ });
+
+ //Подключение к контексту навигации
+ const { getNavigationSearch } = useContext(NavigationCtx);
+
+ //Открытие диалогового окна
+ const openForm = () => {
+ setForm(true);
+ };
+
+ //Очистка диалогового окна
+ const clearFormData = () => {
+ setFormData({
+ reload: false,
+ rn: "",
+ prn: "",
+ sctnName: "",
+ sctnCode: "",
+ status: "",
+ code: "",
+ name: "",
+ colCode: "",
+ colRn: null,
+ rowCode: "",
+ rowRn: null
+ });
+ };
+
+ //Отработка нажатия на кнопку добавления секции
+ const handleSectionAdd = () => {
+ setFormData({ status: STATUSES.CREATE, prn: Number(getNavigationSearch().NRN) });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку исправления секции
+ const handleSectionEdit = (rn, code, name) => {
+ setFormData({ rn: rn, code: code, name: name, status: STATUSES.EDIT });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку удаления секции
+ const handleSectionDelete = (rn, code, name) => {
+ setFormData({ rn: rn, code: code, name: name, status: STATUSES.DELETE });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку добавления показателя раздела
+ const handleMarkAdd = (prn, rowRn = null, rowCode = "", colRn = null, colCode = "") => {
+ setFormData({
+ reload: rowRn && colRn ? true : false,
+ prn: prn,
+ rowRn: rowRn,
+ rowCode: rowCode,
+ colRn: colRn,
+ colCode: colCode,
+ status: STATUSES.RRPCONFSCTNMRK_CREATE
+ });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку исправления показателя раздела
+ const handleMarkEdit = rn => {
+ setFormData({ reload: true, rn: rn, status: STATUSES.RRPCONFSCTNMRK_EDIT });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку удаления показателя раздела
+ const handleMarkDelete = rn => {
+ setFormData({ rn: rn, status: STATUSES.RRPCONFSCTNMRK_DELETE });
+ openForm();
+ };
+
+ //При закрытии диалога
+ const handleDialogClose = () => {
+ setForm(false);
+ clearFormData();
+ };
+
+ return [
+ formOpen,
+ formData,
+ handleSectionAdd,
+ handleSectionEdit,
+ handleSectionDelete,
+ handleMarkAdd,
+ handleMarkEdit,
+ handleMarkDelete,
+ handleDialogClose
+ ];
+};
+
+//Формирование разделов
+const a11yProps = index => {
+ return {
+ id: `simple-tab-${index}`,
+ "aria-controls": `simple-tabpanel-${index}`
+ };
+};
+
//----------------
//Интерфейс модуля
//----------------
-export { useWindowResize };
+export { useWindowResize, useConf, useTab, useRecOpen, useFormDialog, a11yProps };
diff --git a/app/panels/rrp_conf_editor/layouts.js b/app/panels/rrp_conf_editor/layouts.js
deleted file mode 100644
index aaf6f98..0000000
--- a/app/panels/rrp_conf_editor/layouts.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- Парус 8 - Панели мониторинга - РО - Редактор настройки регламентированного отчёта
- Дополнительная разметка и вёрстка клиентских элементов
-*/
-
-//---------------------
-//Подключение библиотек
-//---------------------
-
-import React from "react"; //Классы React
-import { Box, IconButton, Icon, Link } from "@mui/material"; //Интерфейсные компоненты
-
-//---------
-//Константы
-//---------
-
-//Стили
-export const STYLES = {
- BOX_ROW: { display: "flex", justifyContent: "center", alignItems: "center" },
- LINK_STYLE: { component: "button", cursor: "pointer", width: "-webkit-fill-available" }
-};
-
-//-----------
-//Тело модуля
-//-----------
-
-//Генерация представления ячейки c данными показателя раздела регламентированного отчета
-export const confSctnMrkCellRender = ({ row, columnDef, onLinkClick, onEditClick, onDeleteClick }) => {
- let data = row[columnDef.name];
- columnDef.name != "SROW_NAME" && data != undefined && columnDef.visible == true
- ? (data = (
-
- (onLinkClick ? onLinkClick(row["NRN_" + columnDef.name.substring(5)]) : null)}>
- {row[columnDef.name]}
-
- (onEditClick ? onEditClick(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name]) : null)}>
- edit
-
- (onDeleteClick ? onDeleteClick(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name]) : null)}>
- delete
-
-
- ))
- : null;
- return { data };
-};
diff --git a/app/panels/rrp_conf_editor/rrp_conf_editor.js b/app/panels/rrp_conf_editor/rrp_conf_editor.js
index ae089c7..b579b01 100644
--- a/app/panels/rrp_conf_editor/rrp_conf_editor.js
+++ b/app/panels/rrp_conf_editor/rrp_conf_editor.js
@@ -7,21 +7,11 @@
//Подключение библиотек
//---------------------
-import React, { useCallback, useContext, useState, useEffect } from "react"; //Классы React
-import { Box, Tab, Tabs, IconButton, Icon, Stack, Button } from "@mui/material"; //Интерфейсные компоненты
-import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
-import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
-import { ApplicationСtx } from "../../context/application"; //Контекст приложения
-import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
-import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
-import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
-import { SectionTabPanel } from "./section_tab_panel"; //Компонент вкладки раздела
-import { IUDFormDialog } from "./iud_form_dialog"; //Диалог добавления/исправления/удаления компонентов настройки регламентированного отчёта
-import { confSctnMrkCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
-import { STATUSES } from "./iud_form_dialog"; //Статусы диалогового окна
-import { TEXTS } from "../../../app.text"; //Текстовые константы
-import { STYLES as COMMON_STYLES } from "./layouts"; //Общие стили
-import { useWindowResize } from "./hooks"; //Пользовательские хуки
+import React, { useState, useEffect } from "react"; //Классы React
+import { Box, Tab, Tabs, IconButton, Icon, Stack } from "@mui/material"; //Интерфейсные компоненты
+import { IUDFormDialog } from "./IUD/iud_form_dialog"; //Диалог добавления/исправления/удаления компонентов настройки регламентированного отчёта
+import { useWindowResize, useTab, useConf, useRecOpen, useFormDialog, a11yProps } from "./hooks"; //Пользовательские хуки
+import { SectionTab } from "./components/rrp_section"; //Компонент раздела настройки
//---------
//Константы
@@ -36,20 +26,13 @@ const pxSectionAddButtonW = 40;
//Стили
const STYLES = {
- CONTAINER: { width: "100%" },
+ CONTAINER: { width: "100%", minHeight: `calc(100vh - ${pxPanelHeaderH})`, maxHeight: `calc(100vh - ${pxPanelHeaderH})` },
PANELS_MAIN_COLOR: { backgroundColor: "#1976d2" },
ICON_WHITE: { color: "white" },
TABS_BOTTOM_LINE: { borderBottom: 1, borderColor: "divider" },
TABS_PADDING: { padding: "5px" },
TABS_SIZES: (width, pxSectionAddButtonW) => ({ maxHeight: 150, maxWidth: width - pxSectionAddButtonW }),
- GRID_PADDING: { paddingTop: 1, paddingBottom: 1 },
- GRID_SIZES: (width, height, pxOuterMenuH, pxPanelHeaderH, pxTabsH) => ({
- padding: 0,
- minWidth: width * 0.95,
- minHeight: (height - pxOuterMenuH - pxPanelHeaderH - pxTabsH) * 0.88,
- maxWidth: width * 0.95,
- maxHeight: (height - pxOuterMenuH - pxPanelHeaderH - pxTabsH) * 0.88
- })
+ SECTION_ACTIONS: { display: "flex", justifyContent: "center", alignItems: "center" }
};
//-----------
@@ -58,257 +41,27 @@ const STYLES = {
//Редактор настройки регламентированного отчёта
const RrpConfEditor = () => {
- const dataGrid = {
- rn: 0,
- code: "",
- name: "",
- dataLoaded: false,
- columnsDef: [],
- groups: [],
- rows: [],
- fixedHeader: false,
- fixedColumns: 0,
- reload: false
- };
+ //Состояние вкладки
+ const [tabValue, handleSectionChange] = useTab("");
- //Собственное состояние
- const [rrpDoc, setRrpDoc] = useState({
- docLoaded: false,
- sections: [],
- reload: true
- });
+ //Состояние настройки
+ const [rrpConf, handleReload] = useConf(tabValue, handleSectionChange);
- //Состояние массива данных разделов
- const [dataGrids] = useState([]);
+ //Функции открытия разделов
+ const [handleMarkOpen, handleMarkCnOpen, handleMarkCnInsert] = useRecOpen(handleReload);
- //Состояние раздела
- const [tabValue, setTabValue] = useState("");
-
- //Состояние открытия диалогового окна
- const [formOpen, setForm] = useState(false);
-
- //Состояние диалогового окна
- const [formData, setFormData] = useState({
- rn: "",
- prn: "",
- sctnName: "",
- sctnCode: "",
- status: "",
- code: "",
- name: "",
- colName: "",
- colCode: "",
- colVCode: "",
- colVRn: 0,
- rowName: "",
- rowCode: "",
- rowVCode: "",
- rowVRn: 0
- });
-
- //Открытие диалогового окна
- const openForm = () => {
- setForm(true);
- };
-
- //Очистка диалогового окна
- const clearFormData = () => {
- setFormData({
- rn: "",
- prn: "",
- sctnName: "",
- sctnCode: "",
- status: "",
- code: "",
- name: "",
- colName: "",
- colCode: "",
- colVCode: "",
- colVRn: 0,
- rowName: "",
- rowCode: "",
- rowVCode: "",
- rowVRn: 0
- });
- };
-
- //Подключение к контексту взаимодействия с сервером
- const { executeStored } = useContext(BackEndСtx);
-
- //Подключение к контексту приложения
- const { pOnlineShowUnit } = useContext(ApplicationСtx);
-
- //Подключение к контексту навигации
- const { getNavigationSearch } = useContext(NavigationCtx);
-
- //Подключение к контексту сообщений
- const { showMsgErr } = useContext(MessagingСtx);
-
- //Переключение раздела
- const handleSectionChange = (event, newValue) => {
- setTabValue(newValue);
- };
-
- //Отработка нажатия на кнопку добавления секции
- const addSectionClick = () => {
- setFormData({ status: STATUSES.CREATE, prn: Number(getNavigationSearch().NRN) });
- openForm();
- };
-
- //Отработка нажатия на кнопку исправления секции
- const editSectionClick = (rn, code, name) => {
- setFormData({ rn: rn, code: code, name: name, status: STATUSES.EDIT });
- openForm();
- };
-
- //Отработка нажатия на кнопку удаления секции
- const deleteSectionClick = (rn, code, name) => {
- setFormData({ rn: rn, code: code, name: name, status: STATUSES.DELETE });
- openForm();
- };
-
- //Отработка нажатия на кнопку добавления показателя раздела
- const addSectionMarkClick = (prn, sctnCode, sctnName) => {
- setFormData({ status: STATUSES.RRPCONFSCTNMRK_CREATE, prn: prn, sctnCode: sctnCode, sctnName: sctnName });
- openForm();
- };
-
- //Отработка нажатия на кнопку исправления показателя раздела
- const editSectionMarkClick = (rn, name) => {
- setFormData({ status: STATUSES.RRPCONFSCTNMRK_EDIT, rn: rn, name: name });
- openForm();
- };
-
- //Отработка нажатия на кнопку удаления показателя раздела
- const deleteSectionMarkClick = (rn, name) => {
- setFormData({ status: STATUSES.RRPCONFSCTNMRK_DELETE, rn: rn, name: name });
- openForm();
- };
-
- //Отображение показателя раздела
- const showSectionMark = async rn => {
- const data = await executeStored({
- stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODES",
- args: {
- NRN: rn
- },
- tagValueProcessor: () => undefined
- });
- if (data) {
- pOnlineShowUnit({
- unitCode: "RRPConfig",
- showMethod: "main_mrk_settings",
- inputParameters: [
- { name: "in_CODE", value: data.SRRPCONF },
- { name: "in_SCTN_CODE", value: data.SRRPCONFSCTN },
- { name: "in_MRK_CODE", value: data.SRRPCONFSCTNMRK }
- ]
- });
- } else showMsgErr(TEXTS.NO_DATA_FOUND);
- };
-
- //Формирование разделов
- const a11yProps = index => {
- return {
- id: `simple-tab-${index}`,
- "aria-controls": `simple-tabpanel-${index}`
- };
- };
-
- //Загрузка данных разделов регламентированного отчёта
- const loadData = useCallback(async () => {
- if (rrpDoc.reload) {
- //Переменная номера раздела с фокусом
- let tabFocus = 0;
- const data = await executeStored({
- stored: "PKG_P8PANELS_RRPCONFED.RRPCONF_GET_SECTIONS",
- args: {
- NRN_RRPCONF: Number(getNavigationSearch().NRN)
- },
- respArg: "COUT"
- });
- //Флаг первой загрузки данных
- let firstLoad = dataGrids.length == 0 ? true : false;
- //Копирование массива уже загруженных разделов
- let cloneDGs = dataGrids.slice();
- //Массив из нескольких разделов и из одного
- const sections = data.SECTIONS ? (data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS]) : [];
- //Заполнение очередного раздела по шаблону
- sections.map(s => {
- let dg = {};
- Object.assign(dg, dataGrid, {
- rn: s.NRN,
- code: s.SCODE,
- name: s.SNAME,
- dataLoaded: true,
- columnsDef: [...(s.XDATA.XCOLUMNS_DEF || [])],
- groups: [...(s.XDATA.XGROUPS || [])],
- rows: [...(s.XDATA.XROWS || [])],
- fixedHeader: s.XDATA.XDATA_GRID.fixedHeader,
- fixedColumns: s.XDATA.XDATA_GRID.fixedColumns,
- reload: false
- });
- //Ищем загружен ли уже раздел с таким же ид.
- const dgItem = dataGrids.find(x => x.rn === dg.rn);
- //Его индекс, если нет соответствия, то -1
- let index = dataGrids.indexOf(dgItem);
- //Если было соответствие
- if (dgItem) {
- //Если в нём не найдено изменений
- if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) {
- //То из копированного массива его удаляем
- cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1);
- } else {
- //Иначе обновляем раздел в массиве
- dataGrids[index] = dg;
- //Удаляем из копированного массива
- cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1);
- //Устанавливаем фокус на обновлённый раздел
- tabFocus = index;
- }
- } else {
- //Если раздел новый, то добавляем его в массив данных
- dataGrids.push(dg);
- //И устанавливаем на него фокус, если флаг первой загрузки = false
- tabFocus = !firstLoad ? dataGrids.length - 1 : 0;
- }
- });
- //Обходим разделы, что остались в копированном массиве (на удаление)
- cloneDGs.map(s => {
- let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));
- //Устаревший раздел удаляем из массива данных
- dataGrids.splice(curIndex, 1);
- //Фокус на предшествующий раздел
- if (curIndex > 0) tabFocus = curIndex - 1;
- //Иначе фокус на следующий, если был удалён первый раздел
- else tabFocus = curIndex;
- });
- setRrpDoc(pv => ({
- ...pv,
- docLoaded: true,
- reload: false,
- sections: dataGrids
- }));
- setTabValue(tabFocus);
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [rrpDoc.reload, rrpDoc.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]);
-
- //При необходимости обновить данные таблицы
- useEffect(() => {
- loadData();
- }, [rrpDoc.reload, dataGrid.reload, loadData]);
-
- //При изменениях элемента
- const handleDialogReload = () => {
- setRrpDoc(pv => ({ ...pv, reload: true }));
- };
-
- //При закрытии диалога
- const handleDialogClose = () => {
- setForm(false);
- clearFormData();
- };
+ //Состояние форм диалога
+ const [
+ formOpen,
+ formData,
+ handleSectionAdd,
+ handleSectionEdit,
+ handleSectionDelete,
+ handleMarkAdd,
+ handleMarkEdit,
+ handleMarkDelete,
+ handleDialogClose
+ ] = useFormDialog();
//Состояние ширины и высоты рабочей области окна
const [width, height] = useWindowResize();
@@ -318,39 +71,49 @@ const RrpConfEditor = () => {
//При рендере данных
useEffect(() => {
- rrpDoc.docLoaded ? setPxTabsH(document.getElementById("sectionTabs").offsetHeight) : null;
- }, [rrpDoc.docLoaded]);
+ rrpConf.docLoaded ? setPxTabsH(document.getElementById("sectionTabs").offsetHeight) : null;
+ }, [rrpConf.docLoaded]);
+
+ //Формируем меню показателей
+ const markMenuItems = [
+ { method: "EDIT", name: "Исправить", icon: "edit", func: handleMarkEdit },
+ { method: "DELETE", name: "Удалить", icon: "delete", func: handleMarkDelete }
+ ];
//Генерация содержимого
return (
- {formOpen ? : null}
- {rrpDoc.docLoaded ? (
+ {formOpen ? : null}
+ {rrpConf.docLoaded ? (
handleSectionChange(newValue)}
variant="scrollable"
scrollButtons={false}
visibleScrollbar
aria-label="section tab"
sx={STYLES.TABS_SIZES(width, pxSectionAddButtonW)}
>
- {rrpDoc.sections.map((s, i) => {
+ {rrpConf.sections.map((s, i) => {
return (
+
{s.name}
- editSectionClick(s.rn, s.code, s.name)}>
+ handleSectionEdit(s.rn, s.code, s.name)}>
edit
- deleteSectionClick(s.rn, s.code, s.name)}>
+ handleSectionDelete(s.rn, s.code, s.name)}
+ >
delete
@@ -361,42 +124,26 @@ const RrpConfEditor = () => {
})}
-
+
add
- {rrpDoc.sections.map((s, i) => {
+ {rrpConf.sections.map((s, i) => {
return (
-
-
- {s.dataLoaded && s.columnsDef.length > 1 ? (
-
-
- confSctnMrkCellRender({
- ...prms,
- onLinkClick: showSectionMark,
- onEditClick: editSectionMarkClick,
- onDeleteClick: deleteSectionMarkClick
- })
- }
- />
-
- ) : null}
-
+
);
})}
diff --git a/db/PKG_P8PANELS_RRPCONFED.pck b/db/PKG_P8PANELS_RRPCONFED.pck
index 9d45636..e531efb 100644
--- a/db/PKG_P8PANELS_RRPCONFED.pck
+++ b/db/PKG_P8PANELS_RRPCONFED.pck
@@ -41,26 +41,29 @@ create or replace package PKG_P8PANELS_RRPCONFED as
/* Формирование кода и наименования показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_GET_CODE_NAME
- (
- SSCTNCODE in varchar2, -- Мнемокод раздела
- SROWCODE in varchar2, -- Мнемокод строки
- NROWVER in number, -- Ид. редакции строки
- SCOLUMNCODE in varchar2, -- Мнемокод графы
- NCOLUMNVER in number, -- Ид. редакции графы
+ (
+ NRRPCONFSCTN in number, -- Рег. номер раздела
+ NRRPROW in number, -- Рег. номер строки
+ NRRPCOLUMN in number, -- Рег. номер графы
SCODE out varchar2, -- Мнемокод показателя раздела
SNAME out varchar2 -- Наименование показателя раздела
);
+ /* Формирование кода и наименования показателя раздела регламентированного отчёта */
+ procedure RRPCONFSCTNMRK_GET_NAME
+ (
+ NRRPCONFSCTNMRK in number, -- Рег. номер показателя
+ SNAME out varchar2 -- Наименование показателя раздела
+ );
+
/* Добавление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_INSERT
(
NPRN in number, -- Ид. раздела
SCODE in varchar2, -- Мнемокод показателя раздела
SNAME in varchar2, -- Наименование показателя раздела
- SCOLCODE in varchar2, -- Мнемокод графы
- SCOLVER in varchar2, -- Мнемокод редакции графы
- SROWCODE in varchar2, -- Мнемокод строки
- SROWVER in varchar2, -- Мнемокод редакции строки
+ NRRPROW in number, -- Рег. номер строки
+ NRRPCOLUMN in number, -- Рег. номер графы
NRN out number -- Ид. созданной записи
);
@@ -81,134 +84,913 @@ end PKG_P8PANELS_RRPCONFED;
/
create or replace package body PKG_P8PANELS_RRPCONFED as
+ /* Маски для формирования представления параметров состава показателя */
+ SPRM_MASK_ACC_DC constant PKG_STD.TSTRING := 'ДЕБЕТ_КРЕДИТ'; -- Маска для параметров "Счет дебет" и "Счет кредит"
+ SPRM_MASK_ACC constant PKG_STD.TSTRING := 'СЧЕТ'; -- Маска для параметров "Счет"
+ SPRM_MASK_ACC_WO_ANL constant PKG_STD.TSTRING := 'СЧЕТ_БЕЗ_АНЛ'; -- Маска для параметров "Счет" без учета аналитик
+ SPRM_MASK_DATE_FROM constant PKG_STD.TSTRING := 'ДАТА_С'; -- Маска для параметров "Дата с"
+ SPRM_MASK_DATE_TO constant PKG_STD.TSTRING := 'ДАТА_ПО'; -- Маска для параметров "Дата по"
+ SPRM_MASK_RRPCONF constant PKG_STD.TSTRING := 'НАСТРОЙКА'; -- Маска для параметров настройки РО
+
+ /* Константы - мнемокоды разделов */
+ SUNIT_RRPCONFSCTN constant PKG_STD.TSTRING := 'RRPConfigSection'; -- Раздел настройки регламентированного отчета
+ SUNIT_RRPCONFSCTNMRK constant PKG_STD.TSTRING := 'RRPConfigSectionMark'; -- Показатель раздела настройки регламентированного отчета
+
+ /* Константы - действия разделов */
+ SACTION_DELETE constant PKG_STD.TSTRING := 'DELETE'; -- Удаление
+
+ /* Получение доступности действия раздела */
+ function UTL_UNIT_ACTION_GET_ALLOW
+ (
+ SUNIT in varchar2, -- Мнемокод раздела (см. константы SUNIT_*)
+ SACTION in varchar2, -- Действие (см. константы SACTION_*)
+ NRN in number -- Рег. номер записи
+ ) return number -- Доступность действия (0 - недоступно, 1 - доступно)
+ is
+ NRESULT PKG_STD.TNUMBER; -- Доступность действия (0 - недоступно, 1 - доступно)
+ begin
+ /* Исходим отраздела */
+ case SUNIT
+ /* Раздел настройки регламентированного отчета */
+ when SUNIT_RRPCONFSCTN then
+ /* Исходим от действия */
+ case SACTION
+ /* Удаление */
+ when SACTION_DELETE then
+ /* Если раздел есть в сформированном отчете/параметре отчета/имеет дочерний раздел - удаление невозможно */
+ begin
+ select 0
+ into NRESULT
+ from DUAL
+ where exists (select null from RRPDOC_STORAGE_SCTN S where S.RRPCONFSCTN = NRN)
+ or exists (select null from RRPDOCPRM P where P.RRPCONFSCTN = NRN)
+ or exists (select null from RRPCONFSCTN C where C.RRPCONFSCTN = NRN);
+ exception
+ /* Если таких записей нет - удаление возможно */
+ when NO_DATA_FOUND then
+ NRESULT := 1;
+ /* Если необработанная ошибка - удаление невозможно */
+ when others then
+ NRESULT := 0;
+ end;
+ /* Действие неопределено */
+ else
+ NRESULT := 1;
+ end case;
+ /* Показатель раздела настройки регламентированного отчета */
+ when SUNIT_RRPCONFSCTNMRK then
+ /* Исходим от действия */
+ case SACTION
+ /* Удаление */
+ when SACTION_DELETE then
+ /* Если показатель есть в сформированном отчете - удаление невозможно */
+ begin
+ select 0
+ into NRESULT
+ from DUAL
+ where exists (select null from RRPDOC_STORAGE_MRK M where M.RRPCONFSCTNMRK = NRN);
+ exception
+ /* Если таких записей нет - удаление возможно */
+ when NO_DATA_FOUND then
+ NRESULT := 1;
+ /* Если необработанная ошибка - удаление невозможно */
+ when others then
+ NRESULT := 0;
+ end;
+ else
+ NRESULT := 1;
+ end case;
+ /* Раздел неопределен */
+ else
+ NRESULT := 1;
+ end case;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_UNIT_ACTION_GET_ALLOW;
+
+ /* Формирование описателя состава показателя регламентированного отчета */
+ function UTL_RRPCONFSCTNMRKCN_GET_DESC
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NRRPCONFSCTNMRKCN in number -- Рег. номер состава показателя регламентированного отчета
+ ) return varchar2 -- Описатель показателя
+ is
+ SRESULT PKG_STD.TSTRING; -- Описатель показателя
+ SCN_DESC PKG_STD.TSTRING; -- Основные параметры состава показателя
+ RREC RRPCONFSCTNMRKCN%rowtype; -- Запись состава показателя регламентированного отчета
+ RRRPCONFSCTNMRK RRPCONFSCTNMRK%rowtype; -- Запись показателя регламентированного отчета
+
+ /* Считывание мнемокода показателя по рег. номеру состава показателя */
+ function UTL_MARK_GET_CODE_BY_CN
+ (
+ NRRPCONFSCTNMRKCN in number -- Рег. номер состава показателя
+ ) return varchar2 -- Мнемокод показателя
+ is
+ SRESULT PKG_STD.TSTRING; -- Мнемокод показателя
+ begin
+ /* Считываем мнемокод показателя */
+ begin
+ select M.CODE
+ into SRESULT
+ from RRPCONFSCTNMRKCN T,
+ RRPCONFSCTNMRK M
+ where T.RN = NRRPCONFSCTNMRKCN
+ and M.RN = T.PRN;
+ exception
+ when others then
+ SRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return SRESULT;
+ end UTL_MARK_GET_CODE_BY_CN;
+
+ /* Считывание мнемокода настройки по рег. номеру состава показателя */
+ function UTL_CONF_GET_CODE_BY_CN
+ (
+ NRRPCONFSCTNMRKCN in number -- Рег. номер состава показателя
+ ) return varchar2 -- Мнемокод настройки регламентированного отчета
+ is
+ SRESULT PKG_STD.TSTRING; -- Мнемокод настройки регламентированного отчета
+ begin
+ /* Считываем мнемокод настройки регламентированного отчета */
+ begin
+ select C.CODE
+ into SRESULT
+ from RRPCONFSCTNMRKCN T,
+ RRPCONFSCTNMRK M,
+ RRPCONF C
+ where T.RN = NRRPCONFSCTNMRKCN
+ and M.RN = T.PRN
+ and C.RN = M.RRPCONF;
+ exception
+ when others then
+ SRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return SRESULT;
+ end UTL_CONF_GET_CODE_BY_CN;
+
+ /* Формирование представления параметров состава показателя */
+ procedure MAKE_PRMS_BY_MASK
+ (
+ SPRMS_DESC in out varchar2, -- Строковое представление параметров
+ NCOMPANY in number, -- Рег. номер организации
+ NRRPCONFSCTNMRKCN in number, -- Рег. номер состава показателя
+ SMASK in varchar2 -- Маска (см. константы SPRM_MASK_*)
+ )
+ is
+ SDATE_FROM PKG_STD.TSTRING; -- Строковое представление "Дата с"
+ SDATE_TO PKG_STD.TSTRING; -- Строковое представление "Дата по"
+ DDATE_FROM PKG_STD.TLDATE; -- ДАТА_С
+ SDATE_FROM_PATTERN PKG_STD.TSTRING; -- ДАТА_С_ШАБЛОН
+ DDATE_TO PKG_STD.TLDATE; -- ДАТА_ПО
+ SDATE_TO_PATTERN PKG_STD.TSTRING; -- ДАТА_ПО_ШАБЛОН
+ SACCOUNT_DEBIT PKG_STD.TSTRING; -- СЧЕТ_ДЕБЕТ
+ SANALYTIC_DEBIT1 PKG_STD.TSTRING; -- АНАЛИТИКА1_ДЕБЕТ
+ SANALYTIC_DEBIT2 PKG_STD.TSTRING; -- АНАЛИТИКА2_ДЕБЕТ
+ SANALYTIC_DEBIT3 PKG_STD.TSTRING; -- АНАЛИТИКА3_ДЕБЕТ
+ SANALYTIC_DEBIT4 PKG_STD.TSTRING; -- АНАЛИТИКА4_ДЕБЕТ
+ SANALYTIC_DEBIT5 PKG_STD.TSTRING; -- АНАЛИТИКА5_ДЕБЕТ
+ SACCOUNT_CREDIT PKG_STD.TSTRING; -- СЧЕТ_КРЕДИТ
+ SANALYTIC_CREDIT1 PKG_STD.TSTRING; -- АНАЛИТИКА1_КРЕДИТ
+ SANALYTIC_CREDIT2 PKG_STD.TSTRING; -- АНАЛИТИКА2_КРЕДИТ
+ SANALYTIC_CREDIT3 PKG_STD.TSTRING; -- АНАЛИТИКА3_КРЕДИТ
+ SANALYTIC_CREDIT4 PKG_STD.TSTRING; -- АНАЛИТИКА4_КРЕДИТ
+ SANALYTIC_CREDIT5 PKG_STD.TSTRING; -- АНАЛИТИКА5_КРЕДИТ
+ SACCOUNT PKG_STD.TSTRING; -- СЧЕТ
+ SANALYTIC1 PKG_STD.TSTRING; -- АНАЛИТИКА1
+ SANALYTIC2 PKG_STD.TSTRING; -- АНАЛИТИКА2
+ SANALYTIC3 PKG_STD.TSTRING; -- АНАЛИТИКА3
+ SANALYTIC4 PKG_STD.TSTRING; -- АНАЛИТИКА4
+ SANALYTIC5 PKG_STD.TSTRING; -- АНАЛИТИКА5
+ SRRPCONF PKG_STD.TSTRING; -- НАСТРОЙКА
+ NRRPCONF_RD PKG_STD.TNUMBER; -- НАСТРОЙКА_ТЕК
+ SMARK_CODE PKG_STD.TSTRING; -- ПОКАЗАТЕЛЬ
+ NMARK_CODE_RD PKG_STD.TNUMBER; -- ПОКАЗАТЕЛЬ_ТЕК
+ SMARK_ROW_CODE PKG_STD.TSTRING; -- СТРОКА_ПОКАЗАТЕЛЯ
+ SMARK_COL_CODE PKG_STD.TSTRING; -- ГРАФА_ПОКАЗАТЕЛЯ
+ begin
+ /* Получаем представление параметров исходя из маски */
+ case SMASK
+ /* "Счет дебет" и "Счет кредит" */
+ when SPRM_MASK_ACC_DC then
+ /* Считывание значения - Счет дебет */
+ SACCOUNT_DEBIT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SACCOUNT_DEBIT_P);
+ /* Считывание значения - Аналитический счет 1 дебет */
+ SANALYTIC_DEBIT1 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT1_P);
+ /* Считывание значения - Аналитический счет 2 дебет */
+ SANALYTIC_DEBIT2 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT2_P);
+ /* Считывание значения - Аналитический счет 3 дебет */
+ SANALYTIC_DEBIT3 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT3_P);
+ /* Считывание значения - Аналитический счет 4 дебет */
+ SANALYTIC_DEBIT4 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT4_P);
+ /* Считывание значения - Аналитический счет 5 дебет */
+ SANALYTIC_DEBIT5 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_DEBIT5_P);
+ /* Считывание значения - Счет кредит */
+ SACCOUNT_CREDIT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SACCOUNT_CREDIT_P);
+ /* Считывание значения - Аналитический счет 1 кредит */
+ SANALYTIC_CREDIT1 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT1_P);
+ /* Считывание значения - Аналитический счет 2 кредит */
+ SANALYTIC_CREDIT2 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT2_P);
+ /* Считывание значения - Аналитический счет 3 кредит */
+ SANALYTIC_CREDIT3 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT3_P);
+ /* Считывание значения - Аналитический счет 4 кредит */
+ SANALYTIC_CREDIT4 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT4_P);
+ /* Считывание значения - Аналитический счет 5 кредит */
+ SANALYTIC_CREDIT5 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC_CREDIT5_P);
+ /* Если указан счет дебет */
+ if ((SACCOUNT_DEBIT is not null) or (SANALYTIC_DEBIT1 is not null) or (SANALYTIC_DEBIT2 is not null) or
+ (SANALYTIC_DEBIT3 is not null) or (SANALYTIC_DEBIT4 is not null) or (SANALYTIC_DEBIT5 is not null)) then
+ /* Добавляем */
+ SPRMS_DESC := SPRMS_DESC || 'Д:' || SACCOUNT_DEBIT || '';
+ /* Добавляем информацию об аналитиках */
+ SPRMS_DESC := SPRMS_DESC || '(' || SANALYTIC_DEBIT1 || ',' || SANALYTIC_DEBIT2 || ',' || SANALYTIC_DEBIT3 || ',' ||
+ SANALYTIC_DEBIT4 || ',' || SANALYTIC_DEBIT5 || '),';
+ end if;
+ /* Если указан счет кредит */
+ if ((SACCOUNT_CREDIT is not null) or (SANALYTIC_CREDIT1 is not null) or (SANALYTIC_CREDIT2 is not null) or
+ (SANALYTIC_CREDIT3 is not null) or (SANALYTIC_CREDIT4 is not null) or (SANALYTIC_CREDIT5 is not null)) then
+ /* Добавляем */
+ SPRMS_DESC := SPRMS_DESC || 'К:' || SACCOUNT_CREDIT || ',';
+ /* Добавляем информацию об аналитиках */
+ SPRMS_DESC := SPRMS_DESC || '(' || SANALYTIC_CREDIT1 || ',' || SANALYTIC_CREDIT2 || ',' ||
+ SANALYTIC_CREDIT3 || ',' || SANALYTIC_CREDIT4 || ',' || SANALYTIC_CREDIT5 || '),';
+ end if;
+ /* "Счет" */
+ when SPRM_MASK_ACC then
+ /* Считывание значения - Счет */
+ SACCOUNT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SACCOUNT_P);
+ /* Считывание значения - Аналитический счет 1 */
+ SANALYTIC1 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC1_P);
+ /* Считывание значения - Аналитический счет 2 */
+ SANALYTIC2 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC2_P);
+ /* Считывание значения - Аналитический счет 3 */
+ SANALYTIC3 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC3_P);
+ /* Считывание значения - Аналитический счет 4 */
+ SANALYTIC4 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC4_P);
+ /* Считывание значения - Аналитический счет 5 */
+ SANALYTIC5 := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SANALYTIC5_P);
+ /* Если указан счет */
+ if ((SACCOUNT is not null) or (SANALYTIC1 is not null) or (SANALYTIC2 is not null) or
+ (SANALYTIC3 is not null) or (SANALYTIC4 is not null) or (SANALYTIC5 is not null)) then
+ /* Добавляем */
+ SPRMS_DESC := SPRMS_DESC || 'С:' || SACCOUNT || '';
+ /* Добавляем информацию об аналитиках */
+ SPRMS_DESC := SPRMS_DESC || '(' || SANALYTIC1 || ',' || SANALYTIC2 || ',' || SANALYTIC3 || ',' ||
+ SANALYTIC4 || ',' || SANALYTIC5 || '),';
+ end if;
+ /* "Счет" без аналитик */
+ when SPRM_MASK_ACC_WO_ANL then
+ /* Считывание значения - Счет */
+ SACCOUNT := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SACCOUNT_P);
+ /* Если счет не пустой */
+ if (SACCOUNT is not null) then
+ /* Добавляем информацию по счету */
+ SPRMS_DESC := SPRMS_DESC || 'С:' || SACCOUNT || ',';
+ end if;
+ /* "Дата с" */
+ when SPRM_MASK_DATE_FROM then
+ /* Считывание значения - Дата с */
+ DDATE_FROM := PKG_RRPCONFSCTNMRKCN.PARAM_GET_DATE_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SDATE_FROM_P);
+ /* Считывание значения - Дата с (шаблон) */
+ SDATE_FROM_PATTERN := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SDATE_FROM_PATTERN_P);
+ /* Определяем "Дата с" */
+ SDATE_FROM := COALESCE(TO_CHAR(DDATE_FROM, 'dd.mm.yyyy'), SDATE_FROM_PATTERN);
+ /* Если указана дата с */
+ if (SDATE_FROM is not null) then
+ /* Добавляем дату с */
+ SPRMS_DESC := SPRMS_DESC || 'ДС:' || SDATE_FROM || ',';
+ end if;
+ /* "Дата по" */
+ when SPRM_MASK_DATE_TO then
+ /* Считывание значения - Дата по */
+ DDATE_TO := PKG_RRPCONFSCTNMRKCN.PARAM_GET_DATE_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SDATE_TO_P);
+ /* Считывание значения - Дата по (шаблон) */
+ SDATE_TO_PATTERN := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SDATE_TO_PATTERN_P);
+ /* пределяем "Дата по" */
+ SDATE_TO := COALESCE(TO_CHAR(DDATE_TO, 'dd.mm.yyyy'), SDATE_TO_PATTERN);
+ /* Если указана дата по */
+ if (SDATE_TO is not null) then
+ /* Добавляем дату по */
+ SPRMS_DESC := SPRMS_DESC || 'ДП:' || SDATE_TO || ',';
+ end if;
+ /* Параметры настройки РО */
+ when SPRM_MASK_RRPCONF then
+ /* Считывание значения - Настройка регламентированного отчета */
+ SRRPCONF := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SRRPCONF_P);
+ /* Считывание значения - Настройка регламентированного отчета (текущее) */
+ NRRPCONF_RD := PKG_RRPCONFSCTNMRKCN.PARAM_GET_NUM_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SRRPCONF_RD_P);
+ /* Если указана текущая настройка */
+ if (NRRPCONF_RD = 1) then
+ /* Считываем мнемокод текущей настройки */
+ SRRPCONF := UTL_CONF_GET_CODE_BY_CN(NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN);
+ end if;
+ /* Считывание значения - Мнемокод показателя */
+ SMARK_CODE := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SMARK_CODE_P);
+ /* Считывание значения - Мнемокод показателя (текущее) */
+ NMARK_CODE_RD := PKG_RRPCONFSCTNMRKCN.PARAM_GET_NUM_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SMARK_CODE_RD_P);
+ /* Если указан текущий показатель */
+ if (NMARK_CODE_RD = 1) then
+ /* Считываем мнемокод текущей настройки */
+ SMARK_CODE := UTL_MARK_GET_CODE_BY_CN(NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN);
+ end if;
+ /* Считывание значения - Мнемокод строки показателя */
+ SMARK_ROW_CODE := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SMARK_ROW_CODE_P);
+ /* Считывание значения - Мнемокод графы показателя */
+ SMARK_COL_CODE := PKG_RRPCONFSCTNMRKCN.PARAM_GET_STR_VALUE(NCOMPANY => NCOMPANY,
+ NPRN => NRRPCONFSCTNMRKCN,
+ SPARAM => PKG_RRPCONFSCTNMRKCN.SMARK_COL_CODE_P);
+ /* Если настройка указана */
+ if (SRRPCONF is not null) then
+ /* Добавляем */
+ SPRMS_DESC := SPRMS_DESC || 'Н:' || SRRPCONF || ',';
+ end if;
+ /* Если мнемокод показателя указан */
+ if (SMARK_CODE is not null) then
+ /* Добавляем */
+ SPRMS_DESC := SPRMS_DESC || 'П:' || SRRPCONF || ',';
+ end if;
+ /* Если строка показателя указана */
+ if (SMARK_ROW_CODE is not null) then
+ /* Добавляем */
+ SPRMS_DESC := SPRMS_DESC || 'СТР:' || SMARK_ROW_CODE || ',';
+ end if;
+ /* Если графа показателя указана */
+ if (SMARK_COL_CODE is not null) then
+ /* Добавляем */
+ SPRMS_DESC := SPRMS_DESC || 'ГРФ:' || SMARK_COL_CODE || ',';
+ end if;
+ else
+ /* Незвестная маска */
+ null;
+ end case;
+ end MAKE_PRMS_BY_MASK;
+
+ /* Формирование строки основных параметров для учетного раздела состава показателя */
+ function SOURCE_UNIT_GET_PRMS
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NRRPCONFSCTNMRKCN in number, -- Рег. номер состава показателя регламентированного отчета
+ SSOURCE_UNIT in varchar2 -- Учетный раздел
+ ) return varchar2 -- Строковое представление основных параметров учетного раздела
+ is
+ SRESULT PKG_STD.TSTRING; -- Строковое представление основных параметров учетного раздела
+ begin
+ /* Открываем параметры */
+ SRESULT := '(';
+ /* Собираем параметры исходя из раздела */
+ case SSOURCE_UNIT
+ /* Хозяйственные операции */
+ when 'EconomicOperations' then
+ /* Получаем информацию по "Счет дебет" и "Счет кредит" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC_DC);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Добавляем информацию по "Дата по" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_TO);
+ /* Расчёты с дебиторами/кредиторами */
+ when 'DebitorsCreditorsAccounts' then
+ /* Получаем информацию по "Счет" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Добавляем информацию по "Дата по" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_TO);
+ /* Остатки средств по счетам */
+ when 'AccountsRemnants' then
+ /* Получаем информацию по "Счет" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Остатки товарно-материальных ценностей */
+ when 'ValuesRemnants' then
+ /* Получаем информацию по "Счет" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Дебиторская/кредиторская задолженность */
+ when 'DebitorsCreditorsRemnants' then
+ /* Получаем информацию по "Счет" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Добавляем информацию по "Дата по" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_TO);
+ /* Инвентарная картотека */
+ when 'Inventory' then
+ /* Получаем информацию по "Счет" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Добавляем информацию по "Дата по" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_TO);
+ /* Картотека МБП */
+ when 'ItemsCards' then
+ /* Получаем информацию по "Счет" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC_WO_ANL);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Картотека операций будущих периодов */
+ when 'OperCards' then
+ /* Получаем информацию по "Счет" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_ACC);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Добавляем информацию по "Дата по" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_TO);
+ /* Регламентированный отчет */
+ when 'RRPDocuments' then
+ /* Добавляем информацию по настройке */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_RRPCONF);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Добавляем информацию по "Дата по" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_TO);
+ /* Декларация по налогу на прибыль */
+ when 'DeclarationIncome' then
+ /* Добавляем информацию по настройке */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_RRPCONF);
+ /* Добавляем информацию по "Дата с" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_FROM);
+ /* Добавляем информацию по "Дата по" */
+ MAKE_PRMS_BY_MASK(SPRMS_DESC => SRESULT,
+ NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => NRRPCONFSCTNMRKCN,
+ SMASK => SPRM_MASK_DATE_TO);
+ /* Неизвестный раздел */
+ else
+ SRESULT := null;
+ end case;
+ /* Убираем лишний знак */
+ SRESULT := RTRIM(SRESULT, ',');
+ /* Закрываем параметры */
+ SRESULT := SRESULT || ')';
+ /* Возвращаем результат */
+ return SRESULT;
+ end SOURCE_UNIT_GET_PRMS;
+
+ /* Считывание типа источинка состава показателя в текстовом представлении */
+ function RRPCONFSCTNMRKCN_GET_ST
+ (
+ NSOURCE_TYPE in number, -- Тип источника
+ SSOURCE_UNIT in varchar2 -- Раздел источника
+ ) return varchar2 -- Тип источника в текстовом представлении
+ is
+ SRESULT PKG_STD.TSTRING; -- Тип источника в текстовом представлении
+ begin
+ /* Строковое представление источника значения */
+ case NSOURCE_TYPE
+ when 0 then
+ /* Исходим от раздела */
+ case SSOURCE_UNIT
+ when 'EconomicOperations' then
+ SRESULT := 'ХО';
+ when 'DebitorsCreditorsAccounts' then
+ SRESULT := 'РСДК';
+ when 'AccountsRemnants' then
+ SRESULT := 'ОС';
+ when 'ValuesRemnants' then
+ SRESULT := 'ТМЦ';
+ when 'DebitorsCreditorsRemnants' then
+ SRESULT := 'ДКЗ';
+ when 'Inventory' then
+ SRESULT := 'ИК';
+ when 'ItemsCards' then
+ SRESULT := 'МБП';
+ when 'OperCards' then
+ SRESULT := 'КОБП';
+ when 'DeclarationIncome' then
+ SRESULT := 'ДПНП';
+ when 'RRPDocuments' then
+ SRESULT := 'РО';
+ else
+ SRESULT := null;
+ end case;
+ when 1 then
+ SRESULT := 'РП';
+ when 2 then
+ SRESULT := 'ХП';
+ when 3 then
+ SRESULT := 'СЗ';
+ when 4 then
+ SRESULT := 'fx';
+ else
+ SRESULT := null;
+ end case;
+ /* Возвращаем результат */
+ return SRESULT;
+ end RRPCONFSCTNMRKCN_GET_ST;
+
+ /* Считывание знака состава показателя в текстовом представлении */
+ function RRPCONFSCTNMRKCN_GET_SIGN
+ (
+ NSIGN in number -- Знак состава показателя
+ ) return varchar2 -- Знак состава показателя в текстовом представлении
+ is
+ SRESULT PKG_STD.TSTRING; -- Знак состава показателя в текстовом представлении
+ begin
+ /* Опеределяем знак */
+ case NSIGN
+ when 0 then
+ SRESULT := '+';
+ when 1 then
+ SRESULT := '-';
+ else
+ SRESULT := '+/-';
+ end case;
+ /* Возвращаем результат */
+ return SRESULT;
+ end RRPCONFSCTNMRKCN_GET_SIGN;
+ begin
+ /* Считывание записи состава показателя регламентированного отчета */
+ RREC := GET_RRPCONFSCTNMRKCN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPCONFSCTNMRKCN);
+ /* Формируем представление состава показателя в виде формулы */
+ case RREC.SOURCE_TYPE
+ /* Учетный раздел */
+ when 0 then
+ /* Собираем представление из параметров составов */
+ SCN_DESC := SOURCE_UNIT_GET_PRMS(NCOMPANY => NCOMPANY,
+ NRRPCONFSCTNMRKCN => RREC.RN,
+ SSOURCE_UNIT => RREC.SOURCE_UNIT);
+ /* Расчетный показатель */
+ when 1 then
+ /* Считываем запись расчетного показателя */
+ RRRPCONFSCTNMRK := GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RREC.RRPCONFSCTNMRK);
+ /* Указываем мнемокод показателя */
+ SCN_DESC := '(' || RRRPCONFSCTNMRK.CODE || ')';
+ /* Хранимая процедура */
+ when 2 then
+ /* Формируем из пакета и процедуры */
+ SCN_DESC := '(' || PKG_OBJECT_DESC.STORED_NAME(SPACKAGE_NAME => RREC.PKG, SSTORED_NAME => RREC.PRC) || ')';
+ /* Статическое значение */
+ when 3 then
+ /* Указываем статическое значение */
+ SCN_DESC := '(' || COALESCE(RREC.STATIC_STR,
+ COALESCE(TO_CHAR(RREC.STATIC_NUM), TO_CHAR(RREC.STATIC_DATE, 'dd.mm.yyyy'))) || ')';
+ /* Формула */
+ when 4 then
+ /* Указываем формулу */
+ SCN_DESC := '(' || RREC.FORMULA || ')';
+ else
+ SCN_DESC := null;
+ end case;
+ /* Формируем описатель */
+ SRESULT := RRPCONFSCTNMRKCN_GET_SIGN(NSIGN => RREC.SIGN) || ' ' ||
+ RRPCONFSCTNMRKCN_GET_ST(NSOURCE_TYPE => RREC.SOURCE_TYPE, SSOURCE_UNIT => RREC.SOURCE_UNIT) || SCN_DESC;
+ /* Возвращаем результат */
+ return SRESULT;
+ end UTL_RRPCONFSCTNMRKCN_GET_DESC;
+
/* Получение разделов регламентированного отчёта */
procedure RRPCONF_GET_SECTIONS
(
- NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта
- COUT out clob -- Список разделов
+ NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта
+ COUT out clob -- Список разделов
)
is
- NVERSION PKG_STD.TREF; -- Рег. номер версии словаря контрагентов
- RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
- RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
- CDG clob; -- XML данных раздела
- CCURCLOB clob; -- XML текущего раздела
- NCURRN PKG_STD.TREF; -- Ид. текущего раздела
- SCURCODE PKG_STD.TSTRING; -- Мнемокод текущего раздела
- SCURNAME PKG_STD.TSTRING; -- Наименование текущего раздела
- SCUR_ROW PKG_STD.TSTRING := 'default'; -- Текущая строка таблицы
- CXML PKG_CONTVALLOC2NS.TCONTAINER; -- Контейнер для данных XML
+ NVERSION PKG_STD.TREF; -- Рег. номер версии словаря контрагентов
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ CDG clob; -- XML данных раздела
+ CXML PKG_CONTVALLOC2NS.TCONTAINER; -- Контейнер для данных XML
+ RRRPCONFSCTNMRK RRPCONFSCTNMRK%rowtype; -- Рег. номер показателя
+ NCURRENT_SECTION PKG_STD.TNUMBER; -- Идентификатор раздела настройки в контейнере
+ NSECTION_RN PKG_STD.TREF; -- Рег. номер раздел настройки
+ SSECTION_CODE PKG_STD.TSTRING; -- Мнемокод раздела настройки
+ SSECTION_NAME PKG_STD.TSTRING; -- Наименование раздела настройки
+ CSECTION_CLOB clob; -- Данные по разделу настройки
+
+ /* Инициализация колонок граф показателей */
+ procedure MARKS_COLUMNS_INIT
+ (
+ RDG in out nocopy PKG_P8PANELS_VISUAL.TDATA_GRID, -- Описание таблицы
+ NRRPCONFSCTN in number -- Рег. номер раздела
+ )
+ is
+ begin
+ /* Цикл по графам показателей раздела */
+ for REC in (select C.CODE,
+ C.NAME
+ from RRPCONFSCTNMRK T,
+ RRPCOLUMN C
+ where T.PRN = NRRPCONFSCTN
+ and T.RRPCOLUMN = C.RN
+ group by C.RN,
+ C.CODE,
+ C.NAME
+ order by C.CODE)
+ loop
+ /* Наименование графы */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SCOL_' || REC.CODE,
+ SCAPTION => REC.NAME,
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ NWIDTH => 200);
+ /* Рег. номер графы */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NCOL_RN_' || REC.CODE,
+ SCAPTION => REC.NAME || ' рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ /* Рег. номер показателя */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NMARK_RN_' || REC.CODE,
+ SCAPTION => REC.NAME || ' рег. номер показателя',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ /* Мнемокод показателя */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMARK_CODE_' || REC.CODE,
+ SCAPTION => REC.NAME || ' мнемокод показателя',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => false);
+ /* Для составов показтелей */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'MARK_CNS_' || REC.CODE,
+ SCAPTION => REC.NAME || ' состав показателя',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => false);
+ end loop;
+ end MARKS_COLUMNS_INIT;
- /* Курсор с отбором показателей раздела по ид. раздела */
- cursor C1 (NSCTN_RN in number) is
- select T.RN NRN,
- T.PRN NPRN,
- T.RRPCONF NRRPCONF,
- T.RRPPRM NRRPPRM,
- T.CODE SCODE,
- T.NAME SNAME,
- R.CODE SROW_CODE,
- R.NAME SROW_NAME,
- C.CODE SCOLUMN_CODE,
- C.NAME SCOLUMN_NAME
- from RRPCONFSCTNMRK T,
- RRPROW R,
- RRPCOLUMN C
- where T.PRN in (select T2.RN
- from RRPCONFSCTN T2
- where T2.PRN = NRN_RRPCONF
- and T2.VERSION = NVERSION)
- and T.VERSION = NVERSION
- and T.RRPROW = R.RN (+)
- and T.RRPCOLUMN = C.RN (+)
- and T.PRN = NSCTN_RN
- order by T.CODE;
-
- /* Курсор с отбором граф раздела по ид. раздела */
- cursor CN (NSCTN_RN in number) is
- select distinct(C.CODE) SCOLUMN_CODE,
- C.NAME SCOLUMN_NAME
- from RRPCONFSCTNMRK T,
- RRPCOLUMN C
- where T.PRN in (select T2.RN
- from RRPCONFSCTN T2
- where T2.PRN = NRN_RRPCONF
- and T2.VERSION = NVERSION)
- and T.VERSION = NVERSION
- and T.RRPCOLUMN = C.RN (+)
- and T.PRN = NSCTN_RN
- order by SCOLUMN_CODE;
+ /* Считывание показателя по строке/графе */
+ function RRPCONFSCTNMRK_GET_ROWCOL
+ (
+ NRRPCONFSCTN in number, -- Рег. номер раздела
+ NRRPROW in number, -- Рег. номер строки
+ NRRPCOLUMN in number -- Рег. номер графы
+ ) return RRPCONFSCTNMRK%rowtype -- Запись показателя
+ is
+ RRESULT RRPCONFSCTNMRK%rowtype; -- Рег. номер показателя
+ begin
+ /* Считываем рег. номер показателя */
+ begin
+ select T.*
+ into RRESULT
+ from RRPCONFSCTNMRK T
+ where T.PRN = NRRPCONFSCTN
+ and T.RRPROW = NRRPROW
+ and T.RRPCOLUMN = NRRPCOLUMN;
+ exception
+ when others then
+ RRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return RRESULT;
+ end RRPCONFSCTNMRK_GET_ROWCOL;
begin
/* Очистка контейнера */
PKG_CONTVALLOC2NS.PURGE(RCONTAINER => CXML);
/* Определение версии раздела */
NVERSION := GET_SESSION_VERSION(SUNITCODE => 'RRPConfig');
/* Цикл по разделам настройки форм регламентированного отчёта */
- for C in (select T.RN NRN,
+ for S in (select T.RN NRN,
T.VERSION NVERSION,
- T.CRN NCRN,
- T.PRN NPRN,
- T.CODE SCODE,
- T.NAME SNAME
+ T.CRN NCRN,
+ T.PRN NPRN,
+ T.CODE SCODE,
+ T.NAME SNAME,
+ COALESCE((select 1
+ from RRPCONFSCTNMRK M
+ where M.PRN = T.RN
+ and ROWNUM = 1),
+ 0) NMARKS_EXISTS,
+ ROWNUM RNUM
from RRPCONFSCTN T
where T.PRN = NRN_RRPCONF
- and T.VERSION = NVERSION)
+ and T.VERSION = NVERSION
+ order by T.CODE)
loop
/* Инициализируем таблицу данных */
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1);
/* Формируем структуру заголовка */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SROW_NAME',
- SCAPTION => 'Наименование строки',
+ SCAPTION => '',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
NWIDTH => 150);
- /* Цикл формирования колонок с графами */
- for CL in CN(C.NRN)
- loop
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SCOL_' || CL.SCOLUMN_CODE,
- SCAPTION => CL.SCOLUMN_NAME,
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NRN_' || CL.SCOLUMN_CODE,
- SCAPTION => CL.SCOLUMN_NAME || ' Идентификаторы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BVISIBLE => false);
- end loop;
- /* Для нового раздела очищаем переменную кода строки */
- SCUR_ROW := 'default';
- /* Инициализируем строку */
- RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE();
- /* Цикл заполнения строк данными о показателях раздела */
- for CR in C1(C.NRN)
- loop
- /* Если новая строка */
- if (SCUR_ROW != CR.SROW_CODE) then
- /* Если строка не первая */
- if (SCUR_ROW != 'default') then
- /* Добавим строку для раздела */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
- /* Инициализируем новую строку */
- RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE();
- end if;
- /* Запоминаем мнемокод новой строки */
- SCUR_ROW := CR.SROW_CODE;
+ /* Формируем структуру заголовка */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SROW_CODE',
+ SCAPTION => 'Мнемокод строки',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => false);
+ /* Формируем структуру заголовка */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NROW_RN',
+ SCAPTION => 'Рег. номер строки',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ /* Если раздел содержит показатели */
+ if (S.NMARKS_EXISTS = 1) then
+ /* Инициализируем колонки граф */
+ MARKS_COLUMNS_INIT(RDG => RDG, NRRPCONFSCTN => S.NRN);
+ /* Обходим строки раздела */
+ for R in (select R.RN,
+ R.CODE,
+ R.NAME
+ from RRPCONFSCTNMRK T,
+ RRPROW R
+ where T.PRN = S.NRN
+ and R.RN = T.RRPROW
+ group by R.RN,
+ R.CODE,
+ R.NAME,
+ R.ROW_CODE,
+ R.SORT_NUMB
+ order by R.SORT_NUMB,
+ LPAD(R.ROW_CODE, 40, '0'),
+ LPAD(R.CODE, 20, '0'))
+ loop
/* Заполняем наименование строки */
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => CR.SROW_NAME);
- end if;
- /* Заполняем наименование показателя раздела */
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || CR.SCOLUMN_CODE, SVALUE => CR.SNAME);
- /* Заполняем ид. показателя раздела */
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN_' || CR.SCOLUMN_CODE, NVALUE => CR.NRN);
- end loop;
- /* Добавим последнюю строку для раздела */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => R.NAME, BCLEAR => true);
+ /* Заполняем мнемокод строки */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_CODE', SVALUE => R.CODE);
+ /* Заполняем рег. номер строки */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NROW_RN', NVALUE => R.RN);
+ /* Обходим графы раздела */
+ for C in (select C.RN,
+ C.CODE,
+ C.NAME
+ from RRPCONFSCTNMRK T,
+ RRPCOLUMN C
+ where T.PRN = S.NRN
+ and C.RN = T.RRPCOLUMN
+ group by C.RN,
+ C.CODE,
+ C.NAME,
+ C.COLUMN_CODE,
+ C.SORT_NUMB
+ order by C.SORT_NUMB,
+ LPAD(C.COLUMN_CODE, 40, '0'),
+ LPAD(C.CODE, 20, '0'))
+ loop
+ /* Считываем показатель по строке/графе */
+ RRRPCONFSCTNMRK := RRPCONFSCTNMRK_GET_ROWCOL(NRRPCONFSCTN => S.NRN, NRRPROW => R.RN, NRRPCOLUMN => C.RN);
+ /* Заполняем рег. номер графы */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || C.CODE, SVALUE => C.NAME);
+ /* Заполняем рег. номер графы */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOL_RN_' || C.CODE, NVALUE => C.RN);
+ /* Заполняем рег. номер показателя */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'NMARK_RN_' || C.CODE,
+ NVALUE => RRRPCONFSCTNMRK.RN);
+ /* Если ошибка считывания показателя */
+ if (RRRPCONFSCTNMRK.RN is not null) then
+ /* Заполняем мнемокод показателя */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'SMARK_CODE_' || C.CODE,
+ SVALUE => RRRPCONFSCTNMRK.CODE);
+ /* Добавляем атрибут состава показателей */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'MARK_CNS_' || C.CODE, SVALUE => null);
+ end if;
+ end loop;
+ /* Добавим строку для раздела */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ end if;
/* Сериализуем описание */
CDG := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
/* Заполняем контейнер данными о разделе */
- PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_CODE', SVALUE => C.SCODE);
- PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_NAME', SVALUE => C.SNAME);
- PKG_CONTVALLOC2NS.PUTLC(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_CLOB', LCVALUE => CDG);
+ PKG_CONTVALLOC2NS.PUTN(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'RN', NVALUE => S.NRN);
+ PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'CODE', SVALUE => S.SCODE);
+ PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'NAME', SVALUE => S.SNAME);
+ PKG_CONTVALLOC2NS.PUTLC(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'CLOB', LCVALUE => CDG);
end loop;
/* Формируем XML с данными */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
@@ -218,22 +1000,51 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
loop
/* Ид. раздела */
if (X = 1) then
- NCURRN := PKG_CONTVALLOC2NS.FIRST_(RCONTAINER => CXML);
+ NCURRENT_SECTION := PKG_CONTVALLOC2NS.FIRST_(RCONTAINER => CXML);
else
- NCURRN := PKG_CONTVALLOC2NS.NEXT_(RCONTAINER => CXML, NTABID => NCURRN);
+ NCURRENT_SECTION := PKG_CONTVALLOC2NS.NEXT_(RCONTAINER => CXML, NTABID => NCURRENT_SECTION);
end if;
+ /* Рег. номер раздела */
+ NSECTION_RN := PKG_CONTVALLOC2NS.GETN(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'RN');
/* Мнемокод раздела */
- SCURCODE := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_CODE');
+ SSECTION_CODE := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'CODE');
/* Наименование раздела */
- SCURNAME := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_NAME');
+ SSECTION_NAME := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'NAME');
/* Clob с показателями раздела */
- CCURCLOB := PKG_CONTVALLOC2NS.GETLC(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_CLOB');
+ CSECTION_CLOB := PKG_CONTVALLOC2NS.GETLC(RCONTAINER => CXML, NTABID => NCURRENT_SECTION, SROWID => 'CLOB');
/* Формирование элемента XML с данными о разделе */
PKG_XFAST.DOWN_NODE(SNAME => 'SECTIONS');
- PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => NCURRN);
- PKG_XFAST.ATTR(SNAME => 'SCODE', SVALUE => SCURCODE);
- PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => SCURNAME);
- PKG_XFAST.VALUE_XML(LCVALUE => CCURCLOB);
+ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => NSECTION_RN);
+ PKG_XFAST.ATTR(SNAME => 'SCODE', SVALUE => SSECTION_CODE);
+ PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => SSECTION_NAME);
+ PKG_XFAST.ATTR(SNAME => 'NDELETE_ALLOW',
+ NVALUE => UTL_UNIT_ACTION_GET_ALLOW(SUNIT => SUNIT_RRPCONFSCTN,
+ SACTION => SACTION_DELETE,
+ NRN => NSECTION_RN));
+ PKG_XFAST.VALUE_XML(LCVALUE => CSECTION_CLOB);
+ /* Добавляем информацию о составах показателей */
+ PKG_XFAST.DOWN_NODE(SNAME => 'MARK_CNS');
+ /* Цикл по составам показателей раздела */
+ for REC in (select T.PRN,
+ T.RN,
+ T.NUMB
+ from RRPCONFSCTNMRK M,
+ RRPCONFSCTNMRKCN T
+ where M.PRN = NSECTION_RN
+ and T.PRN = M.RN
+ order by M.RN,
+ T.NUMB asc)
+ loop
+ /* Добавляем состав */
+ PKG_XFAST.DOWN_NODE(SNAME => 'MARK_CN');
+ PKG_XFAST.ATTR(SNAME => 'NPRN', NVALUE => REC.PRN);
+ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.RN);
+ PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => REC.NUMB);
+ PKG_XFAST.ATTR(SNAME => 'SDESC',
+ SVALUE => UTL_RRPCONFSCTNMRKCN_GET_DESC(NCOMPANY => NCOMPANY, NRRPCONFSCTNMRKCN => REC.RN));
+ PKG_XFAST.UP();
+ end loop;
+ PKG_XFAST.UP();
PKG_XFAST.UP();
end loop;
PKG_XFAST.UP();
@@ -281,32 +1092,32 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
- RES RRPCONFSCTN%rowtype; -- Запись раздела настройки формы регламентированного отчета
- RRRPCONFSCTN RRPCONFSCTN%rowtype;
- RRRPPRMGRP RRPPRMGRP%rowtype;
+ RRES RRPCONFSCTN%rowtype; -- Запись раздела настройки формы регламентированного отчета
+ RRRPCONFSCTN RRPCONFSCTN%rowtype; -- Запись родительского раздела настройки регламентированного отчета
+ RRRPPRMGRP RRPPRMGRP%rowtype; -- Запись группы параметров регламентированного отчета
begin
/* Считаем исправляемую запись */
- RES := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN);
+ RRES := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN);
/* Считаем запись родительского этапа */
- if (RES.RRPCONFSCTN is not null) then
- RRRPCONFSCTN := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RES.RRPCONFSCTN);
+ if (RRES.RRPCONFSCTN is not null) then
+ RRRPCONFSCTN := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRES.RRPCONFSCTN);
end if;
/* Считаем запись группы параметров */
- if (RES.RRPPRMGRP is not null) then
- RRRPPRMGRP := GET_RRPPRMGRP_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RES.RRPPRMGRP);
+ if (RRES.RRPPRMGRP is not null) then
+ RRRPPRMGRP := GET_RRPPRMGRP_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRES.RRPPRMGRP);
end if;
/* Исправим раздел */
- P_RRPCONFSCTN_UPDATE(NRN => RES.RN,
+ P_RRPCONFSCTN_UPDATE(NRN => RRES.RN,
NCOMPANY => NCOMPANY,
SCODE => SCODE,
SNAME => SNAME,
SRRPCONFSCTN => RRRPCONFSCTN.CODE,
SRRPPRMGRP => RRRPPRMGRP.CODE,
- SNOTE => RES.NOTE,
- NHTML_HIDE => RES.HTML_HIDE,
- NHTML_HIDE_NAME_COL => RES.HTML_HIDE_NAME_COL,
- NHTML_MAKE_HIER_GRP => RES.HTML_MAKE_HIER_GRP,
- SCLSF_CODE => RES.CLSF_CODE,
+ SNOTE => RRES.NOTE,
+ NHTML_HIDE => RRES.HTML_HIDE,
+ NHTML_HIDE_NAME_COL => RRES.HTML_HIDE_NAME_COL,
+ NHTML_MAKE_HIER_GRP => RRES.HTML_MAKE_HIER_GRP,
+ SCLSF_CODE => RRES.CLSF_CODE,
NFORMULA_UPDATE => 1,
NMARK_UPDATE => 1);
end RRPCONFSCTN_UPDATE;
@@ -319,6 +1130,11 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
begin
+ /* Если действие недоступно для удаления */
+ if (UTL_UNIT_ACTION_GET_ALLOW(SUNIT => SUNIT_RRPCONFSCTN, SACTION => SACTION_DELETE, NRN => NRN) = 0) then
+ P_EXCEPTION(0,
+ 'Данный раздел используется в сформированных документах/параметрах документа/дочерний раздел. Удаление запрещено.');
+ end if;
/* Удалим раздел */
P_RRPCONFSCTN_DELETE(NRN => NRN, NCOMPANY => NCOMPANY);
end RRPCONFSCTN_DELETE;
@@ -326,109 +1142,133 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */
procedure RRPCONFSCTNMRK_GET_CODES
(
- NRN in number, -- Ид. показателя раздела
- SRRPCONF out varchar2, -- Код настройки формы регламентированного отчёта
- SRRPCONFSCTN out varchar2, -- Код раздела
- SRRPCONFSCTNMRK out varchar2 -- Код показателя раздела
+ NRN in number, -- Ид. показателя раздела
+ SRRPCONF out varchar2, -- Код настройки формы регламентированного отчёта
+ SRRPCONFSCTN out varchar2, -- Код раздела
+ SRRPCONFSCTNMRK out varchar2 -- Код показателя раздела
)
is
- NVERSION PKG_STD.TREF := GET_SESSION_VERSION(SUNITCODE => 'RRPConfig'); -- Версия раздела
- begin
- select R.CODE,
- RS.CODE,
- RSM.CODE
- into SRRPCONF,
- SRRPCONFSCTN,
- SRRPCONFSCTNMRK
- from RRPCONF R,
- RRPCONFSCTN RS,
- RRPCONFSCTNMRK RSM
- where R.RN in (select RRPCONF
- from RRPCONFSCTNMRK
- where RN = NRN
- and VERSION = NVERSION)
- and RS.RN in (select PRN
- from RRPCONFSCTNMRK
- where RN = NRN
- and VERSION = NVERSION)
- and RSM.RN = NRN;
- exception
- when NO_DATA_FOUND then
- P_EXCEPTION(0, 'По выбранному показателю раздела не найдено данных.');
- when TOO_MANY_ROWS then
- P_EXCEPTION(0,
- 'По выбранному показателю раздела найдено несколько записей.');
+ begin
+ /* Считываем данные показателя/раздела/настройки */
+ begin
+ select C.CODE,
+ S.CODE,
+ M.CODE
+ into SRRPCONF,
+ SRRPCONFSCTN,
+ SRRPCONFSCTNMRK
+ from RRPCONF C,
+ RRPCONFSCTN S,
+ RRPCONFSCTNMRK M
+ where M.RN = NRN
+ and S.RN = M.PRN
+ and C.RN = S.PRN;
+ exception
+ when others then
+ P_EXCEPTION(0,
+ 'Не определен показатель настройки регламентированного отчета.');
+ end;
end RRPCONFSCTNMRK_GET_CODES;
/* Формирование кода и наименования показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_GET_CODE_NAME
- (
- SSCTNCODE in varchar2, -- Мнемокод раздела
- SROWCODE in varchar2, -- Мнемокод строки
- NROWVER in number, -- Ид. редакции строки
- SCOLUMNCODE in varchar2, -- Мнемокод графы
- NCOLUMNVER in number, -- Ид. редакции графы
+ (
+ NRRPCONFSCTN in number, -- Рег. номер раздела
+ NRRPROW in number, -- Рег. номер строки
+ NRRPCOLUMN in number, -- Рег. номер графы
SCODE out varchar2, -- Мнемокод показателя раздела
SNAME out varchar2 -- Наименование показателя раздела
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
- NROWRN PKG_STD.TREF; -- Ид. строки
- NCOLUMNRN PKG_STD.TREF; -- Ид. графы
+ RRRPCONFSCTN RRPCONFSCTN%rowtype; -- Запись раздела регламентированного отчета
+ RRRPROW RRPROW%rowtype; -- Запись строки регламентированного отчета
+ RRRPCOLUMN RRPCOLUMN%rowtype; -- Запись графы регламентированного отчета
begin
- /* Сформируем код показателя */
- P_RRPCONFSCTNMRK_MAKE_CODE(SRRPCONFSCTN => SSCTNCODE,
- SRRPROW => SROWCODE,
- SRRPCOLUMN => SCOLUMNCODE,
- SCODE => SCODE);
- /* Найдем рег. номер строки показателя */
- FIND_RRPROW_CODE(NFLAG_SMART => 0,
- NFLAG_OPTION => 0,
- NCOMPANY => NCOMPANY,
- NRRPVERSION => NROWVER,
- SCODE => SROWCODE,
- NRN => NROWRN);
- /* Найдем рег. номер графы показателя */
- FIND_RRPCOLUMN_CODE(NFLAG_SMART => 0,
- NFLAG_OPTION => 0,
- NCOMPANY => NCOMPANY,
- NRRPVERSION => NCOLUMNVER,
- SCODE => SCOLUMNCODE,
- NRN => NCOLUMNRN);
- /* Сформируем наименование показателя */
- P_RRPCONFSCTNMRK_MAKE_NAME(NCOMPANY => NCOMPANY,
- NRRPROW => NROWRN,
- NRRPCOLUMN => NCOLUMNRN,
- NCHANGE_NAME => 1,
- NCHANGE_NAME_PARENT => 0,
- SNAME => SNAME);
+ /* Считываем запись раздела регламентированного отчета */
+ RRRPCONFSCTN := GET_RRPCONFSCTN_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPCONFSCTN);
+ /* Считываем запись строки регламентированного отчета */
+ RRRPROW := GET_RRPROW_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPROW);
+ /* Считываем запись графы регламентированного отчета */
+ RRRPCOLUMN := GET_RRPCOLUMN_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPCOLUMN);
+ /* Если все записи считаны */
+ if ((RRRPCONFSCTN.RN is not null) and (RRRPROW.RN is not null) and (RRRPCOLUMN.RN is not null)) then
+ /* Сформируем код показателя */
+ P_RRPCONFSCTNMRK_MAKE_CODE(SRRPCONFSCTN => RRRPCONFSCTN.CODE,
+ SRRPROW => RRRPROW.CODE,
+ SRRPCOLUMN => RRRPCOLUMN.CODE,
+ SCODE => SCODE);
+ /* Сформируем наименование показателя */
+ P_RRPCONFSCTNMRK_MAKE_NAME(NCOMPANY => NCOMPANY,
+ NRRPROW => RRRPROW.RN,
+ NRRPCOLUMN => RRRPCOLUMN.RN,
+ NCHANGE_NAME => 1,
+ NCHANGE_NAME_PARENT => 0,
+ SNAME => SNAME);
+ end if;
end RRPCONFSCTNMRK_GET_CODE_NAME;
+ /* Формирование кода и наименования показателя раздела регламентированного отчёта */
+ procedure RRPCONFSCTNMRK_GET_NAME
+ (
+ NRRPCONFSCTNMRK in number, -- Рег. номер показателя
+ SNAME out varchar2 -- Наименование показателя раздела
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ RRRPCONFSCTNMRK RRPCONFSCTNMRK%rowtype; -- Запись показателя регламентированного отчета
+ begin
+ /* Считываем запись раздела регламентированного отчета */
+ RRRPCONFSCTNMRK := GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, NRN => NRRPCONFSCTNMRK);
+ /* Указываем наименование показателя */
+ SNAME := RRRPCONFSCTNMRK.NAME;
+ end RRPCONFSCTNMRK_GET_NAME;
+
/* Добавление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_INSERT
(
NPRN in number, -- Ид. раздела
SCODE in varchar2, -- Мнемокод показателя раздела
SNAME in varchar2, -- Наименование показателя раздела
- SCOLCODE in varchar2, -- Мнемокод графы
- SCOLVER in varchar2, -- Мнемокод редакции графы
- SROWCODE in varchar2, -- Мнемокод строки
- SROWVER in varchar2, -- Мнемокод редакции строки
+ NRRPROW in number, -- Рег. номер строки
+ NRRPCOLUMN in number, -- Рег. номер графы
NRN out number -- Ид. созданной записи
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ RRRPROW RRPROW%rowtype; -- Запись строки регламентированного отчета
+ RRRPVERSION_ROW RRPVERSION%rowtype; -- Запись редакции строки регламентированного отчета
+ RRRPCOLUMN RRPCOLUMN%rowtype; -- Запись графы регламентированного отчета
+ RRRPVERSION_COL RRPVERSION%rowtype; -- Запись редакции графы регламентированного отчета
begin
+ /* Если строка не указана */
+ if (NRRPROW is null) then
+ P_EXCEPTION(0,
+ 'Ошибка считывания строки регламентированного отчета.');
+ end if;
+ /* Если графа не указана */
+ if (NRRPCOLUMN is null) then
+ P_EXCEPTION(0,
+ 'Ошибка считывания графы регламентированного отчета.');
+ end if;
+ /* Считываем запись строки регламентированного отчета */
+ RRRPROW := GET_RRPROW_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPROW);
+ /* Считываем запись графы регламентированного отчета */
+ RRRPCOLUMN := GET_RRPCOLUMN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRRPCOLUMN);
+ /* Считываем запись редакции строки регламентированного отчета */
+ RRRPVERSION_ROW := GET_RRPVERSION_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRRPROW.RRPVERSION);
+ /* Считываем запись редакции графы регламентированного отчета */
+ RRRPVERSION_COL := GET_RRPVERSION_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RRRPCOLUMN.RRPVERSION);
/* Добавим показатель */
P_RRPCONFSCTNMRK_INSERT(NCOMPANY => NCOMPANY,
NPRN => NPRN,
NNUMB => F_RRPCONFSCTNMRK_NEXT_NUMB(NCOMPANY => NCOMPANY, NPRN => NPRN),
SCODE => SCODE,
SNAME => SNAME,
- SRRPROW => SROWCODE,
- SRRPVERSION_ROW => SROWVER,
- SRRPCOLUMN => SCOLCODE,
- SRRPVERSION_COLUMN => SCOLVER,
+ SRRPROW => RRRPROW.CODE,
+ SRRPVERSION_ROW => RRRPVERSION_ROW.CODE,
+ SRRPCOLUMN => RRRPCOLUMN.CODE,
+ SRRPVERSION_COLUMN => RRRPVERSION_COL.CODE,
SPKG_ROW => null,
SPRC_ROW => null,
SPKG_COL => null,
@@ -505,6 +1345,11 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
begin
+ /* Если действие недоступно для удаления */
+ if (UTL_UNIT_ACTION_GET_ALLOW(SUNIT => SUNIT_RRPCONFSCTNMRK, SACTION => SACTION_DELETE, NRN => NRN) = 0) then
+ P_EXCEPTION(0,
+ 'Данный показатель используется в сформированных документах. Удаление запрещено.');
+ end if;
/* Удалим показатель */
P_RRPCONFSCTNMRK_DELETE(NCOMPANY => NCOMPANY, NRN => NRN);
end RRPCONFSCTNMRK_DELETE;