P8-Panels/db/PKG_P8PANELS_PROJECTS.pck

6539 lines
438 KiB
SQL
Raw Normal View History

2023-09-24 22:25:19 +03:00
create or replace package PKG_P8PANELS_PROJECTS as
/* Типы данных - статьи этапа проекта */
2023-09-24 22:25:19 +03:00
type TSTAGE_ART is record
(
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
);
/* Типы данных - коллекция статей этапа проекта */
type TSTAGE_ARTS is table of TSTAGE_ART;
2023-09-24 22:25:19 +03:00
/* Отбор проектов */
2023-09-24 22:25:19 +03:00
procedure COND;
/* Получение рег. номера документа основания (договора) проекта */
2023-09-24 22:25:19 +03:00
function GET_DOC_OSN_LNK_DOCUMENT
(
NRN in number -- Рег. номер проекта
) return number; -- Рег. номер документа основания (договора)
2023-09-24 22:25:19 +03:00
/* Подбор платежей финансирования проекта */
2023-09-24 22:25:19 +03:00
procedure SELECT_FIN
(
NRN in number, -- Рег. номер проекта
NDIRECTION in number, -- Направление (0 - приход, 1 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
);
/* Получение суммы входящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_IN
(
NRN in number -- Рег. номер проекта
) return number; -- Сумма входящего финансирования проекта
2023-09-24 22:25:19 +03:00
/* Получение суммы исходящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_OUT
(
NRN in number -- Рег. номер проекта
) return number; -- Сумма исходяшего финансирования проекта
2023-09-24 22:25:19 +03:00
/* Получение состояния финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_FIN
(
NRN in number -- Рег. номер проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния контрактации проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_CONTR
(
NRN in number -- Рег. номер проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния соисполнения проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COEXEC
(
NRN in number -- Рег. номер проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния сроков проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_PERIOD
(
NRN in number -- Рег. номер проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния затрат проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COST
(
NRN in number -- Рег. номер проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния актирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_ACT
(
NRN in number -- Рег. номер проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение % готовности проекта (по затратам) */
function GET_COST_READY
(
NRN in number -- Рег. номер проекта
) return number; -- % готовности
/* Список проектов */
2023-09-24 22:25:19 +03:00
procedure LIST
(
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
);
/* Сфодный график проектов */
procedure GRAPH
(
COUT out clob -- График проектов
);
/* График по данным проектов - "Топ проблем" */
procedure CHART_PROBLEMS
(
COUT out clob -- Сериализованный график
);
/* График по данным проектов - "Топ заказчиков" */
procedure CHART_CUSTOMERS
(
COUT out clob -- Сериализованный график
);
/* График по данным проектов - "Затраты на проекты" */
procedure CHART_FCCOSTNOTES
(
COUT out clob -- Сериализованный график
);
/* График по данным проектов - "Затраты на проекты" (подбор записей журнала затрат по точке графика) */
procedure CHART_FCCOSTNOTES_SELECT_COST
(
NYEAR in number, -- Год
NMONTH in number, -- Месяц
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
);
/* Отбор этапов проектов */
2023-09-24 22:25:19 +03:00
procedure STAGES_COND;
/* Подбор платежей финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGES_SELECT_FIN
(
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-24 22:25:19 +03:00
function STAGES_GET_FIN_IN
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Сумма входящего финансирования проекта
2023-09-24 22:25:19 +03:00
/* Получение суммы исходящего финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_FIN_OUT
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Сумма исходяшего финансирования проекта
2023-09-24 22:25:19 +03:00
/* Получение состояния финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_FIN
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния контрактации этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_CONTR
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния соисполнения этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COEXEC
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния сроков этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_PERIOD
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния затрат этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COST
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение состояния актирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_ACT
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
/* Получение остатка срока исполнения этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_DAYS_LEFT
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Количество дней (null - не определено)
2023-09-24 22:25:19 +03:00
/* Подбор записей журнала затрат этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGES_SELECT_COST_FACT
(
NRN in number, -- Рег. номер этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
);
/* Получение суммы фактических затрат этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_COST_FACT
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Сумма фактических затрат
2023-09-24 22:25:19 +03:00
/* Подбор записей расходных накладных на отпуск потребителям этапа проекта */
procedure STAGES_SELECT_SUMM_REALIZ
(
NRN in number, -- Рег. номер этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
);
/* Получение суммы реализации этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_SUMM_REALIZ
(
NRN in number, -- Рег. номер этапа проекта
NFPDARTCL_REALIZ in number -- Рег. номер статьи калькуляции для реализации
) return number; -- Сумма реализации
2023-09-24 22:25:19 +03:00
/* Получение % готовности этапа проекта (по затратам) */
function STAGES_GET_COST_READY
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Сумма реализации
/* Список этапов */
2023-09-24 22:25:19 +03:00
procedure STAGES_LIST
(
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-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_COST_FACT
(
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-24 22:25:19 +03:00
function STAGE_ARTS_GET_COST_FACT
(
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-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_CONTR
(
NSTAGE in number, -- Рег. номер этапа проекта
NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - по всем)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
);
/* Получение списка статей этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_GET
(
NSTAGE in number, -- Рег. номер этапа проекта
NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - брать все)
NINC_COST in number := 0, -- Включить сведения о затратах (0 - нет, 1 - да)
NINC_CONTR in number := 0, -- Включить сведения о контрактации (0 - нет, 1 - да)
RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта
2023-09-24 22:25:19 +03:00
);
/* Список статей калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_LIST
(
NSTAGE in number, -- Рег. номер этапа проекта
CFILTERS in clob, -- Фильтры
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
);
/* Список договоров этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_CONTRACTS_COND;
/* Подбор входящих счетов на оплату соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_PAY_IN
(
NPROJECTSTAGEPF in number, -- Рег. номер соисполнителя этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
);
/* Подбор приходных накладных соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_ININV
(
NPROJECTSTAGEPF in number, -- Рег. номер соисполнителя этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
);
/* Подбор платежей финансирования соисполнителя этапа проекта */
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 - есть отклонения)
/* Получение состояния соисполнения по договору соисполнителя этапа проекта */
function STAGE_CONTRACTS_GET_CTRL_COEXE
(
NPROJECTSTAGEPF in number -- Рег. номер соисполнителя этапа проекта
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
/* Получение сведений по договору соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_GET
(
NPROJECTSTAGEPF in number, -- Рег. номер соисполнителя этапа проекта
NINC_FIN in number := 0, -- Включить сведения о финансировании (0 - нет, 1 - да)
NINC_COEXEC in number := 0, -- Включить сведения о соисполнении (0 - нет, 1 - да)
NPAY_IN out number, -- Сведения о финансировании - сумма акцептованных счетов на оплату
NFIN_OUT out number, -- Сведения о финансировании - сумма оплаченных счетов на оплату
NPAY_IN_REST out number, -- Сведения о финансировании - сумма оставшихся к оплате счетов на оплату
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-24 22:25:19 +03:00
procedure STAGE_CONTRACTS_LIST
(
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
);
/* Получение списка проектов */
procedure JB_PRJCTS_LIST
(
NIDENT in number, -- Идентификатор процесса
COUT out clob -- Список проектов
);
/* Изменение сроков работы в буфере балансировки */
procedure JB_JOBS_MODIFY_PERIOD
(
NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа
DDATE_FROM in date, -- Новая дата начала
DDATE_TO in date, -- Новая дата окончания
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли)
);
/* Получение списка работ проектов для диаграммы Ганта */
procedure JB_JOBS_LIST
(
NIDENT in number, -- Идентификатор процесса
NPRN in number, -- Рег. номер родителя
NINCLUDE_DEF in number, -- Признак включения описания диаграммы в ответ
COUT out clob -- Список проектов
);
/* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */
procedure JB_PERIODS_PLAN_FOT_LIST
(
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 -- Сериализованная таблица данных
);
/* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */
procedure JB_PERIODS_FACT_RPT_LIST
(
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 -- Сериализованная таблица данных
);
/* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */
procedure JB_PERIODS_PLAN_JOBS_LIST
(
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 -- Сериализованная таблица данных
);
/* Пересчёт периодов балансировки */
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 -- Сериализованная таблица данных
);
/* Очистка данных балансировки */
procedure JB_CLEAN
(
NIDENT in number -- Идентификатор процесса
);
/* Перенос данных буфера балансировки в проекты */
procedure JB_SAVE
(
NIDENT in number, -- Идентификатор процесса
COUT out clob -- Список проектов
);
/* Формирование исходных данных для балансировки планов-графиков работ */
procedure JB_INIT
(
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-09-24 22:25:19 +03:00
end PKG_P8PANELS_PROJECTS;
/
create or replace package body PKG_P8PANELS_PROJECTS as
/* Константы - предопределённые значения */
SYES constant PKG_STD.TSTRING := 'Да'; -- Да
NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков
SFPDARTCL_REALIZ constant PKG_STD.TSTRING := '14 Цена без НДС'; -- Мнемокод статьи калькуляции для учёта реализации
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
/* Константы - дополнительные свойства */
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'; -- Принзнак необходимости контроля контрактации по статье калькуляции
/* Считывание наименование подразделения по рег. номеру */
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-24 22:25:19 +03:00
function GET
(
NRN in number -- Рег. номер проекта
) return PROJECT%rowtype -- Запись проекта
2023-09-24 22:25:19 +03:00
is
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;
/* Проверка пользователя на ответственность за проект */
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-24 22:25:19 +03:00
procedure COND
as
begin
/* Установка главной таблицы */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'PROJECT');
/* Тип проекта */
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-24 22:25:19 +03:00
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE', SCONDITION_NAME => 'EDMNEMO');
/* Наименование */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME', SCONDITION_NAME => 'EDNAME');
/* Услованое наименование */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME_USL', SCONDITION_NAME => 'EDNAME_USL');
/* Дата начала план */
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-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-24 22:25:19 +03:00
PKG_COND_BROKER.ADD_CONDITION_ENUM(SCOLUMN_NAME => 'STATE', SCONDITION_NAME => 'CGSTATE');
/* Заказчик */
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then
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'));
end if;
/* Контроль контрактации */
2023-09-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_CONTR') = 1) then
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COEXEC') = 1) then
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_PERIOD') = 1) then
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COST') = 1) then
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_ACT') = 1) then
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;
/* Готовность (%, по затратам) */
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_COST_READY') ||
'(RN) >= :EDCOST_READYFrom');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_COST_READY') ||
'(RN) <= :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_COST_READY') ||
'(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
2023-09-24 22:25:19 +03:00
end COND;
/* Получение рег. номера документа основания (договора) проекта */
2023-09-24 22:25:19 +03:00
function GET_DOC_OSN_LNK_DOCUMENT
(
NRN in number -- Рег. номер проекта
) return number -- Рег. номер документа основания (договора)
2023-09-24 22:25:19 +03:00
is
begin
/* Подберём договор с заказчиком по ЛС этапа проекта */
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
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-24 22:25:19 +03:00
return C.RN;
end loop;
/* Ничего не нашли */
2023-09-24 22:25:19 +03:00
return null;
end GET_DOC_OSN_LNK_DOCUMENT;
/* Подбор платежей финансирования проекта */
2023-09-24 22:25:19 +03:00
procedure SELECT_FIN
(
NRN in number, -- Рег. номер проекта
NDIRECTION in number, -- Направление (0 - приход, 1 - расход)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
)
is
begin
/* Подберём платежи */
2023-09-24 22:25:19 +03:00
STAGES_SELECT_FIN(NPRN => NRN, NDIRECTION => NDIRECTION, NIDENT => NIDENT);
end SELECT_FIN;
/* Получение суммы входящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_IN
(
NRN in number -- Рег. номер проекта
) return number -- Сумма входящего финансирования проекта
2023-09-24 22:25:19 +03:00
is
NRES PKG_STD.TNUMBER := 0; -- Буфер для результата
2023-09-24 22:25:19 +03:00
begin
/* Обходим этапы и считаем */
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-24 22:25:19 +03:00
return NRES;
end GET_FIN_IN;
/* Получение суммы исходящего финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_FIN_OUT
(
NRN in number -- Рег. номер проекта
) return number -- Сумма исходяшего финансирования проекта
2023-09-24 22:25:19 +03:00
is
NRES PKG_STD.TNUMBER := 0; -- Буфер для результата
2023-09-24 22:25:19 +03:00
begin
/* Обходим этапы и считаем */
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-24 22:25:19 +03:00
return NRES;
end GET_FIN_OUT;
/* Получение состояния финансирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_FIN
(
NRN in number -- Рег. номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
loop
/* Увеличим счётчик этапов */
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;
/* Если у этапа есть отклонение - оно есть и у проекта */
if (NSTAGE_CTRL = 1) then
2023-09-24 22:25:19 +03:00
return 1;
end if;
end loop;
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
if (NCNT_NULL = NCNT_STAGES) then
return null;
end if;
/* Если мы здесь - отклонений нет */
if (NCNT_STAGES > 0) then
2023-09-24 22:25:19 +03:00
return 0;
else
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null;
end if;
end GET_CTRL_FIN;
/* Получение состояния контрактации проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_CONTR
(
NRN in number -- Рег. номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
loop
/* Увеличим счётчик этапов */
2023-09-24 22:25:19 +03:00
NCNT_STAGES := NCNT_STAGES + 1;
/* Получим состояние этапа */
2023-09-24 22:25:19 +03:00
NSTAGE_CTRL := STAGES_GET_CTRL_CONTR(NRN => C.RN);
/* Подсчитаем количество "безконтрольных" */
2023-09-24 22:25:19 +03:00
if (NSTAGE_CTRL is null) then
NCNT_NULL := NCNT_NULL + 1;
end if;
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-24 22:25:19 +03:00
if (NSTAGE_CTRL = 1) then
return 1;
end if;
end loop;
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
2023-09-24 22:25:19 +03:00
if (NCNT_NULL = NCNT_STAGES) then
return null;
end if;
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
if (NCNT_STAGES > 0) then
return 0;
else
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null;
end if;
end GET_CTRL_CONTR;
/* Получение состояния соисполнения проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COEXEC
(
NRN in number -- Рег. номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
loop
/* Увеличим счётчик этапов */
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;
/* Если у этапа есть отклонение - оно есть и у проекта */
if (NSTAGE_CTRL = 1) then
2023-09-24 22:25:19 +03:00
return 1;
end if;
end loop;
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
if (NCNT_NULL = NCNT_STAGES) then
return null;
end if;
/* Если мы здесь - отклонений нет */
if (NCNT_STAGES > 0) then
2023-09-24 22:25:19 +03:00
return 0;
else
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null;
end if;
end GET_CTRL_COEXEC;
/* Получение состояния сроков проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_PERIOD
(
NRN in number -- Рег. номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
loop
/* Увеличим счётчик этапов */
2023-09-24 22:25:19 +03:00
NCNT_STAGES := NCNT_STAGES + 1;
/* Получим состояние этапа */
2023-09-24 22:25:19 +03:00
NSTAGE_CTRL := STAGES_GET_CTRL_PERIOD(NRN => C.RN);
/* Подсчитаем количество "безконтрольных" */
2023-09-24 22:25:19 +03:00
if (NSTAGE_CTRL is null) then
NCNT_NULL := NCNT_NULL + 1;
end if;
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-24 22:25:19 +03:00
if (NSTAGE_CTRL = 1) then
return 1;
end if;
end loop;
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
2023-09-24 22:25:19 +03:00
if (NCNT_NULL = NCNT_STAGES) then
return null;
end if;
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
if (NCNT_STAGES > 0) then
return 0;
else
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null;
end if;
end GET_CTRL_PERIOD;
/* Получение состояния затрат проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_COST
(
NRN in number -- Рег. номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
loop
/* Увеличим счётчик этапов */
2023-09-24 22:25:19 +03:00
NCNT_STAGES := NCNT_STAGES + 1;
/* Получим состояние этапа */
2023-09-24 22:25:19 +03:00
NSTAGE_CTRL := STAGES_GET_CTRL_COST(NRN => C.RN);
/* Подсчитаем количество "безконтрольных" */
2023-09-24 22:25:19 +03:00
if (NSTAGE_CTRL is null) then
NCNT_NULL := NCNT_NULL + 1;
end if;
/* Если у этапа есть отклонение - оно есть и у проекта */
2023-09-24 22:25:19 +03:00
if (NSTAGE_CTRL = 1) then
return 1;
end if;
end loop;
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
2023-09-24 22:25:19 +03:00
if (NCNT_NULL = NCNT_STAGES) then
return null;
end if;
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
if (NCNT_STAGES > 0) then
return 0;
else
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null;
end if;
end GET_CTRL_COST;
/* Получение состояния актирования проекта */
2023-09-24 22:25:19 +03:00
function GET_CTRL_ACT
(
NRN in number -- Рег. номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
loop
/* Увеличим счётчик этапов */
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;
/* Если у этапа есть отклонение - оно есть и у проекта */
if (NSTAGE_CTRL = 1) then
2023-09-24 22:25:19 +03:00
return 1;
end if;
end loop;
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
if (NCNT_NULL = NCNT_STAGES) then
return null;
end if;
/* Если мы здесь - отклонений нет */
if (NCNT_STAGES > 0) then
2023-09-24 22:25:19 +03:00
return 0;
else
/* Нет этапов и нет контроля */
2023-09-24 22:25:19 +03:00
return null;
end if;
end GET_CTRL_ACT;
/* Получение % готовности проекта (по затратам) */
function GET_COST_READY
(
NRN in number -- Рег. номер проекта
) return number -- % готовности
is
RP PROJECT%rowtype; -- Запись проекта
NFPDARTCL_SELF_COST PKG_STD.TREF; -- Рег. номер статьи себестоимости
NCOST_FACT PKG_STD.TNUMBER := 0; -- Сумма фактических затрат по проекту
NSELF_COST_PLAN PKG_STD.TNUMBER := 0; -- Плановая себестоимость проекта
RSTG_SELF_COST_PLAN TSTAGE_ARTS; -- Плановая себестоимость этапа
NRES PKG_STD.TNUMBER := 0; -- Буфер для результата
begin
/* Читаем проект */
RP := GET(NRN => NRN);
/* Определим рег. номер статьи калькуляции для учёта себестоимости */
FIND_FPDARTCL_CODE(NFLAG_SMART => 1,
NCOMPANY => RP.COMPANY,
SCODE => SFPDARTCL_SELF_COST,
NRN => NFPDARTCL_SELF_COST);
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = RP.RN)
loop
/* Накапливаем сумму фактических затрат */
NCOST_FACT := NCOST_FACT + STAGES_GET_COST_FACT(NRN => C.RN);
/* Накапливаем плановую себестоимость */
STAGE_ARTS_GET(NSTAGE => C.RN, NFPDARTCL => NFPDARTCL_SELF_COST, RSTAGE_ARTS => RSTG_SELF_COST_PLAN);
if ((RSTG_SELF_COST_PLAN.COUNT = 1) and (RSTG_SELF_COST_PLAN(RSTG_SELF_COST_PLAN.LAST).NPLAN <> 0)) then
NSELF_COST_PLAN := NSELF_COST_PLAN + RSTG_SELF_COST_PLAN(RSTG_SELF_COST_PLAN.LAST).NPLAN;
end if;
end loop;
/* Если есть и фактические затраты и плановая себестоимость */
if ((NCOST_FACT > 0) and (NSELF_COST_PLAN > 0)) then
/* Отношение фактических затрат к плановой себестоимость - искомый % готовности */
NRES := ROUND(NCOST_FACT / NSELF_COST_PLAN * 100, 0);
/* Если затраты превысили себестоимость, то % может быть > 100, но это бессмысленно, откорректируем ситуацию */
if (NRES > 100) then
NRES := 100;
end if;
end if;
/* Вернём рассчитанное */
return NRES;
end GET_COST_READY;
/* Список проектов */
2023-09-24 22:25:19 +03:00
procedure LIST
(
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
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-24 22:25:19 +03:00
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
/* Читаем сортировки */
2023-09-24 22:25:19 +03:00
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
/* Преобразуем номер и размер страницы в номер строк с и по */
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-24 22:25:19 +03:00
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
/* Добавляем в таблицу описание колонок */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NRN',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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,
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',
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,
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',
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,
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Соисполнение</b> - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках проекта.<br>' ||
'<b style="color:red">Требует внимания</b> - в проекте есть этапы, до окончания которых осталось менее ' ||
TO_CHAR(NDAYS_LEFT_LIMIT) ||
' дней, при этом зафиксирован положительный остаток к поставке/актированию по договорам соисполнителей данного этапа.<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',
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,
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Сроки</b> - контроль сроков исполнения работ по проекту.<br>' ||
'<b style="color:red">Требует внимания</b> - в проекте есть этапы, до окончания которых осталось менее ' ||
TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.<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_COST',
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,
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',
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,
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Актирование</b> - контроль актирования работ, выполненных по проекту, со стороны заказчика.<br>' ||
'<b style="color:red">Требует внимания</b> - в проекте есть этапы, в состоянии "Закрыт", но при этом в Системе отсутствует утверждённая "Расходная накладная на отпуск потребителю" для данного этапа.<br>' ||
'<b style="color:green">В норме</b> - нет этапов с отклонениями, описанными выше.<br>' ||
'<b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что этапы, по которым завершены работы, переведены в состояние "Закрыт".');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCOST_READY',
SCAPTION => 'Готов (%, затраты)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCOST_READYFrom',
SCOND_TO => 'EDCOST_READYTo',
BORDER => true,
BFILTER => true);
/* Определим дополнительные свойства - ответственный экономист */
FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SDP_SECON_RESP, NRN => NECON_RESP_DP);
/* Обходим данные */
2023-09-24 22:25:19 +03:00
begin
/* Добавляем подсказку совместимости */
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') || ')');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.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-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Учтём фильтры */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT,
NCOMPANY => NCOMPANY,
SUNIT => 'Projects',
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-24 22:25:19 +03:00
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
/* Делаем подстановку параметров */
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-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);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 32);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 33);
/* Делаем выборку */
2023-09-24 22:25:19 +03:00
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
end if;
/* Обходим выбранные записи */
2023-09-24 22:25:19 +03:00
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop
/* Добавляем колонки с данными */
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,
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,
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);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NCOST_READY',
ICURSOR => ICURSOR,
NPOSITION => 32);
/* Добавляем строку в таблицу */
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-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-24 22:25:19 +03:00
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end LIST;
/* Сфодный график проектов */
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)
and P.BEGPLAN is not null
and P.ENDPLAN is not null
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)
and PS.BEGPLAN is not null
and PS.ENDPLAN is not null
and PS.HRN is null);
/* Инициализируем таблицу данных */
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1);
/* Если есть данные о начале и окончании проектов в портфеле */
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 => 'Работы',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
NWIDTH => 300);
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)
loop
SYEAR_COL_NAME := TO_CHAR(Y);
if (Y = EXTRACT(year from sysdate)) then
BEXPANDED := true;
else
BEXPANDED := false;
end if;
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;
end loop;
/* Обходим открытые проекты */
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)
loop
/* Добвим группу для проекта */
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;
end loop;
end if;
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
end GRAPH;
/* График по данным проектов - "Топ проблем" */
procedure CHART_PROBLEMS
(
COUT out clob -- Сериализованный график
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RCH PKG_P8PANELS_VISUAL.TCHART; -- График
RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных
RATTR_VALS PKG_P8PANELS_VISUAL.TCHART_DATASET_ITEM_ATTR_VALS; -- Атрибуты элемента набора данных
begin
/* Сформируем заголовок графика */
RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_BAR,
STITLE => 'Топ проблем',
SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_TOP);
/* Сформируем набор данных */
RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => 'Кол-во проектов с проблемой');
/* Строим список проблем по убыванию количества */
for C in (select D.SFILTER,
D.SNAME,
D.NCOUNT
from (select 'NCTRL_FIN' SFILTER,
'Финансирование' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_FIN(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_CONTR' SFILTER,
'Контрактация' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_COEXEC' SFILTER,
'Соисполнение' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_PERIOD' SFILTER,
'Сроки' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_COST' SFILTER,
'Затраты' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_COST(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')
union all
select 'NCTRL_ACT' SFILTER,
'Актирование' SNAME,
count(P.RN) NCOUNT
from PROJECT P
where P.COMPANY = NCOMPANY
and PKG_P8PANELS_PROJECTS.GET_CTRL_ACT(P.RN) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'Projects')) D
order by D.NCOUNT desc)
loop
/* Если проблема выявлена */
if (C.NCOUNT > 0) then
/* Добавим метку для проблемы */
PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => C.SNAME);
/* Добавим проблему в набор данных */
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER',
SVALUE => C.SFILTER,
BCLEAR => true);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER_VALUE',
SVALUE => '1');
PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => C.NCOUNT, RATTR_VALS => RATTR_VALS);
end if;
end loop;
/* Добавим набор данных в график */
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
end CHART_PROBLEMS;
/* График по данным проектов - "Топ заказчиков" */
procedure CHART_CUSTOMERS
(
COUT out clob -- Сериализованный график
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RCH PKG_P8PANELS_VISUAL.TCHART; -- График
RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных
RATTR_VALS PKG_P8PANELS_VISUAL.TCHART_DATASET_ITEM_ATTR_VALS; -- Атрибуты элемента набора данных
begin
/* Сформируем заголовок графика */
RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_PIE,
STITLE => 'Топ заказчиков',
SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_RIGHT);
/* Сформируем набор данных */
RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => 'Стоимость проектов');
/* Обходим проекты, сгруппированные по внешним заказчикам */
for C in (select D.SEXT_CUST,
D.NSUM
from (select EC.AGNABBR SEXT_CUST,
sum(P.COST_SUM_BASECURR) NSUM
from PROJECT P,
AGNLIST EC
where P.COMPANY = NCOMPANY
and P.EXT_CUST = EC.RN
group by EC.AGNABBR
order by 2 desc) D
where ROWNUM <= 5)
loop
/* Добавим метку для контрагента */
PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => C.SEXT_CUST);
/* Добавим контрагента в набор данных */
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER',
SVALUE => 'SEXT_CUST',
BCLEAR => true);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SFILTER_VALUE',
SVALUE => C.SEXT_CUST);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => C.NSUM, RATTR_VALS => RATTR_VALS);
end loop;
/* Добавим набор данных в график */
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
end CHART_CUSTOMERS;
/* График по данным проектов - "Затраты на проекты" */
procedure CHART_FCCOSTNOTES
(
COUT out clob -- Сериализованный график
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RCH PKG_P8PANELS_VISUAL.TCHART; -- График
RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных
RATTR_VALS PKG_P8PANELS_VISUAL.TCHART_DATASET_ITEM_ATTR_VALS; -- Атрибуты элемента набора данных
NYEAR PKG_STD.TNUMBER; -- Текущий год
NSUM PKG_STD.TNUMBER; -- Сумма затрат в текущем месяце
begin
NYEAR := TO_NUMBER(TO_CHAR(sysdate, 'yyyy'));
/* Сформируем заголовок графика */
RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_LINE,
STITLE => 'Затраты на проекты в ' || TO_CHAR(NYEAR) || ' году',
SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_TOP);
/* Сформируем набор данных */
RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => 'Сумма затрат (тыс. руб.)');
/* Обходим месяцы года */
for I in 1 .. 12
loop
/* Суммируем затраты этого месяца, отнесённые на проекты */
select COALESCE(sum(CN.COST_BSUM) / 1000, 0)
into NSUM
from FCCOSTNOTES CN
where CN.COMPANY = NCOMPANY
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'mm')) = I
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'yyyy')) = NYEAR
and exists (select null from V_USERPRIV UP where UP.CATALOG = CN.CRN)
and CN.PROD_ORDER in (select PS.FACEACC
from PROJECTSTAGE PS
where PS.COMPANY = CN.COMPANY
and exists (select null from V_USERPRIV UP where UP.CATALOG = PS.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = PS.JUR_PERS
and UP.UNITCODE = 'Projects'));
/* Добавим метку для месяца */
PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => F_GET_MONTH(NVALUE => I));
/* Добавим месяц в набор данных */
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS,
SNAME => 'SUNITCODE',
SVALUE => 'CostNotes',
BCLEAR => true);
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NYEAR', SVALUE => TO_CHAR(NYEAR));
PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NMONTH', SVALUE => TO_CHAR(I));
PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => NSUM, RATTR_VALS => RATTR_VALS);
end loop;
/* Добавим набор данных в график */
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
end CHART_FCCOSTNOTES;
/* График по данным проектов - "Затраты на проекты" (подбор записей журнала затрат по точке графика) */
procedure CHART_FCCOSTNOTES_SELECT_COST
(
NYEAR in number, -- Год
NMONTH in number, -- Месяц
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
begin
/* Подберём записи журнала затрат */
for C in (select CN.COMPANY,
CN.RN
from FCCOSTNOTES CN
where CN.COMPANY = NCOMPANY
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'mm')) = NMONTH
and TO_NUMBER(TO_CHAR(CN.COST_DATE, 'yyyy')) = NYEAR
and exists
(select null from V_USERPRIV UP where UP.CATALOG = CN.CRN)
and CN.PROD_ORDER in (select PS.FACEACC
from PROJECTSTAGE PS
where PS.COMPANY = CN.COMPANY
and exists (select null from V_USERPRIV UP where UP.CATALOG = PS.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = PS.JUR_PERS
and UP.UNITCODE = 'Projects')))
loop
/* Сформируем идентификатор буфера */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
NCOMPANY => C.COMPANY,
NDOCUMENT => C.RN,
SUNITCODE => 'CostNotes',
SACTIONCODE => null,
NCRN => null,
NDOCUMENT1 => null,
SUNITCODE1 => null,
SACTIONCODE1 => null,
NRN => NSELECTLIST);
end loop;
end CHART_FCCOSTNOTES_SELECT_COST;
/* Считывание записи этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET
(
NRN in number -- Рег. номер этапа проекта
) return PROJECTSTAGE%rowtype -- Запись этапа проекта
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
procedure STAGES_COND
as
begin
/* Установка главной таблицы */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'PROJECTSTAGE');
/* Проект */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.SET_COLUMN_PRN(SCOLUMN_NAME => 'PRN');
/* Номер */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NUMB', SCONDITION_NAME => 'EDNUMB');
/* Наименование */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME', SCONDITION_NAME => 'EDNAME');
/* Дата начала план */
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-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-24 22:25:19 +03:00
PKG_COND_BROKER.ADD_CONDITION_ENUM(SCOLUMN_NAME => 'STATE', SCONDITION_NAME => 'CGSTATE');
/* Контроль финансирования */
2023-09-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then
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'));
end if;
/* Контроль контрактации */
2023-09-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_CONTR') = 1) then
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COEXEC') = 1) then
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_PERIOD') = 1) then
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-24 22:25:19 +03:00
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COST') = 1) then
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;
/* Контроль актирования */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_ACT') = 1) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT') || '(RN) = :EDCTRL_ACT');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_ACT',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_ACT'));
end if;
/* Готовность (%, по затратам) */
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(RN) >= :EDCOST_READYFrom');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 0)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(RN) <= :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1)) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
2023-09-24 22:25:19 +03:00
end STAGES_COND;
/* Подбор платежей финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGES_SELECT_FIN
(
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
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
2023-09-24 22:25:19 +03:00
begin
/* Подберём платежи */
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
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)))
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-24 22:25:19 +03:00
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
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-24 22:25:19 +03:00
function STAGES_GET_FIN
(
NRN in number, -- Рег. номер этапа проекта
NDIRECTION in number -- Направление (0 - приход, 1 - расход)
) return number -- Сумма финансирования проекта
2023-09-24 22:25:19 +03:00
is
NRES PKG_STD.TNUMBER; -- Буфер для рузультата
2023-09-24 22:25:19 +03:00
begin
/* Суммируем фактические платежи нужного направления по лицевому счёту затрат этапа */
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-24 22:25:19 +03:00
return NRES;
end STAGES_GET_FIN;
/* Получение суммы входящего финансирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_FIN_IN
(
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-24 22:25:19 +03:00
function STAGES_GET_FIN_OUT
(
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-24 22:25:19 +03:00
function STAGES_GET_CTRL_FIN
(
NRN in number -- Рег. номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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
/* Обходим соисполнителей этапа */
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-24 22:25:19 +03:00
function STAGES_GET_CTRL_CONTR
(
NRN in number -- Рег. номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
RSTAGE_ARTS TSTAGE_ARTS; -- Сведения о контрактации по статьям этапа
NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество статей с неопределённым состоянием
2023-09-24 22:25:19 +03:00
begin
/* Получим сведения о контрактации по статьям */
2023-09-24 22:25:19 +03:00
STAGE_ARTS_GET(NSTAGE => NRN, NINC_CONTR => 1, RSTAGE_ARTS => RSTAGE_ARTS);
/* Если сведения есть - будем разбираться */
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-24 22:25:19 +03:00
if (RSTAGE_ARTS(I).NCTRL_CONTR = 1) then
/* То и этап имеет отклонение */
2023-09-24 22:25:19 +03:00
return 1;
end if;
end loop;
/* Если ни одна статья не подлежит контролю - то и состояние этапа тоже */
2023-09-24 22:25:19 +03:00
if (NCNT_NULL = RSTAGE_ARTS.COUNT) then
return null;
end if;
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
return 0;
else
/* Нет данных по статьям */
2023-09-24 22:25:19 +03:00
return null;
end if;
end STAGES_GET_CTRL_CONTR;
/* Получение состояния соисполнения этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COEXEC
(
NRN in number -- Рег. номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
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
/* Обходим соисполнителей этапа */
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-24 22:25:19 +03:00
function STAGES_GET_CTRL_PERIOD
(
NRN in number -- Рег. номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
NDAYS_LEFT PKG_STD.TNUMBER; -- Остаток дней до завершения этапа
2023-09-24 22:25:19 +03:00
begin
/* Получим количество дней до завершения */
2023-09-24 22:25:19 +03:00
NDAYS_LEFT := STAGES_GET_DAYS_LEFT(NRN => NRN);
/* Если мы не знаем количества дней - то не можем и контролировать */
2023-09-24 22:25:19 +03:00
if (NDAYS_LEFT is null) then
return null;
end if;
/* Если осталось меньше определённого лимита */
2023-09-24 22:25:19 +03:00
if (NDAYS_LEFT < NDAYS_LEFT_LIMIT) then
/* На это необходимо обратить внимание */
2023-09-24 22:25:19 +03:00
return 1;
else
/* Отклонений нет */
2023-09-24 22:25:19 +03:00
return 0;
end if;
end STAGES_GET_CTRL_PERIOD;
/* Получение состояния затрат этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_COST
(
NRN in number -- Рег. номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
RSTAGE_ARTS TSTAGE_ARTS; -- Сведения о затратах по статьям этапа
NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество статей с неопределённым состоянием
2023-09-24 22:25:19 +03:00
begin
/* Получим сведения о затратах по статьям */
2023-09-24 22:25:19 +03:00
STAGE_ARTS_GET(NSTAGE => NRN, NINC_COST => 1, RSTAGE_ARTS => RSTAGE_ARTS);
/* Если сведения есть - будем разбираться */
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-24 22:25:19 +03:00
if (RSTAGE_ARTS(I).NCTRL_COST = 1) then
/* То и этап имеет отклонение */
2023-09-24 22:25:19 +03:00
return 1;
end if;
end loop;
/* Если ни одна статья не подлежит контролю - то и состояние этапа тоже */
2023-09-24 22:25:19 +03:00
if (NCNT_NULL = RSTAGE_ARTS.COUNT) then
return null;
end if;
/* Если мы здесь - отклонений нет */
2023-09-24 22:25:19 +03:00
return 0;
else
/* Нет данных по статьям */
2023-09-24 22:25:19 +03:00
return null;
end if;
end STAGES_GET_CTRL_COST;
/* Получение состояния актирования этапа проекта */
2023-09-24 22:25:19 +03:00
function STAGES_GET_CTRL_ACT
(
NRN in number -- Рег. номер этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
2023-09-24 22:25:19 +03:00
is
RPS PROJECTSTAGE%rowtype; -- Запись этапа проекта
NTRANSINVCUST PKG_STD.TREF; -- Рег. номер РНОПотр, закрывающей этап
2023-09-24 22:25:19 +03:00
begin
/* Читаем запись этапа */
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-24 22:25:19 +03:00
function STAGES_GET_DAYS_LEFT
(
NRN in number -- Рег. номер этапа проекта
) return number -- Количество дней (null - не определено)
2023-09-24 22:25:19 +03:00
is
RSTG PROJECTSTAGE%rowtype; -- Запись этапа
2023-09-24 22:25:19 +03:00
begin
/* Считаем этап */
2023-09-24 22:25:19 +03:00
RSTG := STAGES_GET(NRN => NRN);
/* Вернём остаток дней */
2023-09-24 22:25:19 +03:00
if (RSTG.ENDPLAN is not null) then
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-24 22:25:19 +03:00
procedure STAGES_SELECT_COST_FACT
(
NRN in number, -- Рег. номер этапа проекта
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-24 22:25:19 +03:00
function STAGES_GET_COST_FACT
(
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;
/* Подбор записей расходных накладных на отпуск потребителям этапа проекта */
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-24 22:25:19 +03:00
function STAGES_GET_SUMM_REALIZ
(
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;
/* Получение % готовности этапа проекта (по затратам) */
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-24 22:25:19 +03:00
procedure STAGES_LIST
(
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
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
/* Определим рег. номер статьи калькуляции для учёта реализации */
2023-09-24 22:25:19 +03:00
FIND_FPDARTCL_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SFPDARTCL_REALIZ, NRN => NFPDARTCL_REALIZ);
/* Читаем фильтры */
2023-09-24 22:25:19 +03:00
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
/* Читаем сортировки */
2023-09-24 22:25:19 +03:00
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
/* Преобразуем номер и размер страницы в номер строк с и по */
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-24 22:25:19 +03:00
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
/* Добавляем в таблицу описание колонок */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NRN',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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,
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',
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,
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',
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,
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Соисполнение</b> - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках этапа.<br>' ||
'<b style="color:red">Требует внимания</b> - до окончания этапа осталось менее ' ||
TO_CHAR(NDAYS_LEFT_LIMIT) ||
' дней, при этом зафиксирован положительный остаток к поставке/актированию по привязанным к нему договорам соисполнителей.<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',
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',
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,
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Сроки</b> - контроль сроков исполнения работ по этапу.<br>' ||
'<b style="color:red">Требует внимания</b> - до окончания этапа осталось менее ' ||
TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.<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 => 'NCOST_FACT',
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',
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',
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',
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_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',
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',
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',
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,
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Затраты</b> - контроль затрат, понесённых в ходе выполнения работ по этапу.<br>' ||
'<b style="color:red">Требует внимания</b> - сумма фактических затрат этапа по некоторым статьям калькуляции превысила плановую.<br>' ||
'<b style="color:green">В норме</b> - нет описанных выше отклонений.<br>' ||
'<b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана действующая калькуляция с указанием плановых значений по статьям, подлежащим контролю.');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_ACT',
SCAPTION => 'Актир-е',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_ACT',
BORDER => true,
BFILTER => true,
RCOL_VALS => RCOL_VALS,
SHINT => '<b>Актирование</b> - контроль актирования работ, выполненных по этапу, со стороны заказчика.<br>' ||
'<b style="color:red">Требует внимания</b> - этап в состоянии "Закрыт", но при этом в Системе отсутствует утверждённая "Расходная накладная на отпуск потребителю" для данного этапа.<br>' ||
'<b style="color:green">В норме</b> - нет описанных выше отклонений.<br>' ||
'<b style="color:gray">Пусто</b> - в Системе не хватает данных для рассчёта. Убедитесь, что этап, если работы по нему завершены, переведен в состояние "Закрыт".');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCOST_READY',
SCAPTION => 'Готов (%, затраты)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCOST_READYFrom',
SCOND_TO => 'EDCOST_READYTo',
BORDER => true,
BFILTER => true);
/* Обходим данные */
2023-09-24 22:25:19 +03:00
begin
/* Добавляем подсказку совместимости */
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-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Учтём фильтры */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT,
NCOMPANY => NCOMPANY,
NPARENT => NPRN,
SUNIT => 'ProjectsStages',
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-24 22:25:19 +03:00
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
/* Делаем подстановку параметров */
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-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);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 26);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 27);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 28);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31);
/* Делаем выборку */
2023-09-24 22:25:19 +03:00
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
end if;
/* Обходим выбранные записи */
2023-09-24 22:25:19 +03:00
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop
/* Добавляем колонки с данными */
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);
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,
NPOSITION => 28);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NCTRL_ACT',
ICURSOR => ICURSOR,
NPOSITION => 29);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NCOST_READY',
ICURSOR => ICURSOR,
NPOSITION => 30);
/* Добавляем строку в таблицу */
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-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-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-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_COST_FACT
(
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
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
2023-09-24 22:25:19 +03:00
begin
/* Подберём записи журнала затрат */
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(+)
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-24 22:25:19 +03:00
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
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-24 22:25:19 +03:00
function STAGE_ARTS_GET_COST_FACT
(
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
NRES PKG_STD.TNUMBER; -- Буфер для рузультата
2023-09-24 22:25:19 +03:00
begin
/* Суммируем факт по лицевому счёту затрат этапа и указанной статье */
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-24 22:25:19 +03:00
return NRES;
end STAGE_ARTS_GET_COST_FACT;
/* Подбор записей договоров с соисполнителями по статье калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_SELECT_CONTR
(
NSTAGE in number, -- Рег. номер этапа проекта
NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - по всем)
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
2023-09-24 22:25:19 +03:00
)
is
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
2023-09-24 22:25:19 +03:00
begin
/* Подберём записи договоров */
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
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-24 22:25:19 +03:00
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
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-24 22:25:19 +03:00
function STAGE_ARTS_GET_CONTR
(
NSTAGE in number, -- Рег. номер этапа проекта
NFPDARTCL in number :=null -- Рег. номер статьи затрат (null - по всем)
) return number -- Сумма контрактов по статье
2023-09-24 22:25:19 +03:00
is
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-24 22:25:19 +03:00
begin
RSTG := STAGES_GET(NRN => NSTAGE);
2023-09-24 22:25:19 +03:00
exception
when others then
2023-09-24 22:25:19 +03:00
null;
end;
/* Если считано успешно - будем искать данные */
2023-09-24 22:25:19 +03:00
if (RSTG.RN is not null) then
/* Определим рег. номер доп. свойства для налоговой группы проекта */
2023-09-24 22:25:19 +03:00
FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1,
NCOMPANY => RSTG.COMPANY,
SCODE => SDP_STAX_GROUP,
2023-09-24 22:25:19 +03:00
NRN => NTAX_GROUP_DP);
/* Считаем налоговую группу проекта */
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-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-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-24 22:25:19 +03:00
procedure STAGE_ARTS_GET
(
NSTAGE in number, -- Рег. номер этапа проекта
NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - брать все)
NINC_COST in number := 0, -- Включить сведения о затратах (0 - нет, 1 - да)
NINC_CONTR in number := 0, -- Включить сведения о контрактации (0 - нет, 1 - да)
RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта
2023-09-24 22:25:19 +03:00
)
is
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-24 22:25:19 +03:00
RSTG := STAGES_GET(NRN => NSTAGE);
/* Определим дополнительные свойства - контроль затрат */
2023-09-24 22:25:19 +03:00
if (NINC_COST = 1) then
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-24 22:25:19 +03:00
if (NINC_CONTR = 1) then
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-24 22:25:19 +03:00
RSTAGE_ARTS := TSTAGE_ARTS();
/* Подбираем активную структуру цены этапа проекта и её обходим статьи */
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
and ((NFPDARTCL is null) or ((NFPDARTCL is not null) and (A.RN = NFPDARTCL)))
and exists (select null from V_USERPRIV UP where UP.CATALOG = PS.CRN)
and exists (select null from V_USERPRIV UP where UP.JUR_PERS = PS.JUR_PERS and UP.UNITCODE = 'Projects')
and exists (select null from V_USERPRIV UP where UP.CATALOG = CS.CRN)
and exists (select null from V_USERPRIV UP where UP.JUR_PERS = CS.JUR_PERS and UP.UNITCODE = 'Contracts')
order by CSPA.NUMB)
2023-09-24 22:25:19 +03:00
loop
/* Добавим строку в коллекцию */
RSTAGE_ARTS.EXTEND();
I := RSTAGE_ARTS.LAST;
/* Наполним её значениями из хранилища */
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;
/* Если просили включить сведения о затратах и статья поддерживает это */
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
/* Фактические затраты по статье */
RSTAGE_ARTS(I).NCOST_FACT := STAGE_ARTS_GET_COST_FACT(NSTAGE => NSTAGE, NFPDARTCL => RSTAGE_ARTS(I).NRN);
/* Отклонение затрат (план-факт) */
RSTAGE_ARTS(I).NCOST_DIFF := RSTAGE_ARTS(I).NPLAN - RSTAGE_ARTS(I).NCOST_FACT;
/* Контроль затрат */
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;
end if;
/* Если просили включить сведения о контрактах и статья поддерживает это */
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
/* Законтрактовано */
RSTAGE_ARTS(I).NCONTR := STAGE_ARTS_GET_CONTR(NSTAGE => NSTAGE, NFPDARTCL => RSTAGE_ARTS(I).NRN);
/* Осталось законтрактовать */
RSTAGE_ARTS(I).NCONTR_LEFT := RSTAGE_ARTS(I).NPLAN - RSTAGE_ARTS(I).NCONTR;
/* Контроль контрактации */
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;
end if;
end loop;
2023-09-24 22:25:19 +03:00
end STAGE_ARTS_GET;
/* Список статей калькуляции этапа проекта */
2023-09-24 22:25:19 +03:00
procedure STAGE_ARTS_LIST
(
NSTAGE in number, -- Рег. номер этапа проекта
CFILTERS in clob, -- Фильтры
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
2023-09-24 22:25:19 +03:00
)
is
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-24 22:25:19 +03:00
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
/* Найдем фильтр по контролю затрат */
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-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-24 22:25:19 +03:00
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
/* Добавляем в таблицу описание колонок */
2023-09-24 22:25:19 +03:00
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NRN',
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',
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',
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',
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',
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',
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',
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',
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',
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',
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-24 22:25:19 +03:00
STAGE_ARTS_GET(NSTAGE => NSTAGE, NINC_COST => 1, NINC_CONTR => 1, RSTAGE_ARTS => RSTAGE_ARTS);
/* Обходим собранные статьи */
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-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-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-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-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;
/* Считывание записи соисполнителя этапа проекта */
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-24 22:25:19 +03:00
procedure STAGE_CONTRACTS_COND
is
begin
/* Установка главной таблицы */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'PROJECTSTAGEPF');
/* Этап проекта */
2023-09-24 22:25:19 +03:00
PKG_COND_BROKER.SET_COLUMN_PRN(SCOLUMN_NAME => 'PRN');
/* Соисполнитель */
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-24 22:25:19 +03:00