WEB APP: Панель "Инструкции" ПУП (финал)

This commit is contained in:
Mikhail Chechnev 2023-10-23 18:23:45 +03:00
parent 2fdd8b6e52
commit 421d76d2fb
21 changed files with 323 additions and 11 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@ -7,7 +7,7 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useContext } from "react"; //Классы React import React, { useContext, useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { import {
Box, Box,
@ -23,8 +23,11 @@ import {
TableHead, TableHead,
TableRow, TableRow,
TableCell, TableCell,
TableBody TableBody,
Fab,
Icon
} from "@mui/material"; //Интерфейсные элементы } from "@mui/material"; //Интерфейсные элементы
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import img211 from "./img/211.png"; //Изображение import img211 from "./img/211.png"; //Изображение
import img212 from "./img/212.png"; //Изображение import img212 from "./img/212.png"; //Изображение
@ -47,6 +50,26 @@ import img33 from "./img/33.png"; //Изображение
import img34 from "./img/34.png"; //Изображение import img34 from "./img/34.png"; //Изображение
import img35 from "./img/35.png"; //Изображение import img35 from "./img/35.png"; //Изображение
import img36 from "./img/36.png"; //Изображение import img36 from "./img/36.png"; //Изображение
import img411 from "./img/411.png"; //Изображение
import img412 from "./img/412.png"; //Изображение
import img421 from "./img/421.png"; //Изображение
import img422 from "./img/422.png"; //Изображение
import img431 from "./img/431.png"; //Изображение
import img432 from "./img/432.png"; //Изображение
import img433 from "./img/433.png"; //Изображение
import img434 from "./img/434.png"; //Изображение
import img441 from "./img/441.png"; //Изображение
import img442 from "./img/442.png"; //Изображение
import img443 from "./img/443.png"; //Изображение
import img444 from "./img/444.png"; //Изображение
import img451 from "./img/451.png"; //Изображение
import img461 from "./img/461.png"; //Изображение
import img471 from "./img/471.png"; //Изображение
import img711 from "./img/711.png"; //Изображение
import img721 from "./img/721.png"; //Изображение
import img722 from "./img/722.png"; //Изображение
import img723 from "./img/723.png"; //Изображение
import img741 from "./img/741.png"; //Изображение
//--------- //---------
//Константы //Константы
@ -69,13 +92,17 @@ const STYLES = {
PRGF_TABLE: { paddingTop: "20px", paddingBottom: "20px", display: "flex", justifyContent: "center" }, PRGF_TABLE: { paddingTop: "20px", paddingBottom: "20px", display: "flex", justifyContent: "center" },
TABLE: { width: "80%" }, TABLE: { width: "80%" },
TABLE_TITLE: { backgroundColor: "lightgray" }, TABLE_TITLE: { backgroundColor: "lightgray" },
TABLE_SUBTITLE: { textAlign: "center", backgroundColor: "#f3eded", fontWeight: "bold" } TABLE_SUBTITLE: { textAlign: "center", backgroundColor: "#f3eded", fontWeight: "bold" },
FAB_BACK: { position: "absolute", right: "20px", marginTop: "20px" }
}; };
//-------------------------------- //--------------------------------
//Вспомогательные функции и классы //Вспомогательные функции и классы
//-------------------------------- //--------------------------------
//Переход к элементу страницы
const scrollToElement = id => document.getElementById(id).scrollIntoView();
//Заголовок первого уровня //Заголовок первого уровня
const Hdr1 = ({ id, children }) => ( const Hdr1 = ({ id, children }) => (
<Typography {...(id ? { id } : {})} variant="h3" color="primary"> <Typography {...(id ? { id } : {})} variant="h3" color="primary">
@ -140,7 +167,7 @@ Img.propTypes = {
src: PropTypes.string.isRequired src: PropTypes.string.isRequired
}; };
//Ссылка на раздел //Ссылка на раздел Системы
const UnitLink = ({ unitCode, children }) => { const UnitLink = ({ unitCode, children }) => {
//Подключение к контексту приложения //Подключение к контексту приложения
const { pOnlineShowUnit } = useContext(ApplicationСtx); const { pOnlineShowUnit } = useContext(ApplicationСtx);
@ -153,21 +180,109 @@ const UnitLink = ({ unitCode, children }) => {
); );
}; };
//Контроль свойств - Ссылка на раздел //Контроль свойств - Ссылка на раздел Системы
UnitLink.propTypes = { UnitLink.propTypes = {
unitCode: PropTypes.string.isRequired, unitCode: PropTypes.string.isRequired,
children: PropTypes.any children: PropTypes.any
}; };
//Ссылка на главу инструкции
const ChapterLink = ({ id, dstId, onClick, children }) => {
//Генерация содержимого
return (
<Link
{...(id ? { id } : {})}
component="button"
variant="body2"
align="left"
underline="always"
onClick={() => {
scrollToElement(dstId);
if (onClick && id) onClick(id);
}}
>
{children}
</Link>
);
};
//Контроль свойств - Ссылка на главу инструкции
ChapterLink.propTypes = {
id: PropTypes.string,
dstId: PropTypes.string.isRequired,
onClick: PropTypes.func,
children: PropTypes.any
};
//Ссылка на информационную панель
const PanelLink = ({ panelName, children }) => {
//Подключение к контексту приложения
const { configUrlBase, findPanelByName, pOnlineShowTab } = useContext(ApplicationСtx);
//Генерация содержимого
return (
<Link
component="button"
variant="body2"
align="left"
underline="always"
onClick={() => {
const panel = findPanelByName(panelName);
if (panel) pOnlineShowTab({ id: panel.name, url: `${configUrlBase}${panel.url}`, caption: panel.caption });
}}
>
{children}
</Link>
);
};
//Контроль свойств - Ссылка на информационную панель
PanelLink.propTypes = {
panelName: PropTypes.string.isRequired,
children: PropTypes.any
};
//----------- //-----------
//Тело модуля //Тело модуля
//----------- //-----------
//Корневая панель работ проектов //Корневая панель работ проектов
const PrjHelp = () => { const PrjHelp = () => {
//Собственное состояние
const [navStack, setNavStack] = useState([]);
//Переход по оглавлению
const handleTitleClick = id => {
scrollToElement(id);
setNavStack([]);
};
//Обработка на нажатие ссылки на раздел
const handleChapterLinkClick = backId => {
const tmp = [...navStack];
tmp.push(backId);
setNavStack(tmp);
};
//Обработка нажатия на кнопку "Назад"
const handleBackClick = () => {
if (navStack.length > 0) {
const tmp = [...navStack];
const backId = tmp.pop();
scrollToElement(backId);
setNavStack(tmp);
}
};
//Генерация содержимого //Генерация содержимого
return ( return (
<Box> <Box>
{navStack.length > 0 ? (
<Fab variant="extended" color="primary" sx={STYLES.FAB_BACK} onClick={handleBackClick}>
<Icon>arrow_back_ios</Icon>
{BUTTONS.NAVIGATE_BACK}
</Fab>
) : null}
<Grid container spacing={1}> <Grid container spacing={1}>
<Grid item xs={2}> <Grid item xs={2}>
<Box p={2}> <Box p={2}>
@ -177,11 +292,7 @@ const PrjHelp = () => {
<List> <List>
{CONTENT.map((c, i) => ( {CONTENT.map((c, i) => (
<ListItem disablePadding key={i}> <ListItem disablePadding key={i}>
<ListItemButton <ListItemButton onClick={() => handleTitleClick(c.id)}>
onClick={() => {
document.getElementById(c.id).scrollIntoView();
}}
>
<ListItemText primary={c.caption} /> <ListItemText primary={c.caption} />
</ListItemButton> </ListItemButton>
</ListItem> </ListItem>
@ -418,7 +529,7 @@ const PrjHelp = () => {
Номер шифра затрат система генерирует автоматически. При необходимости его можно исправить. Далее необходимо нажать копку Номер шифра затрат система генерирует автоматически. При необходимости его можно исправить. Далее необходимо нажать копку
ОК. ОК.
</Prgf> </Prgf>
<Hdr3>2.4. Регистрация договора с заказчиком</Hdr3> <Hdr3 id={"prg24"}>2.4. Регистрация договора с заказчиком</Hdr3>
<Prgf> <Prgf>
После заключения договора с заказчиком необходимо выделить законтрактованные этапы проекта, вызвать правой кнопкой мыши После заключения договора с заказчиком необходимо выделить законтрактованные этапы проекта, вызвать правой кнопкой мыши
контекстное меню и выбрать пункт Формирование &gt; Договор с внешним заказчиком. контекстное меню и выбрать пункт Формирование &gt; Договор с внешним заказчиком.
@ -474,9 +585,210 @@ const PrjHelp = () => {
<Prgf>Затем документ необходимо пометить как действующий.</Prgf> <Prgf>Затем документ необходимо пометить как действующий.</Prgf>
<Img src={img36} /> <Img src={img36} />
<Hdr2 id={"prg4"}>4. Исполнение</Hdr2> <Hdr2 id={"prg4"}>4. Исполнение</Hdr2>
<Hdr3 id={"prg41"}>4.1. Формирование авансового счета по договору с заказчиком</Hdr3>
<Prgf>
Необходимо отобрать договор с заказчиком в <UnitLink unitCode="Contracts">одноименном штатном регистре системы</UnitLink>,
выбрать этап, вызвать контекстное меню и выбрать пункт Формирование &gt; Счет на оплату.
</Prgf>
<Img src={img411} />
<Prgf>Система визуализирует окно реквизитов счета на оплату.</Prgf>
<Img src={img412} />
<Prgf>Необходимо заполнить реквизиты счета и нажать кнопку ОК.</Prgf>
<Prgf>
Система зарегистрирует документ в{" "}
<UnitLink unitCode="PaymentAccounts">соответствующем документарном регистре системы</UnitLink>.
</Prgf>
<Hdr3>4.2. Регистрация договоров с соисполнителями / поставщиками / подрядчиками</Hdr3>
<Prgf>
После заключения договора с соисполнителем / поставщиком / подрядчиком необходимо выбрать этап проекта, в рамках которого
был заключен договор, вызвать правой кнопкой мыши контекстное меню и выбрать пункт Формирование &gt; Договор с внешним
исполнителем.
</Prgf>
<Img src={img421} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img422} />
<Prgf>Необходимо заполнить параметры действия и нажать кнопку ОК.</Prgf>
<Prgf>
Система сформирует договор с исполнителем в <UnitLink unitCode="Contracts">соответствующем регистре системы</UnitLink>.
</Prgf>
<Prgf>
Запись в регистре Договоры может быть отредактирована посредством штатных действий Исправить контекстного меню
заголовка раздела. Также может быть отредактирован каждый этап договора.
</Prgf>
<Prgf>
В момент двустороннего подписания договора требуется перевести документ в состояние Утвержден посредством
соответствующего действия контекстного меню раздела аналогично тому, как это выполняется и для договора с заказчиком (см.
выше{" "}
<ChapterLink id={"back42from24_1"} dstId={"prg24"} onClick={handleChapterLinkClick}>
раздел 2.4
</ChapterLink>{" "}
настоящей Инструкции).
</Prgf>
<Prgf>
В момент перехода к двустороннему исполнению этапа договора требуется перевести этап в состояние Открыт посредством
соответствующего действия контекстного меню раздела аналогично тому, как это выполняется и для договора с заказчиком (см.
выше{" "}
<ChapterLink id={"back42from24_2"} dstId={"prg24"} onClick={handleChapterLinkClick}>
раздел 2.4
</ChapterLink>{" "}
настоящей Инструкции).
</Prgf>
<Hdr3>4.3. Регистрация счета по договору с исполнителем</Hdr3>
<Prgf>
При поступлении счета от исполнителя необходимо отобрать договор с исполнителем в{" "}
<UnitLink unitCode="Contracts">одноименном штатном регистре системы</UnitLink>, выбрать этап, вызвать контекстное меню и
выбрать пункт Формирование &gt; Входящий счет на оплату.
</Prgf>
<Img src={img431} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img432} />
<Prgf>Необходимо заполнить параметры и нажать кнопку ОК.</Prgf>
<Prgf>Система визуализирует окно реквизитов счета на оплату.</Prgf>
<Img src={img433} />
<Prgf>Необходимо заполнить реквизиты счета и нажать кнопку ОК.</Prgf>
<Prgf>
Система зарегистрирует документ в{" "}
<UnitLink unitCode="PaymentAccountsIn">соответствующем документарном регистре системы</UnitLink>.
</Prgf>
<Prgf>
Далее документ может быть отредактирован посредством штатных действий Исправить контекстного меню заголовка раздела.
Также может быть отредактирована спецификация документа.
</Prgf>
<Prgf>
По окончании редактирования счета документ подлежит утверждению посредством соответствующего действия контекстного меню
раздела.
</Prgf>
<Img src={img434} />
<Hdr3>4.4. Регистрация актов и товарных накладных по договору с исполнителем</Hdr3>
<Prgf>
При поступлении акта/товарной накладной от исполнителя необходимо отобрать договор с исполнителем в{" "}
<UnitLink unitCode="Contracts">одноименном штатном регистре системы</UnitLink>, выбрать этап, вызвать контекстное меню и
выбрать пункт Формирование &gt; Приходная накладная.
</Prgf>
<Img src={img441} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img442} />
<Prgf>Необходимо заполнить параметры и нажать кнопку ОК.</Prgf>
<Prgf>Система визуализирует буфер формирования документа.</Prgf>
<Img src={img443} />
<Prgf>Необходимо нажать кнопку ОК.</Prgf>
<Prgf>
Система зарегистрирует документ в{" "}
<UnitLink unitCode="IncomingInvoices">соответствующем документарном регистре системы</UnitLink>.
</Prgf>
<Prgf>
Далее документ может быть отредактирован посредством штатных действий Исправить контекстного меню заголовка раздела.
Также может быть отредактирована спецификация документа.
</Prgf>
<Prgf>
По окончании редактирования документ подлежит утверждению посредством соответствующего действия контекстного меню раздела.
</Prgf>
<Img src={img444} />
<Hdr3>4.5. Ведение реестра финансовых документов по проекту</Hdr3>
<Prgf>
Система позволяет получить доступ ко всем документам по данному этапу проекта с возможностью перехода в соответствующие
документарные регистры системы:
<p>
1) <UnitLink unitCode="PaymentAccounts">Счета на оплату</UnitLink>
</p>
<p>
2) <UnitLink unitCode="GoodsTransInvoicesToConsumers">Расходные накладные на отпуск потребителям</UnitLink>
</p>
<p>
3) <UnitLink unitCode="PaymentAccountsIn">Входящие счета на оплату</UnitLink>
</p>
<p>
4) <UnitLink unitCode="IncomingInvoices">Приходные накладные</UnitLink>
</p>
</Prgf>
<Img src={img451} />
<Hdr3>4.6. Учет фактической оплаты</Hdr3>
<Prgf>
Система позволяет получить доступ к фактически проведенным платежным поручениям по данному этапу проекта с возможностью
перехода в <UnitLink unitCode="PayNotes">соответствующий учетный регистр системы</UnitLink>.
</Prgf>
<Img src={img461} />
<Hdr3>4.7. Учет фактических затрат</Hdr3>
<Prgf>
Система позволяет получить доступ к фактическим затратам по данному этапу проекта с возможностью перехода в{" "}
<UnitLink unitCode="CostNotes">соответствующий учетный регистр системы</UnitLink>.
</Prgf>
<Img src={img471} />
<Hdr2 id={"prg5"}>5. Мониторинг и контроль</Hdr2> <Hdr2 id={"prg5"}>5. Мониторинг и контроль</Hdr2>
<Prgf>
В информационной панели <PanelLink panelName="PrjFin">Экономика проектов</PanelLink> система обеспечивает мониторинг
исполнения проекта по следующим основным объектам контроля:
<p>1) Финансирование</p>
<p>2) Контрактация</p>
<p>3) Договоры с соисполнителями</p>
<p>4) Сроки</p>
<p>5) Затраты</p>
<p>6) Актирование</p>
</Prgf>
<Hdr2 id={"prg6"}>6. Корректировка планов</Hdr2> <Hdr2 id={"prg6"}>6. Корректировка планов</Hdr2>
<Prgf>
Система обеспечивает возможность корректировки экономической структуры проекта в том числе и в процессе его исполнения (с
сохранением истории изменений):
<p>1) Изменение стоимости этапов проекта (например, при увеличении/уменьшении объема работ)</p>
<p>2) Корректировку сроков этапов проекта (например, при изменении требований заказчика)</p>
<p>3) Добавление новых этапов проекта</p>
<p>4) Разделение этапов проекта</p>
<p>5) Объединение этапов проекта</p>
<p>
6) Корректировку плановой калькуляции путем регистрации новой версии документа (например, в результате подписания
протокола согласования фиксированной цены этапа проектных работ) порядок регистрации документа описан выше в разделе
3 настоящей Инструкции
</p>
</Prgf>
<Prgf>
В случае изменения структуры этапов проекта (разделение либо объединение этапов проекта) в процессе его исполнения
обеспечивается возможность:
<p>1) Изменить привязку внешнего исполнителя (перенести с одного этапа на другой)</p>
<p>2) Выполнить переброску финансирования (как входящего, так и исходящего)</p>
<p>3) Выполнить переброску накопленных фактических затрат</p>
</Prgf>
<Hdr2 id={"prg7"}>7. Завершение проекта</Hdr2> <Hdr2 id={"prg7"}>7. Завершение проекта</Hdr2>
<Hdr3>7.1. Закрытие этапа проекта</Hdr3>
<Prgf>
По окончании выполнения проектных работ по этапу требуется перевести этап проекта в состояние Закрыт посредством
соответствующего действия контекстного меню раздела.
</Prgf>
<Img src={img711} />
<Hdr3>7.2. Формирование акта выполненных работ по договору с заказчиком</Hdr3>
<Prgf>
Необходимо отобрать договор с заказчиком в <UnitLink unitCode="Contracts">одноименном штатном регистре системы</UnitLink>,
выбрать этап, вызвать контекстное меню и выбрать пункт Формирование &gt; Расходная накладная на отпуск потребителям.
</Prgf>
<Img src={img721} />
<Prgf>Система визуализирует буфер формирования документа. Необходимо нажать кнопку ОК.</Prgf>
<Img src={img722} />
<Prgf>
Система зарегистрирует документ в{" "}
<UnitLink unitCode="GoodsTransInvoicesToConsumers">соответствующем документарном регистре системы</UnitLink>.
</Prgf>
<Prgf>
Далее документ может быть отредактирован посредством штатных действий Исправить контекстного меню заголовка раздела.
Также может быть отредактирована спецификация документа.
</Prgf>
<Prgf>
По окончании редактирования документ подлежит утверждению посредством соответствующего действия контекстного меню раздела.
</Prgf>
<Img src={img723} />
<Hdr3>7.3. Формирование счета на окончательный расчет с заказчиком</Hdr3>
<Prgf>
Порядок формирования счета на окончательный расчет полностью аналогичен порядку формирования авансового счета, подробно
описанному выше в{" "}
<ChapterLink id={"back73from41"} dstId={"prg41"} onClick={handleChapterLinkClick}>
разделе 4.1
</ChapterLink>{" "}
настоящей Инструкции.
</Prgf>
<Hdr3>7.4. Закрытие проекта</Hdr3>
<Prgf>
По окончании выполнения проектных работ по всем этапам требуется перевести проект в состояние Закрыт посредством
соответствующего действия контекстного меню раздела.
</Prgf>
<Img src={img741} />
</Box> </Box>
</Grid> </Grid>
</Grid> </Grid>