2023-09-24 22:25:19 +03:00
create or replace package PKG_P8PANELS_PROJECTS as
2023-09-25 00:26:59 +03:00
/* Типы данных - статьи этапа проекта */
2023-09-24 22:25:19 +03:00
type TSTAGE_ART is record
(
2023-09-25 00:26:59 +03:00
NRN FPDARTCL . RN % type , -- Р е г . номер статьи
SCODE FPDARTCL . CODE % type , -- Код статьи
SNAME FPDARTCL . NAME % type , -- Наименование статьи
NPLAN PKG_STD . TNUMBER , -- Плановое значение по статье
NCOST_FACT PKG_STD . TNUMBER , -- Фактические затраты (null - не подлежит контролю затрат)
NCOST_DIFF PKG_STD . TNUMBER , -- Отклонение по затратам (null - не подлежит контролю затрат)
NCTRL_COST PKG_STD . TNUMBER , -- Контроль затрат (null - не подлежит контролю затрат, 0 - без отклонений, 1 - есть отклонения)
NCONTR PKG_STD . TNUMBER , -- Законтрактовано (null - не подлежит контролю контрактации)
NCONTR_LEFT PKG_STD . TNUMBER , -- Остаток к контрактации (null - не подлежит контролю контрактации)
NCTRL_CONTR PKG_STD . TNUMBER -- Контроль контрактации (null - не подлежит контролю контрактации, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Типы данных - коллекция статей этапа проекта */
2024-03-15 17:02:56 +03:00
type TSTAGE_ARTS is table of TSTAGE_ART ;
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Отбор проектов */
2023-09-24 22:25:19 +03:00
procedure COND ;
2023-09-25 00:26:59 +03:00
/* Получение р е г . номера документа основания (договора) проекта */
2023-09-24 22:25:19 +03:00
function GET_DOC_OSN_LNK_DOCUMENT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Р е г . номер документа основания (договора)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Подбор платежей финансирования проекта */
2023-09-24 22:25:19 +03:00
procedure SELECT_FIN
(
2023-09-25 00:26:59 +03:00
NRN in number , -- Р е г . номер проекта
NDIRECTION in number , -- Направление (0 - приход, 1 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Получение суммы входящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_IN
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Сумма входящего финансирования проекта
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение суммы исходящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_OUT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Сумма исходяшего финансирования проекта
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_FIN
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния контрактации проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_CONTR
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния соисполнения проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COEXEC
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния сроков проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_PERIOD
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния затрат проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COST
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния актирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_ACT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-10-21 04:05:01 +03:00
/* Получение % готовности проекта (по затратам) */
function GET_COST_READY
(
NRN in number -- Р е г . номер проекта
) return number ; -- % готовности
2023-09-25 00:26:59 +03:00
/* Список проектов */
2023-09-24 22:25:19 +03:00
procedure LIST
(
2023-09-25 00:26:59 +03:00
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CFILTERS in clob , -- Фильтры
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
) ;
2024-02-03 01:29:39 +03:00
/* Сфодный график проектов */
procedure GRAPH
(
COUT out clob -- График проектов
) ;
2023-10-21 04:05:01 +03:00
/* График по данным проектов - "Топ проблем" */
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 - не найдено)
) ;
2023-09-25 00:26:59 +03:00
/* Отбор этапов проектов */
2023-09-24 22:25:19 +03:00
procedure STAGES_COND ;
2023-09-25 00:26:59 +03:00
/* Подбор платежей финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGES_SELECT_FIN
(
2023-09-25 00:26:59 +03:00
NPRN in number : = null , -- Р е г . номер проекта (null - не отбирать по проекту)
NRN in number : = null , -- Р е г . номер этапа проекта (null - не отбирать по этапу)
NDIRECTION in number , -- Направление (0 - приход, 1 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Получение суммы входящего финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_FIN_IN
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Сумма входящего финансирования проекта
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение суммы исходящего финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_FIN_OUT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Сумма исходяшего финансирования проекта
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_FIN
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
2023-09-29 12:46:24 +03:00
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния контрактации этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_CONTR
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния соисполнения этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COEXEC
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
2023-09-30 02:33:21 +03:00
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния сроков этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_PERIOD
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния затрат этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COST
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение состояния актирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_ACT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
2023-09-30 02:33:21 +03:00
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение остатка срока исполнения этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_DAYS_LEFT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Количество дней (null - не определено)
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Подбор записей журнала затрат этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGES_SELECT_COST_FACT
(
2023-10-21 04:05:01 +03:00
NRN in number , -- Р е г . номер этапа проекта
2023-09-25 00:26:59 +03:00
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Получение суммы фактических затрат этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_COST_FACT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Сумма фактических затрат
2023-09-24 22:25:19 +03:00
2023-10-21 04:05:01 +03:00
/* Подбор записей расходных накладных на отпуск потребителям этапа проекта */
procedure STAGES_SELECT_SUMM_REALIZ
(
NRN in number , -- Р е г . номер этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
) ;
2023-09-25 00:26:59 +03:00
/* Получение суммы реализации этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_SUMM_REALIZ
(
2023-09-25 00:26:59 +03:00
NRN in number , -- Р е г . номер этапа проекта
NFPDARTCL_REALIZ in number -- Р е г . номер статьи калькуляции для реализации
) return number ; -- Сумма реализации
2023-09-24 22:25:19 +03:00
2023-10-21 04:05:01 +03:00
/* Получение % готовности этапа проекта (по затратам) */
function STAGES_GET_COST_READY
(
NRN in number -- Р е г . номер этапа проекта
) return number ; -- Сумма реализации
2023-09-25 00:26:59 +03:00
/* Список этапов */
2023-09-24 22:25:19 +03:00
procedure STAGES_LIST
(
2023-09-25 00:26:59 +03:00
NPRN in number , -- Р е г . номер проекта
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CFILTERS in clob , -- Фильтры
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Подбор записей журнала затрат по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_COST_FACT
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NFPDARTCL in number : = null , -- Р е г . номер статьи затрат (null - по всем)
NFINFLOW_TYPE in number : = null , -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Получение суммы-факт по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGE_ARTS_GET_COST_FACT
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NFPDARTCL in number : = null , -- Р е г . номер статьи калькуляции (null - по всем)
NFINFLOW_TYPE in number : = null -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход)
) return number ; -- Сумма-факт по статье
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Подбор записей договоров с соисполнителями по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_CONTR
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NFPDARTCL in number : = null , -- Р е г . номер статьи затрат (null - по всем)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Получение списка статей этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_GET
(
2023-10-21 04:05:01 +03:00
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 -- Список статей этапа проекта
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Список статей калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_LIST
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
CFILTERS in clob , -- Фильтры
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Список договоров этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_CONTRACTS_COND ;
2023-09-29 12:46:24 +03:00
/* Подбор входящих счетов на оплату соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_PAY_IN
(
NPROJECTSTAGEPF in number , -- Р е г . номер соисполнителя этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
) ;
2023-09-30 02:33:21 +03:00
/* Подбор приходных накладных соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_ININV
(
NPROJECTSTAGEPF in number , -- Р е г . номер соисполнителя этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
) ;
2023-09-29 12:46:24 +03:00
/* Подбор платежей финансирования соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_FIN_OUT
(
NPROJECTSTAGEPF in number , -- Р е г . номер соисполнителя этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
) ;
/* Получение состояния финансирования по договору соисполнителя этапа проекта */
function STAGE_CONTRACTS_GET_CTRL_FIN
(
NPROJECTSTAGEPF in number -- Р е г . номер соисполнителя этапа проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-30 02:33:21 +03:00
/* Получение состояния соисполнения по договору соисполнителя этапа проекта */
function STAGE_CONTRACTS_GET_CTRL_COEXE
(
NPROJECTSTAGEPF in number -- Р е г . номер соисполнителя этапа проекта
) return number ; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-29 12:46:24 +03:00
/* Получение сведений по договору соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_GET
(
NPROJECTSTAGEPF in number , -- Р е г . номер соисполнителя этапа проекта
2023-09-30 02:33:21 +03:00
NINC_FIN in number : = 0 , -- Включить сведения о финансировании (0 - нет, 1 - да)
NINC_COEXEC in number : = 0 , -- Включить сведения о соисполнении (0 - нет, 1 - да)
2023-09-29 12:46:24 +03:00
NPAY_IN out number , -- Сведения о финансировании - сумма акцептованных счетов на оплату
NFIN_OUT out number , -- Сведения о финансировании - сумма оплаченных счетов на оплату
NPAY_IN_REST out number , -- Сведения о финансировании - сумма оставшихся к оплате счетов на оплату
2023-09-30 02:33:21 +03:00
NFIN_REST out number , -- Сведения о финансировании - общий остаток к оплате по договору
NCTRL_FIN out number , -- Сведения о финансировании - состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
NCOEXEC_IN out number , -- Сведения о соисполнении - получено актов/накладных
NCOEXEC_REST out number , -- Сведения о соисполнении - остаток к актированию/поставке
NCTRL_COEXEC out number -- Сведения о соисполнении - состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-29 12:46:24 +03:00
) ;
2023-09-25 00:26:59 +03:00
/* Список договоров этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_CONTRACTS_LIST
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CFILTERS in clob , -- Фильтры
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
) ;
2023-10-14 00:30:55 +03:00
/* Получение списка проектов */
procedure JB_PRJCTS_LIST
(
NIDENT in number , -- Идентификатор процесса
COUT out clob -- Список проектов
) ;
2023-10-25 19:01:38 +03:00
/* Изменение сроков работы в буфере балансировки */
procedure JB_JOBS_MODIFY_PERIOD
(
NJB_JOBS in number , -- Р е г . номер записи балансируемой работы/этапа
DDATE_FROM in date , -- Новая дата начала
DDATE_TO in date , -- Новая дата окончания
2024-01-22 19:17:52 +03:00
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли)
2023-10-25 19:01:38 +03:00
) ;
2023-10-14 00:30:55 +03:00
/* Получение списка работ проектов для диаграммы Ганта */
procedure JB_JOBS_LIST
(
NIDENT in number , -- Идентификатор процесса
NPRN in number , -- Р е г . номер родителя
NINCLUDE_DEF in number , -- Признак включения описания диаграммы в ответ
COUT out clob -- Список проектов
) ;
2023-10-25 19:01:38 +03:00
/* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */
2024-04-19 21:46:31 +03:00
procedure JB_PERIODS_PLAN_FOT_LIST
2023-10-25 19:01:38 +03:00
(
NJB_PERIODS in number , -- Р е г . номер записи периода в буфере балансировки
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
) ;
2024-04-19 21:46:31 +03:00
/* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */
procedure JB_PERIODS_FACT_RPT_LIST
2023-10-25 19:01:38 +03:00
(
NJB_PERIODS in number , -- Р е г . номер записи периода в буфере балансировки
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
) ;
2024-04-19 21:46:31 +03:00
/* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */
procedure JB_PERIODS_PLAN_JOBS_LIST
2024-04-11 19:07:39 +03:00
(
NJB_PERIODS in number , -- Р е г . номер записи периода в буфере балансировки
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
) ;
2023-10-25 19:01:38 +03:00
/* Пересчёт периодов балансировки */
procedure JB_PERIODS_RECALC
(
NIDENT in number , -- Идентификатор процесса
NINITIAL in number , -- Признак первоначального рассчёта (0 - пересчёт, 1 - первоначальный рассчёт)
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
) ;
/* Список периодов балансировки */
procedure JB_PERIODS_LIST
(
NIDENT in number , -- Идентификатор процесса
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
) ;
2023-10-14 00:30:55 +03:00
/* Очистка данных балансировки */
procedure JB_CLEAN
(
2024-01-22 19:17:52 +03:00
NIDENT in number -- Идентификатор процесса
) ;
/* Перенос данных буфера балансировки в проекты */
procedure JB_SAVE
(
NIDENT in number , -- Идентификатор процесса
COUT out clob -- Список проектов
2023-10-14 00:30:55 +03:00
) ;
/* Формирование исходных данных для балансировки планов-графиков работ */
procedure JB_INIT
(
2024-04-19 21:46:31 +03:00
DBEGIN in out date , -- Дата начала периода мониторинга загрузки ресурсов
DFACT in out date , -- Факт по состоянию на
NDURATION_MEAS out number , -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
SDURATION_MEAS out varchar2 , -- Единица измерения длительности (мнемокод)
NLAB_MEAS out number , -- Единица измерения трудоёмкости
SLAB_MEAS out varchar2 , -- Единица измерения трудоёмкости (мнемокод)
NIDENT in out number , -- Идентификатор процесса (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
2023-10-14 00:30:55 +03:00
) ;
2023-09-24 22:25:19 +03:00
end PKG_P8PANELS_PROJECTS ;
/
create or replace package body PKG_P8PANELS_PROJECTS as
2023-09-25 00:26:59 +03:00
/* Константы - предопределённые значения */
2024-04-22 23:13:04 +03:00
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 ; -- Предельная длина (знаков) метки задачи при отображении диаграммы Ганта
NJB_DURATION_MEAS constant PKG_STD . TNUMBER : = 0 ; -- Единица измерения длительности по умолчанию для интерфейса балансировки работ (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
SJB_LAB_MEAS constant PKG_STD . TSTRING : = ' Ч/Ч ' ; -- Единица измерения трудоёмкости по умолчанию для интерфейса балансировки работ
SLAB_MEAS_HOURS constant PKG_STD . TSTRING : = ' Ч/Ч ' ; -- Единица измерения трудоёмкости в человеко/часах
2023-09-24 22:25:19 +03:00
2023-10-02 20:22:59 +03:00
/* Константы - дополнительные свойства */
2024-04-22 23:13:04 +03:00
SDP_SECON_RESP constant PKG_STD . TSTRING : = ' ПУП.SECON_RESP ' ; -- Ответственный экономист проекта
SDP_STAX_GROUP constant PKG_STD . TSTRING : = ' ПУП.TAX_GROUP ' ; -- Налоговая группа проекта
SDP_SCTL_COST constant PKG_STD . TSTRING : = ' ПУП.CTL_COST ' ; -- Принзнак необходимости контроля факт. затрат по статье калькуляции
SDP_SCTL_CONTR constant PKG_STD . TSTRING : = ' ПУП.CTL_CONTR ' ; -- Принзнак необходимости контроля контрактации по статье калькуляции
2023-10-14 00:30:55 +03:00
/* Считывание наименование подразделения по р е г . номеру */
function UTL_INS_DEPARTMENT_GET_NAME
(
NRN in number -- Р е г . номер подразделения
) return varchar2 -- Наименование подразеления (null - если не нашли)
is
SRES PKG_STD . TSTRING ; -- Буфер для результата
begin
select T . NAME into SRES from INS_DEPARTMENT T where T . RN = NRN ;
return SRES ;
exception
when NO_DATA_FOUND then
return null ;
end UTL_INS_DEPARTMENT_GET_NAME ;
2023-09-25 00:26:59 +03:00
/* Считывание записи проекта */
2023-09-24 22:25:19 +03:00
function GET
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return PROJECT % rowtype -- Запись проекта
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
RRES PROJECT % rowtype ; -- Буфер для результата
2023-09-24 22:25:19 +03:00
begin
select P . * into RRES from PROJECT P where P . RN = NRN ;
return RRES ;
exception
when NO_DATA_FOUND then
PKG_MSG . RECORD_NOT_FOUND ( NFLAG_SMART = > 0 , NDOCUMENT = > NRN , SUNIT_TABLE = > ' PROJECT ' ) ;
end GET ;
2024-01-22 19:17:52 +03:00
/* Проверка пользователя на ответственность за проект */
function CHECK_RESPONSIBLE
(
NRN in number , -- Р е г . номер проекта
SAUTHID in varchar2 -- Имя пользователя
) return number -- Признак ответственности за проект (0 - не ответственный, 1 - ответственный)
is
RP PROJECT % rowtype ; -- Запись проекта
NRES PKG_STD . TNUMBER : = 0 ; -- Буфер для результата
NAUTHID_AGENT PKG_STD . TREF ; -- Р е г . номер контрагента пользователя
begin
/* Считаем проект */
RP : = GET ( NRN = > NRN ) ;
/* Найдем контрагента, соответствующего текущему пользователю */
FIND_AGNLIST_AUTHID ( NFLAG_OPTION = > 1 , NCOMPANY = > RP . COMPANY , SPERS_AUTHID = > SAUTHID , NAGENT = > NAUTHID_AGENT ) ;
/* Проверим ответственность */
if ( RP . RESPONSIBLE = NAUTHID_AGENT ) then
NRES : = 1 ;
end if ;
/* Вернём результат */
return NRES ;
exception
when others then
return NRES ;
end CHECK_RESPONSIBLE ;
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Отбор проектов */
2023-09-24 22:25:19 +03:00
procedure COND
as
begin
2023-09-25 00:26:59 +03:00
/* Установка главной таблицы */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . SET_TABLE ( STABLE_NAME = > ' PROJECT ' ) ;
2023-09-25 00:26:59 +03:00
/* Тип проекта */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' CODE ' ,
SCONDITION_NAME = > ' EDPROJECTTYPE ' ,
SJOINS = > ' PRJTYPE <- RN;PRJTYPE ' ) ;
2023-09-25 00:26:59 +03:00
/* Мнемокод */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' CODE ' , SCONDITION_NAME = > ' EDMNEMO ' ) ;
2023-09-25 00:26:59 +03:00
/* Наименование */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' NAME ' , SCONDITION_NAME = > ' EDNAME ' ) ;
2023-09-25 00:26:59 +03:00
/* Услованое наименование */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' NAME_USL ' , SCONDITION_NAME = > ' EDNAME_USL ' ) ;
2023-09-25 00:26:59 +03:00
/* Дата начала план */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_BETWEEN ( SCOLUMN_NAME = > ' BEGPLAN ' ,
SCONDITION_NAME_FROM = > ' EDPLANBEGFrom ' ,
SCONDITION_NAME_TO = > ' EDPLANBEGTo ' ) ;
2023-09-25 00:26:59 +03:00
/* Дата окончания план */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_BETWEEN ( SCOLUMN_NAME = > ' ENDPLAN ' ,
SCONDITION_NAME_FROM = > ' EDPLANENDFrom ' ,
SCONDITION_NAME_TO = > ' EDPLANENDTo ' ) ;
2023-09-25 00:26:59 +03:00
/* Состояние */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_ENUM ( SCOLUMN_NAME = > ' STATE ' , SCONDITION_NAME = > ' CGSTATE ' ) ;
2023-09-25 00:26:59 +03:00
/* Заказчик */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' AGNABBR ' ,
SCONDITION_NAME = > ' EDEXT_CUST ' ,
SJOINS = > ' EXT_CUST <- RN;AGNLIST ' ) ;
2023-09-25 00:26:59 +03:00
/* Контроль финансирования */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_FIN ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_FIN ' ) | |
' (RN) = :EDCTRL_FIN ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_FIN ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_FIN ' ) ) ;
2024-03-15 17:02:56 +03:00
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль контрактации */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_CONTR ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR ' ) | |
' (RN) = :EDCTRL_CONTR ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_CONTR ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_CONTR ' ) ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль соисполнения */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_COEXEC ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC ' ) | |
' (RN) = :EDCTRL_COEXEC ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_COEXEC ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_COEXEC ' ) ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль сроков */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_PERIOD ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD ' ) | |
' (RN) = :EDCTRL_PERIOD ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_PERIOD ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_PERIOD ' ) ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль затрат */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_COST ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_COST ' ) | |
' (RN) = :EDCTRL_COST ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_COST ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_COST ' ) ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль актирования */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_ACT ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_ACT ' ) | |
' (RN) = :EDCTRL_ACT ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_ACT ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_ACT ' ) ) ;
end if ;
2023-10-21 04:05:01 +03:00
/* Готовность (%, по затратам) */
if ( ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCOST_READYFrom ' ) = 1 ) and
( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCOST_READYTo ' ) = 0 ) ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_COST_READY ' ) | |
' (RN) >= :EDCOST_READYFrom ' ) ;
2023-10-21 04:05:01 +03:00
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
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_COST_READY ' ) | |
' (RN) <= :EDCOST_READYTo ' ) ;
2023-10-21 04:05:01 +03:00
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
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_COST_READY ' ) | |
' (RN) between :EDCOST_READYFrom and :EDCOST_READYTo ' ) ;
2023-10-21 04:05:01 +03:00
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 ' ) ) ;
2024-03-15 17:02:56 +03:00
end if ;
2023-09-24 22:25:19 +03:00
end COND ;
2023-09-25 00:26:59 +03:00
/* Получение р е г . номера документа основания (договора) проекта */
2023-09-24 22:25:19 +03:00
function GET_DOC_OSN_LNK_DOCUMENT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Р е г . номер документа основания (договора)
2023-09-24 22:25:19 +03:00
is
begin
2023-09-25 00:26:59 +03:00
/* Подберём договор с заказчиком по ЛС этапа проекта */
2023-09-24 22:25:19 +03:00
for C in ( select CN . RN
from PROJECTSTAGE PS ,
STAGES S ,
CONTRACTS CN
where PS . PRN = NRN
and PS . FACEACCCUST = S . FACEACC
and S . PRN = CN . RN
2023-10-02 20:22:59 +03:00
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 /* + INDEX(UP I_USERPRIV_CATALOG_ROLEID) */
null
from USERPRIV UP
where UP . CATALOG = CN . 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 = CN . CRN
and UP . AUTHID = UTILIZER )
and exists ( select /* + INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
null
from USERPRIV UP
where UP . JUR_PERS = CN . JUR_PERS
and UP . UNITCODE = ' Contracts '
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_JUR_PERS_AUTHID) */
null
from USERPRIV UP
where UP . JUR_PERS = CN . JUR_PERS
and UP . UNITCODE = ' Contracts '
and UP . AUTHID = UTILIZER )
2023-09-24 22:25:19 +03:00
group by CN . RN )
loop
2023-09-25 00:26:59 +03:00
/* Вернём первый найденный */
2023-09-24 22:25:19 +03:00
return C . RN ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Ничего не нашли */
2023-09-24 22:25:19 +03:00
return null ;
end GET_DOC_OSN_LNK_DOCUMENT ;
2023-09-25 00:26:59 +03:00
/* Подбор платежей финансирования проекта */
2023-09-24 22:25:19 +03:00
procedure SELECT_FIN
(
2024-03-15 17:02:56 +03:00
NRN in number , -- Р е г . номер проекта
NDIRECTION in number , -- Направление (0 - приход, 1 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
)
is
begin
2023-09-25 00:26:59 +03:00
/* Подберём платежи */
2023-09-24 22:25:19 +03:00
STAGES_SELECT_FIN ( NPRN = > NRN , NDIRECTION = > NDIRECTION , NIDENT = > NIDENT ) ;
end SELECT_FIN ;
2023-09-25 00:26:59 +03:00
/* Получение суммы входящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_IN
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Сумма входящего финансирования проекта
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
NRES PKG_STD . TNUMBER : = 0 ; -- Буфер для результата
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы и считаем */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
NRES : = NRES + STAGES_GET_FIN_IN ( NRN = > C . RN ) ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Возвращаем результат */
2023-09-24 22:25:19 +03:00
return NRES ;
end GET_FIN_IN ;
2023-09-25 00:26:59 +03:00
/* Получение суммы исходящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_OUT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Сумма исходяшего финансирования проекта
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
NRES PKG_STD . TNUMBER : = 0 ; -- Буфер для результата
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы и считаем */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
NRES : = NRES + STAGES_GET_FIN_OUT ( NRN = > C . RN ) ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Возвращаем результат */
2023-09-24 22:25:19 +03:00
return NRES ;
end GET_FIN_OUT ;
2023-09-25 00:26:59 +03:00
/* Получение состояния финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_FIN
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NSTAGE_CTRL PKG_STD . TNUMBER ; -- Состояние этапа
NCNT_STAGES PKG_STD . TNUMBER : = 0 ; -- Количество этапов
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" этапов
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
2023-09-29 12:46:24 +03:00
/* Увеличим счётчик этапов */
NCNT_STAGES : = NCNT_STAGES + 1 ;
/* Получим состояние этапа */
NSTAGE_CTRL : = STAGES_GET_CTRL_FIN ( NRN = > C . RN ) ;
/* Подсчитаем количество "безконтрольных" */
if ( NSTAGE_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-29 12:46:24 +03:00
if ( NSTAGE_CTRL = 1 ) then
2023-09-24 22:25:19 +03:00
return 1 ;
end if ;
end loop ;
2023-09-29 12:46:24 +03:00
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
if ( NCNT_NULL = NCNT_STAGES ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-29 12:46:24 +03:00
if ( NCNT_STAGES > 0 ) then
2023-09-24 22:25:19 +03:00
return 0 ;
else
2023-09-29 12:46:24 +03:00
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end GET_CTRL_FIN ;
2023-09-25 00:26:59 +03:00
/* Получение состояния контрактации проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_CONTR
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NSTAGE_CTRL PKG_STD . TNUMBER ; -- Состояние этапа
NCNT_STAGES PKG_STD . TNUMBER : = 0 ; -- Количество этапов
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" этапов
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
2023-09-25 00:26:59 +03:00
/* Увеличим счётчик этапов */
2023-09-24 22:25:19 +03:00
NCNT_STAGES : = NCNT_STAGES + 1 ;
2023-09-25 00:26:59 +03:00
/* Получим состояние этапа */
2023-09-24 22:25:19 +03:00
NSTAGE_CTRL : = STAGES_GET_CTRL_CONTR ( NRN = > C . RN ) ;
2023-09-25 00:26:59 +03:00
/* Подсчитаем количество "безконтрольных" */
2023-09-24 22:25:19 +03:00
if ( NSTAGE_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-24 22:25:19 +03:00
if ( NSTAGE_CTRL = 1 ) then
return 1 ;
end if ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
2023-09-24 22:25:19 +03:00
if ( NCNT_NULL = NCNT_STAGES ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
if ( NCNT_STAGES > 0 ) then
return 0 ;
else
2023-09-25 00:26:59 +03:00
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end GET_CTRL_CONTR ;
2023-09-25 00:26:59 +03:00
/* Получение состояния соисполнения проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COEXEC
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NSTAGE_CTRL PKG_STD . TNUMBER ; -- Состояние этапа
NCNT_STAGES PKG_STD . TNUMBER : = 0 ; -- Количество этапов
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" этапов
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
2023-09-30 02:33:21 +03:00
/* Увеличим счётчик этапов */
NCNT_STAGES : = NCNT_STAGES + 1 ;
/* Получим состояние этапа */
NSTAGE_CTRL : = STAGES_GET_CTRL_COEXEC ( NRN = > C . RN ) ;
/* Подсчитаем количество "безконтрольных" */
if ( NSTAGE_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-30 02:33:21 +03:00
if ( NSTAGE_CTRL = 1 ) then
2023-09-24 22:25:19 +03:00
return 1 ;
end if ;
end loop ;
2023-09-30 02:33:21 +03:00
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
if ( NCNT_NULL = NCNT_STAGES ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-30 02:33:21 +03:00
if ( NCNT_STAGES > 0 ) then
2023-09-24 22:25:19 +03:00
return 0 ;
else
2023-09-30 02:33:21 +03:00
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end GET_CTRL_COEXEC ;
2023-09-25 00:26:59 +03:00
/* Получение состояния сроков проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_PERIOD
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NSTAGE_CTRL PKG_STD . TNUMBER ; -- Состояние этапа
NCNT_STAGES PKG_STD . TNUMBER : = 0 ; -- Количество этапов
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" этапов
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
2023-09-25 00:26:59 +03:00
/* Увеличим счётчик этапов */
2023-09-24 22:25:19 +03:00
NCNT_STAGES : = NCNT_STAGES + 1 ;
2023-09-25 00:26:59 +03:00
/* Получим состояние этапа */
2023-09-24 22:25:19 +03:00
NSTAGE_CTRL : = STAGES_GET_CTRL_PERIOD ( NRN = > C . RN ) ;
2023-09-25 00:26:59 +03:00
/* Подсчитаем количество "безконтрольных" */
2023-09-24 22:25:19 +03:00
if ( NSTAGE_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-24 22:25:19 +03:00
if ( NSTAGE_CTRL = 1 ) then
return 1 ;
end if ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
2023-09-24 22:25:19 +03:00
if ( NCNT_NULL = NCNT_STAGES ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
if ( NCNT_STAGES > 0 ) then
return 0 ;
else
2023-09-25 00:26:59 +03:00
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end GET_CTRL_PERIOD ;
2023-09-25 00:26:59 +03:00
/* Получение состояния затрат проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COST
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NSTAGE_CTRL PKG_STD . TNUMBER ; -- Состояние этапа
NCNT_STAGES PKG_STD . TNUMBER : = 0 ; -- Количество этапов
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" этапов
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
2023-09-25 00:26:59 +03:00
/* Увеличим счётчик этапов */
2023-09-24 22:25:19 +03:00
NCNT_STAGES : = NCNT_STAGES + 1 ;
2023-09-25 00:26:59 +03:00
/* Получим состояние этапа */
2023-09-24 22:25:19 +03:00
NSTAGE_CTRL : = STAGES_GET_CTRL_COST ( NRN = > C . RN ) ;
2023-09-25 00:26:59 +03:00
/* Подсчитаем количество "безконтрольных" */
2023-09-24 22:25:19 +03:00
if ( NSTAGE_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-24 22:25:19 +03:00
if ( NSTAGE_CTRL = 1 ) then
return 1 ;
end if ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
2023-09-24 22:25:19 +03:00
if ( NCNT_NULL = NCNT_STAGES ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
if ( NCNT_STAGES > 0 ) then
return 0 ;
else
2023-09-25 00:26:59 +03:00
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end GET_CTRL_COST ;
2023-09-25 00:26:59 +03:00
/* Получение состояния актирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_ACT
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NSTAGE_CTRL PKG_STD . TNUMBER ; -- Состояние этапа
NCNT_STAGES PKG_STD . TNUMBER : = 0 ; -- Количество этапов
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" этапов
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Обходим этапы */
2023-09-24 22:25:19 +03:00
for C in ( select PS . RN from PROJECTSTAGE PS where PS . PRN = NRN )
loop
2023-09-30 02:33:21 +03:00
/* Увеличим счётчик этапов */
NCNT_STAGES : = NCNT_STAGES + 1 ;
/* Получим состояние этапа */
NSTAGE_CTRL : = STAGES_GET_CTRL_ACT ( NRN = > C . RN ) ;
/* Подсчитаем количество "безконтрольных" */
if ( NSTAGE_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-30 02:33:21 +03:00
if ( NSTAGE_CTRL = 1 ) then
2023-09-24 22:25:19 +03:00
return 1 ;
end if ;
end loop ;
2023-09-30 02:33:21 +03:00
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
if ( NCNT_NULL = NCNT_STAGES ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-30 02:33:21 +03:00
if ( NCNT_STAGES > 0 ) then
2023-09-24 22:25:19 +03:00
return 0 ;
else
2023-09-30 02:33:21 +03:00
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end GET_CTRL_ACT ;
2023-10-21 04:05:01 +03:00
/* Получение % готовности проекта (по затратам) */
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 ;
2023-09-25 00:26:59 +03:00
/* Список проектов */
2023-09-24 22:25:19 +03:00
procedure LIST
(
2023-09-25 00:26:59 +03:00
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CFILTERS in clob , -- Фильтры
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
)
is
2023-09-25 00:26:59 +03:00
NCOMPANY PKG_STD . TREF : = GET_SESSION_COMPANY ( ) ; -- Организация сеанса
NIDENT PKG_STD . TREF : = GEN_IDENT ( ) ; -- Идентификатор отбора
RF PKG_P8PANELS_VISUAL . TFILTERS ; -- Фильтры
RO PKG_P8PANELS_VISUAL . TORDERS ; -- Сортировки
RDG PKG_P8PANELS_VISUAL . TDATA_GRID ; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL . TROW ; -- Строка таблицы
RCOL_VALS PKG_P8PANELS_VISUAL . TCOL_VALS ; -- Предопределённые значения столбцов
NROW_FROM PKG_STD . TREF ; -- Номер строки с
NROW_TO PKG_STD . TREF ; -- Номер строки по
CSQL clob ; -- Буфер для запроса
ICURSOR integer ; -- К у р с о р для исполнения запроса
NECON_RESP_DP PKG_STD . TREF ; -- Р е г . номер ДС "Ответственный экономист"
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Читаем фильтры */
2023-09-24 22:25:19 +03:00
RF : = PKG_P8PANELS_VISUAL . TFILTERS_FROM_XML ( CFILTERS = > CFILTERS ) ;
2024-04-19 21:46:31 +03:00
/* Читаем сортировки */
2023-09-24 22:25:19 +03:00
RO : = PKG_P8PANELS_VISUAL . TORDERS_FROM_XML ( CORDERS = > CORDERS ) ;
2023-09-25 00:26:59 +03:00
/* Преобразуем номер и размер страницы в номер строк с и по */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . UTL_ROWS_LIMITS_CALC ( NPAGE_NUMBER = > NPAGE_NUMBER ,
NPAGE_SIZE = > NPAGE_SIZE ,
NROW_FROM = > NROW_FROM ,
NROW_TO = > NROW_TO ) ;
2023-09-25 00:26:59 +03:00
/* Инициализируем таблицу данных */
2023-09-24 22:25:19 +03:00
RDG : = PKG_P8PANELS_VISUAL . TDATA_GRID_MAKE ( ) ;
2023-09-25 00:26:59 +03:00
/* Добавляем в таблицу описание колонок */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NRN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Р е г . номер' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SCODE ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Код ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' EDMNEMO ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SNAME ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Наименование ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' EDNAME ' ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SNAME_USL ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Условное наименование ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' EDNAME_USL ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SEXPECTED_RES ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Ожидаемые результаты ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SPRJTYPE ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Тип ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' EDPROJECTTYPE ' ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SEXT_CUST ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Заказчик ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' EDEXT_CUST ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SGOVCNTRID ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' ИГК ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SDOC_OSN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Документ-основание ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SLNK_UNIT_SDOC_OSN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Документ-основание (код раздела ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NLNK_DOCUMENT_SDOC_OSN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Документ-основание (документ ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SSUBDIV_RESP ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Подразделение-исполнитель ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SRESPONSIBLE ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Ответственный исполнитель ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SECON_RESP ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Ответственный экономист ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 0 , BCLEAR = > true ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 1 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 2 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 3 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 4 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 5 ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NSTATE ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Состояние ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' CGSTATE ' ,
BORDER = > true ,
BFILTER = > true ,
RCOL_VALS = > RCOL_VALS ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' DBEGPLAN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Дата начала ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_DATE ,
SCOND_FROM = > ' EDPLANBEGFrom ' ,
SCOND_TO = > ' EDPLANBEGTo ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' DENDPLAN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Дата окончания ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_DATE ,
SCOND_FROM = > ' EDPLANENDFrom ' ,
SCOND_TO = > ' EDPLANENDTo ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCOST_SUM ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Стоимость ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SCURNAMES ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Валюта ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NFIN_IN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Входящее финансирование ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SLNK_UNIT_NFIN_IN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Входящее финансирование (код раздела ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NLNK_DOCUMENT_NFIN_IN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Входящее финансирование (документ ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NFIN_OUT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Исходящее финансирование ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SLNK_UNIT_NFIN_OUT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Исходящее финансирование (код раздела ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NLNK_DOCUMENT_NFIN_OUT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Исходящее финансирование (документ ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 0 , BCLEAR = > true ) ;
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 ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Фин-е (исх.) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_FIN ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-21 04:05:01 +03:00
RCOL_VALS = > RCOL_VALS ,
SHINT = > ' <b>Финансирование (исходящее)</b> - контроль оплаты счетов, выставленных соисполнителями в рамках проекта.<br> ' | |
2023-10-23 21:18:04 +03:00
' <b style="color:red">Требует внимания</b> - в проекте есть этапы, для которых не все выставленные соисполнителями счета оплачены.<br> ' | |
' <b style="color:green">В норме</b> - нет этапов с отклонениями, описанными выше.<br> ' | |
2023-10-21 04:05:01 +03:00
' <b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_CONTR ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Контр-я ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_CONTR ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-21 04:05:01 +03:00
RCOL_VALS = > RCOL_VALS ,
SHINT = > ' <b>Контрактация</b> - контроль суммы договоров, заключеных с соисполнителями в рамках проекта.<br> ' | |
2023-10-23 21:18:04 +03:00
' <b style="color:red">Требует внимания</b> - в проекте есть этапы, для которых сумма договоров с соисполнителями превышает заложенные в калькуляцию плановые показатели.<br> ' | |
' <b style="color:green">В норме</b> - нет этапов с отклонениями, описанными выше.<br> ' | |
2023-10-21 04:05:01 +03:00
' <b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для всех этапов заданы плановые калькуляции. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_COEXEC ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Соисп-е ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_COEXEC ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
RCOL_VALS = > RCOL_VALS ,
SHINT = > ' <b>Соисполнение</b> - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках проекта.<br> ' | |
2024-03-15 17:02:56 +03:00
' <b style="color:red">Требует внимания</b> - в проекте есть этапы, до окончания которых осталось менее ' | |
TO_CHAR ( NDAYS_LEFT_LIMIT ) | |
2023-10-23 21:18:04 +03:00
' дней, при этом зафиксирован положительный остаток к поставке/актированию по договорам соисполнителей данного этапа.<br> ' | |
' <b style="color:green">В норме</b> - нет этапов с отклонениями, описанными выше.<br> ' | |
' <b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями и плановые сроки окончания. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_PERIOD ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Сроки ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_PERIOD ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
RCOL_VALS = > RCOL_VALS ,
SHINT = > ' <b>Сроки</b> - контроль сроков исполнения работ по проекту.<br> ' | |
2024-03-15 17:02:56 +03:00
' <b style="color:red">Требует внимания</b> - в проекте есть этапы, до окончания которых осталось менее ' | |
TO_CHAR ( NDAYS_LEFT_LIMIT ) | | ' дней.<br> ' | |
2023-10-23 21:18:04 +03:00
' <b style="color:green">В норме</b> - нет этапов с отклонениями, описанными выше.<br> ' | |
' <b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов заданы плановые сроки окончания. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_COST ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Затраты ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_COST ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
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> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана действующая калькуляция с указанием плановых значений по статьям, подлежащим контролю. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_ACT ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Актир-е ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_ACT ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
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> - в Системе не хватает данных для рассчёта. Убедитесь, что этапы, по которым завершены работы, переведены в состояние "Закрыт". ' ) ;
2023-10-21 04:05:01 +03:00
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 ' ,
2024-03-15 17:02:56 +03:00
SCOND_TO = > ' EDCOST_READYTo ' ,
2023-10-21 04:05:01 +03:00
BORDER = > true ,
2024-03-15 17:02:56 +03:00
BFILTER = > true ) ;
2023-09-25 00:26:59 +03:00
/* Определим дополнительные свойства - ответственный экономист */
2023-10-02 20:22:59 +03:00
FIND_DOCS_PROPS_CODE ( NFLAG_SMART = > 1 , NCOMPANY = > NCOMPANY , SCODE = > SDP_SECON_RESP , NRN = > NECON_RESP_DP ) ;
2023-09-25 00:26:59 +03:00
/* Обходим данные */
2023-09-24 22:25:19 +03:00
begin
2024-03-15 17:02:56 +03:00
/* Добавляем подсказку совместимости */
CSQL : = PKG_SQL_BUILD . COMPATIBLE ( SSQL = > CSQL ) ;
/* Формируем запрос */
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' select * ' ) ;
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 = > ' from (select P.RN NRN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P.CODE SCODE, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P."NAME" SNAME, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P.NAME_USL SNAME_USL, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P.EXPECTED_RES SEXPECTED_RES, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PT.CODE SPRJTYPE, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' EC.AGNABBR SEXT_CUST, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' GC.CODE SGOVCNTRID, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P.DOC_OSN SDOC_OSN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' Contracts ' ) | | ' SLNK_UNIT_SDOC_OSN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_DOC_OSN_LNK_DOCUMENT ' ) | | ' (P.RN) NLNK_DOCUMENT_SDOC_OSN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' SR.CODE SSUBDIV_RESP, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' R.AGNABBR SRESPONSIBLE, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' F_DOCS_PROPS_GET_STR_VALUE(:NECON_RESP_DP, ' | | PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' Projects ' ) | | ' , P.RN) SECON_RESP, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P."STATE" NSTATE, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P.BEGPLAN DBEGPLAN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P.ENDPLAN DENDPLAN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' P.COST_SUM_BASECURR NCOST_SUM, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' CN.INTCODE SCURNAMES, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_FIN_IN ' ) | | ' (P.RN) NFIN_IN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' Paynotes ' ) | | ' SLNK_UNIT_NFIN_IN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_NUM ( NVALUE = > 0 ) | | ' NLNK_DOCUMENT_NFIN_IN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_FIN_OUT ' ) | | ' (P.RN) NFIN_OUT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' Paynotes ' ) | | ' SLNK_UNIT_NFIN_OUT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_NUM ( NVALUE = > 1 ) | | ' NLNK_DOCUMENT_NFIN_OUT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_FIN ' ) | | ' (P.RN) NCTRL_FIN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR ' ) | | ' (P.RN) NCTRL_CONTR, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC ' ) | | ' (P.RN) NCTRL_COEXEC, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD ' ) | | ' (P.RN) NCTRL_PERIOD, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_COST ' ) | | ' (P.RN) NCTRL_COST, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_CTRL_ACT ' ) | | ' (P.RN) NCTRL_ACT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.GET_COST_READY ' ) | | ' (P.RN) NCOST_READY ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from PROJECT P ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' left outer join AGNLIST EC on P.EXT_CUST = EC.RN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' left outer join GOVCNTRID GC on P.GOVCNTRID = GC.RN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' left outer join INS_DEPARTMENT SR on P.SUBDIV_RESP = SR.RN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' left outer join AGNLIST R on P.RESPONSIBLE = R.RN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PRJTYPE PT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' CURNAMES CN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' where P.PRJTYPE = PT.RN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and P.CURNAMES = CN.RN ' ) ;
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 ' ) | | ' ) ' ) ;
2024-04-22 23:13:04 +03:00
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and P.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F ' ) ;
2024-03-15 17:02:56 +03:00
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' where F.NROW between :NROW_FROM and :NROW_TO ' ) ;
2023-09-25 00:26:59 +03:00
/* Учтём сортировки */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TORDERS_SET_QUERY ( RDATA_GRID = > RDG , RORDERS = > RO , SPATTERN = > ' %ORDER_BY% ' , CSQL = > CSQL ) ;
2023-09-25 00:26:59 +03:00
/* Учтём фильтры */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TFILTERS_SET_QUERY ( NIDENT = > NIDENT ,
NCOMPANY = > NCOMPANY ,
SUNIT = > ' Projects ' ,
2024-03-15 17:02:56 +03:00
SPROCEDURE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.COND ' ) ,
2023-09-24 22:25:19 +03:00
RDATA_GRID = > RDG ,
RFILTERS = > RF ) ;
2023-09-25 00:26:59 +03:00
/* Разбираем е г о */
2023-09-24 22:25:19 +03:00
ICURSOR : = PKG_SQL_DML . OPEN_CURSOR ( SWHAT = > ' SELECT ' ) ;
PKG_SQL_DML . PARSE ( ICURSOR = > ICURSOR , SQUERY = > CSQL ) ;
2023-09-25 00:26:59 +03:00
/* Делаем подстановку параметров */
2023-09-24 22:25:19 +03:00
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NECON_RESP_DP ' , NVALUE = > NECON_RESP_DP ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NIDENT ' , NVALUE = > NIDENT ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NROW_FROM ' , NVALUE = > NROW_FROM ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NROW_TO ' , NVALUE = > NROW_TO ) ;
2023-09-25 00:26:59 +03:00
/* Описываем структуру записи курсора */
2023-09-24 22:25:19 +03:00
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 1 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 2 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 3 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 4 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 5 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 6 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 7 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 8 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 9 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 10 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 11 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 12 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 13 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 14 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 15 ) ;
PKG_SQL_DML . DEFINE_COLUMN_DATE ( ICURSOR = > ICURSOR , IPOSITION = > 16 ) ;
PKG_SQL_DML . DEFINE_COLUMN_DATE ( ICURSOR = > ICURSOR , IPOSITION = > 17 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 18 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 19 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 20 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 21 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 22 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 23 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( 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_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 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 31 ) ;
2023-10-21 04:05:01 +03:00
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 32 ) ;
2024-03-15 17:02:56 +03:00
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 33 ) ;
2023-09-25 00:26:59 +03:00
/* Делаем выборку */
2023-09-24 22:25:19 +03:00
if ( PKG_SQL_DML . EXECUTE ( ICURSOR = > ICURSOR ) = 0 ) then
null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Обходим выбранные записи */
2023-09-24 22:25:19 +03:00
while ( PKG_SQL_DML . FETCH_ROWS ( ICURSOR = > ICURSOR ) > 0 )
loop
2023-09-25 00:26:59 +03:00
/* Добавляем колонки с данными */
2024-03-15 17:02:56 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NRN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 1 ,
BCLEAR = > true ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SCODE ' , ICURSOR = > ICURSOR , NPOSITION = > 2 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SNAME ' , ICURSOR = > ICURSOR , NPOSITION = > 3 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SNAME_USL ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 4 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SEXPECTED_RES ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 5 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SPRJTYPE ' , ICURSOR = > ICURSOR , NPOSITION = > 6 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SEXT_CUST ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 7 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SGOVCNTRID ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 8 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SDOC_OSN ' , ICURSOR = > ICURSOR , NPOSITION = > 9 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SLNK_UNIT_SDOC_OSN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 10 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NLNK_DOCUMENT_SDOC_OSN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 11 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SSUBDIV_RESP ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 12 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SRESPONSIBLE ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 13 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SECON_RESP ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 14 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW , SNAME = > ' NSTATE ' , ICURSOR = > ICURSOR , NPOSITION = > 15 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLD ( RROW = > RDG_ROW ,
SNAME = > ' DBEGPLAN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 16 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLD ( RROW = > RDG_ROW ,
SNAME = > ' DENDPLAN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 17 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCOST_SUM ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 18 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SCURNAMES ' ,
ICURSOR = > ICURSOR ,
2024-03-15 17:02:56 +03:00
NPOSITION = > 19 ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW , SNAME = > ' NFIN_IN ' , ICURSOR = > ICURSOR , NPOSITION = > 20 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SLNK_UNIT_NFIN_IN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 21 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NLNK_DOCUMENT_NFIN_IN ' ,
ICURSOR = > ICURSOR ,
2024-03-15 17:02:56 +03:00
NPOSITION = > 22 ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NFIN_OUT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 23 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SLNK_UNIT_NFIN_OUT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 24 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NLNK_DOCUMENT_NFIN_OUT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 25 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_FIN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 26 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_CONTR ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 27 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_COEXEC ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 28 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_PERIOD ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 29 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_COST ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 30 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_ACT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 31 ) ;
2023-10-21 04:05:01 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCOST_READY ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 32 ) ;
2023-09-25 00:26:59 +03:00
/* Добавляем строку в таблицу */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_ROW ( RDATA_GRID = > RDG , RROW = > RDG_ROW ) ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Освобождаем курсор */
2023-09-24 22:25:19 +03:00
PKG_SQL_DML . CLOSE_CURSOR ( ICURSOR = > ICURSOR ) ;
exception
when others then
PKG_SQL_DML . CLOSE_CURSOR ( ICURSOR = > ICURSOR ) ;
raise ;
end ;
2023-09-25 00:26:59 +03:00
/* Сериализуем описание */
2023-09-24 22:25:19 +03:00
COUT : = PKG_P8PANELS_VISUAL . TDATA_GRID_TO_XML ( RDATA_GRID = > RDG , NINCLUDE_DEF = > NINCLUDE_DEF ) ;
end LIST ;
2024-02-03 01:29:39 +03:00
/* Сфодный график проектов */
procedure GRAPH
(
COUT out clob -- График проектов
)
is
NCOMPANY PKG_STD . TREF : = GET_SESSION_COMPANY ( ) ; -- Р е г . номер организации
DFROM PKG_STD . TLDATE ; -- Дата начала всех работ
DTO PKG_STD . TLDATE ; -- Дата окончания всех работ
DFROM_CUR PKG_STD . TLDATE ; -- Дата начала текущая
DTO_CUR PKG_STD . TLDATE ; -- Дата окончания текущая
SYEAR_COL_NAME PKG_STD . TSTRING ; -- Наименование колонки для года
SPRJ_GROUP_NAME PKG_STD . TSTRING ; -- Наименование группы для проекта
BEXPANDED boolean ; -- Флаг раскрытости уровня
RDG PKG_P8PANELS_VISUAL . TDATA_GRID ; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL . TROW ; -- Строка таблицы
begin
/* Определим даты начала и окончания проектов */
select TRUNC ( min ( DBEGPLAN ) , ' mm ' ) ,
LAST_DAY ( max ( DENDPLAN ) )
into DFROM ,
DTO
from ( select min ( P . BEGPLAN ) DBEGPLAN ,
max ( P . ENDPLAN ) DENDPLAN
from PROJECT P
where P . COMPANY = NCOMPANY
and P . STATE in ( 0 , 1 , 4 )
2024-04-09 19:07:07 +03:00
and P . BEGPLAN is not null
and P . ENDPLAN is not null
2024-02-03 01:29:39 +03:00
union all
select min ( PS . BEGPLAN ) DBEGPLAN ,
max ( PS . ENDPLAN ) DENDPLAN
from PROJECT P ,
PROJECTSTAGE PS
where P . COMPANY = NCOMPANY
and P . STATE in ( 0 , 1 , 4 )
and P . RN = PS . PRN
and PS . STATE in ( 0 , 1 , 3 )
2024-04-09 19:07:07 +03:00
and PS . BEGPLAN is not null
and PS . ENDPLAN is not null
2024-02-03 01:29:39 +03:00
and PS . HRN is null ) ;
/* Инициализируем таблицу данных */
2024-05-04 14:34:27 +03:00
RDG : = PKG_P8PANELS_VISUAL . TDATA_GRID_MAKE ( BFIXED_HEADER = > true , NFIXED_COLUMNS = > 1 ) ;
2024-04-09 19:07:07 +03:00
/* Если есть данные о начале и окончании проектов в портфеле */
if ( ( DFROM is not null ) and ( DTO is not null ) ) then
/* Формируем структуру заголовка */
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NRN ' ,
SCAPTION = > ' Р е г . номер' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SJOB ' ,
SCAPTION = > ' Работы ' ,
2024-05-04 14:34:27 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
NWIDTH = > 300 ) ;
2024-04-09 19:07:07 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SRESP ' ,
SCAPTION = > ' Ответственный ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NSTATE ' ,
SCAPTION = > ' Состояние ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' DFROM ' ,
SCAPTION = > ' Начало работы ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_DATE ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' DTO ' ,
SCAPTION = > ' Окончание работы ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_DATE ,
BVISIBLE = > false ) ;
for Y in EXTRACT ( year from DFROM ) . . EXTRACT ( year from DTO )
2024-02-03 01:29:39 +03:00
loop
2024-04-09 19:07:07 +03:00
SYEAR_COL_NAME : = TO_CHAR ( Y ) ;
if ( Y = EXTRACT ( year from sysdate ) ) then
BEXPANDED : = true ;
else
BEXPANDED : = false ;
2024-02-03 01:29:39 +03:00
end if ;
2024-04-09 19:07:07 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > SYEAR_COL_NAME ,
SCAPTION = > TO_CHAR ( Y ) ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BEXPANDABLE = > true ,
BEXPANDED = > BEXPANDED ) ;
for M in 1 . . 12
loop
DFROM_CUR : = TO_DATE ( ' 01. ' | | LPAD ( TO_CHAR ( M ) , 2 , ' 0 ' ) | | ' . ' | | TO_CHAR ( Y ) , ' dd.mm.yyyy ' ) ;
DTO_CUR : = LAST_DAY ( DFROM_CUR ) ;
if ( ( DFROM_CUR > = DFROM ) and ( DTO_CUR < = DTO ) ) then
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > SYEAR_COL_NAME | | ' _ ' | | TO_CHAR ( M ) ,
SCAPTION = > LPAD ( TO_CHAR ( M ) , 2 , ' 0 ' ) ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SPARENT = > SYEAR_COL_NAME ) ;
end if ;
end loop ;
2024-02-03 01:29:39 +03:00
end loop ;
2024-04-09 19:07:07 +03:00
/* Обходим открытые проекты */
for PR in ( select P . *
from PROJECT P
where P . COMPANY = NCOMPANY
and P . STATE in ( 0 , 1 , 4 )
and P . BEGPLAN is not null
and P . ENDPLAN is not null
order by P . BEGPLAN )
2024-02-03 01:29:39 +03:00
loop
2024-04-09 19:07:07 +03:00
/* Добвим группу для проекта */
SPRJ_GROUP_NAME : = PR . RN ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_GROUP ( RDATA_GRID = > RDG ,
SNAME = > SPRJ_GROUP_NAME ,
SCAPTION = > PR . CODE | | ' - ' | | PR . NAME ,
BEXPANDABLE = > true ,
BEXPANDED = > true ) ;
/* Обходим этапы проекта */
for ST in ( select PS . RN NRN ,
trim ( PS . NUMB ) | | ' - ' | | PS . NAME SJOB ,
COALESCE ( AG . AGNABBR , IND . NAME ) SRESP ,
PS . STATE NSTATE ,
PS . BEGPLAN DFROM ,
PS . ENDPLAN DTO
from PROJECTSTAGE PS ,
AGNLIST AG ,
INS_DEPARTMENT IND
where PS . PRN = PR . RN
and PS . STATE in ( 0 , 1 , 3 )
and PS . BEGPLAN is not null
and PS . ENDPLAN is not null
and PS . HRN is null
and PS . RESPONSIBLE = AG . RN ( + )
and PS . SUBDIV_RESP = IND . RN ( + )
order by PS . NUMB )
loop
/* Инициализируем строку */
RDG_ROW : = PKG_P8PANELS_VISUAL . TROW_MAKE ( SGROUP = > SPRJ_GROUP_NAME ) ;
/* Добавляем колонки с данными */
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NRN ' , NVALUE = > ST . NRN ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' SJOB ' , SVALUE = > ST . SJOB ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' SRESP ' , SVALUE = > ST . SRESP ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NSTATE ' , NVALUE = > ST . NSTATE ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' DFROM ' , DVALUE = > ST . DFROM ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' DTO ' , DVALUE = > ST . DTO ) ;
/* Добавим строку для этапа */
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_ROW ( RDATA_GRID = > RDG , RROW = > RDG_ROW ) ;
end loop ;
2024-02-03 01:29:39 +03:00
end loop ;
2024-04-09 19:07:07 +03:00
end if ;
2024-02-03 01:29:39 +03:00
/* Сериализуем описание */
COUT : = PKG_P8PANELS_VISUAL . TDATA_GRID_TO_XML ( RDATA_GRID = > RDG , NINCLUDE_DEF = > 1 ) ;
end GRAPH ;
2023-10-21 04:05:01 +03:00
/* График по данным проектов - "Топ проблем" */
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 ) ;
2024-03-15 17:02:56 +03:00
PKG_P8PANELS_VISUAL . TCHART_DATASET_ITM_ATTR_VL_ADD ( RATTR_VALS = > RATTR_VALS , SNAME = > ' NYEAR ' , SVALUE = > TO_CHAR ( NYEAR ) ) ;
PKG_P8PANELS_VISUAL . TCHART_DATASET_ITM_ATTR_VL_ADD ( RATTR_VALS = > RATTR_VALS , SNAME = > ' NMONTH ' , SVALUE = > TO_CHAR ( I ) ) ;
2023-10-21 04:05:01 +03:00
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 ;
2023-09-25 00:26:59 +03:00
/* Считывание записи этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return PROJECTSTAGE % rowtype -- Запись этапа проекта
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
RRES PROJECTSTAGE % rowtype ; -- Буфер для результата
2023-09-24 22:25:19 +03:00
begin
select PS . * into RRES from PROJECTSTAGE PS where PS . RN = NRN ;
return RRES ;
exception
when NO_DATA_FOUND then
PKG_MSG . RECORD_NOT_FOUND ( NFLAG_SMART = > 0 , NDOCUMENT = > NRN , SUNIT_TABLE = > ' PROJECTSTAGE ' ) ;
end STAGES_GET ;
2023-09-25 00:26:59 +03:00
/* Отбор этапов проектов */
2023-09-24 22:25:19 +03:00
procedure STAGES_COND
as
begin
2023-09-25 00:26:59 +03:00
/* Установка главной таблицы */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . SET_TABLE ( STABLE_NAME = > ' PROJECTSTAGE ' ) ;
2023-09-25 00:26:59 +03:00
/* Проект */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . SET_COLUMN_PRN ( SCOLUMN_NAME = > ' PRN ' ) ;
2023-09-25 00:26:59 +03:00
/* Номер */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' NUMB ' , SCONDITION_NAME = > ' EDNUMB ' ) ;
2023-09-25 00:26:59 +03:00
/* Наименование */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' NAME ' , SCONDITION_NAME = > ' EDNAME ' ) ;
2023-09-25 00:26:59 +03:00
/* Дата начала план */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_BETWEEN ( SCOLUMN_NAME = > ' BEGPLAN ' ,
SCONDITION_NAME_FROM = > ' EDPLANBEGFrom ' ,
SCONDITION_NAME_TO = > ' EDPLANBEGTo ' ) ;
2023-09-25 00:26:59 +03:00
/* Дата окончания план */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_BETWEEN ( SCOLUMN_NAME = > ' ENDPLAN ' ,
SCONDITION_NAME_FROM = > ' EDPLANENDFrom ' ,
SCONDITION_NAME_TO = > ' EDPLANENDTo ' ) ;
2023-09-25 00:26:59 +03:00
/* Состояние */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_ENUM ( SCOLUMN_NAME = > ' STATE ' , SCONDITION_NAME = > ' CGSTATE ' ) ;
2023-09-25 00:26:59 +03:00
/* Контроль финансирования */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_FIN ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN ' ) | | ' (RN) = :EDCTRL_FIN ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_FIN ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_FIN ' ) ) ;
2023-10-21 04:05:01 +03:00
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль контрактации */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_CONTR ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR ' ) | | ' (RN) = :EDCTRL_CONTR ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_CONTR ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_CONTR ' ) ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль соисполнения */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_COEXEC ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COEXEC ' ) | | ' (RN) = :EDCTRL_COEXEC ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_COEXEC ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_COEXEC ' ) ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль сроков */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_PERIOD ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_PERIOD ' ) | | ' (RN) = :EDCTRL_PERIOD ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_PERIOD ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_PERIOD ' ) ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Контроль затрат */
2023-09-24 22:25:19 +03:00
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_COST ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST ' ) | | ' (RN) = :EDCTRL_COST ' ) ;
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_COST ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_COST ' ) ) ;
end if ;
2023-09-30 02:33:21 +03:00
/* Контроль актирования */
if ( PKG_COND_BROKER . CONDITION_EXISTS ( SCONDITION_NAME = > ' EDCTRL_ACT ' ) = 1 ) then
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT ' ) | | ' (RN) = :EDCTRL_ACT ' ) ;
2023-09-30 02:33:21 +03:00
PKG_COND_BROKER . BIND_VARIABLE ( SVARIABLE_NAME = > ' EDCTRL_ACT ' ,
NVALUE = > PKG_COND_BROKER . GET_CONDITION_NUM ( SCONDITION_NAME = > ' EDCTRL_ACT ' ) ) ;
2023-10-21 04:05:01 +03:00
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
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY ' ) | | ' (RN) >= :EDCOST_READYFrom ' ) ;
2023-10-21 04:05:01 +03:00
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
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY ' ) | | ' (RN) <= :EDCOST_READYTo ' ) ;
2023-10-21 04:05:01 +03:00
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
2024-03-15 17:02:56 +03:00
PKG_COND_BROKER . ADD_CLAUSE ( SCLAUSE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY ' ) | | ' (RN) between :EDCOST_READYFrom and :EDCOST_READYTo ' ) ;
2023-10-21 04:05:01 +03:00
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 ;
2023-09-24 22:25:19 +03:00
end STAGES_COND ;
2023-09-25 00:26:59 +03:00
/* Подбор платежей финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGES_SELECT_FIN
(
2023-09-25 00:26:59 +03:00
NPRN in number : = null , -- Р е г . номер проекта (null - не отбирать по проекту)
NRN in number : = null , -- Р е г . номер этапа проекта (null - не отбирать по этапу)
NDIRECTION in number , -- Направление (0 - приход, 1 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
)
is
2023-09-25 00:26:59 +03:00
NSELECTLIST PKG_STD . TREF ; -- Р е г . номер добавленной записи буфера подобранных
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Подберём платежи */
2023-09-24 22:25:19 +03:00
for C in ( select PN . COMPANY ,
PN . RN
from PAYNOTES PN ,
DICTOPER O
where PN . COMPANY in ( select PS . COMPANY
from PROJECTSTAGE PS
where ( ( NRN is null ) or ( ( NRN is not null ) and ( PS . RN = NRN ) ) )
and ( ( NPRN is null ) or ( ( NPRN is not null ) and ( PS . PRN = NPRN ) ) ) )
and PN . SIGNPLAN = 0
and PN . FINOPER = O . RN
and O . TYPOPER_DIRECT = NDIRECTION
and exists ( select PNC . RN
from PAYNOTESCLC PNC ,
PROJECTSTAGE PS
where PNC . PRN = PN . RN
and PNC . FACEACCOUNT = PS . FACEACC
2023-10-02 20:22:59 +03:00
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 ' )
2023-09-24 22:25:19 +03:00
and ( ( NRN is null ) or ( ( NRN is not null ) and ( PS . RN = NRN ) ) )
2023-10-02 20:22:59 +03:00
and ( ( NPRN is null ) or ( ( NPRN is not null ) and ( PS . PRN = NPRN ) ) ) )
and exists ( select /* + INDEX(UP I_USERPRIV_CATALOG_ROLEID) */
null
from USERPRIV UP
where UP . CATALOG = PN . 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 = PN . CRN
and UP . AUTHID = UTILIZER )
and exists ( select /* + INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
null
from USERPRIV UP
where UP . JUR_PERS = PN . JUR_PERS
and UP . UNITCODE = ' PayNotes '
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_JUR_PERS_AUTHID) */
null
from USERPRIV UP
where UP . JUR_PERS = PN . JUR_PERS
and UP . UNITCODE = ' PayNotes '
and UP . AUTHID = UTILIZER ) )
2023-09-24 22:25:19 +03:00
loop
2023-09-25 00:26:59 +03:00
/* Сформируем идентификатор буфера */
2023-09-24 22:25:19 +03:00
if ( NIDENT is null ) then
NIDENT : = GEN_IDENT ( ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Добавим подобранное в список отмеченных записей */
2023-09-24 22:25:19 +03:00
P_SELECTLIST_BASE_INSERT ( NIDENT = > NIDENT ,
NCOMPANY = > C . COMPANY ,
NDOCUMENT = > C . RN ,
SUNITCODE = > ' PayNotes ' ,
SACTIONCODE = > null ,
NCRN = > null ,
NDOCUMENT1 = > null ,
SUNITCODE1 = > null ,
SACTIONCODE1 = > null ,
NRN = > NSELECTLIST ) ;
end loop ;
end STAGES_SELECT_FIN ;
2023-09-25 00:26:59 +03:00
/* Получение суммы финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_FIN
(
2023-09-25 00:26:59 +03:00
NRN in number , -- Р е г . номер этапа проекта
NDIRECTION in number -- Направление (0 - приход, 1 - расход)
) return number -- Сумма финансирования проекта
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
NRES PKG_STD . TNUMBER ; -- Буфер для рузультата
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Суммируем фактические платежи нужного направления по лицевому счёту затрат этапа */
2023-09-29 12:46:24 +03:00
select COALESCE ( sum ( PN . PAY_SUM * ( PN . CURR_RATE_BASE / PN . CURR_RATE ) ) , 0 )
2023-09-24 22:25:19 +03:00
into NRES
from PAYNOTES PN ,
DICTOPER O
where PN . COMPANY in ( select PS . COMPANY from PROJECTSTAGE PS where PS . RN = NRN )
and PN . SIGNPLAN = 0
and PN . FINOPER = O . RN
and O . TYPOPER_DIRECT = NDIRECTION
and exists ( select PNC . RN
from PAYNOTESCLC PNC ,
PROJECTSTAGE PS
where PNC . PRN = PN . RN
and PNC . FACEACCOUNT = PS . FACEACC
and PS . RN = NRN ) ;
2023-09-25 00:26:59 +03:00
/* Возвращаем результат */
2023-09-24 22:25:19 +03:00
return NRES ;
end STAGES_GET_FIN ;
2023-09-25 00:26:59 +03:00
/* Получение суммы входящего финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_FIN_IN
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Сумма входящего финансирования проекта
2023-09-24 22:25:19 +03:00
is
begin
return STAGES_GET_FIN ( NRN = > NRN , NDIRECTION = > 0 ) ;
end STAGES_GET_FIN_IN ;
2023-09-25 00:26:59 +03:00
/* Получение суммы исходящего финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_FIN_OUT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Сумма исходяшего финансирования проекта
2023-09-24 22:25:19 +03:00
is
begin
return STAGES_GET_FIN ( NRN = > NRN , NDIRECTION = > 1 ) ;
end STAGES_GET_FIN_OUT ;
2023-09-25 00:26:59 +03:00
/* Получение состояния финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_FIN
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NCONTR_CTRL PKG_STD . TNUMBER ; -- Состояние соисполнителя этапа
NCNT_CONTR PKG_STD . TNUMBER : = 0 ; -- Количество соисполнителей этапа
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" соисполнителей этапа
2023-09-24 22:25:19 +03:00
begin
2023-09-29 12:46:24 +03:00
/* Обходим соисполнителей этапа */
for C in ( select PSPF . RN from PROJECTSTAGEPF PSPF where PSPF . PRN = NRN )
loop
/* Увеличим счётчик соисполнителей */
NCNT_CONTR : = NCNT_CONTR + 1 ;
/* Получим состояние соисполнителя */
NCONTR_CTRL : = STAGE_CONTRACTS_GET_CTRL_FIN ( NPROJECTSTAGEPF = > C . RN ) ;
/* Подсчитаем количество "безконтрольных" */
if ( NCONTR_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
/* Если у соисполнителя есть отклонение - оно есть и у этапа */
if ( NCONTR_CTRL = 1 ) then
return 1 ;
end if ;
end loop ;
/* Если ни один соисполнитель не подлежит контролю - то и состояние жтапа тоже */
if ( NCNT_NULL = NCNT_CONTR ) then
return null ;
end if ;
/* Если мы здесь - отклонений нет */
if ( NCNT_CONTR > 0 ) then
return 0 ;
else
/* Нет соисполнителей и нет контроля */
return null ;
end if ;
2023-09-24 22:25:19 +03:00
end STAGES_GET_CTRL_FIN ;
2023-09-25 00:26:59 +03:00
/* Получение состояния контрактации этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_CONTR
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
RSTAGE_ARTS TSTAGE_ARTS ; -- Сведения о контрактации по статьям этапа
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество статей с неопределённым состоянием
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Получим сведения о контрактации по статьям */
2023-09-24 22:25:19 +03:00
STAGE_ARTS_GET ( NSTAGE = > NRN , NINC_CONTR = > 1 , RSTAGE_ARTS = > RSTAGE_ARTS ) ;
2023-09-25 00:26:59 +03:00
/* Если сведения есть - будем разбираться */
2023-09-24 22:25:19 +03:00
if ( ( RSTAGE_ARTS is not null ) and ( RSTAGE_ARTS . COUNT > 0 ) ) then
for I in RSTAGE_ARTS . FIRST . . RSTAGE_ARTS . LAST
loop
if ( RSTAGE_ARTS ( I ) . NCTRL_CONTR is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если хоть одна статья имеет отклонения */
2023-09-24 22:25:19 +03:00
if ( RSTAGE_ARTS ( I ) . NCTRL_CONTR = 1 ) then
2023-09-25 00:26:59 +03:00
/* Т о и этап имеет отклонение */
2023-09-24 22:25:19 +03:00
return 1 ;
end if ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Если ни одна статья не подлежит контролю - то и состояние этапа тоже */
2023-09-24 22:25:19 +03:00
if ( NCNT_NULL = RSTAGE_ARTS . COUNT ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
return 0 ;
else
2023-09-25 00:26:59 +03:00
/* Нет данных по статьям */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end STAGES_GET_CTRL_CONTR ;
2023-09-25 00:26:59 +03:00
/* Получение состояния соисполнения этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COEXEC
(
2024-03-15 17:02:56 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2024-03-15 17:02:56 +03:00
NCONTR_CTRL PKG_STD . TNUMBER ; -- Состояние соисполнителя этапа
NCNT_CONTR PKG_STD . TNUMBER : = 0 ; -- Количество соисполнителей этапа
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество "безконтрольных" соисполнителей этапа
2023-09-24 22:25:19 +03:00
begin
2023-09-30 02:33:21 +03:00
/* Обходим соисполнителей этапа */
for C in ( select PSPF . RN from PROJECTSTAGEPF PSPF where PSPF . PRN = NRN )
loop
/* Увеличим счётчик соисполнителей */
NCNT_CONTR : = NCNT_CONTR + 1 ;
/* Получим состояние соисполнителя */
NCONTR_CTRL : = STAGE_CONTRACTS_GET_CTRL_COEXE ( NPROJECTSTAGEPF = > C . RN ) ;
/* Подсчитаем количество "безконтрольных" */
if ( NCONTR_CTRL is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
/* Если у соисполнителя есть отклонение - оно есть и у этапа */
if ( NCONTR_CTRL = 1 ) then
return 1 ;
end if ;
end loop ;
/* Если ни один соисполнитель не подлежит контролю - то и состояние жтапа тоже */
if ( NCNT_NULL = NCNT_CONTR ) then
return null ;
end if ;
/* Если мы здесь - отклонений нет */
if ( NCNT_CONTR > 0 ) then
return 0 ;
else
/* Нет соисполнителей и нет контроля */
return null ;
end if ;
2023-09-24 22:25:19 +03:00
end STAGES_GET_CTRL_COEXEC ;
2023-09-25 00:26:59 +03:00
/* Получение состояния сроков этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_PERIOD
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
NDAYS_LEFT PKG_STD . TNUMBER ; -- Остаток дней до завершения этапа
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Получим количество дней до завершения */
2023-09-24 22:25:19 +03:00
NDAYS_LEFT : = STAGES_GET_DAYS_LEFT ( NRN = > NRN ) ;
2023-09-25 00:26:59 +03:00
/* Если мы не знаем количества дней - то не можем и контролировать */
2023-09-24 22:25:19 +03:00
if ( NDAYS_LEFT is null ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если осталось меньше определённого лимита */
2023-09-24 22:25:19 +03:00
if ( NDAYS_LEFT < NDAYS_LEFT_LIMIT ) then
2023-09-25 00:26:59 +03:00
/* Н а это необходимо обратить внимание */
2023-09-24 22:25:19 +03:00
return 1 ;
else
2023-09-25 00:26:59 +03:00
/* Отклонений нет */
2023-09-24 22:25:19 +03:00
return 0 ;
end if ;
end STAGES_GET_CTRL_PERIOD ;
2023-09-25 00:26:59 +03:00
/* Получение состояния затрат этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COST
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
RSTAGE_ARTS TSTAGE_ARTS ; -- Сведения о затратах по статьям этапа
NCNT_NULL PKG_STD . TNUMBER : = 0 ; -- Количество статей с неопределённым состоянием
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Получим сведения о затратах по статьям */
2023-09-24 22:25:19 +03:00
STAGE_ARTS_GET ( NSTAGE = > NRN , NINC_COST = > 1 , RSTAGE_ARTS = > RSTAGE_ARTS ) ;
2023-09-25 00:26:59 +03:00
/* Если сведения есть - будем разбираться */
2023-09-24 22:25:19 +03:00
if ( ( RSTAGE_ARTS is not null ) and ( RSTAGE_ARTS . COUNT > 0 ) ) then
for I in RSTAGE_ARTS . FIRST . . RSTAGE_ARTS . LAST
loop
if ( RSTAGE_ARTS ( I ) . NCTRL_COST is null ) then
NCNT_NULL : = NCNT_NULL + 1 ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если хоть одна статья имеет отклонения */
2023-09-24 22:25:19 +03:00
if ( RSTAGE_ARTS ( I ) . NCTRL_COST = 1 ) then
2023-09-25 00:26:59 +03:00
/* Т о и этап имеет отклонение */
2023-09-24 22:25:19 +03:00
return 1 ;
end if ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Если ни одна статья не подлежит контролю - то и состояние этапа тоже */
2023-09-24 22:25:19 +03:00
if ( NCNT_NULL = RSTAGE_ARTS . COUNT ) then
return null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
return 0 ;
else
2023-09-25 00:26:59 +03:00
/* Нет данных по статьям */
2023-09-24 22:25:19 +03:00
return null ;
end if ;
end STAGES_GET_CTRL_COST ;
2023-09-25 00:26:59 +03:00
/* Получение состояния актирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_ACT
(
2023-09-30 02:33:21 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
2023-09-30 02:33:21 +03:00
RPS PROJECTSTAGE % rowtype ; -- Запись этапа проекта
NTRANSINVCUST PKG_STD . TREF ; -- Р е г . номер РНОПотр, закрывающей этап
2023-09-24 22:25:19 +03:00
begin
2023-09-30 02:33:21 +03:00
/* Читаем запись этапа */
RPS : = STAGES_GET ( NRN = > NRN ) ;
/* Если этап не в состоянии "Закрыт", то нечего контролировать */
if ( RPS . STATE < > 2 ) then
return null ;
end if ;
/* Проверяем наличие подписанного аката */
begin
select T . RN
into NTRANSINVCUST
from TRANSINVCUST T
where T . FACEACC = RPS . FACEACCCUST
and T . STATUS = 1
and exists ( select null
from TRINVCUSTCLC TC
where TC . PRN in ( select TS . RN from TRANSINVCUSTSPECS TS where TS . PRN = T . RN )
and TC . FACEACCOUNT = RPS . FACEACC ) ;
exception
when NO_DATA_FOUND then
null ;
end ;
/* Если мы здесь, значит этап "Закрыт", если нет закрывающего акта с заказчиком - это отклонение */
if ( NTRANSINVCUST is null ) then
return 1 ;
end if ;
/* В с е проверки пройдены - отклонений нет */
return 0 ;
end STAGES_GET_CTRL_ACT ;
2023-09-24 22:25:19 +03:00
2023-09-25 00:26:59 +03:00
/* Получение остатка срока исполнения этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_DAYS_LEFT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Количество дней (null - не определено)
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
RSTG PROJECTSTAGE % rowtype ; -- Запись этапа
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Считаем этап */
2023-09-24 22:25:19 +03:00
RSTG : = STAGES_GET ( NRN = > NRN ) ;
2023-09-25 00:26:59 +03:00
/* Вернём остаток дней */
2023-09-24 22:25:19 +03:00
if ( RSTG . ENDPLAN is not null ) then
2024-05-04 14:34:27 +03:00
return ROUND ( RSTG . ENDPLAN - sysdate ) ;
2023-09-24 22:25:19 +03:00
else
return null ;
end if ;
end STAGES_GET_DAYS_LEFT ;
2023-09-25 00:26:59 +03:00
/* Подбор записей журнала затрат этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGES_SELECT_COST_FACT
(
2023-10-21 04:05:01 +03:00
NRN in number , -- Р е г . номер этапа проекта
2023-09-25 00:26:59 +03:00
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
)
is
begin
STAGE_ARTS_SELECT_COST_FACT ( NSTAGE = > NRN , NFINFLOW_TYPE = > 2 , NIDENT = > NIDENT ) ;
end STAGES_SELECT_COST_FACT ;
2023-09-25 00:26:59 +03:00
/* Получение суммы фактических затрат этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_COST_FACT
(
2023-09-25 00:26:59 +03:00
NRN in number -- Р е г . номер этапа проекта
) return number -- Сумма фактических затрат
2023-09-24 22:25:19 +03:00
is
begin
return STAGE_ARTS_GET_COST_FACT ( NSTAGE = > NRN , NFINFLOW_TYPE = > 2 ) ;
end STAGES_GET_COST_FACT ;
2023-10-21 04:05:01 +03:00
/* Подбор записей расходных накладных на отпуск потребителям этапа проекта */
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 ;
2023-09-25 00:26:59 +03:00
/* Получение суммы реализации этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_SUMM_REALIZ
(
2023-09-25 00:26:59 +03:00
NRN in number , -- Р е г . номер этапа проекта
NFPDARTCL_REALIZ in number -- Р е г . номер статьи калькуляции для реализации
) return number -- Сумма реализации
2023-09-24 22:25:19 +03:00
is
begin
if ( NFPDARTCL_REALIZ is not null ) then
return STAGE_ARTS_GET_COST_FACT ( NSTAGE = > NRN , NFPDARTCL = > NFPDARTCL_REALIZ ) ;
else
return 0 ;
end if ;
end STAGES_GET_SUMM_REALIZ ;
2023-10-21 04:05:01 +03:00
/* Получение % готовности этапа проекта (по затратам) */
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 ;
2023-09-25 00:26:59 +03:00
/* Список этапов */
2023-09-24 22:25:19 +03:00
procedure STAGES_LIST
(
2023-09-25 00:26:59 +03:00
NPRN in number , -- Р е г . номер проекта
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CFILTERS in clob , -- Фильтры
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
)
is
2023-09-25 00:26:59 +03:00
NCOMPANY PKG_STD . TREF : = GET_SESSION_COMPANY ( ) ; -- Организация сеанса
NIDENT PKG_STD . TREF : = GEN_IDENT ( ) ; -- Идентификатор отбора
RF PKG_P8PANELS_VISUAL . TFILTERS ; -- Фильтры
RO PKG_P8PANELS_VISUAL . TORDERS ; -- Сортировки
RDG PKG_P8PANELS_VISUAL . TDATA_GRID ; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL . TROW ; -- Строка таблицы
RCOL_VALS PKG_P8PANELS_VISUAL . TCOL_VALS ; -- Предопределённые значения столбцов
NROW_FROM PKG_STD . TREF ; -- Номер строки с
NROW_TO PKG_STD . TREF ; -- Номер строки по
NFPDARTCL_REALIZ PKG_STD . TREF ; -- Р е г . номер статьи калькуляции для реализации
CSQL clob ; -- Буфер для запроса
ICURSOR integer ; -- К у р с о р для исполнения запроса
NCOST_FACT PKG_STD . TNUMBER ; -- Сумма фактических затрат по этапу проекта
NSUMM_REALIZ PKG_STD . TNUMBER ; -- Сумма реализации по этапу проекта
NSUMM_INCOME PKG_STD . TNUMBER ; -- Сумма прибыли по этапу проекта
NINCOME_PRC PKG_STD . TNUMBER ; -- Процент прибыли по этапу проекта
2023-09-24 22:25:19 +03:00
begin
2024-03-15 17:02:56 +03:00
/* Определим р е г . номер статьи калькуляции для учёта реализации */
2023-09-24 22:25:19 +03:00
FIND_FPDARTCL_CODE ( NFLAG_SMART = > 1 , NCOMPANY = > NCOMPANY , SCODE = > SFPDARTCL_REALIZ , NRN = > NFPDARTCL_REALIZ ) ;
2023-09-25 00:26:59 +03:00
/* Читаем фильтры */
2023-09-24 22:25:19 +03:00
RF : = PKG_P8PANELS_VISUAL . TFILTERS_FROM_XML ( CFILTERS = > CFILTERS ) ;
2024-04-19 21:46:31 +03:00
/* Читаем сортировки */
2023-09-24 22:25:19 +03:00
RO : = PKG_P8PANELS_VISUAL . TORDERS_FROM_XML ( CORDERS = > CORDERS ) ;
2023-09-25 00:26:59 +03:00
/* Преобразуем номер и размер страницы в номер строк с и по */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . UTL_ROWS_LIMITS_CALC ( NPAGE_NUMBER = > NPAGE_NUMBER ,
NPAGE_SIZE = > NPAGE_SIZE ,
NROW_FROM = > NROW_FROM ,
NROW_TO = > NROW_TO ) ;
2023-09-25 00:26:59 +03:00
/* Инициализируем таблицу данных */
2023-09-24 22:25:19 +03:00
RDG : = PKG_P8PANELS_VISUAL . TDATA_GRID_MAKE ( ) ;
2023-09-25 00:26:59 +03:00
/* Добавляем в таблицу описание колонок */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NRN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Р е г . номер' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SNUMB ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Номер ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' EDNUMB ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SNAME ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Наименование ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' EDNAME ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SEXPECTED_RES ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Ожидаемые результаты ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SFACEACC ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Шифр затрат ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 0 , BCLEAR = > true ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 1 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 2 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 3 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 4 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 5 ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NSTATE ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Состояние ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' CGSTATE ' ,
BORDER = > true ,
BFILTER = > true ,
RCOL_VALS = > RCOL_VALS ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' DBEGPLAN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Дата начала ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_DATE ,
SCOND_FROM = > ' EDPLANBEGFrom ' ,
SCOND_TO = > ' EDPLANBEGTo ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' DENDPLAN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Дата окончания ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_DATE ,
SCOND_FROM = > ' EDPLANENDFrom ' ,
SCOND_TO = > ' EDPLANENDTo ' ,
BORDER = > true ,
BFILTER = > true ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCOST_SUM ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Стоимость ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SCURNAMES ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Валюта ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NFIN_IN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Входящее финансирование ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SLNK_UNIT_NFIN_IN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Входящее финансирование (код раздела ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NLNK_DOCUMENT_NFIN_IN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Входящее финансирование (документ ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NFIN_OUT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Исходящее финансирование ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SLNK_UNIT_NFIN_OUT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Исходящее финансирование (код раздела ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NLNK_DOCUMENT_NFIN_OUT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Исходящее финансирование (документ ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 0 , BCLEAR = > true ) ;
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 ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Фин-е (исх.) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_FIN ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
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> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_CONTR ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Контр-я ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_CONTR ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
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> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана калькуляция и для контрагентских статей указаны плановые показатели. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_COEXEC ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Соисп-е ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_COEXEC ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
RCOL_VALS = > RCOL_VALS ,
SHINT = > ' <b>Соисполнение</b> - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках этапа.<br> ' | |
2024-03-15 17:02:56 +03:00
' <b style="color:red">Требует внимания</b> - до окончания этапа осталось менее ' | |
TO_CHAR ( NDAYS_LEFT_LIMIT ) | |
2023-10-23 21:18:04 +03:00
' дней, при этом зафиксирован положительный остаток к поставке/актированию по привязанным к нему договорам соисполнителей.<br> ' | |
' <b style="color:green">В норме</b> - нет описанных выше отклонений.<br> ' | |
' <b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана привязка к договорам с соисполнителями и плановый срок окончания. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NDAYS_LEFT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Дней до окончания ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_PERIOD ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Сроки ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_PERIOD ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
RCOL_VALS = > RCOL_VALS ,
SHINT = > ' <b>Сроки</b> - контроль сроков исполнения работ по этапу.<br> ' | |
2024-03-15 17:02:56 +03:00
' <b style="color:red">Требует внимания</b> - до окончания этапа осталось менее ' | |
TO_CHAR ( NDAYS_LEFT_LIMIT ) | | ' дней.<br> ' | |
2023-10-23 21:18:04 +03:00
' <b style="color:green">В норме</b> - нет описанных выше отклонений.<br> ' | |
' <b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задан плановый срок окончания. ' ) ;
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCOST_FACT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Сумма фактических затрат ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SLNK_UNIT_NCOST_FACT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Сумма фактических затрат (код раздела ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NLNK_DOCUMENT_NCOST_FACT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Сумма фактических затрат (документ ссылки) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NSUMM_REALIZ ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Сумма реализации ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
2024-03-15 17:02:56 +03:00
BVISIBLE = > false ) ;
2023-10-21 04:05:01 +03:00
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 ,
2023-09-24 22:25:19 +03:00
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NSUMM_INCOME ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Сумма прибыли ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NINCOME_PRC ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Процент прибыли ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_COST ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Затраты ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_COST ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
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> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана действующая калькуляция с указанием плановых значений по статьям, подлежащим контролю. ' ) ;
2023-09-30 02:33:21 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_ACT ' ,
2023-10-21 04:05:01 +03:00
SCAPTION = > ' Актир-е ' ,
2023-09-30 02:33:21 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' EDCTRL_ACT ' ,
BORDER = > true ,
BFILTER = > true ,
2023-10-23 21:18:04 +03:00
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> - в Системе не хватает данных для рассчёта. Убедитесь, что этап, если работы по нему завершены, переведен в состояние "Закрыт". ' ) ;
2023-10-21 04:05:01 +03:00
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 ' ,
2024-03-15 17:02:56 +03:00
SCOND_TO = > ' EDCOST_READYTo ' ,
2023-10-21 04:05:01 +03:00
BORDER = > true ,
BFILTER = > true ) ;
2023-09-25 00:26:59 +03:00
/* Обходим данные */
2023-09-24 22:25:19 +03:00
begin
2024-03-15 17:02:56 +03:00
/* Добавляем подсказку совместимости */
CSQL : = PKG_SQL_BUILD . COMPATIBLE ( SSQL = > CSQL ) ;
/* Формируем запрос */
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' select * ' ) ;
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 = > ' from (select PS.RN NRN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PS.NUMB SNUMB, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PS."NAME" SNAME, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PS.EXPECTED_RES SEXPECTED_RES, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' FAC.NUMB SFACEACC, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PS."STATE" NSTATE, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PS.BEGPLAN DBEGPLAN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PS.ENDPLAN DENDPLAN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PS.COST_SUM_BASECURR NCOST_SUM, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' CN.INTCODE SCURNAMES, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_FIN_IN ' ) | | ' (PS.RN) NFIN_IN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' Paynotes ' ) | | ' SLNK_UNIT_NFIN_IN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_NUM ( NVALUE = > 0 ) | | ' NLNK_DOCUMENT_NFIN_IN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_FIN_OUT ' ) | | ' (PS.RN) NFIN_OUT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' Paynotes ' ) | | ' SLNK_UNIT_NFIN_OUT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_NUM ( NVALUE = > 1 ) | | ' NLNK_DOCUMENT_NFIN_OUT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN ' ) | | ' (PS.RN) NCTRL_FIN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR ' ) | | ' (PS.RN) NCTRL_CONTR, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COEXEC ' ) | | ' (PS.RN) NCTRL_COEXEC, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_DAYS_LEFT ' ) | | ' (PS.RN) NDAYS_LEFT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_PERIOD ' ) | | ' (PS.RN) NCTRL_PERIOD, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_COST_FACT ' ) | | ' (PS.RN) NCOST_FACT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' CostNotes ' ) | | ' SLNK_UNIT_NCOST_FACT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_NUM ( NVALUE = > 1 ) | | ' NLNK_DOCUMENT_NCOST_FACT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_SUMM_REALIZ ' ) | | ' (PS.RN, :NFPDARTCL_REALIZ) NSUMM_REALIZ, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' GoodsTransInvoicesToConsumers ' ) | | ' SLNK_UNIT_NSUMM_REALIZ, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . WRAP_NUM ( NVALUE = > 1 ) | | ' NLNK_DOCUMENT_NSUMM_REALIZ, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST ' ) | | ' (PS.RN) NCTRL_COST, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT ' ) | | ' (PS.RN) NCTRL_ACT, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY ' ) | | ' (PS.RN) NCOST_READY ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from PROJECTSTAGE PS ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' left outer join FACEACC FAC on PS.FACEACC = FAC.RN, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' PROJECT P, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' CURNAMES CN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' where PS.PRN = P.RN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and P.CURNAMES = CN.RN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = PS.CRN) ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = PS.JUR_PERS and UP.UNITCODE = ' | | PKG_SQL_BUILD . WRAP_STR ( SVALUE = > ' Projects ' ) | | ' ) ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and PS.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' where F.NROW between :NROW_FROM and :NROW_TO ' ) ;
2023-09-25 00:26:59 +03:00
/* Учтём сортировки */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TORDERS_SET_QUERY ( RDATA_GRID = > RDG , RORDERS = > RO , SPATTERN = > ' %ORDER_BY% ' , CSQL = > CSQL ) ;
2023-09-25 00:26:59 +03:00
/* Учтём фильтры */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TFILTERS_SET_QUERY ( NIDENT = > NIDENT ,
NCOMPANY = > NCOMPANY ,
NPARENT = > NPRN ,
SUNIT = > ' ProjectsStages ' ,
2024-03-15 17:02:56 +03:00
SPROCEDURE = > PKG_SQL_BUILD . PKG_NAME ( SNAME = > ' PKG_P8PANELS_PROJECTS.STAGES_COND ' ) ,
2023-09-24 22:25:19 +03:00
RDATA_GRID = > RDG ,
RFILTERS = > RF ) ;
2023-09-25 00:26:59 +03:00
/* Разбираем е г о */
2023-09-24 22:25:19 +03:00
ICURSOR : = PKG_SQL_DML . OPEN_CURSOR ( SWHAT = > ' SELECT ' ) ;
PKG_SQL_DML . PARSE ( ICURSOR = > ICURSOR , SQUERY = > CSQL ) ;
2023-09-25 00:26:59 +03:00
/* Делаем подстановку параметров */
2023-09-24 22:25:19 +03:00
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NIDENT ' , NVALUE = > NIDENT ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NROW_FROM ' , NVALUE = > NROW_FROM ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NROW_TO ' , NVALUE = > NROW_TO ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NFPDARTCL_REALIZ ' , NVALUE = > NFPDARTCL_REALIZ ) ;
2023-09-25 00:26:59 +03:00
/* Описываем структуру записи курсора */
2023-09-24 22:25:19 +03:00
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 1 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 2 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 3 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 4 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 5 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 6 ) ;
PKG_SQL_DML . DEFINE_COLUMN_DATE ( ICURSOR = > ICURSOR , IPOSITION = > 7 ) ;
PKG_SQL_DML . DEFINE_COLUMN_DATE ( ICURSOR = > ICURSOR , IPOSITION = > 8 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 9 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 10 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 11 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 12 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 13 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 14 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 15 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 16 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 17 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 18 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 19 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 20 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 21 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 22 ) ;
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 ) ;
2023-10-21 04:05:01 +03:00
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 26 ) ;
2023-09-30 02:33:21 +03:00
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 27 ) ;
2023-10-21 04:05:01 +03:00
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 ) ;
2024-03-15 17:02:56 +03:00
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 31 ) ;
2023-09-25 00:26:59 +03:00
/* Делаем выборку */
2023-09-24 22:25:19 +03:00
if ( PKG_SQL_DML . EXECUTE ( ICURSOR = > ICURSOR ) = 0 ) then
null ;
end if ;
2023-09-25 00:26:59 +03:00
/* Обходим выбранные записи */
2023-09-24 22:25:19 +03:00
while ( PKG_SQL_DML . FETCH_ROWS ( ICURSOR = > ICURSOR ) > 0 )
loop
2023-09-25 00:26:59 +03:00
/* Добавляем колонки с данными */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NRN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 1 ,
BCLEAR = > true ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SNUMB ' , ICURSOR = > ICURSOR , NPOSITION = > 2 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SNAME ' , ICURSOR = > ICURSOR , NPOSITION = > 3 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SEXPECTED_RES ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 4 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SFACEACC ' , ICURSOR = > ICURSOR , NPOSITION = > 5 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW , SNAME = > ' NSTATE ' , ICURSOR = > ICURSOR , NPOSITION = > 6 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLD ( RROW = > RDG_ROW , SNAME = > ' DBEGPLAN ' , ICURSOR = > ICURSOR , NPOSITION = > 7 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLD ( RROW = > RDG_ROW , SNAME = > ' DENDPLAN ' , ICURSOR = > ICURSOR , NPOSITION = > 8 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCOST_SUM ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 9 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SCURNAMES ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 10 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW , SNAME = > ' NFIN_IN ' , ICURSOR = > ICURSOR , NPOSITION = > 11 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SLNK_UNIT_NFIN_IN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 12 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NLNK_DOCUMENT_NFIN_IN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 13 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NFIN_OUT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 14 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SLNK_UNIT_NFIN_OUT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 15 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NLNK_DOCUMENT_NFIN_OUT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 16 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_FIN ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 17 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_CONTR ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 18 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_COEXEC ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 19 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NDAYS_LEFT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 20 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_PERIOD ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 21 ) ;
PKG_SQL_DML . COLUMN_VALUE_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 22 , NVALUE = > NCOST_FACT ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NCOST_FACT ' , NVALUE = > NCOST_FACT ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW ,
SNAME = > ' SLNK_UNIT_NCOST_FACT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 23 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NLNK_DOCUMENT_NCOST_FACT ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 24 ) ;
PKG_SQL_DML . COLUMN_VALUE_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 25 , NVALUE = > NSUMM_REALIZ ) ;
if ( NSUMM_REALIZ = 0 ) then
NSUMM_INCOME : = 0 ;
NINCOME_PRC : = 0 ;
else
NSUMM_INCOME : = NSUMM_REALIZ - NCOST_FACT ;
NINCOME_PRC : = NSUMM_INCOME / NCOST_FACT * 100 ;
end if ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NSUMM_REALIZ ' , NVALUE = > NSUMM_REALIZ ) ;
2023-10-21 04:05:01 +03:00
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 ) ;
2023-09-24 22:25:19 +03:00
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 ,
2023-10-21 04:05:01 +03:00
NPOSITION = > 28 ) ;
2023-09-30 02:33:21 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_ACT ' ,
ICURSOR = > ICURSOR ,
2023-10-21 04:05:01 +03:00
NPOSITION = > 29 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLN ( RROW = > RDG_ROW ,
SNAME = > ' NCOST_READY ' ,
ICURSOR = > ICURSOR ,
NPOSITION = > 30 ) ;
2023-09-25 00:26:59 +03:00
/* Добавляем строку в таблицу */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_ROW ( RDATA_GRID = > RDG , RROW = > RDG_ROW ) ;
end loop ;
2023-09-25 00:26:59 +03:00
/* Освобождаем курсор */
2023-09-24 22:25:19 +03:00
PKG_SQL_DML . CLOSE_CURSOR ( ICURSOR = > ICURSOR ) ;
exception
when others then
PKG_SQL_DML . CLOSE_CURSOR ( ICURSOR = > ICURSOR ) ;
raise ;
end ;
2023-09-25 00:26:59 +03:00
/* Сериализуем описание */
2023-09-24 22:25:19 +03:00
COUT : = PKG_P8PANELS_VISUAL . TDATA_GRID_TO_XML ( RDATA_GRID = > RDG , NINCLUDE_DEF = > NINCLUDE_DEF ) ;
end STAGES_LIST ;
2023-09-25 00:26:59 +03:00
/* Подбор записей журнала затрат по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_COST_FACT
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NFPDARTCL in number : = null , -- Р е г . номер статьи калькуляции (null - по всем)
NFINFLOW_TYPE in number : = null , -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
)
is
2023-09-25 00:26:59 +03:00
NSELECTLIST PKG_STD . TREF ; -- Р е г . номер добавленной записи буфера подобранных
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Подберём записи журнала затрат */
2023-09-24 22:25:19 +03:00
for C in ( select CN . COMPANY ,
CN . RN
from PROJECTSTAGE PS ,
FCCOSTNOTES CN ,
FINSTATE FS ,
FPDARTCL FA ,
FINFLOWTYPE FT
where PS . RN = NSTAGE
and PS . FACEACC = CN . PROD_ORDER
and ( ( NFPDARTCL is null ) or ( ( NFPDARTCL is not null ) and ( CN . COST_ARTICLE = NFPDARTCL ) ) )
and CN . COST_TYPE = FS . RN
and FS . TYPE = 1
and CN . COST_ARTICLE = FA . RN
and FA . DEF_FLOW = FT . RN ( + )
2023-10-02 20:22:59 +03:00
and ( ( NFINFLOW_TYPE is null ) or ( ( NFINFLOW_TYPE is not null ) and ( FT . TYPE = NFINFLOW_TYPE ) ) )
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 = CN . CRN ) )
2023-09-24 22:25:19 +03:00
loop
2023-09-25 00:26:59 +03:00
/* Сформируем идентификатор буфера */
2023-09-24 22:25:19 +03:00
if ( NIDENT is null ) then
NIDENT : = GEN_IDENT ( ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Добавим подобранное в список отмеченных записей */
2023-09-24 22:25:19 +03:00
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 STAGE_ARTS_SELECT_COST_FACT ;
2023-09-25 00:26:59 +03:00
/* Получение суммы-факт по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGE_ARTS_GET_COST_FACT
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NFPDARTCL in number : = null , -- Р е г . номер статьи калькуляции (null - по всем)
NFINFLOW_TYPE in number : = null -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход)
) return number -- Сумма-факт по статье
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
NRES PKG_STD . TNUMBER ; -- Буфер для рузультата
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Суммируем факт по лицевому счёту затрат этапа и указанной статье */
2023-09-24 22:25:19 +03:00
select COALESCE ( sum ( CN . COST_BSUM ) , 0 )
into NRES
from PROJECTSTAGE PS ,
FCCOSTNOTES CN ,
FINSTATE FS ,
FPDARTCL FA ,
FINFLOWTYPE FT
where PS . RN = NSTAGE
and PS . FACEACC = CN . PROD_ORDER
and ( ( NFPDARTCL is null ) or ( ( NFPDARTCL is not null ) and ( CN . COST_ARTICLE = NFPDARTCL ) ) )
and CN . COST_TYPE = FS . RN
and FS . TYPE = 1
and CN . COST_ARTICLE = FA . RN
and FA . DEF_FLOW = FT . RN ( + )
and ( ( NFINFLOW_TYPE is null ) or ( ( NFINFLOW_TYPE is not null ) and ( FT . TYPE = NFINFLOW_TYPE ) ) ) ;
2023-09-25 00:26:59 +03:00
/* Возвращаем результат */
2023-09-24 22:25:19 +03:00
return NRES ;
end STAGE_ARTS_GET_COST_FACT ;
2023-09-25 00:26:59 +03:00
/* Подбор записей договоров с соисполнителями по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_CONTR
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NFPDARTCL in number : = null , -- Р е г . номер статьи затрат (null - по всем)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
)
is
2023-09-25 00:26:59 +03:00
NSELECTLIST PKG_STD . TREF ; -- Р е г . номер добавленной записи буфера подобранных
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Подберём записи договоров */
2023-09-24 22:25:19 +03:00
for C in ( select distinct S . COMPANY NCOMPANY ,
S . PRN NRN
from PROJECTSTAGEPF EPF ,
STAGES S
where EPF . PRN = NSTAGE
and EPF . FACEACC = S . FACEACC
2023-10-02 20:22:59 +03:00
and ( ( NFPDARTCL is null ) or ( ( NFPDARTCL is not null ) and ( EPF . COST_ARTICLE = NFPDARTCL ) ) )
and exists ( select null from V_USERPRIV UP where UP . CATALOG = EPF . CRN )
and exists ( select null from V_USERPRIV UP where UP . JUR_PERS = EPF . JUR_PERS and UP . UNITCODE = ' Projects ' )
and exists ( select null from V_USERPRIV UP where UP . CATALOG = S . CRN )
and exists ( select null from V_USERPRIV UP where UP . JUR_PERS = S . JUR_PERS and UP . UNITCODE = ' Contracts ' ) )
2023-09-24 22:25:19 +03:00
loop
2023-09-25 00:26:59 +03:00
/* Сформируем идентификатор буфера */
2023-09-24 22:25:19 +03:00
if ( NIDENT is null ) then
NIDENT : = GEN_IDENT ( ) ;
end if ;
2023-09-25 00:26:59 +03:00
/* Добавим подобранное в список отмеченных записей */
2023-09-24 22:25:19 +03:00
P_SELECTLIST_BASE_INSERT ( NIDENT = > NIDENT ,
NCOMPANY = > C . NCOMPANY ,
NDOCUMENT = > C . NRN ,
SUNITCODE = > ' Contracts ' ,
SACTIONCODE = > null ,
NCRN = > null ,
NDOCUMENT1 = > null ,
SUNITCODE1 = > null ,
SACTIONCODE1 = > null ,
NRN = > NSELECTLIST ) ;
end loop ;
end STAGE_ARTS_SELECT_CONTR ;
2023-09-25 00:26:59 +03:00
/* Получение законтрактованной суммы по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGE_ARTS_GET_CONTR
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
NFPDARTCL in number : = null -- Р е г . номер статьи затрат (null - по всем)
) return number -- Сумма контрактов по статье
2023-09-24 22:25:19 +03:00
is
2023-09-25 00:26:59 +03:00
RSTG PROJECTSTAGE % rowtype ; -- Запись этапа
NTAX_GROUP_DP PKG_STD . TREF ; -- Р е г . номер доп. свойства для налоговой группы проекта
SPRJ_TAX_GROUP PKG_STD . TSTRING ; -- Налоговая группа проекта
NSUM PKG_STD . TNUMBER ; -- Сумма контрактов (без налогов)
NSUM_TAX PKG_STD . TNUMBER ; -- Сумма контрактов (с налогами)
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Считаем запись этапа */
2023-09-24 22:25:19 +03:00
begin
2023-10-21 04:05:01 +03:00
RSTG : = STAGES_GET ( NRN = > NSTAGE ) ;
2023-09-24 22:25:19 +03:00
exception
2023-10-21 04:05:01 +03:00
when others then
2023-09-24 22:25:19 +03:00
null ;
end ;
2023-09-25 00:26:59 +03:00
/* Если считано успешно - будем искать данные */
2023-09-24 22:25:19 +03:00
if ( RSTG . RN is not null ) then
2023-09-25 00:26:59 +03:00
/* Определим р е г . номер доп. свойства для налоговой группы проекта */
2023-09-24 22:25:19 +03:00
FIND_DOCS_PROPS_CODE ( NFLAG_SMART = > 1 ,
NCOMPANY = > RSTG . COMPANY ,
2023-10-02 20:22:59 +03:00
SCODE = > SDP_STAX_GROUP ,
2023-09-24 22:25:19 +03:00
NRN = > NTAX_GROUP_DP ) ;
2023-09-25 00:26:59 +03:00
/* Считаем налоговую группу проекта */
2023-09-24 22:25:19 +03:00
SPRJ_TAX_GROUP : = F_DOCS_PROPS_GET_STR_VALUE ( NPROPERTY = > NTAX_GROUP_DP ,
SUNITCODE = > ' Projects ' ,
NDOCUMENT = > RSTG . PRN ) ;
2023-09-25 00:26:59 +03:00
/* Считаем сумму этапов договоров с соисполнителями */
2023-09-24 22:25:19 +03:00
select COALESCE ( sum ( S . STAGE_SUM ) , 0 ) ,
COALESCE ( sum ( S . STAGE_SUMTAX ) , 0 )
into NSUM ,
NSUM_TAX
from PROJECTSTAGEPF EPF ,
STAGES S
where EPF . PRN = RSTG . RN
and EPF . FACEACC = S . FACEACC
and ( ( NFPDARTCL is null ) or ( ( NFPDARTCL is not null ) and ( EPF . COST_ARTICLE = NFPDARTCL ) ) ) ;
2023-09-25 00:26:59 +03:00
/* Вернём сумму в зависимости от налоговой группы проекта */
2023-09-24 22:25:19 +03:00
if ( SPRJ_TAX_GROUP is not null ) then
return NSUM ;
else
return NSUM_TAX ;
end if ;
else
return 0 ;
end if ;
end STAGE_ARTS_GET_CONTR ;
2023-09-25 00:26:59 +03:00
/* Получение списка статей этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_GET
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
2023-10-21 04:05:01 +03:00
NFPDARTCL in number : = null , -- Р е г . номер статьи затрат (null - брать все)
2023-09-25 00:26:59 +03:00
NINC_COST in number : = 0 , -- Включить сведения о затратах (0 - нет, 1 - да)
NINC_CONTR in number : = 0 , -- Включить сведения о контрактации (0 - нет, 1 - да)
RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта
2023-09-24 22:25:19 +03:00
)
is
2023-09-25 00:26:59 +03:00
RSTG PROJECTSTAGE % rowtype ; -- Запись этапа проекта
NCTL_COST_DP PKG_STD . TREF ; -- Р е г . номер доп. свойства, определяющего необходимость контроля затрат по статье
NCTL_CONTR_DP PKG_STD . TREF ; -- Р е г . номер доп. свойства, определяющего необходимость контроля контрактации по статье
I PKG_STD . TNUMBER ; -- Счётчик статей в результирующей коллекции
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Читаем этап */
2023-09-24 22:25:19 +03:00
RSTG : = STAGES_GET ( NRN = > NSTAGE ) ;
2023-09-25 00:26:59 +03:00
/* Определим дополнительные свойства - контроль затрат */
2023-09-24 22:25:19 +03:00
if ( NINC_COST = 1 ) then
2023-10-02 20:22:59 +03:00
FIND_DOCS_PROPS_CODE ( NFLAG_SMART = > 1 , NCOMPANY = > RSTG . COMPANY , SCODE = > SDP_SCTL_COST , NRN = > NCTL_COST_DP ) ;
2023-09-24 22:25:19 +03:00
end if ;
2023-09-25 00:26:59 +03:00
/* Определим дополнительные свойства - контроль контрактации */
2023-09-24 22:25:19 +03:00
if ( NINC_CONTR = 1 ) then
2023-10-02 20:22:59 +03:00
FIND_DOCS_PROPS_CODE ( NFLAG_SMART = > 1 , NCOMPANY = > RSTG . COMPANY , SCODE = > SDP_SCTL_CONTR , NRN = > NCTL_CONTR_DP ) ;
2023-09-24 22:25:19 +03:00
end if ;
2023-09-25 00:26:59 +03:00
/* Инициализируем коллекцию */
2023-09-24 22:25:19 +03:00
RSTAGE_ARTS : = TSTAGE_ARTS ( ) ;
2023-09-25 00:26:59 +03:00
/* Подбираем активную структуру цены этапа проекта и её обходим статьи */
2023-09-25 00:21:44 +03:00
for C in ( select CSPA . NUMB SNUMB ,
A . RN NARTICLE ,
A . NAME SARTICLE ,
CSPA . COST_SUM NCOST_SUM
from PROJECTSTAGE PS ,
STAGES CS ,
CONTRPRSTRUCT CSP ,
CONTRPRCLC CSPA ,
FPDARTCL A
where PS . RN = RSTG . RN
and PS . FACEACCCUST = CS . FACEACC
and CSP . PRN = CS . RN
and CSP . SIGN_ACT = 1
and CSPA . PRN = CSP . RN
and CSPA . COST_ARTICLE = A . RN
2023-10-21 04:05:01 +03:00
and ( ( NFPDARTCL is null ) or ( ( NFPDARTCL is not null ) and ( A . RN = NFPDARTCL ) ) )
2023-10-02 20:22:59 +03:00
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 )
and exists ( select null from V_USERPRIV UP where UP . JUR_PERS = CS . JUR_PERS and UP . UNITCODE = ' Contracts ' )
2023-09-25 00:21:44 +03:00
order by CSPA . NUMB )
2023-09-24 22:25:19 +03:00
loop
2023-09-25 00:26:59 +03:00
/* Добавим строку в коллекцию */
2023-09-25 00:21:44 +03:00
RSTAGE_ARTS . EXTEND ( ) ;
I : = RSTAGE_ARTS . LAST ;
2023-09-25 00:26:59 +03:00
/* Наполним её значениями из хранилища */
2023-09-25 00:21:44 +03:00
RSTAGE_ARTS ( I ) . NRN : = C . NARTICLE ;
RSTAGE_ARTS ( I ) . SCODE : = C . SNUMB ;
RSTAGE_ARTS ( I ) . SNAME : = C . SARTICLE ;
RSTAGE_ARTS ( I ) . NPLAN : = C . NCOST_SUM ;
2023-09-25 00:26:59 +03:00
/* Если просили включить сведения о затратах и статья поддерживает это */
2023-09-25 00:21:44 +03:00
if ( ( NINC_COST = 1 ) and
( UPPER ( F_DOCS_PROPS_GET_STR_VALUE ( NPROPERTY = > NCTL_COST_DP ,
SUNITCODE = > ' FinPlanArticles ' ,
NDOCUMENT = > RSTAGE_ARTS ( I ) . NRN ) ) = UPPER ( SYES ) ) and
( RSTAGE_ARTS ( I ) . NPLAN is not null ) ) then
2023-09-25 00:26:59 +03:00
/* Фактические затраты по статье */
2023-09-25 00:21:44 +03:00
RSTAGE_ARTS ( I ) . NCOST_FACT : = STAGE_ARTS_GET_COST_FACT ( NSTAGE = > NSTAGE , NFPDARTCL = > RSTAGE_ARTS ( I ) . NRN ) ;
2023-09-25 00:26:59 +03:00
/* Отклонение затрат (план-факт) */
2023-09-25 00:21:44 +03:00
RSTAGE_ARTS ( I ) . NCOST_DIFF : = RSTAGE_ARTS ( I ) . NPLAN - RSTAGE_ARTS ( I ) . NCOST_FACT ;
2023-09-25 00:26:59 +03:00
/* Контроль затрат */
2023-09-25 00:21:44 +03:00
if ( RSTAGE_ARTS ( I ) . NCOST_DIFF > = 0 ) then
RSTAGE_ARTS ( I ) . NCTRL_COST : = 0 ;
else
RSTAGE_ARTS ( I ) . NCTRL_COST : = 1 ;
2023-09-24 22:25:19 +03:00
end if ;
2023-09-25 00:21:44 +03:00
end if ;
2023-09-25 00:26:59 +03:00
/* Если просили включить сведения о контрактах и статья поддерживает это */
2023-09-25 00:21:44 +03:00
if ( ( NINC_CONTR = 1 ) and
( UPPER ( F_DOCS_PROPS_GET_STR_VALUE ( NPROPERTY = > NCTL_CONTR_DP ,
SUNITCODE = > ' FinPlanArticles ' ,
NDOCUMENT = > RSTAGE_ARTS ( I ) . NRN ) ) = UPPER ( SYES ) ) and
( RSTAGE_ARTS ( I ) . NPLAN is not null ) ) then
2023-09-25 00:26:59 +03:00
/* Законтрактовано */
2023-09-25 00:21:44 +03:00
RSTAGE_ARTS ( I ) . NCONTR : = STAGE_ARTS_GET_CONTR ( NSTAGE = > NSTAGE , NFPDARTCL = > RSTAGE_ARTS ( I ) . NRN ) ;
2023-09-25 00:26:59 +03:00
/* Осталось законтрактовать */
2023-09-25 00:21:44 +03:00
RSTAGE_ARTS ( I ) . NCONTR_LEFT : = RSTAGE_ARTS ( I ) . NPLAN - RSTAGE_ARTS ( I ) . NCONTR ;
2023-09-25 00:26:59 +03:00
/* Контроль контрактации */
2023-09-25 00:21:44 +03:00
if ( RSTAGE_ARTS ( I ) . NCONTR_LEFT > = 0 ) then
RSTAGE_ARTS ( I ) . NCTRL_CONTR : = 0 ;
else
RSTAGE_ARTS ( I ) . NCTRL_CONTR : = 1 ;
2023-09-24 22:25:19 +03:00
end if ;
2023-09-25 00:21:44 +03:00
end if ;
end loop ;
2023-09-24 22:25:19 +03:00
end STAGE_ARTS_GET ;
2023-09-25 00:26:59 +03:00
/* Список статей калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_LIST
(
2023-09-25 00:26:59 +03:00
NSTAGE in number , -- Р е г . номер этапа проекта
CFILTERS in clob , -- Фильтры
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
)
is
2023-09-25 00:26:59 +03:00
RF PKG_P8PANELS_VISUAL . TFILTERS ; -- Фильтры
RF_CTRL_COST PKG_P8PANELS_VISUAL . TFILTER ; -- Фильтр по колонке "Контроль (затраты)"
NCTRL_COST_FROM PKG_STD . TNUMBER ; -- Нижняя граница диапазона фильтра по колонке "Контроль (затраты)"
NCTRL_COST_TO PKG_STD . TNUMBER ; -- Верхняя граница диапазона фильтра по колонке "Контроль (затраты)"
RF_CTRL_CONTR PKG_P8PANELS_VISUAL . TFILTER ; -- Фильтр по колонке "Контроль (контрактация)"
NCTRL_CONTR_FROM PKG_STD . TNUMBER ; -- Нижняя граница диапазона фильтра по колонке "Контроль (контрактация)"
NCTRL_CONTR_TO PKG_STD . TNUMBER ; -- Верхняя граница диапазона фильтра по колонке "Контроль (контрактация)"
RDG PKG_P8PANELS_VISUAL . TDATA_GRID ; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL . TROW ; -- Строка таблицы
RCOL_VALS PKG_P8PANELS_VISUAL . TCOL_VALS ; -- Предопределённые значения столбцов
RSTAGE_ARTS TSTAGE_ARTS ; -- Список статей этапа проекта
2023-09-24 22:25:19 +03:00
begin
2023-09-25 00:26:59 +03:00
/* Читаем фильтры */
2023-09-24 22:25:19 +03:00
RF : = PKG_P8PANELS_VISUAL . TFILTERS_FROM_XML ( CFILTERS = > CFILTERS ) ;
2023-09-25 00:26:59 +03:00
/* Найдем фильтр по контролю затрат */
2023-09-24 22:25:19 +03:00
RF_CTRL_COST : = PKG_P8PANELS_VISUAL . TFILTERS_FIND ( RFILTERS = > RF , SNAME = > ' NCTRL_COST ' ) ;
PKG_P8PANELS_VISUAL . TFILTER_TO_NUMBER ( RFILTER = > RF_CTRL_COST , NFROM = > NCTRL_COST_FROM , NTO = > NCTRL_COST_TO ) ;
2023-09-25 00:26:59 +03:00
/* Найдем фильтр по контролю контрактации */
2023-09-24 22:25:19 +03:00
RF_CTRL_CONTR : = PKG_P8PANELS_VISUAL . TFILTERS_FIND ( RFILTERS = > RF , SNAME = > ' NCTRL_CONTR ' ) ;
PKG_P8PANELS_VISUAL . TFILTER_TO_NUMBER ( RFILTER = > RF_CTRL_CONTR , NFROM = > NCTRL_CONTR_FROM , NTO = > NCTRL_CONTR_TO ) ;
2023-09-25 00:26:59 +03:00
/* Инициализируем таблицу данных */
2023-09-24 22:25:19 +03:00
RDG : = PKG_P8PANELS_VISUAL . TDATA_GRID_MAKE ( ) ;
2023-09-25 00:26:59 +03:00
/* Добавляем в таблицу описание колонок */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NRN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Р е г . номер' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SNUMB ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Номер ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SNAME ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Наименование статьи ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NPLAN ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' План ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCOST_FACT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Фактические затраты ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCOST_DIFF ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Отклонение по затратам ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RCOL_VALS , NVALUE = > 0 , BCLEAR = > true ) ;
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_COST ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Контроль (затраты) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BFILTER = > true ,
RCOL_VALS = > RCOL_VALS ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCONTR ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Законтрактовано ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCONTR_LEFT ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Осталось законтрактовать ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BVISIBLE = > false ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NCTRL_CONTR ' ,
2023-09-25 00:26:59 +03:00
SCAPTION = > ' Контроль (контрактация) ' ,
2023-09-24 22:25:19 +03:00
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
BFILTER = > true ,
RCOL_VALS = > RCOL_VALS ) ;
2023-09-25 00:26:59 +03:00
/* Сформируем сведения по статям этапа проекта */
2023-09-24 22:25:19 +03:00
STAGE_ARTS_GET ( NSTAGE = > NSTAGE , NINC_COST = > 1 , NINC_CONTR = > 1 , RSTAGE_ARTS = > RSTAGE_ARTS ) ;
2023-09-25 00:26:59 +03:00
/* Обходим собранные статьи */
2023-09-24 22:25:19 +03:00
if ( ( RSTAGE_ARTS is not null ) and ( RSTAGE_ARTS . COUNT > 0 ) ) then
for I in RSTAGE_ARTS . FIRST . . RSTAGE_ARTS . LAST
loop
2023-09-25 00:26:59 +03:00
/* Если прошли фильтр */
2023-09-24 22:25:19 +03:00
if ( ( ( NCTRL_COST_FROM is null ) or
( ( NCTRL_COST_FROM is not null ) and ( NCTRL_COST_FROM = RSTAGE_ARTS ( I ) . NCTRL_COST ) ) ) and
( ( NCTRL_CONTR_FROM is null ) or
( ( NCTRL_CONTR_FROM is not null ) and ( NCTRL_CONTR_FROM = RSTAGE_ARTS ( I ) . NCTRL_CONTR ) ) ) ) then
2023-09-25 00:26:59 +03:00
/* Добавляем колонки с данными */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW ,
SNAME = > ' NRN ' ,
NVALUE = > RSTAGE_ARTS ( I ) . NRN ,
BCLEAR = > true ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' SNUMB ' , SVALUE = > RSTAGE_ARTS ( I ) . SCODE ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' SNAME ' , SVALUE = > RSTAGE_ARTS ( I ) . SNAME ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NPLAN ' , NVALUE = > RSTAGE_ARTS ( I ) . NPLAN ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NCOST_FACT ' , NVALUE = > RSTAGE_ARTS ( I ) . NCOST_FACT ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NCOST_DIFF ' , NVALUE = > RSTAGE_ARTS ( I ) . NCOST_DIFF ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NCTRL_COST ' , NVALUE = > RSTAGE_ARTS ( I ) . NCTRL_COST ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NCONTR ' , NVALUE = > RSTAGE_ARTS ( I ) . NCONTR ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW ,
SNAME = > ' NCONTR_LEFT ' ,
NVALUE = > RSTAGE_ARTS ( I ) . NCONTR_LEFT ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW ,
SNAME = > ' NCTRL_CONTR ' ,
NVALUE = > RSTAGE_ARTS ( I ) . NCTRL_CONTR ) ;
2023-09-25 00:26:59 +03:00
/* Добавляем строку в таблицу */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_ROW ( RDATA_GRID = > RDG , RROW = > RDG_ROW ) ;
end if ;
end loop ;
end if ;
2023-09-25 00:26:59 +03:00
/* Сериализуем описание */
2023-09-24 22:25:19 +03:00
COUT : = PKG_P8PANELS_VISUAL . TDATA_GRID_TO_XML ( RDATA_GRID = > RDG , NINCLUDE_DEF = > NINCLUDE_DEF ) ;
end STAGE_ARTS_LIST ;
2023-09-30 02:33:21 +03:00
/* Считывание записи соисполнителя этапа проекта */
function STAGE_CONTRACTS_GET_PSPF
(
NPROJECTSTAGEPF in number -- Р е г . номер соисполнителя этапа проекта
) return PROJECTSTAGEPF % rowtype -- Запись соисполнителя этапа проекта
is
RRES PROJECTSTAGEPF % rowtype ; -- Буфер для результата
begin
select PS . * into RRES from PROJECTSTAGEPF PS where PS . RN = NPROJECTSTAGEPF ;
return RRES ;
exception
when NO_DATA_FOUND then
PKG_MSG . RECORD_NOT_FOUND ( NFLAG_SMART = > 0 , NDOCUMENT = > NPROJECTSTAGEPF , SUNIT_TABLE = > ' PROJECTSTAGEPF ' ) ;
end STAGE_CONTRACTS_GET_PSPF ;
2023-09-25 00:26:59 +03:00
/* Список договоров этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_CONTRACTS_COND
is
begin
2023-09-25 00:26:59 +03:00
/* Установка главной таблицы */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . SET_TABLE ( STABLE_NAME = > ' PROJECTSTAGEPF ' ) ;
2023-09-25 00:26:59 +03:00
/* Этап проекта */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . SET_COLUMN_PRN ( SCOLUMN_NAME = > ' PRN ' ) ;
2023-09-25 00:26:59 +03:00
/* Соисполнитель */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER . ADD_CONDITION_CODE ( SCOLUMN_NAME = > ' AGNNAME ' ,
SCONDITION_NAME = > ' EDAGENT ' ,
SJOINS = > ' PERFORMER <- RN;AGNLIST ' ) ;
2023-09-25 00:26:59 +03:00
/* Статья затрат */
2023-09-24 22:25:19 +03:00