БД: Панель "Работы проектов" - контроль прав доступа в мониторе ресурсов и детализации
This commit is contained in:
parent
52c6cb126c
commit
b16922360f
@ -3,6 +3,10 @@ create or replace package PKG_P8PANELS_BASE as
|
||||
/*Константы - Типовой постфикс тега для массива (при переводе XML -> JSON) */
|
||||
SXML_ALWAYS_ARRAY_POSTFIX constant PKG_STD.TSTRING := '__SYSTEM__ARRAY__';
|
||||
|
||||
/* Константы - признаки наличия доступа */
|
||||
NACCESS_YES constant number(1) := 1; -- Доступ есть
|
||||
NACCESS_NO constant number(1) := 0; -- Доступа нет
|
||||
|
||||
/* Конвертация строки в число */
|
||||
function UTL_S2N
|
||||
(
|
||||
@ -15,6 +19,14 @@ create or replace package PKG_P8PANELS_BASE as
|
||||
SVALUE in varchar2 -- Конвертируемое строковое значение
|
||||
) return date; -- Конвертированная дата
|
||||
|
||||
/* Проверка доступности документа */
|
||||
function UTL_DOC_ACCESS_CHECK
|
||||
(
|
||||
NCOMPANY in number, -- Рег. номер организации
|
||||
SUNIT_CODE in varchar2, -- Код раздела
|
||||
NDOCUMENT in number -- Рег. номер документа
|
||||
) return number; -- Флаг доступности (см. константы NACCESS_*)
|
||||
|
||||
/* Базовое исполнение действий */
|
||||
procedure PROCESS
|
||||
(
|
||||
@ -132,6 +144,53 @@ create or replace package body PKG_P8PANELS_BASE as
|
||||
P_EXCEPTION(0, 'Неверный формат даты (%s).', SVALUE);
|
||||
end UTL_S2D;
|
||||
|
||||
/* Проверка доступности документа */
|
||||
function UTL_DOC_ACCESS_CHECK
|
||||
(
|
||||
NCOMPANY in number, -- Рег. номер организации
|
||||
SUNIT_CODE in varchar2, -- Код раздела
|
||||
NDOCUMENT in number -- Рег. номер документа
|
||||
) return number -- Флаг доступности (см. константы NACCESS_*)
|
||||
is
|
||||
NRES PKG_STD.TNUMBER; -- Буфер для результата
|
||||
NVERSION PKG_STD.TREF; -- Рег. номер версии
|
||||
NCATALOG PKG_STD.TREF; -- Рег. номер каталога
|
||||
NJUR_PERS PKG_STD.TREF; -- Рег. номер юридической принадлежности
|
||||
NHIERARCHY PKG_STD.TREF; -- Рег. номер ирерархии
|
||||
BTMP boolean; -- Буфер для расчетов
|
||||
NTMP PKG_STD.TNUMBER; -- Буфер для расчетов
|
||||
begin
|
||||
/* Считаем стандартную атрибутику */
|
||||
PKG_DOCUMENT.GET_ATTRS(NFLAG_SMART => 0,
|
||||
SUNITCODE => SUNIT_CODE,
|
||||
NDOCUMENT => NDOCUMENT,
|
||||
BFOUND => BTMP,
|
||||
NCOMPANY => NTMP,
|
||||
NVERSION => NVERSION,
|
||||
NCATALOG => NCATALOG,
|
||||
NJUR_PERS => NJUR_PERS,
|
||||
NHIERARCHY => NHIERARCHY);
|
||||
/* Проверким доступ */
|
||||
PKG_ENV.SMART_ACCESS(NCOMPANY => NCOMPANY,
|
||||
NVERSION => NVERSION,
|
||||
NCATALOG => NCATALOG,
|
||||
NJUR_PERS => NJUR_PERS,
|
||||
NHIERARCHY => NHIERARCHY,
|
||||
SUNIT => SUNIT_CODE,
|
||||
SACTION => null,
|
||||
NRESULT => NRES);
|
||||
/* Вернём результат */
|
||||
if (NRES = 1) then
|
||||
return NACCESS_YES;
|
||||
else
|
||||
return NACCESS_NO;
|
||||
end if;
|
||||
exception
|
||||
/* В случае ошибки - доступ закрыт */
|
||||
when others then
|
||||
return NACCESS_NO;
|
||||
end UTL_DOC_ACCESS_CHECK;
|
||||
|
||||
/* Формирование сообщения об отсутствии значения */
|
||||
function MSG_NO_DATA_MAKE
|
||||
(
|
||||
|
@ -459,15 +459,10 @@ end PKG_P8PANELS_PROJECTS;
|
||||
/
|
||||
create or replace package body PKG_P8PANELS_PROJECTS as
|
||||
|
||||
/*
|
||||
TODO: owner="root" created="25.10.2023"
|
||||
text="Права доступа в мониторе ресурвов при балансировке планов-графиков"
|
||||
*/
|
||||
|
||||
/*
|
||||
TODO: owner="root" created="25.10.2023"
|
||||
text="Проверить, что для расчётных полей дата-гридов отключена сортировка - иначе получается ошибка, т.к. поля нет в SQL-запросе"
|
||||
*/
|
||||
/*
|
||||
TODO: owner="root" created="25.10.2023"
|
||||
text="Проверить, что для расчётных полей дата-гридов отключена сортировка - иначе получается ошибка, т.к. поля нет в SQL-запросе"
|
||||
*/
|
||||
|
||||
/* Константы - предопределённые значения */
|
||||
SYES constant PKG_STD.TSTRING := 'Да'; -- Да
|
||||
@ -5102,7 +5097,9 @@ text="Проверить, что для расчётных полей дата-
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.RN = FMH.PRN');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((FMH.DO_ACT_FROM between :DDATE_FROM and :DDATE_TO) or (FMH.DO_ACT_TO between :DDATE_FROM and :DDATE_TO) or');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((FMH.DO_ACT_FROM < :DDATE_FROM) and (COALESCE(FMH.DO_ACT_TO, :DDATE_TO + 1) > :DDATE_TO)))');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FMH.SCHEDULE = SH.RN %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FMH.SCHEDULE = SH.RN');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_BASE.UTL_DOC_ACCESS_CHECK') ||'(FM.COMPANY, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'ClientPostPerform') || ', FM.RN) = 1');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
|
||||
/* Учтём сортировки */
|
||||
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
|
||||
@ -5356,7 +5353,10 @@ text="Проверить, что для расчётных полей дата-
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PROJECTJOBMANPOW = PJMP.RN');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.PRN = PJ.RN');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = T.CRN)');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = T.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'ProjectDepartmentPlans') || ')');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
|
||||
/* Учтём сортировки */
|
||||
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
|
||||
@ -5653,7 +5653,10 @@ text="Проверить, что для расчётных полей дата-
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.SUBDIV = :NINS_DEPARTMENT');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((JB.DATE_FROM between :DDATE_FROM and :DDATE_TO) or (JB.DATE_TO between :DDATE_FROM and :DDATE_TO) or');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO))) %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO)))');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = P.CRN)');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Projects') || ')');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
|
||||
/* Учтём сортировки */
|
||||
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
|
||||
@ -5928,6 +5931,46 @@ text="Проверить, что для расчётных полей дата-
|
||||
and JB.SOURCE = J.RN
|
||||
and J.RN = JMP.PRN
|
||||
and JMP.SUBDIV is not null
|
||||
and exists (select null from V_USERPRIV UP where UP.CATALOG = J.CRN)
|
||||
and exists (select null
|
||||
from V_USERPRIV UP
|
||||
where UP.JUR_PERS = J.JUR_PERS
|
||||
and UP.UNITCODE = 'Projects')
|
||||
and exists (select null
|
||||
from UNITLIST UL
|
||||
where UL.UNITCODE = 'INS_DEPARTMENT'
|
||||
and UL.CHECK_ACCESS_HIER = 0
|
||||
and exists (select /*+ INDEX(UP I_USERPRIV_COMPANY_ROLEID) */
|
||||
null
|
||||
from USERPRIV UP
|
||||
where UP.COMPANY = JMP.COMPANY
|
||||
and UP.UNITCODE = 'INS_DEPARTMENT'
|
||||
and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */
|
||||
UR.ROLEID
|
||||
from USERROLES UR
|
||||
where UR.AUTHID = UTILIZER)
|
||||
union all
|
||||
select /*+ INDEX(UP I_USERPRIV_COMPANY_AUTHID) */
|
||||
null
|
||||
from USERPRIV UP
|
||||
where UP.COMPANY = JMP.COMPANY
|
||||
and UP.UNITCODE = 'INS_DEPARTMENT'
|
||||
and UP.AUTHID = UTILIZER)
|
||||
union all
|
||||
select /*+ INDEX(UP I_USERPRIV_HIERARCHY_ROLEID) */
|
||||
null
|
||||
from USERPRIV UP
|
||||
where UP.HIERARCHY = JMP.SUBDIV
|
||||
and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */
|
||||
UR.ROLEID
|
||||
from USERROLES UR
|
||||
where UR.AUTHID = UTILIZER)
|
||||
union all
|
||||
select /*+ INDEX(UP I_USERPRIV_HIERARCHY_AUTHID) */
|
||||
null
|
||||
from USERPRIV UP
|
||||
where UP.HIERARCHY = JMP.SUBDIV
|
||||
and UP.AUTHID = UTILIZER)
|
||||
group by JMP.FCMANPOWER,
|
||||
JMP.SUBDIV)
|
||||
loop
|
||||
@ -6069,7 +6112,9 @@ text="Проверить, что для расчётных полей дата-
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMANPOWER MP');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.IDENT = :NIDENT');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.INS_DEPARTMENT = INSD.RN');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.FCMANPOWER = MP.RN %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.FCMANPOWER = MP.RN');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_BASE.UTL_DOC_ACCESS_CHECK') ||'(INSD.COMPANY, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'INS_DEPARTMENT') || ', INSD.RN) = 1');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
|
||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
|
||||
/* Учтём сортировки */
|
||||
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
|
||||
@ -6302,7 +6347,12 @@ text="Проверить, что для расчётных полей дата-
|
||||
ENPERIOD ENP
|
||||
where T.COMPANY = NCOMPANY
|
||||
and T.STATE = 2
|
||||
and T.PERIOD = ENP.RN;
|
||||
and T.PERIOD = ENP.RN
|
||||
and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN)
|
||||
and exists (select null
|
||||
from V_USERPRIV UP
|
||||
where UP.JUR_PERS = T.JUR_PERS
|
||||
and UP.UNITCODE = 'ProjectDepartmentPlans');
|
||||
else
|
||||
DFACT := LAST_DAY(TRUNC(DFACT, 'mm'));
|
||||
end if;
|
||||
|
Loading…
x
Reference in New Issue
Block a user