From 04a9e5c9b446e98f48a5058311c3abff0d0707c4 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 29 Sep 2023 12:46:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=20=D1=84=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20-=20=D0=B0=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B1=D1=83=D1=82=D1=8B=20=D1=84=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=BD=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B0=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=8D=D1=82=D0=B0=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/prj_fin/stage_contracts.js | 80 +++++- app/panels/prj_fin/stages.js | 12 +- db/PKG_P8PANELS_PROJECTS.pck | 347 ++++++++++++++++++++++++-- 3 files changed, 406 insertions(+), 33 deletions(-) diff --git a/app/panels/prj_fin/stage_contracts.js b/app/panels/prj_fin/stage_contracts.js index a284fd0..0af5207 100644 --- a/app/panels/prj_fin/stage_contracts.js +++ b/app/panels/prj_fin/stage_contracts.js @@ -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 ( + + + {icon} + + {addText == true ? text : null} + + ); + } 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) => { ) }; + case "NCTRL_FIN": + return { + data: ( + + {row[columnDef.name] === 1 ? ( +
+ {formatNumberRFCurrency(row["NPAY_IN_REST"])} +
+ ) : null} + {formatCtrlValue(row[columnDef.name], false)} +
+ ) + }; } }; //Генерация представления расширения строки -const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument) => { +const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument, showStageContractPaymentAccountsIn, showStageContractPayNotes) => { const cardColumns = columnsDef.filter( columnDef => columnDef.visible == false && @@ -95,17 +127,22 @@ const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument) => { - {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) ? ( - pOnlineShowDocument({ - unitCode: row[`SLNK_UNIT_${cardColumn.name}`], - document: row[`NLNK_DOCUMENT_${cardColumn.name}`] - }) + 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} diff --git a/app/panels/prj_fin/stages.js b/app/panels/prj_fin/stages.js index e9653c4..d295599 100644 --- a/app/panels/prj_fin/stages.js +++ b/app/panels/prj_fin/stages.js @@ -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]) ? ( - 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) } diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index 8a2585b..4bcb543 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -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 ( @@ -421,25 +452,38 @@ text="ПРАВА ДОСТУПА!!!!" /* Получение состояния финансирования проекта */ function GET_CTRL_FIN ( - NRN in number -- Рег. номер проекта - ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) + 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, @@ -1203,7 +1247,7 @@ text="ПРАВА ДОСТУПА!!!!" NRES PKG_STD.TNUMBER; -- Буфер для рузультата begin /* Суммируем фактические платежи нужного направления по лицевому счёту затрат этапа */ - select COALESCE(sum(PN.PAY_SUM * (PN.CURR_RATE_BASE/PN.CURR_RATE)), 0) + select COALESCE(sum(PN.PAY_SUM * (PN.CURR_RATE_BASE / PN.CURR_RATE)), 0) into NRES from PAYNOTES PN, DICTOPER O @@ -1244,11 +1288,40 @@ text="ПРАВА ДОСТУПА!!!!" /* Получение состояния финансирования этапа проекта */ function STAGES_GET_CTRL_FIN ( - NRN in number -- Рег. номер этапа проекта - ) return number -- Состояние (0 - без отклонений, 1 - есть отклонения) + NRN in number -- Рег. номер этапа проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is + NCONTR_CTRL PKG_STD.TNUMBER; -- Состояние соисполнителя этапа + NCNT_CONTR PKG_STD.TNUMBER :=0; -- Количество соисполнителей этапа + NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" соисполнителей этапа begin - return 0; + /* Обходим соисполнителей этапа */ + 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;