БД: Панель финансов проекта - атрибуты финансирования договора соисполнителя этапа

This commit is contained in:
Mikhail Chechnev 2023-09-29 12:46:24 +03:00
parent 86a8b43c8c
commit 04a9e5c9b4
3 changed files with 406 additions and 33 deletions

View File

@ -9,17 +9,34 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, Stack, Grid, Paper, Table, TableBody, TableRow, TableCell, Typography, Button, Link } from "@mui/material"; //Интерфейсные компоненты
import { Box, Stack, Grid, Paper, Table, TableBody, TableRow, TableCell, Typography, Button, Link, Icon } from "@mui/material"; //Интерфейсные компоненты
import { hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
//-----------------------
//Вспомогательные функции
//-----------------------
//Формирование значения для контрольных колонок
const formatCtrlValue = (value, addText = false) => {
if (hasValue(value)) {
const [text, icon, color] = value == 0 ? ["В норме", "done", "green"] : ["Требует внимания", "error", "red"];
return (
<Stack direction="row" gap={0.5} alignItems="center" justifyContent="center">
<Icon title={text} sx={{ color }}>
{icon}
</Icon>
{addText == true ? text : null}
</Stack>
);
} else return value;
};
//Форматирование значений колонок
const valueFormatter = ({ value, columnDef }) => {
switch (columnDef.name) {
@ -27,6 +44,8 @@ const valueFormatter = ({ value, columnDef }) => {
case "DCSTAGE_BEGIN_DATE":
case "DCSTAGE_END_DATE":
return formatDateRF(value);
case "NCTRL_FIN":
return formatCtrlValue(value, true);
}
return value;
};
@ -54,11 +73,24 @@ const dataCellRender = ({ row, columnDef }, pOnlineShowDocument) => {
</Link>
)
};
case "NCTRL_FIN":
return {
data: (
<Stack sx={{ justifyContent: "right" }} direction="row" spacing={1}>
{row[columnDef.name] === 1 ? (
<div style={{ color: "red", display: "flex", alignItems: "center" }} title="Счетов к оплате">
{formatNumberRFCurrency(row["NPAY_IN_REST"])}
</div>
) : null}
{formatCtrlValue(row[columnDef.name], false)}
</Stack>
)
};
}
};
//Генерация представления расширения строки
const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument) => {
const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument, showStageContractPaymentAccountsIn, showStageContractPayNotes) => {
const cardColumns = columnsDef.filter(
columnDef =>
columnDef.visible == false &&
@ -95,14 +127,19 @@ const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument) => {
</Typography>
</TableCell>
<TableCell sx={{ paddingLeft: 0 }}>
{hasValue(row[`SLNK_UNIT_${cardColumn.name}`]) && hasValue(row[`NLNK_DOCUMENT_${cardColumn.name}`]) ? (
{(hasValue(row[`SLNK_UNIT_${cardColumn.name}`]) && hasValue(row[`NLNK_DOCUMENT_${cardColumn.name}`])) ||
["NPAY_IN", "NFIN_OUT"].includes(cardColumn.name) ? (
<Link
component="button"
variant="body2"
align="left"
underline="always"
onClick={() =>
pOnlineShowDocument({
cardColumn.name === "NPAY_IN"
? showStageContractPaymentAccountsIn(row.NRN)
: cardColumn.name === "NFIN_OUT"
? showStageContractPayNotes(row.NRN)
: pOnlineShowDocument({
unitCode: row[`SLNK_UNIT_${cardColumn.name}`],
document: row[`NLNK_DOCUMENT_${cardColumn.name}`]
})
@ -151,7 +188,10 @@ const StageContracts = ({ stage, filters }) => {
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Подключение к контексту приложения
const { pOnlineShowDocument, configSystemPageSize } = useContext(ApplicationСtx);
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationСtx);
//Подключение к контексту сообщений
const { showMsgErr } = useContext(MessagingСtx);
//Загрузка данных этапов с сервера
const loadStageContracts = useCallback(async () => {
@ -192,6 +232,26 @@ const StageContracts = ({ stage, filters }) => {
SERV_DATA_TYPE_CLOB
]);
//Отображение выходящих счетов на оплату от соисполнителя этапа
const showStageContractPaymentAccountsIn = async contract => {
const data = await executeStored({
stored: "PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN",
args: { NPROJECTSTAGEPF: contract }
});
if (data.NIDENT) pOnlineShowUnit({ unitCode: "PaymentAccountsIn", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
//Отображение фактических платежей соисполнителю этапа
const showStageContractPayNotes = async contract => {
const data = await executeStored({
stored: "PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_FIN_OUT",
args: { NPROJECTSTAGEPF: contract }
});
if (data.NIDENT) pOnlineShowUnit({ unitCode: "PayNotes", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
//При изменении состояния фильтра
const handleFilterChanged = ({ filters }) => setStageContractsDataGrid(pv => ({ ...pv, filters, pageNumber: 1, reload: true }));
@ -220,7 +280,9 @@ const StageContracts = ({ stage, filters }) => {
reloading={stageContractsDataGrid.reload}
expandable={true}
dataCellRender={prms => dataCellRender(prms, pOnlineShowDocument)}
rowExpandRender={prms => rowExpandRender(prms, pOnlineShowDocument)}
rowExpandRender={prms =>
rowExpandRender(prms, pOnlineShowDocument, showStageContractPaymentAccountsIn, showStageContractPayNotes)
}
valueFormatter={valueFormatter}
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}

View File

@ -98,20 +98,20 @@ const headCellRender = ({ columnDef }) => {
};
//Генерация представления ячейки c данными
const dataCellRender = ({ row, columnDef }, showStageArts) => {
const dataCellRender = ({ row, columnDef }, showStageArts, showStageContracts) => {
switch (columnDef.name) {
case "NSTATE":
return {
cellProps: { align: "center" },
data: formatStageStatusValue(row[columnDef.name], false)
};
case "NCTRL_FIN":
case "NCTRL_COEXEC":
case "NCTRL_ACT":
return {
cellProps: { align: "center" },
data: formatCtrlValue(row[columnDef.name], false)
};
case "NCTRL_FIN":
case "NCTRL_CONTR":
case "NCTRL_COST":
return {
@ -119,7 +119,11 @@ const dataCellRender = ({ row, columnDef }, showStageArts) => {
data: hasValue(row[columnDef.name]) ? (
<IconButton
onClick={() =>
showStageArts({ stage: row.NRN, stageNumb: row.SNUMB, filters: [{ name: columnDef.name, from: row[columnDef.name] }] })
(columnDef.name === "NCTRL_FIN" ? showStageContracts : showStageArts)({
stage: row.NRN,
stageNumb: row.SNUMB,
filters: [{ name: columnDef.name, from: row[columnDef.name] }]
})
}
>
{formatCtrlValue(row[columnDef.name], false)}
@ -353,7 +357,7 @@ const Stages = ({ project, projectName, filters }) => {
reloading={stagesDataGrid.reload}
expandable={true}
headCellRender={headCellRender}
dataCellRender={prms => dataCellRender(prms, showStageArts)}
dataCellRender={prms => dataCellRender(prms, showStageArts, showStageContracts)}
rowExpandRender={prms =>
rowExpandRender(prms, pOnlineShowDocument, showStageArts, showStageContracts, showStagePayNotes, showStageCostNotes)
}

View File

@ -123,7 +123,7 @@ create or replace package PKG_P8PANELS_PROJECTS as
function STAGES_GET_CTRL_FIN
(
NRN in number -- Рег. номер этапа проекта
) return number; -- Состояние (0 - без отклонений, 1 - есть отклонения)
) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
/* Получение состояния контрактации этапа проекта */
function STAGES_GET_CTRL_CONTR
@ -239,6 +239,37 @@ create or replace package PKG_P8PANELS_PROJECTS as
/* Список договоров этапа проекта */
procedure STAGE_CONTRACTS_COND;
/* Подбор входящих счетов на оплату соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_PAY_IN
(
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 - есть отклонения)
/* Получение сведений по договору соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_GET
(
NPROJECTSTAGEPF in number, -- Рег. номер соисполнителя этапа проекта
NINC_FIN in number := 0, -- Включить сведения о финансированеии (0 - нет, 1 - да)
NPAY_IN out number, -- Сведения о финансировании - сумма акцептованных счетов на оплату
NFIN_OUT out number, -- Сведения о финансировании - сумма оплаченных счетов на оплату
NPAY_IN_REST out number, -- Сведения о финансировании - сумма оставшихся к оплате счетов на оплату
NCTRL_FIN out number -- Сведения о финансировани - состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
);
/* Список договоров этапа проекта */
procedure STAGE_CONTRACTS_LIST
(
@ -424,22 +455,35 @@ text="ПРАВА ДОСТУПА!!!!"
NRN in number -- Рег. номер проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
BFOUND boolean := false; -- Флаг наличия этапов
NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов
NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов
begin
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
loop
/* Выставим флаг наличия этапов */
BFOUND := true;
/* Увеличим счётчик этапов */
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 (STAGES_GET_CTRL_FIN(NRN => C.RN) = 1) then
if (NSTAGE_CTRL = 1) then
return 1;
end if;
end loop;
/* Если ни один этап не подлежит контролю - то и состояние проекта тоже */
if (NCNT_NULL = NCNT_STAGES) then
return null;
end if;
/* Если мы здесь - отклонений нет */
if (BFOUND) then
if (NCNT_STAGES > 0) then
return 0;
else
/* Нет этапов и нет контроля */
return null;
end if;
end GET_CTRL_FIN;
@ -801,7 +845,7 @@ text="ПРАВА ДОСТУПА!!!!"
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_FIN',
SCAPTION => 'Финансирование',
SCAPTION => 'Финансирование (исходящее)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_FIN',
BORDER => true,
@ -1245,10 +1289,39 @@ text="ПРАВА ДОСТУПА!!!!"
function STAGES_GET_CTRL_FIN
(
NRN in number -- Рег. номер этапа проекта
) return number -- Состояние (0 - без отклонений, 1 - есть отклонения)
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
NCONTR_CTRL PKG_STD.TNUMBER; -- Состояние соисполнителя этапа
NCNT_CONTR PKG_STD.TNUMBER :=0; -- Количество соисполнителей этапа
NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" соисполнителей этапа
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;
end STAGES_GET_CTRL_FIN;
/* Получение состояния контрактации этапа проекта */
@ -1567,7 +1640,7 @@ text="ПРАВА ДОСТУПА!!!!"
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_FIN',
SCAPTION => 'Финансирование',
SCAPTION => 'Финансирование (исходящее)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_FIN',
BORDER => true,
@ -2267,8 +2340,196 @@ text="ПРАВА ДОСТУПА!!!!"
SCONDITION_NAME_FROM => 'EDDOC_DATEFrom',
SCONDITION_NAME_TO => 'EDDOC_DATETo',
SJOINS => 'PRN <- RN;CONTRACTS');
/* Контроль финансирования */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then
PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_GET_CTRL_FIN(RN) = :EDCTRL_FIN');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_FIN',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_FIN'));
end if;
end STAGE_CONTRACTS_COND;
/* Подбор входящих счетов на оплату соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_PAY_IN
(
NPROJECTSTAGEPF in number, -- Рег. номер соисполнителя этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
begin
/* Подберём счета */
for C in (select PAI.COMPANY,
PAI.RN
from PROJECTSTAGEPF PSPF,
PROJECTSTAGE PS,
PAYACCIN PAI
where PSPF.RN = NPROJECTSTAGEPF
and PSPF.PRN = PS.RN
and PSPF.FACEACC = PAI.FACEACC
and PAI.DOC_STATE = 1
and exists (select null
from PAYACCINSPCLC PCLC
where PCLC.PRN in (select PAIS.RN from PAYACCINSPEC PAIS where PAIS.PRN = PAI.RN)
and PCLC.FACEACCOUNT = PS.FACEACC))
loop
/* Сформируем идентификатор буфера */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
NCOMPANY => C.COMPANY,
NDOCUMENT => C.RN,
SUNITCODE => 'PaymentAccountsIn',
SACTIONCODE => null,
NCRN => null,
NDOCUMENT1 => null,
SUNITCODE1 => null,
SACTIONCODE1 => null,
NRN => NSELECTLIST);
end loop;
end STAGE_CONTRACTS_SELECT_PAY_IN;
/* Подбор платежей финансирования соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_SELECT_FIN_OUT
(
NPROJECTSTAGEPF in number, -- Рег. номер соисполнителя этапа проекта
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
begin
/* Подберём платежи */
for C in (select PN.COMPANY,
PN.RN
from PROJECTSTAGEPF PSPF,
PROJECTSTAGE PS,
PAYNOTES PN
where PSPF.RN = NPROJECTSTAGEPF
and PSPF.PRN = PS.RN
and PSPF.FACEACC = PN.FACEACC
and PN.SIGNPLAN = 0
and exists (select null
from PAYNOTESCLC PNCLC
where PNCLC.PRN = PN.RN
and PNCLC.FACEACCOUNT = PS.FACEACC))
loop
/* Сформируем идентификатор буфера */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
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 STAGE_CONTRACTS_SELECT_FIN_OUT;
/* Получение состояния финансирования по договору соисполнителя этапа проекта */
function STAGE_CONTRACTS_GET_CTRL_FIN
(
NPROJECTSTAGEPF in number -- Рег. номер соисполнителя этапа проекта
) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
NTMP PKG_STD.TNUMBER; -- Буфер для вызова процедуры расчёта
NCTRL_FIN PKG_STD.TNUMBER; -- Буфер для результата
begin
/* Получим сведения по договору соисполнителя этапа */
STAGE_CONTRACTS_GET(NPROJECTSTAGEPF => NPROJECTSTAGEPF,
NINC_FIN => 1,
NPAY_IN => NTMP,
NFIN_OUT => NTMP,
NPAY_IN_REST => NTMP,
NCTRL_FIN => NCTRL_FIN);
/* Вернём результат */
return NCTRL_FIN;
end STAGE_CONTRACTS_GET_CTRL_FIN;
/* Получение сведений по договору соисполнителя этапа проекта */
procedure STAGE_CONTRACTS_GET
(
NPROJECTSTAGEPF in number, -- Рег. номер соисполнителя этапа проекта
NINC_FIN in number := 0, -- Включить сведения о финансированеии (0 - нет, 1 - да)
NPAY_IN out number, -- Сведения о финансировании - сумма акцептованных счетов на оплату
NFIN_OUT out number, -- Сведения о финансировании - сумма оплаченных счетов на оплату
NPAY_IN_REST out number, -- Сведения о финансировании - сумма оставшихся к оплате счетов на оплату
NCTRL_FIN out number -- Сведения о финансировани - состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
)
is
NPS_FACEACC PKG_STD.TREF; -- Рег. номер лицевого счета затрат этапа проекта
begin
/* Читаем лицевой счёт затрат родительского этапа проекта */
begin
select PS.FACEACC
into NPS_FACEACC
from PROJECTSTAGEPF PSPF,
PROJECTSTAGE PS
where PSPF.RN = NPROJECTSTAGEPF
and PSPF.PRN = PS.RN;
exception
when others then
NPS_FACEACC := null;
end;
/* Если ЛС этапа проекта нашли */
if (NPS_FACEACC is not null) then
/* Если нужны сведения о финансировании */
if (NINC_FIN = 1) then
/* Сумма акцептованных счетов на оплату - по ВСО с ЛС соисполнителя этапа проекта, в калькуляции которых присутствует ЛС затрат этапа проекта */
select sum(PAI.SUMMWITHNDS * PAI.FA_BASECOURS)
into NPAY_IN
from PROJECTSTAGEPF PSPF,
PAYACCIN PAI
where PSPF.RN = NPROJECTSTAGEPF
and PSPF.FACEACC = PAI.FACEACC
and PAI.DOC_STATE = 1
and exists (select null
from PAYACCINSPCLC PCLC
where PCLC.PRN in (select PAIS.RN from PAYACCINSPEC PAIS where PAIS.PRN = PAI.RN)
and PCLC.FACEACCOUNT = NPS_FACEACC);
/* Сумма оплаченных счетов на оплату - по расходным факт. ЖП с ЛС соисполнителя этапа проекта, в калькуляции которых присутствует ЛС затрат этапа проекта */
select sum(PN.PAY_SUM * (PN.CURR_RATE_BASE / PN.CURR_RATE))
into NFIN_OUT
from PROJECTSTAGEPF PSPF,
PAYNOTES PN
where PSPF.RN = NPROJECTSTAGEPF
and PSPF.FACEACC = PN.FACEACC
and PN.SIGNPLAN = 0
and exists (select null
from PAYNOTESCLC PNCLC
where PNCLC.PRN = PN.RN
and PNCLC.FACEACCOUNT = NPS_FACEACC);
/* Сумма оставшихся к оплате счетов на оплату */
NPAY_IN_REST := COALESCE(NPAY_IN, 0) - COALESCE(NFIN_OUT, 0);
/* Контроль отклонений (состояние) */
if (NPAY_IN is null) then
NCTRL_FIN := null;
else
if (NPAY_IN_REST > 0) then
NCTRL_FIN := 1;
else
NCTRL_FIN := 0;
end if;
end if;
/* Приведение значений */
NPAY_IN := COALESCE(NPAY_IN, 0);
NFIN_OUT := COALESCE(NFIN_OUT, 0);
end if;
else
/* Без ЛС этапа проекта посчитать ничего не можем */
NPAY_IN := 0;
NFIN_OUT := 0;
NPAY_IN_REST := 0;
NCTRL_FIN := null;
end if;
end STAGE_CONTRACTS_GET;
/* Список договоров этапа проекта */
procedure STAGE_CONTRACTS_LIST
(
@ -2287,10 +2548,17 @@ text="ПРАВА ДОСТУПА!!!!"
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; -- Курсор для исполнения запроса
NPROJECTSTAGEPF PKG_STD.TREF; -- Рег. номер соисполнителя этапа проекта
NSUMM PKG_STD.TNUMBER; -- Сумма по договору соисполнителя
NPAY_IN PKG_STD.TNUMBER; -- Сведения о финансировании - сумма акцептованных счетов на оплату
NFIN_OUT PKG_STD.TNUMBER; -- Сведения о финансировании - сумма оплаченных счетов на оплату
NPAY_IN_REST PKG_STD.TNUMBER; -- Сведения о финансировании - сумма оставшихся к оплате счетов на оплату
NCTRL_FIN PKG_STD.TNUMBER; -- Сведения о финансировани - состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
begin
/* Читаем фильтры */
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
@ -2423,6 +2691,36 @@ text="ПРАВА ДОСТУПА!!!!"
SCOND_FROM => 'EDSCOST_ART',
BORDER => true,
BFILTER => true);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NPAY_IN',
SCAPTION => 'Акцептовано счетов на оплату',
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 => 'Оплачено счетов',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NPAY_IN_REST',
SCAPTION => 'Осталось оплатить счетов',
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 => 'Финансирование (исходящее)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCTRL_FIN',
BORDER => true,
BFILTER => true,
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NREST',
SCAPTION => 'Общий остаток к оплате по договору',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false);
/* Обходим данные */
begin
/* Собираем запрос */
@ -2510,11 +2808,8 @@ text="ПРАВА ДОСТУПА!!!!"
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);
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NPROJECTSTAGEPF);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NPROJECTSTAGEPF, BCLEAR => true);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SDOC_PREF',
ICURSOR => ICURSOR,
@ -2573,12 +2868,24 @@ text="ПРАВА ДОСТУПА!!!!"
SNAME => 'DCSTAGE_END_DATE',
ICURSOR => ICURSOR,
NPOSITION => 17);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSUMM', ICURSOR => ICURSOR, NPOSITION => 18);
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 18, NVALUE => NSUMM);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUMM', NVALUE => NSUMM);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCURR', ICURSOR => ICURSOR, NPOSITION => 19);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SCOST_ART',
ICURSOR => ICURSOR,
NPOSITION => 20);
STAGE_CONTRACTS_GET(NPROJECTSTAGEPF => NPROJECTSTAGEPF,
NINC_FIN => 1,
NPAY_IN => NPAY_IN,
NFIN_OUT => NFIN_OUT,
NPAY_IN_REST => NPAY_IN_REST,
NCTRL_FIN => NCTRL_FIN);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPAY_IN', NVALUE => NPAY_IN);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NFIN_OUT', NVALUE => NFIN_OUT);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPAY_IN_REST', NVALUE => NPAY_IN_REST);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCTRL_FIN', NVALUE => NCTRL_FIN);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NREST', NVALUE => NSUMM - COALESCE(NFIN_OUT, 0));
/* Добавляем строку в таблицу */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end loop;