From 2fdd8b6e5240f0e1cb9d080dce7ff55b1a85af1f Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sat, 21 Oct 2023 04:05:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=20"=D0=A4=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0"=20-=20=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D0=B8,=20%=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8,=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=85=D0=BE=D0=B4=20=D0=BA=20=D0=A0=D0=9D=D0=9E=D0=9F=D0=BE?= =?UTF-8?q?=D1=82=D1=80,=20=D0=BF=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=D0=BE=D0=BA=20(=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_PROJECTS.pck | 618 +++++++++++++++++++++++++++++++++-- 1 file changed, 588 insertions(+), 30 deletions(-) diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index ae8f1de..2e14eae 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -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 => 'Финансирование (исходящее) - контроль оплаты счетов, выставленных соисполнителями в рамках проекта.
' || + 'Требует внимания - в проекте есть этапы, для которых не все выставленные соисполнителями счета оплачены
' || + 'В норме - нет этапов, с отклонениями, описанными выше
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями.'); 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 => 'Контрактация - контроль суммы договоров, заключеных с соисполнителями в рамках проекта.
' || + 'Требует внимания - в проекте есть этапы, для которых сумма договоров с соисполнителями превышает заложенные в калькуляцию плановые показатели
' || + 'В норме - нет этапов, с отклонениями, описанными выше
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для всех этапов заданы плановые калькуляции.'); 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 ( @@ -1292,7 +1692,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN(RN) = :EDCTRL_FIN'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_FIN', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_FIN')); - end if; + end if; /* Контроль контрактации */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_CONTR') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR(RN) = :EDCTRL_CONTR'); @@ -1322,7 +1722,28 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT(RN) = :EDCTRL_ACT'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_ACT', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_ACT')); - end if; + 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, @@ -1923,6 +2443,16 @@ create or replace package body PKG_P8PANELS_PROJECTS as SNAME => '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 => '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', @@ -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,