From 1a01536b354d93565f31dea2d900a8dfe71bf80e Mon Sep 17 00:00:00 2001 From: Dollerino Date: Fri, 23 Aug 2024 16:43:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-823=20-=20=D0=98=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=20"=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=80=D0=B5=D0=B3=D0=BB=D0=B0=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => IUD}/iud_form_dialog.js | 65 +- .../{ => IUD}/iud_form_text_field.js | 0 .../rrp_conf_editor/components/layouts.js | 344 +++++ .../rrp_conf_editor/components/rrp_section.js | 243 ++++ .../{ => components}/section_tab_panel.js | 18 +- app/panels/rrp_conf_editor/hooks.js | 365 ++++- app/panels/rrp_conf_editor/layouts.js | 46 - app/panels/rrp_conf_editor/rrp_conf_editor.js | 371 +---- db/PKG_P8PANELS_RRPCONFED.pck | 1257 ++++++++++++++--- 9 files changed, 2113 insertions(+), 596 deletions(-) rename app/panels/rrp_conf_editor/{ => IUD}/iud_form_dialog.js (84%) rename app/panels/rrp_conf_editor/{ => IUD}/iud_form_text_field.js (100%) create mode 100644 app/panels/rrp_conf_editor/components/layouts.js create mode 100644 app/panels/rrp_conf_editor/components/rrp_section.js rename app/panels/rrp_conf_editor/{ => components}/section_tab_panel.js (80%) delete mode 100644 app/panels/rrp_conf_editor/layouts.js 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 + + + {menuItems.map(el => { + return ( + { + el.func(markRn); + handleMethodsMenuClose(); + }} + > + {el.icon} + {el.name} + + ); + })} + + + ); +}; + +//Контроль свойств - Действия карты показателя +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 ( + + + + + Информация + + + + close + + + + + + Карточки показателей содержат сокращенную информацию о типе состава показателя. + Список сокращений: + + + + + + + + + + + + + + + + + + + ); +}; + +//Контроль свойств - Диалог дополнительной информации +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 ( ); }; 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;