БД: Панель "Финансы проекта" - графики, % готовности, переход к РНОПотр, подсказки для колонок (начало)

This commit is contained in:
Mikhail Chechnev 2023-10-21 04:05:01 +03:00
parent 13170ab591
commit 2fdd8b6e52

View File

@ -83,6 +83,12 @@ create or replace package PKG_P8PANELS_PROJECTS as
NRN in number -- Рег. номер проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
/* Получение % готовности проекта (по затратам) */
function GET_COST_READY
(
NRN in number -- Рег. номер проекта
) return number; -- % готовности
/* Список проектов */
procedure LIST
(
@ -94,6 +100,32 @@ create or replace package PKG_P8PANELS_PROJECTS as
COUT out clob -- Сериализованная таблица данных
);
/* График по данным проектов - "Топ проблем" */
procedure CHART_PROBLEMS
(
COUT out clob -- Сериализованный график
);
/* График по данным проектов - "Топ заказчиков" */
procedure CHART_CUSTOMERS
(
COUT out clob -- Сериализованный график
);
/* График по данным проектов - "Затраты на проекты" */
procedure CHART_FCCOSTNOTES
(
COUT out clob -- Сериализованный график
);
/* График по данным проектов - "Затраты на проекты" (подбор записей журнала затрат по точке графика) */
procedure CHART_FCCOSTNOTES_SELECT_COST
(
NYEAR in number, -- Год
NMONTH in number, -- Месяц
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
);
/* Отбор этапов проектов */
procedure STAGES_COND;
@ -164,7 +196,7 @@ create or replace package PKG_P8PANELS_PROJECTS as
/* Подбор записей журнала затрат этапа проекта */
procedure STAGES_SELECT_COST_FACT
(
NRN in number, -- Рег. номер этапа проекта (null - не отбирать по этапу)
NRN in number, -- Рег. номер этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
);
@ -174,6 +206,13 @@ create or replace package PKG_P8PANELS_PROJECTS as
NRN in number -- Рег. номер этапа проекта
) return number; -- Сумма фактических затрат
/* Подбор записей расходных накладных на отпуск потребителям этапа проекта */
procedure STAGES_SELECT_SUMM_REALIZ
(
NRN in number, -- Рег. номер этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
);
/* Получение суммы реализации этапа проекта */
function STAGES_GET_SUMM_REALIZ
(
@ -181,6 +220,12 @@ create or replace package PKG_P8PANELS_PROJECTS as
NFPDARTCL_REALIZ in number -- Рег. номер статьи калькуляции для реализации
) return number; -- Сумма реализации
/* Получение % готовности этапа проекта (по затратам) */
function STAGES_GET_COST_READY
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Сумма реализации
/* Список этапов */
procedure STAGES_LIST
(
@ -221,10 +266,11 @@ create or replace package PKG_P8PANELS_PROJECTS as
/* Получение списка статей этапа проекта */
procedure STAGE_ARTS_GET
(
NSTAGE in number, -- Рег. номер этапа проекта
NINC_COST in number := 0, -- Включить сведения о затратах (0 - нет, 1 - да)
NINC_CONTR in number := 0, -- Включить сведения о контрактации (0 - нет, 1 - да)
RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта
NSTAGE in number, -- Рег. номер этапа проекта
NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - брать все)
NINC_COST in number := 0, -- Включить сведения о затратах (0 - нет, 1 - да)
NINC_CONTR in number := 0, -- Включить сведения о контрактации (0 - нет, 1 - да)
RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта
);
/* Список статей калькуляции этапа проекта */
@ -337,10 +383,11 @@ end PKG_P8PANELS_PROJECTS;
create or replace package body PKG_P8PANELS_PROJECTS as
/* Константы - предопределённые значения */
SYES constant PKG_STD.TSTRING := 'Да'; -- Да
NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков
SFPDARTCL_REALIZ constant PKG_STD.TSTRING := '14 Цена без НДС'; -- Мнемокод статьи калькуляции для учёта реализации
NGANTT_TASK_CAPTION_LEN constant PKG_STD.TNUMBER := 50; -- Предельная длина метки задачи при отображении диаграммы Ганта
SYES constant PKG_STD.TSTRING := 'Да'; -- Да
NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков
SFPDARTCL_REALIZ constant PKG_STD.TSTRING := '14 Цена без НДС'; -- Мнемокод статьи калькуляции для учёта реализации
SFPDARTCL_SELF_COST constant PKG_STD.TSTRING := '10 Себестоимость'; -- Мнемокод статьи калькуляции для учёта себестоимости
NGANTT_TASK_CAPTION_LEN constant PKG_STD.TNUMBER := 50; -- Предельная длина (знаков) метки задачи при отображении диаграммы Ганта
/* Константы - дополнительные свойства */
SDP_SECON_RESP constant PKG_STD.TSTRING := 'ПУП.SECON_RESP'; -- Ответственный экономист проекта
@ -444,6 +491,27 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_ACT',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_ACT'));
end if;
/* Готовность (%, по затратам) */
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_COST_READY(RN) >= :EDCOST_READYFrom');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_COST_READY(RN) <= :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_COST_READY(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
end COND;
/* Получение рег. номера документа основания (договора) проекта */
@ -786,6 +854,50 @@ create or replace package body PKG_P8PANELS_PROJECTS as
end if;
end GET_CTRL_ACT;
/* Получение % готовности проекта (по затратам) */
function GET_COST_READY
(
NRN in number -- Рег. номер проекта
) return number -- % готовности
is
RP PROJECT%rowtype; -- Запись проекта
NFPDARTCL_SELF_COST PKG_STD.TREF; -- Рег. номер статьи себестоимости
NCOST_FACT PKG_STD.TNUMBER := 0; -- Сумма фактических затрат по проекту
NSELF_COST_PLAN PKG_STD.TNUMBER := 0; -- Плановая себестоимость проекта
RSTG_SELF_COST_PLAN TSTAGE_ARTS; -- Плановая себестоимость этапа
NRES PKG_STD.TNUMBER := 0; -- Буфер для результата
begin
/* Читаем проект */
RP := GET(NRN => NRN);
/* Определим рег. номер статьи калькуляции для учёта себестоимости */
FIND_FPDARTCL_CODE(NFLAG_SMART => 1,
NCOMPANY => RP.COMPANY,
SCODE => SFPDARTCL_SELF_COST,
NRN => NFPDARTCL_SELF_COST);
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = RP.RN)
loop
/* Накапливаем сумму фактических затрат */
NCOST_FACT := NCOST_FACT + STAGES_GET_COST_FACT(NRN => C.RN);
/* Накапливаем плановую себестоимость */
STAGE_ARTS_GET(NSTAGE => C.RN, NFPDARTCL => NFPDARTCL_SELF_COST, RSTAGE_ARTS => RSTG_SELF_COST_PLAN);
if ((RSTG_SELF_COST_PLAN.COUNT = 1) and (RSTG_SELF_COST_PLAN(RSTG_SELF_COST_PLAN.LAST).NPLAN <> 0)) then
NSELF_COST_PLAN := NSELF_COST_PLAN + RSTG_SELF_COST_PLAN(RSTG_SELF_COST_PLAN.LAST).NPLAN;
end if;
end loop;
/* Если есть и фактические затраты и плановая себестоимость */
if ((NCOST_FACT > 0) and (NSELF_COST_PLAN > 0)) then
/* Отношение фактических затрат к плановой себестоимость - искомый % готовности */
NRES := ROUND(NCOST_FACT / NSELF_COST_PLAN * 100, 0);
/* Если затраты превысили себестоимость, то % может быть > 100, но это бессмысленно, откорректируем ситуацию */
if (NRES > 100) then
NRES := 100;
end if;
end if;
/* Вернём рассчитанное */
return NRES;
end GET_COST_READY;
/* Список проектов */
procedure LIST
(
@ -974,23 +1086,31 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_FIN',
SCAPTION => 'Финансирование (исходящее)',
SCAPTION => 'Фин-е (исх.)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_FIN',
BORDER => true,
BFILTER => true,
RCOL_VALS => RCOL_VALS);
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Финансирование (исходящее)</b> - контроль оплаты счетов, выставленных соисполнителями в рамках проекта.<br>' ||
'<b style="color:red">Требует внимания</b> - в проекте есть этапы, для которых не все выставленные соисполнителями счета оплачены<br>' ||
'<b style="color:green">В норме</b> - нет этапов, с отклонениями, описанными выше<br>' ||
'<b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями.');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_CONTR',
SCAPTION => 'Контрактация',
SCAPTION => 'Контр-я',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_CONTR',
BORDER => true,
BFILTER => true,
RCOL_VALS => RCOL_VALS);
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Контрактация</b> - контроль суммы договоров, заключеных с соисполнителями в рамках проекта.<br>' ||
'<b style="color:red">Требует внимания</b> - в проекте есть этапы, для которых сумма договоров с соисполнителями превышает заложенные в калькуляцию плановые показатели<br>' ||
'<b style="color:green">В норме</b> - нет этапов, с отклонениями, описанными выше<br>' ||
'<b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для всех этапов заданы плановые калькуляции.');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_COEXEC',
SCAPTION => 'Соисполнители',
SCAPTION => 'Соисп-е',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_COEXEC',
BORDER => true,
@ -1014,12 +1134,20 @@ create or replace package body PKG_P8PANELS_PROJECTS as
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_ACT',
SCAPTION => 'Актирование',
SCAPTION => 'Актир-е',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_ACT',
BORDER => true,
BFILTER => true,
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCOST_READY',
SCAPTION => 'Готов (%, затраты)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCOST_READYFrom',
SCOND_TO => 'EDCOST_READYTo',
BORDER => true,
BFILTER => true);
/* Определим дополнительные свойства - ответственный экономист */
FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SDP_SECON_RESP, NRN => NECON_RESP_DP);
/* Обходим данные */
@ -1058,7 +1186,8 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC(P.RN) NCTRL_COEXEC,
PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD(P.RN) NCTRL_PERIOD,
PKG_P8PANELS_PROJECTS.GET_CTRL_COST(P.RN) NCTRL_COST,
PKG_P8PANELS_PROJECTS.GET_CTRL_ACT(P.RN) NCTRL_ACT
PKG_P8PANELS_PROJECTS.GET_CTRL_ACT(P.RN) NCTRL_ACT,
PKG_P8PANELS_PROJECTS.GET_COST_READY(P.RN) NCOST_READY
from PROJECT P,
PRJTYPE PT,
AGNLIST EC,
@ -1125,6 +1254,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 32);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@ -1236,6 +1366,10 @@ create or replace package body PKG_P8PANELS_PROJECTS as
SNAME => 'NCTRL_ACT',
ICURSOR => ICURSOR,
NPOSITION => 31);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NCOST_READY',
ICURSOR => ICURSOR,
NPOSITION => 32);
/* Добавляем строку в таблицу */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end loop;
@ -1250,6 +1384,272 @@ create or replace package body PKG_P8PANELS_PROJECTS as
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end LIST;
/* График по данным проектов - "Топ проблем" */
procedure CHART_PROBLEMS
(
COUT out clob -- Сериализованный график
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RCH PKG_P8PANELS_VISUAL.TCHART; -- График
RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных
RATTR_VALS PKG_P8PANELS_VISUAL.TCHART_DATASET_ITEM_ATTR_VALS; -- Атрибуты элемента набора данных
begin
/* Сформируем заголовок графика */
RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_BAR,
STITLE => 'Топ проблем',
SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_TOP);
/* Сформируем набор данных */
RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => 'Кол-во проектов с проблемой');
/* Строим список проблем по убыванию количества */
for C in (select D.SFILTER,
D.SNAME,
D.NCOUNT
from (select 'NCTRL_FIN' SFILTER,
'Финансирование' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_FIN(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_CONTR' SFILTER,
'Контрактация' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_COEXEC' SFILTER,
'Соисполнение' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_PERIOD' SFILTER,
'Сроки' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_COST' SFILTER,
'Затраты' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_COST(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_ACT' SFILTER,
'Актирование' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_ACT(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')) D
order by D.NCOUNT desc)
loop
/* Если проблема выявлена */
if (C.NCOUNT > 0) then
/* Добавим метку для проблемы */
PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => C.SNAME);
/* Добавим проблему в набор данных */
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER',
SVALUE => C.SFILTER,
BCLEAR => true);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER_VALUE',
SVALUE => '1');
PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => C.NCOUNT, RATTR_VALS => RATTR_VALS);
end if;
end loop;
/* Добавим набор данных в график */
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
end CHART_PROBLEMS;
/* График по данным проектов - "Топ заказчиков" */
procedure CHART_CUSTOMERS
(
COUT out clob -- Сериализованный график
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RCH PKG_P8PANELS_VISUAL.TCHART; -- График
RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных
RATTR_VALS PKG_P8PANELS_VISUAL.TCHART_DATASET_ITEM_ATTR_VALS; -- Атрибуты элемента набора данных
begin
/* Сформируем заголовок графика */
RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_PIE,
STITLE => 'Топ заказчиков',
SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_RIGHT);
/* Сформируем набор данных */
RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => 'Стоимость проектов');
/* Обходим проекты, сгруппированные по внешним заказчикам */
for C in (select D.SEXT_CUST,
D.NSUM
from (select EC.AGNABBR SEXT_CUST,
sum(P.COST_SUM_BASECURR) NSUM
from PROJECT P,
AGNLIST EC
where P.COMPANY = NCOMPANY
and P.EXT_CUST = EC.RN
group by EC.AGNABBR
order by 2 desc) D
where ROWNUM <= 5)
loop
/* Добавим метку для контрагента */
PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => C.SEXT_CUST);
/* Добавим контрагента в набор данных */
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER',
SVALUE => 'SEXT_CUST',
BCLEAR => true);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER_VALUE',
SVALUE => C.SEXT_CUST);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => C.NSUM, RATTR_VALS => RATTR_VALS);
end loop;
/* Добавим набор данных в график */
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
end CHART_CUSTOMERS;
/* График по данным проектов - "Затраты на проекты" */
procedure CHART_FCCOSTNOTES
(
COUT out clob -- Сериализованный график
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RCH PKG_P8PANELS_VISUAL.TCHART; -- График
RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных
RATTR_VALS PKG_P8PANELS_VISUAL.TCHART_DATASET_ITEM_ATTR_VALS; -- Атрибуты элемента набора данных
NYEAR PKG_STD.TNUMBER; -- Текущий год
NSUM PKG_STD.TNUMBER; -- Сумма затрат в текущем месяце
begin
NYEAR := TO_NUMBER(TO_CHAR(sysdate, 'yyyy'));
/* Сформируем заголовок графика */
RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_LINE,
STITLE => 'Затраты на проекты в ' || TO_CHAR(NYEAR) || ' году',
SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_TOP);
/* Сформируем набор данных */
RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => 'Сумма затрат (тыс. руб.)');
/* Обходим месяцы года */
for I in 1 .. 12
loop
/* Суммируем затраты этого месяца, отнесённые на проекты */
select COALESCE(sum(CN.COST_BSUM) / 1000, 0)
into NSUM
from FCCOSTNOTES CN
where CN.COMPANY = NCOMPANY
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'mm')) = I
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'yyyy')) = NYEAR
and exists (select null from V_USERPRIV UP where UP.CATALOG = CN.CRN)
and CN.PROD_ORDER in (select PS.FACEACC
from PROJECTSTAGE PS
where PS.COMPANY = CN.COMPANY
and exists (select null from V_USERPRIV UP where UP.CATALOG = PS.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = PS.JUR_PERS
and UP.UNITCODE = 'Projects'));
/* Добавим метку для месяца */
PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => F_GET_MONTH(NVALUE => I));
/* Добавим месяц в набор данных */
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SUNITCODE',
SVALUE => 'CostNotes',
BCLEAR => true);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NYEAR', SVALUE => NYEAR);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NMONTH', SVALUE => I);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => NSUM, RATTR_VALS => RATTR_VALS);
end loop;
/* Добавим набор данных в график */
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
end CHART_FCCOSTNOTES;
/* График по данным проектов - "Затраты на проекты" (подбор записей журнала затрат по точке графика) */
procedure CHART_FCCOSTNOTES_SELECT_COST
(
NYEAR in number, -- Год
NMONTH in number, -- Месяц
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
begin
/* Подберём записи журнала затрат */
for C in (select CN.COMPANY,
CN.RN
from FCCOSTNOTES CN
where CN.COMPANY = NCOMPANY
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'mm')) = NMONTH
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'yyyy')) = NYEAR
and exists
(select null from V_USERPRIV UP where UP.CATALOG = CN.CRN)
and CN.PROD_ORDER in (select PS.FACEACC
from PROJECTSTAGE PS
where PS.COMPANY = CN.COMPANY
and exists (select null from V_USERPRIV UP where UP.CATALOG = PS.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = PS.JUR_PERS
and UP.UNITCODE = 'Projects')))
loop
/* Сформируем идентификатор буфера */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
NCOMPANY => C.COMPANY,
NDOCUMENT => C.RN,
SUNITCODE => 'CostNotes',
SACTIONCODE => null,
NCRN => null,
NDOCUMENT1 => null,
SUNITCODE1 => null,
SACTIONCODE1 => null,
NRN => NSELECTLIST);
end loop;
end CHART_FCCOSTNOTES_SELECT_COST;
/* Считывание записи этапа проекта */
function STAGES_GET
(
@ -1323,6 +1723,27 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_ACT',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_ACT'));
end if;
/* Готовность (%, по затратам) */
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(RN) >= :EDCOST_READYFrom');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(RN) <= :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
end STAGES_COND;
/* Подбор платежей финансирования этапа проекта */
@ -1690,7 +2111,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
/* Подбор записей журнала затрат этапа проекта */
procedure STAGES_SELECT_COST_FACT
(
NRN in number, -- Рег. номер этапа проекта (null - не отбирать по этапу)
NRN in number, -- Рег. номер этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
@ -1708,6 +2129,69 @@ create or replace package body PKG_P8PANELS_PROJECTS as
return STAGE_ARTS_GET_COST_FACT(NSTAGE => NRN, NFINFLOW_TYPE => 2);
end STAGES_GET_COST_FACT;
/* Подбор записей расходных накладных на отпуск потребителям этапа проекта */
procedure STAGES_SELECT_SUMM_REALIZ
(
NRN in number, -- Рег. номер этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
RSTG PROJECTSTAGE%rowtype; -- Запись этапа
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
begin
/* Читаем этап */
RSTG := STAGES_GET(NRN => NRN);
/* Подберём расходные накладные на отпуск потребителям */
for C in (select T.COMPANY,
T.RN
from TRANSINVCUST T
where T.STATUS = 1
and T.COMPANY = RSTG.COMPANY
and T.FACEACC = RSTG.FACEACCCUST
and exists (select TC.RN
from TRANSINVCUSTSPECS TS,
TRINVCUSTCLC TC
where TS.PRN = T.RN
and TC.PRN = TS.RN
and TC.FACEACCOUNT = RSTG.FACEACC
and exists (select null from V_USERPRIV UP where UP.CATALOG = RSTG.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = RSTG.JUR_PERS
and UP.UNITCODE = 'Projects'))
and exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */
null
from USERPRIV UP
where UP.CATALOG = T.CRN
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_CATALOG_AUTHID) */
null
from USERPRIV UP
where UP.CATALOG = T.CRN
and UP.AUTHID = UTILIZER))
loop
/* Сформируем идентификатор буфера */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
NCOMPANY => C.COMPANY,
NDOCUMENT => C.RN,
SUNITCODE => 'GoodsTransInvoicesToConsumers',
SACTIONCODE => null,
NCRN => null,
NDOCUMENT1 => null,
SUNITCODE1 => null,
SACTIONCODE1 => null,
NRN => NSELECTLIST);
end loop;
end STAGES_SELECT_SUMM_REALIZ;
/* Получение суммы реализации этапа проекта */
function STAGES_GET_SUMM_REALIZ
(
@ -1723,6 +2207,42 @@ create or replace package body PKG_P8PANELS_PROJECTS as
end if;
end STAGES_GET_SUMM_REALIZ;
/* Получение % готовности этапа проекта (по затратам) */
function STAGES_GET_COST_READY
(
NRN in number -- Рег. номер этапа проекта
) return number -- % готовности
is
RSTG PROJECTSTAGE%rowtype; -- Запись этапа
NFPDARTCL_SELF_COST PKG_STD.TREF; -- Рег. номер статьи себестоимости
NCOST_FACT PKG_STD.TNUMBER; -- Сумма фактических затрат
RSELF_COST_PLAN TSTAGE_ARTS; -- Плановая себестоимость
NRES PKG_STD.TNUMBER := 0; -- Буфер для результата
begin
/* Читаем этап */
RSTG := STAGES_GET(NRN => NRN);
/* Определим рег. номер статьи калькуляции для учёта себестоимости */
FIND_FPDARTCL_CODE(NFLAG_SMART => 1,
NCOMPANY => RSTG.COMPANY,
SCODE => SFPDARTCL_SELF_COST,
NRN => NFPDARTCL_SELF_COST);
/* Опеределим сумму фактических затрат */
NCOST_FACT := STAGES_GET_COST_FACT(NRN => RSTG.RN);
/* Определим плановую себестоимость */
STAGE_ARTS_GET(NSTAGE => RSTG.RN, NFPDARTCL => NFPDARTCL_SELF_COST, RSTAGE_ARTS => RSELF_COST_PLAN);
/* Если есть и фактические затраты и найдена плановая себестоимость */
if ((NCOST_FACT > 0) and (RSELF_COST_PLAN.COUNT = 1) and (RSELF_COST_PLAN(RSELF_COST_PLAN.LAST).NPLAN <> 0)) then
/* Отношение фактических затрат к плановой себестоимость - искомый % готовности */
NRES := ROUND(NCOST_FACT / RSELF_COST_PLAN(RSELF_COST_PLAN.LAST).NPLAN * 100, 0);
/* Если затраты превысили себестоимость, то % может быть > 100, но это бессмысленно, откорректируем ситуацию */
if (NRES > 100) then
NRES := 100;
end if;
end if;
/* Вернём рассчитанное */
return NRES;
end STAGES_GET_COST_READY;
/* Список этапов */
procedure STAGES_LIST
(
@ -1869,7 +2389,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_FIN',
SCAPTION => 'Финансирование (исходящее)',
SCAPTION => 'Фин-е (исх.)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_FIN',
BORDER => true,
@ -1877,7 +2397,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_CONTR',
SCAPTION => 'Контрактация',
SCAPTION => 'Контр-я',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_CONTR',
BORDER => true,
@ -1885,7 +2405,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_COEXEC',
SCAPTION => 'Соисполнители',
SCAPTION => 'Соисп-е',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_COEXEC',
BORDER => true,
@ -1924,6 +2444,16 @@ create or replace package body PKG_P8PANELS_PROJECTS as
SCAPTION => 'Сумма реализации',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SLNK_UNIT_NSUMM_REALIZ',
SCAPTION => 'Сумма реализации (код раздела ссылки)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NLNK_DOCUMENT_NSUMM_REALIZ',
SCAPTION => 'Сумма реализации (документ ссылки)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NSUMM_INCOME',
SCAPTION => 'Сумма прибыли',
@ -1944,12 +2474,20 @@ create or replace package body PKG_P8PANELS_PROJECTS as
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_ACT',
SCAPTION => 'Актирование',
SCAPTION => 'Актир-е',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_ACT',
BORDER => true,
BFILTER => true,
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCOST_READY',
SCAPTION => 'Готов (%, затраты)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCOST_READYFrom',
SCOND_TO => 'EDCOST_READYTo',
BORDER => true,
BFILTER => true);
/* Обходим данные */
begin
/* Собираем запрос */
@ -1981,8 +2519,11 @@ create or replace package body PKG_P8PANELS_PROJECTS as
''CostNotes'' SLNK_UNIT_NCOST_FACT,
1 NLNK_DOCUMENT_NCOST_FACT,
PKG_P8PANELS_PROJECTS.STAGES_GET_SUMM_REALIZ(PS.RN, :NFPDARTCL_REALIZ) NSUMM_REALIZ,
''GoodsTransInvoicesToConsumers'' SLNK_UNIT_NSUMM_REALIZ,
1 NLNK_DOCUMENT_NSUMM_REALIZ,
PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST(PS.RN) NCTRL_COST,
PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT(PS.RN) NCTRL_ACT
PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT(PS.RN) NCTRL_ACT,
PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(PS.RN) NCOST_READY
from PROJECTSTAGE PS,
PROJECT P,
FACEACC FAC,
@ -2038,8 +2579,11 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 23);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 24);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 25);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 26);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 26);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 27);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 28);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@ -2131,16 +2675,28 @@ create or replace package body PKG_P8PANELS_PROJECTS as
NINCOME_PRC := NSUMM_INCOME / NCOST_FACT * 100;
end if;
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUMM_REALIZ', NVALUE => NSUMM_REALIZ);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SLNK_UNIT_NSUMM_REALIZ',
ICURSOR => ICURSOR,
NPOSITION => 26);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NLNK_DOCUMENT_NSUMM_REALIZ',
ICURSOR => ICURSOR,
NPOSITION => 27);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUMM_INCOME', NVALUE => NSUMM_INCOME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NINCOME_PRC', NVALUE => NINCOME_PRC);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NCTRL_COST',
ICURSOR => ICURSOR,
NPOSITION => 26);
NPOSITION => 28);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NCTRL_ACT',
ICURSOR => ICURSOR,
NPOSITION => 27);
NPOSITION => 29);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NCOST_READY',
ICURSOR => ICURSOR,
NPOSITION => 30);
/* Добавляем строку в таблицу */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end loop;
@ -2290,9 +2846,9 @@ create or replace package body PKG_P8PANELS_PROJECTS as
begin
/* Считаем запись этапа */
begin
select PS.* into RSTG from PROJECTSTAGE PS where PS.RN = NSTAGE;
RSTG := STAGES_GET(NRN => NSTAGE);
exception
when NO_DATA_FOUND then
when others then
null;
end;
/* Если считано успешно - будем искать данные */
@ -2331,6 +2887,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
procedure STAGE_ARTS_GET
(
NSTAGE in number, -- Рег. номер этапа проекта
NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - брать все)
NINC_COST in number := 0, -- Включить сведения о затратах (0 - нет, 1 - да)
NINC_CONTR in number := 0, -- Включить сведения о контрактации (0 - нет, 1 - да)
RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта
@ -2369,6 +2926,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
and CSP.SIGN_ACT = 1
and CSPA.PRN = CSP.RN
and CSPA.COST_ARTICLE = A.RN
and ((NFPDARTCL is null) or ((NFPDARTCL is not null) and (A.RN = NFPDARTCL)))
and exists (select null from V_USERPRIV UP where UP.CATALOG = PS.CRN)
and exists (select null from V_USERPRIV UP where UP.JUR_PERS = PS.JUR_PERS and UP.UNITCODE = 'Projects')
and exists (select null from V_USERPRIV UP where UP.CATALOG = CS.CRN)
@ -3147,7 +3705,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_FIN',
SCAPTION => 'Финансирование (исходящее)',
SCAPTION => 'Фин-е (исх.)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_FIN',
BORDER => false,