Compare commits

...

3 Commits
main ... main

9 changed files with 219 additions and 210 deletions

View File

@ -76,9 +76,6 @@ const ClntTaskBoard = () => {
//Состояние доступных маршрутов события //Состояние доступных маршрутов события
const [availableRoutes, setAvailableRoutes] = useState({ source: "", routes: [] }); const [availableRoutes, setAvailableRoutes] = useState({ source: "", routes: [] });
//Состояние перетаскиваемого события
const [dragItem, setDragItem] = useState({ type: "", status: "" });
//При открытии/закрытии диалога фильтра //При открытии/закрытии диалога фильтра
const handleFilterOpen = isOpen => { const handleFilterOpen = isOpen => {
setDialogsState(pv => ({ ...pv, filterDialogIsOpen: isOpen })); setDialogsState(pv => ({ ...pv, filterDialogIsOpen: isOpen }));
@ -152,18 +149,6 @@ const ClntTaskBoard = () => {
setAvailableRoutes({ source: "", routes: [] }); setAvailableRoutes({ source: "", routes: [] });
}; };
//Обработка захвата перетаскиваемого объекта
const handleDragItemChange = (filtersType, statusCode) =>
setDragItem({
type: filtersType,
status: statusCode
});
//Обработка очистки перетаскиваемого объекта
const handleDragItemClear = () => {
setDragItem({ type: "", status: "" });
};
//Проверка доступности карточки события //Проверка доступности карточки события
const isCardAvailable = code => { const isCardAvailable = code => {
return availableRoutes.source === code || availableRoutes.routes.find(r => r.SDESTINATION === code) || !availableRoutes.source ? true : false; return availableRoutes.source === code || availableRoutes.routes.find(r => r.SDESTINATION === code) || !availableRoutes.source ? true : false;
@ -209,18 +194,17 @@ const ClntTaskBoard = () => {
/> />
) : null} ) : null}
{dialogsState.taskDialogIsOpen ? ( {dialogsState.taskDialogIsOpen ? (
<TaskDialog <TaskDialog taskType={filters.values.sType} onTasksReload={() => handleTasksReload(true)} onClose={handleTaskDialogOpen} />
taskType={dragItem.type}
taskStatus={dragItem.status}
onTasksReload={() => handleTasksReload(true)}
onClose={() => {
handleTaskDialogOpen();
handleDragItemClear();
}}
/>
) : null} ) : null}
<Box sx={STYLES.BOX_FILTER}> <Box sx={STYLES.BOX_FILTER}>
<Stack direction="row"> <Stack direction="row">
<Box>
<Stack direction="row" pl={1} pt={1}>
<IconButton onClick={handleTaskDialogOpen} title={"Добавить событие"}>
<Icon>add</Icon>
</IconButton>
</Stack>
</Box>
<Filter <Filter
isFilterDialogOpen={dialogsState.filterDialogIsOpen} isFilterDialogOpen={dialogsState.filterDialogIsOpen}
filter={filters.values} filter={filters.values}
@ -282,11 +266,8 @@ const ClntTaskBoard = () => {
statusTitle={status[statusesState.attr] || status.SEVNSTAT_NAME} statusTitle={status[statusesState.attr] || status.SEVNSTAT_NAME}
colorRules={colorRules} colorRules={colorRules}
extraData={extraData} extraData={extraData}
filtersType={filters.values.sType}
isCardAvailable={isCardAvailable} isCardAvailable={isCardAvailable}
onTasksReload={handleTasksReload} onTasksReload={handleTasksReload}
onDragItemChange={handleDragItemChange}
onTaskDialogOpen={handleTaskDialogOpen}
onNoteDialogOpen={handleNoteOpen} onNoteDialogOpen={handleNoteOpen}
onStatusColorChange={handleSettingStatusColorChange} onStatusColorChange={handleSettingStatusColorChange}
placeholder={provided.placeholder} placeholder={provided.placeholder}

View File

@ -9,7 +9,7 @@
import React, { useState } from "react"; //Классы React import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogTitle, DialogContent, DialogActions, IconButton, Icon, Button, Box, Stack } from "@mui/material"; //Интерфейсные компоненты import { Dialog, DialogTitle, DialogContent, DialogActions, IconButton, Icon, Button, Box, Stack, Typography } from "@mui/material"; //Интерфейсные компоненты
import { CustomInputField } from "./custom_input_field.js"; //Кастомное поле ввода import { CustomInputField } from "./custom_input_field.js"; //Кастомное поле ввода
import { sortAttrs, sortDest } from "../layouts.js"; //Допустимые значение поля и направления сортировки import { sortAttrs, sortDest } from "../layouts.js"; //Допустимые значение поля и направления сортировки
import { hasValue } from "../../../core/utils.js"; //Проверка наличия значения import { hasValue } from "../../../core/utils.js"; //Проверка наличия значения
@ -63,9 +63,23 @@ const SettingsDialog = ({ initial, onSettingsChange, onClose, ...other }) => {
<CustomInputField <CustomInputField
elementCode="clrRules" elementCode="clrRules"
elementValue={hasValue(colorRules.selectedColorRule.id) && colorRules.length !== 0 ? colorRules.selectedColorRule.id : -1} elementValue={hasValue(colorRules.selectedColorRule.id) && colorRules.length !== 0 ? colorRules.selectedColorRule.id : -1}
labelText="Заливка событий" labelText="Заливка событий*"
items={colorRules.rules.reduce((prev, cur) => [...prev, { id: cur.id, caption: cur.SDP_NAME }], [])} items={colorRules.rules.reduce(
emptyItem={{ key: -1, id: -1, caption: "-" }} (prev, cur) => [
...prev,
{
id: cur.id,
caption:
`${cur.SDP_NAME}` +
(cur.STYPE == "string"
? `${cur.fromValue ? `, значение "${cur.fromValue}"` : ""}`
: `${cur.fromValue ? `, с ${cur.fromValue}` : ""}` + `${cur.toValue ? `, по ${cur.toValue}` : ""}`) +
`${cur.SCOLOR ? `, ${cur.SCOLOR}` : ""}`
}
],
[]
)}
emptyItem={{ key: -1, id: -1, caption: "Нет" }}
onChange={handleColorRuleChange} onChange={handleColorRuleChange}
sx={STYLES.SELECT} sx={STYLES.SELECT}
/> />
@ -75,7 +89,7 @@ const SettingsDialog = ({ initial, onSettingsChange, onClose, ...other }) => {
<CustomInputField <CustomInputField
elementCode="attr" elementCode="attr"
elementValue={statusesState.attr} elementValue={statusesState.attr}
labelText="Поле сортировки" labelText="Порядок сортировки колонок"
items={sortAttrs.reduce((prev, cur) => [...prev, { id: cur.id, caption: cur.descr }], [])} items={sortAttrs.reduce((prev, cur) => [...prev, { id: cur.id, caption: cur.descr }], [])}
onChange={handleSortAttrChange} onChange={handleSortAttrChange}
sx={STYLES.SELECT} sx={STYLES.SELECT}
@ -88,6 +102,10 @@ const SettingsDialog = ({ initial, onSettingsChange, onClose, ...other }) => {
</IconButton> </IconButton>
</Stack> </Stack>
</Box> </Box>
<Typography variant={"caption"}>
*Поддерживаются правила заливки, базирующиеся на дополнительных свойствах типа &quot;Строка&quot; или &quot;Число&quot;, из
профиля пользователя, настроенного для раздела &quot;События&quot; в WEB-интерфейсе данного приложения.
</Typography>
</DialogContent> </DialogContent>
<DialogActions sx={COMMON_STYLES.DIALOG_ACTIONS}> <DialogActions sx={COMMON_STYLES.DIALOG_ACTIONS}>
<Button <Button

View File

@ -9,7 +9,7 @@
import React, { useState } from "react"; //Классы React import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Card, CardHeader, CardContent, Button, IconButton, Icon, Typography, Stack } from "@mui/material"; //Интерфейсные компоненты import { Card, CardHeader, CardContent, IconButton, Icon, Typography, Stack } from "@mui/material"; //Интерфейсные компоненты
import { TaskCard } from "./task_card.js"; //Компонент Карточка события import { TaskCard } from "./task_card.js"; //Компонент Карточка события
import { StatusCardSettings } from "./status_card_settings.js"; //Компонент Диалог настройки карточки событий import { StatusCardSettings } from "./status_card_settings.js"; //Компонент Диалог настройки карточки событий
import { APP_STYLES } from "../../../../app.styles"; //Типовые стили import { APP_STYLES } from "../../../../app.styles"; //Типовые стили
@ -58,7 +58,7 @@ const STYLES = {
paddingRight: "5px", paddingRight: "5px",
paddingBottom: "5px !important", paddingBottom: "5px !important",
overflowY: "auto", overflowY: "auto",
maxHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TITLE_PADDING_BOTTOM} - ${FILTER_HEIGHT} - 85px)`, maxHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TITLE_PADDING_BOTTOM} - ${FILTER_HEIGHT} - 55px)`,
...APP_STYLES.SCROLL ...APP_STYLES.SCROLL
} }
}; };
@ -74,11 +74,8 @@ const StatusCard = ({
statusTitle, statusTitle,
colorRules, colorRules,
extraData, extraData,
filtersType,
isCardAvailable, isCardAvailable,
onTasksReload, onTasksReload,
onDragItemChange,
onTaskDialogOpen,
onNoteDialogOpen, onNoteDialogOpen,
onStatusColorChange, onStatusColorChange,
placeholder placeholder
@ -123,16 +120,6 @@ const StatusCard = ({
{statusTitle} {statusTitle}
</Typography> </Typography>
} }
subheader={
<Button
onClick={() => {
onDragItemChange(filtersType, status.SEVNSTAT_CODE);
onTaskDialogOpen();
}}
>
+ Добавить
</Button>
}
sx={STYLES.CARD_HEADER} sx={STYLES.CARD_HEADER}
/> />
<CardContent sx={STYLES.CARD_CONTENT}> <CardContent sx={STYLES.CARD_CONTENT}>
@ -165,11 +152,8 @@ StatusCard.propTypes = {
statusTitle: PropTypes.string.isRequired, statusTitle: PropTypes.string.isRequired,
colorRules: PropTypes.object.isRequired, colorRules: PropTypes.object.isRequired,
extraData: PropTypes.object.isRequired, extraData: PropTypes.object.isRequired,
filtersType: PropTypes.string.isRequired,
isCardAvailable: PropTypes.func.isRequired, isCardAvailable: PropTypes.func.isRequired,
onTasksReload: PropTypes.func.isRequired, onTasksReload: PropTypes.func.isRequired,
onDragItemChange: PropTypes.func.isRequired,
onTaskDialogOpen: PropTypes.func.isRequired,
onNoteDialogOpen: PropTypes.func.isRequired, onNoteDialogOpen: PropTypes.func.isRequired,
onStatusColorChange: PropTypes.func.isRequired, onStatusColorChange: PropTypes.func.isRequired,
placeholder: PropTypes.object.isRequired placeholder: PropTypes.object.isRequired

View File

@ -15,7 +15,7 @@ import { BackEndСtx } from "../../../context/backend"; //Контекст вз
//----------- //-----------
//Хук для события //Хук для события
const useClientEvent = (taskRn, taskType = "", taskStatus = "") => { const useClientEvent = (taskRn, taskType = "") => {
//Собственное состояние //Собственное состояние
const [task, setTask] = useState({ const [task, setTask] = useState({
init: true, init: true,
@ -24,7 +24,7 @@ const useClientEvent = (taskRn, taskType = "", taskStatus = "") => {
sPrefix: "", sPrefix: "",
sNumber: "", sNumber: "",
sType: taskType, sType: taskType,
sStatus: taskStatus, sStatus: "",
sDescription: "", sDescription: "",
sClntClients: "", sClntClients: "",
sClntClnperson: "", sClntClnperson: "",
@ -118,6 +118,7 @@ const useClientEvent = (taskRn, taskType = "", taskStatus = "") => {
...pv, ...pv,
sPrefix: data.SPREF, sPrefix: data.SPREF,
sNumber: data.SNUMB, sNumber: data.SNUMB,
sStatus: data.SSTATUS,
sCurrentUser: data.SINIT_AUTHNAME, sCurrentUser: data.SINIT_AUTHNAME,
sInitClnperson: data.SINIT_PERSON, sInitClnperson: data.SINIT_PERSON,
sInitUser: !data.SINIT_PERSON ? data.SINIT_AUTHNAME : "", sInitUser: !data.SINIT_PERSON ? data.SINIT_AUTHNAME : "",

View File

@ -12,8 +12,8 @@ export const EVENT_STATES = Object.freeze({ 0: "Все", 1: "Не аннулир
//Допустимые значение поля сортировки //Допустимые значение поля сортировки
export const sortAttrs = [ export const sortAttrs = [
{ id: "SEVNSTAT_CODE", descr: "Мнемокод" }, { id: "SEVNSTAT_CODE", descr: "Мнемокод статуса" },
{ id: "SEVNSTAT_NAME", descr: "Наименование" }, { id: "SEVNSTAT_NAME", descr: "Наименование статуса" },
{ id: "SEVPOINT_DESCR", descr: "Описание точки маршрута" } { id: "SEVPOINT_DESCR", descr: "Описание точки маршрута" }
]; ];
@ -73,24 +73,16 @@ const convertHexToRGB = hex => {
//Считывание заливки события по условию //Считывание заливки события по условию
export const getTaskBgColorByRule = (task, colorRule) => { export const getTaskBgColorByRule = (task, colorRule) => {
//Инициализируем значения //Исходя из типа определяем наименование и возвращаем цвет заливки
let ruleCode = "";
//Исходя из типа определяем наименование
switch (colorRule.STYPE) { switch (colorRule.STYPE) {
case "number": case "number":
ruleCode = `N${colorRule.SFIELD}`; return (!colorRule.fromValue || Number(task.docProps[`N${colorRule.SFIELD}`]) >= Number(colorRule.fromValue)) &&
break; (!colorRule.toValue || Number(task.docProps[`N${colorRule.SFIELD}`]) <= Number(colorRule.toValue))
case "date": ? convertHexToRGB(colorRule.SCOLOR)
ruleCode = `D${colorRule.SFIELD}`; : null;
break;
default: default:
ruleCode = `S${colorRule.SFIELD}`; return task.docProps[`S${colorRule.SFIELD}`] == colorRule.fromValue ? convertHexToRGB(colorRule.SCOLOR) : null;
break;
} }
//Определяем цвет заливки
let bgColor = ruleCode && task.docProps[ruleCode] == colorRule.fromValue ? convertHexToRGB(colorRule.SCOLOR) : null;
//Возвращаем цвет заливки
return bgColor;
}; };
//Индикация истечения срока отработки события //Индикация истечения срока отработки события

View File

@ -35,9 +35,9 @@ const STYLES = {
//----------- //-----------
//Диалог формы события //Диалог формы события
const TaskDialog = ({ taskRn, taskType, taskStatus, editable, onTasksReload, onClose }) => { const TaskDialog = ({ taskRn, taskType, editable, onTasksReload, onClose }) => {
//Собственное состояние //Собственное состояние
const [task, setTask] = useClientEvent(taskRn, taskType, taskStatus); const [task, setTask] = useClientEvent(taskRn, taskType);
//Состояние заполненности всех обязательных свойств //Состояние заполненности всех обязательных свойств
const [dpReady, setDPReady] = useState(false); const [dpReady, setDPReady] = useState(false);
@ -167,7 +167,6 @@ const TaskDialog = ({ taskRn, taskType, taskStatus, editable, onTasksReload, onC
TaskDialog.propTypes = { TaskDialog.propTypes = {
taskRn: PropTypes.number, taskRn: PropTypes.number,
taskType: PropTypes.string.isRequired, taskType: PropTypes.string.isRequired,
taskStatus: PropTypes.string,
editable: PropTypes.bool, editable: PropTypes.bool,
onTasksReload: PropTypes.func.isRequired, onTasksReload: PropTypes.func.isRequired,
onClose: PropTypes.func.isRequired onClose: PropTypes.func.isRequired

View File

@ -36,6 +36,7 @@ create or replace package PKG_P8PANELS_CLNTTSKBRD as
SEVENT_TYPE in varchar2, -- Мнемокод типа события SEVENT_TYPE in varchar2, -- Мнемокод типа события
SPREF out varchar2, -- Префикс события SPREF out varchar2, -- Префикс события
SNUMB out varchar2, -- Номер события SNUMB out varchar2, -- Номер события
SSTATUS out varchar2, -- Начальный статус
SINIT_PERSON out varchar2, -- Сотрудник - инициатор SINIT_PERSON out varchar2, -- Сотрудник - инициатор
SINIT_AUTHNAME out varchar2 -- Пользователь - инициатор SINIT_AUTHNAME out varchar2 -- Пользователь - инициатор
); );
@ -1000,8 +1001,8 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
RDG_ROW => RDG_ROW, RDG_ROW => RDG_ROW,
TDP_NAMES => TDP_NAMES, TDP_NAMES => TDP_NAMES,
TDP_TYPES => TDP_TYPES, TDP_TYPES => TDP_TYPES,
NFIRST_NUMB => RDG.RCOL_DEFS.COUNT - PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES) - 1, NFIRST_NUMB => RDG.RCOL_DEFS.COUNT - PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES),
NLAST_NUMB => RDG.RCOL_DEFS.COUNT - 2, NLAST_NUMB => RDG.RCOL_DEFS.COUNT - 1,
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NACTION => 2); NACTION => 2);
end if; end if;
@ -1119,8 +1120,8 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
RDG_ROW => RDG_ROW, RDG_ROW => RDG_ROW,
TDP_NAMES => TDP_NAMES, TDP_NAMES => TDP_NAMES,
TDP_TYPES => TDP_TYPES, TDP_TYPES => TDP_TYPES,
NFIRST_NUMB => RDG.RCOL_DEFS.COUNT - PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES) - 1, NFIRST_NUMB => RDG.RCOL_DEFS.COUNT - PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES),
NLAST_NUMB => RDG.RCOL_DEFS.COUNT - 2, NLAST_NUMB => RDG.RCOL_DEFS.COUNT - 1,
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NACTION => 1); NACTION => 1);
end if; end if;
@ -1457,11 +1458,13 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
SEVENT_TYPE in varchar2, -- Мнемокод типа события SEVENT_TYPE in varchar2, -- Мнемокод типа события
SPREF out varchar2, -- Префикс события SPREF out varchar2, -- Префикс события
SNUMB out varchar2, -- Номер события SNUMB out varchar2, -- Номер события
SSTATUS out varchar2, -- Начальный статус
SINIT_PERSON out varchar2, -- Сотрудник - инициатор SINIT_PERSON out varchar2, -- Сотрудник - инициатор
SINIT_AUTHNAME out varchar2 -- Пользователь - инициатор SINIT_AUTHNAME out varchar2 -- Пользователь - инициатор
) )
is is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
NEVENT_TYPE PKG_STD.TREF; -- Рег. номер типа события
SOWNER_AGENT_RN PKG_STD.TSTRING; -- Рег. номер работодателя сотрудника SOWNER_AGENT_RN PKG_STD.TSTRING; -- Рег. номер работодателя сотрудника
STAB_PREF PKG_STD.TSTRING; -- Префикс табельного номера сотрудника STAB_PREF PKG_STD.TSTRING; -- Префикс табельного номера сотрудника
STAB_NUMB PKG_STD.TSTRING; -- Таблеьный номер сотрудника STAB_NUMB PKG_STD.TSTRING; -- Таблеьный номер сотрудника
@ -1490,6 +1493,8 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
return SRESULT; return SRESULT;
end CLNEVNTYPES_PREF_GET; end CLNEVNTYPES_PREF_GET;
begin begin
/* Определяем рег. номер типа события */
FIND_CLNEVNTYPES_CODE(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, SEVNTYPE_CODE => SEVENT_TYPE, NRN => NEVENT_TYPE);
/* Считываем префикс из параметра */ /* Считываем префикс из параметра */
SPREF := GET_OPTIONS_STR(SCODE => 'EventPrefix', NCOMP_VERS => NCOMPANY); SPREF := GET_OPTIONS_STR(SCODE => 'EventPrefix', NCOMP_VERS => NCOMPANY);
/* Если префикс не указан в параметре и задан тип события */ /* Если префикс не указан в параметре и задан тип события */
@ -1502,6 +1507,21 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
/* Считываем номер */ /* Считываем номер */
SNUMB := GET_CLNEVENTS_NEXTNUMB(NCOMPANY => NCOMPANY, SPREF => SPREF); SNUMB := GET_CLNEVENTS_NEXTNUMB(NCOMPANY => NCOMPANY, SPREF => SPREF);
end if; end if;
/* Определим начальный статус */
begin
select T.SEVNSTAT_CODE
into SSTATUS
from V_CLNEVNTYPSTS_FOR_EVENTS T
where T.NPRN = NEVENT_TYPE
and ROWNUM <= 1
order by T.NDEFAULT_STATUS desc,
T.SEVNSTAT_CODE;
exception
when NO_DATA_FOUND then
P_EXCEPTION(0,
'Для событий типа "%s" не определена начальная точка маршрута.',
SEVENT_TYPE);
end;
/* Считываем сотрудника текущего пользователя */ /* Считываем сотрудника текущего пользователя */
FIND_PERSON_AUTHID(SPERSON => SINIT_PERSON, FIND_PERSON_AUTHID(SPERSON => SINIT_PERSON,
SOWNER_AGENT => SOWNER_AGENT_RN, SOWNER_AGENT => SOWNER_AGENT_RN,
@ -2254,29 +2274,28 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
/* Считывание настройки раздела "События" для пользователя */ /* Считывание настройки раздела "События" для пользователя */
procedure CLNEVENTS_DP_RULES_GET procedure CLNEVENTS_DP_RULES_GET
( (
COUT out clob -- XML с настройкой раздела COUT out clob -- XML с настройкой раздела
) )
is is
SAUTHID PKG_STD.TSTRING := PKG_SESSION.GET_UTILIZER(); -- Пользователь SAUTHID PKG_STD.TSTRING := PKG_SESSION.GET_UTILIZER(); -- Пользователь
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
BXML blob; -- XML профиля пользователя для раздела "События" SAPPCODE PKG_STD.TSTRING := PKG_SESSION.GET_APPLICATION(); -- Код приложения сеанса
RDOC PKG_XPATH.TDOCUMENT; -- Документ XML BXML blob; -- XML профиля пользователя для раздела "События"
RNODE_ROOT PKG_XPATH.TNODE; -- Корневой узел RDOC PKG_XPATH.TDOCUMENT; -- Документ XML
RNODE_MAIN PKG_XPATH.TNODE; -- Основной узел RNODE_ROOT PKG_XPATH.TNODE; -- Корневой узел
RNODE_GRIDFRAME PKG_XPATH.TNODE; -- Узел "gridFrame" RNODE_MAIN PKG_XPATH.TNODE; -- Основной узел
RNODE_DECOR_RULES PKG_XPATH.TNODE; -- Узел "decorationRules" RNODE_GRIDFRAME PKG_XPATH.TNODE; -- Узел "gridFrame"
RNODE_RULE PKG_XPATH.TNODE; -- Узел "rule" RNODE_DECOR_RULES PKG_XPATH.TNODE; -- Узел "decorationRules"
RNODE_RULE_LIST PKG_XPATH.TNODES; -- Список узлов "rule" RNODE_RULE PKG_XPATH.TNODE; -- Узел "rule"
SFIELD PKG_STD.TSTRING; -- Код свойства документа (в формате "DP_<РЕГ_НОМЕР>") RNODE_RULE_LIST PKG_XPATH.TNODES; -- Список узлов "rule"
SCOLOR PKG_STD.TSTRING; -- Код цвета SFIELD PKG_STD.TSTRING; -- Код свойства документа (в формате "DP_<РЕГ_НОМЕР>")
SDATA_TYPE PKG_STD.TSTRING; -- Тип данных SCOLOR PKG_STD.TSTRING; -- Код цвета
SDP_NAME PKG_STD.TSTRING; -- Наименование свойства документа SDATA_TYPE PKG_STD.TSTRING; -- Тип данных
NFROM_VALUE PKG_STD.TNUMBER; -- Значение с (number) SDP_NAME PKG_STD.TSTRING; -- Наименование свойства документа
NTO_VALUE PKG_STD.TNUMBER; -- Значение по (number) NFROM_VALUE PKG_STD.TNUMBER; -- Значение с (number)
SFROM_VALUE PKG_STD.TSTRING; -- Значение с (string) NTO_VALUE PKG_STD.TNUMBER; -- Значение по (number)
STO_VALUE PKG_STD.TSTRING; -- Значение по (string) SFROM_VALUE PKG_STD.TSTRING; -- Значение с (string)
DFROM_VALUE PKG_STD.TLDATE; -- Значение с (date) STO_VALUE PKG_STD.TSTRING; -- Значение по (string)
DTO_VALUE PKG_STD.TLDATE; -- Значение по (date)
/* Считывание наименования свойства документа */ /* Считывание наименования свойства документа */
function DOCS_PROPS_NAME_GET function DOCS_PROPS_NAME_GET
@ -2287,19 +2306,22 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
NRN PKG_STD.TREF; -- Рег. номер свойства документа NRN PKG_STD.TREF; -- Рег. номер свойства документа
SRESULT PKG_STD.TSTRING; -- Наименование доп. свойства SRESULT PKG_STD.TSTRING; -- Наименование доп. свойства
begin begin
/* Определяем рег. номер свойства документа по формату "DP_<РЕГ_НОМЕР>" */ /* Если переданный код свойства соответствует формату */
NRN := TO_NUMBER(SUBSTR(SFIELD, INSTR(SFIELD, '_') + 1)); if (INSTR(SFIELD, 'DP_') <> 0) then
/* Считываем наименование из записи свойства документа */ /* Определяем рег. номер свойства документа по формату "DP_<РЕГ_НОМЕР>" */
begin NRN := TO_NUMBER(SUBSTR(SFIELD, INSTR(SFIELD, '_') + 1));
select T.NAME into SRESULT from DOCS_PROPS T where T.RN = NRN; /* Считываем наименование из записи свойства документа */
exception begin
when NO_DATA_FOUND then select T.NAME into SRESULT from DOCS_PROPS T where T.RN = NRN;
P_EXCEPTION(0, exception
'Ошибка считывания записи свойства документа с рег. номером (%s).'); when NO_DATA_FOUND then
when others then P_EXCEPTION(0,
P_EXCEPTION(0, 'Ошибка считывания записи свойства документа с рег. номером (%s).');
'Ошибка считывания наименования свойства документа с рег. номером (%s).'); when others then
end; P_EXCEPTION(0,
'Ошибка считывания наименования свойства документа с рег. номером (%s).');
end;
end if;
/* Возвращаем результат */ /* Возвращаем результат */
return SRESULT; return SRESULT;
end DOCS_PROPS_NAME_GET; end DOCS_PROPS_NAME_GET;
@ -2307,11 +2329,12 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
/* Считывание профиля пользователя для раздела "События" */ /* Считывание профиля пользователя для раздела "События" */
function USERPROFILES_GET function USERPROFILES_GET
( (
NCOMPANY in number, -- Рег. номер организации NCOMPANY in number, -- Рег. номер организации
SAUTHID in varchar2 -- Мнемокод пользователя SAPPCODE in varchar2, -- Код приложения
) return blob -- Профиль пользователя для раздела "События" SAUTHID in varchar2 -- Мнемокод пользователя
) return blob -- Профиль пользователя для раздела "События"
is is
BRESULT blob; -- Профиль пользователя для раздела "События" BRESULT blob; -- Профиль пользователя для раздела "События"
begin begin
/* Считываем профиль пользователя для раздела "События" */ /* Считываем профиль пользователя для раздела "События" */
begin begin
@ -2322,7 +2345,12 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
and U.AUTHID = SAUTHID and U.AUTHID = SAUTHID
and U.REC_TYPE = 1 and U.REC_TYPE = 1
and U.UNITMODE = 0 and U.UNITMODE = 0
and U.UNITCODE = SUNIT_CLNEVENTS; and U.UNITCODE = SUNIT_CLNEVENTS
and U.KIND = 2
and U.UNITFUNC is null
and U.REC_KEY is null
and U.SHOW_METHOD = 'main'
and U.APPCODE = SAPPCODE;
exception exception
when others then when others then
return null; return null;
@ -2332,7 +2360,7 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
end USERPROFILES_GET; end USERPROFILES_GET;
begin begin
/* Считываем профиль пользователя для раздела "События" */ /* Считываем профиль пользователя для раздела "События" */
BXML := USERPROFILES_GET(NCOMPANY => NCOMPANY, SAUTHID => SAUTHID); BXML := USERPROFILES_GET(NCOMPANY => NCOMPANY, SAPPCODE => SAPPCODE, SAUTHID => SAUTHID);
/* Проверим, что профиль не пустой */ /* Проверим, что профиль не пустой */
if (BXML is null) then if (BXML is null) then
return; return;
@ -2359,71 +2387,60 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
SFIELD := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'field'); SFIELD := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'field');
SCOLOR := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'color'); SCOLOR := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'color');
SDATA_TYPE := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'dataType'); SDATA_TYPE := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'dataType');
PKG_XFAST.DOWN_NODE(SNAME => 'XRULES');
/* Код правила */
PKG_XFAST.DOWN_NODE(SNAME => 'SFIELD');
PKG_XFAST.VALUE(SVALUE => SFIELD);
PKG_XFAST.UP();
/* Считываем наименование свойства документа */ /* Считываем наименование свойства документа */
SDP_NAME := DOCS_PROPS_NAME_GET(SFIELD => SFIELD); SDP_NAME := DOCS_PROPS_NAME_GET(SFIELD => SFIELD);
/* Наименование доп. свойства */ /* Если это правило по доп. свойству и типа "строка" или "число" */
PKG_XFAST.DOWN_NODE(SNAME => 'SDP_NAME'); if (SDP_NAME is not null) and (SDATA_TYPE in ('number', 'string')) then
PKG_XFAST.VALUE(SVALUE => SDP_NAME); PKG_XFAST.DOWN_NODE(SNAME => 'XRULES');
PKG_XFAST.UP(); /* Код правила */
/* Код цвета */ PKG_XFAST.DOWN_NODE(SNAME => 'SFIELD');
PKG_XFAST.DOWN_NODE(SNAME => 'SCOLOR'); PKG_XFAST.VALUE(SVALUE => SFIELD);
PKG_XFAST.VALUE(SVALUE => SCOLOR); PKG_XFAST.UP();
PKG_XFAST.UP(); /* Наименование доп. свойства */
/* Тип значения */ PKG_XFAST.DOWN_NODE(SNAME => 'SDP_NAME');
PKG_XFAST.DOWN_NODE(SNAME => 'STYPE'); PKG_XFAST.VALUE(SVALUE => SDP_NAME);
PKG_XFAST.VALUE(SVALUE => SDATA_TYPE); PKG_XFAST.UP();
PKG_XFAST.UP(); /* Код цвета */
/* Исходим от типа данных */ PKG_XFAST.DOWN_NODE(SNAME => 'SCOLOR');
case SDATA_TYPE PKG_XFAST.VALUE(SVALUE => SCOLOR);
/* Число */ PKG_XFAST.UP();
when 'number' then /* Тип значения */
NFROM_VALUE := PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE, PKG_XFAST.DOWN_NODE(SNAME => 'STYPE');
SPATTERN => 'fromValue')); PKG_XFAST.VALUE(SVALUE => SDATA_TYPE);
NTO_VALUE := PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE, PKG_XFAST.UP();
SPATTERN => 'toValue')); /* Исходим от типа данных */
/* Число с */ case SDATA_TYPE
PKG_XFAST.DOWN_NODE(SNAME => 'NFROM'); /* Число */
PKG_XFAST.VALUE(NVALUE => NFROM_VALUE); when 'number' then
PKG_XFAST.UP(); NFROM_VALUE := PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
/* Число по */ SPATTERN => 'fromValue'));
PKG_XFAST.DOWN_NODE(SNAME => 'NTO'); NTO_VALUE := PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
PKG_XFAST.VALUE(NVALUE => NTO_VALUE); SPATTERN => 'toValue'));
PKG_XFAST.UP(); /* Число с */
/* Строка */ PKG_XFAST.DOWN_NODE(SNAME => 'NFROM');
when 'string' then PKG_XFAST.VALUE(NVALUE => NFROM_VALUE);
SFROM_VALUE := PKG_XPATH.VALUE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE, PKG_XFAST.UP();
SPATTERN => 'fromValue')); /* Число по */
STO_VALUE := PKG_XPATH.VALUE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE, PKG_XFAST.DOWN_NODE(SNAME => 'NTO');
SPATTERN => 'toValue')); PKG_XFAST.VALUE(NVALUE => NTO_VALUE);
/* Строка с */ PKG_XFAST.UP();
PKG_XFAST.DOWN_NODE(SNAME => 'SFROM'); /* Строка */
PKG_XFAST.VALUE(SVALUE => SFROM_VALUE); when 'string' then
PKG_XFAST.UP(); SFROM_VALUE := PKG_XPATH.VALUE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
/* Строка по */ SPATTERN => 'value'));
PKG_XFAST.DOWN_NODE(SNAME => 'STO'); STO_VALUE := PKG_XPATH.VALUE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
PKG_XFAST.VALUE(SVALUE => STO_VALUE); SPATTERN => 'value'));
PKG_XFAST.UP(); /* Строка с */
/* Дата */ PKG_XFAST.DOWN_NODE(SNAME => 'SFROM');
else PKG_XFAST.VALUE(SVALUE => SFROM_VALUE);
DFROM_VALUE := PKG_XPATH.VALUE_DATE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE, PKG_XFAST.UP();
SPATTERN => 'fromValue')); /* Строка по */
DTO_VALUE := PKG_XPATH.VALUE_DATE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE, PKG_XFAST.DOWN_NODE(SNAME => 'STO');
SPATTERN => 'toValue')); PKG_XFAST.VALUE(SVALUE => STO_VALUE);
/* Дата с */ PKG_XFAST.UP();
PKG_XFAST.DOWN_NODE(SNAME => 'DFROM'); end case;
PKG_XFAST.VALUE(DVALUE => DFROM_VALUE); PKG_XFAST.UP();
PKG_XFAST.UP(); end if;
/* Дата по */
PKG_XFAST.DOWN_NODE(SNAME => 'DTO');
PKG_XFAST.VALUE(DVALUE => DTO_VALUE);
PKG_XFAST.UP();
end case;
PKG_XFAST.UP();
end loop; end loop;
PKG_XPATH.FREE(RDOCUMENT => RDOC); PKG_XPATH.FREE(RDOCUMENT => RDOC);
PKG_XFAST.UP(); PKG_XFAST.UP();

View File

@ -1067,11 +1067,11 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ''-'' || TRIM(T.DOC_NUMB) ||'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ''-'' || TRIM(T.DOC_NUMB) ||');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TO_CHAR(T.DOC_DATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_INFO,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TO_CHAR(T.DOC_DATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_INFO,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case T.DOC_STATE'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case T.DOC_STATE');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 0 then'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ' then');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Не отработан')); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Не отработан'));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 1 then'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' then');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как план')); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как план'));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 2 then'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 2) || ' then');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как факт')); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как факт'));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' null'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' null');
@ -1489,10 +1489,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' least(H.MIN_RESTPLAN,H.MIN_RESTFACT) NSALE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' least(H.MIN_RESTPLAN,H.MIN_RESTFACT) NSALE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' H.RESTFACT NRESTFACT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' H.RESTFACT NRESTFACT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' H.RESERV NRESERV,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' H.RESERV NRESERV,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case coalesce(GRP.NMEASTYPE, 0)'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case coalesce(GRP.NMEASTYPE, ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ')');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 0 then MU1.MEAS_MNEMO'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ' then MU1.MEAS_MNEMO');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 1 then MU2.MEAS_MNEMO'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' then MU2.MEAS_MNEMO');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 2 then MU3.MEAS_MNEMO'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 2) || ' then MU3.MEAS_MNEMO');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end SPRICEMEAS'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end SPRICEMEAS');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from GOODSPARTIES G,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from GOODSPARTIES G,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' NOMMODIF MF,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' NOMMODIF MF,');
@ -2094,7 +2094,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DREL_DATE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DREL_DATE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NREL_QUANT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NREL_QUANT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT_FACT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT_FACT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 3) else 0 end NPROCENT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ')');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 100) || ', ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 3) || ')');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end NPROCENT');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,');
@ -3328,7 +3331,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SDOC_INFO,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SDOC_INFO,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 2) else 0 end NPROCENT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ')');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 100) || ', ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 2) || ')');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end NPROCENT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NPRIOR_PARTY,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NPRIOR_PARTY,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SPROD_ORDER'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SPROD_ORDER');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
@ -3774,7 +3780,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SUBSTR(F_DOCSTATE_PLAN_FACT(T.DOC_STATE), 1, 20) SSTATE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SUBSTR(F_DOCSTATE_PLAN_FACT(T.DOC_STATE), ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ', ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 20) || ') SSTATE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE ||'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE ||');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TRIM(T.DOC_PREF) ||'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TRIM(T.DOC_PREF) ||');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ''-'' || TRIM(T.DOC_NUMB) ||'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ''-'' || TRIM(T.DOC_NUMB) ||');
@ -5910,7 +5916,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select IQ.RN NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select IQ.RN NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' IQ."NAME" SNAME,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' IQ."NAME" SNAME,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' I.CODE SSUBDIV,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' I.CODE SSUBDIV,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' COALESCE((select SUM(F_DICMUNTS_BASE_RECALC_QUANT(0,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' COALESCE((select SUM(F_DICMUNTS_BASE_RECALC_QUANT(' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ',');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.COMPANY,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.COMPANY,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JS.MUNIT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JS.MUNIT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case');
@ -5919,7 +5925,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when (JS.BEG_FACT < :DSYSDATE) then'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when (JS.BEG_FACT < :DSYSDATE) then');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JS.LABOUR_FACT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JS.LABOUR_FACT');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' 0'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NDICMUNTS))'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NDICMUNTS))');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP JS,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP JS,');
@ -5932,7 +5938,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and (((TRUNC(JS.BEG_PLAN) >= :DSYSDATE) and (TRUNC(JS.BEG_PLAN) <= :DDATE_TO))'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and (((TRUNC(JS.BEG_PLAN) >= :DSYSDATE) and (TRUNC(JS.BEG_PLAN) <= :DDATE_TO))');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' or ((JS.BEG_FACT < :DSYSDATE) and (TRUNC(JS.BEG_FACT) between :DDATE_FROM and :DDATE_TO)))'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' or ((JS.BEG_FACT < :DSYSDATE) and (TRUNC(JS.BEG_FACT) between :DDATE_FROM and :DDATE_TO)))');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK') || '(T.COMPANY, T.SUBDIV, :SUTILIZER, :NSUBDIV) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1)); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK') || '(T.COMPANY, T.SUBDIV, :SUTILIZER, :NSUBDIV) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = T.CRN)), 0) NLOAD'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = T.CRN)), ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ') NLOAD');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INS_DEPARTMENT I,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INS_DEPARTMENT I,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SUBDIVSEQ HEQ,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SUBDIVSEQ HEQ,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQCONFIG IQ'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQCONFIG IQ');
@ -6192,7 +6198,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NCOMPANY,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NCOMPANY,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SF.MUNIT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SF.MUNIT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SF.T_SHT_PLAN - SF.LABOUR_FACT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SF.T_SHT_PLAN - SF.LABOUR_FACT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NDICMUNTS_WD), 3) NREMN_LABOUR'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NDICMUNTS_WD), ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 3) || ') NREMN_LABOUR');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST F,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST F,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLSTSP SF,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLSTSP SF,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTSHTSP SH left outer join FCOPERTYPES FT on SH.OPER_TPS = FT.RN'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTSHTSP SH left outer join FCOPERTYPES FT on SH.OPER_TPS = FT.RN');
@ -7478,7 +7484,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN NQUANT_PLAN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN NQUANT_PLAN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' COALESCE((select COUNT(SP.RN)'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' COALESCE((select COUNT(SP.RN)');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSPAR SP'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSPAR SP');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN), 0) + 1 NRESOURCE_NUMB,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN), ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ') + ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NRESOURCE_NUMB,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.LABOUR_PLAN NLABOUR_PLAN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.LABOUR_PLAN NLABOUR_PLAN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select AG.AGNFAMILYNAME'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select AG.AGNFAMILYNAME');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNPSPFM C,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNPSPFM C,');

45
dist/p8-panels.js vendored

File diff suppressed because one or more lines are too long